2012-04-18 68 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> 
    } 

我的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,W HY是帮助文本可见的所有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?

所以,如果我想为复选框做一个字段处理程序,如何使用它?下面的格式给我的错误:

@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(", ")

正确的参数来改变信息内容将是帮助(这有点不一致,你必须阅读源代码来实现这一点),所以如果你想使用内置的bootstrap字段,但抑制信息,你会通过'_help -> ""

编辑为4:

这里是你应该怎么称呼您的具体复选框:

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

是的,@input意味着有一个名为input.scala.html模板。这是所有输入助手的基本模板。要理解为什么以及如何工作,您应该深入Play 2.0和Scala(尤其是隐式参数)。

+0

好吧,更有意义,我还可以提供一个不同的隐式FieldConstructor让我们说一个复选框,因为对于复选框,我想要一个不同的标记? – adis 2012-04-18 15:05:58

+0

翻译密钥是如何构建的?如果我想翻译文本“此字段是必需的”? – adis 2012-04-18 15:08:14

+0

您可以将字段构造函数传递给'@ checkbox'。 – 2012-04-18 15:09:01

1
  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

0

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

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

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

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