Для отображения корзины и всех этапов заказа (адрес доставки, варианты оплаты и т. д.) необходимо создать несколько разделов и подключить к ним следующие компоненты:
Название | Ключевое слово | Компонент |
---|---|---|
Корзина | cart | Корзина |
Заказы | orders | Заказ |
— Заказ оформлен (подраздел) | added | Страница «Заказ оформлен» |
При попадании на первую страницу корзины, покупатель увидит список товаров, которые уже есть в корзине
Для правки визуальной части этой страницы перейдите в компонент «Корзина». В окне «Префикс списка объектов» находится вся визуальная часть страницы, включая служебные методы. При необходимости вы можете внести в визуальное отображение свои правки. В тот момент, когда покупатель нажимает на кнопку «Оформить заказ» он перенаправляется на страницу «Заказы» причём в режиме добавления. Визуальный вид этой страницы правится в компоненте «Заказ», шаблон действия «Добавление». Код страниц добавления оснащён большим количеством комментариев, описание методов вы можете найти в разделе «Справочник API».
Вернёмся к корзине. Для работы с ней существуют следующие методы:
$netshop->cart->get_items(); // или $netshop->get_cart_contents();
$netshop->cart->get_item_count(); // или count($netshop->get_cart_contents());
$netshop->cart->get_totals();
// ∑(Weight × Qty) $netshop->cart->get_items()->get_field_sum('Weight'); // или $netshop->get_cart_contents()->get_field_sum('Weight');
$netshop->get_add_to_cart_url(); // эквивалент nc_module_path('netshop') . "actions/cart.php"
$netshop->cart->get_quantity_notifications(); // вернёт null или объект nc_netshop_cart_notifications, который имеет метод __toString(), поэтому можно так: echo $netshop->cart->get_quantity_notifications(); // если нужно вывести нестандартное сообщение: $notifications = $netshop->cart->get_quantity_notifications(); if ($notifications) { foreach ($notifications->get_all() as $message) { $item = $message['item']; // для краткости echo "Вы хотели $message[requested_qty] $item[Units] товара с названием «$item[Name]», но у нас есть всего $item[Qty]..."; } }
<div class='tpl-block-message tpl-block-netshop-cart-message-list tpl-status-error'> <div class='tpl-block-netshop-cart-message'>Сообщение 1</div> <div class='tpl-block-netshop-cart-message'>Сообщение 2</div> </div>
Для вывода корзины в макете можно воспользоваться следующим примером:
<? $netshop = nc_netshop::get_instance(); $total_items = $netshop->cart->get_item_count();?> <div class="tpl-field-title"><a class="tpl-block-headercart" href="<?= $netshop->get_add_to_cart_url(); ?>">Корзина товаров</a><br> <div class="tpl-field-description"> <? if ($total_items) { ?> В корзине <span class="tpl-field-amount"><?= $total_items; ?> <?= plural_form($total_items, 'товар', 'товара', 'товаров'); ?></span> <br>на сумму <? $totals = $netshop->cart->get_totals(); ?> <span class="<?= $totals ? 'tpl-field-summary' : ''; ?>"><?= $netshop->format_price($totals); ?></span> <? } else { ?> Корзина пуста <? } ?> </div> </div>
Скрипт, добавляющий товары в корзину, находится по адресу /netcat/modules/netshop/actions/cart.php
. Запросы к скрипту должны выполняться методом POST.
Есть два способа добавить товары в корзину.
ID компонента
][ID товара
] = количество
[ID компонента][ID товара]
" можно получить из свойства RowID
объекта nc_netshop_item
($item['RowID']
).<form action="<?= nc_modules("netshop")->get_add_to_cart_url() ?>" method="post"> <input type="hidden" name="redirect_url" value="<?= $item['URL'] ?>" /> <input type="hidden" name="cart_mode" value="add" /> <input type="number" name="cart<?= $item['RowID'] ?>" value="1" min="0" /> <button type="submit">В корзину</button> </form>
select
) или список с переключателями (input type=radio
, input type=checkbox
).
_ItemKey
объекта nc_netshop_item
($item['_ItemKey']
).<form action="<?= nc_modules("netshop")->get_add_to_cart_url() ?>" method="post"> <input type="hidden" name="redirect_url" value="<?= $item['URL'] ?>" /> <input type="hidden" name="cart_mode" value="add" /> <label> <input type="checkbox" name="items[]" value="<?= $item['_ItemKey'] ?>" /> $item['FullName'] </label> <button type="submit">В корзину</button> </form>
Для добавления товара без перезагрузки страницы вы можете использовать AJAX-запрос, добавив параметр json=1.
Скрипт вернёт информацию о содержимом корзины после запрошенных изменений в виде JSON-строки. Объект ответа имеет следующие свойства:
Пример скрипта с использованием jQuery:
$(function() { /** * Обработчик ответа на запрос на добавление товара в корзину */ function processCartResponse(response) { // Обновим блок «Корзина» на странице var totalItems = response.TotalItemCount; var cartHtml = totalItems ? 'В корзине ' + '<span class="tpl-property-amount">' + totalItems + ' ' + pluralForm(totalItems, 'товар', 'товара', 'товаров') + '</span>' + '<br>на сумму <span class="tpl-property-totals">' + response.TotalItemPriceF + '</span>' : 'Ваша корзина пуста'; $('.tpl-cart-summary').html(cartHtml); // Сообщения о невозможности добавить выбранное количество товара в корзину if (response.QuantityNotifications) { // Обработка таких сообщений не показана в этом примере для краткости } // Сообщение о том, что товар успешно добавлен в корзину: alert('Товар добавлен в корзину'); } /** * Обработчик ошибки запроса на добавление товара в корзину */ function processCartError() { alert('Не удалось добавить товар в корзину'); } /** * Склонение русских слов * @param {Number} itemQuantity Количество товаров * @param {String} one «товар» * @param {String} two «товара» * @param {String} many «товаров» * @returns {String} */ function pluralForm(itemQuantity, one, two, many) { itemQuantity = Math.abs(itemQuantity) % 100; var underHundred = itemQuantity % 10, result = many; if (underHundred > 1 && underHundred < 5) { result = two; } if (underHundred == 1) { result = one; } if (itemQuantity > 10 && itemQuantity < 20) { result = many; } return result; } /** * Инициализация кнопок «Положить в корзину» (предполагается, что у таких * кнопок есть CSS-класс .tpl-link-cart-add). */ $('.tpl-link-cart-add').on('click', function(e) { var form = $(e.target).closest('form'); $.post(form.attr('action'), form.serialize() + "&json=1", null, 'json') .success(function(response) { processCartResponse(response); }) .error(processCartError); return false; }); });
Для удаления товара из корзины необходимо установить для него одним из описанных выше способов количество, равное нолю.
item_params[id компонента][id товара][дополнительный параметр] = значение
. Переданные значения в дальнейшем будут доступны через свойство 'OrderParameters' (например: $item['OrderParameters']). В случае, когда переданы и cart_params для всех товаров, и item_params для конкретного товара, будут использованы только данные из item_params.
Комментарии 10
Подскажите, пожалуйста, как переделать в связи с этим данные две строчки кода?
[CODE]
<span class="<?= $totals ? 'tpl-field-summary' : ''; ?>"><?= $netshop->format_price($totals); ?></span>
<span class="tpl-block-rubl">Р</span>
[/CODE]
Проблемы получается две:
1. В первом span'е выводится название валюты, но судя по всему нам надо вывести его в tpl-block-rubl
2. В вашем примере в tpl-block-rubl забито жестко "Р", а надо чтобы валюта бралась из настроек магазина.
Т.к. например:
$netshop->cart->get_item_count();
выводит количество товарных позиций, а не общее количество товаров в корзине, а чтобы вывести именно общее количество, нужно:
$netshop->cart->get_item_count(true);
В документации не нашел об этом, как можно было догадаться? Увидел в примере...
Хотя бы полный список функций с описанием...
Например [COLOR=0077CC]$netshop->cart->set(array('Class_ID'=>2073,'Message_ID'=>3),array('Qty'=>3));[/COLOR]
Файл: netcatmodulesnetshopactionscart.php
В 5.5
[CODE] $qty = (int)$input->fetch_post('qty');
if ($qty < 0) {
$qty = 0;
}[/CODE]
в 5.4 (было)
[CODE]if (!$qty) { $qty = 1; }[/CODE]
Это действительно разработчиками допущена ошибка или я чего-то не понимаю?
[CODE]$netshop->cart->clear();
$netshop->cart->add_item($component_id, $item_id, $qty, $replace_existing, $additional_params);[/CODE]