]]>
ваш баннер
]]>

PHP framework CodeIgniter. Проверка данных из форм

10 февраля, 2008

Проверка данных форм

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

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

Практически каждый фрэймворк предлагает свое решение этой задачи. И CodeIgniter тут не исключение. Возможно, его решение не идеальное, но, тем не менее, достаточно эффективное и удобное в использовании.

Рассмотрим небольшой пример. Допустим, у нас есть страница (userdata) с формой, содержащей поля для ввода личных данных. Если посетитель правильно заполнил форму, мы должны отправить его на главную страницу сайта (index). Если были допущены ошибки – показать их описание и предложить заполнить форму еще раз.

Естественно, доступ к обеим страницам осуществляется через контроллер, а их адреса выглядят так: www.site.com/index.php/main/index и www.site.com/index.php/main/userform.

Примечание. Подробнее почитать о навигации в CodeIgniter можно в статье «CodeIgniter: контроллер и представления».
Т.е. на данном этапе контроллер выглядит так:

Code (php)
  1. class Main extends Controller {
  2.  
  3.  function Main()
  4.  
  5.  {
  6.  
  7.     parent::Controller();
  8.  
  9.  }
  10.  
  11.  function index()
  12.  
  13.  {
  14.  
  15.     $this->load->view(‘index’);
  16.  
  17.  }
  18.  
  19.  function userdata() {
  20.  
  21.     $this->load->view(‘userdata’);
  22.  
  23.  }
  24.  
  25. }

Добавляем в контроллер метод, который будет выполнять проверку данных:

Code (php)
  1. function checkdata() {
  2.  
  3.  $this->load->library(‘validation’);
  4.  
  5. }

На данном этапе этот метод только загружает встроенную библиотеку ‘validation‘, которая и будет выполнять проверку.

Теперь рассмотрим саму форму:

Code (php)
  1. <?php echo form_open(‘main/checkdata’); ?>
  2.  
  3. <p>Ник: <input type="text" name="usernic" id="usernic" /></p>
  4.  
  5. <p>Полное имя: <input type="text" name="fullname" id="fullname" /></p>
  6.  
  7. <p>eMail: <input type="text" name="usermail" id="usermail" /></p>
  8.  
  9. <p><input type="submit" id="sendbtn" value="Отправить" /></p>
  10.  
  11. </form>

Сразу обратите внимание первую строку. Здесь для создания открывающего формы использована функция form_open. Главное преимущество от использования этой функции в том, что она формирует ссылку в параметре action. Ссылка составляется из трех частей: значений переменных $config['base_url'] и $config['index_page'], которые задаются в файле /application/config/config.php, и параметра функции (в котором мы передали имена контроллера и метода, выполняющего обработку).

Примечание. Для использования form_open необходимо загрузить Form Helper

Code (php)
  1. $this->load->helper(‘form’);

Сама форма содержит три поля, в которые посетитель должен ввести свои данные (ник, полное имя и адрес почты). После нажатия на кнопку «Отправить» данные отсылаются на URL www.site.com/index.php/main/checkdata. По-умолчанию, отправка осуществляется методом POST.

Теперь переходим непосредственно к проверке.

Принцип работы библиотеки validation следующий. Вы создаете правила для каждого поля формы, а затем выполняете проверку соответствия полученных значений этим правилам.

Посмотрим, как это будет выглядеть для нашего примера.

Code (php)
  1. function checkdata() {
  2.  
  3.  $this->load->library(‘validation’);    $rules[‘usernic’] = "trim|required|min_length[3]";
  4.  
  5.  $rules[‘fullname’] = "trim|required";
  6.  
  7.  $rules[‘usermail’] = "trim|required|valid_email";
  8.  
  9. $this->validation->set_rules($rules);
  10.  
  11. if ($this->validation->run() === TRUE) {
  12.  
  13.     //сохраняем введенные данные (например, в БД)
  14.  
  15.     //……….
  16.  
  17.     //отправляем пользователя на главную страницу
  18.  
  19.     $this->load->view(‘index’);
  20.  
  21.  }
  22.  
  23.  else {
  24.  
  25.     $this->load->helper(‘form’);
  26.  
  27.     $this->load->view(‘userdata’);
  28.  
  29.  }
  30.  
  31. }

В строках 4-6 мы объявили массив с правилами. Ключи массива должны иметь такие же названия, как и поля формы (совпадать с аттрибутом name), а значения – это просто строки с перечнем правил, которые будут применяться к полю (в качестве разделителя используется «|»).

Теперь рассмотрим правила, которые мы использовали:
trim – удаляет пробелы в начале и конце полученной строки;
required – указывает, что поле должно быть заполнено;
min_length[3] – указывает, что длина полученного значения должна быть не меньше 3;
valid_email – указывает, что полученное значение должно быть адресом eMail.

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

В строке 8 с помощью метода set_rules мы устанавливаем правила, а в строке 10 – выполняем проверку (метод run).

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

В принципе, на данном этапе мы уже выполнили проверку. Но если посетитель допустит ошибку, то он не будет знать, в чем она заключается.

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

Для решения этих задач нужно выполнить две операции.

1) В контроллере с помощью метода set_fields указать поля, информация о которых нам нужна:

Code (php)
  1. $fields[‘usernic’] = "ник";
  2.  
  3. $fields[‘fullname’] = "полное имя";
  4.  
  5. $fields[‘usermail’] = "адрес email";$this->validation->set_fields($fields);

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

2) В представлении (userdata.php) вывести сообщения об ошибках и задать значения для правильно заполненных полей.

Code (php)
  1. <?php echo form_open(‘main/checkdata’); ?>
  2.  
  3. <p>
  4.  
  5. <?php echo $this->validation->usernic_error; ?>
  6.  
  7. Ник: <input type="text" name="usernic" id="usernic"
  8.  
  9. value="<?php echo $this->validation->usernic; ?>" /></p>
  10.  
  11. <p>
  12.  
  13. <?php echo $this->validation->fullname_error; ?>
  14.  
  15. Полное имя: <input type="text" name="fullname" id="fullname"
  16.  
  17. value="<?php echo $this->validation->fullname; ?>" /></p>
  18.  
  19. <p>
  20.  
  21. <?php echo $this->validation->usermail_error; ?>
  22.  
  23. eMail: <input type="text" name="usermail" id="usermail"
  24.  
  25. value="<?php echo $this->validation->usermail; ?>" /></p>
  26.  
  27. <p><input type="submit" id="sendbtn" value="Отправить" /></p>
  28.  
  29. </form>

Как видите, перед каждым полем мы добавили:

Code (php)
  1. echo $this->validation->имяполя_error;

Эти переменные создает CodeIdniter. Если поле заполнено правильно, то переменная будет содержать пустую строку и посетитель ничего не увидит.
Переменные $this->validation->имя_поля содержат введенные значения. Таким образом, присваивая их атрибуту value, мы заполняем поля предыдущими значениями.

Примечание. Для того, чтобы при первоначальном появлении формы не появлялись сообщения об ошибках, поля должны быть установлены во всех методах контроллера, которые будут отображать форму. В нашем случае это userdata и checkdata.

Примечание. Описание ошибок по-умолчанию отображаются на английском языке. Но, естественно, это несложно исправить, т.к. для стандартных библиотек фрэймворка существуют уже готовые файлы переводов. Подробнее об этом можно почитать в статье «Создание многоязычных сайтов с помощью CodeIgniter».

Создание собственных правил.

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

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

Естественно, стандартные правила проверки тут нам не помогут, поэтому мы должны написать собственный метод для проверки.

Посмотрим, как этот метод может выглядеть:

Code (php)
  1. function checknic($nic) {
  2.  
  3.  //тут должен быть запрос к БД, который ищет
  4.  
  5.  //пользователя с именем $nic.
  6.  
  7.  //……..
  8.  
  9.  //если пользователь найден
  10.  
  11.  if ($nic_exists === TRUE) {
  12.  
  13.     $this->validation->set_message(‘checknic’,
  14.  
  15.        ‘Пользователь с таким ником уже существует’);
  16.  
  17.     return false;
  18.  
  19.  }
  20.  
  21.  else {
  22.  
  23.     return true;
  24.  
  25.  }
  26.  
  27. }

Как видите, этот метод должен возвращать true в случае успешной проверки и false – если найдена ошибка (в данном случае ошибкой считается совпадение ника с уже существующим).

После этого, мы можем использовать имя этого метода (с приставкой callback_) в качестве правила.

Code (php)
  1. $rules[‘usernic’] = "required|min_length[3]|callback_checknic";

Теперь соберем все вместе.
Контроллер (main.php):

Code (php)
  1. class Main extends Controller { function Main()
  2.  
  3.  {
  4.  
  5.     parent::Controller();
  6.  
  7.  }
  8.  
  9. function index()
  10.  
  11.  {
  12.  
  13.     $this->load->view(‘index’);
  14.  
  15.  }
  16.  
  17. function userdata() {
  18.  
  19.     $this->load->library(‘validation’);
  20.  
  21. $fields[‘usernic’] = "ник";
  22.  
  23.     $fields[‘fullname’] = "полное имя";
  24.  
  25.     $fields[‘usermail’] = "адрес email";
  26.  
  27. $this->validation->set_fields($fields);
  28.  
  29. $this->load->helper(‘form’);
  30.  
  31.     $this->load->view(‘userdata’);
  32.  
  33.  }
  34.  
  35. function checkdata() {
  36.  
  37.     $this->load->library(‘validation’);
  38.  
  39. $rules[‘usernic’] = "required|min_length[3]|callback_checknic";
  40.  
  41.     $rules[‘fullname’] = "required";
  42.  
  43.     $rules[‘usermail’] = "required|valid_email";
  44.  
  45. $this->validation->set_rules($rules);
  46.  
  47. $fields[‘usernic’] = "ник";
  48.  
  49.     $fields[‘fullname’] = "полное имя";
  50.  
  51.     $fields[‘usermail’] = "адрес email";
  52.  
  53. $this->validation->set_fields($fields);
  54.  
  55. if ($this->validation->run() == TRUE) {
  56.  
  57.        //сохраняем введенные данные (например, в БД)
  58.  
  59.        //……….
  60.  
  61.        //отправляем пользователя на главную страницу
  62.  
  63.        $this->load->view(‘index’);
  64.  
  65.     }
  66.  
  67.     else {
  68.  
  69.        $this->load->helper(‘form’);
  70.  
  71.        $this->load->view(‘userdata’);
  72.  
  73.     }
  74.  
  75.  }
  76.  
  77. function checknic($nic) {
  78.  
  79.     //тут должен быть запрос к БД, который ищет
  80.  
  81.     //пользователя с именем $nic.
  82.  
  83.     //……..
  84.  
  85.     //если пользователь найден
  86.  
  87.     if ($nic_exists === TRUE) {
  88.  
  89.        $this->validation->set_message(‘checknic’,
  90.  
  91.           ‘Пользователь с таким ником уже существует’);
  92.  
  93.        return false;
  94.  
  95.     }
  96.  
  97.     else {
  98.  
  99.        return true;
  100.  
  101.     }
  102.  
  103.  }
  104.  
  105. }

Страница с формой (userdata.php):

Code (php)
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
  4.  
  5. <head>
  6.  
  7. <title>Проверка введенных данных</title>
  8.  
  9. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  10.  
  11. </head><body>
  12.  
  13. <?php echo form_open(‘main/checkdata’); ?>
  14.  
  15. <p>
  16.  
  17. <?php echo $this->validation->usernic_error; ?>
  18.  
  19. Ник: <input type="text" name="usernic" id="usernic"
  20.  
  21. value="<?php echo $this->validation->usernic; ?>" /></p>
  22.  
  23. <p>
  24.  
  25. <?php echo $this->validation->fullname_error; ?>
  26.  
  27. Полное имя: <input type="text" name="fullname" id="fullname"
  28.  
  29. value="<?php echo $this->validation->fullname; ?>" /></p>
  30.  
  31. <p>
  32.  
  33. <?php echo $this->validation->usermail_error; ?>
  34.  
  35. eMail: <input type="text" name="usermail" id="usermail"
  36.  
  37. value="<?php echo $this->validation->usermail; ?>" /></p>
  38.  
  39. <p><input type="submit" id="sendbtn" value="Отправить" /></p>
  40.  
  41. </form>
  42.  
  43. </body>
  44.  
  45. </html>

Главная страница сайта (index.php):

Code (php)
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
  4.  
  5. <head>
  6.  
  7. <title>Проверка введенных данных</title>
  8.  
  9. <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
  10.  
  11. </head>
  12.  
  13. <body>
  14.  
  15. <p><?php echo anchor(‘main/userdata’, ‘Ввод персональных данных’); ?></p>
  16.  
  17. </body>
  18.  
  19. </html>

Как видите, пользоваться библиотекой довольно просто.

В следующий раз как выполнить эти же проверки с помощью ajax.

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

]]>

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

]]>

Опубликовано в CodeIgniter, PHP

]]>

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

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

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

  1. aleXoid 28.04.2008 в 17:04 (Ответить)

    Одна небольшая поправка -
    функцию проверки следует назвать “checknic”, а ее вызов в
    $rules[‘usernic’] = “…|callback_checknic”

    Т.е. наоборот.

    1. Владимир 28.04.2008 в 17:30 (Ответить)

      Спасибо большое! Уже исправил.
      Кстати, работают оба варианта… Но, буду придерживаться официальной документации.

  2. AStasy 20.06.2008 в 14:36 (Ответить)

    “Для использования form_open необходимо загрузить Form Helper” - возможно невнимательно читала, но не нашла, куда вписать строку $this->load->helper(‘form’);

    1. Владимир 20.06.2008 в 21:42 (Ответить)

      Так же как и любой хелпер.
      Можно загрузить глобально для всего приложения. Для этого в файле application/config/autoload.php добавляем имя хелпера в массив $autoload[’helper’]. Имеет смысл, если хелпер используется очень часто во всех контроллерах.

      Можно загрузить только для выбранного контроллера. В этом случае, $this->load->helper(‘form’); добавляем в его конструктор. Удобно если хелпер используется во всех методах этого контроллера.

      Можно загрузить только для выбранного метода. $this->load->helper(‘form’); добавляем в начало нужного метода (до загрузки представления $this->load->view(…..)). Хелпер будет доступен только в данном методе.

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

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

Введите ваш комментарий

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

Quicktags:

]]>