2013-08-07 3 views
0

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

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