Symfony4获取空数据集合的Form Collection Prototype方法咨询
嘿,这个坑我之前踩过!Symfony的CollectionType确实有个小问题——当集合里没有任何数据时,默认不会把data-prototype属性渲染到集合的容器元素上,导致AJAX拿不到原型模板。不过解决起来很简单,分两步走就行:
第一步:确保表单配置里显式开启原型(虽然默认是开的,但保险起见)
修改你的CollectionType配置,加上'prototype' => true(还可以自定义原型的占位符名称,可选):
->add('colors', CollectionType::class, [ 'entry_type' => JnTestColorColorType::class, 'entry_options' => ['label' => false], 'allow_add' => true, 'by_reference' => false, 'allow_delete' => true, 'prototype' => true, // 显式启用原型,避免隐式配置出问题 'prototype_name' => '__color_prototype__', // 可选,自定义占位符,默认是__name__ ])
第二步:在Twig模板里手动渲染原型到data-prototype
默认情况下,只有当集合至少有一个条目时,Symfony才会自动给容器加上data-prototype。所以我们要手动获取原型,然后把它放到容器的属性里,不管集合有没有数据:
{# 先获取原型对象 #} {% set colorPrototype = form.colors.vars.prototype %} {# 创建容器并手动设置data-prototype属性 #} <div id="colors-container" data-prototype="{{ form_widget(colorPrototype)|e('html_attr') }}"> {# 渲染现有的集合条目(如果有的话) #} {{ form_widget(form.colors) }} </div>
这样一来,不管你的colors集合是空的还是有数据,data-prototype都会存在,AJAX就能正常获取到原型模板了。
另外提个小细节:如果你的项目用了自定义表单主题,要确保主题里的CollectionType模板正确处理了原型,不然可能还是会出问题。不过上面的方法是绕开自动生成,直接手动处理,所以大部分情况下都能解决。
内容的提问来源于stack exchange,提问作者Lilian Masnada
相关产品推荐
相关产品推荐

