2012-09-04 33 views
4

我的應用程序包含18個字段的大表單。它是用標準形式映射處理,像這樣:用Play處理很長的表格2

val bigForm = Form(
    mapping(
    "id" -> of[ObjectId], 
    "title" -> text, 
    // And another 16 fields... 
    ... 
) 
) 

,一切都很好,但今天我決定增加一個字段,來這裏的問題 - mapping不能拿超過18個論據。

那我該怎麼辦?我想將某些字段組合到結構中,但是額外的結構需要額外的格式化程序,JSON序列化程序和解串行程序,工作量太大。我正在尋找一個通用的解決方案,未來可能會出現更多的領域。

我正在考慮的另一種解決方案是手動處理表格,而不需要Form's。

有更好的解決方案嗎?

+1

僅有從可用性的角度看,它使得很多的輸入,用於您的用戶...你不能分幾頁? –

+0

nico_ekito,Form用於修改複雜的對象,並通過'general','advanced advanced'和'advanced'等多個選項卡呈現給用戶。用戶經常搜索必填字段,修改它並點擊保存。我認爲現在這樣長的形式可以,但我可能是錯的。 – lambdas

+0

每個領域的自動保存怎麼樣?可悲的是,這需要很多工作,但從用戶角度來看可能會更好? –

回答

4

您可以使用嵌套映射,例如

val bigForm = Form(
    mapping(
    "id" -> of[ObjectId], 
    "title" -> text, 
    "general" -> mapping(
     ... 
    )(GeneralInfo.apply)(GeneralInfo.unapply), 
    "advanced" -> mapping(
     ... 
    )(AdvancedInfo.apply)(AdvancedInfo.unapply) 
) 
) 
1

另一種可能性是使用查看對象和僅更新已提​​交(例如,通過單獨的形式或AJAX)的部分:

val generalForm = Form(
    mapping(
    "title" -> text, 
    ... 
) 
) 

def updateGeneral(id: ObjectId) = Action { implicit request => 
    MyObject.findById(id).map { myObj => 
    generalForm.bindFromRequest.fold(
     fail => BadRequest(...), 
     form => { 
     val newObj = myObj.copy(title = form.title, ...) 
     MyObject.save(newObj) 
     Ok(...) 
     } 
    ) 
    }.getOrElse(NotFound) 
}