默认情况下,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()仅阻止当前元素呈现,而不是整个页面。
答案 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()进行响应就足够了。