使用复选框数据呈现和绑定表单

时间:2013-02-03 10:30:29

标签: scala playframework-2.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创建这些复选框并将这些复选框值绑定到表单中
任何人都可以帮助我

1 个答案:

答案 0 :(得分: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
)

您的模板可能如下所示:

@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并且你的表单结构完全匹配你的case类,你可以使用apply和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进行表单构建,然后将您的值简单地视为元组值