我正在尝试创建一个最小的总结帐模块,以防止有人以低于可配置的金额结帐。
我正在使用事件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);
}
但这也不起作用。如何确保每个页面请求只显示一次错误消息?
答案 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;
}