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

У цій статті я хочу розповісти про можливості, які надає CodeIgniter для роботи з даними форм. Незважаючи на те, що обробка цих даних досить проста, вона включає безліч перевірок і для великих форм виливається в пристойний шматок коду.

Кожен раз заново винаходити велосипед природно ніхто не хоче, тому бібліотек для вирішення цих завдань існує просто неміряно.

Практично кожен фреймворк пропонує своє рішення цієї задачі. І CodeIgniter тут не виняток. Можливо, його рішення не ідеальне, але, тим не менш, досить ефективний і зручний у використанні.

Розглянемо невеликий приклад. Припустимо, у нас є сторінка (userdata) з формою, що містить поля для введення особистих даних. Якщо відвідувач правильно заповнив форму, ми повинні відправити його на головну сторінку сайту (index). Якщо були допущені помилки - показати їх опис і запропонувати заповнити форму ще раз.

Природно, доступ до обох сторінок здійснюється через контролер, а їх адреси виглядають так: www.site.com/index.php/main/index і www.site.com/index.php/main/userform.

Примітка. Детальніше почитати про навігації в CodeIgniter можна в статті « CodeIgniter: контролер і уявлення ».
Тобто на даному етапі контролер виглядає так:

class Main extends Controller {function Main () {parent :: Controller (); } Function index () {$ this-> load-> view ( 'index'); } Function userdata () {$ this-> load-> view ( 'userdata'); }}

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

function checkdata () {$ this-> load-> library ( 'validation'); }

На даному етапі цей метод тільки завантажує вбудовану бібліотеку 'validation', яка і буде виконувати перевірку.

Тепер розглянемо саму форму:

&lt;? Php echo form_open ( 'main / checkdata'); ?> <P> Нік: <input type = "text" name = "usernic" id = "usernic" /> </ p> <p> Повне ім'я: <input type = "text" name = "fullname" id = "fullname" /> </ p> <p> eMail: <input type = "text" name = "usermail" id = "usermail" /> </ p> <p> <input type = "submit" id = " sendbtn "value =" Відправити "/> </ p> </ form>

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

Примітка. Для використання form_open необхідно завантажити Form Helper

$ This-> load-> helper ( 'form');

Сама форма містить три поля, в які відвідувач повинен ввести свої дані (нік, повне ім'я та адреса електронної пошти). Після натискання на кнопку «Відправити» дані відсилаються на URL www.site.com/index.php/main/checkdata. За замовчуванням, відправка здійснюється методом POST.

Тепер переходимо безпосередньо до перевірки.

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

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

function checkdata () {$ this-> load-> library ( 'validation'); $ Rules [ 'usernic'] = "trim | required | min_length [3]"; $ Rules [ 'fullname'] = "trim | required"; $ Rules [ 'usermail'] = "trim | required | valid_email"; $ This-> validation-> set_rules ($ rules); if ($ this-> validation-> run () === TRUE) {// зберігаємо введені дані (наприклад, в БД) // .......... // відправляємо користувача на головну сторінку $ this -> load-> view ( 'index'); } Else {$ this-> load-> helper ( 'form'); $ This-> load-> view ( 'userdata'); }}

У рядках 4-6 ми оголосили масив з правилами. Ключі масиву повинні мати такі ж назви, як і поля форми (збігатися з атрибутів name), а значення - це просто рядки з переліком правил, які будуть застосовуватися до поля (як роздільник використовується «|»).

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

Природно, це далеко не всі правила. Докладний перелік можна подивитися тут . Крім того, в якості правил можна використовувати php функції, які приймають один параметр.

У рядку 8 за допомогою методу set_rules ми встановлюємо правила, а в рядку 10 - виконуємо перевірку (метод run).

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

В принципі, на даному етапі ми вже виконали перевірку. Але якщо відвідувач припуститься помилки, то він не буде знати, в чому вона полягає.

Крім того, помилка може бути тільки в одному з полів. Тому, нам потрібно заповнити всі інші поля, щоб відвідувач не вводив їх заново.

Для вирішення цих завдань потрібно виконати дві операції.

1) У контролері за допомогою методу set_fields вказати поля, інформація про яких нам потрібна:

$ Fields [ 'usernic'] = "нік"; $ Fields [ 'fullname'] = "повне ім'я"; $ Fields [ 'usermail'] = "адреса email"; $ this-> validation-> set_fields ($ fields);

У першому параметрі методу передається масив з параметрами. Ключі елементів масиву повинні збігатися з іменами полів форми, а значення - просто текстові описи полів (використовуються при виведенні повідомлень про помилки).

2) В поданні (userdata.php) вивести повідомлення про помилки і задати значення для правильно заповнених полів.

&lt;? Php echo form_open ( 'main / checkdata'); ?> <P> &lt;? Php echo $ this-> validation-> usernic_error; ?> Нік: <input type = "text" name = "usernic" id = "usernic" value = "&lt;? Php echo $ this-> validation-> usernic;?&gt;" /> </ P> <p> < ? php echo $ this-> validation-> fullname_error; ?> Повне ім'я: <input type = "text" name = "fullname" id = "fullname" value = "&lt;? Php echo $ this-> validation-> fullname;?>" /> </ P> <p> &lt;? php echo $ this-> validation-> usermail_error; ?> EMail: <input type = "text" name = "usermail" id = "usermail" value = "&lt;? Php echo $ this-> validation-> usermail;?>" /> </ P> <p> < input type = "submit" id = "sendbtn" value = "Відправити" /> </ p> </ form>

Як бачите, перед кожним полем ми додали:

echo $ this-> validation-> імяполя_error;

Ці змінні створює CodeIdniter. Якщо поле заповнене правильно, то змінна буде містити порожній рядок і відвідувач нічого не побачить.
Змінні $ this-> validation-> ім'я_поля містять введені значення. Таким чином, привласнюючи їх атрибуту value, ми заповнюємо поля попередніми значеннями.

Примітка. Для того, щоб при первісному появі форми не з'являлися повідомлення про помилки, поля повинні бути встановлені у всіх методах контролера, які будуть відображати форму. У нашому випадку це userdata і checkdata.

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

Створення власних правил.

Передбачити всі можливі ситуації неможливо. Тому CodeIdniter надає вам можливість створити власні правила обробки даних з форм.

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

Природно, стандартні правила перевірки тут нам не допоможуть, тому ми повинні написати власний метод для перевірки.

Подивимося, як цей метод може виглядати:

function checknic ($ nic) {// тут повинен бути запит до БД, який шукає // користувача з ім'ям $ nic. // ........ // якщо користувач знайдений if ($ nic_exists === TRUE) {$ this-> validation-> set_message ( 'checknic', 'Користувач з таким ніком вже існує'); return false; } Else {return true; }}

Як бачите, цей метод повинен повертати true у разі успішної перевірки і false - якщо знайдена помилка (в даному випадку помилкою вважається збіг ника з уже існуючим).

Після цього, ми можемо використовувати ім'я цього методу (з приставкою callback_) в якості правила.

$ Rules [ 'usernic'] = "required | min_length [3] | callback_checknic";

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

class Main extends Controller {function Main () {parent :: Controller (); } Function index () {$ this-> load-> view ( 'index'); } Function userdata () {$ this-> load-> library ( 'validation'); $ Fields [ 'usernic'] = "нік"; $ Fields [ 'fullname'] = "повне ім'я"; $ Fields [ 'usermail'] = "адреса email"; $ This-> validation-> set_fields ($ fields); $ This-> load-> helper ( 'form'); $ This-> load-> view ( 'userdata'); } Function checkdata () {$ this-> load-> library ( 'validation'); $ Rules [ 'usernic'] = "required | min_length [3] | callback_checknic"; $ Rules [ 'fullname'] = "required"; $ Rules [ 'usermail'] = "required | valid_email"; $ This-> validation-> set_rules ($ rules); $ Fields [ 'usernic'] = "нік"; $ Fields [ 'fullname'] = "повне ім'я"; $ Fields [ 'usermail'] = "адреса email"; $ This-> validation-> set_fields ($ fields); if ($ this-> validation-> run () == TRUE) {// зберігаємо введені дані (наприклад, в БД) // .......... // відправляємо користувача на головну сторінку $ this- > load-> view ( 'index'); } Else {$ this-> load-> helper ( 'form'); $ This-> load-> view ( 'userdata'); }} Function checknic ($ nic) {// тут повинен бути запит до БД, який шукає // користувача з ім'ям $ nic. // ........ // якщо користувач знайдений if ($ nic_exists === TRUE) {$ this-> validation-> set_message ( 'checknic', 'Користувач з таким ніком вже існує'); return false; } Else {return true; }}}

Сторінка з формою (userdata.php):

<! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Strict // EN"> <html xmlns = "http://www.w3.org/1999/xhtml" lang = "ru"> <head> < title> Перевірка введених даних </ title> <meta http-equiv = "content-type" content = "text / html; charset = UTF-8" /> </ head> <body> &lt;? php echo form_open ( 'main / checkdata '); ?> <P> &lt;? Php echo $ this-> validation-> usernic_error; ?> Нік: <input type = "text" name = "usernic" id = "usernic" value = "&lt;? Php echo $ this-> validation-> usernic;?&gt;" /> </ P> <p> < ? php echo $ this-> validation-> fullname_error; ?> Повне ім'я: <input type = "text" name = "fullname" id = "fullname" value = "&lt;? Php echo $ this-> validation-> fullname;?>" /> </ P> <p> &lt;? php echo $ this-> validation-> usermail_error; ?> EMail: <input type = "text" name = "usermail" id = "usermail" value = "&lt;? Php echo $ this-> validation-> usermail;?>" /> </ P> <p> < input type = "submit" id = "sendbtn" value = "Відправити" /> </ p> </ form> </ body> </ html>

Головна сторінка сайту (index.php):

<! DOCTYPE html PUBLIC "- // W3C // DTD XHTML 1.0 Strict // EN"> <html xmlns = "http://www.w3.org/1999/xhtml" lang = "ru"> <head> < title> Перевірка введених даних </ title> <meta http-equiv = "content-type" content = "text / html; charset = UTF-8" /> </ head> <body> <p> &lt;? php echo anchor ( 'main / userdata', 'Введення персональних даних'); ?> </ P> </ body> </ html>

Як бачите, користуватися бібліотекою досить просто.

Наступного разу як виконати ці ж перевірки за допомогою ajax.

Php echo form_open ( 'main / checkdata'); ?
Lt;?
Php echo form_open ( 'main / checkdata'); ?
Php echo $ this-> validation-> usernic_error; ?
Php echo $ this-> validation-> usernic;?
Gt;" /> </ P> <p> < ?
Php echo $ this-> validation-> fullname_error; ?
Php echo $ this-> validation-> fullname;?
Php echo $ this-> validation-> usermail_error; ?
Php echo $ this-> validation-> usermail;?