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'));
 }
Esempio n. 2
0
 /**
  * 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);
             }
         }
     }
 }