2012-12-22 38 views
6

Tôi có biểu mẫu để chỉnh sửa đơn đặt hàng nhưng tôi phải thêm nút để xóa đơn đặt hàng. Bây giờ tôi có hình thức với hai nộp nút:Biểu mẫu Playframework và hai nút gửi

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

chức năng của tôi trong ứng dụng điều khiển cho hình thức chỉ để chỉnh sửa:

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

Làm thế nào tôi có thể xử lý nút được đệ trình?

+0

Biểu mẫu HTML không thể có 2 nút gửi. Bạn có thể giải quyết vấn đề này với Javascript (thay đổi hành động-url trong "onsubmit" gọi lại cho exemple). Nó không phải là mối quan tâm đặc biệt của Play2. –

+0

Tôi nghĩ rằng tôi đã sử dụng 2 nút gửi trong PHP. Ví dụ này sẽ hoạt động cho PHP [link] (http://blog.theonlytutorials.com/multiple-submit-button-in-a-single-form-with-php/) –

+0

Ok, có thể :) http://stackoverflow.com/questions/942772/html-form-with-two-submit-buttons-and-two-target-attributes Xin lỗi vì lỗi của tôi! Tôi sẽ kiểm tra Play2 –

Trả lời

18

Thuộc tính value của nút đã chọn được gửi đến máy chủ như bất kỳ trường nào khác. Vì vậy, bên trong bộ điều khiển của bạn, bạn có thể truy cập giá trị này trong phần thân yêu cầu và quyết định việc cần làm.

mẫu:

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

Bộ điều khiển:

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

Nó hoạt động. Cảm ơn nhiều. –

+1

Tôi đã làm như vậy, nhưng đối với tôi hành động là trống rỗng (không null mặc dù)! bất kì manh mối nào? – Hossein

10

Để complemente Julien Lafont 's câu trả lời, đây là những gì bạn có thể làm trong một điều khiển 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' thực sự làm việc cho tôi –

+0

request.body.asFormUrlEncoded rỗng trong trường hợp của riêng tôi, nhưng form.data chứa giá trị. – keni

1

Để bổ sung Julien Lafont 's và OlivierBlanvillain' s câu trả lời, trong trường hợp của một hình thức thứ xác nhận lỗi. Hành động vẫn giữ nguyên nếu biểu mẫu đó được trả lại. Vì vậy, lọc ra hành động đó sẽ đưa ra hành động chính xác trong lần tiếp theo.

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) 
    } 
) 
Các vấn đề liên quan