web-dev-qa-db-ja.com

1つのフォームに2つの送信ボタン

フォームには2つの 送信 ボタンがあります。どちらがサーバーサイドでヒットしたのかをどのように判断できますか?

449
Alex

それぞれに名前を付けると、クリックした名前が他の入力として送信されます。

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

各入力に異なる値を付けて同じ名前を付けることができます。

<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
}
780
Parrots

さらに良い解決策は、ボタンタグを使ってフォームを送信することです。

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

このようにして、国際化や複数の表示言語による不都合はありません(前のソリューションでは、ボタンのラベルもサーバーに送信される値です)。

90
kiril

これに対する新しいHTML5アプローチ、formaction属性があります。

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

どうやらこれはIE 9以前ではうまくいきませんが、他のブラウザでは問題ないはずです( w3schools.comのHTML <button> formaction属性 を参照)。

個人的には、私は一般的にJavascriptを使用して、このアプローチをバックアップとして使用してフォームをリモートで送信しています(より速いフィードバックを得るため)。この2つのうち、カバーされていないのは、JavaScriptが無効になっているIE <9だけです。

もちろん、どちらのボタンが押されたかにかかわらず、基本的に同じアクションをサーバーサイドで実行する場合、これは不適切かもしれませんが、利用可能なユーザーサイドアクションが2つある場合は、2つのサーバーサイドアクションにも対応します。

編集: コメントのPascal_dherで述べたように、この属性は<input>タグでも利用できます。

66
Leo

これはテストがとても簡単です

<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を見てください

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>
19
MevlütÖzdemir

たぶんここで提案された解決策は2009年に働いたが、iveはこの支持された答えの全てをテストしました、そして誰もどんなブラウザでも働いていません。

私が働いているのを見つけた唯一の解決策はこれです:(しかしそれは私が考えると使用するには少し醜い)

<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

複数の送信ボタンを処理する最善の方法は、サーバースクリプトで大文字と小文字の切り替えを使用することです。

<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

8
Shailesh Sonare

formaction HTML属性を使う

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

使用しているサーバーサイドのスクリプト作成方法を指定していないので、CherryPyを使用してPythonで機能する例を示します(他のコンテキストでも便利です)。

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

namearrayとして定義します。

<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は非常に重要です。そうでなければ両方が解析されるからです。楽しい。

4
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

私はあなたがあなたのGET配列の名前/値を読むことができるはずだと思います。クリックされなかったボタンはそのリストに表示されないと思います。

2
John Bubriski

あなたが異なる機能を持つ2つの送信ボタンを持っているならば、明示的に次のような送信タイプで入力ボタンを教えてください:

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

サーバー側でどのボタンが呼び出されるのかを心配する必要はありません。ロジックを各関数に別々に書いて呼び出してください。彼らは他の人に干渉することなく彼らの仕事をするでしょう。

0

簡単にあなたは別の送信ボタンをクリックしてフォームの動作を変更することができます。

これを文書で試してください。

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

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

このようにすることもできます(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の形式で、要素が1つだけの配列になります(たとえば、 '2' => 'something ")。

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

0
Pato

Href属性を使用して、各ボタンに値を追加したgetを送信することもできます。しかしフォームはその時必須ではないでしょう

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