/** * {@inheritdoc} */ public function preUpdate() { $extendConfigProvider = $this->configManager->getProvider('extend'); $entityConfigs = $extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if (!$entityConfig->is('is_extend')) { continue; } $fieldConfigs = $extendConfigProvider->getConfigs($entityConfig->getId()->getClassName()); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->in('state', [ExtendScope::STATE_NEW, ExtendScope::STATE_UPDATE])) { continue; } /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); if (in_array($fieldConfigId->getFieldType(), ['file', 'image'])) { $cascade = $fieldConfig->get('cascade', false, []); if (!in_array('persist', $cascade, true)) { $cascade[] = 'persist'; } $this->relationBuilder->addManyToOneRelation($entityConfig, 'Oro\\Bundle\\AttachmentBundle\\Entity\\File', $fieldConfigId->getFieldName(), 'id', ['extend' => ['cascade' => $cascade], 'importexport' => ['process_as_scalar' => true]], $fieldConfigId->getFieldType()); } } } }
/** * {@inheritdoc} */ public function preUpdate() { $extendConfigProvider = $this->configManager->getProvider('extend'); $entityConfigs = $extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if (!$entityConfig->is('is_extend')) { continue; } $fieldConfigs = $extendConfigProvider->getConfigs($entityConfig->getId()->getClassName()); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->is('state', ExtendScope::STATE_NEW)) { continue; } /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); if (in_array($fieldConfigId->getFieldType(), ['file', 'image'])) { // create a relation $relationKey = $this->relationBuilder->addManyToOneRelation($entityConfig, 'Oro\\Bundle\\AttachmentBundle\\Entity\\File', $fieldConfigId->getFieldName(), 'id', ['importexport' => ['process_as_scalar' => true]], $fieldConfigId->getFieldType()); // set cascade persist $relations = $entityConfig->get('relation'); $cascade = isset($relations[$relationKey]['cascade']) ? $relations[$relationKey]['cascade'] : []; $cascade[] = 'persist'; $relations[$relationKey]['cascade'] = $cascade; $entityConfig->set('relation', $relations); $extendConfigProvider->persist($entityConfig); } } } }
/** * @param ConfigInterface $entityConfig * @param string $targetEntityClassName * @param string $relationName */ protected function createOwnerRelation(ConfigInterface $entityConfig, $targetEntityClassName, $relationName) { $relationKey = ExtendHelper::buildRelationKey($entityConfig->getId()->getClassName(), $relationName, 'manyToOne', $this->ownershipMetadataProvider->getOrganizationClass()); if (!isset($entityConfig->get('relation')[$relationKey])) { $this->relationBuilder->addManyToOneRelation($entityConfig, $targetEntityClassName, $relationName, 'id', ['entity' => ['label' => 'oro.custom_entity.' . $relationName . '.label', 'description' => 'oro.custom_entity.' . $relationName . '.description'], 'view' => ['is_displayable' => false], 'form' => ['is_enabled' => false], 'dataaudit' => ['auditable' => true]]); } }
/** * @param string $sourceEntityClass * @param string $targetEntityClass * @param string $associationKind */ public function createManyToOneAssociation($sourceEntityClass, $targetEntityClass, $associationKind) { $relationName = ExtendHelper::buildAssociationName($targetEntityClass, $associationKind); $entityConfigProvider = $this->configManager->getProvider('entity'); $targetEntityConfig = $entityConfigProvider->getConfig($targetEntityClass); $label = $targetEntityConfig->get('label', false, ConfigHelper::getTranslationKey('entity', 'label', $targetEntityClass, $relationName)); $description = ConfigHelper::getTranslationKey('entity', 'description', $targetEntityClass, $relationName); $targetEntityPrimaryKeyColumns = $this->getPrimaryKeyColumnNames($targetEntityClass); $targetFieldName = array_shift($targetEntityPrimaryKeyColumns); // add relation to owning entity $this->relationBuilder->addManyToOneRelation($this->configManager->getProvider('extend')->getConfig($sourceEntityClass), $targetEntityClass, $relationName, $targetFieldName, ['entity' => ['label' => $label, 'description' => $description], 'view' => ['is_displayable' => false], 'form' => ['is_enabled' => false]]); }
/** * @param string $sourceEntityClass * @param string $targetEntityClass * @param string $associationKind */ public function createManyToOneAssociation($sourceEntityClass, $targetEntityClass, $associationKind) { $relationName = ExtendHelper::buildAssociationName($targetEntityClass, $associationKind); $extendConfigProvider = $this->configManager->getProvider('extend'); $targetEntityPrimaryKeyColumns = $this->getPrimaryKeyColumnNames($targetEntityClass); $targetFieldName = reset($targetEntityPrimaryKeyColumns); // add relation to owning entity $this->relationBuilder->addManyToOneRelation($extendConfigProvider->getConfig($sourceEntityClass), $targetEntityClass, $relationName, $targetFieldName); // update attributes for new association $fieldConfig = $extendConfigProvider->getConfig($sourceEntityClass, $relationName); if ($fieldConfig->is('state', ExtendScope::STATE_NEW)) { $targetEntityConfig = $this->configManager->getProvider('entity')->getConfig($targetEntityClass); $this->relationBuilder->updateFieldConfigs($sourceEntityClass, $relationName, ['entity' => ['label' => $this->getAssociationLabel('label', $sourceEntityClass, $relationName, $targetEntityConfig), 'description' => $this->getAssociationLabel('description', $sourceEntityClass, $relationName, $targetEntityConfig)], 'view' => ['is_displayable' => false], 'form' => ['is_enabled' => false]]); } }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testAddManyToOneRelationForAlreadyExistRelationWithOptions() { $relationName = 'testRelation'; $relationKey = 'manyToOne|Test\\SourceEntity|Test\\TargetEntity|testRelation'; $targetFieldName = 'field1'; $extendConfig = new Config(new EntityConfigId('extend', self::SOURCE_CLASS)); $extendConfig->set('relation', [$relationKey => []]); $extendFieldConfig = new Config(new FieldConfigId('extend', self::SOURCE_CLASS, $relationName, 'manyToOne')); $testFieldConfig = new Config(new FieldConfigId('test', self::SOURCE_CLASS, $relationName, 'manyToOne')); $expectedExtendFieldConfig = new Config($extendFieldConfig->getId()); $expectedExtendFieldConfig->setValues(['owner' => ExtendScope::OWNER_CUSTOM, 'is_extend' => true, 'relation_key' => $relationKey, 'target_entity' => self::TARGET_CLASS, 'target_field' => $targetFieldName]); $expectedTestFieldConfig = new Config($testFieldConfig->getId()); $expectedTestFieldConfig->setValues(['test_attr' => 123]); $fieldConfigModel = $this->getMockBuilder('Oro\\Bundle\\EntityConfigBundle\\Entity\\FieldConfigModel')->disableOriginalConstructor()->getMock(); $this->configManager->expects($this->once())->method('hasConfigFieldModel')->with(self::SOURCE_CLASS, $relationName)->will($this->returnValue(true)); $this->configManager->expects($this->never())->method('createConfigFieldModel'); $this->configManager->expects($this->once())->method('getConfigFieldModel')->with(self::SOURCE_CLASS, $relationName)->will($this->returnValue($fieldConfigModel)); $fieldConfigModel->expects($this->once())->method('getType')->will($this->returnValue('manyToOne')); $this->configManager->expects($this->never())->method('changeFieldType'); $extendConfigProvider = $this->getConfigProviderMock(); $extendConfigProvider->expects($this->once())->method('getConfig')->with(self::SOURCE_CLASS, $relationName)->will($this->returnValue($extendFieldConfig)); $extendConfigProvider->expects($this->once())->method('persist')->with($this->identicalTo($extendFieldConfig)); $testConfigProvider = $this->getConfigProviderMock(); $testConfigProvider->expects($this->once())->method('getConfig')->with(self::SOURCE_CLASS, $relationName)->will($this->returnValue($testFieldConfig)); $testConfigProvider->expects($this->once())->method('persist')->with($this->identicalTo($testFieldConfig)); $this->configManager->expects($this->any())->method('getProvider')->will($this->returnValueMap([['extend', $extendConfigProvider], ['test', $testConfigProvider]])); $this->builder->addManyToOneRelation($extendConfig, self::TARGET_CLASS, $relationName, $targetFieldName, ['extend' => ['owner' => ExtendScope::OWNER_CUSTOM], 'test' => ['test_attr' => 123]]); $this->assertEquals($expectedExtendFieldConfig, $extendFieldConfig); $this->assertEquals($expectedTestFieldConfig, $testFieldConfig); }
/** * {@inheritdoc} * * @SuppressWarnings(PHPMD.NPathComplexity) */ public function preUpdate() { $enumConfigProvider = $this->configManager->getProvider('enum'); $extendConfigProvider = $this->configManager->getProvider('extend'); $entityConfigs = $extendConfigProvider->getConfigs(); foreach ($entityConfigs as $entityConfig) { if (!$entityConfig->is('is_extend')) { continue; } $fieldConfigs = $extendConfigProvider->getConfigs($entityConfig->getId()->getClassName()); foreach ($fieldConfigs as $fieldConfig) { if (!$fieldConfig->in('state', [ExtendScope::STATE_NEW, ExtendScope::STATE_UPDATE])) { continue; } /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); $fieldType = $fieldConfigId->getFieldType(); if (!in_array($fieldType, ['enum', 'multiEnum'])) { continue; } // prepare input parameters $fieldOptions = []; $enumFieldConfig = $enumConfigProvider->getConfig($fieldConfigId->getClassName(), $fieldConfigId->getFieldName()); $enumCode = $enumFieldConfig->get('enum_code'); $enumName = $enumFieldConfig->get('enum_name'); $isPublic = $enumFieldConfig->get('enum_public'); if (empty($enumCode) && $isPublic && empty($enumName)) { throw new \LogicException(sprintf('Both "enum_code" and "enum_name" cannot be empty for a public enum. Field: %s::%s.', $fieldConfigId->getClassName(), $fieldConfigId->getFieldName())); } if (empty($enumCode)) { $enumCode = $enumName !== null ? ExtendHelper::buildEnumCode($enumName) : ExtendHelper::generateEnumCode($fieldConfigId->getClassName(), $fieldConfigId->getFieldName()); $fieldOptions['enum']['enum_code'] = $enumCode; } $isMultiple = $this->fieldTypeHelper->getUnderlyingType($fieldType) === RelationType::MANY_TO_MANY; $enumValueClassName = ExtendHelper::buildEnumValueClassName($enumCode); // create an entity is used to store enum values $this->createEnumValueConfigEntityModel($enumValueClassName, $enumCode, $isMultiple, $isPublic); // create a relation if ($isMultiple) { $fieldOptions['extend']['without_default'] = true; $this->relationBuilder->addManyToManyRelation($entityConfig, $enumValueClassName, $fieldConfigId->getFieldName(), ['name'], ['name'], ['name'], $fieldOptions, $fieldType); } else { $this->relationBuilder->addManyToOneRelation($entityConfig, $enumValueClassName, $fieldConfigId->getFieldName(), 'name', $fieldOptions, $fieldType); } } } }
/** * @param ConfigInterface $entityConfig * @param string $targetEntityClassName * @param string $relationName */ protected function createOwnerRelation(ConfigInterface $entityConfig, $targetEntityClassName, $relationName) { $this->relationBuilder->addManyToOneRelation($entityConfig, $targetEntityClassName, $relationName, 'id', ['entity' => ['label' => 'oro.custom_entity.' . $relationName . '.label', 'description' => 'oro.custom_entity.' . $relationName . '.description'], 'view' => ['is_displayable' => false], 'form' => ['is_enabled' => false], 'dataaudit' => ['auditable' => true]]); }