表单验证和形式帮手(Form validation and form helper)

2019-07-29 01:16发布

我仍然与表单验证斗争,形成在播放2.0帮手。 我有我与Twitter的引导一起使用这个登录界面。 所以我的登录表单是这样的:

    @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,为什么帮助文本可见的所有TE时间(在输入域的右侧)

帮助文本来自@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?

所以,如果我想为复选框一个fieldhandler,如何使用呢? 下面的格式给我的错误:

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

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

Answer 1:

信息文本来自@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 。 这对所有输入佣工的基本模板。

要理解为什么和如何工作的,你应该更深入一点到播放2.0和Scala(尤其是隐含参数)。



Answer 2:

  1. 由于该行的<span class="help-inline">@elements.infos.mkString(", ")</span> 。 您显示有关该领域存在的信息。 删除它不显示信息。
  2. 添加以下代码:

     @if(elements.hasErrors) { <span class="help-inline">@elements.infos.mkString(", ")</span> } 
  3. 设定该类名:添加到您的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



Answer 3:

我在同一个战场,以显示我现在正在使用中的错误:):

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

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

但仍然在寻找一种方式来翻译“要求”到葡萄牙。



文章来源: Form validation and form helper