我正在编写一个Magento Admin扩展,其中包含一些ajax回调。到目前为止,我一直在回应json,我正在通过ajax调用反馈控制器中的一个简单的echo语句。它“有效”,但我在日志文件中收到了一堆这样的错误:
2010-12-14T15:37:05 + 00:00调试(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
我认为要避免这种情况,我需要通过某种方式将其推出。有人可以给我一点指导吗?
答案 0 :(得分: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');
祝你好运!
答案 1 :(得分:5)
$this->getResponse()->setBody($output)