Придай форму! Никита Кислицин Хакер, номер #074, стр. 074-116-3 Тут следует понимать, что физически поле никуда не пропало, оно просто сменило тип на hidden. Это хорошо видно на рисунке 4, в html-коде сгенерированной формы. Для чего может потребоваться эта заморозка? Только для одного: для создания форм, которые заполняются в несколько этапов, на каждом из которых пользователю доступно ограниченное число полей. Разумеется, замораживание нельзя рассматривать как инструмент, исключающий модификацию информации. Ведь юзер легко может подправить html-код страницы и изменить даже замороженное поле. Для проверки вводимой пользователем информации нужно использовать метод validate(), о работе которого и пойдет речь ниже. Доверяй, но проверяй Нужно рассказать о концепции этого метода, о том, как он работает. Прежде всего, надо понимать, что для проверки сценарию должны быть переданы несколько параметров из формы. Если ни одного параметра не передано, проверка считается неудачной. Также необходимо задать критерии проверки, правила. Это делается при помощи специального метода addRule, который имеет следующий формат: addRule('название поля', 'сообщение при неудаче', правила). Здесь уместно привести такой вот пример: Пример умной формы <?php set_include_path("/usr/local/lib/php/"); require_once "HTML/QuickForm.php"; $form = new HTML_QuickForm('xa_test', 'get'); $form->addElement('header', 'header', 'Ха-форма'); $form->addElement('text', 'name', 'Твое имя:'); $form->addElement('text', 'email', 'Твое мыло:'); $form->addElement('text', 'age', 'Твой возраст:'); $form->addElement('reset', 'сlear', 'Очистить'); $form->addElement('submit', 'submit', 'Отправить'); $form->addRule('email','Неверный адрес','email'); $form->addRule('name', 'Неверное имя', 'lettersonly'); $form->addRule('name', 'Неверное имя','maxlength',10); $form->addRule('age', 'Неверный возраст', 'numeric'); $form->addRule('age', 'Неверный возраст','maxlength',2); if ($form->validate()) { $form->freeze(); } $form->display(); ?> Сейчас настало время разобраться с тем, как работает эта проверка. Здесь нет привычных тебе регулярных выражений, хотя они могут использоваться, а все правила задаются довольно однообразно, при помощи метода addRule, формат которого я описывал выше. Тут основную сложность представляет составление списка необходимых параметров, поэтому лучше всего разобраться на примере. Если ты не хочешь набивать руками напечатанный выше код, возьми с диска сценарий под именем qf_start2.php и запусти его. Перед тобой возникнет уже знакомая форма, и если ты попробуешь некорректно заполнить поля, то увидишь сообщения, изображенные на рисунке 5. Тут надо разобраться, что корректно, а что нет. Несложно видеть, что для поля emale есть только одно правило с именем email. Этому правилу соответствует регулярное выражение, которое изо всех строк отфильтровывает только строки, похожие на e-mail-адреса. Аналогично, для поля name исключаются спецсимволы с цифрами и устанавливается максимальная длина в 10 символов. Обрати внимание, что это реализовано двумя различными правилами, нельзя в одном рулесе задать несколько критериев. Теперь о том, как работает здесь заморозка. Когда сценарий запускается безо всяких параметров, логическое выражение $form->validate() равно FALSE, поскольку проверять нечего. И поэтому freeze не вызывается. Однако когда поля формы передаются сценарию, происходит проверка введенных данных на соответствие указанным правилам, и если все OK, вызывается метод freeze. |