/**
  * @Route("/update/{id}", name="oro_entityextend_field_update", requirements={"id"="\d+"}, defaults={"id"=0})
  * Acl(
  *      id="oro_entityextend_field_update",
  *      label="Update custom field",
  *      type="action",
  *      group_name=""
  * )
  */
 public function updateAction(EntityConfigModel $entity)
 {
     $request = $this->getRequest();
     $fieldName = $request->getSession()->get(sprintf(self::SESSION_ID_FIELD_NAME, $entity->getId()));
     $fieldType = $request->getSession()->get(sprintf(self::SESSION_ID_FIELD_TYPE, $entity->getId()));
     if (!$fieldName || !$fieldType) {
         return $this->redirect($this->generateUrl('oro_entityextend_field_create', ['id' => $entity->getId()]));
     }
     /** @var ConfigManager $configManager */
     $configManager = $this->get('oro_entity_config.config_manager');
     $extendProvider = $configManager->getProvider('extend');
     $extendEntityConfig = $extendProvider->getConfig($entity->getClassName());
     $relationValues = [];
     $relationOptions = explode('||', $fieldType);
     $relationName = $relationOptions[0];
     if (isset($relationOptions[1])) {
         $fieldName = $relationOptions[1];
     }
     $relationOptions = explode('|', $relationOptions[0]);
     /**
      * fieldType example: relation|manyToOne|testentity5_relation_7
      * check if fieldType has 3rd option [fieldName]
      */
     if (count($relationOptions) == 4) {
         $fieldType = ExtendHelper::getReversRelationType($relationOptions[0]);
         $relations = $extendEntityConfig->get('relation');
         if (isset($relations[$relationName])) {
             $relationValues['target_entity'] = $relations[$relationName]['target_entity'];
             $relationValues['relation_key'] = $relationName;
         }
     }
     $newFieldModel = $configManager->createConfigFieldModel($entity->getClassName(), $fieldName, $fieldType);
     $extendFieldConfig = $extendProvider->getConfig($entity->getClassName(), $fieldName);
     $extendFieldConfig->set('owner', ExtendManager::OWNER_CUSTOM);
     $extendFieldConfig->set('state', ExtendManager::STATE_NEW);
     $extendFieldConfig->set('extend', true);
     foreach ($relationValues as $key => $value) {
         $extendFieldConfig->set($key, $value);
     }
     $form = $this->createForm('oro_entity_config_type', null, ['config_model' => $newFieldModel]);
     if ($request->getMethod() == 'POST') {
         $form->submit($request);
         if ($form->isValid()) {
             //persist data inside the form
             $this->get('session')->getFlashBag()->add('success', $this->get('translator')->trans('oro.entity_extend.controller.config_field.message.saved'));
             if ($extendEntityConfig->get('state') != ExtendManager::STATE_NEW) {
                 $extendEntityConfig->set('state', ExtendManager::STATE_UPDATED);
             }
             $extendEntityConfig->set('upgradeable', true);
             $configManager->persist($extendEntityConfig);
             $configManager->flush();
             return $this->get('oro_ui.router')->actionRedirect(['route' => 'oro_entityconfig_field_update', 'parameters' => ['id' => $newFieldModel->getId()]], ['route' => 'oro_entityconfig_view', 'parameters' => ['id' => $entity->getId()]]);
         }
     }
     /** @var ConfigProvider $entityConfigProvider */
     $entityConfigProvider = $this->get('oro_entity_config.provider.entity');
     $entityConfig = $entityConfigProvider->getConfig($entity->getClassName());
     $fieldConfig = $entityConfigProvider->getConfig($entity->getClassName(), $newFieldModel->getFieldName());
     return $this->render('OroEntityConfigBundle:Config:fieldUpdate.html.twig', ['entity_config' => $entityConfig, 'field_config' => $fieldConfig, 'field' => $newFieldModel, 'form' => $form->createView(), 'formAction' => $this->generateUrl('oro_entityextend_field_update', array('id' => $entity->getId())), 'require_js' => $configManager->getProvider('extend')->getPropertyConfig()->getRequireJsModules()]);
 }
 protected function createSelfRelation(Config $fieldConfig)
 {
     $selfEntityClass = $fieldConfig->getId()->getClassName();
     $targetEntityClass = $fieldConfig->get('target_entity');
     $selfFieldType = $fieldConfig->getId()->getFieldType();
     $selfFieldName = $fieldConfig->getId()->getFieldName();
     $selfConfig = $this->extendConfigProvider->getConfig($selfEntityClass);
     $relationKey = implode('|', [$selfFieldType, $selfEntityClass, $targetEntityClass, $selfFieldName]);
     $scope = 'extend';
     /**
      * in case of oneToMany relation
      * automatically create target field (type: manyToOne)
      */
     $targetFieldId = false;
     $owner = true;
     $targetOwner = false;
     if (in_array($selfFieldType, ['oneToMany', 'manyToMany'])) {
         $classNameArray = explode('\\', $selfEntityClass);
         $relationFieldName = strtolower(array_pop($classNameArray)) . '_' . $selfFieldName;
         if ($selfFieldType == 'oneToMany') {
             $owner = false;
             $targetOwner = true;
         }
         $targetFieldId = new FieldConfigId($targetEntityClass, $scope, $relationFieldName, ExtendHelper::getReversRelationType($selfFieldType));
     }
     $selfRelationConfig = ['assign' => false, 'field_id' => $fieldConfig->getId(), 'owner' => $owner, 'target_entity' => $targetEntityClass, 'target_field_id' => $targetFieldId];
     $selfRelations = $selfConfig->get('relation') ?: [];
     $selfRelations[$relationKey] = $selfRelationConfig;
     $selfConfig->set('relation', $selfRelations);
     $this->extendConfigProvider->persist($selfConfig);
     $targetConfig = $this->extendConfigProvider->getConfig($targetEntityClass);
     $targetRelationConfig = ['assign' => false, 'field_id' => $targetFieldId, 'owner' => $targetOwner, 'target_entity' => $selfEntityClass, 'target_field_id' => $fieldConfig->getId()];
     $targetRelations = $targetConfig->get('relation') ?: [];
     $targetRelations[$relationKey] = $targetRelationConfig;
     $targetConfig->set('relation', $targetRelations);
     $fieldConfig->set('relation_key', $relationKey);
     $this->extendConfigProvider->persist($targetConfig);
     //$this->extendConfigProvider->persist($fieldConfig);
 }