'fields' from parent items. * * @var string[] */ private array $copiedDefParams = [ 'readOnly', 'disabled', 'notStorable', 'layoutListDisabled', 'layoutDetailDisabled', 'layoutMassUpdateDisabled', 'layoutFiltersDisabled', 'directAccessDisabled', 'directUpdateDisabled', 'customizationDisabled', 'importDisabled', 'exportDisabled', ]; public function __construct(private Metadata $metadata) {} /** * Get field definitions by a type in metadata, "fields" key. * * @param array $defs It can be a string or field definition from entityDefs. * @return ?array */ public function getFieldDefsByType($defs) { if (isset($defs['type'])) { return $this->metadata->get('fields.' . $defs['type']); } return null; } /** * @param array $defs * @return ?array */ public function getFieldDefsInFieldMetadata($defs) { $fieldDefsByType = $this->getFieldDefsByType($defs); if (isset($fieldDefsByType['fieldDefs'])) { return $fieldDefsByType['fieldDefs']; } return null; } /** * Get link definition defined in 'fields' metadata. * In linkDefs can be used as value (e.g. "type": "hasChildren") and/or variables (e.g. "entityName":"{entity}"). * Variables should be defined into fieldDefs (in 'entityDefs' metadata). * * @param string $entityType * @param array $defs * @return ?array */ public function getLinkDefsInFieldMeta($entityType, $defs) { $fieldDefsByType = $this->getFieldDefsByType($defs); if (!isset($fieldDefsByType['linkDefs'])) { return null; } $linkFieldDefsByType = $fieldDefsByType['linkDefs']; foreach ($linkFieldDefsByType as &$paramValue) { if (preg_match('/{(.*?)}/', $paramValue, $matches)) { if (in_array($matches[1], array_keys($defs))) { $value = $defs[$matches[1]]; } else if (strtolower($matches[1]) == 'entity') { $value = $entityType; } if (isset($value)) { $paramValue = str_replace('{'.$matches[1].'}', $value, $paramValue); } } } return $linkFieldDefsByType; } /** * Get additional field list based on field definition in metadata 'fields'. * * @param string $fieldName * @param array $fieldParams * @param array $definitionList * @return ?array */ public function getAdditionalFieldList($fieldName, array $fieldParams, array $definitionList) { if (empty($fieldParams['type']) || empty($definitionList)) { return null; } $fieldType = $fieldParams['type']; $fieldDefinition = $definitionList[$fieldType] ?? null; if ( isset($fieldDefinition) && !empty($fieldDefinition['fields']) && is_array($fieldDefinition['fields']) ) { $copiedParams = array_intersect_key($fieldParams, array_flip($this->copiedDefParams)); $additionalFields = []; // add additional fields foreach ($fieldDefinition['fields'] as $subFieldName => $subFieldParams) { $namingType = $fieldDefinition['naming'] ?? $this->defaultNaming; $subFieldNaming = Util::getNaming($fieldName, $subFieldName, $namingType); $additionalFields[$subFieldNaming] = array_merge($copiedParams, $subFieldParams); } return $additionalFields; } return null; } }