当发送 AJAX 响应时,如何使 Zend Framework 不呈现视图/布局?

42

Zend的文档对此并不是很清晰。

问题在于,Zend默认会在每个控制器动作的结尾自动渲染视图。如果您正在使用布局 - 为什么不呢?- 它也会进行渲染。这对于正常的Web页面来说是可以的,但当您发送AJAX响应时,您并不希望全部都被渲染。如何逐个动作地防止Zend自动渲染呢?


或者你可以使用上下文切换器来实现这个功能。请查看这个答案 - Goran Jurić
3个回答

95

从任何将发送AJAX响应的操作中调用此代码:

$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);

这将禁用该操作的布局引擎,并关闭该操作的自动视图渲染。然后,您可以只需“echo”您所需的 AJAX 输出,无需担心一般的视图/布局内容随之发送。


19

如果你的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
...
}

谢谢,这比输入多行以禁用渲染要好得多。 - mic

-3
或者你可以在操作的末尾放置die()函数。
public function someAction()
{
    echo json_encode($data);
    die();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接