Рассмотрим дополнительные методы класса валидации, которые могут пригодится при работе с этим классом и проверках данных.
При помощи метода label можно изменять ярлык, или так называемый псевдоним поля формы. Рассмотрим на примере. У нас есть поле user, в которое пользователь должен ввести свое имя. В случае, если поле не удовлетворяет правилам валидации, у нас на данный момент выдаются ошибки «Поле Юзер не должно быть пустым» или «Поле Юзер не должно быть короче 2 символов». Допустим нас не устраивает название «Поле Юзер», но лезть в файлы с переводом мы не хотим. В таком случае можно его поменять следующим образом. Перед валидацией пишем:
$post -> label('user', 'Имя пользователя');
И получаем ошибки «Имя пользователя не должно быть пустым» и «Имя пользователя не должно быть короче 2 символов» соответственно. Если изменяемых названий несколько, то чтобы не вызывать несколько раз метод label, можно создать массив с этими названиями и передать в метод labels примерно так:
$data = array('user' => 'Имя пользователя', 'email' => 'Бандероль'); $post -> labels($data);
В старых версиях фреймворка еще был такой метод — filter, который позволял обрабатывать значения полей перед применением правил валидации. Я не знаю, зачем его убрали в версии 3.2, он был весьма удобен. Помните нашу обработку полей функцией trim ?
$_POST['user'] = trim($_POST['user']); $_POST['message'] = trim($_POST['message']);
Мы делали ее для того, чтобы при валидации полей user и message с одними только пробелами сначала происходила их очистка, иначе правило not_empty не сработает. С методом filter все выглядело бы гораздо красивее:
$validate->filter('user', 'trim'); $validate->filter('message', 'trim');
или
$validate->filter(TRUE, 'trim');
для обработки всех полей. Но, увы, такого метода нет. Можно вытащить его из старых версий и расширить класс Validate. Ну или как вариант сделать следующее:
$_POST = Arr::map('trim', $_POST);
Идем дальше. Метод copy позволяет скопировать уже «настроенные» правила валидации и применить их для другого массива с данными. Например, для проверки массива $_GET:
$get = $valid->copy($_GET);
И напоследок пара слов про создание собственных правил валидации. Допустим, нам нужно убедиться, что введенное или выбранное число больше 18-ти (очень актуальная штука для «взрослых» сайтов). Пишем метод, который осуществляет проверку и возвращает TRUE в случае успеха и FALSE в случае неудачи.
public function check_age($value) { $value = intval($value); if($value > 18) return TRUE; return FALSE; }
И пишем правило:
$post -> rule('age', array($this, 'check_age'))
Все, можно проверять возраст. Только не забудьте добавить текст ошибки в массив сообщений.
Еще один вариант — использование так называемых анонимных функций. Данные функции появились в PHP начиная с версии 5.3.0. При их использовании проверка выглядит примерно так:
$post -> rule('age', function($value) { $value = intval($value); if($value > 18) return TRUE; return FALSE; });
Смотрится короче, красивее, но к сожалению не работает так как надо. Точнее говоря при ошибке валидации саму ошибку мы не получим. Вот рабочий вариант:
$post -> rule('age', function($value, $field, $validation) { $value = intval($value); if ($value > 18) { $validation->error($field, 'check_age'); return FALSE; } return TRUE; }, array(':value', ':field', ':validation'));
Как видите, он очень громоздкий, поэтому особого смысла рассматривать (и использовать) его я не вижу.
Собственно на этом все, в следующем уроке попробуем наши знания применить на практике.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Уроки по Кохане, а блог на wordpress — разочаровывает.
Хотел спросить, вы пишете «Метод clone», а в коде уже copy. Так какой метод верный?
Почти все блоги по программированию написаны на вп. Какая-то нездоровая тенденция
—
Извиняюсь. Copy верный. Clone просто используется внутри этого метода и я видимо автоматом написал. Поправил, спасибо.
function check_age писать прямо в коде контроллера можно? Или где?
Да.
Насколько я знаю, функция-валидатор кроме того, что она публичная, должна быть еще и статичной. Или я не прав?
Отвечу сам: варианта тут два — либо экземпляр объекта и его метод а-ля array($example, ‘example_method’), либо статичная функция любого класса ‘Class::validator’. Как-то так. Неплохо было бы указать на этот нюанс в статье.
У меня такая проблема, сделал авторизацию, все заходит, выходит, все ок. Но не получается сделать проверку, но то, то что логин или пароль введен неверно. Сделал такую проверку
if(!$auth->login($login, $pass, $remember)){ $res['error'] = ‘ok’;
}else{ $res['error'] = ‘okno’;
}
пишет переменная res не объявлена. Пожалуйста, подскажите, как правильно сделать эту проверку. Спасибо. Ресурс хороший!