public function testPostUpdateForDeletedMultiEnumField() { $entityConfig = new Config(new EntityConfigId('extend', 'Extend\\EnumValue1')); $entityConfig->set('owner', ExtendScope::OWNER_CUSTOM); $entityConfig->set('is_extend', true); $entityConfig->set('schema', ['doctrine' => ['Extend\\EnumValue1' => ['fields' => [ExtendHelper::getMultiEnumSnapshotFieldName('field2') => ['column' => 'field2']]]]]); $fieldConfig = new Config(new FieldConfigId('extend', 'Extend\\EnumValue1', 'field1', 'multiEnum')); $fieldConfig->set('is_deleted', true); $entityConfigs = [$entityConfig]; $fieldConfigs = [$fieldConfig]; $extendConfigProvider = $this->getMockBuilder('Oro\\Bundle\\EntityConfigBundle\\Provider\\ConfigProvider')->disableOriginalConstructor()->getMock(); $this->configManager->expects($this->once())->method('getProvider')->with('extend')->will($this->returnValue($extendConfigProvider)); $extendConfigProvider->expects($this->at(0))->method('getConfigs')->with(null, true)->will($this->returnValue($entityConfigs)); $extendConfigProvider->expects($this->at(1))->method('getConfigs')->with($entityConfig->getId()->getClassName())->will($this->returnValue($fieldConfigs)); $this->configManager->expects($this->once())->method('persist')->with($this->identicalTo($entityConfig)); $this->extension->postUpdate(); $this->assertEquals(['doctrine' => ['Extend\\EnumValue1' => ['fields' => [ExtendHelper::getMultiEnumSnapshotFieldName('field1') => ['column' => $this->nameGenerator->generateMultiEnumSnapshotColumnName('field1'), 'type' => 'string', 'nullable' => true, 'length' => ExtendHelper::MAX_ENUM_SNAPSHOT_LENGTH], ExtendHelper::getMultiEnumSnapshotFieldName('field2') => ['column' => 'field2']]]], 'property' => [ExtendHelper::getMultiEnumSnapshotFieldName('field1') => ['private' => true]]], $entityConfig->get('schema')); }
/** * Adds enumerable field * * Take in attention that this method creates new private enum if the enum with the given code * is not exist yet. If you want to create a public enum use {@link createEnum} method before. * * @param Schema $schema * @param Table|string $table A Table object or table name * @param string $associationName A relation name * @param string $enumCode The target enum identifier * @param bool $isMultiple Indicates whether several options can be selected for this enum * or it supports only one selected option * @param bool|string[] $immutable Indicates whether the changing the list of enum values and * public flag is allowed or not. More details can be found * in entity_config.yml * @param array $options */ public function addEnumField(Schema $schema, $table, $associationName, $enumCode, $isMultiple = false, $immutable = false, array $options = []) { $enumTableName = $this->nameGenerator->generateEnumTableName($enumCode); $selfTable = $this->getTable($table, $schema); // make sure a table that is used to store enum values exists if (!$schema->hasTable($enumTableName)) { $this->createEnum($schema, $enumCode, $isMultiple, false, $immutable); } // create appropriate relation $options['enum']['enum_code'] = $enumCode; if ($isMultiple) { $options['extend']['without_default'] = true; $this->addManyToManyRelation($schema, $selfTable, $associationName, $enumTableName, ['name'], ['name'], ['name'], $options, 'multiEnum'); // create a column that will contain selected options // this column is required to avoid group by clause when multiple enum is shown in a datagrid $selfTable->addColumn($this->nameGenerator->generateMultiEnumSnapshotColumnName($associationName), 'string', ['notnull' => false, 'length' => ExtendHelper::MAX_ENUM_SNAPSHOT_LENGTH]); } else { $this->addManyToOneRelation($schema, $selfTable, $associationName, $enumTableName, 'name', $options, 'enum'); } }
/** * {@inheritdoc} */ public function postUpdate() { $extendConfigProvider = $this->configManager->getProvider('extend'); $entityConfigs = $extendConfigProvider->getConfigs(null, true); foreach ($entityConfigs as $entityConfig) { if ($entityConfig->is('inherit', ExtendHelper::BASE_ENUM_VALUE_CLASS)) { $entityClassName = $entityConfig->getId()->getClassName(); $schema = $entityConfig->get('schema', false, []); if (!empty($schema['doctrine'][$entityClassName]['repositoryClass'])) { continue; } $schema['doctrine'][$entityClassName]['repositoryClass'] = 'Oro\\Bundle\\EntityExtendBundle\\Entity\\Repository\\EnumValueRepository'; $schema['doctrine'][$entityClassName]['gedmo']['translation']['entity'] = 'Oro\\Bundle\\EntityExtendBundle\\Entity\\EnumValueTranslation'; $entityConfig->set('schema', $schema); $this->configManager->persist($entityConfig); } elseif ($entityConfig->is('is_extend')) { $fieldConfigs = $extendConfigProvider->getConfigs($entityConfig->getId()->getClassName()); foreach ($fieldConfigs as $fieldConfig) { /** @var FieldConfigId $fieldConfigId */ $fieldConfigId = $fieldConfig->getId(); if ($fieldConfigId->getFieldType() !== 'multiEnum') { continue; } $mappingClassName = $entityConfig->has('extend_class') ? $entityConfig->get('extend_class') : $entityConfig->getId()->getClassName(); $fieldName = $fieldConfigId->getFieldName(); $snapshotFieldName = ExtendHelper::getMultiEnumSnapshotFieldName($fieldName); $schema = $entityConfig->get('schema', false, []); if (!empty($schema['doctrine'][$mappingClassName]['fields'][$snapshotFieldName])) { continue; } $schema['property'][$snapshotFieldName] = []; if ($fieldConfig->is('is_deleted')) { $schema['property'][$snapshotFieldName]['private'] = true; } $schema['doctrine'][$mappingClassName]['fields'][$snapshotFieldName] = ['column' => $this->nameGenerator->generateMultiEnumSnapshotColumnName($fieldName), 'type' => 'string', 'nullable' => true, 'length' => ExtendHelper::MAX_ENUM_SNAPSHOT_LENGTH]; $entityConfig->set('schema', $schema); $this->configManager->persist($entityConfig); } } } }