Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Корзина

Корзина — список товаров, которые посетитель собирается купить. В коде это объект $this->cart, доступный на витрине. Через него дополнение узнаёт, что лежит в корзине и сколько это стоит, и может добавлять или убирать товары.

Где лежит

ЧтоГде
Классsystem/library/cart/cart.php
ДанныеТаблица oc_cart, по строке на позицию
Страница корзиныindex.php?route=checkout/cart

Позиция привязана к сессии гостя или к покупателю, поэтому после входа корзина сохраняется.

Чтение корзины

// extension/acme_hello/catalog/controller/module/acme_hello.php, в index()
$data['cart_count'] = $this->cart->countProducts();
$data['cart_total'] = $this->currency->format($this->cart->getTotal(), $this->session->data['currency']);

Выведите обе переменные в шаблоне модуля. Добавьте на витрине товар в корзину и обновите главную страницу — модуль покажет число товаров и их сумму.

Позиции

foreach ($this->cart->getProducts() as $product) {
    $data['items'][] = [
        'name' => $product['name'],
        'quantity' => $product['quantity'],
        'total' => $this->currency->format($product['total'], $this->session->data['currency']),
    ];
}

Каждая позиция — массив: cart_id, product_id, quantity, цена за единицу price и за всю позицию total, выбранные опции. Цена уже учитывает опции, скидки и акции. Точный набор ключей различается в выпусках 4.0 и 4.1 — один раз выведите массив через $this->log->write(print_r($product, true)) и посмотрите его в журнале ошибок.

Методы

МетодЧто делает
add($productId, $quantity, $option)Добавляет товар
update($cartId, $quantity)Меняет количество в позиции
remove($cartId)Удаляет позицию
clear()Очищает корзину
getProducts()Позиции с ценами и опциями
countProducts()Общее число товаров
getSubTotal()Сумма без налога
getTotal()Сумма с налогом
getWeight()Общий вес
hasProducts()Не пуста ли корзина
hasShipping()Нужна ли доставка хотя бы одному товару
hasStock()Всё ли есть в наличии

update() и remove() принимают идентификатор позиции cart_id, а не товара: один товар с разными опциями — это две позиции.

Добавление из кода

$this->cart->add(42, 2);

В корзине появятся две единицы товара 42. Третий аргумент — выбранные опции: массив, где ключ — идентификатор опции товара, а значение — идентификатор выбранного значения.

Добавление из формы

Кнопке «В корзину» в вашем шаблоне свой контроллер не нужен. Форму отправляют на маршрут ядра, который проверяет минимальное количество, обязательные опции и остаток:

<form action="{{ add_to_cart }}" method="post" data-oc-toggle="ajax" data-oc-load="{{ cart }}" data-oc-target="#cart">
  <input type="hidden" name="product_id" value="42">
  <input type="hidden" name="quantity" value="1">
  <button type="submit" class="btn btn-primary">{{ button_cart }}</button>
</form>

add_to_cart — ссылка на checkout/cart.add, а cart — ссылка на common/cart.info: блок в шапке, который перезагружается после добавления. Так же устроены формы товаров в шаблонах ядра.

Частая ошибка

$this->cart->add() вызывают напрямую для товара с обязательными опциями или минимальным количеством. Библиотека ничего не проверяет: позиция попадает в корзину, а ошибка появляется только при оформлении. Из кода добавляйте только товары, в которых уверены, а для кнопки на странице используйте маршрут ядра checkout/cart.add.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.