2013-11-01 22 views
11

Chcę osadzić kolekcję wstępnie ładowanych formularzy nie-encji, tutaj jest kod, najpierw jest rodzimy formularz metoda buildForm.Jak osadzić wstępnie pobraną kolekcję formularzy nie-encji w symfony2

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder->add("example1")->add("example2"); 
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     /*some logic to do before adding the collection of forms*/ 
     $form->add('aclAccess', 'collection', array(
      'type' => new ChildFormType(), 
      'allow_add' => true, 
      'mapped' => false, 
      'data' => /* I dont know how to precharge a collection of non-entity forms*/ 
     )); 
    }); 
} 

teraz forma dziecko

public function buildForm (FormBuilderInterface $builder, array $options) { 
    $builder->add("test1", "text", array("read_only" => true, "data" => "test")); 
    $builder->->add("test2", "choice", array(
     'choices' => array('opt1' => 'Opt1', 'opt2' => 'Opt2'), 
     'multiple' => true, 
     'expanded' => true 
    )); 
} 

więc w zasadzie chcę zarządzać te opcje podrzędne w dziedzinie test2 jak rozdzielonych formach, każda grupa opcja zależy od wartości pola test1, wiem można to zrobić, kodując wszystko w gałązce bez klas postaci, ale myślę, że posiadanie klas postaci jest najlepszą praktyką do uruchamiania testu phpunit, dla łatwości konserwacji, itd ...

Odpowiedz

13

Dla dokumentacji na Using a Form Without a Class, powiązane dane są po prostu szyk.

Jeśli ty nie wykonać jedną z nich, wówczas forma powróci dane jako tablica. W tym przykładzie od $defaultData nie jest obiektem (i nie ma opcji), $form->getData() ostatecznie zwraca tablicę.

I wyjaśnić wszelkie błędne można mieć o formie danych - bazowego obiektu/klasy typu formy nie musi być Podmiotem - można użyć dowolnej klasy z właściwościami publicznych lub pobierające/ustawiające ta mapa do pól formularza. W tym przypadku klasy Entity same w sobie nie są niczym specjalnym - mają po prostu garść informacji mapujących, które informują ORM, jak je utrzymać.

Ale z powrotem do pierwotnego pytania, nie wiem, co się ChildFormType wygląda, ale załóżmy, że ma dwa pola, sequence i title

$form->add('aclAccess', 'collection', array(
     'type' => new ChildFormType(), 
     'allow_add' => true, 
     'mapped' => false, 
     'data' => array(
      array('sequence' => 1, 'title' => 'Foo') 
      , array('sequence' => 2, 'title' => 'Bar') 
     ) 
    )); 

To powinny rade