在Play中分组表单错误!骨架

Luk*_*uke 2 playframework

是否有一种简单的方法可以在表单顶部对表单错误进行分组,而不是在每个字段上方?

这是我的Scala模板:

@(registrationForm: Form[User])

@implicitField = @{ FieldConstructor(views.html.helper.twitterBootstrap2.twitterBootstrap2FieldConstructor.f) }

@import helper._

@helper.form(action = routes.Registration.index) {

    <fieldset>

        @if(registrationForm.hasGlobalErrors) { 
            <div class="alert alert-error">
            <a class="close" data-dismiss="alert">×</a>
                @registrationForm.globalError.message
            </div>
        }

        <legend>Register</legend>

        @inputText(
            registrationForm("firstName"),
            '_label -> "First Name",
            '_showConstraints -> false,
            '_showErrors -> true,
            '_error -> registrationForm.error("firstName")
        )

        @inputText(
            registrationForm("lastName"),
            '_label -> "Last Name",
            '_showConstraints -> false,
            '_showErrors -> true,
            '_error -> registrationForm.error("lastName")
        )

        @inputText(
            registrationForm("emailAddress"),
            '_label -> "Email Address",
            '_showConstraints -> false,
            '_showErrors -> true,
            '_error -> registrationForm.error("emailAddress")
        )

        @inputPassword(
            registrationForm("password"),
            '_label -> "Password",
            '_showConstraints -> false,
            '_showErrors -> true,
            '_error -> registrationForm.error("password")
        )

        @inputPassword(
            registrationForm("password"),
            '_label -> "Confirm Password",
            '_showConstraints -> false,
            '_showErrors -> true,
            '_error -> registrationForm.error("password")
        )

    </fieldset>

    <button type="submit" class="btn">Register</button>

}
Run Code Online (Sandbox Code Playgroud)

我有一个自定义验证,我正在检查唯一的电子邮件地址,并根据该验证,我添加错误的全局错误.我希望在表单顶部将此错误与任何其他错误(由于其他字段的验证而引发)相混淆.有什么建议?

Jef*_*oie 5

在你的@if(registrationForm.hasGlobalErrors){总是可以尝试调用registrationForm.globalErrors以获取所有错误的列表,遍历它,并为每个错误输出消息?

例:

@if(registrationForm.hasGlobalErrors){
    <div class="alert alert-error">
         @for(validationError <- registrationForm.globalErrors){
              <a class="close" data-dismiss="alert">×</a>
              @validationError.message
         }
    </div>
}
Run Code Online (Sandbox Code Playgroud)

编辑:根据以下评论的请求,我正在更新我的答案,包括一个替代方法,用于分组自定义验证消息,这可能不是"最佳"解决方案,但应该完成.

在你的控制器中:

if(filledForm.hasErrors()){

       for(String key : filledForm.errors().keySet()){
           List<ValidationError> currentError = filledForm.errors().get(key);
           for(ValidationError error : currentError){
               flash(key, error.message());
           }
       }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用迭代器,无论您喜欢哪个.

然后在你看来有些东西:

@if(flash.size() > 0){
    <div class="alert-alert error">
        @for((key, value) <- flash){
            <strong>Error : </strong> @value<br />
        }
    </div>
}
Run Code Online (Sandbox Code Playgroud)

就像我提到的,不是最优雅的解决方案,但它应该在页面顶部找到一个很大的错误列表.