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

Владимир | | CodeIgniter, PHP.

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

В этой статье я хочу рассказать о возможностях, которые предоставляет 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', которая и будет выполнять проверку.

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

<?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) вывести сообщения об ошибках и задать значения для правильно заполненных полей.

<?php echo form_open('main/checkdata'); ?>

<p>

<?php echo $this->validation->usernic_error; ?>

Ник: <input type="text" name="usernic" id="usernic"

value="<?php echo $this->validation->usernic; ?>" /></p>

<p>

<?php echo $this->validation->fullname_error; ?>

Полное имя: <input type="text" name="fullname" id="fullname"

value="<?php echo $this->validation->fullname; ?>" /></p>

<p>

<?php echo $this->validation->usermail_error; ?>

eMail: <input type="text" name="usermail" id="usermail"

value="<?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>

<?php echo form_open('main/checkdata'); ?>

<p>

<?php echo $this->validation->usernic_error; ?>

Ник: <input type="text" name="usernic" id="usernic"

value="<?php echo $this->validation->usernic; ?>" /></p>

<p>

<?php echo $this->validation->fullname_error; ?>

Полное имя: <input type="text" name="fullname" id="fullname"

value="<?php echo $this->validation->fullname; ?>" /></p>

<p>

<?php echo $this->validation->usermail_error; ?>

eMail: <input type="text" name="usermail" id="usermail"

value="<?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><?php echo anchor('main/userdata', 'Ввод персональных данных'); ?></p>

</body>

</html>

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

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