Пользовательское добавление Magento в корзину не обновляет данные корзины до обновления страницы


Я создаю небольшую функцию добавления ajax в корзину, которая работает, но оказывается относительно дорогой с точки зрения производительности. Я надеюсь, что кто-нибудь сможет предложить более эффективный способ сделать это.

Проблема, я думаю, заключается в том, что мне нужно сделать все в 4 этапа:

  1. Добавить элемент или обновить элемент
  2. Сохранить корзину
  3. Вызов корзины->инициализация()
  4. Сохранить корзину

Шаги 3 и 4 кажутся излишними, но они также кажутся необходимо для того, чтобы получить новое содержимое корзины.

Кто-нибудь знает, как я могу исключить последние пару шагов, но все равно получить обновленные данные корзины после добавления или обновления?

Author: Marty Wallace, 2013-06-11

2 answers

Довольно сложно понять, что именно вы делаете, не видя свой код.
Но, вероятно, после добавления товара в корзину и перед его сохранением, если вы позвоните

$cart->getQuote()->setTotalsCollectedFlag(false);

С тобой все должно быть в порядке.

ОБНОВЛЕНИЕ
Чтобы получить список товаров в корзине, есть несколько способов сделать это. getCart()->getItems() возвращает коллекцию элементов предложения, которая все еще содержит удаленные элементы. Если вы используете этот метод, вы должны проверить их с помощью $item->isDeleted().

Альтернативный вариант вы можете использовать getCart()->getQuote()->getAllItems(), который возвращает все элементы, кроме удаленных, или getCart()->getQuote()->getAllVisibleItems(), который возвращает все элементы, кроме удаленных, или элементы, связанные с настраиваемым или связанным родительским элементом.

 6
Author: Vinai, 2013-06-12 07:16:46

Не так давно я столкнулся с тем же самым. Повторяя слова Винаи о том, что вы не знаете точно, что вы делаете без кода, я могу поделиться с вами, какое решение сработало.

Во-первых, действие удаления модуля 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);

Надеюсь, это сделает это за вас.

 2
Author: ryanF, 2013-06-12 07:05:15