仅显示来自 CollectionType 的错误表单项

Display only form item from a CollectionType with error

在 symfony 4.3 项目中,我有一个表单,其中一个表单元素的 CollectionType 为 lineItems。表格有效,完成验证。问题是我可能有几十个 lineItem 子表单,所以如果一个 lineItem 验证失败我希望能够只向用户显示失败的项目(并隐藏其他的) .问题是我不知道如何识别哪个 lineItem 失败了,所以我只能渲染它(连同它的错误消息)。

我的代码被缩写以仅显示重要部分。

主要形式:

class TreatmentFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('lineItems', CollectionType::class, [
                'entry_type' => LineItemFormType::class,
                'label' => 'Item',
                'by_reference' => false,
                'allow_add' => true,
                'allow_delete' => true,
                'error_bubbling' => false,
            ])
            // other items omitted
            ;
    }
}

我的子表单:

class LineItemFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('item')
            ->add('quantity')
            ->add('itemType');
    }
}

和我想访问个别错误的 twig 文件:

<div data-prototype="{{ form_widget(form.lineItems.vars.prototype)|e('html_attr') }}">
    {% if form.vars.valid %}
        // display data; code not shown
    {% else %}
        {% for line in form.lineItems %}
            // WHAT TO PUT HERE TO IDENTIFY ONLY THE FIELD WITH THE ERROR?
        {% endfor %}
    {% endif %}
</div>

我确实知道当我提交表单并更正所有字段都必须呈现的错误时,但我并不担心那部分,我只是不知道如何提取 lineItem 验证失败。我已经尝试了很多变体,例如 line.vars.errors,但没有任何东西让我找到一个失败的元素。

尝试检查每个字段的 line.{field_name}.vars.errors 是否为空,然后呈现您需要的内容。

{% for line in form.lineItems %}
    {% if (line.item.vars.errors is not empty) or (line.quantity.vars.errors is not empty) or (line.itemType.vars.errors is not empty) %}
      {{ form_row(line.item) }}
      {{ form_row(line.quantity) }}
      {{ form_row(line.itemType) }}
    {% endif %}
{% endfor %}

或者检查 line.vars.valid 是否为假。我的印象是这只存在于父表单中,但我不确定。

https://symfony.com/doc/current/form/form_customization.html