Корзина
Корзина — список товаров, которые посетитель собирается купить. В коде это объект $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.