2013-08-26 3 views
1

У меня есть наблюдатель, наблюдающий за событием sales_quote_item_set_product. В нем я проверяю некоторые условия, чтобы убедиться, что элемент все еще доступен. Если это не так, я запускаю этот код:Сообщение об ошибке magento отображается только после обновления второй страницы

Mage::helper('checkout/cart')->getCart()->removeItem($item->getId())->save(); 
Mage::getSingleton('message/session')->addError($item->getName() . ' is no longer available.'); 

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

Так что я думал, что мне нужно запустить этот код раньше в цикле выполнения, но я не знаю, какое событие я должен наблюдать, или если я вообще не должен использовать наблюдателя. Я попытался использовать sales_quote_load_after, но это вызвало ошибку рекурсии. Может ли кто-нибудь сказать мне, когда/где я должен запускать этот код?

Другая дикая мысль может быть, потому что я использую сеансы базы данных вместо файловой системы?

ответ

1

Проблема заключалась в том, что ошибка была добавлена ​​после визуализации блока сообщений. Я исправил его, добавив перенаправление на страницу корзины после добавления ошибки.

$request = Mage::app()->getRequest(); 
if($request->getModuleName() != 'checkout' && $request->getControllerName() != 'cart' && $request->getActionName() != 'index') { 
    Mage::app()->getResponse()->setRedirect(Mage::getModel('core/url')->getUrl('checkout/cart/index')) 
     ->sendResponse(); 
    exit; 
} 
0

Вы не упомянули об этом, но это звучит так, будто вы используете код во время запроса AJAX. Когда вы говорите

Mage::getSingleton('message/session')->addError($item->getName() . ' is no longer available.'); 

Вы добавляете ошибку в объект сеанса Magento. Каждый раз, когда страница Magento отображается, она проверяет объект сеанса на наличие ошибок и отображает их все. Это позволяет нескольким разработчикам добавлять в сеанс несколько ошибок, перенаправить Magento обратно в исходную форму.

Это не работает во время запроса ajax, потому что (как правило) процесс визуализации пропускается вместо объекта JSON или простой, безрезультатный фрагмент HTML, который отображается (оставляя ошибки в сеансе).

Зная, как выглядит цикл полного запроса (что такое ajax, что не так), поможет кому-то придумать более конкретный ответ на ваш вопрос.

+1

Спасибо за помощь. Алан, у меня есть много полезной информации из вашего блога и любовь к коммерции! К сожалению, событие не срабатывало в запросе ajax. Это происходило, когда генерировалось резюме корзины. Которая загрузилась после отображения сообщений. Моим решением было перенаправить пользователя, чтобы они могли исправить ошибку. Я не на 100% доволен исправлением, но я не мог найти событие, которое срабатывало достаточно рано, и в нем были данные о продажах. –

+0

@JasonNeumann Ах, да, если действие, которое вы слушаете, происходит после отображения блока сообщений, вы не можете многое сделать. Возможно, вам удастся добавить что-то, что добавит некоторую дополнительную JS для добавления на страницу дополнительных ошибок, но это, вероятно, больше работы, которую вы ищете. Кроме того, Re: поиск событий, не забывайте, что в двоичной ошибке в торговле есть вкладка событий и наблюдателей - полезно для отслеживания этих вещей на http://commercebugdemo.pulsestorm.net/ –

Смежные вопросы