Symfony2 / Twig - 迭代选择选项

时间:2015-06-15 13:35:08

标签: php symfony twig

显示select字段的常用方法是调用

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

我想做两件事:

  1. 检查此字段是否实际上是一个选择字段
  2. 迭代每个选项(值,名称)。我知道twig迭代器是如何工作的,我只是不知道如何访问select选项并将它们转换为它。

2 个答案:

答案 0 :(得分:16)

<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>

答案 1 :(得分:2)

  1. 您可以使用树枝扩展名添加树枝'instanceof'运算符。如果您不熟悉创建树枝扩展,请参阅Symfony文档中的How to Write a Custom Twig Extension。有一个要点给出Twig extension that implements an instanceof operator的例子。然后检查字段是否为选择字段使用:

      {% if value is instanceof('ChoiceType') %}
    
  2. 这并不像您想象的那么简单,因为选择字段有很多选项。使用Symfony,表单主题决定了各种字段类型如何呈现为html。默认表单主题位于form_div_layout.html.twig。考虑到块choice_widget, choice_widget_expanded, choice_widget_collapsed and choice_widget_options所涵盖的所有选项,需要大约50行代码来呈现选择字段。您可以根据为选择字段设置的选项选择所需的位,然后将它们粘贴到树枝模板中,但在表单类中设置选项选项不会产生任何影响。自定义渲染选择选项的正确方法(*假设未展开选择)是覆盖表单主题中的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 %}
    
  3. 如果您不需要自定义选择字段的呈现,但只是想让数据用它做其他事情,那么最好的办法就是将数据(映射到选择字段)传递给树枝模板以及表单并直接使用它。如果这不是一个选项,则可以在表单主题中迭代选择,尽管您可能需要考虑首选选项。最简单的情况就是例如。

    {% for choice in form.doctor_service_id.vars.choices %}
        {{ choice.label }}
        {{ choice.value }}
    {% endfor %}