2012-12-22 154 views
6

我有表單來編輯訂單,但我不得不添加按鈕來刪除訂單。現在我有形式兩個提交按鈕:Playframework表單和兩個提交按鈕

@helper.form(routes.Order.editOrder,'class -> "form-horizontal") { 
    @helper.inputText(
     PlayMagicForJava.javaFieldtoScalaField(editOrderForm("date")), 
     '_label -> "Date:", 
     '_help -> "" 
    ) 
    @helper.inputText(
     PlayMagicForJava.javaFieldtoScalaField(editOrderForm("place_from")), 
     '_label -> "From:", 
     '_help -> "" 
    ) 
    <button type="submit" name="edit" id="edit" class="btn btn-primary">Edit Order</button> 
    <button type="submit" name="remove" id="remove" value="remove" class="btn">Remove order</button> 
} 

我在CONTROLER函數形式只是爲編輯:

public static Result editOrder(){ 
Order user = User.findByEmail(session("email")); 
Form<Order> editOrderFormFilled = editOrderForm.bindFromRequest(); 
Order order = Order.findByID(editOrderFormFilled.get().id); 
    if(editOrderFormFilled.hasErrors()) { 
     return badRequest(); 
    } 
    else if(user.id != order.created_by){ 
     return badRequest(); 
    }else{ 
     return OK(); 
    } 
} 

我怎麼能處理的按鈕被submited?

+0

HTML表單不能有2個提交按鈕。你可以用Javascript解決這個問題(例如在「onsubmit」回調中改變action-url的例子)。這不是特別關注Play2。 –

+0

我認爲我在PHP中使用了2個提交按鈕。例如,這應該適用於PHP [鏈接](http://blog.theonlytutorials.com/multiple-submit-button-in-a-single-form-with-php/) –

+0

好吧,這是可能的:) http:///stackoverflow.com/questions/942772/html-form-with-two-submit-buttons-and-two-target-attributes對不起,我的錯誤!我會檢查Play2 –

回答

18

所選按鈕的value屬性將作爲任何其他字段發送到服務器。因此,在您的控制器內部,您可以在請求正文中訪問此值並決定要執行的操作。

模板:

<button type="submit" name="action" value="edit">Edit order</button> 
<button type="submit" name="action" value="remove">Remove order</button> 

控制器:

public static Result myAction() { 
    String[] postAction = request().body().asFormUrlEncoded().get("action"); 
    if (postAction == null || postAction.length == 0) { 
    return badRequest("You must provide a valid action"); 
    } else { 
    String action = postAction[0]; 
    if ("edit".equals(action)) { 
     return edit(request()); 
    } else if ("remove".equals(action)) { 
     return remove(request()); 
    } else { 
     return badRequest("This action is not allowed"); 
    } 
    } 
} 

private static Result remove(Request request) { 
    // TODO 
    return ok("implement your business here"); 
} 

private static Result edit(Request request) { 
    // TODO 
    return ok("implement your business here"); 
} 
+0

它的工作原理。非常感謝你。 –

+1

我做了同樣的事,但對我來說,行動是空的(儘管不是空的)!任何線索? – Hossein

10

要complemente Julien Lafont的答案,這裏是你可以在斯卡拉控制器做什麼:

def handle = Action { implicit request => 
    request.body.asFormUrlEncoded.get("action").headOption match { 
    case Some("edit") => Ok("Clicked edit") 
    case Some("remove") => Ok("Clicked remove") 
    case _ => BadRequest("This action is not allowed") 
    } 
} 
+0

'request.body.asFormUrlEncoded.get(「submit」)。headOption'實際爲我工作 –

+0

request.body.asFormUrlEncoded在我自己的情況下是空的,但form.data包含值。 – keni

1

爲了補充Julien Lafont的和OlivierBlanvillain的答案,在形式的情況下在驗證時發生錯誤。如果表單返回,操作保持不變。因此,篩選出該操作會在下一次給出正確的操作。

val postAction: String = request.body.asFormUrlEncoded.get("action").head 

    // bind the form request. 
    val bindFromRequest: Form[CaseClass] = CaseOriginalForm.bindFromRequest 
    bindFromRequest.fold(
    formWithErrors => { 
     // filter out the action button data (otherwise the first action comes back) 
     val filterNot: Map[String, String] = formWithErrors.data.filterNot(f => f._1 == "action") 
     val formWithErrors2= CaseOriginalForm.bind(filterNot) 
     BadRequest(views.html.FormPage(formWithErrors2)) 
    }, 
    contact => { 
     Ok("Succes page " + postAction) 
    } 
)