从 Magento 管理扩展输出 ajax 数据的最佳方法
我正在编写一个 Magento 管理扩展,其中包含一些 ajax 回调。到目前为止,我一直在控制器中使用简单的 echo 语句来回显通过 ajax 调用反馈的 json。它“有效”,但我在日志文件中收到一堆这样的错误:
2010-12-14T15:37:05+00:00 调试 (7):标头已发送:
[0] /home/simplifiedsafety/www/store/app/code/core/法师/核心/控制器/响应/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
我认为为了避免这种情况,我需要将其推出某种障碍。有人可以给我一些指导吗?
I'm writing a Magento Admin extension that has some ajax callbacks in it. Up until now I've been echoing the json I'm feeding back through the ajax call with a simple echo statement in the controller. It "works" but I get a bunch of errors like this in my log file:
2010-12-14T15:37:05+00:00 DEBUG (7): HEADERS ALREADY SENT:
[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
I think to avoid this I need to push it out through some sort of block. Can someone give me a little guidance on this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Magento 使用响应对象将输出发送回浏览器。即使当您从控制器调用 renderLayout 时,Magento 也只是在输出之前在内存中构建字符串输出。您收到此错误的原因是控制器分派后有系统代码尝试设置标头,但意外的控制器输出阻止设置这些标头。
最简单的解决方案是
在控制器输出后直接添加一个 in 。这会停止执行,您的 ajax 响应已发送,世界很高兴。麾。
或者,如果您正在寻找那种总是难以捉摸的“正确”方式,基于核心中的示例,看起来您可以从控制器调用以下内容来检索响应对象,然后直接设置其主体。
如果执行上述操作,您将绕过 Magento 布局系统并直接设置输出,但保留使用响应对象发送输出的责任。
您可能想要为标头设置您自己的值(JSON、XML 等),您可以使用类似以下内容的方法(同样来自控制器操作)
祝您好运!
Magento uses a response object to send output back to the browser. Even when you call
renderLayout
from a controller, Magento is just building up the string output in memory before outputting it. The reason you're getting this error is there's system code after the controller dispatch that's attempting to set headers, but your unexpected controller output prevents those headers from being set.The simplest solution is throw an
in directly after your controller output. This halts execution, your ajax response is sent, the world is happy. Rejoice.
Alternately, if you're looking for that always elusive "right" way, based on examples in the core, it looks like you can call the following from your controller to retrieve the response object, and then set its body directly.
If you do the above, you're bypassing the Magento layout system and setting output directly, but keeping the responsibility of sending the output with the response object.
You may want to set your own values for headers (JSON, XML, etc), which you can do with something like the following (again, from a controller action)
Good luck!