2012-12-22 228 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) 
    } 
)