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

我的 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>    

这是输出:

登录画面

我不明白的是:

1、为什么帮助文本一直可见(在输入框右侧)

帮助文本来自@elements.infos.mkString(", "). 所以删除这一行将删除帮助文本。或者您可以传递一个空字符串来禁止显示帮助文本:'_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?因为还有一个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.

我想我在这里错过了这个概念......谢谢。

4

3 回答 3

10

信息文本来自@elements.infos.mkString(", "). 要显示错误,您应该@elements.errors(elements.lang).mkString(", ")改用。

更改信息内容的正确参数会有所帮助(这有点不一致,您必须阅读源代码才能实现这一点)因此,如果您想使用内置引导字段但抑制信息,您将通过'_help -> "".

编辑#4:

以下是您应该如何调用您的特定复选框:

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

@input的,意味着有一个名为input.scala.html. 它是所有输入助手的基本模板。

要了解它为什么以及如何工作,您应该更深入地研究 Play 2.0 和 Scala(尤其是隐式参数)。

于 2012-04-18T15:03:53.587 回答
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

于 2012-04-18T15:08:12.367 回答
0

我在同一场战斗中显示错误:)现在我正在使用:

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

如果没有错误,那将被隐藏,看看这个:http: //twitter.github.com/bootstrap/components.html#labels-badges

但仍在寻找将“必需”翻译成葡萄牙语的方法。

于 2013-02-03T20:30:59.603 回答