Symfony 3.4 Collection Prototype自定义失败求助
解决Symfony 3.4 Collection Prototype自定义失效的问题
我帮你排查出两个核心问题,正是它们引发了当前的错误:
1. 自定义Form Block的命名不符合Symfony规则
Symfony对表单主题的block命名有严格要求,针对Collection字段的entry widget,正确的命名格式是_[父表单类型名称]_[集合字段名]_entry_widget。
你的父表单是AssignmentType,Symfony默认会将其名称解析为assignment(去掉类名末尾的Type并转小写),而集合字段名是units,所以正确的block名称应该是_assignment_units_entry_widget,而非你当前使用的_units_entry_widget。
错误的命名会导致Symfony无法正确匹配到units字段的entry模板,渲染prototype时上下文错乱——此时form变量指向的是整个Assignment的FormView,而非Unit的FormView,自然找不到name属性。
2. 模板字段名与FormType定义不匹配
你的UnitType里定义的字段是quantity,但在模板的循环和自定义block中,你错误使用了pieces:
- 循环部分:
{{ form_row(unit.pieces) }} - 自定义block部分:
{{ form_row(form.pieces) }}
这会导致后续渲染时同样触发属性不存在的错误,需要统一修改为quantity。
修改后的完整模板代码
调整后的模板如下:
<div class="row"> <div class="col"> {{ form_label(form.units) }} <table class="table table-bordered table-light collection-form-wrapper"> <thead> <tr> <th>Bez.</th> <th>Stück</th> <th>Gewicht</th> <th>Breite</th> <th>Höhe</th> <th>Tiefe</th> <th></th> </tr> </thead> <tbody> {% for unit in form.units %} <tr> <td>{{ form_row(unit.name) }}</td> <td>{{ form_row(unit.quantity) }}</td> <td>{{ form_row(unit.weight) }}</td> <td>{{ form_row(unit.width) }}</td> <td>{{ form_row(unit.height) }}</td> <td>{{ form_row(unit.depth) }}</td> <td> <a href="#" class="btn btn-danger btn-sm btn-delete" data-id="{{ loop.index }}"><i class="fa fa-trash"></i></a> </td> </tr> {% else %} <tr> <td colspan="7" class="text-center"> <div class="p2"> <i> <small>Noch keine Einträge vorhanden</small> </i> </div> </td> </tr> {% endfor %} </tbody> <tfoot> <tr> <td colspan="7"> <a href="#" class="btn btn-primary btn-sm" id="add-item"><i class="fa fa-plus"></i> Hinzufügen</a> <a href="#" class="btn btn-danger btn-sm" id="delete-all"><i class="fa fa-trash"></i> Tabelle leeren</a> </td> </tr> </tfoot> </table> </div> </div> {% form_theme form _self %} {% block _assignment_units_entry_widget %} <tr> <td>{{ form_row(form.name) }}</td> <td>{{ form_row(form.quantity) }}</td> <td>{{ form_row(form.weight) }}</td> <td>{{ form_row(form.width) }}</td> <td>{{ form_row(form.height) }}</td> <td>{{ form_row(form.depth) }}</td> <td> <a href="#" class="btn btn-danger btn-sm btn-delete"><i class="fa fa-trash"></i></a> </td> </tr> {% endblock %}
验证block名称的小技巧
如果不确定正确的block名称,可以在模板中临时添加{{ dump(form.units.vars.prototype.vars.block_prefixes) }},它会输出该prototype对应的所有block前缀,最末尾的项就是你需要使用的block名称(记得添加下划线前缀)。
内容的提问来源于stack exchange,提问作者user4144415
相关产品推荐
相关产品推荐

