![]()
Это третья часть цикла статей о создании web приложения, использующего технологию Ajax для редактирования списка.
В прошлых частях мы разобрали общую структуру приложения, работу с базой данных и структуру его основной страницы.
Примечание. Вы можете посмотреть демонстрационную версию редактора или скачать архив с файлами проекта.
Как вы, наверное, помните, внизу страницы размещена форма добавления новых записей в список. Разберем подробнее как реализовано создание новых записей.
Когда посетитель нажимает кнопку «Добавить», выполняется вызов функции addItem(), размещенной в файле tasks.js. Посмотрите на ее код:
function addItem() {
//читаем введенное в форму значение
var v = $('item_value').value;
//формируем строку с параметрами запроса
var pars = $H({value:v}).toQueryString();
//выполняем запрос
new Ajax.Request(
"scripts/additem.php",
{method:"post", parameters:pars, onSuccess:parseAddItemResponse}
);
}
В строках 3 и 5 мы читаем текст, введенный в текстовое поле, и формируем строку с запроса. Код получился предельно короткий за счет использования библиотеки Prototype.
После этого выполняем Ajax запрос с помощью функции Request() объекта Ajax. В первом параметре этой функции мы указываем имя скрипта, который добавляет запись в БД. А во втором – параметры запроса:
method – метод отправки запроса;
parameters – сформированный ранее массив с параметрами (в данном случае, параметр только один – текст записи);
onSuccess – имя функции, которая будет вызвана после получения ответа от серверного скрипта.
Работу этой функции стоит разобрать подробнее, но вначале посмотрим, как работает additem.php.
require_once("dbdata.php");
$value = null;
$value = $_POST['value'];
$results = array();
if ($value != null && $value != "") {
$value = htmlspecialchars($value);
//добавляем запись в БД
$con = connect();
$addQuery = sprintf("INSERT INTO listitems(item) VALUES('%s')",
mysql_real_escape_string($value));
if (mysql_query($addQuery)) {
$results['id'] = mysql_insert_id();
$results['value'] = $value;
}
else {
$results['error_mes'] = "Не могу добавить запись: ".mysql_error();
}
}
else {
$results['error_mes'] = 'Не задано значение записи';
}
if ($con != null) {
mysql_close($con);
}
echo json_encode($results);
В строках 4,5 мы получаем текст записи из массива $_POST, и начинаем формировать массив с результатами.
Если в процессе работы скрипта возникают ошибки, мы создаем в массиве $results элемент error_mes и присваиваем ему описание ошибки.
После проверки текста записи мы с помощью функции htmlspecialchars преобразуем все специальные символы html в соответствующие эскейп последовательности. Эта простая операция позволяет сохранить дизайн страницы в нормальном состоянии 🙂 .
После этого, мы подключаемся к БД (строка 9) и формируем запрос. Для предотвращения SQL Injection используется функция mysql_real_escape_string.
Если запрос выполнен успешно, получаем id добавленной записи (функция mysql_insert_id) и формируем массив с результатами.
Перед отправкой результата мы преобразуем его в формат JSON (строка 26).
Примечание. Об использовании этого формата можно почитать в статьях Передача данных с помощью JSON и Использование JSON в web приложениях.
Теперь, когда с серверной частью разобрались, возвращаемся к функции parseAddItemResponse. Напомню, она вызывается автоматически после получения ответа от сервера.
function parseAddItemResponse(transport) {
var data = eval('(' + transport.responseText + ')');
//проверяем были ли ошибки
if (data.error_mes == null) {
//удаляем сообщение об ошибке (если оно осталось после
//предыдущего вызова)
var errMes = $('err_mes');
if (errMes != null) {
Element.remove(errMes);
}
//удаляем строку "нет записей" (если она есть)
var noItems = $('noItems');
if (noItems != null) {
Element.remove(noItems);
}
//вставляем полученный результат в конец списка
var list = $('list');
if (list == null) {
var content = $('content');
var newItem = new Insertion.Bottom(content, "<ul id=\"list\"></ul>");
list = $('list');
}
//вставляем новый элемент в конец списка
new Insertion.Bottom(list,
"<li id='listNum_" + (editors.length) + "'><div class='itemNum'>" +
(editors.length + 1) + "</div>" +
"<div class='itemValue' " +
"onclick='closeOtherEditors(" + editors.length +
")' id='itemId_" + data.id + "'>" +
data.value + "</div>" +
"<a href='#' class='deleteLink' onclick='deleteItem(" +
data.id + ")'><img src='css/images/delete.gif'" +
"alt='Удалить' title='Удалить' /></a></li>");
//создаем редактор для нового элемента и добавляем его в массив
editors.push(addEditor("itemId_" + data.id, data.id));
//подсвечиваем вставленный элемент
var items = $$('#list li');
new Effect.Highlight(items.last(),
{startcolor:"#FDFFB9", endcolor:"#FFFFFF", duration:2.0});
}
else {
//выводим сообщение об ошибке
var form = $('add_item_form');
new Insertion.After(form, "<div id=\"err_mes\">" +
data.error_mes + "</div>");
}
}
В параметре transport передается ответ сервера. С помощью функции eval() мы преобразуем строку с результатами в массив.
В строке 4 выполняем проверку на наличие ошибок, и если они были, выводим их описание (строки 41-46).
Если запись была успешно добавлена, начинаем формировать список с результатами. Прежде всего, удаляем сообщение об ошибке, если оно осталось после предыдущего вызова (строки 7-10). Затем создаем список, если он еще не создан (строки 17-22). После этого вставляем новый элемент внутрь списка (строки 24-33).
Естественно, при вставке нового элемента в список, мы должны сформировать такую же разметку, как и в файле index.php. Для определения порядкового номера элемента в списке мы используем параметр length массива editors, т.к. его длина всегда совпадает с количеством элементов в списке.
Добавление новых элементов на страницу выполняется функцией Insertion.Bottom(), которая вставляет текст, указанный во втором параметре, в конец элемента, заданного в первом параметре.
Удаление выполняем с помощью функции Element.remove(), которая удаляет элемент, указанный в ее первом параметре.
В строке 35 создаем встраиваемый редактор для нового элемента и добавляем его в массив editors.
После этого подсвечиваем вставленный элемент (строки 38, 39).
Подведем промежуточный итог. Добавление новой записи осуществляется в следующем порядке:
1) функция addItem() выполняет Ajax запрос;
2) скрипт additem.php принимает этот запрос и добавляет запись в БД;
3) функция parseAddItemResponse добавляет созданную запись на страницу.
В следующий раз мы рассмотрим редактирование существующих записей списка.
Интересно почитать
Владивосток авто предлагает новые автомобили по доступным ценам
Продажа дачных участков в подмосковье — быстрый способ заработать
Успешная карьера — залог хорошего настроения


