Может ли одна форма иметь несколько действий?

Я хочу отправить форму в разные места на основе выборов, сделанных в форме. Я изначально планировал отправить все в центральный файл / местоположение и определить, куда идти дальше. Тем не менее, я бы хотел обойтись без этого дополнительного шага, если бы мог.

Если пользователь хочет создавать / редактировать / удалять элементы, перейдите на страницу 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; } } 

Related of "Может ли одна форма иметь несколько действий?"

Это возможно с помощью 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

Однако вы можете изменить атрибут 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?
  • Различная форма ACTION в зависимости от нажатой кнопки
  • 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); 

(очевидно, требуется фильтрация ввода и значения по умолчанию)

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.