Разработка web приложений. Как сделать редактор списка в стиле Web 2.0 (удаление записей)

9 января, 2008

Скриншот WebListEditor
Это пятая часть цикла статей о создании web приложения, использующего технологию Ajax для редактирования списка.
В предыдущих статьях мы рассмотрели:
структуру приложения;
создание главной страницы;
добавление новых записей;
и редактирование записей.

Примечание. Вы можете посмотреть демонстрационную версию редактора или скачать архив с файлами проекта.

Теперь добавим возможность удаления записей.
Чтобы удалить запись, пользователю нужно нажать на ссылку с изображением крестика после соответствующей записи. При этом будет вызвана функция deleteItem(), которой в качестве параметра передается id записи в БД.

Рассмотрим, как работает эта функция.

  1. function deleteItem(id) {
  2.     var pars = $H({itemid:id}).toQueryString();
  3.     new Ajax.Request(
  4.         "scripts/delete.php",
  5.         {method:"post", parameters:pars,
  6.         onSuccess:function(transport) {
  7.             var data = eval('(' + transport.responseText + ')');
  8.             //удаляем элемент из списка
  9.             var listElem = $('itemId_' + data.deletedId).parentNode.getAttribute('id');
  10.             Element.remove(listElem);
  11.             var listNum = listElem.substring(8);
  12.             //обновляем номера у всех остальных записей
  13.             var nodes = $$('#list li');
  14.             nodes.each(
  15.                 function(node, index) {
  16.                     if (index >= listNum) {
  17.                         node.setAttribute('id', 'listNum_' + index);
  18.                         var innerNodes = $A(node.getElementsByTagName('div'));
  19.                         innerNodes[0].innerHTML = index + 1;
  20.                         innerNodes[1].setAttribute("onclick", "closeOtherEditors(" + index + ")");
  21.                     }
  22.                 }
  23.             );
  24.             //удаляем редактор из массива
  25.             editors.splice(listNum,1);
  26.         }}
  27.     );
  28. }

В строках 2, 3 мы формируем строку с параметрами и выполняем Ajax запрос. В данном случае вызывается скрипт delete.php.

Если вызов прошел успешно, то будет выполнена анонимная функция, объявленная в параметре onSuccess запроса.

В этой функции последовательно выполняем следующие операции:
1) определяем id удаленного элемента (строка 7);
2) определяем элемент списка (тег <li>), в котором находится удаленный элемент (строка 9);
3) удаляем найденный элемент списка (строка 10);
4) определяем порядковый номер удаленного элемента (он не совпадает с id) (строка 11);
5) обновляем порядковые номера у всех оставшихся элементов списка (строки 13-23);
6) удаляем редактор из массива editors (строка 25).

Как видите, код довольно громоздкий, но не сложный.

Единственное на что, хотелось бы обратить ваше внимание, это строка 18. В ней с помощью функции $A() мы создаем массив всех блоков (теги <div>), которые находятся внутри текущего элемента списка. После этого мы изменяем их параметры (строки 19, 20).

Теперь рассмотрим, скрипт delete.php, который удаляет указанную запись из БД.

  1. require_once("dbdata.php");
  2.  
  3. $id = null;
  4. $id = $_POST['itemid'];
  5. if (($id != null) &amp;&amp; ($id > 0)) {
  6.     //удаляем запись в БД
  7.     $con = connect();
  8.     $updateQuery = sprintf("DELETE FROM listitems WHERE id=%d",
  9.                         mysql_real_escape_string($id));
  10.     if (mysql_query($updateQuery)) {
  11.         $results['deletedId'] = $id;
  12.     }
  13.     else {
  14.         $results['error_mes'] = "Не могу обновить запись: ".mysql_error();
  15.     }
  16. }
  17. if ($con != null) {
  18.     mysql_close($con);
  19. }
  20. echo json_encode($results);

Как видите, этот скрипт очень похож на скрипты обновления и удаления записей, описанных ранее. Поэтому я остановлюсь только на особенностях.

Прежде всего, обратите внимание на запрос (строка 8) и использование функции mysql_real_escape_string, которая позволяет предотвратить атаки типа SQL Injection.
Принцип ее работы заключается в том, что она экранирует служебные символы SQL.

В результате выполнения скрипта будут возвращена строка в формате JSON, содержащая id удаленного элемента или сообщение об ошибке.

Примечание. Подробнее об использовании формата JSON можно почитать в статьях Передача данных с помощью JSON и Использование JSON в web приложениях.

В принципе, на данном этапе реализованы все функции нашего приложения.
В следующий раз мы рассмотрим установку и настройку приложения, а также изменим внешний вид списка с помощью таблицы стилей (CSS).

Интересно почитать

Входные металлические двери высокого и современного качества ТЕПЕРЬ по доступным ценам!!!

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в Ajax, JavaScript, PHP Комментарии (5) »

]]>

Комментарии (5)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

]]>
  1. tenshi

    почему "обновить" является кнопкой, "отменить" – ссылкой, а "удалить" – никак не реагирующей иконкой?

    ps:
    http://adsbb.com/free_image_hosting/1199885102.gif

  2. >> почему “обновить” является кнопкой,
    >> “отменить” – ссылкой

    В этом примере используется готовый компонент (InPlaceEditor) из библиотеки Scriptaculous, который при активации вставляет форму с текстовым полем (input type="text"), кнопкой "Сохранить"(input type="submit") и ссылкой "Отмена" (ее можно убрать в настройках). Это в, общем-то, обычное решение.

    Если есть желание, с помощью CSS можно сделать кнопку практически неотличимой от ссылки.

    >> “удалить” – никак не реагирующей иконкой
    Странно. Вообще это ссылка с картинкой вместо текста. И я проверял работоспособность в IE6,7, Firefox и Opera. Все нормально работает (должен быть включен JavaScript, т.к. отправляется Ajax запрос).
    Если не сложно, скажите, каким браузером вы пользовались?

    >> ps
    В дизайне сайта используются рисунки и счетчики (их изображения загружаются с других серверов), поэтому страница появляется частями. Причем, порядок появления частей зависит от браузера и скорости соединения.
    Кстати, на скриншоте прорисовка явно остановилась на счетчике bigmir'а.

  3. Revan

    У меня возникает проблема с запросами когда я редктирую, удаляю или добавляю запись у меня выдаёт ошибку "Память не может быть прочитана" кто нибуть может сказать в чём здесь проблема?

  4. Сдаем помещение под устройство автомойки, автосервиса, склада, отдельно стоящее здание в нем кафе и магазин, САО 8-905-756-40-37 Надежда

]]>

Оставить комментарий

* - обязательные для заполнения поля

]]>