Недавно я описал примерное своё видение минимального приложения на 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 раз)
Посты по теме:
RSS-подписка
Это не спам: это тест)))
Это не тест – это спам
Хороший пост, только неясно, зачем поля и правила проверки вынесены в глобальные.. А если контроллер будет обрабатывать десяток форм?
Спам принят.
Насчёт глобальных – это не догма.
Поскольку контроллер зачастую работает с какой-то одной структурой данных, то есть хорошая вероятность, что в разных методах и формах одного контроллера будут использоваться одинаковые правила.
Хотя согласен, если потребуются разные правила – их нужно переопределять.