Удаление уведомления о "минимальной покупке"


Я пытаюсь удалить уведомление в корзине о том, что у клиента должен быть промежуточный итог, скажем, 20 долларов в корзине, однако я все еще хочу, чтобы там было ограничение, когда клиент пытается зайти в корзину (я лично думаю, что мы не должны удалять уведомление, но заказ приходит сверху)

На данный момент это мой код

$messages = $this->getMessagesBlock()->getMessages();
unset($messages[1]);
$this->getMessagesBlock()->setMessages($messages);
echo $this->getMessagesBlock()->getGroupedHtml();

Я тестировал код, зайдя в корзину с 1 товаром и используя кнопку обновить корзину, когда они новые количество - это что-то глупое, например 99999999999999

Из дампа var, который я сделал из $this->getMessagesBlock(), есть защищенный фрагмент данных под названием _messages, с помощью getMessages() возвращающий массив из 2 элементов, один из которых - ошибка о количестве при индексе 0, другой - уведомление о минимальной покупке.

Я попытался использовать unset($messages[1]); для удаления уведомления в качестве теста, чтобы посмотреть, смогу ли я его удалить. Если бы это сработало, я бы позже исправил это, чтобы найти уведомление и удалить его независимо от того, где оно находится в массиве.

Я вызвал setMessages($messages) и сделал еще один дамп var. Я вижу, что он был возвращен в $this->getMessagesBlock(), поэтому я подумал, что это сработает, однако ничего не появилось.

Я сделал var_dump из $this->getMessagesBlock()->getGroupedHtml(), и он показывает пустую строку.

Мне интересно, что я могу здесь делать неправильно или есть ли лучший способ просто удалить сообщение, которое мне не нужно.


Это то, что извлекается из $сообщений

array (size=2)
  0 => 
    object(Mage_Core_Model_Message_Error)[196]
      protected '_type' => string 'error' (length=5)
      protected '_code' => string 'The requested quantity for "6899WSAND" is not available.' (length=56)
      protected '_class' => string '' (length=0)
      protected '_method' => string '' (length=0)
      protected '_identifier' => null
      protected '_isSticky' => boolean false
  1 => 
    object(Mage_Core_Model_Message_Notice)[820]
      protected '_type' => string 'notice' (length=6)
      protected '_code' => string '' (length=0)
      protected '_class' => string '' (length=0)
      protected '_method' => string '' (length=0)
      protected '_identifier' => null
      protected '_isSticky' => boolean false
Author: Memor-X, 2013-02-01

1 answers

Я бы попытался решить эту проблему на другом уровне. Уведомление о недостижении минимальной суммы заказа добавляется довольно рано в Mage_Checkout_CartController.

Одним из следующих отправляемых событий является controller_action_layout_load_before. Создайте наблюдателя для этого события, и там вы можете использовать что-то вроде следующего:

$messages = Mage::getSingleton('checkout/session')->getMessages(true);

Значение true удалит все сообщения для оформления заказа, так что это не совсем то, что вы хотите, поэтому нам нужно повторно добавить те, которые мы не делаем хотите отфильтровать обратно.

К сожалению, Magento не предоставляет уведомлению о корзине никакого уникального идентификатора (который позволил бы вам использовать Mage_Core_Model_Message_Collection::deletemessagebyidentifier). Различие между корзиной и оформлением заказа заключается в том, что одно является уведомлением, а другое - сообщением об ошибке. Что-то вроде следующего должно послужить вам хорошей отправной точкой.

$messageTypes =  array(
    Mage_Core_Model_Message::ERROR,
    Mage_Core_Model_Message::NOTICE,
    Mage_Core_Model_Message::SUCCESS,
    Mage_Core_Model_Message::WARNING
);
//Sidenote just because something is a collection in Magento it does not mean you
//can easily loop over it - see Mage_Core_Model_Message_Collection
foreach ($messageTypes as $type){
    foreach ($messages->getItems($type) as $typeMessages) {
        foreach ($typeMessages as $message){
            if (!($type == Mage_Core_Model_Message::NOTICE
                && $message == Mage::getStoreConfig('sales/minimum_order/description'))
            ) {
                $messageObject = Mage::getModel('core/message_'.$type, $message);
                Mage::getSingleton('checkout/session')->addMessage($messageObject);
            }
        }
    }
}
 4
Author: Kristof at Fooman, 2013-02-01 09:41:44