2015-06-15 3 views
5

Обычного способ отображения select поля является вызовомSymfony2/Twig - перебрать выбор опций

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

Я хотел бы выполнить две вещи:

  1. Проверьте, если это поле фактически поле выбора
  2. Итерации над каждой опцией (значение, имя). Я знаю, как работает итератор twig, я просто не знаю, как получить доступ к параметрам select и передать их ему.

ответ

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. Вы можете использовать расширение прут, чтобы добавить веточку «InstanceOf» оператора. Если вы не знакомы с созданием расширений twig, см. How to Write a Custom Twig Extension в документах Symfony. Существует сущность, которая дает пример Twig extension that implements an instanceof operator. Затем, чтобы проверить, если поле является использование выберите поле:

    {% if value is instanceof('ChoiceType') %} 
    
  2. Это не так просто, как вы могли бы подумать, потому что выбор поле имеет так много вариантов. С Symfony это тема формы, которая определяет, как различные типы полей отображаются в html. Тема формы по умолчанию - form_div_layout.html.twig. Требуется около 50 строк кода для отображения поля выбора с учетом всех опций, охватываемых блоками choice_widget, choice_widget_expanded, choice_widget_collapsed and choice_widget_options. Вы можете выбрать нужные вам биты на основе параметров, которые вы задали для своего поля выбора, и вставить их в свой шаблон ветви, но тогда установка вариантов выбора в классе формы не повлияет. Правильный способ персонализации сделать ваши варианты выбора (* при условии, что выбор не расширяется) заключается в том, чтобы переопределить блок choice_widget_options из темы формы. Form Customization - это тема сама по себе, но самый простой подход заключается в том, чтобы переопределить блок как одноразовый шаблон вашей ветки и затем изменить его для удовлетворения ваших потребностей, например.

    {% 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 %} 
    

Если вам не нужно, чтобы настроить отображение вашего выбора поля, но просто хотят, чтобы получить данные, чтобы сделать что-то еще с ним, тем лучшим, что нужно сделать, это передать данные (т.е. отображается в поле выбора) на шаблон ветви вместе с формой и использовать ее напрямую. Если это не вариант, можно повторить выбор, как в теме формы, хотя вам может потребоваться учитывать предпочтительные варианты. Простейшим случаем является, например,

{% for choice in form.doctor_service_id.vars.choices %} 
    {{ choice.label }} 
    {{ choice.value }} 
{% endfor %} 
Смежные вопросы