как выполнить действие после выполнения действия управления (на всех страницах) - PullRequest
1 голос
/ 05 мая 2011

у меня есть плагин для frontcontroller.

он отлично работает для метода dispatcherloodstartup, но postdispatcher не может вызвать действие !!

что не так?!

этомой плагин:

class Places_Controller_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract
{

public function dispatchLoopStartup( Zend_Controller_Request_Abstract $request)
    {
        $front = Zend_Controller_Front::getInstance();

        if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
                $actionStack = new Zend_Controller_Plugin_ActionStack();
                $front->registerPlugin($actionStack, 97);
            } else {
            $actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack');
        }

            $menuAction = clone($request);
            $menuAction->setActionName('menu')->setControllerName('index');
            $actionStack->pushStack($menuAction);

    }


    public function postDispatch(Zend_Controller_Request_Abstract $request)
    {     $menuAction = clone($request);
        $menuAction->setActionName('toolbar')->setControllerName('index');
    }
}

это мой код начальной загрузки:

$frontController->registerPlugin(new Places_Controller_Plugin_ActionSetup(), 98);

если я должен использовать стек, какой номер полезен?

1 Ответ

1 голос
/ 05 мая 2011

Во-первых.Это плохая практика.Вы должны сделать 3 обхода обхода (все плагины до и после отправки, контроллеры до и после, ...) - если возможно, я бы переключился на один плагин фронт-контроллера, который заполнит соответствующие переменные макета и использует партиалы / просмотр помощников длясделать их.

Проблема с вашим кодом в том, что в postDispatch () ваш запрос уже имеет isDispatched = true, что означает, что он не будет отправлен снова.Вариант может быть, чтобы создать запрос самостоятельно.А затем отправьте его в стек действий.

Также вы можете использовать методы actiontack $this->actionstack($action, $controller, $module, $params), которые создадут запрос для вас;) Вы можете получить текущие параметры, например, $params = $frontController->getRequest()->getParams() или sth.вот так (не уверен на 100% в названии метода).

РЕДАКТИРОВАТЬ:

Если вы поместите рендеринг панели инструментов в макет, то проблем не будет.Вы можете назначить переменные представлению, и они будут готовы в макете.У тебя просто будет echo $this->render('toolbar.phtml'); и все.Он всегда будет отображаться после выполнения всех действий, поскольку макет является последним отображаемым видом.Просто убедитесь, что ваши переменные панели инструментов не сталкиваются с другими переменными (хорошая идея - перефиксировать их чем-нибудь - скажем, $this->toolbarUsername;$this->toolbarIsLogged и т. Д.)

...