无法在Zend Framework Controller插件中的postDispatch()中的viewRenderer上调用setNoRender()

时间:2011-03-24 12:42:45

标签: php zend-framework

调用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();
    }
}

视图脚本仍然呈现。插件肯定在运行,因为我可以将回声放在这里并输出。

4 个答案:

答案 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。