调用setNoRender()或者实际上viewRenderer助手上的任何方法似乎对控制器插件都没有影响。
class TestPlugin extends Zend_Controller_Plugin_Abstract
{
public function postDispatch(Zend_Controller_Request_Abstract $request)
{
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setNoRender();
}
}
视图脚本仍然呈现。插件肯定在运行,因为我可以将回声放在这里并输出。
答案 0 :(得分:5)
你必须将它放在你的Controller插件postDispatch
中。
$viewRenderer = Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer');
$viewRenderer->setNeverRender(true);
答案 1 :(得分:1)
这是否适用于任何其他钩子,例如preDispatch()?
答案 2 :(得分:1)
如果有人想要使用控制器插件禁用布局和视图,这里是preDispatch钩子,我在不同文章和答案的帮助下工作,包括这个。 希望它可以帮助某人,并节省一些时间。
// in Controller Plugin
public function preDispatch(){
//if its an AJAX request then disable layout and view.
if ($this->_request->isXmlHttpRequest() || isset($_GET['ajax'])){
// disable layout
$layout = Zend_Controller_Action_HelperBroker::getExistingHelper('Layout');
$layout->disableLayout();
// disable view
$viewRenderer = Zend_Controller_Action_HelperBroker::getExistingHelper('viewRenderer');
$viewRenderer->setNeverRender(true);
}
}
答案 3 :(得分:0)
我也无法从控制器插件初始化脚本中弄清楚如何做到这一点。但是,有一个简单的解决方法。您可以使用以下标准代码在基本控制器的preDispatch中执行此操作:
$this->_helper->viewRenderer->setNoRender(true);
所有控制器都应该继承自这个基本控制器,它本身扩展了Zend_Controller_Action。