На первый взгляд, работа с формами в Zend Framework может показаться намного сложнее, нежели стандартная обработка форм в PHP. Но это до того момента, когда вам понадобится валидировать данные формы и выдавать соответствующие ошибки. Думаю, что попробовав, вы поймете…

Форму описывает объект класса Zend_Form. Работа начинается с создания объекта этого класса. Давайте создатим этот объект:

$form = new Zend_Form();
$form->setMethod('post');

Видно, что форма передает данные методом post. У объекта класса Zend_Form есть множество методов, устанавливающих те или иные параметры формы.

Далее к форме добавим текстовое поле, которое принимает только символы соответствующие алфавиту, а также переводит введенные символы в нижний регистр. Это поле обязательно для ввода.

$text = new Zend_Form_Element_Text('text_id');
$text->addValidator('alpha');
$text->addFilter('StringToLower');
$text->setRequired(true);
$form->addElement($text);

$submit = new Zend_Form_Element_Submit('submit');
$form->addElement($submit);

Теперь эту форму можно вывести на страницу:

<html><body>
<?= $this->form ?>
</body></html>

Форма готова. Осталось написать метод для ее обработки. Для простоты будет дополнен метод, создающий форму. (Удобно вынести код, создающий форму в отдельный метод) Если форма не прошла валидацию, то выводим ее еще раз. При этом будут указаны ошибки допущенные пользователем. Тексты ошибок появятся рядом с невалидными полями.

if ($this->getRequest()->isPost()) {
	if (!$form->isValid($_POST)) {
		$this->render('form');
	} else {
		//Save data and redirect
	}
}

При создании объекта формы и элемента формы, по умолчанию устанавливаются некоторые декораторы. Так, например, если установить свойство label объекта элемента формы, на странице, перед этим элементом появится текст, соответствующий значунию label. Также можно написать свои декораторы. Этим мы и займемся…

Давайте напишем декоратор, который помещает элемент в строку таблицы, в первом столбце которой будет выведен текст свойства label этого элемента. Для этого необходимо создать классы декораторов:

class Vaniashev_Decorator_TestElement extends Zend_Form_Decorator_Abstract{

	public function render($content){
		return $content.'<tr><td>'.$this->getElement()->getLabel().'</td>.
				'<td>'.$this->buildInput().'</td></tr>';
	}

	public function buildInput()
    {
        $element = $this->getElement();
        $helper  = $element->helper;
        return $element->getView()->$helper(
            $element->getName(),
            $element->getValue(),
            $element->getAttribs(),
            $element->options
        );

    }

}

class Vaniashev_Decorator_Button extends Zend_Form_Decorator_Abstract {

	public function render($content){
		return $content.'<tr><td> </td>' .
				'<td>'.$this->buildInput().'</td></trv';
	}

	public function buildInput()
    {
        $element = $this->getElement();
        $helper  = $element->helper;
        return $element->getView()->$helper(
            $element->getName(),
            $element->getLabel(),
            $element->getAttribs(),
            $element->options
        );
    }
}

Файлы декораторов поместим в папку vaniashev/decorators/ и назовем соответственно TestElement.php и Button.php. Чтобы использовать эти декораторы, необходимо указать форме, где их искать. Для этого, в контроллере где создается форма выполним: $form->addPrefixPath(‘Vaniashev_Decorator’, ‘vaniashev/decorator’, Zend_Form::DECORATOR). Благодая этому, форма и все ее элементы будут искать декораторы в указанной папке. Но для этого, каждому элементу необходимо указать имя используемого декоратора. Например $text->setDecorators(array(‘TestElement’)). Причем этот метод можно вызывать только после того, как элемент добавлен в форму, т.к. до этого элемент не владеет информацией о путях к декораторам.

Так как мы изменили разметку формы, ошибки валидации больше не выводятся. Чтобы снова их увидеть, добавим в декоратор элемента следующие строки:

    public function buildErrors()
    {
        $element  = $this->getElement();
        $messages = $element->getMessages();
        if (empty($messages)) {
            return '';
        }
        $out = '';
        foreach ($messages as $m){
        	$out.= $m.'. ';
        }
        return '<span style="color:red"> '.$out.'</span>';
    }

Также вызов этого метода необходимо добавить в метод render(). Теперь наша форма снова оповещает нас об ошибках. Но как изменить текст выводимых ошибок? Текстовые сообщения об ошибках можно изменить, передав их как третий параметр метода addValidator. Например для нашего элемента:

$text->addValidator('alpha', false, array('messages'=>array('notAlpha'=>'Text of error')));

Конечно, в этой статье освещены не все варианты работы с формами. Если у вас имеются какие-либо вопросы по данной теме, задавайте их в комментариях. Отвечу на все вопросы.

Также, возможно, вам будут интересны методы аутентификации в Zend Framework.