Несмотря на то, что 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;

Вот результат, который получится в итоге:
Zend_Form

Как видите, всё очень просто.
Если что-нибудь не понятно – спрашивайте в комментариях.

Спасибо за внимание, всего доброго.

Связанные записи

12 Comments

  1. hudson says:

    Все это хорошо, но я не чувствую желаемой гибкости в отображении форм. Элементы громоздятся как Zend угодно, а не мысли дизайнера.

    Пока не понял как декораторы мне в этом могут почь увы :(

  2. admin says:

    Гибкость в отображении – она не HTML-ом делается (который Zend_Form и формирует), а CSS-ом.

  3. hudson says:

    Если можно – на примере плз :) Например из вышеприведенного кода это не следует. А как правильно “приготовить” форму, пока увы не додумался.

  4. admin says:

    Чуть позже займусь, оформлю в виде отдельной записи.

  5. hudson says:

    Заранее спасибо :)

  6. Igor says:

    Ждем продолжения

  7. woto says:

    Было бы хорошо так же освятить вопросы связанные с нестандартной проверкой.
    Например чтобы имя пользователя отсутствовало в бд. Или была проверка на совпадение двух полей для ввода пароля, а так же возможная связь с Zend_File_Transfer

  8. Сергей Митрошин says:

    Обязательно займусь :)

  9. woto says:

    А методы есть? В прошлый раз мне приходилось менять zend_form под себя.

  10. Сергей Митрошин says:

    Менять Zend_Form в таких случаях не нужно, достаточно написать собственные валидаторы/элементы.

  11. woto says:

    Ага, так я и делал. А вот проверку совпадения полей можно? Я не допер как без изменения, если память не ошибает, то проблема была в том что какой-то интерфейс принимал только одно значение – проверяемое и способа передать второе без хирургического вмешательства не удалось.

  12. woto 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);
    return false;
    }
    }

Leave a Reply