Я желаю отправить форму различным местам на основе выборов, сделанных в форме. Я первоначально планировал к отправить, все в центральный файл/местоположение и иметь его определяют, куда пойти затем. Однако я хотел бы обойтись без этого дополнительного шага, если я мог.
Если пользователь хочет создавать/редактировать/удалять элементы, переходят к странице 1.
Если пользователь хочет группироваться/присоединять, элементы переходят к странице 3.
Я пытаюсь записать конструктор форм. Можно создавать/редактировать/удалять формы, вопросы и ответы. У меня есть все для создания, редактирования и сделанного удаления. Те функции выполняются, не оставляя страницу, но теперь я надеюсь присваивать ответы на конкретные вопросы. Страница вопросов и страница ответов являются отдельными. Я желаю выбрать группу ответов и отправить массив Ids ответа (установленные флажки) к странице вопроса, где те Ids будут затем присвоены вопросу. Таким образом, в основном создавание, редактирование, и удаляют функции, идут, не оставляя страницу, но присваивать функция была бы выполнена на другой странице.
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 ?>
Нет , форма имеет только одно действие.
Но у вас есть варианты:
Однако вы можете изменить атрибут действия с помощью 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 не подходит для вас, вы можете рассмотреть возможность использования нескольких форм на своей странице .
Несколько форм = несколько действий
Нет проблем с клиентами с отключенным 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.
Нет, вы не можете иметь несколько действий только в 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();
}
на странице Submit вы можете вызвать CURL и передать все переменные Get или post этому url.
<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 script - лучший способ справиться с этим, альтернатив не так много, если только вы не создадите 3 единственные формы.
Если бы я смотрел на то, как это сделать, я бы передал vaule того, что вы хотите делать, с помощью POST.
Затем сравните это значение с набором функций, и каждая функция будет делать разные вещи в зависимости от своего выбора
Просто отправьте их в центральное место и используйте логику, чтобы отправить их куда-нибудь еще в зависимости от того, что они выбрали.
например:
<?php
switch($_POST['choice']) {
case 'edit':
$page = 'edit.php';
break;
case 'group':
$page = 'group.php';
break;
}
header("Location: " . $page);
(очевидно, требуется некоторая входная фильтрация и значения по умолчанию)
РЕДАКТИРОВАТЬ: как указано в Кол. Шрапнель ниже, использование header ()
для этого довольно бессмысленно, поскольку затем он уничтожит ваш массив $ _POST - вместо этого используйте include ()
, но будьте осторожны, чтобы только разрешить использование ваших собственных файлов и никогда не позволять пользователю называть файл, который будет включен (например, используя значение поля формы для выбора включаемого файла).
Нет, не может (по крайней мере, если не зависит от JavaScript).
Отправьте на один URI, и пусть процедура отправки передает данные различным функциям в зависимости от того, какой переключатель (или что-то еще) выбран.
Поместите вашу форму в центральный скрипт formhandler. На этой странице просто используйте простую логику (используя php в данном случае) для перенаправления пользователя на нужную вам страницу