Skip to content
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;
}

?>
Clone this wiki locally