web-dev-qa-db-fra.com

Deux boutons de soumission en un seul formulaire

J'ai deux soumettre boutons dans un formulaire. Comment déterminer lequel a été touché à côté du serveur?

428
Alex

Si vous donnez un nom à chacun, celui sur lequel vous aurez cliqué sera envoyé comme toute autre entrée.

<input type="submit" name="button_1" value="Click me">
352
Greg

Vous pouvez attribuer une valeur différente à chaque entrée et conserver le même nom:

<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />

Ensuite, dans le code, vérifiez lequel a été déclenché:

if ($_POST['action'] == 'Update') {
    //action for update here
} else if ($_POST['action'] == 'Delete') {
    //action for delete
} else {
    //invalid action!
}

Le seul problème avec cela est que vous associez votre logique au texte dans l'entrée. Vous pouvez également attribuer un nom unique à chacun et vérifier que $ _POST existe pour cette entrée:

<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />

Et dans le code:

if (isset($_POST['update_button'])) {
    //update action
} else if (isset($_POST['delete_button'])) {
    //delete action
} else {
    //no button pressed
}
759
Parrots

Une solution encore meilleure consiste à utiliser des balises de bouton pour soumettre le formulaire:

<form>
    ...
    <button type="submit" name="action" value="update">Update</button>
    <button type="submit" name="action" value="delete">Delete</button>
</form>

De cette manière, il n’ya aucun inconvénient à l’internationalisation et aux langues d’affichage multiples (dans l’ancienne solution, l’étiquette du bouton était également la valeur envoyée au serveur).

81
kiril

Il existe une nouvelle approche HTML5 à cet égard, l’attribut formaction:

<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>

Apparemment, cela ne fonctionne pas dans IE9 et les versions antérieures, mais pour les autres navigateurs, tout devrait bien aller (voir: w3schools.com HTML <button> formaction Attribute ).

Personnellement, j’utilise généralement le langage Javascript pour soumettre des formulaires à distance (pour un feedback perçu plus rapidement) avec cette approche en tant que sauvegarde. Entre les deux, les seules personnes non couvertes sont IE <9 avec Javascript désactivé.

Bien sûr, cela peut être inapproprié si vous exécutez essentiellement la même action côté serveur, quel que soit le bouton enfoncé, mais si deux actions côté utilisateur sont disponibles, elles seront également mappées sur deux actions côté serveur.

Edit: Comme Pascal_dher l'a noté dans les commentaires, cet attribut est également disponible sur la balise <input>.

59
Leo

C'est extrêmement facile à tester

<form action="" method="get">

<input type="submit" name="sb" value="One">
<input type="submit" name="sb" value="Two">
<input type="submit" name="sb" value="Three">

</form>

Il suffit de mettre cela dans une page HTML, cliquez sur les boutons et regardez l'URL

26
Peter Bailey
<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>
16
MevlütÖzdemir

Les solutions suggérées ici ont peut-être fonctionné en 2009, mais ive a testé toutes ces réponses votées et personne ne fonctionne dans les navigateurs.

la seule solution que j’ai trouvée à travailler est la suivante: (mais c’est un peu moche à utiliser je pense)

<form method="post" name="form">
<input type="submit" value="dosomething" onclick="javascript: form.action='actionurl1';"/>
<input type="submit" value="dosomethingelse" onclick="javascript: form.action='actionurl2';"/>

11
Joakim

La meilleure façon de gérer plusieurs boutons de soumission consiste à utiliser la casse de commutateur dans un script de serveur.

<form action="demo_form.php" method="get">

Choose your favorite subject:

<button name="subject" type="submit" value="html">HTML</button>
<button name="subject" type="submit" value="css">CSS</button>
<button name="subject" type="submit" value="javascript">Java Script</button>
<button name="subject" type="submit" value="jquery">jQuery</button>

</form>

code serveur/script serveur - où vous soumettez le formulaire:

demo_form.php

<?php

switch($_REQUEST['subject']) {

    case 'html': //action for html here
                break;

    case 'css': //action for css here
                break;

    case 'javascript': //action for javascript here
                        break;

    case 'jquery': //action for jquery here
                    break;
}

?>

Source: W3Schools.com

8
Shailesh Sonare

utiliser l'attribut HTML formaction

<form action="/action_page.php" method="get">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <button type="submit">Submit</button><br>
  <button type="submit" formaction="/action_page2.php">Submit to another page</button>
</form>
5

Puisque vous n'avez pas spécifié la méthode de script côté serveur que vous utilisez, je vais vous donner un exemple qui fonctionne pour Python, en utilisant CherryPy (bien que cela puisse être utile dans d'autres contextes également):

<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>

Plutôt que d'utiliser la valeur pour déterminer le bouton sur lequel vous avez appuyé, vous pouvez utiliser le nom (avec la balise <button> au lieu de <input>). De cette façon, si vos boutons contiennent le même texte, cela ne posera pas de problème. Les noms de tous les éléments de formulaire, y compris les boutons, sont envoyés avec l’URL. Dans CherryPy, chacun de ces éléments est un argument pour une méthode qui effectue le code côté serveur. Ainsi, si votre méthode ne contient que **kwargs pour sa liste de paramètres (au lieu de taper péniblement chaque nom de chaque élément de formulaire), vous pouvez vérifier quel bouton a été enfoncé comme ceci:

if "register" in kwargs:
    pass #Do the register code
Elif "login" in kwargs:
    pass #Do the login code
4
Shule

Définissez name comme array.

<form action='' method=POST>
    (...) some input fields (...)
    <input type=submit name=submit[save] value=Save>
    <input type=submit name=submit[delete] value=Delete>
</form>

Exemple de code serveur (PHP):

if (isset($_POST["submit"])) {
    $sub = $_POST["submit"];

    if (isset($sub["save"])) {
        // save something;
    } elseif (isset($sub["delete"])) {
        // delete something
    }
}

elseif très important, car les deux seront analysés sinon. Prendre plaisir.

3
Thielicious
<form method="post">
<input type="hidden" name="id" value="'.$id.'" readonly="readonly"/>'; //any value to post PHP
<input type='submit' name='update' value='update' formAction='updateCars.php'/>
<input type='submit' name='delete' value='delete' formAction='sqlDelete.php'/>
</form>
3
Osmar Kozan Jr

Je pense que vous devriez pouvoir lire le nom/la valeur dans votre tableau GET. Je pense que le bouton sur lequel vous n'avez pas cliqué n'apparaîtra pas dans cette liste.

2
John Bubriski

Si vous avez deux boutons d'envoi avec une fonction différente, indiquez explicitement les boutons d'entrée avec le type d'envoi comme

<input type="submit" click="save()" name="saveBtn" value="save">
<input type="submit" click="update()" name="updateBtn" value="update">

Vous n'avez pas besoin de vous demander quel bouton est appelé côté serveur. Ecrivez votre logique dans chaque fonction séparément et appelez-les. Ils feront leur travail sans interférer avec les autres.

0
Jasmin Akther Suma

Simple, vous pouvez modifier l'action du formulaire sur différents boutons de soumission Cliquez sur.

Essayez ceci dans le document.Prêt

$(".acceptOffer").click(function () {
       $("form").attr("action", "/Managers/SubdomainTransactions");
});

$(".declineOffer").click(function () {
       $("form").attr("action", "/Sales/SubdomainTransactions");
});
0
Slan

Vous pouvez aussi le faire comme ça (je pense que c'est très pratique si vous avez N entrées).

<input type="submit" name="row[1]" value="something">
<input type="submit" name="row[2]" value="something">
<input type="submit" name="row[3]" value="something">

Et puis côté serveur (PHP dans mon exemple), vous pouvez lire "row" comme un tableau pour obtenir l'index:

$index = key($_POST['row']);

$ _POST ['row'] sera un tableau avec un seul élément, sous la forme index => valeur (par exemple: '2' => 'quelque chose ").

http://php.net/manual/en/function.key.php

0
Pato

Vous pouvez également utiliser un attribut href et envoyer un get avec la valeur ajoutée pour chaque bouton. Mais la forme ne serait pas nécessaire alors 

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
0
Jonathan Laliberte