В прошлом уроке по основам валидации я уже говорил, что в Кохане уже есть большая часть правил, которые могут понадобиться при проверке каких-то данных. Все эти правила представлены в классе Valid, который в случае чего всегда можно расширить или изменить, и реализованы в виде статических методов. Об этих стандартных правилах мы сейчас и поговорим, чтобы вы случайно не стали «изобретать велосипед».
Правило not_empty проверяет переданное значение на пустоту, причем это может быть не только пустая строка, но и пустой массив.
$valid->rule('email', 'not_empty');
Правило regex проверяет строку на соответствие регулярному выражению. Например, проверка на правильный ввод url-адреса (впрочем, такое правило уже есть отдельно).
$post->rule('url', 'regex', array(':value', '/^((https?|ftp)\:\/\/)?([a-z0-9]{1,})([a-z0-9-.]*)\.([a-z]{2,4})$/'));
Правило min_length организует проверку на минимальную длину строки. Например, длина пароля не меньше 8 символов.
$post->rule('password', 'min_length', array(':value', 8));
Правило max_length аналогично предыдущему, только теперь организуется проверка на максимальную длину строки. Например, длина пароля не больше 8 символов.
$post->rule('password', 'max_length', array(':value', 8));
Правило exact_length проверяет длину строки на соответствие четко обозначенной длине. Например, длина пароля только 8 символов.
$post->rule('password', 'exact_length', array(':value', 8));
Обратите внимание, что можно указать несколько вариантов длины строки. Например, длина пароля 6, 7 или 8 символов.
$post->rule('password', 'exact_length', array(':value', array(6,7,8)));
Правило equals проверяет точное совпадение передаваемого значения с каким-то указанным нами значением. Не знаю, где это может понадобиться, но допустим для какой-то полукапчи. На вопрос «Название нашей планеты на английском» будет принято только слово «earth».
$post->rule('answer', 'equals', array(':value', 'earth'));
Правило email проверяет строку на правильность написания в качестве адреса электронной почты.
$post->rule('email', 'email');
Правило email_domain проверяет существование MX-записи для введенной электронной почты. Защищает от ввода электронных адресов «от балды».
$post->rule('email', 'email_domain');
Правило url проверяет строку на правильность написания в качестве URL-адреса. По сути тоже самое правило, что мы написали выше с помощью регулярного выражения, но более «красивое». В комментариях на блогах частенько можно увидеть поле «Мой сайт». Вот там этому правилу самое место.
$post->rule('my_site', 'url');
Правило ip проверяет строку на правильность написания в качестве IP-адреса.
$post->rule('ip', 'ip');
Правило credit_card проверяет, является ли переданное значение — номером кредитной карты. Можно указать также и типы проверяемых кредитных карт. Их список с параметрами (префиксы, длина номера, вычисление контрольной цифры по «алгоритму Луна») находится в конфигурационном файле system/config/credit_cards.php. Совершенно незаменимое правило для магазинов со способами оплаты с помощью кредитных карт.
$post->rule('my_card', 'credit_card', array(':value', array('american express','visa')));
Правило luhn редко используется отдельно (т.к. оно уже включено в правило «credit_card»). Это правило позволяет проверить переданное число с помощью «Алгоритма Луна». Данный алгоритм делает дополнительную проверку правильности ввода кредитной карты. Например, если и префикс, и количество цифр соответствуют действительности, но в какой-то из цифр случайно сделана ошибка, такой номер будет признан невалидным.
$post->rule('my_card', 'luhn');
Это примерно половина всех стандартных правил. Как видите их довольно много и оставшуюся часть мы рассмотрим в следующем уроке.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Сделайте пожалуйста вывод дыты публикации статей на блоге!
Что конкретно, я не понял ?
Даты десяти последних статей указаны в «Последних обновлениях». В самих статьях не вижу смысла указывать, т.к. все идет вразброс.
Или даты, когда планируется следующая статья ? Примерно раз в неделю выходит. Вторая часть правил уже почти написана.
Я вчера в первые нашел Ваш сайт, читаю статии по левому меню! И при этом я не знаю когда была написана информация! Свежая она или нет!
Вся информация относится к версии КОханы 3.2.0. Нужно читать по порядку. Дата смысла не имеет, т.к. я могу прыгать. Добавить статью в документацию, потом в модули, потом в уроки.
Ну это понятно! Но все же дата написания статии имеет свою роль в каждом блоге!
А это фактически и не блог. Здесь нет такого, что добавил статью -она вывелась сверху на главной странице. Здесь имеет смысл читать уроки по ссылкам по порядку — сверху вниз.
Можно посмотреть на даты комментариев и примерно определить «свежесть».
Черным по белому ведь написано….
«Вся информация относится к версии КОханы 3.2.0.»
Также нововедённую кириллицу в доменах не кушает.
вася_пупкин@мыло.рф
Подскажите можно ли стандартными средствами или правилами валидации проверить чтобы пароль не совпадал с логином.
Правила «not_matches» вроде нету.
Напишите свое правило. Тем более оно будет очень простое.
«Не знаю, где это может понадобиться, но допустим для какой-то полукапчи.»
Думаю правило equals очень удобно использовать для сравнения информации между исходным полем и полем-подтверждением. Например для поля «Повторите пароль» или «Email еще раз», просто подставить переменную.
Такой вопрос, а есть ли какой-то метод, который выводил бы сообщение типа «Форма заполнена верна, данные внесены в БД»?
Подскажите, почему не работает правило not_empty для поля captcha?
Код:
public function action_registration() // экшн регистрации
{
$data = array();
if (HTTP_Request::POST == $this->request->method())
{
try {
// производим проверку всех полей
$object = Validation::factory($this->request->post());
$object
->rule(‘username’, ‘not_empty’)
->rule(‘username’, ‘min_length’, array(‘:value’, ’4′))
->rule(‘password’, ‘not_empty’)
->rule(‘password’, ‘min_length’, array(‘:value’, ’5′))
->rule(‘email’, ‘email’)
->rule(‘captcha’, ‘not_empty’);
// ->rule(‘captcha’, ‘Captcha::valid’);
$user = ORM::factory(‘User’) // если проверка пройдена — регистрируем
->set(‘email’, $this->request->post(‘email’))
->set(‘username’, $this->request->post(‘username’))
->set(‘password’, $this->request->post(‘password’))
->save();
// даем новому пользователю роль для логина
$user->add(‘roles’, ORM::factory(‘Role’, array(‘name’ => ‘login’)));
// очищаем массив с POST
$_POST = array();
$to = $this->request->post(‘email’);
$subject = Kohana::message(‘account’, ‘email.themes.registration’);
$from = Kohana::message(‘account’, ‘email.from’);
$message = ‘Вы успешно зарегистрировались с паролем — ‘.$this->request->post(‘password’);
Email::send($to, $from, $subject, $message, $html = false); // отправляем пользователю сообщение с его паролем
Auth::instance()->force_login($user); // сразу же авторизуем его, без ввода логина и пароля
HTTP::redirect(‘/account/’);
} catch (ORM_Validation_Exception $e) {
// если во время валидации возникли ошибки
$data['messageReg'] = Kohana::message(‘account’, ‘errorReg’);
$data['errors']=$e->errors(‘models’);
// берем значения ошибок из файла /application/messages/model/user.php
}
}
В массиве пост присутсвует поле captcha со значением string(0) «»
И еще вы кажется обещали написать как создать собственное правило валидации!! Спасибо за ответ
Точнее валидация работает, если использовать метод check(), но в блок catch ошибка не попадает.
«Этих данных вполне достаточно, чтобы выводить сообщения об ошибках красиво, но об этом позже»
позже так и не наступило..
Понаходил ответы. Жаль нельзя удалять свои коменты