2012-04-18 67 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

但仍在尋找一種將「必需」翻譯成葡萄牙語的方法。