【问题标题】:Play 2.3 scala forms - how to customise constraint messages玩 2.3 scala forms - 如何自定义约束消息
【发布时间】:2015-12-29 08:17:06
【问题描述】:

我已经在游戏框架中创建了带有约束的表单:

val voucherForm = Form(
  mapping(
    "voucherName" -> nonEmptyText,
    "voucherCode" -> optional(text(minLength = 6).verifying(pattern("""[a-zA-Z0-9]+""".r, error = "...")))     
  )(VoucherForm.apply)(VoucherForm.unapply)
)

当我在网页上显示此表单时,我在输入框附近显示了约束消息(如RequiredMinimum length: 6, constraint.pattern)。

我想为每个输入字段自定义此约束消息(即相同形式的两个 nonEmptyText 约束将具有不同的约束消息)。我该怎么办?

【问题讨论】:

    标签: forms scala playframework constraints customization


    【解决方案1】:

    您能否不使用 nonEmptyText,而不要使用 text,并将您的自定义消息放在 verifying 中,如下所示:

    val voucherForm = Form(
      mapping(
        "voucherName" -> text.verifying(
          "Please specify a voucher name", f => f.trim!=""),
    ...
    

    【讨论】:

      【解决方案2】:

      这些消息是从消息中获取的。您可以创建自定义消息文件并将自定义文本放在那里。浏览源以检查放置在那里的有效字符串是什么。

      例如nonEmptyText声明如下:

      val nonEmptyText: Mapping[String] = text verifying Constraints.nonEmpty
      

      从那里,Constraints.nonEmpty 看起来像这样:

        def nonEmpty: Constraint[String] = Constraint[String]("constraint.required") { o =>
          if (o == null) Invalid(ValidationError("error.required")) else if (o.trim.isEmpty) Invalid(ValidationError("error.required")) else Valid
        }
      

      所以错误字符串是"error.required"

      现在你可以在 conf 目录下创建一个文件messages 并放一行

      error.required=This field is required
      

      ValidationErrorapply 方法声明如下:

      def apply(message: String, args: Any*)
      

      这意味着你也可以在那里传递参数,在messages 中你可以使用{arg_num} 语法访问它们

      例如,如果您创建了这样的错误

      val format = ???
      ValidationError("error.time", someFormat)
      

      它将以有界形式返回,然后 play 将使用 MessagesApi 查找名为“error.time”的消息并相应地对其进行格式化,例如,您可以创建这样的消息:

      error.time=Expected time format is {0}
      

      我的想法是为每个字段自定义消息是这样的自定义方法:

        def nonEmptyTextWithError(error: String): Mapping[String] = {
          Forms.text verifying Constraint[String]("constraint.required") { o =>
            if (o == null) Invalid(ValidationError(error)) else if (o.trim.isEmpty) Invalid(ValidationError(error)) else Valid
          }
        }
      

      如果您想使用许多约束孩子,这可能不是一个理想的解决方案。

      【讨论】:

      • 是的。但这将为每个具有 nonEmptyText 约束的输入框提供相同的消息。但我真正需要的是自定义每个输入框约束的 error.required 代码
      • 那么我相信您需要创建自己的约束。可能使用辅助方法,我的意思是你可以重写 nonEmptyText 但让它接受一个将被放入错误消息中的参数。
      • 嗯,一些约束嵌套得很深(例如number约束)。使用'_showConstraints -> false从模板中隐藏约束消息并添加与自定义消息类似样式的html元素会更快,也可能更干净。
      猜你喜欢
      • 2014-12-06
      • 2012-08-20
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多