表单提交后,symfony中的嵌套表单为空

时间:2018-05-25 15:14:05

标签: symfony nested-forms symfony-3.4

我有一个与symfony中的嵌套表单有关的问题。 我有这个表格

{{ form_start(form, {'attr': {'class': 'needs-validation'}} ) }}
   ....
   <div id="slot-fields-list" data-prototype="
     {% filter escape %}
        {% include 'slot/form/prototype.html.twig' with {'form': form.slot.vars.prototype} %}
     {% endfilter %}"
     data-widget-tags="{{ '<span></span>'|e }}">
   </div>
{{ form_end(form) }}

  .......................................
  ->add('slot', CollectionType::class, [
            'entry_type'        => SlotType::class,
            'entry_options'     => ['label' => false],
            'label'             => false,
            'allow_add'         => true,
            'allow_delete'      => true,
            'error_bubbling'    => false
        ])

工作正常,我在渲染模板后面有data-prototype的数据。当我提交表单时,如果表单有错误,则在提交按钮后添加此嵌套表单,data-prototype为空。有任何想法吗 ? Thx提前

1 个答案:

答案 0 :(得分:0)

documentation for CollectionType实际上相当不错,但也许某些特定细节需要重复。

首先,文档告诉您如何渲染集合项(可能是您的插槽)​​:

<ul class="tags">
    {# iterate over each existing tag and render its only field: name #}
    {% for tag in form.tags %}
        <li>{{ form_row(tag.name) }}</li>
    {% endfor %}
</ul>

这是你的案例中缺少的。为了避免混淆,他们的<ul class="tags">就是您的<div id="slot-fields-list" ...>。您必须使用

浏览form.slot
{% for slot in form.slot %}
     {{ form_row(slot) }} <!--- or render your sub-form properly -->
{% endfor %}

现在。 Symfony非常不愿意忽略表单元素。因此,当您放置{{ form_end(form) }}时,它会在关闭<form>之前将表单元素的其余部分(之前尚未呈现)呈现给您的表单。 ({{ form_rest(form) }}可以实现相同的行为,如果你需要的话)

这就是为什么你的子表单会在你的提交按钮之后出现并完全不合适的原因 - 因为它们之前没有呈现过。

然而,这还没有解释失踪的data-prototype,但也许还有一个简单的解释......

您可能已经知道form themes,您可以在其中添加自己的slot_widget,slot_row,slot_label,并让symfony为您做所有奇怪的包含内容。