2012-04-18 5 views
18

Я все еще боюсь с помощью проверки формы и формы помощников в Play 2.0. У меня есть этот экран входа в систему, который я использую вместе с Twitter Bootstrap. Так что моя форма Войти выглядит следующим образом:Проверка формы и помощник формы

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

И мой твиттер самозагрузки поле выглядит следующим образом:

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

Это выход:

Login screen

То, что я не понимаю :

1, W гип текст справки виден все то время (на правой стороне поля ввода)

Текст справки происходит от @elements.infos.mkString(", "). Таким образом, удаление этой строки приведет к удалению текста справки. Или вы можете передать пустую строку, чтобы подавить видимый вид: '_help -> ""

2, Как показать только текст справки при возникновении ошибки?

текст справки может быть добавлен при использовании этого кода: @elements.errors(elements.lang).mkString(", ")

3, Каковы возможные параметры для передачи в текстовом поле ввода? Я хочу, чтобы передать имя класса, как хорошо, но я не знаю, как ...

я могу определить свои собственные аргументы для передачи (т.е. класса или заполнителей): class="@elements.args.get('_class), а затем я могу передать это следующим образом: '_class -> "classname"

4, Могу ли я определить более одного implicitFieldConstructors в одном шаблоне? Потому что для флажков я хочу другой fieldConstructor по сравнению с вложениями и textarea, но как это сделать?

Пример для этого: В примере компьютерной базы данных определяется полем начальной загрузки Twitter, но затем она используется следующим образом:

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

Почему имя здесь inputText и не только вход? Потому что есть также input.scala.html?

Итак, если я хочу сделать полевой манипулятор для флажка, как его использовать? Следующий формат дает мне ошибки:

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

Я получаю сообщение об ошибке:

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. 

Я думаю, мне не хватает концепции здесь ... Спасибо.

ответ

10

Информационный текст получен из @elements.infos.mkString(", "). Чтобы показать ошибки, вместо этого вы должны использовать @elements.errors(elements.lang).mkString(", ").

корректный параметр для изменения содержимого INFOS бы помощи (это немного непоследовательно, вы должны прочитать источник, чтобы понять это), так что если вы хотите использовать встроенные в бутстраповских полях, но подавляющие Infos , вы пройдете '_help -> "".

Редактировать для # 4:

Вот как вы должны назвать вашу конкретную опцию:

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

И да, @input означает, что есть шаблон называется input.scala.html. Это основной шаблон для всех входных помощников.

Чтобы понять, почему и как это работает, вы должны немного погрузиться в Play 2.0 и Scala (esp. Implicit arguments).

+0

Хорошо, имеет смысл, могу ли я также предоставить другой неявный FieldConstructor, скажем, флажок, потому что для флажка я хочу другую разметку? – adis

+0

Как создается ключ перевода? Если я хочу перевести текст «Это поле обязательно»? – adis

+0

Вы можете передать конструктор поля в поле '@ checkbox'. –

1
  1. Из-за этой линии <span class="help-inline">@elements.infos.mkString(", ")</span>. Вы показываете информацию о поле. Удалите его, чтобы не отображать информацию.
  2. Добавьте этот код:

    @if(elements.hasErrors) { 
        <span class="help-inline">@elements.infos.mkString(", ")</span> 
    } 
    
  3. Чтобы установить имя: добавьте в ваше поле Twitter Bootstrap: class="@elements.args.get('_class). И в вашей форме входа добавить параметр класса, например: @inputText(loginForm("email"), '_label -> "Email", '_class -> "classname")

Чтобы понять эту концепцию, посмотрите на исходный код: https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/views/helper/defaultFieldConstructor.scala.html

0

Я нахожусь в том же бою, чтобы показать ошибки :) сейчас я использую:

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

это будет скрыт, если нет ошибок, посмотрите на это: http://twitter.github.com/bootstrap/components.html#labels-badges

, но все еще ищет способ перевести «Требуется» на португальский язык.

Смежные вопросы