Расширение EntityType, чтобы разрешить дополнительные варианты, установленные с вызовами AJAX

Я пытаюсь создать пользовательский тип Symfonyпростирающийся ядро "юридическое лицо" тип.

Но я хочу использовать его сSelect2 версия 4.0.0 (ajax теперь работает с html-элементом select, а не со скрытым input, как раньше).

Этот тип должен создавать пустой выбор вместо полного списка сущностей с расширенным типом «сущность».

Это работает путем установки опции (см. ConfigureOption):

'choices'=>array()
При редактировании объекта, прикрепленного к форме, он должен заполнить выбор текущими данными объекта. Я решил эту проблему, но только для представления с помощью следующего метода buildView ...

Select2 распознает содержимое HTML «select» и работает с ajax. Но когда форма отправляется обратно, Symfony не распознает выбранные варианты (потому что они не были разрешены?)

Symfony\Component\Form\Exception\TransformationFailedException

    Unable to reverse value for property path "user": The choice "28" does not exist or is not unique

Я пробовал несколько методов, используя EventListeners или Subscribeers, но я не могу найти рабочую конфигурацию.

С Select2 3.5. * Я решил проблему с событиями формы и переопределением скрытого типа формы, но здесь расширение типа сущности намного сложнее.

Как я могу создать свой тип, чтобы он мог управлять обратным преобразованием моих энтитов?

Пользовательский тип:

<?php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\ChoiceList\View\ChoiceView;

class AjaxEntityType extends AbstractType
{
    protected $router;

    public function __construct($router)
    {
        $this->router = $router;
    }

   /**
    * {@inheritdoc}
    */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {   
        $builder->setAttribute('attr',array_merge($options['attr'],array('class'=>'select2','data-ajax--url'=>$this->router->generate($options['route']))));
    }

    /**
    * {@inheritdoc}
    */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['attr'] = $form->getConfig()->getAttribute('attr');
        $choices = array();
        $data=$form->getData();
        if($data instanceOf \Doctrine\ORM\PersistentCollection){$data = $data->toArray();}
        $values='';
        if($data != null){
            if(is_array($data)){
                foreach($data as $entity){
                    $choices[] = new ChoiceView($entity->getAjaxName(),$entity->getId(),$entity,array('selected'=>true));
                }
            }
            else{
                $choices[] = new ChoiceView($data->getAjaxName(),$data->getId(),$data,array('selected'=>true));
            }
        }

        $view->vars['choices']=$choices;
    }

   /**
    * {@inheritdoc}
    */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setRequired(array('route'));
        $resolver->setDefaults(array('choices'=>array(),'choices_as_value'=>true));
    }

    public function getParent() {
        return 'entity';
    }

    public function getName() {
        return 'ajax_entity';
    }
}

Родительская форма

<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class AlarmsType extends AbstractType
{
   /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name','text',array('required'=>false))
            ->add('user','ajax_entity',array("class"=>"AppBundle:Users","route"=>"ajax_users"))
            ->add('submit','submit');
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array('data_class' => 'AppBundle\Entity\Alarms','validation_groups'=>array('Default','form_user')));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'alarms';
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос