/**
  * 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);
             }
         }
     }
 }
Exemplo n.º 3
0
 /**
  * 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;
 }
Exemplo n.º 6
0
 /**
  * {@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;
 }
Exemplo n.º 12
0
 /**
  * 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;
             }
         }
     }
 }
Exemplo n.º 15
0
 /**
  * @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;
 }
Exemplo n.º 19
0
 /**
  * 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);
     }
 }
Exemplo n.º 20
0
 /**
  * @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();
     }
 }
Exemplo n.º 21
0
 /**
  * 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;
 }
Exemplo n.º 22
0
 /**
  * @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;
 }
Exemplo n.º 23
0
 /**
  * @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'))));
     });
 }
Exemplo n.º 24
0
 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));
 }
Exemplo n.º 25
0
 /**
  * @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);
         }
     }
 }