exportRepository = $exportRepository; $this->elementGabValue = $elementGabValue; $this->params = $params; } public function export(int $idExport) { $elements = $this->elementGabValue->listGabValue(null, null, $idExport); $fields = []; $header = ['ID Modele','Nom Modele','Id','Fiche','Version']; $protocoles = []; $listProductLink = []; $listFieldset = []; if(!empty($elements)){ foreach ($elements as $element) { if(isset($element['value'])){ foreach($element['value'] as $value){ if($value['type'] === "fieldset"){ if(!empty($value['values'])){ $listFieldset = $this->prepareFieldsetInput($value, $listFieldset); } } else{ $fields[ $value['typeFieldId']] = $value['name']; if(isset($value['protocole']) && !empty($value['protocole'])){ $protocoles[$value['typeFieldId']] = $value['protocole']; } else{ $protocoles[$value['typeFieldId']] = ''; } } } } } } $header = array_merge($header,$fields); $protocoles = array_merge(['','','','',''], $protocoles); if(!empty($listFieldset)){ $listFieldset = $this->prepareFieldsetCol($listFieldset); foreach($listFieldset as $fieldset){ $header = array_merge($header, $fieldset['name']); $protocoles = array_merge($protocoles, $fieldset['protocole']); } } $response = new StreamedResponse(); $response->setCallback(function () use ($elements,$header, $fields, $protocoles, $listFieldset) { $csv = fopen($this->params->get('public_dir') . '/file.csv', 'w+'); fputcsv($csv, $header, ';'); fputcsv($csv, $protocoles, ';'); foreach ($elements as $element) { $valueElement = $this->prepareValueElement($fields, $element); $valueFieldset = []; if(!empty($listFieldset)) { foreach($listFieldset as $fieldset) { $valueFieldset = $this->prepareValueFieldset($fieldset['protocole'], $element); $valueElement = array_merge($valueElement, $valueFieldset); } } fputcsv($csv, $valueElement, ';'); } fclose($csv); }); $response->headers->set('Content-Type', 'text/csv; charset=utf-8'); $response->headers->set('Content-Disposition', 'attachment; filename="file.csv"'); $response->send(); return $response->getStatusCode(); } private function prepareValueElement($fields,$element){ $headerElement = [$element['typeId'],$element['typeName'], $element['id'], $element['name'], $element['version']]; $result = []; foreach($fields as $key => $field) { if(isset($element['value'])){ $value = array_filter($element['value'], static function ($val) use ($key) { return $val['typeFieldId'] === $key; }); if(!empty($value)){ if(isset(reset($value)['value'])){ $val = reset($value)['value']; if(is_array($val) && !empty($val)){ $result[] = implode(',', $val); } elseif(is_array($val) && empty($val)){ $result[] = ''; } else{ $result[] = $val; } } else{ $result[] = ''; } } else{ $result[] = ''; } } else{ $result[] = ''; } } $result = array_merge($headerElement, $result); return $result; } private function prepareFieldsetInput($value, $listFieldset) { if(isset($listFieldset[$value['fieldsetId']]) && isset($listFieldset[$value['fieldsetId']]['nbCol'])){ $nbCol = $listFieldset[$value['fieldsetId']]['nbCol']; } else{ $nbCol = 0; } $result = []; if(isset($value['values']) && !empty($value['values'])){ if(count($value['values']) > $nbCol){ $nbCol = count($value['values']); } $names = []; $protocoles = []; $collection = reset($value['values']); if(!empty($collection)){ foreach ($collection as $input) { $names[] = $input['name']; $protocoles[] = $input['protocole']; } } $listFieldset[$value['fieldsetId']] = ['nbCol' => $nbCol, "names" => $names, 'protocole' => $protocoles]; } $result = $listFieldset; return $result; } private function prepareFieldsetCol($listFieldset) { $result = []; foreach($listFieldset as $key => $fieldset) { $index = 1; $names = []; $protocoles = []; while($index <= $fieldset['nbCol']){ $names = array_merge($names, $fieldset['names']); foreach($fieldset['protocole'] as $protocole) { if(!empty($protocole)){ $protocoles[] = $protocole . '_' . $index; } else{ $protocoles[] = ""; } } $index ++; } $result[$key] = ['name' => $names, "protocole" => $protocoles]; } return $result; } private function prepareValueFieldset($protocoles, $element) { $result = []; foreach($protocoles as $protocole){ $find = false; foreach($element['value'] as $value){ if($value['type'] === "fieldset" && !empty($value['values'])){ $index = 1; while(!$find && $index <= count($value['values'])){ $collection = $value['values'][$index - 1]; $input = array_filter($collection, static function ($inp) use ($protocole, $index) { return $protocole === $inp['protocole'] . '_' . $index; }); if(!empty($input)) { $val = reset($input)['value']; if(is_array($val) && !empty($val)){ $result[] = implode(',', $val); } elseif(is_array($val) && empty($val)){ $result[] = ''; } else{ $result[] = $val; } $find = true; } $index ++; } } } if(!$find){ $result[] = ''; } } return $result; } }