/** * Makes sure the class hierarchy was loaded */ protected function ensureHierarchyInitialized() { if (null === $this->hierarchy) { $this->hierarchy = []; $entityConfigs = $this->extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if ($entityConfig->in('state', [ExtendScope::STATE_NEW, ExtendScope::STATE_DELETE])) { continue; } if ($entityConfig->is('is_deleted')) { continue; } $className = $entityConfig->getId()->getClassName(); $parents = []; $this->loadParents($parents, $className); if (empty($parents)) { continue; } // remove proxies if they are in list of parents $parents = array_filter($parents, function ($parentClassName) { return strpos($parentClassName, ExtendHelper::ENTITY_NAMESPACE) !== 0; }); if (empty($parents)) { continue; } $this->hierarchy[$className] = $parents; } } }
/** * {@inheritdoc} */ public function preUpdate() { $entityConfigs = $this->extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if (!$entityConfig->is('is_extend')) { continue; } $fieldConfigs = $this->extendConfigProvider->getConfigs($entityConfig->getId()->getClassName()); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->in('state', [ExtendScope::STATE_NEW, ExtendScope::STATE_UPDATE])) { continue; } // @todo: we need to find a way to use this extension to process OWNER_SYSTEM relations as well // currently we have several problems here: // - collision with associations // - no support unidirectional relations if (!$fieldConfig->is('owner', ExtendScope::OWNER_CUSTOM)) { continue; } /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); if (in_array($fieldConfigId->getFieldType(), RelationType::$anyToAnyRelations, true)) { $this->createRelation($fieldConfig); } } } }
/** * Generate doctrine proxy classes for extended entities for the given entity manager * * @param EntityManager $em */ protected function generateEntityManagerProxies(EntityManager $em) { $isAutoGenerated = $em->getConfiguration()->getAutoGenerateProxyClasses(); if (!$isAutoGenerated) { $proxyDir = $em->getConfiguration()->getProxyDir(); if (!empty($this->cacheDir) && $this->kernelCacheDir !== $this->cacheDir && strpos($proxyDir, $this->kernelCacheDir) === 0) { $proxyDir = $this->cacheDir . substr($proxyDir, strlen($this->kernelCacheDir)); } $metadataFactory = $em->getMetadataFactory(); $proxyFactory = $em->getProxyFactory(); $extendConfigs = $this->extendConfigProvider->getConfigs(null, true); foreach ($extendConfigs as $extendConfig) { if (!$extendConfig->is('is_extend')) { continue; } if ($extendConfig->in('state', [ExtendScope::STATE_NEW])) { continue; } $entityClass = $extendConfig->getId()->getClassName(); $proxyFileName = $proxyDir . DIRECTORY_SEPARATOR . '__CG__' . str_replace('\\', '', $entityClass) . '.php'; $metadata = $metadataFactory->getMetadataFor($entityClass); $proxyFactory->generateProxyClasses([$metadata], $proxyDir); clearstatcache(true, $proxyFileName); } } }
/** * Adds entities to $result * * @param array $result */ protected function addEntities(array &$result) { // only configurable entities are supported $configs = $this->entityConfigProvider->getConfigs(); foreach ($configs as $config) { $this->addEntity($result, $config->getId()->getClassName(), $config->get('label'), $config->get('plural_label'), $config->get('icon')); } }
/** * Finds a field by its name. * Unessential symbols, like _ or upper case letters, in a field name are ignored. * * @param string $className * @param string $fieldName * * @return Config|null */ public function findExtendFieldConfig($className, $fieldName) { $fieldConfig = null; $normalizedFieldName = $this->normalizeFieldName($fieldName); $configs = $this->extendConfigProvider->getConfigs($className, true); foreach ($configs as $config) { if ($normalizedFieldName === $this->normalizeFieldName($config->getId()->getFieldName())) { $fieldConfig = $config; break; } } return $fieldConfig; }
/** * {@inheritdoc} */ protected function initializeHierarchy() { $entityConfigs = $this->extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if (ExtendHelper::isEntityAccessible($entityConfig)) { $className = $entityConfig->getId()->getClassName(); $parents = $this->loadParents($className); if (!empty($parents)) { $this->hierarchy[$className] = $parents; } } } }
/** * Makes sure metadata for dictionary entities were loaded */ protected function ensureDictionariesInitialized() { if (null === $this->dictionaries) { $this->dictionaries = []; $configs = $this->groupingConfigProvider->getConfigs(); foreach ($configs as $config) { $groups = $config->get('groups'); if (!empty($groups) && in_array(GroupingScope::GROUP_DICTIONARY, $groups)) { $className = $config->getId()->getClassName(); $metadata = $this->getManagerForClass($className)->getClassMetadata($className); $fieldNames = null; if ($this->dictionaryConfigProvider->hasConfig($className)) { $fieldNames = $this->dictionaryConfigProvider->getConfig($className)->get('virtual_fields'); } if (null === $fieldNames) { $fieldNames = array_filter($metadata->getFieldNames(), function ($fieldName) use(&$metadata) { return !$metadata->isIdentifier($fieldName); }); } $fields = []; foreach ($fieldNames as $fieldName) { $fields[$fieldName] = $metadata->getTypeOfField($fieldName); } $this->dictionaries[$className] = $fields; } } } }
/** * Adds entity fields to $result * * @param array $result * @param string $className * @param bool $applyExclusions * @param bool $translate */ protected function addFields(array &$result, $className, $applyExclusions, $translate) { $metadata = $this->getMetadataFor($className); // add regular fields $configs = $this->extendConfigProvider->getConfigs($className); foreach ($configs as $fieldConfig) { /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); $fieldName = $fieldConfigId->getFieldName(); $fieldType = $this->fieldTypeHelper->getUnderlyingType($fieldConfigId->getFieldType()); if ($this->fieldTypeHelper->isRelation($fieldType)) { // skip because this field is relation continue; } if (isset($result[$fieldName])) { // skip because a field with this name is already added, it could be a virtual field continue; } if (!$this->entityConfigProvider->hasConfig($className, $fieldName)) { // skip non configurable field continue; } if ($this->isIgnoredField($metadata, $fieldName)) { continue; } if ($fieldConfig->is('is_deleted')) { continue; } if ($applyExclusions && $this->exclusionProvider->isIgnoredField($metadata, $fieldName)) { continue; } $this->addField($result, $fieldName, $fieldConfigId->getFieldType(), $this->getFieldLabel($metadata, $fieldName), $metadata->isIdentifier($fieldName), $translate); } }
/** * Loads metadata for the given security type and save them in cache * * @param $securityType */ protected function loadMetadata($securityType) { $data = array(); $securityConfigs = $this->securityConfigProvider->getConfigs(); foreach ($securityConfigs as $securityConfig) { $className = $securityConfig->getId()->getClassName(); if ($securityConfig->get('type') === $securityType && $this->extendConfigProvider->getConfig($className)->in('state', [ExtendScope::STATE_ACTIVE, ExtendScope::STATE_UPDATE])) { $label = ''; if ($this->entityConfigProvider->hasConfig($className)) { $label = $this->entityConfigProvider->getConfig($className)->get('label'); } $permissions = $securityConfig->get('permissions'); if (!$permissions || $permissions == 'All') { $permissions = array(); } else { $permissions = explode(';', $permissions); } $data[$className] = new EntitySecurityMetadata($securityType, $className, $securityConfig->get('group_name'), $label, $permissions); } } if ($this->cache) { $this->cache->save($securityType, $data); } $this->localCache[$securityType] = $data; }
/** * Makes sure that metadata for the given security type is loaded * * @param string $securityType The security type. */ protected function ensureMetadataLoaded($securityType) { if (!isset($this->localCache[$securityType])) { $data = null; if ($this->cache) { $data = $this->cache->fetch($securityType); } if (!$data) { $securityConfigs = $this->securityConfigProvider->getConfigs(); foreach ($securityConfigs as $securityConfig) { if ($securityConfig->get('type') === $securityType) { $className = $securityConfig->getId()->getClassName(); $label = ''; if ($this->entityConfigProvider->hasConfig($className)) { $label = $this->entityConfigProvider->getConfig($className)->get('label'); } $permissions = $securityConfig->get('permissions'); if (!$permissions || $permissions == 'All') { $permissions = array(); } else { $permissions = explode(';', $permissions); } $data[$className] = new EntitySecurityMetadata($securityType, $className, $securityConfig->get('group_name'), $label, $permissions); } } if ($this->cache) { $this->cache->save($securityType, $data); } } $this->localCache[$securityType] = $data; } }
/** * @param string $entityClass * * @return array */ protected function getEntityVariableGetters($entityClass) { $entityClass = ClassUtils::getRealClass($entityClass); if (!$this->emailConfigProvider->hasConfig($entityClass)) { return []; } $result = []; $reflClass = new \ReflectionClass($entityClass); $fieldConfigs = $this->emailConfigProvider->getConfigs($entityClass); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->is('available_in_template')) { continue; } /** @var FieldConfigId $fieldId */ $fieldId = $fieldConfig->getId(); list($varName, $getter) = $this->getFieldAccessInfo($reflClass, $fieldId->getFieldName()); if (!$varName) { continue; } $resultGetter = $getter; $formatters = $this->formatterManager->guessFormatters($fieldId); if ($formatters && count($formatters)) { $resultGetter = array_merge(['property_path' => $getter], $formatters); } $result[$varName] = $resultGetter; } return $result; }
/** * Checks if the given owner owns at least one entity * * @param object $owner * @return bool */ public function hasAssignments($owner) { $result = false; $ownerType = $this->getOwnerType($owner); if ($ownerType !== OwnershipType::OWNER_TYPE_NONE) { foreach ($this->ownershipProvider->getConfigs(null, true) as $config) { if ($config->get('owner_type') === $ownerType) { $entityClassName = $config->getId()->getClassName(); $result = $this->getAssignmentChecker($entityClassName)->hasAssignments($this->objectIdAccessor->getId($owner), $entityClassName, $this->ownershipMetadata->getMetadata($entityClassName)->getOwnerFieldName(), $this->em); if ($result) { break; } } } } return $result; }
/** * Warms up the cache * * If the class name is specified this method warms up cache for this class only * * @param string|null $className */ public function warmUpCache($className = null) { if ($className === null) { foreach ($this->configProvider->getConfigs() as $config) { $this->ensureMetadataLoaded($config->getId()->getClassName()); } } else { $this->ensureMetadataLoaded($className); } }
/** * Makes sure the class hierarchy was loaded */ protected function ensureHierarchyInitialized() { if (null === $this->hierarchy) { $this->hierarchy = []; $entityConfigs = $this->extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if ($entityConfig->in('state', [ExtendScope::STATE_NEW, ExtendScope::STATE_DELETE])) { continue; } if ($entityConfig->is('is_deleted')) { continue; } $className = $entityConfig->getId()->getClassName(); $parents = $this->loadParents($className); if (!empty($parents)) { $this->hierarchy[$className] = $parents; } } } }
/** * @param BuildTemplateFormSubscriber $subscriber * @param ConfigProvider $ownershipConfigProvider */ public function __construct(BuildTemplateFormSubscriber $subscriber, ConfigProvider $ownershipConfigProvider) { $this->subscriber = $subscriber; $this->ownershipEntities = []; foreach ($ownershipConfigProvider->getConfigs() as $config) { $ownerType = $config->get('owner_type'); if (!empty($ownerType) && $ownerType != OwnershipType::OWNER_TYPE_NONE) { $this->ownershipEntities[$config->getId()->getClassName()] = true; } } }
/** * @param ConfigureMenuEvent $event */ public function onNavigationConfigure(ConfigureMenuEvent $event) { $menu = $event->getMenu(); $children = array(); $entitiesMenuItem = $menu->getChild('system_tab')->getChild('entities_list'); if ($entitiesMenuItem) { $extendConfigs = $this->entityExtendProvider->getConfigs(); foreach ($extendConfigs as $extendConfig) { if ($extendConfig->is('is_extend') && $extendConfig->get('owner') == ExtendManager::OWNER_CUSTOM && in_array($extendConfig->get('state'), array(ExtendManager::STATE_ACTIVE, ExtendManager::STATE_UPDATED))) { $config = $this->entityConfigProvider->getConfig($extendConfig->getId()->getClassname()); if (!$this->securityFacade->isGranted('VIEW', 'entity:' . $config->getId()->getClassName())) { continue; } $children[$config->get('label')] = array('label' => $config->get('label'), 'options' => array('label' => $config->get('label'), 'route' => 'oro_entity_index', 'routeParameters' => array('id' => str_replace('\\', '_', $config->getId()->getClassName())), 'extras' => array('safe_label' => true, 'routes' => array('oro_entity_*')))); } } sort($children); foreach ($children as $child) { $entitiesMenuItem->addChild($child['label'], $child['options']); } } }
public function testGetConfigs() { $this->configManager->expects($this->exactly(4))->method('getIds')->with('testScope', DemoEntity::ENTITY_NAME)->will($this->returnValue(array($this->entityConfig->getId()))); $this->assertEquals(array($this->entityConfig->getId()), $this->configProvider->getIds(DemoEntity::ENTITY_NAME)); $this->assertEquals(array($this->entityConfig), $this->configProvider->getConfigs(DemoEntity::ENTITY_NAME)); $this->assertEquals(array(), $this->configProvider->filter(function (ConfigInterface $config) { return $config->getId()->getScope() == 'wrongScope'; }, DemoEntity::ENTITY_NAME)); $entityConfig = new Config(new EntityConfigId(DemoEntity::ENTITY_NAME, 'testScope')); $entityConfig->set('key', 'value'); $this->assertEquals(array($entityConfig), $this->configProvider->map(function (ConfigInterface $config) { return $config->set('key', 'value'); }, DemoEntity::ENTITY_NAME)); }
/** * {@inheritdoc} */ public function loadClassMetadata(ClassMetadata $metadata) { $className = $metadata->getClassName(); if (empty($this->constraintsMapping) || !$this->formConfigProvider->hasConfig($className)) { return false; } $formConfigs = $this->formConfigProvider->getConfigs($className); foreach ($formConfigs as $formConfig) { if (!$formConfig->is('is_enabled')) { continue; } /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $formConfig->getId(); $fieldName = $fieldConfigId->getFieldName(); if (!$this->isApplicable($className, $fieldName)) { continue; } $constraints = $this->getConstraintsByFieldType($fieldConfigId->getFieldType()); foreach ($constraints as $constraint) { $metadata->addPropertyConstraint($fieldName, $constraint); } } return true; }
/** * Adds entities to $result * * @param array $result * @param bool $applyExclusions * @param bool $translate */ protected function addEntities(array &$result, $applyExclusions, $translate) { // only configurable entities are supported $entityConfigs = $this->entityConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { $entityConfigId = $entityConfig->getId(); $isStateCorrect = $this->extendConfigProvider->getConfigById($entityConfigId)->in('state', [ExtendScope::STATE_ACTIVE, ExtendScope::STATE_UPDATE]); if (false == $isStateCorrect) { continue; } $className = $entityConfigId->getClassName(); if ($applyExclusions && $this->isIgnoredEntity($className)) { continue; } $this->addEntity($result, $className, $entityConfig->get('label'), $entityConfig->get('plural_label'), $entityConfig->get('icon'), $translate); } }
/** * @param ConfigInterface $extendConfig * * @return bool */ protected function updateStateValues(ConfigInterface $extendConfig) { $hasChanges = false; $className = $extendConfig->getId()->getClassName(); $fieldConfigs = $this->configProvider->getConfigs($className, true); if ($extendConfig->is('state', ExtendScope::STATE_DELETE)) { // mark entity as deleted if (!$extendConfig->is('is_deleted')) { $extendConfig->set('is_deleted', true); $this->configProvider->persist($extendConfig); $hasChanges = true; } // mark all fields as deleted foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->is('is_deleted')) { $fieldConfig->set('is_deleted', true); $this->configProvider->persist($fieldConfig); $hasChanges = true; } } } elseif (!$extendConfig->is('state', ExtendScope::STATE_ACTIVE)) { $hasNotActiveFields = false; foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->is('state', ExtendScope::STATE_DELETE) && !$fieldConfig->is('state', ExtendScope::STATE_ACTIVE)) { $hasNotActiveFields = true; break; } } // Set entity state to active if all fields are active or deleted if (!$hasNotActiveFields) { $extendConfig->set('state', ExtendScope::STATE_ACTIVE); $this->configProvider->persist($extendConfig); } $hasChanges = true; } if ($hasChanges) { $this->configProvider->flush(); } }
/** * Return mapping data for entities that has one-way link to $className entity * * @param string $className * * @return array */ protected function getUnidirectionalRelations($className) { $relations = []; $entityConfigs = $this->extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if (!ExtendHelper::isEntityAccessible($entityConfig)) { continue; } $metadata = $this->getMetadataFor($entityConfig->getId()->getClassName()); if ($this->isIgnoredEntity($metadata)) { continue; } $targetMappings = $metadata->getAssociationMappings(); if (empty($targetMappings)) { continue; } foreach ($targetMappings as $mapping) { if ($mapping['isOwningSide'] && empty($mapping['inversedBy']) && $mapping['targetEntity'] === $className) { $relations[$mapping['sourceEntity'] . '::' . $mapping['fieldName']] = $mapping; } } } return $relations; }
/** * @param ConfigProvider $extendProvider * @param string $className * @param string $relationKey * * @return bool */ protected function hasReverseRelation(ConfigProvider $extendProvider, $className, $relationKey) { $fieldConfigs = $extendProvider->getConfigs($className); foreach ($fieldConfigs as $fieldConfig) { /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); if (in_array($fieldConfigId->getFieldType(), RelationTypeBase::$anyToAnyRelations, true) && $fieldConfig->is('relation_key', $relationKey) && !$fieldConfig->is('state', ExtendScope::STATE_DELETE)) { return true; } } return false; }
/** * @param ClassMetadata $classMetadata * * @return ConfigInterface[] */ protected function getUnmappedDynamicFieldsConfigs(ClassMetadata $classMetadata) { return array_filter($this->entityExtendProvider->getConfigs($classMetadata->name), function (ConfigInterface $config) use($classMetadata) { return !$classMetadata->hasField($config->getId()->getFieldName()) && !$classMetadata->hasAssociation($config->getId()->getFieldName()) && !$config->is('is_deleted') && $config->is('owner', ExtendScope::OWNER_CUSTOM) && ExtendHelper::isFieldAccessible($config) && !in_array($config->getId()->getFieldType(), RelationType::$toAnyRelations, true) && (!$config->has('target_entity') || ExtendHelper::isEntityAccessible($this->entityExtendProvider->getConfig($config->get('target_entity')))); }); }
public function testGetConfigsWithHidden() { $this->configManager->expects($this->once())->method('getConfigs')->with('testScope', DemoEntity::ENTITY_NAME, true)->will($this->returnValue(array($this->entityConfig))); $this->assertEquals(array($this->entityConfig), $this->configProvider->getConfigs(DemoEntity::ENTITY_NAME, true)); }
/** * @param ConfigInterface $entityConfig * @param ConfigProvider $configProvider */ protected function updateStateValues(ConfigInterface $entityConfig, ConfigProvider $configProvider) { if ($entityConfig->is('state', ExtendScope::STATE_DELETE)) { // mark entity as deleted if (!$entityConfig->is('is_deleted')) { $entityConfig->set('is_deleted', true); $this->configManager->persist($entityConfig); } // mark all fields as deleted $fieldConfigs = $configProvider->getConfigs($entityConfig->getId()->getClassName(), true); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->is('is_deleted')) { $fieldConfig->set('is_deleted', true); $this->configManager->persist($fieldConfig); } } } elseif (!$entityConfig->is('state', ExtendScope::STATE_ACTIVE)) { $hasNotActiveFields = false; $fieldConfigs = $configProvider->getConfigs($entityConfig->getId()->getClassName(), true); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->in('state', [ExtendScope::STATE_ACTIVE, ExtendScope::STATE_DELETE])) { $hasNotActiveFields = true; break; } } // Set entity state to active if all fields are active or deleted if (!$hasNotActiveFields) { $entityConfig->set('state', ExtendScope::STATE_ACTIVE); $this->configManager->persist($entityConfig); } } }