2015-01-13 26 views
8

Jak mogę renderować pojedyncze pole (pole wprowadzania pojedynczego radia/pola wyboru) w programie Twig w Symfony 2.6?Symfony 2.6 - renderowanie pola wyboru indywidualnego (radio, pole wyboru) o nazwie

Powiedzmy mam prostą postać:

class TransportType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
      $builder->add('transport', 'choice', array(
       'choices' => array(
        'road' => 'Car/bus', 
        'train' => 'Train', 
       ), 
       'expanded' => true, 
       'multiple' => false 
      )); 
    } 

w poprzednich wersjach Symfony2 mogłem po prostu użyć:

{{ form_widget(form.transport.road) }} 
{{ form_widget(form.transport.train) }} 

do renderowania poszczególnych przycisków radiowych, ale nie wydaje się już pracować . Wiem, że mogę użyć:

{{ form_widget(form.transport[0]) }} 
{{ form_widget(form.transport[1]) }} 

, ale jest mniej elastyczny. Oczywiście mogę powtórzyć kolekcję i sprawdzić nazwę, ale wydaje się to zbędne. Czy nie ma łatwiejszego sposobu?

Próbowałem offsetGet (który ma być return a child by name), ale działa również tylko z indeksem tablicy.

Odpowiedz

0

Wygląda na to, że nie jest to możliwe w przypadku najnowszej wersji Symfony (tj.> = 2.6). Pamiętam w poprzednich wersjach, gdy budowniczy forma wyświetlane tablicę choices, to było generowanie wyborów tak:

<select> 
    <option value="road">Car/Bus</option> 
    <option value="train">Train</option> 
</select> 

To jednak zostało zmienione w ostatnich wersjach na następujące kwestie:

<select> 
    <option value="0">Car/Bus</option> 
    <option value="1">Train</option> 
</select> 

Wybrana opcja jest następnie znormalizowana, a następnie otrzymasz oczekiwaną value ustawioną w klasie FormType. Możesz przeczytać więcej o normalizacji here.

Ponadto, jeśli napiszesz {{ debug(form.transport) }} w Symfony> = 2.6, zobaczysz formularz/tablicę pól i to, co możesz z niej użyć.

8

Spróbuj tego:

{% for key, transportItem in form.transport.children %} 
    {{ form_widget(transportItem) }} 
{% endfor %} 
+1

Chociaż ten fragment kodu może rozwiązać pytanie, [włącznie z wyjaśnieniem] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based- odpowiedzi) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – Ferrybig