Несмотря на то, что Zend_Form – мощный механизм для создания форм, проверки и фильтрации вводимых данных, использовать его довольно просто и удобно.
В первой части статьи мы узнаем основы использования Zend_Form, без вникания в тонкости настройки.
Начнём с примера. Обратите внимание, этот код надо писать в методах действий (actions) ваших контроллеров. Также должен быть зарегистрированный в Zend_Controller объект вида типа Zend_View_Interface (это не совсем так, но обсудим мы это в следующей части статьи).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | $form = new Zend_Form; $form->setAction('index') //задаём атрибут action формы ->setMethod('post') //метод передачи ->setAttrib('id', 'loginForm'); //и id формы //инстанцируем класс, создающий текстовое поле //с атрибутом name="username" $username = new Zend_Form_Element_Text('username'); //добавляем необходимые фильтры и валидаторы $username->addFilter('stringTrim') ->addValidator('alnum') ->setRequired(true) //поле должно быть обязательно заполнено ->setLabel('Enter username'); //задаёт метку (тег label) для поля $form->addElement($username); //и, собственно, добавляем элемент в нашу форму //проделываем аналогичные действия с полем для ввода пароля $password = new Zend_Form_Element_Password('password'); $password->addValidator('alnum') ->setRequired(true) ->setLabel('Enter password'); $form->addElement($password); //единственное отличие этого поля - оно необязательное //мы не устанавливаем параметр require, поэтому его можно оставить пустым $email = new Zend_Form_Element_Text('email'); $email->addValidator('emailaddress') ->setLabel('Your e-mail address'); $form->addElement($email); //ну и, разумеется, добавляем submit $form->addElement('submit', 'submit'); if ($this->getRequest()->isPost()) { //в метод isValid передаём наш массив post-данных //происходит проверка данных на валидность if ($form->isValid($this->getRequest()->getPost())) { //Данные верны, можно регистрировать пользователя } else { echo 'Введите верные данные'; } } echo $form; |
Вот результат, который получится в итоге:

Как видите, всё очень просто.
Если что-нибудь не понятно – спрашивайте в комментариях.
Спасибо за внимание, всего доброго.
hudson says:
Все это хорошо, но я не чувствую желаемой гибкости в отображении форм. Элементы громоздятся как Zend угодно, а не мысли дизайнера.
Пока не понял как декораторы мне в этом могут почь увы
27 марта 2008, 0:21admin says:
Гибкость в отображении – она не HTML-ом делается (который Zend_Form и формирует), а CSS-ом.
27 марта 2008, 8:45hudson says:
Если можно – на примере плз
Например из вышеприведенного кода это не следует. А как правильно “приготовить” форму, пока увы не додумался.
27 марта 2008, 8:52admin says:
Чуть позже займусь, оформлю в виде отдельной записи.
27 марта 2008, 9:07hudson says:
Заранее спасибо
27 марта 2008, 10:57Igor says:
Ждем продолжения
11 июня 2008, 17:41woto says:
Было бы хорошо так же освятить вопросы связанные с нестандартной проверкой.
6 сентября 2008, 1:20Например чтобы имя пользователя отсутствовало в бд. Или была проверка на совпадение двух полей для ввода пароля, а так же возможная связь с Zend_File_Transfer
Сергей Митрошин says:
Обязательно займусь
6 сентября 2008, 8:44woto says:
А методы есть? В прошлый раз мне приходилось менять zend_form под себя.
7 сентября 2008, 14:04Сергей Митрошин says:
Менять Zend_Form в таких случаях не нужно, достаточно написать собственные валидаторы/элементы.
7 сентября 2008, 14:27woto says:
Ага, так я и делал. А вот проверку совпадения полей можно? Я не допер как без изменения, если память не ошибает, то проблема была в том что какой-то интерфейс принимал только одно значение – проверяемое и способа передать второе без хирургического вмешательства не удалось.
7 сентября 2008, 15:34woto says:
У блин, прям в мануале нашел то, чего не хватало
ажно улыбнуло. Кул, ну значит буду уходить от своего класса в пользу стандартного.
class My_Validate_PasswordConfirmation extends Zend_Validate_Abstract
{
const NOT_MATCH = ‘notMatch’;
protected $_messageTemplates = array(
self::NOT_MATCH => ‘Password confirmation does not match’
);
public function isValid($value, $context = null)
{
$value = (string) $value;
$this->_setValue($value);
if (is_array($context)) {
if (isset($context['password_confirm'])
&& ($value == $context['password_confirm']))
{
return true;
}
} elseif (is_string($context) && ($value == $context)) {
return true;
}
$this->_error(self::NOT_MATCH);
7 сентября 2008, 15:50return false;
}
}