/** * @param string $sourceEntityClass * @param string $targetEntityClass * @param string $associationKind */ public function createManyToManyAssociation($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); // add relation to owning entity $this->relationBuilder->addManyToManyRelation($this->configManager->getProvider('extend')->getConfig($sourceEntityClass), $targetEntityClass, $relationName, $targetEntityPrimaryKeyColumns, $targetEntityPrimaryKeyColumns, $targetEntityPrimaryKeyColumns, ['extend' => ['without_default' => true], 'entity' => ['label' => $label, 'description' => $description], 'view' => ['is_displayable' => true], 'form' => ['is_enabled' => true]]); }
/** * @param string $sourceEntityClass * @param string $targetEntityClass * @param string $associationKind */ public function createManyToManyAssociation($sourceEntityClass, $targetEntityClass, $associationKind) { $relationName = ExtendHelper::buildAssociationName($targetEntityClass, $associationKind); $extendConfigProvider = $this->configManager->getProvider('extend'); $targetEntityPrimaryKeyColumns = $this->getPrimaryKeyColumnNames($targetEntityClass); // add relation to owning entity $this->relationBuilder->addManyToManyRelation($extendConfigProvider->getConfig($sourceEntityClass), $targetEntityClass, $relationName, $targetEntityPrimaryKeyColumns, $targetEntityPrimaryKeyColumns, $targetEntityPrimaryKeyColumns); // 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, ['extend' => ['without_default' => true], 'entity' => ['label' => $this->getAssociationLabel('plural_label', $sourceEntityClass, $relationName, $targetEntityConfig), 'description' => $this->getAssociationLabel('description', $sourceEntityClass, $relationName, $targetEntityConfig)], 'view' => ['is_displayable' => true], 'form' => ['is_enabled' => true]]); } }
/** * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testAddManyToManyRelationForAlreadyExistRelationWithOptions() { $relationName = 'testRelation'; $relationKey = 'manyToMany|Test\\SourceEntity|Test\\TargetEntity|testRelation'; $targetTitleFieldName = 'field1'; $targetDetailedFieldName = 'field2'; $targetGridFieldName = 'field3'; $extendConfig = new Config(new EntityConfigId('extend', self::SOURCE_CLASS)); $extendConfig->set('relation', [$relationKey => []]); $extendFieldConfig = new Config(new FieldConfigId('extend', self::SOURCE_CLASS, $relationName, 'manyToMany')); $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_title' => [$targetTitleFieldName], 'target_detailed' => [$targetDetailedFieldName], 'target_grid' => [$targetGridFieldName]]); $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('manyToMany')); $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->addManyToManyRelation($extendConfig, self::TARGET_CLASS, $relationName, [$targetTitleFieldName], [$targetDetailedFieldName], [$targetGridFieldName], ['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); } } } }