Skip to content
AlexeyDsov edited this page Apr 20, 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')
			)
		)
	)
);

// Импортируем данные в форму
$form->import($request->getGet());

//Если часть данных приходит из $_GET
$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',
	('Пароли должны совпадать!')
);

//Для вывода сообщений пользуемся
$errorText = $form->getTextualErrorFor('email');
if( $errorText ) {
	echo $errorText;
}

/*
 * Узнаем были-ли ошибки в форме
 *  Вовращает массив из ( 'имя примитива' => 'errorType' ) где errorType тип ошибки
 *  к примеру для missingType это 2 для wrongType это 1
 *  Также могут быть custom-ные типы ощибок определенные разработчиком.
 *
 *  В случае если массив свидетельствует о том что ошибок в форме нет! :-)
 */
$errors = $form->getErrors();
?>
Clone this wiki locally