Может ли одна форма иметь несколько действий? - PullRequest
5 голосов
/ 08 июня 2010

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

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

16 голосов
/ 08 июня 2010

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

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

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.

6 голосов
/ 08 июня 2010

Возможно использование 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 ?>
4 голосов
/ 08 июня 2010

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

например:

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

header("Location: " . $page);

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

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

3 голосов
/ 08 июня 2010

Нет, вы не можете иметь несколько действий только в 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();
}
1 голос
/ 08 июня 2010

Если бы я смотрел на это, я бы пропустил пустоту того, что ты хочешь сделать, POST.

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

1 голос
/ 08 июня 2010

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

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

0 голосов
/ 08 июня 2010

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

0 голосов
/ 08 июня 2010
<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 голосов
/ 08 июня 2010

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

...