2015-06-15 11 views
5

zwykły sposób wyświetlania select pole jest wywołanieSymfony2/Gałązka - iteracyjne nad wybranymi opcjami

{{ form_row(form.doctor_service_id, {'attr':{'class':'form-control'}}) }} 

Chciałbym wykonać dwie rzeczy:

  1. Sprawdź, czy to pole jest faktycznie wybierz pole
  2. Powtórz poszczególne opcje (wartość, nazwa). Wiem, jak działa iterator twig, po prostu nie wiem, jak uzyskać dostęp do opcji select i przesyłać je do niego.

Odpowiedz

12
<select name="country"data-width="100%"> 
    {% for key,val in form.country.vars.choices %} 
     <option value="{{ val.value }}" {{ form.country.vars.value == '' and key == 0 ? ' selected ' :(val.value == form.country.vars.value ? ' selected ' : '') }}>{{ val.label | trans }}</option> 
    {% endfor %} 
</select> 
2
  1. Można użyć rozszerzenia gałązka dodać gałązkę '' instanceof operator. Jeśli nie znasz się na tworzeniu rozszerzeń gałązek, zobacz How to Write a Custom Twig Extension w dokumentach Symfony. Istnieje istota, która daje przykład Twig extension that implements an instanceof operator. Następnie sprawdzić, czy pole jest użycie pola select:

    {% if value is instanceof('ChoiceType') %} 
    
  2. To nie jest tak proste, jak mogłoby się wydawać, ponieważ pola wyboru mają tak wiele opcji. Z Symfony to motyw formularza określa, w jaki sposób różne typy pól są renderowane do HTML. Domyślny motyw formularza to form_div_layout.html.twig. Do renderowania pola wyboru uwzględniającego wszystkie opcje, objętego blokami choice_widget, choice_widget_expanded, choice_widget_collapsed and choice_widget_options, potrzeba około 50 linii kodu. Możesz wybrać potrzebne ci bity na podstawie opcji ustawionych dla pola wyboru i wkleić je do szablonu twig, ale ustawienie opcji wyboru w klasie formularza nie będzie miało żadnego wpływu. Poprawny sposób niestandardowego renderowania opcji wyboru (* zakładając, że wybór nie został rozwinięty) ma zastąpić blok choice_widget_options z motywu formularza. Form Customization to temat sam w sobie, ale najprostszym rozwiązaniem jest zastąpienie bloku jako jednorazowego w szablonie twig, a następnie zmodyfikowanie go w celu spełnienia potrzeb, np.

    {% extends '::base.html.twig' %} 
    
    {% form_theme form _self %} 
    
    {%- block choice_widget_options -%} 
        {% for group_label, choice in options %} 
         {%- if choice is iterable -%} 
          <optgroup label="{{ choice_translation_domain is sameas(false) ? group_label : group_label|trans({}, choice_translation_domain) }}"> 
           {% set options = choice %} 
           {{- block('choice_widget_options') -}} 
          </optgroup> 
         {%- else -%} 
          {% set attr = choice.attr %} 
          <option value="{{ choice.value }}" {{ block('attributes') }}{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice_translation_domain is sameas(false) ? choice.label : choice.label|trans({}, choice_translation_domain) }}</option> 
         {%- endif -%} 
        {% endfor %} 
    {%- endblock choice_widget_options -%} 
    
    {% block content %} 
        {# ... render the form #} 
    
        {{ form_row(form.doctor_service_id, {'attr':{'class':'form-control'}}) }} 
    {% endblock %} 
    

Jeśli nie trzeba dostosować świadczenia danej dziedzinie wyboru, ale po prostu chce uzyskać dane zrobić coś innego z nim wtedy najlepszą rzeczą do zrobienia jest przekazać dane (czyli zmapowany do pola wyboru) do szablonu gałązki wraz z formularzem i użyć go bezpośrednio. Jeśli nie jest to możliwe, możliwe jest powtórzenie wyboru, tak jak w motywie formularza, chociaż może być konieczne uwzględnienie preferowanych wyborów. Najprostszym przypadkiem byłby np.

{% for choice in form.doctor_service_id.vars.choices %} 
    {{ choice.label }} 
    {{ choice.value }} 
{% endfor %} 
Powiązane problemy