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


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

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

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 ?>
 6
Author: Your Common Sense, 2014-07-05 19:31:44

Нет, форма имеет только одно действие.

Но у вас есть варианты:

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 не подходит для вас, вы можете рассмотреть несколько форм на своей странице.

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.

 16
Author: marapet, 2017-05-23 11:53:53

Просто отправьте их в центральное местоположение и используйте логику, чтобы отправить их куда-нибудь еще в зависимости от того, что они выбрали.

Например:

<?php
switch($_POST['choice']) {
    case 'edit':
        $page = 'edit.php';
        break;
    case 'group':
        $page = 'group.php';
        break;
}

header("Location: " . $page);

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

РЕДАКТИРОВАТЬ: как указано полковником. Шрапнель ниже, использование header() для этого довольно бессмысленно, так как затем он уничтожит ваш массив $_POST - вместо этого используйте include(), но будьте осторожны, разрешайте только свои собственные файлы и никогда не позволяйте пользователю называть файл, который будет включен (например использование значения поля формы для выбора включенного файла).

 4
Author: Matt Andrews, 2010-06-08 12:02:57

Нет, у вас не может быть нескольких действий только в 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();
}
 3
Author: Nathan, 2010-06-08 11:32:56

Нет, это невозможно (по крайней мере, без зависимости от JavaScript).

Отправьте в один URI и попросите процедуру отправки передать данные различным функциям в зависимости от того, какой переключатель (или что-либо еще) выбран.

 1
Author: Quentin, 2010-06-08 11:28:47

Если бы я собирался это сделать, я бы передал по почте сообщение о том, что вы хотите сделать.

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

 1
Author: Chris Crew, 2010-06-08 11:31:07
<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 единственные формы.

 0
Author: RobertPitt, 2010-06-08 13:13:23

Опубликуйте свою форму в центральном скрипте обработчика форм. На этой странице просто используйте простую логику (в данном случае с использованием php), чтобы перенаправить пользователя на нужную вам страницу

 0
Author: RichW, 2010-06-08 14:01:26

На странице отправки вы можете вызвать CURL и указать все переменные Get или post на этот URL.

 -1
Author: Ajay Singh Rathore, 2010-06-08 12:43:53