从 Magento 管理扩展输出 ajax 数据的最佳方法

发布于 2024-10-07 13:16:30 字数 809 浏览 2 评论 0原文

我正在编写一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

GRAY°灰色天空 2024-10-14 13:16:30

Magento 使用响应对象将输出发送回浏览器。即使当您从控制器调用 renderLayout 时,Magento 也只是在输出之前在内存中构建字符串输出。您收到此错误的原因是控制器分派后有系统代码尝试设置标头,但意外的控制器输出阻止设置这些标头。

最简单的解决方案是

exit;

在控制器输出后直接添加一个 in 。这会停止执行,您的 ajax 响应已发送,世界很高兴。麾。

或者,如果您正在寻找那种总是难以捉摸的“正确”方式,基于核心中的示例,看起来您可以从控制器调用以下内容来检索响应对象,然后直接设置其主体。

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

如果执行上述操作,您将绕过 Magento 布局系统并直接设置输出,但保留使用响应对象发送输出的责任。

您可能想要为标头设置您自己的值(JSON、XML 等),您可以使用类似以下内容的方法(同样来自控制器操作)

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

祝您好运!

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

exit;

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.

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

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)

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

Good luck!

苏璃陌 2024-10-14 13:16:30
$this->getResponse()->setBody($output)
$this->getResponse()->setBody($output)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文