Использование встроенной системы сообщений Magento в настраиваемом контроллере + действие - PullRequest
5 голосов
/ 26 ноября 2011

Я ajaxification моего магазина 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();

Mage::log данные показывают пустые коллекции сообщений.

Вот 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>

Также подробно, я рассмотрел следующее:

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

Если кто-нибудь скажет мне, как заставить эти сообщения появляться, это сделает мой день.

1 Ответ

4 голосов
/ 26 ноября 2011

блок сообщений, который вы пытаетесь использовать, не должен работать для запросов 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 сообщении:

    <ul class="messages">
        <li class="error-msg">
            <ul>
                <li><?php echo Mage::registry('message'); ?></li>
            </ul>
        </li>
    </ul>
    
  • выводит ответ в вашем коде javascript в части onComplete вашего вызова ajax:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...