2012-04-18 46 views
18

Tôi vẫn đang vật lộn với việc xác thực biểu mẫu và người trợ giúp biểu mẫu trong Play 2.0. Tôi có màn hình đăng nhập mà tôi sử dụng cùng với Twitter Bootstrap. Vì vậy, hình thức đăng nhập của tôi trông như thế này:Xác thực biểu mẫu và trợ giúp biểu mẫu

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

Và twitter của tôi bootstrap lĩnh vực trông giống như sau:

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

Đây là kết quả:

Login screen

Những gì tôi không hiểu :

1, W hy là văn bản trợ giúp hiển thị tất cả thời gian te (ở bên phải của trường nhập)

Văn bản trợ giúp đến từ @elements.infos.mkString(", "). Vì vậy, xóa dòng này sẽ xóa văn bản trợ giúp. Hoặc bạn có thể chuyển một chuỗi trống để ngăn chặn văn bản trợ giúp hiển thị: '_help -> ""

2, Cách chỉ hiển thị văn bản trợ giúp nếu xảy ra lỗi?

Trợ giúp văn bản có thể được bổ sung khi sử dụng mã này: @elements.errors(elements.lang).mkString(", ")

3, các thông số có thể vượt qua một trường nhập văn bản là gì? Tôi cũng muốn chuyển tên lớp, nhưng tôi không biết cách làm ...

Tôi có thể xác định đối số tùy chỉnh của mình để chuyển (tức là lớp hoặc trình giữ chỗ): class="@elements.args.get('_class) và sau đó tôi có thể chuyển nó như sau: '_class -> "classname"

4, Tôi có thể xác định nhiều hơn một implicitFieldConstructors trong một phần của mẫu không? Bởi vì đối với các hộp kiểm tôi muốn có một fieldConstructor khác so với các hộp và textarea, nhưng làm thế nào để làm điều này?

Ví dụ cho điều này: Trong mẫu máy tính cơ sở dữ liệu một lĩnh vực bootstrap Twitter được định nghĩa, nhưng sau đó nó được sử dụng như sau:

@inputText(loginForm("email"), '_label -> "Email") 

Tại sao là tên ở đây inputText và không chỉ đầu vào? Bởi vì cũng có một input.scala.html?

Vì vậy, nếu tôi muốn tạo một trình xử lý trường cho hộp kiểm, cách sử dụng? Các định dạng sau được đem lại cho tôi lỗi:

@checkBoxHandler = @{ FieldConstructor(s2ftheme.constructors.checkbox.render) } 
@checkbox(loginForm("remember"), '_label -> Messages("login.remeberme"))(handler = implicitFieldConstructor) 

Tôi nhận được thông báo lỗi:

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. 

Tôi nghĩ rằng tôi đang thiếu khái niệm ở đây ... Cảm ơn.

Trả lời

10

Văn bản thông tin xuất phát từ @elements.infos.mkString(", "). Để hiển thị lỗi, bạn nên sử dụng @elements.errors(elements.lang).mkString(", ") để thay thế.

Thông số chính xác để thay đổi nội dung infos sẽ là giúp (điều này hơi không nhất quán, bạn phải đọc nguồn để nhận ra điều này) vì vậy nếu bạn muốn sử dụng các trường khởi động tích hợp nhưng ngăn chặn các thông tin , bạn sẽ vượt qua '_help -> "".

Sửa cho # 4:

Đây là cách bạn nên gọi hộp kiểm cụ thể của bạn:

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

Và vâng, @input nghĩa là có một mẫu gọi là input.scala.html. Đó là mẫu cơ bản cho tất cả người trợ giúp đầu vào.

Để hiểu lý do tại sao và cách thức hoạt động, bạn nên đi sâu hơn một chút vào Play 2.0 và Scala (đặc biệt là đối số ẩn).

+0

Ok, có ý nghĩa hơn, tôi cũng có thể cung cấp một FieldConstructor ngầm khác cho chúng ta hãy nói một Hộp kiểm, vì hộp kiểm tôi muốn đánh dấu khác? – adis

+0

Khóa dịch được xây dựng như thế nào? Nếu tôi muốn dịch văn bản "Trường này là bắt buộc"? – adis

+0

Bạn có thể truyền hàm tạo trường vào hộp kiểm '@'. –

1
  1. Vì dòng này <span class="help-inline">@elements.infos.mkString(", ")</span>. Bạn đang hiển thị thông tin về trường ở đó. Xóa nó để không hiển thị thông tin.
  2. Thêm mã này:

    @if(elements.hasErrors) { 
        <span class="help-inline">@elements.infos.mkString(", ")</span> 
    } 
    
  3. Để đặt classname: thêm video này vào lĩnh vực Twitter Bootstrap của bạn: class="@elements.args.get('_class). Và trong hình thức đăng nhập của bạn thêm tham số lớp, như thế này: @inputText(loginForm("email"), '_label -> "Email", '_class -> "classname")

Để hiểu được khái niệm, hãy nhìn vào mã nguồn: https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/views/helper/defaultFieldConstructor.scala.html

0

Tôi đang ở cùng một trận đánh để hiển thị các lỗi :) cho bây giờ tôi đang sử dụng:

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

Điều đó sẽ được ẩn nếu không có lỗi, hãy nhìn về vấn đề này: http://twitter.github.com/bootstrap/components.html#labels-badges

nhưng vẫn đang tìm cách dịch "Bắt buộc" sang tiếng Bồ Đào Nha.

Các vấn đề liên quan