我想要一个<select>
要使用其上的附加数据呈现的元素<option>
s。举例来说,我想要一个服务选择器(非多个实体字段),它可以在选择更改时重置另一个输入值。我对使用 JS 数据结构不感兴趣,我需要渲染字段如下所示:
<select name="...">
<option value="1" data-price="90">Service 1</option>
<option value="2" data-price="40">Service 2</option>
</select>
我会采取两种不同的解决方案,并且很高兴看到这两种解决方案的答案。
- 我将通过使用以下代码开始组装上述 HTML 代码,在 Twig 中手动渲染该字段
form
我传递给树枝的变量。我有两个问题要解决这个问题。A)我找不到一种安全的方法来告诉该文件应该命名什么,即如何获得name
Symfony 期望使用变量的属性form.service
(service 是 FormType 中字段的名称)。 [请原谅我根据观察字段的方式连接一些值的技巧现在由 Symfony 命名;人们应该依赖接口而不是逆向工程。]B)我不知道如何访问选择列表,即由entity
场的query_builder
选项。 [由于我正在寻找通用解决方案,因此我不愿意将这些项目复制到控制器中的树枝参数 - 只是为了避免此类建议。]
- 我会按照食谱的表单样式章节中的建议覆盖相关字段块的渲染,但这样做存在三个问题。A)我无法找出应该覆盖哪些块(因此我没有找到示例)。B)我会将参数从表单生成器传递到块,以使其知道额外的内容
data-
属性要渲染,但我不知道该怎么做。最后C)在那些我不需要偏离标准渲染的情况下(例如,当字段是多个时),我不知道如何回退到默认渲染。
所以这些实际上是 5 个问题(1A、1B、2A、2B、2C),但我认为它们对于其他一起回答的人来说更有用,因为它们都解决了我认为关于选择字段渲染的未记录的问题。
1.手动渲染。如果是现场的单独表格并且不在某处重复,则更好,因为它需要更少的工作时间。
A)获取您可以使用的字段名称form.service.vars.full_name
B)选择列表 -form.service.vars.choices
。它是一个数组ChoiceView
,要让实体简单地访问公共data
财产。
{% for choice in form.service.vars.choices %}
{% set service_entity = choice.data %}
{% endfor %}
2.通过覆盖模板。如果您喜欢暴力破解,请选择必须覆盖的块的名称。
A)你只能覆盖widget
, label
and errors
块为文档 http://symfony.com/doc/current/book/forms.html#form-fragment-naming说。您可以通过小部件名称指定块(文档 http://symfony.com/doc/current/cookbook/form/form_customization.html#how-to-customize-an-individual-field)。就像是
{% block _form_service_widget %}
{% if expanded %}
{{ block('choice_widget_expanded') }}
{% else %}
{{ block('my_service_widget') }}
{% endif %}
{% endblock %}
{% block my_service_widget %}
{% spaceless %}
<select {{ block('widget_attributes') }}{% if multiple %} multiple="multiple"{% endif %}>
{% if empty_value is not none %}
<option value="">{{ empty_value|trans({}, translation_domain) }}</option>
{% endif %}
{% set options = choices %}
{{ block('my_service_options') }}
</select>
{% endspaceless %}
{% endblock my_service_widget %}
{% block my_service_options %}
{% spaceless %}
{% for group_label, choice in options %}
{# here you can access choice #}
<option value="{{ choice.value }}"{% if choice is selectedchoice(value) %} selected="selected"{% endif %}>{{ choice.label|trans({}, translation_domain) }}</option>
{% endfor %}
{% endspaceless %}
{% endblock my_service_options %}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)