【问题标题】:Symfony 2.6.3 {{ form_errors( form ) }} is blank when isValid() returns false当 isValid() 返回 false 时,Symfony 2.6.3 {{ form_errors( form ) }} 为空
【发布时间】:2015-01-25 21:25:09
【问题描述】:

我正在使用 Symfony V2.6.3

我有一个基于 Type 类的包含三个字段的简单表单。

Type 类通过setDefaultOptions() 指定的Entity 类有use Symfony\Component\Validator\Constraints as Assert; 语句。

Entity 类中的每个字段都有一个@Assert\NotBlank() 约束。

CSRF 已启用。

HTML5 验证已禁用。

如果我提交所有字段为空白的表单,则会发生以下情况:

  • 在控制器中:
    • isValid() 返回错误
    • getErrors( true ) 为每个字段返回一个错误
  • 在模板中:
    • {{ form_errors( form ) }} 不会为表单或任何字段生成文本。

我创建了一个自定义表单主题并将{% block form_errors %} 修改为 转储errors 变量。转储显示errors 属性是具有两个属性的FormErrorIterator 对象:form,我相信是字段定义,errors 是一个空数组。

奇怪的是,深入到 form 属性会发现 errors 属性是一个数组,其中包含一个包含错误消息的 FormError 对象。

这不是我第一次使用表单。过去它对我来说效果很好。这可能是 2.6 中的新错误吗?

我已经搜索过这个,我发现的只是getErrors() 也没有返回任何内容的情况。

提前致谢, 戴夫

【问题讨论】:

  • 也许你已经为这些字段禁用了error_bubblingform_errors 仅显示整个表单的错误或冒泡错误。
  • @sjagr 打败了我。 'error_bubbling' 默认为 false,因为标准约定是让每个字段处理它自己的错误。
  • @DerickF 正确,您要么必须在各个字段上使用 form_errors,为每个字段打开 error_bubbling,要么对整个表单或整个表单使用完整的 form_widget个别领域。不是form_labelform_row

标签: forms symfony


【解决方案1】:

好的。我终于找到了这个问题的答案。

非常感谢 Symfony 论坛上的 thenetimp。他遇到了同样的问题并解决了(http://forum.symfony-project.org/viewtopic.php?f=23&t=42841&p=135003&hilit=form_errors#p135003)。

原来你必须在调用isValid()之后调用createView()。仔细想想,这实际上是有道理的。

【讨论】:

    【解决方案2】:

    表单错误绑定到 FormType,而不是完整的表单。 RootType 将仅包含从子类型冒出的错误。子类型将仅包含其类型的错误以及从子子类型冒出的错误等。

    {{ form_errors(form) }} 只会渲染根表单的错误。假设 form.name 字段有错误,您可以通过执行以下操作得到此错误:{{ form_errors(form.name) }}

    【讨论】:

    • 感谢您的快速回复。表单冒泡确实关闭了,我正在查看各个字段的错误。正如我所说,调用 $form->getErrors( true ) (返回子错误)会产生错误文本。它只是在表单中不可用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多