如何在执行控制动作后运行动作(在所有页面中)

时间:2011-05-05 08:29:53

标签: zend-framework plugins dispatcher front-controller

我有一个前置控制器插件。

它适用于dispatcherloodstartup metod,但是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');
    }
}

这是我的bootsrap代码:

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

如果我必须使用stackpush,那么数字是否有用?

1 个答案:

答案 0 :(得分:1)

首先。这是一种不好的做法。您必须做3个调度环形交叉口(发送前后的所有插件,控制器预先和发布,......) - 如果可能的话,我会切换到一个前端控制器插件,这将填充适当的布局变量并使用部分/视图助手来渲染它们。

您的代码存在的问题是,在postDispatch()中,您的请求已经isDispatched = true,这意味着它无法再次发送。选项可能是自己创建请求。然后将其推送到actionstack。

此外,你可以使用动作堆栈方法$this->actionstack($action, $controller, $module, $params),它将为你创建请求;)你可以得到像$params = $frontController->getRequest()->getParams()或者......这样的当前参数。那样(不是100%确定方法名称)。

编辑:

如果将工具栏渲染放入布局中,则没有问题。您可以将变量分配给视图,它们将在布局中准备就绪。你只有echo $this->render('toolbar.phtml');而且那就是全部。它将始终在渲染所有操作后呈现,因为布局是最后渲染的视图。只需确保您的工具栏变量不会与其他变量发生冲突(好主意是用某些内容重新修改它们 - 比如说$this->toolbarUsername;$this->toolbarIsLogged等)。