Использование форм с Zend Framework

Я относительно новичок в MVC и Zend Framework. Это, как говорится, я чувствую, что мне сложно определить, где формы принадлежат моей структуре каталогов. У меня модульная структура каталогов, поэтому я не знаю, должен ли быть один каталог форм или один в каждом каталоге модуля.

/application
    /modules/
        /default
            /controllers
            /views
        /admin
            /controllers
            /views

Как только вы определили каталог для форм, задаете ли вы этот каталог в пути включения бутстрапа? Или вы включаете форму в контроллер, что она используется?

Как вы используете формы с Zend Framework?

Ответ 1

Немного поздно, но в текущей версии ZF это было решено:

На следующей странице http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html В руководстве указано:

30.3.2. Автозагрузчик ресурсов модуля Zend Framework поставляется с конкретной реализацией Zend_Loader_Autoloader_Resource, которая содержит сопоставления типов ресурсов, которые охватывают стандартную структуру каталогов по умолчанию для приложений Zend Framework MVC. Этот загрузчик Zend_Application_Module_Autoloader имеет следующие сопоставления:

api/         => Api
forms/       => Form
models/      => Model
    DbTable/ => Model_DbTable
plugins/     => Plugin

В качестве примера, если у вас есть модуль с префиксом "Blog_" и попытался создать экземпляр класса "Blog_Form_Entry", он будет искать в каталоге ресурсов "forms/" подкаталог для файла с именем "Entry.php" ". При использовании модульных бутстрапов с Zend_Application экземпляр Zend_Application_Module_Autoloader будет создан по умолчанию для каждого дискретного модуля, что позволит вам автоматически загружать ресурсы модуля.

Это требует, однако, использования Zend_Application

Ответ 2

добавьте это в файл application/modules/yourmodule/Bootstrap.php.

class Yourmodule_Bootstrap extends Zend_Application_Module_Bootstrap
{

protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Yourmodule_',
            'basePath'  => APPLICATION_PATH .'/modules/yourmodule',
            'resourceTypes' => array (
                'form' => array(
                    'path' => 'forms',
                    'namespace' => 'Form',
                ),
                'model' => array(
                    'path' => 'models',
                    'namespace' => 'Model',
                ),
            )
        ));
        return $autoloader;
    }

}

Ответ 3

По состоянию на март '09 лидеры идей ZF все еще, кажется, обсуждают лучшие способы организовать все. В ZF v1.8 есть версия строительного леса в составе Zend_Tool. В настоящее время в инкубаторе я пробовал его на прошлой неделе, и он работает, но в его текущем состоянии не так много компонентов.

Из примеров, которые я видел, кажется, что их лучше всего управлять отдельно от моделей, с которыми они взаимодействуют (это от Zend Framework In Action):

/application
    /modules/
        /default
            /controllers
            /forms
                ContactForm.php
                LoginForm.php
                RegisterForm.php
                SupportForm.php
            /models
                Comment.php
                User.php
                Users.php
            /views
        /admin
            /controllers
            /views

Тем не менее, я также видел структурированную форму под каталогом модели. Мэтью Вейер О'Финни показывает, как использовать их для проверки на самих моделях:

/application
    /modules/
        /default
            /controllers
            /models
                Comment.php
                User.php
                /Form
                    Comment.php
                    Login.php
                    Register.php
            /views
        /admin
            /controllers
            /views

Чтобы ваши файлы были автоматически включены, обязательно укажите свои классы, используя модель подчеркивания.

Например, когда Zend_Loader видит

 class RegisterController extends Zend_Controller_Action

Он смотрит в php include_path для:

Zend/Controller/Action.php

Аналогично, если предположить первую структуру выше, если мы включим модуль 'default' в наш include_path:

# bootstrap.php
$rootDir = dirname(dirname(__FILE__));
define('ROOT_DIR', $rootDir);
set_include_path(get_include_path()
    . PATH_SEPARATOR . ROOT_DIR . '/library/'
    . PATH_SEPARATOR . ROOT_DIR . '/application/modules/default/'
);
include 'Zend/Loader.php';
Zend_Loader::registerAutoload();

Вы называете свои классы:

Forms_ContactForm
Models_User

Некоторые программисты предпочитают размещать большинство своих файлов в библиотеке, поэтому им не нужно добавлять дополнительные пути include:

/library
    /My
        /Form
            Contact.php

Предполагая, что папка библиотеки включена, класс, указанный выше, будет называться:

My_Form_Contact

Удачи! Матф

Ответ 4

Лично мне было проще поместить мой каталог модулей в путь include и назвать мои классы форм в шаблоне Zend Loader.

Пример структуры каталогов (копирование из Matt):

/application
    /modules/
        /default
            /controllers
            /forms
                Contact.php
                Login.php
                Register.php
                Support.php
            /models
                Comment.php
                User.php
                Users.php
            /views
        /admin
            /controllers
            /views

Примеры имен классов форм:

Default_Forms_Contact
Default_Forms_Login
Default_Forms_Register
Default_Forms_Support

Я называю свои модели и плагины одинаково, чтобы все было просто.

Я надеюсь, что эта проблема будет исправлена ​​в более поздних версиях Zend Framework.

UPDATE: Эта структура не работает на платформах * nix. Обнаружил это с трудом! Zend Loader нуждается в папках модулей, форм и моделей, которые должны быть заглавными для работы в чувствительной к регистру среде.

Ответ 5

Мне лично нравится держать их в папке приложения, так как я не думаю, что они принадлежат к библиотеке, и только одна папка упрощает их автозагрузку.

/application
/forms
/modules/
    /default
        /controllers
        /views
    /admin
        /controllers
        /views
/libray/
    /Zend

и я просто добавил путь формы к include_path, и мне хорошо идти.

Ответ 6

инструмент команды zend может создавать для него формы:

zf создать форму продаж продукта

где sales - это имя модуля, командный инструмент создает форму каталога внутри продаж модуля и файл Product.php с классом:

class sales_Form_Product extends Zend_Form {

и вам нужно добавить определение Zend_Application_Module_Autoloader, чтобы определить каталог вашего модуля

Ответ 7

 $selectexamname = new Admin_Form_examresults_Selectexamname();
        $this->view->selectexamname = $selectexamname;

ваш класс должен определить в соответствии с этим форматом

class Admin_Form_examresults_Selectexamname extends Zend_Form {}

Ответ 8

Я помещаю все свои модели в папку в библиотеке. Понятие - это название моей компании.

/application
/modules/
    /default
        /controllers
        /views
    /admin
        /controllers
        /views
/libray/
    /Zend
    /Notion
        /Form

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

Notion_Form_Login
Notion_Db_Manager_Login