Twig中如何将Symfony表单CollectionType按ProductType值分组展示
Symfony表单CollectionType按关联属性分组渲染方案
步骤1:确认实体关联可访问
首先确保你的Product实体与ProductType实体的关联是可用的,即可以通过$product->getProductType()->getName()获取到分组用的类型名称,这个属性会在Twig中直接调用。
步骤2:Twig中实现分组渲染
方案A:使用Twig内置group过滤器(适用于Twig 3.2及以上版本)
直接用group过滤器对CollectionType的子项按ProductType名称分组,代码如下:
{# 按ProductType名称分组产品表单子项 #} {% set groupedProductForms = form.products|group(productForm => productForm.vars.data.productType.name) %} {# 遍历分组渲染 #} {% for typeName, productForms in groupedProductForms %} <h3>{{ typeName }}</h3> <div class="product-group"> {% for product in productForms %} {{ form_row(product) }} {% endfor %} </div> {% endfor %}
方案B:手动遍历分组(兼容低版本Twig)
如果你的Twig版本低于3.2没有内置group过滤器,可以手动实现分组逻辑:
{# 初始化空分组数组 #} {% set groupedProductForms = {} %} {# 遍历所有产品表单子项构建分组 #} {% for product in form.products %} {% set typeName = product.vars.data.productType.name %} {% set groupedProductForms = groupedProductForms|merge({ (typeName): groupedProductForms[typeName]|default([])|merge([product]) }) %} {% endfor %} {# 渲染逻辑和方案A一致 #} {% for typeName, productForms in groupedProductForms %} <h3>{{ typeName }}</h3> <div class="product-group"> {% for product in productForms %} {{ form_row(product) }} {% endfor %} </div> {% endfor %}
注意事项
- 如果你启用了CollectionType的
allow_add动态添加功能,新增的未提交表单原型默认没有关联的ProductType数据,你可以根据业务逻辑给新增项的模板单独加分组归类逻辑,或者将新增项统一放到「未分类」分组下。 - 渲染完成后需要调用
{{ form_rest(form) }}处理剩余未渲染的表单字段,避免CSRF令牌等隐藏字段丢失。
内容的提问来源于stack exchange,提问作者Jean luc M
相关产品推荐
相关产品推荐

