Extending EntityType, um zusätzliche Auswahlmöglichkeiten bei AJAX-Aufrufen zu ermöglichen

Ich versuche einen Symfony Custom-Typ zu erstellenverlängerung der Kern "Entitä" Art

Aber ich möchte es mit @ verwend Select2 Version 4.0.0 (Ajax funktioniert jetzt mit dem HTML-Element "select" und nicht wie zuvor mit versteckten "Eingaben".)

Dieser Typ sollte eine leere Auswahl anstelle der vollständigen Liste der Entitäten vom erweiterten Typ "Entität" erstellen.

Dies funktioniert durch Setzen der Option (siehe configureOption):

'choices'=>array()
Bearbeiten Sie das an das Formular angehängte Objekt, und füllen Sie die Auswahl mit den aktuellen Daten des Objekts. Ich habe dieses Problem aber nur für die Ansicht mit der folgenden buildView-Methode gelöst ...

Select2 erkennt den Inhalt des HTML-Befehls "select" und erledigt seine Arbeit mit Ajax. Wenn das Formular jedoch zurückgesendet wird, erkennt Symfony die ausgewählten Optionen nicht (da diese nicht zulässig waren?).

Symfony\Component\Form\Exception\TransformationFailedException

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

Ich habe verschiedene Methoden mit EventListeners oder Subscribers ausprobiert, finde aber keine funktionierende Konfiguration.

Mit Select2 3.5. * Ich habe das Problem mit Formularereignissen und dem Überschreiben des verborgenen Formulartyps gelöst, aber hier ist das Erweitern des Entitätstyps viel schwieriger.

Wie kann ich meinen Typ erstellen, damit er die umgekehrte Transformation meiner Entitäten verwaltet?

Custom type:

<?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';
    }
}

Erstes Formular

<?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';
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage