Подтвердить что ты не робот

Проверка формы и помощник формы

Я все еще боюсь с помощью проверки формы и формы помощников в 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>
    }

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

@(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. Почему текст справки отображается все время (в правой части поля ввода)

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

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

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

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

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

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

Пример для этого: В образце базы данных компьютера определяется поле загрузки бутстрапа 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.

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

4b9b3361

Ответ 1

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

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

Изменить для # 4:

Здесь, как вы должны назвать свой конкретный флажок:

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

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

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

Ответ 2

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

    @if(elements.hasErrors) {
        <span class="help-inline">@elements.infos.mkString(", ")</span> 
    }
    
  • Чтобы установить имя класса: добавьте это в поле Bootstrap Twitter: 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

Ответ 3

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

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

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

но все еще ищет способ перевести "Обязательный" на португальский.