2016-11-07 10 views
1

Starten mit Symfony ist ziemlich eine Lernkurve. Auch nach stundenlanger Lektüre kann ich dieses vermeintlich einfache Problem nicht nachvollziehen. Ich möchte ein Auswahlformular mit Werten aus einer Entität laden.Symfony: Zugriff auf Controller-Variablen aus Formular

Controller:

namespace AppBundle\Controller 
class ItemController extends Controller 
{ 
    public function itemAction (Request $request) 
    { 
     $myItems = new Itemlist(); 
     //some statements to fill $myItems 
     $form = $this->createForm (AllitemsType::class, $myItems); 
     // some more stuff 
     return $this->render (...); 
    } 
} 

Entity:

namespace AppBundle\Entity; 
class Itemlist 
{ 
    protected $choices; 
    protected $defaultvalue; 

    public function __construct() 
    { 
    $choices = array(); 
    } 

    // all the get and set-methods to fill/read the $choices array and $defaultvalue 
} 

Form:

namespace AppBundle\Form 
class AllitemsType extends AbstractType 
{ 
    public function buildForm (FormBuilderInterface $builder, array $options) 
    { 
    // and here is my problem: how can I fill next two lines with values from the Itemlist-Entity? 
    // The Itemlist instance has been build in the controller and is unknown here 
    $items = ??? // should be 'AppBundle\Entity\Itemlist->$choices 
    $defaultitem = ??? // should be 'AppBundle\Entity\Itemlist->$defaultvalue 

    $choices_of_items = array (
     'choices' => $items, 
     'expanded' => true, 
     'multiple' => false, 
     'data' => $defaultitem, 
    ); 

    $builder->add ('radio1', ChoiceType::class, $choices_of_items); 

    } 
} 

Jede Hilfe dankbar, Wolfram

Antwort

2
$builder->add('choices', ChoiceType::class); 

sollte ausreichen, da Sie eine Entität an das Formular binden, der Prozess zum Abrufen von Werten und zum Zurücksetzen der Werte erfolgt automatisch. Natürlich müssen Sie Setter und Getter für choices Feld eine vollständige Antwort in AllitemsType

geben müssen - über einen Teil der so genannten „Best-Practice-one“ - Sie auch eine der folgenden

$items = $options['data']; 
wählen

oder

$builder->addEventListener(
    FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
    $allItems = $event->getData(); 
    $form = $event->getForm(); 
    $form->add('radio1', ChoiceType::class, [ 
     'choices' => $allItems 
    ]); 
}); 

Zweitens sollte man wie in options['data'] bevorzugt werden, könnten Unternehmen während Form Lebensdauer des Ereignisses ändern.

+0

Ihre "best practice" -Antwort löst zwar die Auswahl, füllt aber nicht das Attribut 'data', korrekt? Und Entschuldigung, ich nehme nicht die anderen beiden optionalen Antworten. Trotzdem vielen Dank für Ihren Beitrag. – Wolfram

+0

@wolfram Sorry, ich habe die Datenoption vergessen, aber es ist die gleiche Methode, die ich für die Auswahl verwende – DonCallisto

0

Übergeben Sie Variablen mit createForm Objekt.

Controller:

namespace AppBundle\Controller 
    class ItemController extends Controller 
    { 
     public function itemAction (Request $request) 
     { 
      $myItems = new Itemlist(); 
      $formVars = array("items" => array(1,2,3,4,6), "defaultItems" => 2); // Store variables 
      ^^ 

      //some statements to fill $myItems 
      $form = $this->createForm (new AllitemsType($formVars), $myItems); 
                 ^^ 
      // some more stuff 
      return $this->render (...); 
     } 
    } 

Jetzt Konstruktor in Form erstellen und Klassenvariablen items und defaultitem in form.

Form:

namespace AppBundle\Form 
class AllitemsType extends AbstractType 
{ 

    $this->items = array(); 
    $this->defaultitem = 0; 

    public function __construct($itemArr) 
    { 
    $this->items = $itemArr['items']; 
    $this->defaultitem = $itemArr['defaultItems']; 
    } 

    public function buildForm (FormBuilderInterface $builder, array $options) 
    { 
    $choices_of_items = array (
     'choices' => $this->items, // User class variable 
     'expanded' => true, 
     'multiple' => false, 
     'data' => $this->defaultitem, // User class variable 
    ); 

    $builder->add ('radio1', ChoiceType::class, $choices_of_items); 

    } 
} 

Es sollte Ihr Problem lösen.

+1

Vielen Dank. Das ist genau das, wonach ich gesucht habe. – Wolfram

+0

Tun Sie das nicht. new FormType() wurde in Symfony 3.x entfernt. Übergeben Sie zusätzliche Informationen über den Parameter options. – Cerad

+1

@Cerad scheint wie Wolfram verwendet Symfony 2.x-Version gemäß seiner bereitgestellten Code – Janvi

Verwandte Themen