Установить сообщение об ошибке один раз на страницу запроса
Я пытаюсь создать минимальный общий модуль проверки, который будет препятствовать тому, чтобы кто-то проверял с общей суммой, меньшей настраиваемой суммы.
Я использую событие sales_quote_save_before
отображать ошибку на странице оформления заказа / корзины при ее открытии.
<?xml version="1.0"?>
<config>
<frontend>
<events>
<sales_quote_save_before>
<observers>
<b2b>
<class>b2b/observer</class>
<method>checkTotalsCart</method>
</b2b>
</observers>
</sales_quote_save_before>
</events>
</frontend>
</config>
И в наблюдателе
public function checkTotalsCart()
{
if ($this->_hasCartError()) { /* does some checks, returns bool */
$this->_setErrorMessage();
}
}
protected function _setErrorMessage()
{
$session = Mage::getSingleton("b2b/session"); /* extends Mage_Core_Model_Session */
$session->addError($this->helper->getErrorMessage());
}
Проблема в том, что при обновлении корзины со страницы корзины дважды появляется сообщение об ошибке. Я думаю, что это событие происходит несколько раз.
Я пытался проверить, было ли сообщение ранее установлено с пользовательской переменной сеанса
protected function _setErrorMessage()
{
$session = Mage::getSingleton("b2b/session");
if ($session->hasErrorMessage()) {
return;
}
$session->addError($this->helper->getErrorMessage());
$session->hasErrorMessage(true);
}
Но это тоже не сработало. Как я могу убедиться, что сообщение об ошибке появляется только один раз за запрос страницы?
1 ответ
Вы должны использовать $session->setErrorMessage(true);
вместо $session->hasErrorMessage(true);
, который является isset()
ярлык (оба магические методы, вы можете проверить Varien_Object::__call()
чтобы увидеть, каково их поведение).
Но тогда сообщение будет отображаться только один раз за сеанс, так что вы также можете определить, было ли сообщение уже добавлено, используя этот код:
protected function _setErrorMessage()
{
$session = Mage::getSingleton('b2b/session'); /* extends Mage_Core_Model_Session */
$errorMessage = $this->helper->getErrorMessage();
$isMessageAdded = false;
foreach ($session->getMessages() as $message) {
if ($message->getText() == $errorMessage) {
$isMessageAdded = true;
break;
}
}
if (!$isMessageAdded) {
$session->addError($errorMessage);
}
return $this;
}