默认情况下,SocialENgine会在每个控制器操作结束时自动呈现一个视图。如果你使用的是一个布局,它也会渲染它。这对于普通的Web页面来说很好,但是当您发送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也是如此。而return $this->setNoRender()只阻止当前元素呈现,而不是整个页面。
发布于 2016-08-18 18:33:17
在一些默认的小部件中,我发现了这个函数调用,它完全抑制了小部件的呈现:
return $this->setNoRender();它是用Engine_Content_Widget_Abstract实现的,如果你感兴趣的话。
最好的,本尼。
发布于 2018-10-10 12:51:37
我在小部件控制器的上下文中遇到了这个问题。
我访问json()帮助器的解决方案是创建并实例化一个扩展抽象Core_Controller_Action_Standard的具体类,并公开一个包装器方法以在小部件的Controller.php文件中发送json:
class Widget_MyWidgetAjaxController extends Core_Controller_Action_Standard
{
public function sendjson($data) {
return $this->_helper->json($data);
}
}这在Widget的控制器中使用,如下所示:
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);
}
}
}我不必显式地使用disableLayout()或setNoRender()。通过_helper->json()进行响应就足够了。
https://stackoverflow.com/questions/32844541
复制相似问题