Пользовательское добавление Magento в корзину не обновляет данные корзины до обновления страницы
Я создаю небольшую функцию добавления ajax в корзину, которая работает, но оказывается относительно дорогой с точки зрения производительности. Я надеюсь, что кто-нибудь сможет предложить более эффективный способ сделать это.
Проблема, я думаю, заключается в том, что мне нужно сделать все в 4 этапа:
- Добавить элемент или обновить элемент
- Сохранить корзину
- Вызов корзины->инициализация()
- Сохранить корзину
Шаги 3 и 4 кажутся излишними, но они также кажутся необходимо для того, чтобы получить новое содержимое корзины.
Кто-нибудь знает, как я могу исключить последние пару шагов, но все равно получить обновленные данные корзины после добавления или обновления?
2 answers
Довольно сложно понять, что именно вы делаете, не видя свой код.
Но, вероятно, после добавления товара в корзину и перед его сохранением, если вы позвоните
$cart->getQuote()->setTotalsCollectedFlag(false);
С тобой все должно быть в порядке.
ОБНОВЛЕНИЕ
Чтобы получить список товаров в корзине, есть несколько способов сделать это. getCart()->getItems()
возвращает коллекцию элементов предложения, которая все еще содержит удаленные элементы. Если вы используете этот метод, вы должны проверить их с помощью $item->isDeleted()
.
Альтернативный вариант вы можете использовать getCart()->getQuote()->getAllItems()
, который возвращает все элементы, кроме удаленных, или getCart()->getQuote()->getAllVisibleItems()
, который возвращает все элементы, кроме удаленных, или элементы, связанные с настраиваемым или связанным родительским элементом.
Не так давно я столкнулся с тем же самым. Повторяя слова Винаи о том, что вы не знаете точно, что вы делаете без кода, я могу поделиться с вами, какое решение сработало.
Во-первых, действие удаления модуля app/code/core/Mage/Checkout было расширено и настроено. Итак, 'Mage/Checkout/controllers/CartController.php "был включен, а затем действие DeleteAction содержит некоторую логику, чтобы увидеть, является ли запрос вызовом AJAX (параметр запроса "isAjax" был добавлен к удалить URL-адрес). Если вызов удовлетворяет условию, то выполняется попытка/перехват:
try {
$this->_getCart()->removeItem($id)
->save();
$this->_getSession()->setCartWasUpdated(true);
if (!$this->_getCart()->getQuote()->getHasError()){
$response['status'] = 'SUCCESS';
$response['message'] = $this->__('Item removed');
$this->_getCart()->getResetSummaryQty();
$this->loadLayout();
//logic to load mini cart block and response markup
//$response['markup'] = $this->getLayout()->getBlock('some.block')->toHtml();
Mage::register('referrer_url', $this->_getRefererUrl());
}
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
return;
} catch (Exception $e) {
$response['status'] = 'ERROR';
$response['message'] = $this->__('Cannot remove the item.');
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($response));
}
Я намеренно опустил разделы кода, но я дал вам довольно хорошее начало и представление о том, что я использовал.
Я думаю, что следующие части приведенного выше кода помогут: $this->_getCart()->removeItem($id)->save();
И $this->_getSession()->setCartWasUpdated(true);
Надеюсь, это сделает это за вас.