Установить сообщение об ошибке один раз на страницу запроса

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

Я использую событие 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;
}
Другие вопросы по тегам