У меня возникли проблемы с созданием рабочей переадресации в Magento от наблюдателя.
Насколько я знаю, есть много событий, которые получили объект ответа с ними (в объекте $observer
). Другой способ – использовать что-то вроде
Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
как упоминалось здесь https://stackoverflow.com/a/4730200/1700048 великим Аланом Штормом.
К сожалению, это не работает для меня, даже когда я добавляю sendResponse()
следующим образом:
Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse();
Например:
Я хочу запретить некоторые адреса электронной почты в подписке на рассылку новостей. Поэтому я создал наблюдателя для события newsletter_subscriber_save_before
.
В моем методе наблюдателя я проверяю некоторые случаи, и если они срабатывают, я хочу предотвратить сохранение подписки на рассылку новостей. Мой план состоял в том, чтобы добавить ошибку:
Mage::getSingleton('checkout/session')->addError('Email is spam!');
и просто пусть текущая страница перезагрузится (показывая сообщение об ошибке) с переадресацией, как показано выше ( checkout/cart
в примере – это просто посмотреть, как это работает).
К сожалению, перенаправление не работает. Почему sendResponse
не отправляет ответ в этом случае?
Спасибо за помощь 🙂
Это работает, но это не очень элегантно:
Mage::getSingleton('core/session')->addError('Email is spam!'); Mage::app()->getFrontController()->getResponse()->setRedirect(Mage::getUrl('checkout/cart')); Mage::app()->getResponse()->sendResponse(); exit;
Я собираюсь кратко и исправить код Силаса Палмера .
Mage::getSingleton('checkout/session')->addError('Email is spam!'); Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart'))->sendResponse(); exit;
надеюсь, это поможет кому-то!
Вместо того, чтобы создавать Observer, подумайте о том, как переопределить контроллер писем с сохранением в своем собственном модуле, и там вы создаете спам-логику, а затем добавляете код новостей под своей логикой.
Вы также можете изменить URL-адрес для сохранения новостного письма на новый URL-адрес модуля, а затем создать свой спам-фильтр, и если вы считаете, что это действительный адрес электронной почты, вы делаете внутреннюю переадресацию на регулярное письмо с сохранением новостей (см., Как вызвать одно действие из другой в пурпуре? )
Поэтому у вас не было бы проблем с перенаправлением с контроллера
Это должно хорошо работать: s
Вы пробовали просто выйти из сценария сразу после setRedirect()
чтобы убедиться, что он определенно туда попал?