Лучший способ вывести данные ajax из расширения Magento Admin - PullRequest
5 голосов
/ 14 декабря 2010

Я пишу расширение для Magento Admin, в котором есть несколько обратных вызовов ajax. До сих пор я повторял json, который я передаю через вызов ajax с простым оператором echo в контроллере. Это "работает", но я получаю кучу ошибок, подобных этой, в моем лог-файле:

1003 *

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

Я думаю, чтобы избежать этого, мне нужно вытолкнуть его через какой-то блок. Может кто-нибудь дать мне небольшое руководство по этому вопросу?

Ответы [ 2 ]

24 голосов
/ 14 декабря 2010

Magento использует объект ответа для отправки вывода обратно в браузер. Даже когда вы вызываете renderLayout из контроллера, Magento просто создает вывод строки в памяти перед выводом. Причина, по которой вы получаете эту ошибку, заключается в том, что после диспетчеризации контроллера имеется системный код, который пытается установить заголовки, но ваш неожиданный вывод контроллера не позволяет установить эти заголовки.

Самое простое решение - бросить

exit;

в сразу после выхода вашего контроллера. Это останавливает выполнение, ваш ответ ajax отправляется, мир счастлив. Радуйтесь.

С другой стороны, если вы ищете этот всегда неуловимый «правильный» путь, основанный на примерах в ядре, похоже, что вы можете вызывать следующее из вашего контроллера, чтобы получить объект ответа, а затем напрямую установить его тело.

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

Если вы выполните вышеизложенное, вы обходите систему макетов Magento и настраиваете вывод напрямую, но сохраняете ответственность за отправку вывода с объектом ответа.

Возможно, вы захотите установить свои собственные значения для заголовков (JSON, XML и т. Д.), Что вы можете сделать с помощью чего-то вроде следующего (опять же, из действия контроллера)

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

Удачи!

5 голосов
/ 14 декабря 2010
$this->getResponse()->setBody($output)
...