【问题标题】:How do you make Zend Framework NOT render a view/layout when sending an AJAX response?如何让 Zend Framework 在发送 AJAX 响应时不呈现视图/布局?
【发布时间】:2010-12-02 16:35:37
【问题描述】:
Zend 的文档对此并不十分清楚。
问题在于,默认情况下,Zend 会在每个控制器操作结束时自动呈现视图。如果您使用的是布局 - 为什么不呢? - 它也呈现了这一点。这对于普通网页来说很好,但是当您发送 AJAX 响应时,您不需要所有这些。如何防止 Zend 逐个操作自动渲染?
【问题讨论】:
标签:
ajax
zend-framework
layout
【解决方案1】:
在任何将要发送 AJAX 响应的操作中调用此代码:
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
这将禁用该操作的布局引擎,并关闭该操作的自动视图呈现。然后,您可以“回显”您希望 AJAX 输出的任何内容,而不必担心正常的视图/布局内容会被发送出去。
【解决方案2】:
如果您的 AJAX 返回 JSON,您可以使用 JSON 操作助手:
$this->_helper->json($data);
这个助手将json_encode你的$data,用JSON头输出它,最后死掉,所以我们从动作返回干净的JSON,没有布局和视图渲染。
f.e.我在行动中使用这种结构开始避免针对不同操作的多个 ACL 检查只是为了 ajax
public function photosAction() {
if ($this->getRequest()->getQuery('ajax') == 1 || $this->getRequest()->isXmlHttpRequest()) {
$params = $this->getRequest()->getParams();
$result = false;
switch ($params['act']) {
case 'deleteImage':
//deleting something
...
$result = true; //ok
break;
default :
$result = array('error' => 'Invalid action: ' . $params['act']);
break;
}
$this->_helper->json($result);
}
// regular action code here
...
}
【解决方案3】:
或者你可以简单地将 die() 函数放在动作的末尾
public function someAction()
{
echo json_encode($data);
die();
}