2013-04-12 21 views
5

Ich möchte als Hilfe. Ich habe ein Formular mit Dropdown-Liste und ich muss die Auswahl basierend auf externen Eingaben ändern. Ich denke, es sollte gutSymfony2 - modifizieren Formularfeld mit EventListener

$builder->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function(FormEvent $event) use($input){ 
       $form = $event->getForm(); 

       // get existin form child 
       // modify list of choices 

      } 

Alle Proben, die ich nur neues Feld hinzuzufügen gesehen verwenden FormEvents haben mit eventlistener arbeiten, aber ich brauche bestehenden Feld zu ändern, aber ich weiß nicht, wie es zuzugreifen.

Dank für Hilfe

+0

jros: In welcher Weise versuchen Sie, es zu ändern? Möchten Sie es durch einen anderen Typ ersetzen oder nur eines seiner Attribute oder etwas anderes ändern? – Sean

Antwort

2

Was Sie tun können, überschreibt das ursprüngliche Kind.

$builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function(FormEvent $event) use($input){ 
      $form = $event->getForm(); 

      $form->add($this->factory->createNamed('name_to_override', 'choice', null, 
       array("choices" => array("choice"=>"value")) 
       )); 

     } 

Es funktionierte für mich.

HINWEIS: dies funktioniert nur in PHP 5.4, wie $this in einer Closure ist nicht verfügbar in PHP 5.3.

+2

In 5.3 setzen Sie '$ that = $ this;' vor dem Callback, 'use ($ that)', und ändern Sie '$ this-> factory' in' $ that-> factory'. – moteutsch

20

Während die ursprüngliche Frage ziemlich alt ist, lassen Sie mich das jemand hier im Falle verlassen kommt sonst über die Notwendigkeit, eine bestimmte Option eines Feldes zu verändern, ohne alle Optionen wieder replizieren mit:

<?php 

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
    $form = $event->getForm(); 

    // Get configuration & options of specific field 
    $config = $form->get('field_to_update')->getConfig(); 
    $options = $config->getOptions(); 

    $form->add(
     // Replace original field... 
     'field_to_update', 
     $config->getType()->getName(), 
     // while keeping the original options... 
     array_replace(
      $options, 
      [ 
       // replacing specific ones 
       'required' => false, 
      ] 
     ) 
    ); 
}); 

Quelle: https://github.com/symfony/symfony/issues/8513#issuecomment-21868035

+9

Ich hatte das gleiche Problem aber mit Symfony 3. Statt '$ config-> getType-> getName()' benutze 'get_class ($ config-> getType() -> getInnerType())'. Dies liegt daran, dass Symfony 3 den Typ als vollständig qualifizierten Klassennamen benötigt. – TheNextBigThing

+1

Sie haben gerade meinen Tag gerettet ... Sie beide! – Delphine

Verwandte Themen