2009-09-30 55 views
41

Zend的文檔不太清楚。如何讓Zend Framework在發送AJAX響應時不呈現視圖/佈局?

問題在於,默認情況下,Zend會在每個控制器操作結束時自動呈現視圖。如果你使用的是佈局 - 你爲什麼不這樣做? - 它也呈現。這對普通網頁來說很好,但是當你發送AJAX響應時,你並不需要這些。如何防止Zend在逐個行爲的基礎上自動呈現?

+0

或者您可以使用上下文切換器來實現此功能。看看[這個答案](http://stackoverflow.com/questions/1499322/mvc-how-to-ajax/1499947#1499947)。 – 2009-09-30 19:56:33

回答

90

呼叫無論從任何動作(S)內該代碼/將要發送Ajax響應:

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

這樣就關閉了該動作的佈局引擎,它會關閉自動視圖渲染爲行動。然後,您可以隨意「回聲」任何您想要的AJAX輸出,而不用擔心正常的視圖/佈局的東西被派上用場。

16

如果你的AJAX正在返回JSON,你可以使用JSON動作助手:

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

這個助手將與JSON頭json_encode你的$的數據,輸出它,最後死了,所以我們得到乾淨的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 
... 
} 
+0

謝謝,這是更好,不得不放在多行禁用渲染。 – mic 2018-01-02 16:59:02

-1

或者你可以簡單地把die()函數在動作結束

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