我有一个前置控制器插件。
它适用于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,那么数字是否有用?
答案 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
等)。