Zend Framework общий код для всех контроллеров - PullRequest
2 голосов
/ 26 июня 2009

У меня есть кнопка входа в шапку сайта. HTML-код этого заголовка запрограммирован в Zend Framework views / layouts / home.phtml.

У меня есть скрытая форма в этом макете, которая вызывается интеграцией отображения содержимого jQuery Thickbox. Причина в том, что я не хочу совершать ajax-вызов, чтобы просто получить небольшую форму для входа.

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

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

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

Ответы [ 3 ]

2 голосов
/ 24 сентября 2012

Будьте осторожны с решением Прадипа Шармы (ответ, который он написал сам и принял ниже).

Весь код ниже приведен для ZF 1.12, а не ZF 2.0

В начальной загрузке экземпляр MVC Zend_Layout, возможно, еще не был создан. Вы должны использовать Zend_Layout::startMvc() вместо:

$view = Zend_Layout::startMvc()->getView() ;

И я предпочитаю выполнять этот код в функции preDispatch (). Новые пользователи ZF могут быть заинтересованы в этом:

application / plugins / HeaderForm.php:

class Application_Plugin_HeaderForm extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {    
        $view = Zend_Layout::startMvc()->getView() ;
        $view->headerForm = new Application_Form_HeaderForm() ;
    }
}

Вызов нового Application_Form_HeaderForm() по умолчанию автоматически загрузится в папку application / forms / . Вы также можете создать форму непосредственно в плагине с помощью new Zend_Form(), addElement() и т. Д., Но она не будет использоваться повторно.

Конечно, вам нужно зарегистрировать этот плагин в вашем загрузчике!

application / Bootstrap.php:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initPlugin()
    {
        $front = Zend_Controller_Front::getInstance() ;
        $front->registerPlugin(new Application_Plugin_HeaderForm()) ;
    }
}

Вызов нового Application_Plugin_HeaderForm() по умолчанию автоматически загрузится в папку application / plugins /

2 голосов
/ 04 июля 2009

Создайте свой собственный базовый контроллер, который расширяет Zend_Controller_Action, затем ваши контроллеры расширяются от вашего базового контроллера. Я не знаю, что такое «интеграция встроенного отображения содержимого jQuery Thickbox» ... но у вас есть несколько разделов, в которые вы можете вставить это в зависимости от того, когда вам нужен код для запуска. init (), preDispatch (), postDispatch () и т. д. Просто убедитесь, что при расширении базового контроллера вы делаете следующее:

родитель :: Init () Родитель :: preDispatch () Родитель :: postDispatch () и т.д ... в каждом разделе, чтобы базовый код также работал ...

1 голос
/ 07 июля 2009

Я сделал это по-другому, расширив Zend_Controller_Plugin_Abstract для реализации плагина и регистрации его на фронт-контроллере.

public function routeStartup(Zend_Controller_Request_Abstract $request) { } 

сгенерировал форму внутри вышеупомянутого метода и установил форму в объекте $ view.

$ view может быть восстановлен с помощью:

$view = Zend_Layout :: getMvcInstance()->getView();
...