2010-12-14 2 views
5

Magento Admin拡張機能を作成していますが、そこにはいくつかのAjaxコールバックがあります。これまで、私はjsonをエコーし​​ていましたが、コントローラー内の単純なechoステートメントでajax呼び出しをフィードバックしています。それは、 "作品" が、私は私のログファイルにこのようなエラーの束を得る:Magento Admin ExtensionからAjaxデータを出力する最良の方法

2010-12-14T15:37:05 + 00:00 DEBUG(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 

私はこれを避けるために、何らかのブロックを押し出す必要があると思います。誰かが私にこれに関する少しの指導を与えることができますか?

答えて

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'); 

幸運を独自の値を設定することもできます!

関連する問題