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

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

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

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

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

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

"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. Затем нужно загрузить в него наши только что созданные правила. Удобнее всего это делать в конструкторе.

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: Использовать объект

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

$this->validation->run() 

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

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

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

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');
}

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

Проверка форм в CodeIgniter: 3 комментария

  1. lifecoder

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

  2. altesack Автор записи

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

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

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

Комментарии запрещены.