양식에 두 개의 제출 단추가 있습니다. 어느 것이 서버 측에 충돌했는지 어떻게 알 수 있습니까?
formaction
. 또는 사용자에게 HTML을 표시하는 방법이 브라우저에 전송 된 값과 독립적으로 작동하는 방법에 대한 kiril의 답변 을 참조하십시오 . 국제화 문제를 Greg 또는 Parrot의 답변보다 코드화하기 쉬운 방법으로 해결합니다.
양식에 두 개의 제출 단추가 있습니다. 어느 것이 서버 측에 충돌했는지 어떻게 알 수 있습니까?
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
및 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 속성 참조 ).
개인적으로 저는 일반적으로이 접근 방식을 백업으로 사용하여 Javascript를 사용하여 (빠른 인식 피드백을 위해) 원격으로 양식을 제출합니다. 둘 사이에서 다루지 않은 유일한 사람들은 Javascript가 비활성화 된 IE <9입니다.
물론, 어떤 버튼을 눌렀는지에 관계없이 기본적으로 동일한 작업을 서버 측에서 수행하는 경우 부적절 할 수 있지만 종종 사용 가능한 두 개의 사용자 측 작업이있는 경우 두 개의 서버 측 작업에도 매핑됩니다.
편집 :
주석에서 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;
}
?>
출처 : W3Schools.com
<form action="demo_form.php" method="get">
여기에 제안 된 솔루션이 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';"/>
formaction="actionurl1"
않습니까? 자바 스크립트가 필요하지 않습니다.
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']
형식으로 하나의 요소 만있는 배열입니다 [ id => value ]
(예 :) [ '123' => 'something' ]
.
클릭 한 ID를 얻으려면 다음을 수행하십시오.
$index = key($_POST['row']);
$_POST['row']
연관 배열을 이용하는 것은 영리합니다!
href 속성을 사용하고 각 버튼에 추가 된 값으로 get을 보낼 수도 있습니다. 그러나 양식은 필요하지 않습니다
href="/SubmitForm?action=delete"
href="/SubmitForm?action=save"
POST
경로 아래의 컨트롤러에서는 작동하지 않습니다 .
GET
않아서 죄송하지만 항상 적합하지는 않습니다. "모델 상태를 수정"하는 경우 브라우저를 새로 고치면 동일한 요청이 두 번 투명하게 전송 될 수 있으므로를 사용 해서는 안됩니다GET
. GET
사물을 "보고" POST
상태 변경 요청 (추가, 제거, 편집 등)을 보내는 데만 사용하십시오 . 그런 다음 POST
컨트롤러 작업에서 상태 (데이터베이스, sesion ...)를 GET
변경하고 새로운 변경 상태 를 나타내는 리디렉션 응답을 캐스팅하십시오 . 이렇게 GET
모델 상태 변경에 대한 매우 지저분하고 좋은 코더 때문에 피해야한다. 그렇게 말해서 미안합니다. 깨끗한 코드 규칙.
다음과 같이 버튼을 표시 할 수 있습니다.
<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>