2

各フィールドの上ではなく、フォームの上部にフォーム エラーをグループ化する簡単な方法はありますか?

これが私の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>

}

一意の電子メール アドレスを確認するために行っているカスタム検証があり、その検証に基づいて、グローバル エラーにエラーを追加します。追加のエラー (他のフィールドの検証の結果としてスローされる) を、フォームの上部にあるこのエラーと一緒にグループ化したいと思います。助言がありますか?

4

2 に答える 2

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>
}

前述したように、最も洗練されたソリューションではありませんが、ページの上部にエラーの大きなリストが表示されるはずです。

于 2012-09-11T20:50:19.040 に答える
1

カスタム グローバル エラーを globalErrors に追加してビューに表示する際にも問題がありました。私の解決策は、エラー オブジェクトを使用し、これらのグローバル エラーを「グローバル」キーの下に追加することです。次に、ビューの上部にすべての「グローバル」エラーを表示します。

私の見解:

@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));
于 2014-10-12T17:15:34.457 に答える