2013-01-12 11 views
10

Zunächst möchte ich feststellen, dass ich denke, dass die Play-Dokumentation für 2.0 wirklich, wirklich schlecht ist.Anzeige Fehler in Play Framework 2

Ich bin auf der Suche nach einer Möglichkeit, einen Validierungsfehler unter einem HTML-Wert zu platzieren, als würde es für ein automatisch erzeugtes Eingabefeld tun.

Ich habe versucht, die Struktur des resultierenden HTML-Codes eines Play-Eingabefeldes zu kopieren, aber ich bin mir sicher, dass mir einige ifError-Scala-Vorlagenzeilen in meinem HTML-Code fehlen.

Leider ist es nicht möglich, die Play 2.0-Dokumentation für Themen zu finden, die bereits in der Play < 2.0-Dokumentation behandelt wurden. Sie werden also auf der alten, nicht funktionierenden Dokumentation landen, wenn Sie nach einer Lösung in den Dokumenten suchen. Sehr frustrierend!

+0

Die neueste play2.1 Dokumentation ist hier http://play2-docs-snapshot.herokuapp.com/render/master/Home. Diese Dokumentation ist auf github, jeder Zweig/Tag hat seine eigene doc https://github.com/playframework/Play20/tree/master/documentation –

+4

Ja, die Dokumentation ist absolut schrecklich – SobiborTreblinka

Antwort

16

Ich benutze diesen Code eine globale Bootstrap-Alert-Box anzuzeigen mit auf dem Formular:

@if(form.hasErrors) { 
    <div class="alert alert-error"> 
     <a class="close" data-dismiss="alert">x</a> 
     @if(form.errors.size() > 0) { 
      @for((key, value) <- form.errors) { 
       @key.toString() : 
        @for(err <- value) { 
         @err.message().toString() 
        } 
      } 
     } else {No error returned.} 
    </div> 
} 

Die Ausgabe für einen Formfehler Schlüssel-Wert-Paar ist eine Bootstrap-Alert-Box mit @key.toString() : @value.message.toString.

Wenn Sie den Fehler stattdessen auf der Feldebene anzeigen möchten, möchten Sie ihn leicht mit einer anderen bedingten Anweisung für den map.errors-Mapwert ändern, sodass er nur für das bestimmte Feld ausgelöst wird. Ich habe nicht getestet, aber es würde gehen so etwas wie:

@if(form.hasErrors) { 
    @if(form.errors.size() > 0) { 
     @for((key, value) <- form.errors) { 
      @for(err <- value) { 
       @if(err.contains("YourSelectFieldName")) { 
        @err.message().toString() 
       } 
      } 
     } 
    } 
} 
+0

Sieht vielversprechend aus. Ich überprüfe und bestätige, ob es funktioniert. – schlingel

+0

Haben Sie Glück mit dem Schnipsel? – 2manyprojects

+3

In 2.1 form.errors enthält eine Seq von 'FormError' statt Tupel, aber ansonsten ist es ziemlich unverändert. – schmmd

1

Die Antwort von 2manyprojects sehr gut funktioniert, aber Sie können in der Steuerung das gleiche tun. Es hängt alles von Ihrer Vorliebe und Ihrem Stil ab.

public static Result save() { 
     Form<form> boundForm = form.bindFromRequest(); 
     if (boundForm.hasErrors()) { 
      String errorMsg = ""; 
      java.util.Map<String, List<play.data.validation.ValidationError>> errorsAll = boundForm.errors(); 
      for (String field : errorsAll.keySet()) { 
       errorMsg += field + " "; 
       for (ValidationError error : errorsAll.get(field)) { 
        errorMsg += error.message() + ", "; 
       } 
      } 
      flash("error", "Please correct the following errors: " + errorMsg); 
      return badRequest(detail.render(boundForm)); 
     } 
Verwandte Themen