Zend的文档在这方面并不是很清楚。
问题在于,默认情况下,Zend会在每个控制器操作结束时自动呈现视图。如果你正在使用布局 - 为什么不呢? - 它也呈现了这一点。这适用于普通网页,但是当您发送AJAX响应时,您不希望这一切。你如何防止Zend在逐个动作的基础上自动渲染?
答案 0 :(得分:92)
从将要/将要发送AJAX响应的动作中调用此代码:
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
这将禁用该操作的布局引擎,并关闭该操作的自动视图呈现。然后你就可以“回应”任何你想要的AJAX输出,而不用担心正常的视图/布局内容会被送到那里。
答案 1 :(得分:18)
如果您的AJAX返回JSON,您可以使用JSON操作助手:
$this->_helper->json($data);
这个帮助器将json_encode
你的$ data,用JSON头输出它并最终死掉,所以我们从动作返回干净的JSON,没有布局和视图渲染。
f.e。我正在使用这种结构开始,以避免多次ACL检查不同的操作just-for-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
...
}
答案 2 :(得分:-2)
或者你可以简单地将die()函数放在动作的末尾
public function someAction()
{
echo json_encode($data);
die();
}