2011-11-26 14 views
5

に私は私のMagentoの店をajaxifyingていますし、ほとんどすべてがswimmingly起こっている、一つのことを除い:は、Magentoの組み込みのメッセージシステムを使用したカスタムコントローラ+アクション

問題: 私はできないように見えますAJAXリクエストに対するレスポンスのメッセージブロックを取得して表示する。

説明: (例えばよりカートに多くの項目を追加する動作しませんでした何かをしようとした後、ユーザーに表示されるバー(これは成功メッセージがあるとき、または緑)私は赤いについて話しています在庫が許せます)。エラーを生成する特定のAjaxリクエストに応答するとき、このAjaxリクエストに対するレスポンスをレンダリングするために使用されるかなり空のテンプレートを通してメッセージのマークアップを表示します。エラーが発生しなければ、異なる適切な応答がレンダリングされます。私が試した

物事:データを銀杏

$_messages = Mage::getSingleton("core/session")->getMessages(); 
echo $this->getLayout()->createBlock("core/messages")->setMessages($_messages)->getGroupedHtml(); 

echo $this->getMessagesBlock()->getGroupedHtml(); 

echo Mage::app()->getLayout()->getMessagesBlock()-> 
     setMessages(Mage::getSingleton('customer/session')->getMessages(true))->getGroupedHtml(); 

Mage::logは、空のメッセージのコレクションを示しています ここで私が使用しようとしたPHPコードの数行です。

レイアウトXMLは次のとおりです(コントローラから$this->loadLayout('ajax_msg_handle');を使用しています)。

また
<ajax_msg_handle> 
    <block type="core/template" name="error.root" output="toHtml" template="page/html/ajax-messages.phtml"> 
    <block type="core/messages" name="global_messages" as="global_messages"/> 
    <block type="core/messages" name="messages" as="messages"/> 
    </block> 
</ajax_msg_handle> 

細部のポイント、私は次のよう考えられてきた:カートの「削除」、「編集」などの

ほとんどのアクションを、商品ページの「カートに追加」、最初にリダイレクト別の場所に格納されているため、エラーを示す2番目の要求が行われます。おそらくこれらのメッセージはすぐに表示されることはありませんが、エラーを生成した後に要求に応答する場合に限ります。だから私は、これらのメッセージを表示するアクションにリダイレクトすることによって、この可能な規則に従おうとしましたが、これはうまくいきませんでした。

メッセージを表示する方法を教えてもらえれば、それは私の一日になります。

答えて

4

あなたが使用しようとしているメッセージブロックは、AJAXクエリでは動作しません。あなたが指摘してきたように、それだけつまり、リダイレクト後に表示されます。メッセージは何かによってセッションに設定されている

  • :その後、Mage::getSingleton('adminhtml/session')->addError(Mage::helper('modulename')->__('error message'));
  • をされてリダイレクト:$this->_redirect('*/*/');
  • ブランドをトリガーレイアウトをロードする新しいクエリ。レイアウトが設定されると、メッセージがあるので、それが表示されます。

(リダイレクトなしすなわち、)AJAX呼び出しに直接メッセージブロックを表示するためには、あなたが持っている:

お使いのコントローラのアクションで
  • :メッセージを設定し、ブロックをロードします。

    あなたの居場所の中に
    Mage::register('message', Mage::helper('yourmodule')->__('the error message'); 
    $layout = $this->getLayout(); 
    $update = $layout->getUpdate(); 
    $update->load('ajax_msg_handle'); //loading your custom handle, defined in your module's layout .xml file 
    $layout->generateXml(); 
    $layout->generateBlocks(); 
    $output = $layout->getOutput(); 
    $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('error' => $output))); 
    
  • PHTML echoメッセージ:あなたのAJAX呼び出しのonCompleteの一部で

    <ul class="messages"> 
        <li class="error-msg"> 
         <ul> 
          <li><?php echo Mage::registry('message'); ?></li> 
         </ul> 
        </li> 
    </ul> 
    
  • 出力あなたのjavascriptのコードで応答:それはもっと自分自身のブロックを作るために練習することを

    onComplete: function(transport) { 
        $$('.main-col-inner')[0].insert({before:transport.responseText.evalJSON().error}); 
        Element.hide('loading-mask'); 
    } 
    

注意Mage_Core_Block_Messagesを拡張し、レジストリを使用する代わりに、そのブロックのメソッド内のメッセージを管理します。
希望があれば

+0

ありがとう!まだメッセージが表示されていないと判断された場所はまだわかりませんが、あなたの方法は問題を効果的に解決します。 – pancake

関連する問題