2

我有一个带有表格的模板。我正在使用 scala Helper 处理数据表单并将其保存为模型对象。正如您在我的示例中看到的,helper.select字段将与ManytoOne而不是ManyToMany一起使用。现在我希望我的表单允许选择多个类别并保存模型。我可以用表单助手做到这一点,还是我必须用传统方式做到这一点。

风景:

(..)
@helper.form(action = routes.Admin.newItem(), 'id -> "item_form", 'method -> "POST", 'enctype -> "multipart/form-data"){
        <fieldset>
            @helper.inputText(
            itemForm("title"),
            '_label -> "Titre"  )

            @helper.inputText(
            itemForm("price"),
            '_label -> "Prix"   )

            @helper.select(
            itemForm("category.id"), 
            helper.options(Category.list),
            'id -> "category",
            '_label -> "Categorie")

            @helper.textarea(
            itemForm("content"),
            '_label -> "Description")

            @helper.inputText(
            itemForm("url"),
            '_label -> "URL"    )

            @helper.inputText(
            itemForm("picture"),
            '_label -> "Picture URL"    )

             <input type="submit" value="Ajouter">

        </fieldset>
        }

管理员控制器

    (..)
    static play.data.Form<Item> itemForm = form(Item.class);

public static Result newItem(){
    Item item = itemForm.bindFromRequest().get();
    item.save();
    return TODO;

}
4

1 回答 1

2

我认为使用默认选择助手是不可能的,因为您无法覆盖 name 属性,并且选择正确选项的代码不适用于多个值。请注意 name 属性的附加括号 [] 是必需的,因此 Play 的 bindFromRequest 方法会选择多个值。可以看到在Play源码中,勾选了bindFromRequest方法:Playframework 2.1 Form class (Java)

这是我用来处理多选字段的视图助手:

@(field: play.api.data.Field, options: Seq[(String,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang)
@input(field, args:_*) { (id, name, value, htmlArgs) =>
  <select multiple="multiple" id="@id" name="@{name}[]" size="@{5 min options.length}">
    @for(i <- 0 until options.length) {
        <option id="@id" value="@options(i)._1"  
            @(if(field.indexes.exists(index => field("["+index+"]").value == Some(options(i)._1) ) ) "selected" else "")
        @toHtmlArgs(htmlArgs) >@options(i)._2</option>      
      }
  </select>
}

你可以像这样使用它:

@multiselect(itemForm("category"), options(Category.list), '_label -> "Category")

此解决方案适用于 play 2.1 (scala),我尚未测试它是否适用于 play 2.0 (java)

于 2013-02-26T10:32:30.617 回答