每页请求设置一次错误消息

时间:2013-08-07 17:01:46

标签: php xml magento session observers

我正在尝试创建一个最小的总结帐模块,以防止有人以低于可配置的金额结帐。

我正在使用事件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 个答案:

答案 0 :(得分:1)

您必须使用$session->setErrorMessage(true);代替$session->hasErrorMessage(true);,这是一个isset()快捷方式(两者都是魔术方法,您可以检查Varien_Object::__call()以查看其行为)。< / p>

但是,每个会话只会显示一次消息,因此您还可以使用此代码检测消息是否已添加:

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;
}
相关问题