Я хочу отправить форму в разные места на основе выборов, сделанных в форме. Я изначально планировал отправить все в центральный файл / местоположение и определить, куда идти дальше. Тем не менее, я бы хотел обойтись без этого дополнительного шага, если бы мог.
Если пользователь хочет создавать / редактировать / удалять элементы, перейдите на страницу 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; } }
Это возможно с помощью 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 ?>
Нет , форма имеет только одно действие.
Но у вас есть варианты:
Однако вы можете изменить атрибут action с помощью 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 не является для вас вариантом, вы можете рассмотреть несколько форм на своей странице.
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);
(очевидно, требуется фильтрация ввода и значения по умолчанию)
EDIT: как указано Col. Shrapnel ниже, использование header()
для этого довольно бессмысленно, так как оно уничтожит ваш массив $ _POST – используйте include()
вместо этого, но будьте осторожны, чтобы разрешать только ваши собственные файлы и никогда не позволять имя пользователя – файл, который будет включен (например, с помощью значения поля формы, чтобы выбрать файл, который включен).
Нет, вы не можете иметь несколько действий только в html, но вы можете использовать javascript для переключения действия в зависимости от того, какая кнопка нажата.
Я бы сделал что-то вроде этого (в псевдомодулях)
<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 и попросите диспетчерский режим передать данные в разные функции, в зависимости от того, какой переключатель (или что-то еще) выбран.
Если бы я смотрел на это, я бы прошел мимо того, что вы хотите делать POST.
Затем проверьте это значение на набор функций, и каждая функция будет делать другую вещь на основе выбора
<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.