forked from onPHP/onphp-framework
-
Notifications
You must be signed in to change notification settings - Fork 0
Ru:Form
wizardjedi edited this page Apr 24, 2011
·
6 revisions
Форма «Form» − это объект предназначенный для описанный наборов данных, которые мы ожидаем извне и правил работы с ними. Состоит форма из набора примитивов «Primitive» типы данных, каждый из которых отвечает за импорт, фильтрацию и валидацию данных.
Пример: Валидация примитивных данных (email, пароль)
К нам приходят данные из WEB-формы (email, пароль и повтор пароля)
<?php
//Как правило в формы мы импортируем из HttpRequest'а, поэтому и здесь создадим и заполним его
$request = HttpRequest::create()->
setGet($_GET)->
setPost($_POST)->
setSession($_SESSION);
// Создаем пустую форму
$form = Form::create();
// Добавляем примитив email
$form->add(
Primitive::string('email')->
// Шаблон для валидации
setAllowedPattern(
PrimitiveString::MAIL_PATTERN
)->
// Импортируем в нижнем регистре
setImportFilter(
// При импорте значения оно будет привидено к нижнему регистру
Filter::lowerCase()
)->
// Поля обязательно
required()
);
// Добавляем примитив пароль и подтверждение пароля
$form->add(
Primitive::string('password')->
setMin(5)-> // Минимально допустимая длина поля
setMax(14)-> //Макимально допустимая длина поля
required()
)->add(
Primitive::string('password_confirm')
);
//Добавляем правило проверки совпадения двух полей (password == password_confirm)
$form->add(
Primitive::rule('is_password_confirmed')->
// Из какой формы будут братся значения для валидации
setForm($form)->
// Expression условие
setExpression(
// При условии того что выражение будет истинно
Expression::isTrue(
// Если варажения эквивалентны
Expression::eq(
FormField::create('password'),
FormField::create('password_confirm')
)
)
)
);
// Импортируем данные в форму из $_GET
$form->import($request->getGet());
//Если часть данных приходит из $_POST
$form->importMore($request->getPost());
//Или еще круче, email у нас приходит из сессии
$form->importOneMore('email', $request->getSession());
//Даже если мы сами хотим импортировать, к примеру email
$form->importValue('email', 'example@example.com');
//Вешаем сообщения на возможные ошибки в форме.
$form->addMissingLabel('email', 'Поле "email" обязателен для заполнения!');
$form->addWrongLabel('email', 'Поле "email" содержит некорректное значение!');
$form->addMissingLabel('password', 'Поле "пароль" обязателен для заполнения!');
$form->addWrongLabel('password', 'Поле "пароль" допустимо от 5 до 14 символов!');
$form->addWrongLabel('is_password_confirmed', 'Пароли должны совпадать!');
/*
* Теперь собственно цель: Узнаем были-ли ошибки в форме
*/
$errors = $form->getErrors();
if ($errors) {
// Ooop's!
}
/* Возвращает массив из ( 'имя примитива' => 'errorType' ) где errorType тип ошибки
* к примеру для missingType это 2 для wrongType это 1
* Также могут быть custom-ные типы ошибок определенные разработчиком.
*
* В случае если массив пуст это свидетельствует о том что ошибок в форме нет! :-)
*/
//Для вывода конкретных сообщений пользуемся
$errorText = $form->getTextualErrorFor('email');
if ($errorText) {
echo $errorText;
}
?>