2012-04-18 22 views
18

Nadal borykam się z obsługą formularzy do sprawdzania poprawności i formularzy w wersji Play 2.0. Mam ten ekran logowania, którego używam razem z Bootstrap na Twitterze. Więc mój formularz logowania wygląda następująco:Sprawdzanie poprawności formularza i pomocnik formularzowy

@helper.form(routes.Application.authenticate, 'class -> "form-horizontal") { 
    <fieldset> 
    <legend>@Messages("login")</legend> 

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

      @inputText(loginForm("email"), '_label -> "Email") 
      @inputText(loginForm("password"), '_label -> Messages("login.password")) 


      <div class="form-actions"> 
       <button type="submit" class="btn btn-success">@Messages("button.doLogin")</button> 
       @Messages("or") 
       <a class="btn btn-warning" href="routes.LandingPage.index">@Messages("button.doCancel")</a> 
      </div>    
    </fieldset> 
    } 

A mój twitter bootstrap pole wygląda jak następuje:

@(elements: helper.FieldElements) 

@************************************************** 
* Generate input according twitter bootsrap rules * 
**************************************************@ 
<div class="control-group @if(elements.hasErrors) {error}"> 
    <label class="control-label" for="@elements.id">@elements.label</label> 
    <div class="controls"> 
     @elements.input 
     <span class="help-inline">@elements.infos.mkString(", ")</span> 
    </div> 
</div>  

To wyjście:

Login screen

Co ja nie rozumiem :

1, W hy jest tekst pomocy widoczny cały czas te (po prawej stronie pola wejściowego)

Tekst pomocy pochodzi z @elements.infos.mkString(", "). Usunięcie tego wiersza spowoduje skasowanie tekstu pomocy. Lub możesz przekazać pusty ciąg znaków, aby pominąć widoczny tekst: '_help -> ""

2, Jak wyświetlić tylko tekst pomocy, jeśli wystąpi błąd?

tekstu pomocy mogą być dodawane przy użyciu tego kodu: @elements.errors(elements.lang).mkString(", ")

3, Jakie są możliwe parametry do przekazania do pola wprowadzania tekstu? Chcę przekazać nazwę klasy, jak również, ale nie wiem jak ...

mogę określić moje własne argumenty przekazać (czyli klasę lub zastępcze): class="@elements.args.get('_class) a potem mogę przekazać to tak: '_class -> "classname"

4, Czy mogę zdefiniować więcej niż jedną implicitFieldConstructors w jednej części szablonu? Ponieważ dla pól wyboru chcę innego fieldConstructor w porównaniu do pól imput i textarea, ale jak to zrobić?

Przykład na to: W próbce komputerowe bazy bootstrap pole Twitter jest zdefiniowana, ale to jest wykorzystywane w następujący sposób:

@inputText(loginForm("email"), '_label -> "Email") 

Dlaczego to nazwa tutaj inputText a nie tylko wejście? Ponieważ istnieje również plik input.scala.html?

Tak więc, jeśli chcę zrobić pole wyboru dla pola wyboru, jak tego użyć? Następujący format daje mi błędy:

@checkBoxHandler = @{ FieldConstructor(s2ftheme.constructors.checkbox.render) } 
@checkbox(loginForm("remember"), '_label -> Messages("login.remeberme"))(handler = implicitFieldConstructor) 

otrzymuję komunikat o błędzie:

not enough arguments for method apply: (implicit handler: views.html.helper.FieldConstructor, implicit lang: play.api.i18n.Lang)play.api.templates.Html in object checkbox. Unspecified value parameter lang. 

Myślę, że jestem brakuje koncepcji tutaj ... Dzięki.

Odpowiedz

10

Tekst informacyjny pochodzi z @elements.infos.mkString(", "). Aby wyświetlić błędy, należy zamiast tego użyć @elements.errors(elements.lang).mkString(", ").

Prawidłowy parametr do zmiany treści informacje byłyby pomoc (to jest trochę niespójne, trzeba czytać źródła do realizacji tego), więc jeśli chcesz korzystać z wbudowanych pól bootstrap ale tłumią infos , minąłbyś '_help -> "".

Edit do # 4:

Oto jak należy zadzwonić do konkretnego wyboru:

@checkbox(loginForm("remember"), '_label -> Messages("login.remeberme"))(handler = implicitFieldConstructor, implicitly[Lang])

I tak, @input oznacza, że ​​nie jest to szablon nazywa input.scala.html. Jest to podstawowy szablon dla wszystkich pomocników wprowadzania.

Aby zrozumieć, dlaczego i jak to działa, powinieneś zanurkować nieco głębiej w Play 2.0 i Scala (szczególnie ukryte argumenty).

+0

Ok, ma więcej sensu, czy mogę również podać inny niejawny obiekt FieldConstructor, na przykład pole wyboru, ponieważ w przypadku tego pola wyboru potrzebuję innego znacznika? – adis

+0

Jak powstaje klucz tłumaczenia? Jeśli chcę przetłumaczyć tekst "To pole jest wymagane"? – adis

+0

Możesz przekazać konstruktor pola do '@ checkbox'. –

1
  1. Z tego powodu linia <span class="help-inline">@elements.infos.mkString(", ")</span>. Wyświetlasz informacje o tym polu. Usuń go, aby nie wyświetlać informacji.
  2. Dodaj ten kod:

    @if(elements.hasErrors) { 
        <span class="help-inline">@elements.infos.mkString(", ")</span> 
    } 
    
  3. Aby ustawić nazwę klasy: dodać do swojej dziedzinie Twitter Bootstrap: class="@elements.args.get('_class). A w formularzu logowania dodać parametr klasy, podobnie jak to: @inputText(loginForm("email"), '_label -> "Email", '_class -> "classname")

Aby zrozumieć koncepcję, przyjrzeć kodu źródłowego: https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/views/helper/defaultFieldConstructor.scala.html

0

jestem w tej samej bitwie, aby pokazać błędy :) teraz używam:

<span class="errors badge badge-important">@elements.errors.mkString(", ")</span> 

to będzie ukryta jeśli nie ma błędu, spójrz na to: http://twitter.github.com/bootstrap/components.html#labels-badges

, ale wciąż szuka sposobu na przetłumaczenie "Wymagane" na portugalski.

Powiązane problemy