防止socialengine呈现视图(对于AJAX)

时间:2015-09-29 12:52:45

标签: json ajax layout socialengine

默认情况下,SocialENgine会在每个控制器操作结束时自动呈现视图。如果你正在使用布局,它也会渲染。这适用于普通网页,但是当您发送AJAX响应时,您不希望这一切。如何在逐个动作的基础上阻止SocialEngine自动呈现?使用ZendFramework,您可以这样做:

$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);

你可以访问一些好帮手,如:

$this->_helper->json($data);

...将json_encode你的$ data,用JSON标题输出它并最终死掉,所以从动作返回的干净JSON没有视图渲染,这正是我想要的。

然而,这些解决方案都不适用于SocialEngine - $ this-> _helper似乎总是一个空数组,就像$ this-> view-> _helper一样。并返回$ this-> setNoRender()仅阻止当前元素呈现,而不是整个页面。

2 个答案:

答案 0 :(得分:2)

在一些默认小部件中,我发现了这个函数调用,它完全禁止了小部件的渲染:

return $this->setNoRender();

如果您有兴趣,可以在 Engine_Content_Widget_Abstract 中实现。

最佳, 本尼。

答案 1 :(得分:0)

我在小部件控制器的上下文中遇到了这个问题。

我访问json()助手的解决方案是制作并实例化扩展抽象 Core_Controller_Action_Standard 的具体类,并公开包装器方法以将json发送到小部件的Controller.php文件中。 :

class Widget_MyWidgetAjaxController extends Core_Controller_Action_Standard
{
    public function sendjson($data) {
        return $this->_helper->json($data);
    }
}

在小部件的控制器中使用的方式如下:

class Widget_MyWidgetController extends Engine_Content_Widget_Abstract
{
    public function indexAction() 
    {
        // This is an ajax request to our widget controller
        if ($this->getRequest() && $this->getRequest()->isPost()) {

            // Do whatever processing you need 
            // [...]
            $response_data=array('hello','world');

            $ajax = new Widget_TrackablesAjaxController(
                $this->getRequest(), 
                new Zend_Controller_Response_Http
            );

            return $ajax->sendjson($response_data);
        }
    }
}

我不必显式禁用layout()或setNoRender()。通过_helper-> json()进行响应就足够了。