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

时间:2012-09-11 19:01:39

标签: 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>

}

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

2 个答案:

答案 0 :(得分: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>
}

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

在您的控制器中:

if(filledForm.hasErrors()){

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

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

然后在你看来有些东西:

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

正如我所提到的,不是最优雅的解决方案,但它应该会在页面顶部显示错误列表。

答案 1 :(得分:1)

我在向globalErrors添加自定义全局错误并在视图上显示它们时也遇到了问题。 我的解决方案是使用errors对象并在“global”键下添加这些全局错误。然后在视图中,我在顶部显示所有“全局”错误。

我的观点:

@for(error <- form("global").errors) {
       <p>@error.message</p>
}

我的控制器:

ValidationError error = new ValidationError("global", "User is not authorized.");
List<ValidationError> errors = new ArrayList<ValidationError>();
errors.add(error);
loginForm.errors().put("global", errors);
return badRequest(login.render(loginForm));