Проверка форм в CodeIgniter



Недавно я описал примерное своё видение минимального приложения на CodeIgniter. Это был сугубо обзорный пост.

Теперь я хочу заострить внимание на отдельных моментах. Сейчас остановлюсь на проверке вводимых данных в формах.

Вообще проверка вводимых данных, особенно в свете современных интернет-угроз, стала абсолютной необходимостью. Написание такой проверки довольно трудоёмкое занятие, но библиотека validation существенно упрощает задачу.

Далее, на примере той же телефонной базы, я опишу примерные шаги по работе с библиотекой, как я это обычно делаю.

Шаг 1: Определяем правила и описания полей

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class Phones extends Controller {
	var $rules = array(
		"in_phone"=>"required|integer",
		"out_line"=>"required|integer", 
		"dept"=>"xss_clean|trim|strip_tags|required"
		);
	var $fields = array(
		"in_phone"=>"Внутренний телефон",
		"out_line"=>"Внешняя линия", 
		"dept"=>"Подразделение/ФИО"
		);
         ...................

Массив $rules содержит правила, которые применяются к полям. Правила описываются довольно просто и очевидно.

Например, правило "required|integer" для поля in_phone означает, что

  • вводимое значение является обязательным(required)
  • и должно быть целочисленным(integer).

В противном случае класс выдаст ошибку.

Правило "xss_clean|trim|strip_tags|required" означает, что

  • вводимое значение сначала будет пропущено через фильтр XSS (xss_clean)
  • затем будут убраны пробелы в начале и в конце строки (trim)
  • затем будут удалены все теги (strip_tags)
  • а то что осталось – не должно быть пусто (required)

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

Массив $fields – содержит названия полей, которые будут использованы в описании ошибки.

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

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

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

Шаг 2: Загружаем библиотеку

Итак. В вашем контроллере нужно загрузить библиотеку validation. Затем нужно загрузить в него наши только что созданные правила. Удобнее всего это делать в конструкторе.

1
2
3
4
5
6
7
8
9
10
11
12
function Phones()
{
	parent::Controller();
	$this->load->model('mphones');
	$this->load->helper('url');
	$this->load->helper('form');
        ...........
         // Загрузка библиотеки и правил
	$this->load->library('validation');
	$this->validation->set_rules($this->rules);
	$this->validation->set_fields($this->fields);	
}

После этого объект готов к работе.

Шаг 3: Использовать объект

Выполнить проверку можно запустив логическую функцию

1
$this->validation->run()

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

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

Вот примерный текст:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function save()
{
        //  вызов проверки данных
	if (!$this->validation->run())  
	{
		// Если данные не прошли проверку,
                // то вызываем форму редактирования
 
                $data['row'] = $_POST;; 
		$data['header'] = 'Редактировать телефонные номер';
		$data['title'] = 'Редактировать телефонный номер';
 
		//Передаём текст ошибки
 
                $data['err']=$this->validation->error_string;
		$this->load->view('vphonesedit', $data);
		return;
	}
        // Если проверка проходит 
        // - выполняем действие и вызываем главную страницу контроллера
	$this->mphones->update_entry($_POST);
	redirect('phones');
}

Вот примерно так это делается =)
Пример можно скачать здесь (всего скачали 691 раз)

Посты по теме:

  1. Скелет для приложения в CodeIgniter
  2. Проблемы сессии в CodeIgniter
  3. ALCAPTCHA = Капча + AJAX + CodeIgniter
  4. Вышел CodeIgniter 1.7.2
  5. CMS-визитка на CodeIgniter

Категории CodeIgniter |
автор: altesack / Среда, Май 20, 2009 / 3 комментов »

3 комментов

    Это не спам: это тест)))

    Это не тест – это спам :P
    Хороший пост, только неясно, зачем поля и правила проверки вынесены в глобальные.. А если контроллер будет обрабатывать десяток форм?

    Спам принят. :)

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

    Хотя согласен, если потребуются разные правила – их нужно переопределять.

Ответить