8

假设我想要一个带有字段的表单,电子邮件,只有在他们没有输入他们的电话号码时才需要。此外,只有当他们没有输入他们的电子邮件时才需要电话号码,我该怎么做做这个?

如果 requiredNoValid 存在,我想做这样的事情。

import play.api.data._
import play.api.data.Forms._
import play.api.data.validation.Constraints._

case class User(email: Option[String] = None, age: Option[Int])

val userForm = Form(
  mapping(
    "email" -> email.verifying(requiredNoValid(phoneNumber)),
    "phoneNumber" -> number.verifying(requiredNoValid(email))
  )(User.apply)(User.unapply)
)

我已经在 Play 1.X 中为此构建了自己的解决方案,但我想放弃其中的大部分并使用 Play 2 表单来为我执行此操作,如果功能存在或者是否有办法通过实现来做到这一点验证器或约束。

4

2 回答 2

7

您还可以添加verifying多个字段。举个简单的例子:

val userForm = Form(
  mapping(
    "email" -> optional(email),
    "phoneNumber" -> optional(number)
  ) verifying("You must provide your email or phone number.", { 
      case (e, p) => 
        isValidEmail(e) || isValidPhoneNumber(p)
  })(User.apply)(User.unapply)
)

现在在外部验证内部,您可以访问电子邮件和电话号码,并且可以进行交叉验证。

于 2012-09-20T01:39:04.413 回答
6

该解决方案适用于 Java,但我相信如果您使用 scala,您可以使用类似的方法提交并验证后,您可以获得绑定的表单数据。如果它无效,您可以使用一些错误消息拒绝该表单。例如:

//Get filled form
Form<User> filledForm = userForm.bindFromRequest();
//Get the user object
User u = filledForm.get();

//If both are not empty
if(u.phoneNumber.isEmpty() && u.email.isEmpty()){
    filledForm.reject("email", "You must provide a valid email or phone number");
} 
于 2012-09-20T15:38:37.907 回答