projectDir = $kernel->getProjectDir(); $this->exportRepository = $exportRepository; $this->elementGabValue = $elementGabValue; $this->params = $params; $this->container = $container; } protected function configure() { $this // the name of the command (the part after "bin/console") ->setName('export:csv') // the short description shown while running "php bin/console list" ->setDescription('Get Export from Maestro') // add 'processDate' argument ->addArgument('export', InputArgument::REQUIRED, "Veuillez préciser l'export à exporter") ->addArgument('origin', InputArgument::OPTIONAL, "Veuillez préciser l'origin") ->addArgument('process_date', InputArgument::OPTIONAL, 'Date of the process', date_create()->format('Y-m-d')); } public function execute(InputInterface $input, OutputInterface $output) { $processDate = $input->getArgument('process_date'); $idExport = $input->getArgument('export'); $crossOrigin = $input->getArgument('origin'); $response = ''; $export = $this->exportRepository->findById($idExport); if (!empty($export)) { $projectFlux = $export->getProject()->getFlux(); if(!empty($projectFlux)){ $fields = $projectFlux->getFields(); } $flux = json_decode($fields, true); $elements = $this->elementGabValue->listGabValue(null, null, $idExport, null, null,[],$flux); $fields = []; $header = ['ID Modele','Nom Modele','Id','Fiche','Version']; $headerProtocole = ['','','','','']; $headerProductLink = []; $protocoles = []; $listProductLink = []; $listFieldset = []; $inputExist = []; if (!empty($elements)) { $prepareHeader = $this->prepareHeader($elements); $header = array_merge($header,$prepareHeader['fields']); $fields = $prepareHeader['fields']; $protocoles = array_merge($headerProtocole, $prepareHeader['protocoles']); $listProductLink = $prepareHeader['listProductLink']; if(!empty($listProductLink)){ foreach ($listProductLink as $productLink) { $element = array_filter($elements, function($elem) use($productLink) { return $elem['id'] === $productLink['id']; }); if(!empty($element)){ $values = reset($element)['value']; if(!empty($values)){ foreach ($values as $value) { $inputExist[] = $value['typeFieldId']; } } $elements[key($element)] = $productLink; } else{ $elements[]= $productLink; } } $headerProductLink = $this->prepareHeader($listProductLink); if(!empty($headerProductLink['fields'])){ foreach ($headerProductLink['fields'] as $key => $field) { if(!in_array($key, $inputExist)){ $fields[$key] = $field; $header[] = $field; $protocoles[] = $headerProductLink['protocoles'][$key]; } } } } $listFieldset = $prepareHeader['listFieldset']; if(!empty($listFieldset)){ $listFieldset = $this->prepareFieldsetCol($listFieldset); foreach($listFieldset as $fieldset){ $header = array_merge($header, $fieldset['name']); $protocoles = array_merge($protocoles, $fieldset['protocole']); } } $response = $this->createCsvFile($elements,$header, $fields, $protocoles, $listFieldset, $listProductLink, $headerProductLink, $export, $processDate, $crossOrigin); } } $output->write($response); return $response; } private function prepareHeader($elements) { $result = []; $fields = []; $protocoles = []; $listProductLink = []; $listFieldset = []; foreach ($elements as $element) { if(isset($element['value'])){ foreach($element['value'] as $value){ if($value['type'] === "fieldset"){ if(!empty($value['values']) > 0){ $listFieldset = $this->prepareFieldsetInput($value, $listFieldset); } } else{ if($value['type'] === "productLink" && isset($value['values']) && !empty($value['values'])){ $listProductLink = array_merge($listProductLink, $value['values']); } $fields[ $value['typeFieldId']] = $value['name']; if(isset($value['protocole']) && !empty($value['protocole'])){ $protocoles[$value['typeFieldId']] = $value['protocole']; } else{ $protocoles[$value['typeFieldId']] = ''; } } } } } $result = ['protocoles' => $protocoles, "listProductLink" => $listProductLink, "listFieldset" => $listFieldset, "fields" => $fields]; 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['inputId']] = $input['name']; $protocoles[$input['inputId']] = $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 $indexCol => $protocole) { if(!empty($protocole)){ $protocoles[$indexCol . '_' . $index] = $protocole . '_' . $index; } else{ $protocoles[$indexCol . '_' . $index] = ""; } } $index ++; } $result[$key] = ['name' => $names, "protocole" => $protocoles]; } return $result; } private function prepareValueFieldset($protocoles, $element) { $result = []; foreach($protocoles as $key => $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, $key) { return $protocole === $inp['protocole'] . '_' . $index && $key === $inp['inputId'] . '_' . $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; } private function createCsvFile(array $elements, array $header, array $fields, array $protocoles, array $listFieldset, array $listProductLink, array $headerProductLink, $export, $processDate, $crossOrigin) { $response = new StreamedResponse(); $response->setCallback(function () use ($elements,$header, $fields, $protocoles, $listFieldset, $listProductLink, $headerProductLink, $export, $processDate, $crossOrigin) { $projectDir = $this->projectDir; $inputFile = $projectDir."/src/Application/Data/Exports/" . $export->getName() . "-$processDate.csv"; //$csv = fopen($inputFile, 'w+'); $csv = fopen('php://output', 'wb'); 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->headers->set('Access-Control-Allow-Origin', $crossOrigin); $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; } } elseif(isset(reset($value)['values']) && !empty(reset($value)['values'])){ $ids = []; foreach(reset($value)['values'] as $val){ $ids[] = $val['id']; } if(!empty($ids)){ $result[] = implode(',',$ids); } } else{ $result[] = ''; } } else{ $result[] = ''; } } else{ $result[] = ''; } } $result = array_merge($headerElement, $result); return $result; } }