代码之家  ›  专栏  ›  技术社区  ›  Don Jones

在发送Ajax响应时,如何使Zend框架不呈现视图/布局?

  •  42
  • Don Jones  · 技术社区  · 16 年前

    Zend的文档对此不太清楚。

    问题是,默认情况下,Zend会在每个控制器操作结束时自动呈现视图。如果你在使用一个布局-为什么不呢?-它也呈现了这一点。这对于普通的网页来说是很好的,但是当你发送一个Ajax响应时,你不需要所有这些。如何防止Zend逐个操作自动呈现?

    3 回复  |  直到 12 年前
        1
  •  92
  •   Don Jones    16 年前

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

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

    这将禁用该操作的布局引擎,并关闭该操作的自动视图呈现。然后,您可以“回送”任何您想要的Ajax输出,而不必担心正常的视图/布局的东西会被发送。

        2
  •  18
  •   Echilon Mafarnakus    13 年前

    如果Ajax返回JSON,则可以使用JSON操作助手:

    $this->_helper->json($data);
    

    这个助手会 json_encode 您的$data,用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
    ...
    }
    
        3
  •  -2
  •   midan888    12 年前

    或者您可以简单地将die()函数放在操作结束时

    public function someAction()
    {
        echo json_encode($data);
        die();
    }