首页 > 解决方案 > 表单提交后,symfony中的嵌套表单为空

问题描述

我有一个与 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为空。有任何想法吗 ?提前谢谢

标签: symfonynested-formssymfony-3.4

解决方案


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.slotwith

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

现在。Symfony 非常不愿意省略表单元素。因此,当您放置 a{{ form_end(form) }}时,它将在关闭<form>. {{ form_rest(form) }}(如果您需要,可以通过 实现相同的行为)

这就是为什么您的子表单将出现在您的提交按钮之后并且完全不合适的原因 - 因为它们之前没有在任何地方呈现。

但是,这还不能解释缺失data-prototype,但也许还有一个简单的解释......

您可能已经了解表单主题,您可以在其中添加自己的 slot_widget、slot_row、slot_label 并让 symfony 为您完成所有奇怪的包含内容。


推荐阅读