首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Symfony 2表单中自定义数据原型属性

如何在Symfony 2表单中自定义数据原型属性
EN

Stack Overflow用户
提问于 2011-09-26 21:20:28
回答 10查看 42.1K关注 0票数 54

从十几岁开始,我就在Symfony 2和表单上遇到了一个问题。

我得到了一个网站实体的表格。“网站”是网站实体的集合,每个网站包含两个属性:"type“和"url”。

如果我想在我的数据库中添加多个网站,我可以单击“添加另一个网站”链接,这会将另一个网站行添加到我的表单中。因此,当您单击提交按钮时,您可以同时添加一个或X个网站。

此过程使用data-prototype属性添加一行,这可以生成网站的子表单。

问题是,我自定义了我的窗体,以便有一个很好的图形渲染……就像这样:

代码语言:javascript
复制
<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渲染:

代码语言:javascript
复制
<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>

有没有人有办法实现这一点?

EN

回答 10

Stack Overflow用户

发布于 2013-07-26 15:27:11

我知道这个问题很老了,但我也有同样的问题,这就是我如何解决它的。我正在使用一个树枝macro来完成这项任务。宏就像函数一样,你可以用不同的参数来呈现它们。

代码语言:javascript
复制
{% 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()只是宏的名称,您可以随心所欲地命名它。如果您想使用宏以相同的方式呈现给定项和原型,请执行以下操作:

代码语言:javascript
复制
<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中找到有关宏的更多信息

票数 48
EN

Stack Overflow用户

发布于 2012-03-03 19:55:21

你可能已经发现了,但这里是其他人的解决方案。

创建一个新模板,并将以下代码复制/粘贴到其中:https://gist.github.com/1294186

然后,在包含要自定义的表单的模板中,通过执行以下操作将其应用于表单:

代码语言:javascript
复制
{% form_theme form 'YourBundle:Deal:Theme/_field-prototype.html.twig' %}
票数 25
EN

Stack Overflow用户

发布于 2015-08-29 14:38:45

我知道这个答案来得太晚了,但它可能对访问者有用。

在您的主题文件中,您可以简单地使用一个块来呈现websites小部件的每个集合条目,如下所示:

代码语言:javascript
复制
{% 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 %}

另外,为您的集合小部件行创建主题块,如下所示:

代码语言:javascript
复制
{% 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 %}

现在原型和呈现的集合条目将是相同的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7555702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档