从十几岁开始,我就在Symfony 2和表单上遇到了一个问题。
我得到了一个网站实体的表格。“网站”是网站实体的集合,每个网站包含两个属性:"type“和"url”。
如果我想在我的数据库中添加多个网站,我可以单击“添加另一个网站”链接,这会将另一个网站行添加到我的表单中。因此,当您单击提交按钮时,您可以同时添加一个或X个网站。
此过程使用data-prototype属性添加一行,这可以生成网站的子表单。
问题是,我自定义了我的窗体,以便有一个很好的图形渲染……就像这样:
<div class="informations_widget">{{ form_widget(website.type.code) }}</div>
<div class="informations_error">{{ form_errors(website.type) }}</div>
<div class="informations_widget">{{ form_widget(website.url) }}</div>
<div class="informations_error">{{ form_errors(website.url) }}</div>
但是数据原型并不关心这种定制,它使用HTML和CSS标签&属性。我保留Symfony渲染:
<div>
<label class=" required">$$name$$</label>
<div id="jobcast_profilebundle_websitestype_websites_$$name$$">
<div>
<label class=" required">Type</label>
<div id="jobcast_profilebundle_websitestype_websites_$$name$$_type">
<div>
<label for="jobcast_profilebundle_websitestype_websites_$$name$$_type_code" class=" required">label</label>
<select id="jobcast_profilebundle_websitestype_websites_$$name$$_type_code" name="jobcast_profilebundle_websitestype[websites][$$name$$][type][code]" required="required">
<option value="WEB-OTHER">Autre</option>
<option value="WEB-RSS">Flux RSS</option>
...
</select>
</div>
</div>
</div>
<div>
<label for="jobcast_profilebundle_websitestype_websites_$$name$$_url" class=" required">Adresse</label>
<input type="url" id="jobcast_profilebundle_websitestype_websites_$$name$$_url" name="jobcast_profilebundle_websitestype[websites][$$name$$][url]" required="required" value="" />
</div>
</div>
</div>
有没有人有办法实现这一点?
发布于 2013-07-26 15:27:11
我知道这个问题很老了,但我也有同样的问题,这就是我如何解决它的。我正在使用一个树枝macro
来完成这项任务。宏就像函数一样,你可以用不同的参数来呈现它们。
{% macro information_prototype(website) %}
<div class="informations_widget">{{ form_widget(website.type.code) }}</div>
<div class="informations_error">{{ form_errors(website.type) }}</div>
<div class="informations_widget">{{ form_widget(website.url) }}</div>
<div class="informations_error">{{ form_errors(website.url) }}</div>
{% endmacro %}
现在,您可以随心所欲地呈现此宏。请注意,information_prototype()
只是宏的名称,您可以随心所欲地命名它。如果您想使用宏以相同的方式呈现给定项和原型,请执行以下操作:
<div class="collection" data-prototype="{{ _self.information_prototype(form.websites.vars.prototype)|e }}">
{% for website in form.websites %}
{{ _self.information_prototype(website) }}
{% endfor %}
<button class="add-collection">Add Information</button>
</div>
form.websites.vars.prototype
使用您指定的prototype_name
保存表单的原型数据。如果要在同一模板中使用宏,请使用_self.+macroname
。
您可以在Twig documentation中找到有关宏的更多信息
发布于 2012-03-03 19:55:21
你可能已经发现了,但这里是其他人的解决方案。
创建一个新模板,并将以下代码复制/粘贴到其中:https://gist.github.com/1294186
然后,在包含要自定义的表单的模板中,通过执行以下操作将其应用于表单:
{% form_theme form 'YourBundle:Deal:Theme/_field-prototype.html.twig' %}
发布于 2015-08-29 14:38:45
我知道这个答案来得太晚了,但它可能对访问者有用。
在您的主题文件中,您可以简单地使用一个块来呈现websites小部件的每个集合条目,如下所示:
{% block _jobcast_profilebundle_websitestype_websites_entry_widget %}
<div class="informations_widget">{{ form_widget(form.type.code) }}</div>
<div class="informations_error">{{ form_errors(form.type) }}</div>
<div class="informations_widget">{{ form_widget(form.url) }}</div>
<div class="informations_error">{{ form_errors(form.url) }}</div>
{% endblock %}
另外,为您的集合小部件行创建主题块,如下所示:
{% block _quiz_question_answers_row %}
{% if prototype is defined %}
{%- set attr = attr | merge({'data-prototype': form_row(prototype) }) -%}
{% endif %}
{{ form_errors(form) }}
{% for child in form %}
{{ form_row(child) }}
{% endfor %}
{% endblock %}
现在原型和呈现的集合条目将是相同的。
https://stackoverflow.com/questions/7555702
复制相似问题