2013-02-03 60 views
0

我們如何創建複選框並使用scala將它們與play2.0中的表單綁定。使用複選框數據渲染和綁定表單

如果我有

val placeForm = Form(
    mapping(
     "id" -> ignored(NotAssigned: Pk[Long]), 
     "url_key" -> nonEmptyText, 
     "title" -> optional(text), 
     "page_id" -> optional(longNumber) 
    )(models.Place.apply)(models.Place.unapply) 
) 

和我創建的形式是這樣的。

@form(routes.Page.save) { 

    @form(routes.Page.save) { 

    <fieldset> 

    @inputText(pageForm("title"), '_label -> "Title") 
    @inputText(pageForm("template"), '_label -> "Template") <label>Options:</label> 
    <div class="input"> 
     <label>note <input type="checkbox" name="options[]" value="0"> 
     </label> <label>About US <input type="checkbox" name="options[]" 
     value="0"> 
     </label> <label>Facebook <input type="checkbox" name="options[]" 
     value="0"> 
     </label> <label>Twitter <input type="checkbox" name="options[]" 
     value="0"> 
     </label> <label>Hotmail <input type="checkbox" name="options[]" 
     value="0"> 
     </label> <label>Something <input type="checkbox" name="options[]" 
     value="0"> 
     </label> 
    </div> 


    </fieldset> 

現在我想不想簡單的HTML創建這些複選框並綁定這些複選框值到形式
誰能幫我這個

+0

請參閱在表單上播放文檔,使用@checkbox(...)生成這些元素 – virtualeyes

回答

1

val placeForm的結構必須與您呈現形式相匹配在您的模板中。

例如:

val placeForm = Form(
    mapping(
     "id" -> ignored(NotAssigned: Pk[Long]), 
     "title" -> optional(text), 
     "template" -> optional(text), 
     "checkbox1" -> text 
     "checkbox2" -> text 
    ) // ... here construction and deconstruction functions 
) 

你的模板可以lookes像:

@form(routes.Page.save) { 

    <fieldset> 

    @inputText(pageForm("title"), '_label -> "Title") 
    @inputText(pageForm("template"), '_label -> "Template") 

<label>Options:</label> 

<div class="input"> 
     <label> 1 <input type="checkbox" name="checkbox1" value="1"> </label> 
     <label> 2 <input type="checkbox" name="checkbox2" value="2"> </label> 
    </div> 

    </fieldset> 
} 

現在,以瞭解至極的目的是這些複選框是很重要的。如果你想有值綁定到你的case class Place和表單結構完全匹配您的案例類,你可以使用應用和unaplly方法,如果沒有......你必須使用你的自定義功能...

((title, template, checkbox1, checkbox2)=> Place(title, template, checkbox1, checkbox2)) //construct function 

((place : Place) => Some((place.title, place.template, place.property_that_correspond_to_checkbox1_value,place.property_that_correspond_to_checkbox2_value)) // deconstruct function 

或者您可以使用tuple而不是mapping進行表單構造,然後將值作爲元組值使用

+0

謝謝Arussinov,但如果我希望按照選中的複選框的數量來實現一些邏輯,然後將計算結果存儲在名爲options的簡單列中。可能嗎?? –

+0

爲什麼不能,你可以這樣構造你的表單:'val placeForm = Form( mapping( 「id」 - > ignored(NotAssigned:Pk [Long]), 「title」 - > optional(text), 「... template」 - >可選(text) 「checkbox1」 - >布爾值 「checkbox2」 - >布爾型 )// ...這裏是構造和解構函數 )'並在您的邏輯中使用這些布爾值函數)也有play.api.data.Forms中的'checked'方法...'「checkbox2」 - > checked(「Your text here」)...' – arussinov