Удаление уведомления о "минимальной покупке"
Я пытаюсь удалить уведомление в корзине о том, что у клиента должен быть промежуточный итог, скажем, 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
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);
}
}
}
}