entityManager = $entityManager; $this->variableProjectRepository = $variableProjectRepository; } public function listSort(): ?array { $variableRepository = $this->entityManager->getRepository(VariableProject::class); $variables = $variableRepository->findby([ "deletedAt" => null ]); $result = []; foreach ($variables as $variable) { $var = [ "id" => $variable->getId(), "name" => $variable->getName(), "categorie" => $variable->getCategorie(), "fieldType" => $variable->getFieldType() ]; if ($variable->getCategorie() !== "media") { $result[$variable->getCategorie()][$variable->getFieldType()][] = $var; } else { $result[$variable->getCategorie()][] = $var; } } return $result; } public function dataTableList(DatatableRequestView $view, array $customFilters): DatatableResponseView { $sortField = $this->controlSortField($view->sortField); $tableData = $this->variableProjectRepository->listByDataTableFilters($view->sortOrder, $sortField, $view->first, $view->rows, $view->globalFilter, $customFilters, $view->strictMode, $view->searchOnFieldValue, $view->searchOnArchived); if (isset($tableData['data'])) { $variablesData = $tableData['data']; $variablesDataArray = []; $projectsDataArray = []; if (!empty($variablesData)) { foreach ($variablesData as $variable) { $isUse = false; switch ($variable->getCategorie()) { case 'variable': $isUse = !$variable->getVariables()->isEmpty(); break; case 'input': $isUse = !$variable->getInputs()->isEmpty(); break; case 'option': $isUse = !$variable->getExportOptions()->isEmpty(); break; case 'media': $isUse = !$variable->getExportMedias()->isEmpty(); break; } $projectsDataArray[] = [ 'name' => $variable->getName(), 'categorie' => $variable->getCategorie(), 'fieldType' => $variable->getFieldType(), 'id' => $variable->getId(), 'isUse' => $isUse ]; } $recordsTotal = null; if (isset($tableData["recordsFiltered"])) { $recordsFiltered = $tableData["recordsFiltered"]; } else { throw new \Exception("No recordsFiltered key provided !"); } $rows = array_values($projectsDataArray); } else { $recordsTotal = 0; $recordsFiltered = 0; $rows = []; } $hiddenColumns = ['id', "isUse"]; $columns = $this->getDataTableColumns($projectsDataArray, $hiddenColumns); $dataTableData = new DatatableResponseView( $rows, $columns, $recordsTotal, $recordsFiltered, $view, // Return received filters to let reload data with same filters [ ["id" => "variable", "name" => "variable"], ["id" => "input", "name" => "input"], ["id" => "option", "name" => "option"], ["id" => "media", "name" => "media"] ], // Contains all export types ); return $dataTableData; } else { throw new \Exception("No data key provided !"); } } /** * Since repository method returns object, there is no mapping like in PIM, so we need to convert names to entity attributes * * @param string $field * * @return string */ private function controlSortField(string $field): string { $sortField = 'vp.id'; if(!empty($field)){ $sortField = $field; } if (!property_exists(VariableProject::class, "id")) { throw new \Exception("Property id used by query builder doesn't exist in Variable Project class ! "); } return $sortField; } /** * @param array $projectsData * @param array $hiddenColumns * * @return array */ private function getDataTableColumns(array $projectsData, array $hiddenColumns): array { $columns = [ // Map repository columns with datatable columns (field & sortField can be different) 'name' => new DatatableColumnView('', 'vp.name', true, true, null, null), 'categorie' => new DatatableColumnView('', null, false, true, 'filterCategorie', 'vp.categorie'), // Does not make sense to sortable & filter on it since data are added after repository response 'fieldType' => new DatatableColumnView('', null, false, true, 'filterFieldTypes', 'vp.fieldType'), // Does not make sense to sortable & filter on it since data are added after repository response 'actions' => new DatatableColumnView('actions', null, false, false, null, null), ]; if (!empty($projectsData)) { $columnsHeaders = array_keys(reset($projectsData)); foreach ($columnsHeaders as $col) { if (!in_array($col, $hiddenColumns)) { $columns[$col]->field = $col; } } } else { foreach ($columns as $key => $col) { $columns[$key]->field = $key; } } return $columns; } }