2010-12-14 7 views
5

Estoy escribiendo una extensión de administrador de Magento que tiene algunas devoluciones de llamada ajax. Hasta ahora he estado haciendo eco de la json que estoy retroalimentando a través de la llamada ajax con una declaración de eco simple en el controlador. Que "funciona" pero me da un montón de errores como éste en mi archivo de registro:La mejor manera de generar datos ajax desde una extensión de administrador de Magento

2010-12-14T15: 37: 05 + 00: 00 de depuración (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 

Creo que para evitar esto tengo que empujarlo a través de algún tipo de bloque. ¿Alguien puede darme un poco de orientación sobre esto?

Respuesta

24

Magento usa a response object para enviar la salida de vuelta al navegador. Incluso cuando llame al renderLayout desde un controlador, Magento solo está creando la salida de cadena en la memoria antes de enviarla. La razón por la que recibe este error es que hay un código de sistema después del despacho del controlador que intenta establecer encabezados, pero su salida inesperada del controlador impide que se establezcan dichos encabezados.

La solución más simple es tirar una

exit; 

directamente después de su salida del controlador. Esto detiene la ejecución, se envía tu respuesta ajax, el mundo está feliz. Alegrarse.

Alternativamente, si está buscando esa forma "correcta" siempre elusiva, basada en ejemplos en el núcleo, parece que puede llamar a lo siguiente desde su controlador para recuperar el objeto de respuesta, y luego establecer su cuerpo directamente .

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

Si haces lo anterior, que está pasando por alto el sistema de diseño de Magento y el establecimiento de salida directamente, pero manteniendo la responsabilidad de enviar la salida con el objeto respuesta.

Es posible que desee establecer sus propios valores para los encabezados (JSON, XML, etc.), que se puede hacer con algo como lo siguiente (de nuevo, a partir de una acción del controlador)

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

Buena suerte!

Cuestiones relacionadas