/** * @param string $entityClass * @param string $filterKey * @param array $filterConfig * * @return ConfigInterface|null */ protected function findFieldConfig($entityClass, $filterKey, $filterConfig) { $path = ConfigUtil::explodePropertyPath(isset($filterConfig[ConfigUtil::PROPERTY_PATH]) ? $filterConfig[ConfigUtil::PROPERTY_PATH] : $filterKey); if (count($path) === 1) { return $this->getFieldConfig($entityClass, reset($path)); } $linkedProperty = array_pop($path); $classMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path); return null !== $classMetadata ? $this->getFieldConfig($classMetadata->name, $linkedProperty) : null; }
/** * @param EntityMetadata $entityMetadata * @param string $propertyName * @param string[] $propertyPath */ protected function addLinkedProperty(EntityMetadata $entityMetadata, $propertyName, array $propertyPath) { $linkedProperty = array_pop($propertyPath); $classMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityMetadata->getClassName(), $propertyPath); if (null !== $classMetadata) { if ($classMetadata->hasAssociation($linkedProperty)) { $associationMetadata = $this->entityMetadataFactory->createAssociationMetadata($classMetadata, $linkedProperty); $associationMetadata->setName($propertyName); $entityMetadata->addAssociation($associationMetadata); } else { $fieldMetadata = $this->entityMetadataFactory->createFieldMetadata($classMetadata, $linkedProperty); $fieldMetadata->setName($propertyName); $entityMetadata->addField($fieldMetadata); } } }
/** * @param ConfigContext $context * @param array $fields * @param string $rootEntityClass * @param ClassMetadata $metadata * @param string|null $fieldPath */ protected function processFields(ConfigContext $context, array &$fields, $rootEntityClass, ClassMetadata $metadata, $fieldPath = null) { foreach ($fields as $fieldName => &$fieldConfig) { if (is_array($fieldConfig)) { $propertyPath = !empty($fieldConfig[ConfigUtil::PROPERTY_PATH]) ? $fieldConfig[ConfigUtil::PROPERTY_PATH] : $fieldName; $path = ConfigUtil::explodePropertyPath($propertyPath); if (count($path) === 1) { $this->setFieldCustomizationHandler($context, $fieldConfig, $metadata, $propertyPath, $rootEntityClass, $this->buildFieldPath($fieldName, $fieldPath)); } else { $linkedField = array_pop($path); $linkedMetadata = $this->doctrineHelper->findEntityMetadataByPath($metadata->name, $path); if (null !== $linkedMetadata) { $this->setFieldCustomizationHandler($context, $fieldConfig, $linkedMetadata, $linkedField, $rootEntityClass, $this->buildFieldPath($fieldName, $fieldPath)); } } } } }
/** * @param array $definition * @param string $entityClass * @param int $limit */ protected function setLimits(array &$definition, $entityClass, $limit) { if (isset($definition[ConfigUtil::FIELDS]) && is_array($definition[ConfigUtil::FIELDS])) { $metadata = $this->doctrineHelper->getEntityMetadataForClass($entityClass); foreach ($definition[ConfigUtil::FIELDS] as $fieldName => &$fieldConfig) { if (is_array($fieldConfig)) { $propertyPath = ConfigUtil::getPropertyPath($fieldConfig, $fieldName); $path = ConfigUtil::explodePropertyPath($propertyPath); if (count($path) === 1) { $this->setFieldLimit($fieldConfig, $metadata, $propertyPath, $limit); } else { $linkedField = array_pop($path); $linkedMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path); if (null !== $linkedMetadata) { $this->setFieldLimit($fieldConfig, $linkedMetadata, $linkedField, $limit); } } } } } }
/** * @param array $sectionConfig * @param string $entityClass * * @return array */ protected function removeDuplicates(array $sectionConfig, $entityClass) { if (empty($sectionConfig[ConfigUtil::FIELDS])) { return $sectionConfig; } $keys = array_keys($sectionConfig[ConfigUtil::FIELDS]); foreach ($keys as $key) { $fieldPath = !empty($sectionConfig[ConfigUtil::FIELDS][$key][ConfigUtil::PROPERTY_PATH]) ? $sectionConfig[ConfigUtil::FIELDS][$key][ConfigUtil::PROPERTY_PATH] : $key; $path = ConfigUtil::explodePropertyPath($fieldPath); if (count($path) === 1) { continue; } $fieldName = array_pop($path); if (array_key_exists(implode(ConfigUtil::PATH_DELIMITER, $path), $sectionConfig[ConfigUtil::FIELDS])) { $metadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path); if (null !== $metadata && in_array($fieldName, $metadata->getIdentifierFieldNames(), true)) { unset($sectionConfig[ConfigUtil::FIELDS][$key]); } } } return $sectionConfig; }