【问题标题】: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 逐个操作自动渲染?

【问题讨论】:

  • 或者你可以使用上下文切换器来实现这个功能。看看this answer

标签: 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-02
      • 1970-01-01
      • 2010-12-04
      • 2012-06-06
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多