2013-02-01 12 views
10

Wyświetlam tabelę html dla przefiltrowanego zbioru encji i chcę wyświetlić pole wyboru w każdym wierszu jako część formularza, który doda wybrane obiekty do sesji var.Utwórz formularz z polem wyboru dla każdej jednostki w kolekcji doktryn

Myślę, że każde pole wyboru powinno mieć identyfikator podmiotu jako jego wartość, a otrzymam tablicę identyfikatorów z danych pola formularza (ok, więc wartość powinna być pośrednim odnosnikiem jednostki, ale ze względu na prostotę).

Próbowałem już utworzyć formularz typu z jednym polem typu obiektu, zmapowany do właściwości id jednostki i osadzony w innej formie Typ, który ma pole typu kolekcji.

class FooEntitySelectByIdentityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('foo_id', 'entity', array(
      'required' => false, 
      'class' => 'MeMyBundle:FooEntity', 
      'property' => 'id', 
      'multiple' => true, 
      'expanded' => true 
     )); 
    } 

# ... 

i

class FooEntitySelectionType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('identity', 'collection', array(
      'type' => new FooEntitySelectByIdentityType, 
      'options' => array(
       'required' => false, 
       'multiple' => true, 
       'expanded' => true, 
       'attr'  => array('class' => 'foo') 
      ), 
     )); 
    } 

# ... 

w kontrolerze forma jest utworzony ze zbiorem jednostek jako danych wyjściowych

$form = $this 
    ->createForm(
     new \Me\MyBundle\Form\Type\FooEntitySelectionType, 
     $collection_of_foo 
    ) 
    ->createView() 
; 

Gdy postać staje się nie pojedyncza etykieta pole tożsamości, ale bez widżetów.

Czy w ten sposób można w ogóle używać pól encji i typów kolekcji? Jeśli tak, co mogę zrobić źle?

Odpowiedz

8

Myślę, że to odpowie na twoje pytanie.

Zapomnij o FooEntitySelectionType. Dodaj opcję property_path pole do FooEntitySelectByIdentityType i ustawić data_class opcja null:

class FooEntitySelectByIdentityType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('foo_id', 'entity', array(
      'required'  => false, 
      'class'   => 'MeMyBundle:FooEntity', 
      'property'  => 'id', 
      'property_path' => '[id]', # in square brackets! 
      'multiple'  => true, 
      'expanded'  => true 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class'  => null, 
      'csrf_protection' => false 
     )); 
    } 

# ... 

w kontrolerze, zbudować FooEntitySelectByIdentityType:

$form = $this 
    ->createForm(
     new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType, 
     $collection_of_foo 
    ) 
    ->createView() 
; 

a następnie w akcji kontrolera, który odbiera Wysłany dane:

$form = $this 
    ->createForm(new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType) 
; 
$form->bind($request); 
if ($form->isValid()) { 
    $data = $form->getData(); 
    $ids = array(); 
    foreach ($data['foo_id'] as $entity) { 
     $ids[] = $entity->getId(); 
    } 
    $request->getSession()->set('admin/foo_list/batch', $ids); 
} 

i wreszcie w szablonie gałązki:

{# ... #} 
{% for entity in foo_entity_collection %} 
    {# ... #} 

    {{ form_widget(form.foo_id[entity.id]) }} 

    {# ... #} 
+0

to działa! wadą tej całej metody jest to, że '$ form-> getData()' zwraca tablicę zawierającą zbiór obiektów zamiast zwykłych liczb całkowitych, ale przypuszczam, że wadą jest to, że nie może być żadnych nieprawidłowych identyfikatorów zapisanych w sesji. dzięki @jah! – jah

+1

Należy pamiętać, że to podejście nie działa, jeśli spróbujesz użyć ciągów jako identyfikatorów.'EntityChoiceList' następnie utworzy indeksy oparte na liczbach całkowitych dla dzieci i wywołanie' form_widget' spowoduje zgłoszenie wyjątku. :( – althaus

+0

Występuję również w tym problemie.Czy istnieje prostszy sposób na rozwiązanie tego prostego problemu? –

3

Jeśli ktoś szuka rozwiązania dla Symfony> = 2,3

Trzeba to zmienić:

$data = $form->getData(); 
    $ids = array(); 
    foreach ($data['foo_id'] as $entity) { 
     $ids[] = $entity->getId(); 
    } 

do tego:

$data = $form['foo_id']->getData(); 
    $ids = array(); 
    foreach ($data as $entity) { 
     $ids[] = $entity->getId(); 
    } 
2

tworzę symfony bundle dla renderuj kolekcję encji jako tabelę checkbox w konfigurowalny sposób. Chociaż minęło już trochę czasu, odkąd zadawano to pytanie, mam nadzieję, że pomoże to innym osobom z tym samym problemem.

+0

Używam tego pakietu i muszę powiedzieć, że to całkiem fajne! Dzięki! – Muc

+0

Jaka jest wydajność twojego pakietu z próbą wyświetlania do 1000 rekordów naraz? Planuję używać datatables przetwarzanie po stronie serwera w celu ograniczenia liczby rekordów wyświetlanych przy każdym wczytaniu strony, jednak wydaje się, że gdy korzystam z powyższych innych odpowiedzi, muszę utworzyć mój typ jednostki z wszystkimi możliwymi opcjami, jakich można się spodziewać, a nie tylko początkowo ograniczoną do pierwszej strony rekordów. Mam problemy z wydajnością związane z tym. – snoop168

Powiązane problemy