Для отображения корзины и всех этапов заказа (адрес доставки, варианты оплаты и т. д.) необходимо создать несколько разделов и подключить к ним следующие компоненты:
| Название | Ключевое слово | Компонент |
|---|---|---|
| Корзина | 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]