Zend的文档对此并不是很清晰。
问题在于,Zend默认会在每个控制器动作的结尾自动渲染视图。如果您正在使用布局 - 为什么不呢?- 它也会进行渲染。这对于正常的Web页面来说是可以的,但当您发送AJAX响应时,您并不希望全部都被渲染。如何逐个动作地防止Zend自动渲染呢?
Zend的文档对此并不是很清晰。
问题在于,Zend默认会在每个控制器动作的结尾自动渲染视图。如果您正在使用布局 - 为什么不呢?- 它也会进行渲染。这对于正常的Web页面来说是可以的,但当您发送AJAX响应时,您并不希望全部都被渲染。如何逐个动作地防止Zend自动渲染呢?
从任何将发送AJAX响应的操作中调用此代码:
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
这将禁用该操作的布局引擎,并关闭该操作的自动视图渲染。然后,您可以只需“echo”您所需的 AJAX 输出,无需担心一般的视图/布局内容随之发送。
如果你的AJAX返回JSON,你可以使用JSON操作助手:
$this->_helper->json($data);
这个辅助方法会对你的$data进行json_encode
,并将其以JSON头输出,最后结束程序。这样我们就可以在不需要布局和视图渲染的情况下获取干净的JSON返回结果。
例如:我在动作开始使用这个结构,以避免为不同的动作进行多个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
...
}
public function someAction()
{
echo json_encode($data);
die();
}