【问题标题】:Nested forms in symfony empty after form submit表单提交后,symfony中的嵌套表单为空
【发布时间】:2018-05-25 15:14:05
【问题描述】:

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

【问题讨论】:

  • HTML5 规范不允许嵌套表单。所以你可能会在不同的浏览器中遇到奇怪的行为。
  • 顺便说一句,编辑在这两种情况下都可以正常工作:表单提交时有错误和无错误
  • 显示您的表单生成器
  • 添加到消息中

标签: symfony nested-forms symfony-3.4


【解决方案1】:

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>

这是您的情况所缺少的。为避免混淆,他们的&lt;ul class="tags"&gt; 是您的&lt;div id="slot-fields-list" ...&gt;。你必须通过form.slot

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

现在。 Symfony 非常不愿意省略表单元素。因此,当您放置{{ form_end(form) }} 时,它将在关闭&lt;form&gt; 之前将之前未渲染的其余表单元素渲染到您的表单中。 (如果您需要,{{ form_rest(form) }} 也可以实现相同的行为)

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

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

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

【讨论】:

    猜你喜欢
    • 2016-04-27
    • 2014-03-16
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多