2015-09-17 8 views
5

Ich benutze Form Component und habe eine choice Field Type auf einem Formular, das auf ein Auswahlfeld gerendert wird. Auf einer Client-Seite verwende ich select2 plugin, die die Auswahl mit der Einstellung tags: true initialisiert, die es erlaubt, einen neuen Wert hinzuzufügen. Wenn ich jedoch einen neuen Wert hinzufüge, schlägt eine Überprüfung auf einem Server mit Fehler fehl.Erlaube, einen neuen Wert in einer Auswahl hinzuzufügen Feldtyp

Dieser Wert ist nicht gültig.

weil der neue Wert nicht in einer Auswahlliste ist.

Gibt es eine Möglichkeit, das Hinzufügen eines neuen Werts zur Auswahl eines Feldtyps zuzulassen?

Antwort

12

Das Problem liegt in einem Auswahltransformator, der Werte löscht, die nicht in einer Auswahlliste vorhanden sind.
The workaround with disabling the transformer mir geholfen:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('choiceField', 'choice', ['choices' => $someList]); 

    // more fields... 

    $builder->get('choiceField')->resetViewTransformers(); 
} 
+0

Nicht funktioniert für erweiterte => True –

1

Nein, gibt es nicht.

Sie sollten dies entweder manuell implementieren:

  • die select2 Ereignisse mit der neuen Wahl über Ajax erstellen
  • die gebuchten Optionen zu kontrollieren, bevor die Form der Validierung, und fügen Sie ihn in der Liste der Optionen
3

Hier ist ein Beispiel-Code, falls dies jemand für EntityType anstelle des Choice muss. Fügen Sie dies Ihrem FormType hinzu:

use AppBundle\Entity\Category; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
    $data = $event->getData(); 

    if (!$data) { 
     return; 
    } 

    $categoryId = $data['category']; 

    // Do nothing if the category with the given ID exists 
    if ($this->em->getRepository(Category::class)->find($categoryId)) { 
     return; 
    } 

    // Create the new category 
    $category = new Category(); 
    $category->setName($categoryId); 
    $this->em->persist($category); 
    $this->em->flush(); 

    $data['category'] = $category->getId(); 
    $event->setData($data); 
});