fieldSaveQuery = $fieldSaveQuery; $this->elementTypeFieldRead = $elementTypeFieldRead; } public function getProjectFields(int $projectId): array { try { $projectFields = $this->fieldSaveQuery->getSaveFields($projectId); } catch (Exception $exception) { return []; } $elemTypesId = []; $elemTypeFieldsId = []; foreach ($projectFields['fields'] as $saveField) { foreach ($saveField as $field) { try { $elemTypesId[] = $field['elementTypeId']; } catch (Exception $exception) { return []; } $elemTypeFieldsId[] = $field['id']; } } $elemTypesId = array_unique($elemTypesId); $elemTypesId = implode(',', $elemTypesId); $elemTypeFieldsId = array_unique($elemTypeFieldsId); $elemTypeFieldsId = implode(',', $elemTypeFieldsId); $pimData = $this->getPimData($elemTypesId, $elemTypeFieldsId); $dataElementTypesAndFields = $this->removeNoMatchedData($pimData, $projectFields['fields']); $elementTypes = $this->removeNonUniqueData($dataElementTypesAndFields, 'elementTypeName'); $elementTypes = array_values($elementTypes); $projectFieldsWithPimName = []; foreach ($elementTypes as $elementType) { $fields = []; foreach ($dataElementTypesAndFields as $iValue) { if ((int) $iValue['elementTypeId'] === (int) $elementType['elementTypeId']) { $fieldsetFields = []; if (!empty($iValue['fieldsetInputs'])) { foreach ($iValue['fieldsetInputs'] as $fieldsetField) { $fieldsetFields[] = new FieldsetFieldView( $fieldsetField['id'], $fieldsetField['name'], $fieldsetField['fieldsetId'] ); } } $field = new FieldAssocView( (int) $iValue['elementTypeFieldId'], $iValue['elementTypeFieldName'], $fieldsetFields ); $fields[] = $field; } } $projectFieldsWithPimName[] = new ElementTypeWithFieldsView( $elementType['elementTypeId'], $elementType['elementTypeName'], $fields ); } return $projectFieldsWithPimName; } private function removeNoMatchedData(array $pimDatas, array $projectDatas): array { $data = []; foreach ($projectDatas as $projectDatasEt) { foreach ($projectDatasEt as $projectData) { foreach ($pimDatas as $pimData) { if ((int) $projectData['elementTypeId'] === (int) $pimData['elementTypeId'] && (int) $projectData['id'] === (int) $pimData['elementTypeFieldId']) { $data[] = $pimData; } } } } $result = $this->removeNonUniqueData($data, 'elementTypeFieldName'); $result = array_values($result); return $result; } private function getPimData(string $elemTypesId, string $elemTypeFieldsId): array { try { $pimData = $this->elementTypeFieldRead->findByElementTypes($elemTypesId, $elemTypeFieldsId); } catch (Exception $exception) { return []; } return $pimData; } }