You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:35