【发布时间】:2015-06-15 13:35:08
【问题描述】:
显示select 字段的通常方式是调用
{{ form_row(form.doctor_service_id, {'attr':{'class':'form-control'}}) }}
我想做两件事:
- 检查这个字段是否真的是一个选择字段
- 遍历每个选项(值、名称)。我知道
twig迭代器是如何工作的,我只是不知道如何访问select选项并将它们转换为它。
【问题讨论】:
显示select 字段的通常方式是调用
{{ form_row(form.doctor_service_id, {'attr':{'class':'form-control'}}) }}
我想做两件事:
twig 迭代器是如何工作的,我只是不知道如何访问 select 选项并将它们转换为它。【问题讨论】:
<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>
【讨论】:
您可以使用 twig 扩展来添加 twig 'instanceof' 运算符。如果您不熟悉创建 twig 扩展,请参阅 Symfony 文档中的 How to Write a Custom Twig Extension。有一个要点给出了Twig extension that implements an instanceof operator 的示例。然后检查一个字段是否是一个选择字段使用:
{% if value is instanceof('ChoiceType') %}
这并不像您想象的那么简单,因为选择字段有很多选项。在 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 %}
如果您不需要自定义您的选择字段的呈现,而只是想让数据用它做其他事情,那么最好的办法是将数据(映射到选择字段)传递给twig 模板连同表单并直接使用它。如果这不是一个选项,则可以像在表单主题中那样迭代选项,尽管您可能需要考虑首选选项。最简单的情况是例如
{% for choice in form.doctor_service_id.vars.choices %}
{{ choice.label }}
{{ choice.value }}
{% endfor %}
【讨论】: