2010-12-14 58 views
5

我在寫一個Magento Admin擴展,它裏面有一些Ajax回調。直到現在,我一直在用控制器中的一個簡單的echo語句迴應通過ajax調用反饋的json。它 「作品」,但我得到了一堆這樣的錯誤在我的日誌文件:從Magento Admin Extension輸出Ajax數據的最佳方法

2010-12-14T15:37:05 + 00:00 DEBUG(7):接頭已經發出:

[0] /home/simplifiedsafety/www/store/app/code/core/Mage/Core/Controller/Response/Http.php:44 
[1] /home/simplifiedsafety/www/store/lib/Zend/Controller/Response/Abstract.php:727 
[2] /home/simplifiedsafety/www/store/app/code/core/Mage/Core/Controller/Response/Http.php:75 
[3] /home/simplifiedsafety/www/store/app/code/core/Mage/Core/Controller/Varien/Front.php:188 
[4] /home/simplifiedsafety/www/store/app/code/core/Mage/Core/Model/App.php:304 
[5] /home/simplifiedsafety/www/store/app/Mage.php:599 
[6] /home/simplifiedsafety/www/store/index.php:104 

我認爲要避免這種情況,我需要通過某種程序塊將其推出。有人能給我一點這方面的指導嗎?

回答

24

Magento使用a response object將輸出發送回瀏覽器。即使你從控制器調用renderLayout,Magento也只是在輸出之前在內存中建立字符串輸出。你得到這個錯誤的原因是在控制器調度嘗試設置標題後有系統代碼,但是你的意外控制器輸出阻止了這些標題的設置。

最簡單的辦法是你的控制器輸出後拋出

exit; 
直接

。這停止執行,你的Ajax響應被髮送,世界很高興。麾。另外,如果你正在尋找那種總是難以捉摸的「正確」方式,根據核心中的例子,它看起來像你可以從你的控制器調用以下內容來檢索響應對象,然後直接設置它的主體。

$this->getResponse()->setBody('Some Response'); 

如果你做到上面,你繞過Magento的佈局系統和直接設置輸出,但保持與發送響應對象輸出的責任。

您可能需要設置自己的值報頭(JSON,XML等),您可以像下面這樣做(再次,從控制器動作)

$this->getResponse() 
->clearHeaders() 
->setHeader('Content-Type', 'text/xml') 
->setBody('Some Response'); 

祝你好運!