Ответ 1
Ваши сообщения теряются, потому что вы используете неблагоприятный путь для перенаправления в controller_action_predispatch
. С одной стороны, ваше решение приводит к тому, что "сообщение потеряно", а с другой стороны, оно отнимает вычислительную мощность вашего сервера.
Когда вы посмотрите на Mage_Core_Controller_Varien_Action::dispatch()
, вы увидите, что ваше решение не останавливает выполнение текущего действия, но оно должно делать это с помощью перенаправления. Вместо этого Magento выполняет текущее действие до конца, включая рендеринг сообщения, которое вы добавили ранее. Поэтому неудивительно, почему сообщение теряется при следующем запросе клиента, Magento уже его отобразил, с ответом сервера, который включает в себя вашу переадресацию.
Далее вы увидите в Mage_Core_Controller_Varien_Action::dispatch()
только одну возможность остановить выполнение текущего действия и пропустить прямо к перенаправлению, что находится в строке 428 catch (Mage_Core_Controller_Varien_Exception $e) [...]
. Поэтому вам нужно использовать Mage_Core_Controller_Varien_Exception
, который довольно непопулярен, но единственное правильное решение для вашей цели. Единственная проблема заключается в том, что у этого класса есть ошибка, так как он был введен в Magento 1.3.2. Но это можно легко устранить.
Просто создайте свой собственный класс, который получен из Mage_Core_Controller_Varien_Exception
:
/**
* Controller exception that can fork different actions,
* cause forward or redirect
*/
class Your_Module_Controller_Varien_Exception
extends Mage_Core_Controller_Varien_Exception
{
/**
* Bugfix
*
* @see Mage_Core_Controller_Varien_Exception::prepareRedirect()
*/
public function prepareRedirect($path, $arguments = array())
{
$this->_resultCallback = self::RESULT_REDIRECT;
$this->_resultCallbackParams = array($path, $arguments);
return $this;
}
}
Итак, теперь вы можете полностью реализовать свое решение с помощью этого:
/**
* Your observer
*/
class Your_Module_Model_Observer
{
/**
* Called before frontend action dispatch
* (controller_action_predispatch)
*
* @param Varien_Event_Observer $observer
*/
public function onFrontendActionDispatch($observer)
{
// [...]
/* @var $action Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session');
/* @var $helper Mage_Core_Helper_Http */
$helper = Mage::helper('core/http');
// puts your message in the session
$session->addError('Your message');
// prepares the redirect url
$params = array();
$params['_direct'] = $helper->getHttpReferer()
? $helper->getHttpReferer() : Mage::getHomeUrl();
// force the redirect
$exception = new Your_Module_Controller_Varien_Exception();
$exception->prepareRedirect('', $params);
throw $exception;
}
}