2012-04-18 18 views
18

Todavía tengo problemas con la validación de formulario y los ayudantes de formulario en Play 2.0. Tengo esta pantalla de inicio de sesión que uso junto con Twitter Bootstrap. Así que mi formulario de acceso es el siguiente:Formulario de validación y ayudante de formulario

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

Y mi Twitter bootstrap campo se parece siguientes:

@(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>  

Ésta es la salida:

Login screen

Lo que no entiendo :

1, W HY es el texto de ayuda visibles todo el tiempo te (en el lado derecho del campo de entrada)

El texto de ayuda proviene de @elements.infos.mkString(", "). Así que borrar esta línea eliminará el texto de ayuda. O puede pasar una cadena vacía para suprimir el texto de ayuda siendo visible: '_help -> ""

2, ¿Cómo se muestra solo el texto de ayuda si se produce un error?

texto de ayuda puede ser añadido al utilizar este código: @elements.errors(elements.lang).mkString(", ")

3, ¿Cuáles son los posibles parámetros para pasar a un campo de texto? Quiero pasar el nombre de la clase, así, pero no sé cómo ...

puedo definir mis argumentos personalizados para pasar (es decir, la clase o marcadores de posición): class="@elements.args.get('_class) y entonces puede pasar de esta manera: '_class -> "classname"

4, ¿Puedo definir más de un implicitFieldConstructors en una sola parte de la plantilla? Porque para las casillas de verificación quiero otro fieldConstructor en comparación con las casillas de entrada y el área de texto, pero ¿cómo hacer esto?

Ejemplo de esto: En la muestra-base de datos informática se define un campo de arranque Twitter, pero luego se utiliza de la siguiente manera:

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

¿Por qué es el nombre aquí inputText y no sólo de entrada? Porque también hay un input.scala.html?

Entonces, si quiero hacer un manipulador de campo para la casilla de verificación, ¿cómo usar esto? El siguiente formato es que me da errores:

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

me sale el mensaje de error:

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. 

Creo que me falta el concepto aquí ... Gracias .

Respuesta

10

El texto de información proviene de @elements.infos.mkString(", "). Para mostrar los errores, debe usar @elements.errors(elements.lang).mkString(", ") en su lugar.

El parámetro correcto para cambiar el contenido de informaciones sería ayuda (esto es un poco inconsistente, usted tiene que leer la fuente para darse cuenta de esto) por lo que si desea utilizar el incorporado en los campos de arranque, pero suprimir las infos , pasaría '_help -> "".

Editar para # 4:

Así es como debe llamar a su casilla específica:

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

Y sí, @input significa que hay una plantilla llamada input.scala.html. Es la plantilla básica para todos los ayudantes de entrada.

Para entender por qué y cómo funciona esto, debe profundizar un poco más en Play 2.0 y Scala (especialmente argumentos implícitos).

+0

Ok, tiene más sentido, ¿puedo también proporcionar un FieldConstructor implícito diferente para, por ejemplo, una casilla de verificación, porque para la casilla de verificación quiero un marcado diferente? – adis

+0

¿Cómo se construye la clave de traducción? Si quiero traducir el texto "Este campo es obligatorio" – adis

+0

Puede pasar el constructor de campo al '@ checkbox'. –

1
  1. Debido a esta línea <span class="help-inline">@elements.infos.mkString(", ")</span>. Está mostrando la información sobre el campo allí. Eliminarlo para no mostrar la información.
  2. añadir este código:

    @if(elements.hasErrors) { 
        <span class="help-inline">@elements.infos.mkString(", ")</span> 
    } 
    
  3. Para establecer el nombre de clase: Agregar a su campo de Twitter Bootstrap: class="@elements.args.get('_class). Y en su forma de la conexión agregar el parámetro de clase, así: @inputText(loginForm("email"), '_label -> "Email", '_class -> "classname")

Para entender el concepto, tomar un vistazo al código fuente: https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/views/helper/defaultFieldConstructor.scala.html

0

estoy en la misma batalla para mostrar los errores :) por ahora estoy usando:

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

que serían oculta si no hay error, echar un vistazo a esto: http://twitter.github.com/bootstrap/components.html#labels-badges

pero aún está buscando una forma de traducir "Requerido" al portugués.

Cuestiones relacionadas