2012-12-22 14 views
6

Posiadałem formularz do edycji zlecenia, ale musiałem dodać przycisk do usunięcia zamówienia. Teraz muszę złożyć formularz z dwoma przyciskami:Formularz Playframework i dwa przyciski do przesłania

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

moją funkcję w kontroler dla postaci tylko do edycji:

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

Jak mogę poradzić, który przycisk został zgłosił?

+0

Formularz HTML nie może mieć dwóch przycisków przesyłania. Możesz rozwiązać ten problem za pomocą Javascript (zmień adres URL działania w wywołaniu "onsubmit" na przykład). To nie jest problem związany z Play2. –

+0

Myślę, że użyłem 2 przycisków przesyłania w PHP jeszcze. Na przykład powinno to działać dla PHP [link] (http://blog.theonlytutorials.com/multiple-submit-button-in-a-single-form-with-php/) –

+0

OK, jest to możliwe :) http://stackoverflow.com/questions/942772/html-form-with-two-submit-buttons-and-two-target-attributes Przepraszamy za mój błąd! Sprawdzę Play2 –

Odpowiedz

18

Właściwość wybranego przycisku value jest wysyłana do serwera, jak innych dziedzinach. Wewnątrz kontrolera można uzyskać dostęp do tej wartości w treści żądania i zdecydować, co należy zrobić.

Szablon:

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

Kontroler:

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

To działa. Dziękuję Ci bardzo. –

+1

Zrobiłem to samo, ale dla mnie akcja jest pusta (nie zerowa)! jakieś wskazówki? – Hossein

10

Aby complemente Julien Lafont „s odpowiedzi, o to co można zrobić w kontrolerze 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' faktycznie pracował dla mnie –

+0

request.body.asFormUrlEncoded był pusty we własnym przypadku, ale form.data zawiera wartość. – keni

1

celu uzupełnienia Julien Lafont odpowiedź "s" i "OlivierBlanvillain", w przypadku formularza sprawdza poprawność z błędem. Akcja pozostaje taka sama, jeśli ta forma zostanie zwrócona. Zatem odfiltrowanie tej akcji przyniesie prawidłową akcję następnym razem.

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) 
    } 
) 
Powiązane problemy