parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Раз уж напомнил... :-) | xForm — универсальный обработчик форм

R. Averkov 09.07.2006 15:17 / 09.07.2006 15:37

На выходе — XML. Затем используется связка универсальный шаблон (который знает что такое input, textarea,... и как их едят) + специфичный (который, собственно, отвечает за дизайн формы).

Это было 4 месяца назад. Сейчас мне кажется, что удобней было бы хранить структуру и данные формы изначально в XML. Хотелось бы услышать, как это делается в Студии (вектора хотя бы!) :-)

Пример создания/обработки формы с помощью моего класса:
$xFormObject[^xForm::create[

	$.action[/register.html]
	$.method[POST]
	$.name[register]

	^rem{ Встроенный antiflood.p by Misha v.3 (можно и не использовать) }
	$.antiflood[

		^rem{ Имя хеш-файла (для каждой формы файл должен быть уникальным }
		$.hashfile_path[../data/hashfiles/register]

		^rem{ Срок жизни записи в хеш-файле (часы) }
		$.expires(0.5)
	]

	^rem{ Собственно сами поля }
	$.fields[

		^rem{ Поле с name="login" }
		$.login[
			$.label[Логин]
			$.type[text]

			^rem{ Обязательное поле }
			$.is_require(1)

			$.maxlength(30)
			$.size(20)

			^rem{ используются в XSL }	
			$.sort_order(1)
			$.group(1)
		]

		$.password[
			$.label[Пароль]
			$.type[password]
			$.is_require(1)

			^rem{ Если форма вернется посетителю (ошибки заполнения), }
			^rem{ то при наличии такого флага, пароль сохранится в поле }
			$.no_сlear(1)
			...
		]

		$.password_confirm[
			$.label[Повторить пароль]
			...
		]

		$.permanent_auth[ ^rem{ Одиночный флажок }
			$.label[Узнавать всегда]
			$.type[checkbox]	
			$.checked(1)
		]

		$.favorites[ ^rem{ Группа флажков }

			^rem{ Если указан, может использоваться
			как заголовок fieldset и т. п. }
			$.label[Избранное]	 

			$.type[checkbox]

			^rem{ Набор значений }
			$.values[^table::create{value	disabled
Книжки	1
Ложки		
Кружки		
Вилки		}]

			^rem{ Выбранные значения }
			$.checked[^table::create{value
Книжки
Мишки}]
		]

		$.auth_type[
			$.label[Тип авторизации]
			$.type[radio]
			$.values[^table::create{value	label
permanent	Постоянная
temporary	Временная}]
			$.checked[permanent]
		]

		$.primary_model[
			$.label[Модель]		
			$.type[select]
			$.is_require(1)
			$.options[^table::create{value	label
H	Honda
AR	Alfa Romeo
B	BMW
M	McLaren}]

			^rem{ Содержимое незначащего option:
			<option value="">$.empty_option</option> }

			^rem{ Без этого ключа незначащий option отсутствует }
			$.empty_option[(Выбрать)]

			^rem{ value выбранного option }
			$.selected[AR]
		]


		$.additional_model[
			$.label[Другие модели]		
			$.type[select]
			$.is_multiple(1)
			$.size(5)

			^rem{ Если value и label одинаковые, }
			^rem{ можно в таблице привести только value }
			$.options[^table::create{value
Honda
Alfa Romeo
BMW
McLaren}]

			$.empty_option(1)
			^rem{ В таком случае: <option value=""></option>
			(есть, но пустой) }

			$.selected[^table::create{value
Honda
BMW}]
		]
	]
]]


^rem{
	Правило 3-х П:
	^xFormObject.process{Проверяем}{Принимаем}{Посылаем}

	При первоначальном вызове, форма выводится автоматически.
}



^xFormObject.process{

	^rem{ Здесь делаем все дополнительные операции проверки формы }
	^rem{ и, если нужно, инициируем ошибки: }
	^if(def $form:password && def $form:password_confirm
	&& $form:password ne $form:password_confirm){
		^xFormObject.error[password_confirm;Пароли не совпадают]
	}
	
	^rem{ Проверки на заполненность ($.is_require(1)) }
	^rem{ и максимальную длину ($.maxlength(int)) делаются автоматически }
	
	^rem{ Если произошли ошибки, форма возвращается пользователю }

}{
	^rem{ Успешная обработка формы. Тут делаем с данными из form:...
	то, что собирались }
	^rem{ Можно снова показать форму: ^xFormObject.print[] }
}{
	^rem{ Реакция на флуд/спам (сработает, если включен антифлуд) }
	<p>Вы уже зарегистрированы!</p>
}