Zend的文檔不太清楚。如何讓Zend Framework在發送AJAX響應時不呈現視圖/佈局?
問題在於,默認情況下,Zend會在每個控制器操作結束時自動呈現視圖。如果你使用的是佈局 - 你爲什麼不這樣做? - 它也呈現。這對普通網頁來說很好,但是當你發送AJAX響應時,你並不需要這些。如何防止Zend在逐個行爲的基礎上自動呈現?
Zend的文檔不太清楚。如何讓Zend Framework在發送AJAX響應時不呈現視圖/佈局?
問題在於,默認情況下,Zend會在每個控制器操作結束時自動呈現視圖。如果你使用的是佈局 - 你爲什麼不這樣做? - 它也呈現。這對普通網頁來說很好,但是當你發送AJAX響應時,你並不需要這些。如何防止Zend在逐個行爲的基礎上自動呈現?
呼叫無論從任何動作(S)內該代碼/將要發送Ajax響應:
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender(TRUE);
這樣就關閉了該動作的佈局引擎,它會關閉自動視圖渲染爲行動。然後,您可以隨意「回聲」任何您想要的AJAX輸出,而不用擔心正常的視圖/佈局的東西被派上用場。
如果你的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
...
}
謝謝,這是更好,不得不放在多行禁用渲染。 – mic 2018-01-02 16:59:02
或者你可以簡單地把die()函數在動作結束
public function someAction()
{
echo json_encode($data);
die();
}
或者您可以使用上下文切換器來實現此功能。看看[這個答案](http://stackoverflow.com/questions/1499322/mvc-how-to-ajax/1499947#1499947)。 – 2009-09-30 19:56:33