Может ли одна форма иметь несколько действий?
Я хочу отправить форму в разные места на основе выбора, сделанного в форме. Первоначально я планировал отправить все в центральный файл/местоположение и определить, куда идти дальше. Однако я хотел бы обойтись без этого дополнительного шага, если бы мог.
Если пользователь хочет создавать/редактировать/удалять элементы, перейдите на страницу 1.
Если пользователь хочет сгруппировать/присоединить элементы, перейдите на страницу 3.
Я пытаюсь написать конструктор форм. Вы можете создавать/редактировать/удалять формы, вопросы и ответы. У меня есть все для создания, редактирования и удаления. Эти функции выполняются, не покидая страницу, но теперь я ищу ответы на конкретные вопросы. Страница вопросов и страница ответов разделены. Я хочу выбрать группу ответов и отправить массив идентификаторов ответов (установленные флажки) на страницу вопроса, где эти идентификаторы будут затем назначены вопросу. Таким образом, в основном функции создания, редактирования и удаления включены не покидая страницу, но функция назначения будет выполняться на другой странице.
if(empty($delRowID) || empty(updateRowID) || empty($groupRows)) {
qInsert();
}else{
if(!empty($delRowID)) qDelete($delRowID);
if(!empty(updateRowID)) qUpdate($updateRowID);
if(!empty($groupRows)) {
submit $groupRows to Question.php;
}
}
9 answers
Это возможно с помощью JavaScript, но это не рекомендуется, потому что некоторые люди отключают JS по умолчанию из-за троянов и шумного поведения некоторых сайтов. Считается вежливым, чтобы ваш сайт работал как с включенным, так и с отключенным JS.
На самом деле вам не нужно много действий с формой, потому что каждую операцию можно выполнить с помощью ветвления в одном скрипте обработчика форм.
Вот очень простой пример приложения CRUD, выполняющего отображение, редактирование, добавление - все в одном тело и использование шаблонов:
Index.php
<?
mysql_connect();
mysql_select_db("new");
$table = "test";
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part:
$name = mysql_real_escape_string($_POST['name']);
if ($id = intval($_POST['id'])) {
$query="UPDATE $table SET name='$name' WHERE id=$id";
} else {
$query="INSERT INTO $table SET name='$name'";
}
mysql_query($query) or trigger_error(mysql_error()." in ".$query);
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
exit;
}
if (!isset($_GET['id'])) { //listing part:
$LIST=array();
$query="SELECT * FROM $table";
$res=mysql_query($query);
while($row=mysql_fetch_assoc($res)) $LIST[]=$row;
include 'list.php';
} else { // form displaying part:
if ($id=intval($_GET['id'])) {
$query="SELECT * FROM $table WHERE id=$id";
$res=mysql_query($query);
$row=mysql_fetch_assoc($res);
foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v);
} else {
$row['name']='';
$row['id']=0;
}
include 'form.php';
}
?>
Form.php
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>
List.php
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>
Нет, форма имеет только одно действие.
Но у вас есть варианты:
Javascript
Однако вы можете изменить атрибут действия с помощью javascript:
<input type="submit" value="Edit" onclick="editform();return true;">
<input type="submit" value="Delete" onclick="deleteform();return true;">
Вместе с небольшим количеством javascript:
function editform() {
document.myform.action = '/edit';
}
function deleteform() {
document.myform.action = '/delete';
}
См. также
- Как задать действие формы с помощью JavaScript?
- Различная форма ДЕЙСТВИЯ в зависимости от нажатой кнопки
- jquery, изменение формы действие
Несколько форм
Если javascript не подходит для вас, вы можете рассмотреть несколько форм на своей странице.
Multiple forms = multiple actions
Никаких проблем с клиентами с отключенным javascript и соответствующими стандартам.
Несколько кнопок отправки - на стороне сервера
Или вы можете обрабатывать различие редактирования или удаления на стороне сервера. Не требуется javascript.
Добавьте несколько кнопок отправки в свою форму и дайте им одно и то же имя, но другое значение:
<input type="submit" name="btSubmit" value="Edit">
<input type="submit" name="btSubmit" value="Delete">
Затем вы можете получить значение нажатой кнопки. В php эту работу должно выполнять следующее:
$_POST['btSubmit']
См. http://www.chami.com/tips/internet/042599I.html для примера с классическим asp.
Просто отправьте их в центральное местоположение и используйте логику, чтобы отправить их куда-нибудь еще в зависимости от того, что они выбрали.
Например:
<?php
switch($_POST['choice']) {
case 'edit':
$page = 'edit.php';
break;
case 'group':
$page = 'group.php';
break;
}
header("Location: " . $page);
(очевидно, требуется некоторая фильтрация входных данных и значения по умолчанию)
РЕДАКТИРОВАТЬ: как указано полковником. Шрапнель ниже, использование header()
для этого довольно бессмысленно, так как затем он уничтожит ваш массив $_POST - вместо этого используйте include()
, но будьте осторожны, разрешайте только свои собственные файлы и никогда не позволяйте пользователю называть файл, который будет включен (например использование значения поля формы для выбора включенного файла).
Нет, у вас не может быть нескольких действий только в html, но вы можете использовать javascript для переключения действия в зависимости от того, какая кнопка нажата.
Я бы сделал что-то подобное (в псевдо-mootools)
<form action='default.php'>
... form elements ...
<button onclick='editButtonClick()' value='edit'/>
<button onclick='deleteButtonClick()' value='delete'/>
</form>
function editButtonClick() {
$('form').action = 'editaction.php';
$('form').submit();
}
function deleteButtonClick) {
$('form').action = 'deleteaction.php';
$('form').submit();
}
Нет, это невозможно (по крайней мере, без зависимости от JavaScript).
Отправьте в один URI и попросите процедуру отправки передать данные различным функциям в зависимости от того, какой переключатель (или что-либо еще) выбран.
Если бы я собирался это сделать, я бы передал по почте сообщение о том, что вы хотите сделать.
Затем проверьте это значение по набору функций, и каждая функция будет выполнять разные действия на основе его выбора
<input type="submit" value="Add" onclick="submitForm(this,'add')" />
<input type="submit" value="Update" onclick="submitForm(this,'update')" />
<input type="submit" value="Delete" onclick="submitForm(this,'delete')" />
var submitForm = function(context,uri)
{
form = contenxt.parent; //Go back to the form
form.action = uri; // Set the action
form.submit(); //Submit the form;
}
Java-скрипт - лучший способ справиться с этим, на самом деле нет большой альтернативы, если вы не создадите 3 единственные формы.
Опубликуйте свою форму в центральном скрипте обработчика форм. На этой странице просто используйте простую логику (в данном случае с использованием php), чтобы перенаправить пользователя на нужную вам страницу
На странице отправки вы можете вызвать CURL и указать все переменные Get или post на этот URL.