16 August, 2009

Мой опыт в создании модульного приложения на Zend Framework: Часть 4

Подошла очередь форм.

Решил, что так, как писали мы раньше - создание формы в контроллере - некрасиво. Захотелось мне вынести формы в отдельную папочку forms в руте модуля.

Первое, с чем приходится столкнуться, - номенклатура. Как помнится, у меня два модуля: default и admin. Соответственны и неймсппейсы. Т. е. в дефолтном модуле я создал уже ранее модель Default_Model_Feedback в папке models, а в админском - Admin_Model_User в папке admin/models. Аналогичным образом создаем и формы. Например, первая форма, которую я создал - форма логина Default_Form_Login.

В начале меня вводило в ступор и непонимание то, что я не мог создать, например, файл forms/LoginForm.php так, чтобы он увиделся аналогично контроллерам (ср. controllers/UserController.php). Очевидно, таковое было обусловлено моим стремлением к перфекционизму: мне хотелось, чтобы всё было красиво, и сия пелена застилала мне глаза :) Однако, трезво взглянув на вещи, я вижу, что, пожалуй, я был не прав. Хотя вот что меня смутило. Согласно мануалу ZF, Zend_Application_Module_Autoloader, comes with the following mappings:
api/ => Api
forms/ => Form
models/ => Model
DbTable/ => Model_DbTable
plugins/ => Plugin
Т. е. выходит, что у нас будут, если будут, Default_Api_Foo, Default_Plugin_Bar etc.

Дальше. Создал я свой класс формы. В нем создаю конструктор, в который передаю $options = null. Ну и внутри создаю форму, прежде вызвав конструктор предка:

parent::__construct($options);
$this->setMethod('post')
->setAction('user/login')
->setName('loginForm');
$login = $this->createElement('text', 'login')
->setLabel('Логин');
$password = $this->createElement('password', 'password')
->setLabel('Пароль');
$submit = $this->createElement('submit', 'submit')
->setLabel('Войти');
$this->addElements(array($login, $password, $submit));


Внимание: конструктор ничего не возвращает! Вероятно, это логично, но я попался.

No comments: