我的表单中有一组隐藏字段。
<ul id="user_roles">
<li><hidden field value="role1"></li>
<li><hidden field value="role2"></li>
(...)
</ul>
我使用jQuery(和数据原型)来添加新角色。
问题是我想呈现这样的东西:
<ul id="user_roles">
<li>role1 <hidden field value="role1"></li>
<li>role2 <hidden field value="role2"></li>
(...)
</ul>
初始渲染没有问题:我只是放了:
{% for role in roles %}
<li> {{ role }} {{ form_row(role) }} </li>
{% endfor %}
但默认的数据原型将只呈现{{form_row(角色)}}(一个隐藏字段)。
我应该在哪里更改默认数据原型?
form_div_layout.html中没有我可以自定义的{%block prototype%}。。。。
收集小部件的定义如下:
{% block collection_widget %}
{% spaceless %}
{% if prototype is defined %}
{% set attr = attr|merge({'data-prototype': form_row(prototype) }) %}
{% endif %}
{{ block('form_widget') }}
{% endspaceless %}
{% endblock collection_widget %}
因此,您可以覆盖这一点,以控制如何重新构建原型。
您还可以通过调用roles.vars.prototype从模板内部访问原型,然后在JS中使用它。如果你想把它放在div的数据原型属性中(就像通常渲染的那样),你必须记住转义它:
<div data-prototype="{{ form_row(roles.vars.prototype) | escape }}">
{% for role in roles %}
<li> {{ role }} {{ form_row(role) }} </li>
{% endfor %}
</div>
文档中推荐的方法允许您在应用程序中轻松地独立定制每个集合,所有集合都在同一个文件中。
-
创建文件
prototype_layout.html.twig
:{% block _myform_mycollection_entry_row %} <div class="row"> <div class="col-sm-6">{{ form_row(form.title) }}</div> <div class="col-sm-6">{{ form_row(form.author) }}</div> </div> {% endblock %}
块的名称很重要。如果父窗体被称为MyformType
,则第一部分将为_myform
;如果拥有集合的窗体字段被如此调用,则第二部分为_mycollection
。第三部分必须始终为_entry_row
才能工作
例如,如果您有一个包含'books'
集合的UserType
表单,则块名称可能是_user_books_entry_row
要确保名称正确,请添加一个子表单(通过单击添加按钮添加带有javascript的子表单),并使用浏览器的检查器工具检查相应的select html元素的id。
如果它看起来像user_books_0_title
,那么块名称将是_user_books_entry_row
-
将此文件声明为
config.yml
:的分支部分中的全局表单主题twig: form_themes: - 'AppBundle:Form:prototype_layout.html.twig' #adapt this path if you saved your file elsewhere
-
您也可以直接在表单视图中使用该文件:
{% use "AppBundle:Form:prototype_layout.html.twig" %}