フォームに2つの送信ボタンがあります。サーバーサイドでヒットしたものを特定するにはどうすればよいですか?
formaction
。または、ユーザーにHTMLを表示してブラウザーに送信する値から独立させる方法については、kirilの回答を参照してください。GregやParrotの回答よりもコード化しやすい方法で国際化の問題を解決します。
フォームに2つの送信ボタンがあります。サーバーサイドでヒットしたものを特定するにはどうすればよいですか?
formaction
。または、ユーザーにHTMLを表示してブラウザーに送信する値から独立させる方法については、kirilの回答を参照してください。GregやParrotの回答よりもコード化しやすい方法で国際化の問題を解決します。
回答:
それぞれに名前を付けると、クリックされたものが他の入力として送信されます。
<input type="submit" name="button_1" value="Click me">
formaction
。または、ユーザーに表示されるHTMLをブラウザーに送信される値から独立させる方法については、kirilの回答を参照してください-国際化の問題を解決します。
解決策1:
各入力に異なる値を指定し、同じ名前を維持します。
<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!
}
その問題は、ロジックを入力内のユーザーに表示されるテキストに結び付けることです。
解決策2:
それぞれに一意の名前を付け、$ _ 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>
ボタン内のHTML (たとえば..>Update<..
、ユーザーに表示されるものです。HTMLが提供されているため、ユーザーにはvalue
表示されません。サーバーに送信されるだけです。このようにして、国際化や複数の表示言語(以前のソリューションでは、ボタンのラベルはサーバーに送信される値でもあります)。
<button>
:submit
との2つの異なるタイプを使用しreset
ます。reset
何も送信しないことに注意してください。フォームをリセットするだけです。したがって、Jeroenの議論は残っています。
これに対する新しいHTML5アプローチ、formaction
属性があります。
<button type="submit" formaction="/action_one">First action</button>
<button type="submit" formaction="/action_two">Second action</button>
どうやらこれはIE9以前では機能しませんが、他のブラウザでは問題ないはずです(参照:w3schools.com HTML <button> formaction Attribute)。
個人的には、私は通常、このアプローチをバックアップとして使用して、フォームをリモートで(より速く知覚されるフィードバックのために)送信するためにJavaScriptを使用しています。2つのうち、カバーされないのは、JavaScriptが無効になっているIE <9だけです。
もちろん、どのボタンが押されたかに関係なく、基本的に同じアクションをサーバー側で実行している場合、これは不適切な場合がありますが、ユーザー側のアクションが2つある場合は、サーバー側の2つのアクションにもマッピングされます。
編集:
Pascal_dherのコメントに記載されているように、この属性は<input>
タグでも使用できます。
form_tag
。動作させる唯一の方法は、に切り替えてform_for
使用することf.submit formaction: 'your_path'
です。
これはテストが非常に簡単です
<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を見てください。
formaction
HTML属性を使用(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>
<form>
<input type="submit" value="Submit to a" formaction="/submit/a">
<input type="submit" value="submit to b" formaction="/submit/b">
</form>
複数の送信ボタンを処理する最良の方法は、サーバースクリプトでスイッチケースを使用することです
<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;
}
?>
<form action="demo_form.php" method="get">
多分、ここで提案された解決策は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';"/>
formaction="actionurl1"
ですか?JavaScriptは必要ありません。
formaction
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
非常に重要です。そうでない場合、両方が解析されます。楽しい。
switch
追加でき、ボタンを追加してそれをswitch
(および/またはスペルミスなど)に追加するのを忘れた場合は、デフォルトのアクションでを使用するためです
使用しているサーバー側スクリプト方法を指定しなかったので、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
<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配列の名前/値を読み取ることができるはずです。クリックされなかったボタンはそのリストには表示されないと思います。
このようにすることもできます(N個の入力がある場合は非常に便利です)。
<input type="submit" name="row[456]" value="something">
<input type="submit" name="row[123]" value="something">
<input type="submit" name="row[789]" value="something">
一般的な使用例は、ボタンごとにデータベースの異なるIDを使用することです。そのため、サーバーで行がクリックされたことが後でわかります。
サーバー側(この例ではPHP)では、「行」を配列として読み取り、IDを取得できます。
$_POST['row']
次の形式の要素が1つだけの配列になります[ id => value ]
(例:[ '123' => 'something' ]
。
したがって、クリックされたIDを取得するには、次のようにします。
$index = key($_POST['row']);
$_POST['row']
、連想配列であることを利用するのは賢明です!
1つのフォーム例で複数の送信ボタンのフォームアクション
<input type="submit" name="" class="btn action_bg btn-sm loadGif" value="Add Address" title="" formaction="/addAddress">
<input type="submit" name="" class="btn action_bg btn-sm loadGif" value="update Address" title="" formaction="/updateAddress">
また、href属性を使用して、各ボタンに値を追加してgetを送信することもできます。ただし、フォームは必要ありません。
href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
POST
ルートの下のコントローラーには機能しません。
GET
必ずしも適切とは限りません。「モデルの状態を変更する」場合は、を使用しないでください。GET
ブラウザを更新すると、同じリクエストが2回透過的に送信される可能性があります。GET
物事を「表示」しPOST
、状態変更のリクエスト(追加、削除、編集など)を送信するためにのみ使用します。次に、POST
コントローラーアクションで状態(データベース、セッション...)を変更し、リダイレクトされた応答をキャストして、GET
変更された新しい状態にします。GET
モデル状態の変更を行うことは非常に不潔であり、優れたコーダーはそれを避けるべきです。申し訳ありません。きれいなコードrulez。
次のようにボタンを表示できます。
<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は、説明のために残したフォームから抽出した他の値です)
<?php
if(isset($_POST["loginForm"]))
{
print_r ($_POST); // FOR Showing POST DATA
}
elseif(isset($_POST["registrationForm"]))
{
print_r ($_POST);
}
elseif(isset($_POST["saveForm"]))
{
print_r ($_POST);
}
else{
}
?>
<html>
<head>
</head>
<body>
<fieldset>
<legend>FORM-1 with 2 buttons</legend>
<form method="post" >
<input type="text" name="loginname" value ="ABC" >
<!--Always use type="password" for password -->
<input type="text" name="loginpassword" value ="abc123" >
<input type="submit" name="loginForm" value="Login"><!--SUBMIT Button 1 -->
<input type="submit" name="saveForm" value="Save"> <!--SUBMIT Button 2 -->
</form>
</fieldset>
<fieldset>
<legend>FORM-2 with 1 button</legend>
<form method="post" >
<input type="text" name="registrationname" value ="XYZ" >
<!--Always use type="password" for password -->
<input type="text" name="registrationpassword" value ="xyz123" >
<input type="submit" name="registrationForm" value="Register"> <!--SUBMIT Button 3 -->
</form>
</fieldset>
</body>
</html>