Due pulsanti presentare in una forma
Domanda
Ho due Invia / pulsanti in un modulo. Come faccio a determinare quale è stato colpito serverside?
Soluzione
Se si dà ad ognuno un nome, il cliccato uno sarà inviato attraverso come qualsiasi altro ingresso.
<input type="submit" name="button_1" value="Click me">
Altri suggerimenti
Si può dare ogni ingresso un valore diverso e mantenere lo stesso nome:
<input type="submit" name="action" value="Update" />
<input type="submit" name="action" value="Delete" />
Poi nel codice di controllo per vedere che è stato attivato:
if ($_POST['action'] == 'Update') {
//action for update here
} else if ($_POST['action'] == 'Delete') {
//action for delete
} else {
//invalid action!
}
L'unico problema è che si legano la logica per il testo nella finestra di input. Si potrebbe anche dare ad ognuno un nome univoco e basta controllare il $ _POST per l'esistenza di tale ingresso:
<input type="submit" name="update_button" value="Update" />
<input type="submit" name="delete_button" value="Delete" />
E nel codice:
if (isset($_POST['update_button'])) {
//update action
} else if (isset($_POST['delete_button'])) {
//delete action
} else {
//no button pressed
}
Una soluzione ancora migliore consiste nell'utilizzare i tag tasto per inviare il modulo:
<form>
...
<button type="submit" name="action" value="update">Update</button>
<button type="submit" name="action" value="delete">Delete</button>
</form>
In questo modo non v'è nessun inconveniente con l'internazionalizzazione e più lingue di visualizzazione (nella prima soluzione, l'etichetta del tasto è anche il valore inviato al server).
C'è un nuovo approccio a questo HTML5, l'attributo formaction
:
<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>
A quanto pare questo non funziona in IE9 e precedenti, ma per altri browser si dovrebbe andare bene (vedi: w3schools.com HTML ).
Personalmente, io in genere utilizzare Javascript per inviare moduli in remoto (per il feedback più veloce percepita) con questo approccio come backup. Tra i due, le uniche persone non coperti sono IE <9 con JavaScript disabilitato.
Naturalmente, questo può essere inadeguato se si sta fondamentalmente prendendo il lato server stessa azione indipendentemente da quale pulsante è stato premuto, ma spesso se ci sono due azioni lato utente disponibile poi verrà convertito in due azioni sul lato server pure.
Modifica
Come notato da Pascal_dher nei commenti, questo attributo è disponibile anche sul tag <input>
pure.
Questo è estremamente facile da test
<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>
Basta mettere che in una pagina HTML, fare clic sui pulsanti, e guardare l'URL
<form>
<input type="submit" value="Submit to a" formaction="/submit/a">
<input type="submit" value="submit to b" formaction="/submit/b">
</form>
Forse le soluzioni proposte qui hanno lavorato nel 2009, ma Ive testato tutto questo risponde upvoted e nessuno sta lavorando in tutti i browser.
unica soluzione che ho trovato lavoro è questo: (ma è un po 'brutto da usare credo)
<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';"/>
Utilizzare l'attributo formaction
HTML (linea 5):
<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>
Il modo migliore per affrontare con più pulsante di invio sta usando caso interruttore script server
<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>
codice copione / Server - dove si sta presentando il modulo:
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;
}
?>
Fonte: W3Schools.com
Dal momento che non è stato specificato quale metodo di scripting lato server si sta utilizzando, io ti do un esempio che funziona per Python, utilizzando CherryPy (anche se può essere utile per altri contesti, anche):
<button type="submit" name="register">Create a new account</button>
<button type="submit" name="login">Log into your account</button>
Invece di utilizzare il valore per determinare quale pulsante è stato premuto, è possibile utilizzare il nome (con il tag <button>
invece di <input>
). In questo modo, se i pulsanti capita di avere lo stesso testo, esso non causare problemi. I nomi di tutti gli elementi di forma, inclusi i pulsanti, vengono inviati come parte dell'URL. In CherryPy, ognuna di queste è un argomento per un metodo che fa il codice lato server. Quindi, se il metodo appena ha **kwargs
per la sua lista di parametri (invece di digitare noiosamente ogni singolo nome di ciascun elemento forma) allora si può controllare per vedere quale pulsante è stato premuto in questo modo:
if "register" in kwargs:
pass #Do the register code
elif "login" in kwargs:
pass #Do the login code
Definisci name
come 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>
codice del server di esempio (PHP):
if (isset($_POST["submit"])) {
$sub = $_POST["submit"];
if (isset($sub["save"])) {
// save something;
} elseif (isset($sub["delete"])) {
// delete something
}
}
elseif
molto importante, perché entrambi saranno analizzata se no.
Godetevi.
<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>
Credo che si dovrebbe essere in grado di leggere il nome / valore nella propria matrice GET. Penso che il pulsante che non è stato fatto clic solito appaiono in quella lista.
Semplice è possibile modificare l'azione del modulo a diverse presentare pulsanti di clic.
Prova questo in document.ready
$(".acceptOffer").click(function () {
$("form").attr("action", "/Managers/SubdomainTransactions");
});
$(".declineOffer").click(function () {
$("form").attr("action", "/Sales/SubdomainTransactions");
});
È anche possibile fare in questo modo (credo che sia molto conveniente se si dispone di ingressi N).
<input type="submit" name="row[1]" value="something">
<input type="submit" name="row[2]" value="something">
<input type="submit" name="row[3]" value="something">
E poi nel lato server (PHP nel mio esempio) si può leggere "riga" come un array per ottenere l'indice:
$index = key($_POST['row']);
$ _ POST [ 'riga'] sarà un array con un solo elemento, nell'indice forma => valore (ad esempio: '2' => 'qualcosa ").
È inoltre possibile utilizzare un attributo href e inviare un ottenere con il valore aggiunto per ogni pulsante. Ma la forma non sarebbe necessario quindi
href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
Se si dispone di due pulsante di invio con funzione diversa quindi esplicitamente raccontare in tasti di ingresso con presentare tipo come:
<input type="submit" click="save()" name="saveBtn" value="save">
<input type="submit" click="update()" name="updateBtn" value="update">
Non è necessario preoccuparsi di quale tasto viene chiamato in lato server. Scrivi la tua logica in ogni funzione separatamente e li chiamano. Faranno il loro lavoro senza interferire con gli altri.
È possibile presentare i tasti in questo modo:
<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">
E poi il codice è possibile ottenere il valore utilizzando:
if request.method == 'POST':
#valUnits = request.POST.get('unitsInput','')
#valPrice = request.POST.get('priceInput','')
valType = request.POST.get('typeBtn','')
(valUnits e valPrice sono alcuni altri valori estraggo dalla forma che ho lasciato in per l'illustrazione)