Symfony2:具有数据原型的集合表单字段类型

Oha*_*has 15 php symfony

我有一个团队,我想添加玩家(玩家的对象).我已正确设置表单"类型"类.这是我的观点的相关部分:

{% for index, player in form.players %}
    <div id="template" data-prototype="{{ form_widget(form.players.get('prototype')) | e }}">
        <span class="title">{{ index }}</span>
        {{ form_row(player.name) }}
    </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我的问题是data-prototype属性不包含span标记; 它只包含输出{{ form_row(player.name) }}.有没有办法div#templatedata-prototype属性中包含整个内容?

小智 32

这也困扰着我.我定制了一个字段类型,甚至制作了简单的表单类型,减少了字段集(对于更复杂的对象),但它感觉不对.我想出了一个应该做的诀窍:)

首先 - 我认为你<div id="team" data-prototype="...">应该在你的循环之外.

接下来,您的原型只是一个表单视图对象,因此如果将其传递给模板,您可以手动渲染字段并自定义输出.注意:autoescape对包含的内容没有影响,因此请使用"过滤器转义".

<div id="playerFields" data-prototype="{% filter escape %}{% include 'AcmeTeamBundle:Team:prototypePlayer.html.twig' with {'form': form.players.get('prototype')} %}{% endfilter %}">
Run Code Online (Sandbox Code Playgroud)

然后在prototypePlayer.html.twig中,只需像往常一样在表单视图中渲染每个字段.

<div>
    <span class="title">{{ form_label(form.name) }}</span>
    {{ form_row(form.name) }}
    <span class="age">{{ form_label(form.age) }}</span>
    {{ form_row(form.age) }}
    {# render whatever else you like from your Form/PlayerType class... #}
<div>
Run Code Online (Sandbox Code Playgroud)

我的模板与您的问题有不同的数据结构,但它应该有帮助:)

干杯,

克里斯


弃用警告:

从Symfony 2.1开始,.get()不推荐使用,以上内容不起作用.更换form.players.get('prototype')form.players.vars.prototype在以后的版本中的Symfony来解决这个问题.

  • @Dean,请记住,"原型"仅用作在客户端添加新集合项的模板.渲染现有的集合项是在服务器端完成的,与原型无关.在验证失败后重新填充时,这也是有效的.只需使用您的原型模板渲染所有现有的集合项:{%for player in form.players%} {%include'AcmeTeamBundle:Team:prototypePlayer.html.twig'with {form:player.vars.form}%} { %endfor%} (5认同)