Две кнопки отправки в одной форме


У меня есть два submit кнопки в форме. Как я могу определить, какой из них был поражен на сервере?

18 409

18 ответов:

Если вы дадите каждому из них имя, щелкнутый будет отправлен через любой другой вход.

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

вы можете дать каждому входу другое значение и сохранить то же имя:

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

затем в коде проверьте, чтобы увидеть, что было вызвано:

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

единственная проблема заключается в том, что вы привязываете свою логику к тексту внутри ввода. Вы также можете дать каждому уникальное имя и просто проверить $_POST на наличие этого ввода:

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

и в коде:

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

еще лучшее решение состоит из использования тегов кнопок для отправки формы:

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

таким образом, нет никаких неудобств с интернационализацией и несколькими языками отображения (в первом решении метка кнопки также является значением, отправленным на сервер).

есть новый подход HTML5 к этому,:

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

по-видимому, это не работает в IE9 и ранее, но для других браузеров вы должны быть в порядке (см.:w3schools.com HTML formaction Attribute).

лично я обычно использую Javascript для отправки форм удаленно (для более быстрой воспринимаемой обратной связи) с этим подходом в качестве резервного копирования. Между ними единственными людьми, которые не охвачены, являются IE

конечно, это может быть неуместно, если вы в основном выполняете одно и то же действие на стороне сервера независимо от того, какая кнопка была нажата, но часто, если есть два действия на стороне пользователя, они также будут отображаться на два действия на стороне сервера.

Edit: Как отмечает Pascal_dher в комментариях, этот атрибут также доступен на <input> тег, а также.

Это очень легко проверить

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

просто поместите это на HTML-страницу, нажмите кнопки и посмотрите на URL

<form>
    <input type="submit" value="Submit to a" formaction="/submit/a">
    <input type="submit" value="submit to b" formaction="/submit/b">    
</form>

может быть, предлагаемые решения здесь работали в 2009 году, но я проверил все эти ответы, и никто не работает ни в каких браузерах.

единственное решение, которое я нашел работающим, это: (но его немного некрасиво использовать, я думаю)

<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';"/>

лучший способ справиться с несколькими кнопками отправки-использовать switch case в серверном скрипте

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

код сервера / сценарий сервера-где вы отправляете форму:

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

?>

Источник:W3Schools.com

поскольку вы не указали, какой метод сценариев на стороне сервера вы используете, я приведу вам пример, который работает для Python, используя CherryPy (хотя это может быть полезно и для других контекстов):

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

вместо того чтобы использовать значение, чтобы определить, какая кнопка была нажата, можно использовать имя (с <button> тег вместо <input>). Таким образом, если ваши кнопки имеют один и тот же текст, это не вызовет проблем. Будут отправлены имена всех элементов формы, включая кнопки как часть URL. В CherryPy каждый из них является аргументом для метода, который выполняет код на стороне сервера. Итак, если ваш метод просто имеет **kwargs для его списка параметров (вместо того, чтобы утомительно набирать каждое имя каждого элемента формы), вы можете проверить, какая кнопка была нажата следующим образом:

if "register" in kwargs:
    pass #Do the register code
elif "login" in kwargs:
    pass #Do the login code
<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>

Я думаю, что вы должны быть в состоянии прочитать имя/значение в вашем GET массив. Я думаю, что кнопка, которая не была нажата, не появится в этом списке.

определение name как 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>

пример кода сервера (PHP):

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

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

elseif очень важно, потому что оба будут проанализированы, если нет. Наслаждаться.

использовать атрибут 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>

просто вы можете изменить действие формы на разных кнопок мыши.

попробуйте это в документе.Готов

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

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

вы также можете сделать это так (я думаю, что это очень удобно, если у вас есть 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">

а затем на стороне сервера (PHP в моем примере) вы можете прочитать " row " как массив, чтобы получить индекс:

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

$_POST ['row'] будет массивом только с одним элементом, в виде index => value (например:' 2 '= > 'something").

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

вы также можете использовать атрибут href и отправить get со значением, добавленным для каждой кнопки. Но тогда форма не потребуется

href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"

Если у вас есть две кнопки отправки с разными функциями, то явно скажите в кнопках ввода с типом отправки, например:

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

вам не нужно беспокоиться о том, какие кнопки вызывается на сервере. Напишите свою логику в каждой функции отдельно и вызовите их. Они будут делать свою работу, не мешая другим.

Вы можете представить такой кнопки:

<input type="submit" name="typeBtn" value="BUY">
<input type="submit" name="typeBtn" value="SELL">

а потом в коде вы можете получить значение с помощью:

if request.method == 'POST':
    #valUnits = request.POST.get('unitsInput','')
    #valPrice = request.POST.get('priceInput','')
    valType = request.POST.get('typeBtn','')

(valUnits и valPrice-это некоторые другие значения, которые я извлекаю из формы, которую я оставил для иллюстрации)