2016-07-27 13 views
1

Ich möchte Elemente dynamisch hinzufügen können, ohne dass sie in der Auswahloption für den EntityType-Formulartyp voreingestellt sind. Ich muss verfügbare Auswahl ändern, weil sonst invalid value Fehler auftaucht.Dynamische Änderung von Formularvorgaben zur Gültigkeitsprüfung in symfony2

class MyImageType extends AbstractType { 
    public function __construct($em) { 
     $this->em = $em; 
    } 

    public function configureOptions(OptionsResolver $resolver) { 
     $resolver->setDefaults(array(
      'class' => 'stuff/MyImage', 
      'choice_label' => 'id', 
      'multiple' => true, 
      'choices' => [], 
     )); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     // 
    } 

    public function getParent() { 
     return EntityType::class; 
    } 
} 

und ich verwende es wie folgt aus:

$builder->add('images', 'stuff\MyImage\Form\Type\MyImageType') 

die HTML erzeugt sieht wie folgt aus:

<select id="product_images" name="product[images][]" required="required" class="form-control" multiple="multiple"> 
</select> 

ich Anrufe einige Ajax bin Ausführung Entität zu erstellen und fügen Sie die ID der Dropdown-Liste wie folgt:

<select id="product_images" name="product[images][]" required="required" class="form-control" multiple="multiple"> 
    <option value="88" selected="selected">88</option> 
</select> 

88 ist vorhandene ID für vorhandene Entität.

Wenn ich das Formular danach einsende, erscheint invalid value Fehler, weil 88 nicht in der Voreinstellung choices für diesen Entitätstyp ist. Also muss ich 88 in den verfügbaren Wahlen hinzufügen.

Wenn dies ein Kind einer Form (Symfony \ Component \ Formular \ Form) war, konnte ich dies auf FormEvents::PRE_SUBMIT

//.. 
$img = $em->findOneById(88); 
$form->add('images', [ 
    'class' => 'stuff/MyImage', 
    'choice_label' => 'id', 
    'multiple' => true, 
    'choices' => [$img], 
]); 

aber in meinem Fall möchte ich es in MyImageType Klasse tun, die kapseln Klasse. Können Sie mir Anweisungen geben, wie es geht? Vielen Dank.

EDIT:

Im Prozess diese Frage des Schreibens ich eine Lösung für dieses Problem gefunden haben. Für den Fall, kann ich das Feld aktualisieren, wie so:

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($em) { 
    $form = $$event->getForm(); 
    $form->getParent()->add('images', EntityType::class, $options); 
} 

Noch will ich nicht meine eigene Frage beantworten, denn vielleicht gibt einen besseren Weg, es zu tun ist. Vielen Dank.

+0

Haben Sie versucht, Wert mit Set-Methode des Objekts, bevor es an Ihr Formular übergeben? – DOZ

+0

Ich schlug vor einiger Zeit eine ähnliche Lösung für einen Benutzer vor, der ein Problem wie Ihres hatte. http://stackoverflow.com/questions/27981609/symfony-adding-Element-to-form-collection-in-pre-submit-event/27982025#comment44356045_27982025 –

Antwort

0

Werfen Sie einen Blick auf meine FormBundle.

Um das zu beheben, hook in das PRE_SUBMIT FormEvent, und ich neu erstellen das Kind die übermittelten Auswahl der neuen Option "Auswahl" injiziert.

Wenn Ihr Feld beim Bearbeiten einer Entität ausgefüllt werden soll, müssen Sie dasselbe in PRE_SET_DATA tun.

Vorsicht

es so tun, jede eingereichten bestehende Einheit wird ein gültiger Wert sein. Wenn nur ein Teil der Entitäten auswählbar ist, sollten Sie auch eine Einschränkung zu Ihrem Feld hinzufügen.