在自定义控制器+动作中使用Magento内置消息系统

pan*_*ake 5 ajax block messages magento

我正在调整我的magento商店,几乎一切都在游泳,除了一件事:

问题: 我似乎无法在对AJAX请求的响应中检索和显示消息块.

说明: 我说的是在尝试不起作用的东西后向用户显示的红色(或绿色,当它是成功消息时)条形图(例如,向购物车添加的商品数量超过库存允许的数量).在响应生成错误的某些ajax请求时,我想通过一个非常空的模板显示消息'标记,该模板用于呈现此ajax请求的响应.如果没有错误发生,则会呈现不同的适当响应.

我尝试过的事情: 这里有几行PHP代码我尝试过使用:

$_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();
Run Code Online (Sandbox Code Playgroud)

Mage::logging数据显示空消息集合.

这是布局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>
Run Code Online (Sandbox Code Playgroud)

另外一个细节点,我考虑过以下几点:

大多数操作,如购物车的"删除","编辑"和产品页面的"添加到购物车",首先重定向到另一个地方,因此会发出第二个请求,显示错误.也许这些消息永远不会立即显示,但只有在生成错误的请求之后才响应请求.所以我试图通过重定向到显示这些消息的动作来遵循这种可能的约定,但这也不起作用.

如果有人能告诉我如何让这些消息出现,它将成为我的一天.

OSd*_*ave 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)));
    
    Run Code Online (Sandbox Code Playgroud)
  • 在你的 .phtmlecho消息中:

    <ul class="messages">
        <li class="error-msg">
            <ul>
                <li><?php echo Mage::registry('message'); ?></li>
            </ul>
        </li>
    </ul>
    
    Run Code Online (Sandbox Code Playgroud)
  • 在 ajax 调用的 onComplete 部分中输出 javascript 代码中的响应:

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

请注意,最好创建自己的块类型,这将扩展 Mage_Core_Block_Messages 并在该块的方法中管理消息,而不是使用注册表。
希望有帮助