Среда, 22.07.2026, 11:25
Приветствую Вас Гость

Меню сайта
Web-программирование
Категории раздела
Наш опрос
Какой браузер Вы используете?
Всего ответов: 1423
Статистика

Анализ веб сайтов
Главная » Статьи » Статьи o JavaScript

CodeIgniter + AJAX. Проверка данных форм без перезагрузки страниц

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

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

Давайте немного порассуждаем. Чем отличается ajax запрос от обычного запроса?

1) Ajax запрос можно выполнить только с помощью JavaScript.

2) Ответом сервера на обычный запрос должна быть html страница, а на ajax запрос – фрагмент данных (с разметкой или без нее).

Отсюда вывод. Чтобы добавить поддержку ajax нужно в клиентскойчасти написать JavaScript функцию, которая прочтет данные из формы, отправит запрос и обработает ответ сервера, а в серверной части – изменить возвращаемые значения.

Примечание. Чтобы немного упростить себе жизнь, мы будем использовать библиотеку prototype для отправки запросов и обновления страницы.

Переходим к нашему примеру. Как вы помните, в прошлый раз мы создали форму с тремя полями для ввода личных данных пользователя (ник, полное имя, адрес email).

В этот раз мы используем эту же форму, только немного изменим html разметку.

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
  3. <head>
  4. <title>Проверка введенных данных</title>
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  6. <script type="text/javascript" src="prototype.js"></script>
  7. <script type="text/javascript" src="scripts.js"></script>
  8. </head>
  9.  
  10. <body>
  11.  echo form_open('#')?>
  12. <div id="status"></div>
  13. <div id="nic_err"></div>
  14. <p>Ник: <input type="text" name="usernic" id="usernic" value="" /></p>
  15. <div id="name_err"></div>
  16. <p>Полное имя: <input type="text" name="fullname" id="fullname" value="" /></p>
  17. <div id="email_err"></div>
  18. <p>eMail: <input type="text" name="usermail" id="usermail" value="" /></p>
  19. <p><input type="button" id="sendbtn" value="Отправить" onclick="sendData('".base_url()."'"; ?>)" /></p>
  20. </form>
  21. </body>
  22. </html>

Прежде всего, перед каждым полем мы добавили блоки для отображения сообщений об ошибках (теги <div> в строках …). Сами сообщения мы будет вставлять с помощью JS.

Второе изменение коснулось кнопки «Отправить». Теперь она имеет типbutton, а не submit и обработчик события onclick, который вызывает функцию отправки данных (sendData).

Сама функция sendData находится в файле scripts.js, который мы подключили в заголовке страницы вместе с библиотекой prototype (строки 6, 7).

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

С отправкой данных все довольно просто. Нужно сформировать строку с параметрами обычного POST запроса.

А вот формат результатов обработки гораздо интереснее. Страница нашей формой содержит четыре блока, в которые могут быть вставлены описания ошибок. Удобнее всего вставлять эти данные, если содержимое каждого из полей находится в отдельных переменных (ячейках массива или структуре).

Т.е. нам нужно получить данные в формате, который мы сможем легкопреобразовать в набор переменных. Идеально для этой цели подходит JSON.

Примечание. Подробнее почитать об этом формате можно в статье «Передача данных с помощью JSON».

Главное преимущество заключается в том, что и JavaScript и PHPсодержат функции для преобразования данных в этот формат и обратно.

Таким образом, наша функция sendData будет примет такой вид.

  1. function sendData(baseURL) {
  2.     //читаем данные из формы
  3.     var n = $('usernic').value;
  4.     var fn = $('fullname').value;
  5.     var e = $('usermail').value;
  6.     //формируем строку с параметрами запроса
  7.     var pars = $H({usernic:n, fullname:fn, usermail:e}).toQueryString();
  8.     //отправляем ajax запрос
  9.     new Ajax.Request(baseURL + "index.php/main/checkdata_ajax",
  10.         {method:"post", parameters:pars, onSuccess:parseResponse});
  11. }

В параметре функции мы передаем адрес сервера. А в строках с 3-7 мыформируем строку с параметрами.

После этого мы отправляем запрос. Ответ сервера передается функцииparseResponse, которая указана в параметре onSuccess запроса.

Теперь рассмотрим функцию parseResponse.

  1. function parseResponse(transport) {
  2.     var data = eval('(' + transport.responseText + ')');
  3.     //ошибок не было
  4.     if (data.status == "OK") {
  5.         $('status').innerHTML = "Данные сохранены";
  6.         //убираем сообщение об ошибках, если они остались после
  7.         //предыдущей попытки
  8.         $('nic_err').innerHTML = "";
  9.         $('name_err').innerHTML = "";
  10.         $('email_err').innerHTML = "";
  11.     }
  12.     //ошибки были, показываем их описание
  13.     else {
  14.         $('status').innerHTML = "Пожалуйста, проверьте введенные данные";
  15.         $('nic_err').innerHTML = data.nic_err;
  16.         $('name_err').innerHTML = data.name_err;
  17.         $('email_err').innerHTML = data.email_err;
  18.     }
  19. }

Во второй строке мы преобразуем строку в формате JSON в структуру данных с именем data (с помощью функции eval).

Наша структура данных имеет такие поля:
status – результат обработки (может принимать два значения: «OK» и «ERR»);
nic_err – описание ошибки в поле «ник»;
name_err – описание ошибки в поле «полное имя»;
email_err – описание ошибки в поле «email».

В строке 4 мы проверяем поле data.status и в зависимости от результатов либо вставляем описание ошибок, либо убираем их.

Теперь рассмотрим серверный скрипт (checkdata_ajax), который должен находится внутри контроллера (main.php).

  1. function checkdata_ajax() {
  2.     $this->load->library('validation');
  3.  
  4.     $rules['usernic'] = "required|min_length[3]|checknic";
  5.     $rules['fullname'] = "required";
  6.     $rules['usermail'] = "required|valid_email";
  7.  
  8.     $this->validation->set_rules($rules);
  9.  
  10.     $fields['usernic'] = "ник";
  11.     $fields['fullname'] = "полное имя";
  12.     $fields['usermail'] = "адрес email";
  13.  
  14.     $this->validation->set_fields($fields);
  15.  
  16.     if ($this->validation->run() == TRUE) {
  17.         //сохраняем введенные данные (например, в БД)
  18.         //……….
  19.         //отправляем браузеру результаты обработки
  20.         $res['status'] = "OK";
  21.     }
  22.     else {
  23.         $res['status'] = "ERR";
  24.         $res['nic_err'] = $this->validation->usernic_error;
  25.         $res['name_err'] = $this->validation->fullname_error;
  26.         $res['email_err'] = $this->validation->usermail_error;
  27.     }
  28.     echo json_encode($res);
  29. }

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

Отличие от предыдущего примера заключается в том, что в этот раз мы не отправляем браузеру страницу, а формируем массив с результатами обработки, преобразовываем его в формат JSON и отправляембраузеру.

Примечание. На основе имен ключей в массиве будет создаваться структура данных в функции parseResponse.

Как видите, добавление поддержки ajax не требует значительных усилий. В чем-то она даже проще классического варианта. Например, нам не нужно заполнять поля формы предыдущими значениями, т.к. введенные значения никуда не денутся (ведь мы все время находимся на одной и той же странице). Главный недостаток – это необходимость написания JavaScript кода, который может быть довольно сложным.

Категория: Статьи o JavaScript | Добавил: Rammstein (11.06.2010)
Просмотров: 3691 | Комментарии: 1 | Рейтинг: 3.4/10
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Реклама
Поиск
Друзья сайта
Топ100- Веб-дизайн free counters