Я мало что знаю о Лифте, поэтому мой ответ сосредоточен на альтернативном способе сделать это.
Это основано на jQuery и будет работать с AJAX, когда Javascript пригоден для использования, и традиционным POST, если не включена поддержка Javascript.
Форма:
<form id="ajaxform" action="formhandler.php" method="post" enctype="multipart/form-data" >
<input name="firstname" type="text" />
<input name="email" type="email" />
<input name="accept" type="submit" value="Send" />
</form>
<div id="result"></div>
JS:
примечание: jQuery $.ajax()
отправляет как application/x-www-form-urlencoded
по умолчанию, может быть также неплохо установить форму enctype="application/x-www-form-urlencoded"
.
$("#ajaxform").submit(function(e){
// Alternative way to prevent default action:
e.preventDefault();
$.ajax({
type: 'POST',
url: 'formhandler.php',
// Add method=ajax so in server side we can check if ajax is used instead of traditional post:
data: $("#ajaxform").serialize()+"&method=ajax",
success: function(data){ // formhandler.php returned some data:
// Place returned data <div id="result">here</div>
$("#result").html(data);
}
});
// Prevent default action (reposting form without ajax):
return false;
});
Серверная часть (PHP)
<?php
if (isset($_POST['method']) && $_POST['method'] == 'ajax') {
// AJAX is used this time, only #result div is updating in this case.
} else {
// Traditional POST is used to send data, whole page is reloading. Maybe send <html><head>... etc.
}
?>
А как же тогда ОТДЫХ?
Это то, что вы должны решить использовать или не использовать, это не то, что нужно поддерживать в качестве альтернативы другим методам (ajax, традиционный), а что-то более интегрируемое с другими методами.
Конечно, вы всегда можете включить или отключить функцию REST.
Вы всегда можете сделать форму method="POST/GET/PUT/DELETE"
и вызвать ajax RESTful:
...
$.ajax({
type: 'PUT',
url: 'formhandler.php',
...
...
$.ajax({
type: 'DELETE',
url: 'formhandler.php',
...
Но REST просит нас использовать XML, JSON, ... для запросов тоже
Ну, это не очень хорошо поддерживается браузерами (без Javascript), но $.ajax()
использует application/x-www-form-urlencoded
в качестве кодировки по умолчанию.
Конечно, с помощью Javascript всегда можно конвертировать контейнер данных в XML или JSON ...
Вот как это можно сделать с помощью JQuery, объекта JSON:
/* This is function that converts elements to JSON object,
* $.fn. is used to add new jQuery plugin serializeObject() */
$.fn.serializeObject = function()
{
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
Но я хочу один AJAX-вызов, который сделает все:
Вы правы, компьютеры должны делать нашу работу. Это то, для чего они предназначены.
Итак, еще одна вещь, которую нужно сделать, это проверить, какой метод http хочет использовать наша оригинальная html-форма, и адаптировать его для отправки ajax-запросов тем же методом, который будет использоваться без поддержки javascript .
Это модифицированная версия из-под JS: заголовок, использованный ранее:
...
// Alternative way to prevent default action:
e.preventDefault();
// Find out what is method that form wants to use and clone it:
var restmethod = $('#ajaxform').attr('method');
// Put form data inside JSON object:
var data = $('#orderform').serializeObject();
// Add method=ajax so in server side we can check if ajax is used instead of traditional post:
data.method = 'ajax';
$.ajax({
type: restmethod, // Use method="delete" for ajax if so defined in <form ...>
url: 'formhandler.php',
data: data, // data is already serialized as JSON object
...
Теперь наш обработчик AJAX отправляет данные в виде объекта JSON, используя метод (post | get | put | delete), который определен в <form method="put" ...>
, если метод формы изменяется, тогда наш обработчик ajax также адаптирует изменения.
Вот и все, часть кода проверена и фактически используется, часть вообще не проверена, но должна работать.