2012-12-22 16 views
6

編集オーダーのフォームがありましたが、注文を削除するためのボタンを追加する必要がありました。今、私は2つでフォームを持っているのボタンを提出:Playframeworkフォームと2つの送信ボタン

@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でMy機能フォームのためだけの編集のために:

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(); 
    } 
} 

どのようにして送信されたことどのボタン扱うことができますか?

+0

HTMLフォームには送信ボタンが2つありません。この問題をJavascriptで解決できます(例: "onsubmit"コールバックのaction-urlを変更してください)。特にPlay2の関心事ではありません。 –

+0

私はまだPHPで2つの送信ボタンを使用したと思います。例えば、これはPHP [link](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

ここでは、Julien Lafontの答えをcomplementeするには、あなたがScalaのコントローラで何ができるかです:

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の答え、フォームの場合はth妥当性検査でエラーが発生しました。そのフォームが返された場合でもアクションは同じままです。そのアクションを除外することで、次回は正しいアクションが得られます。

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) 
    } 
)