J’ai deux boutons d’envoi dans un formulaire. Comment puis-je déterminer quel serveur a été touché?
Si vous donnez à chacun un nom, celui sur lequel vous avez cliqué sera envoyé comme toute autre entrée.
Vous pouvez donner à chaque entrée une valeur différente et garder le même nom:
Ensuite, dans le code de vérification pour voir qui 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 reliez votre logique au texte dans l’entrée. Vous pouvez également donner à chacun un nom unique et vérifier simplement l’existence de cette entrée dans $ _POST:
Et dans le code:
if (isset($_POST['update_button'])) { //update action } else if (isset($_POST['delete_button'])) { //delete action } else { //no button pressed }
Une solution encore meilleure consiste à utiliser des balises de bouton pour soumettre le formulaire:
De cette façon, il n’y a pas d’inconvénient avec l’internationalisation et les langages d’affichage multiples (dans la première solution, l’étiquette du bouton correspond également à la valeur envoyée au serveur).
Il existe une nouvelle approche HTML5, l’atsortingbut formaction
:
Apparemment, cela ne fonctionne pas dans IE9 et les versions antérieures, mais pour les autres navigateurs, tout devrait bien se passer (voir: w3schools.com HTML
Personnellement, j’utilise généralement le Javascript pour soumettre des formulaires à distance (pour une perception plus rapide) avec cette approche comme 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 prenez la même action côté serveur, quel que soit le bouton enfoncé, mais souvent, si deux actions côté utilisateur sont disponibles, elles sont également associées à deux actions côté serveur.
Edit: Comme noté par Pascal_dher dans les commentaires, cet atsortingbut est également disponible sur la .
Ceci est extrêmement facile à tester
Il suffit de mettre cela dans une page HTML, cliquez sur les boutons et regardez l’URL
Les solutions suggérées ici ont peut-être fonctionné en 2009, mais ive a testé toutes ces réponses, et personne ne travaille dans aucun navigateur.
la seule solution que j’ai trouvée est la suivante: (mais c’est un peu moche à utiliser je pense)
La meilleure façon de gérer plusieurs boutons d’envoi consiste à utiliser la casse des commutateurs dans le script du serveur.
script serveur / code serveur – où vous soumettez le formulaire:
demo_form.php
Source: W3Schools.com
Comme 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 (même si cela peut être utile dans d’autres contextes):
Plutôt que d’utiliser la valeur pour déterminer quel bouton a été appuyé, vous pouvez utiliser le nom (avec la au lieu de
). De cette façon, si vos boutons ont 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 dans l’URL. Dans CherryPy, chacun d’eux est un argument pour une méthode qui fait le code côté serveur. Donc, si votre méthode a juste
**kwargs
pour sa liste de parameters (au lieu de taper fastidieusement chaque nom unique de chaque élément de formulaire), vous pouvez vérifier pour voir quel bouton a été pressé comme ceci:
if "register" in kwargs: pass #Do the register code elif "login" in kwargs: pass #Do the login code
Je pense que vous devriez pouvoir lire le nom / la valeur de votre tableau GET. Je pense que le bouton qui n’a pas cliqué n’apparaîtra pas dans cette liste.
Définir le name
tant que array
.
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.
utiliser l’atsortingbut HTML formaction
Simple, vous pouvez changer l’action de la forme sur différents boutons d’envoi Cliquez.
Essayez ceci dans le document.
$(".acceptOffer").click(function () { $("form").attr("action", "/Managers/SubdomainTransactions"); }); $(".declineOffer").click(function () { $("form").attr("action", "/Sales/SubdomainTransactions"); });
Vous pouvez aussi le faire comme ça (je pense que c’est très pratique si vous avez N entrées).
Et puis, côté serveur (PHP dans mon exemple), vous pouvez lire “row” en tant que tableau pour obtenir l’index:
$index = key($_POST['row']);
$ _POST [‘row’] sera un tableau avec un seul élément, dans la forme index => value (par exemple: ‘2’ => ‘quelque chose’).
Vous pouvez également utiliser un atsortingbut 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"
Si vous avez deux bouton d’envoi avec une fonction différente, indiquez explicitement dans les boutons de saisie avec le type de soumission comme:
Vous n’avez pas besoin de vous soucier du bouton 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.
Vous pouvez présenter les boutons comme ceci:
Et puis, dans le code, vous pouvez obtenir la valeur en utilisant:
if request.method == 'POST': #valUnits = request.POST.get('unitsInput','') #valPrice = request.POST.get('priceInput','') valType = request.POST.get('typeBtn','')
(valUnits et valPrice sont d’autres valeurs extraites du formulaire que j’ai laissé pour illustration)