Онлайн-руководство разработчика NetCat
Модуль «Поиск по сайту» 12.2.1Начало работы с модулем 12.2.2Язык запросов 12.2.3Способы хранения индекса 12.2.4Интерфейс модуля в панели управления сайтом 12.2.5Области индексирования 12.2.6Области HTML-страниц 12.2.7Области поиска на сайте 12.2.8Индексирование по расписанию, запуск индексирования в фоновом режиме 12.2.9Правила индексирования 12.2.10Постановка задачи переиндексирования в очередь 12.2.11Интеграция модуля в макеты дизайна сайта 12.2.12Простая форма поиска 12.2.13Расширенная форма поиска 12.2.14Вывод результатов поиска 12.2.15Стилизация списка подсказок 12.2.16Расширенные настройки 12.2.17Разработка расширений модуля 12.2.18Обзор архитектуры модуля 12.2.19Обработчики документов различных типов 12.2.20Текстовые фильтры 12.2.21Анализаторы текста 12.2.22Корректировщики запросов 12.2.23Подключение других поисковых систем 12.2.24Решение проблем с поиском 12.2.25Решение проблем с индексированием 12.2.26Справочник API

Корзина

Для отображения корзины и всех этапов заказа (адрес доставки, варианты оплаты и т. д.) необходимо создать несколько разделов и подключить к ним следующие компоненты:

Название Ключевое слово Компонент
Корзина 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]...";
  }
}

Разметка, которую возвращает метод nc_netshop_cart_notifications::__toString():

<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.

Добавление товара

Есть два способа добавить товары в корзину.

  1. Передав количество товаров для каждого из товаров. Такой способ удобен, если нужно одновременно добавить несколько товаров с разным количеством.
    • cart[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>
  2. Передав список товаров с одинаковым количеством. Такой способ удобен, если для выбора товаров используется выпадающий список (select) или список с переключателями (input type=radio, input type=checkbox).
    • items[] — массив, в котором значения — ID компонента и ID объекта, разделённые двоеточием (например: "520:10" — компонент 520, объект 10); такое значение можно получить из свойства _ItemKey объекта nc_netshop_item ($item['_ItemKey']).
    • qty — количество добавляемого товара (одинаковое для всех товаров, перечисленных в items[]), по умолчанию равно 1.
    Пример формы добавления товара в корзину:
    <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-строки. Объект ответа имеет следующие свойства:

  • Items: информация о товарах в корзине. Тип значения — объект, в котором ключ — "ID_компонента:ID_товара", а значение — объект с данными о каждом из товаров в корзине, имеющий свойства:
    • Class_ID: ID компонента
    • Message_ID: ID объекта
    • Name: название товара
    • VariantName: название варианта товара
    • Vendor: производитель
    • FullName: полное наименование (Vendor + Name + VariantName)
    • Image: путь к картинке, указанной в поле Image
    • ItemPrice: цена со скидкой, float
    • ItemPriceF: цена со скидкой, отформатированная
    • OriginalPrice: цена без скидки, float
    • OriginalPriceF: цена без скидки, отформатированная
    • Qty: количество
    • TotalPrice: стоимость со скидкой, float
    • TotalPriceF: стоимость со скидкой, отформатированная
    • ItemDiscount: скидка на 1 шт. товара, float
    • ItemDiscountF: скидка на 1 шт. товара, отформатированная
    • DiscountPercent: процент скидки
    • TotalDiscount: общая скидка на позицию, float
    • TotalDiscountF: общая скидка на позицию, отформатированная
    • URL: путь к странице товара
  • QuantityNotifications: сообщения о невозможности добавить выбранное количество товара в корзину. Тип значения — объект, ключ для каждого из товаров соответствует ключу в объекте Items.
    • Message: текст сообщения
    • RequestedQty: запрошенное количество
  • TotalItemPrice: стоимость товаров со скидками, float
  • TotalItemPriceF: сумма товаров со скидками, отформатированная
  • TotalItemOriginalPrice: сумма товаров без скидок, float
  • TotalItemOriginalPriceF: сумма товаров без скидок, отформатированная
  • TotalCount: количество наименований товаров в корзине
  • TotalItemCount: количество товаров в корзине
  • TotalItemDiscountSum: сумма скидок, float
  • TotalItemDiscountSumF: сумма скидок, отформатированная

Пример скрипта с использованием 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;
    });
});

Удаление товара из корзины

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

Дополнительные параметры скрипта

  • redirect_url — URL, на который следует выполнить переадресацию после окончания работы скрипта (если не установлен параметр json). Если redirect_url не задан, будет выполнена попытка переадресации на ссылающуюся страницу (HTTP_REFERER). Всегда задавайте этот параметр, так как HTTP_REFERER может быть не определён!
  • cart_mode — если равно "add", то указанное количество добавляется к имеющемуся, иначе количество товара замещается указанным.
  • cart_params — массив с дополнительными параметрами. Будет добавлен ко всем добавляемым и изменяемым товарам в корзине, в дальнейшем доступен через свойство 'OrderParameters' (например: $item['OrderParameters']).
  • item_params — аналогично cart_params, но только для одного товара: item_params[id компонента][id товара][дополнительный параметр] = значение. Переданные значения в дальнейшем будут доступны через свойство 'OrderParameters' (например: $item['OrderParameters']). В случае, когда переданы и cart_params для всех товаров, и item_params для конкретного товара, будут использованы только данные из item_params.
  • cart_clear — если указано значение, очищает содержимое корзины.

Комментарии 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 забито жестко "Р", а надо чтобы валюта бралась из настроек магазина.
   
Андрей  AVD 16 мая 2014, 11:48:13
Подскажите, есть ли полная документация по разработке интернет-магазина?

Т.к. например:
$netshop->cart->get_item_count();
выводит количество товарных позиций, а не общее количество товаров в корзине, а чтобы вывести именно общее количество, нужно:
$netshop->cart->get_item_count(true);

В документации не нашел об этом, как можно было догадаться? Увидел в примере...
Хотя бы полный список функций с описанием...
   
Майя  Open Steps 18 августа 2016, 13:20:06
Спасибо огромное! Тоже не разобралась бы, если бы не прочитала ваш комментарий!
   
Nexwich  Панасин Александр 21 июля 2014, 16:46:59
Есть ли метод который изменяет значения содержимого корзины?
Например [COLOR=0077CC]$netshop->cart->set(array('Class_ID'=>2073,'Message_ID'=>3),array('Qty'=>3));[/COLOR]
   
santik  isantik.ru 27 декабря 2014, 04:24:30
После обновление с 5.4 до 5.5 перестали добавлять товары в корзину методом items[], работает только метод cart[ID компонента][ID товара]. Не подскажете куда копать?
   
santik  isantik.ru 27 декабря 2014, 04:35:20
2 дня просидел переделывая все под 2-й метод. Написав пост выше через 5 минут нашел ошибку и заработал первый метод.
Файл: 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]
Это действительно разработчиками допущена ошибка или я чего-то не понимаю?
   
sparton  Шекера Евгений 12 февраля 2015, 19:27:44
Добавьте описание методов, пожалуйста
[CODE]$netshop->cart->clear();

$netshop->cart->add_item($component_id, $item_id, $qty, $replace_existing, $additional_params);[/CODE]
   
Вячеслав  ruCreate 23 августа 2016, 16:02:17
Тоже интересен этот вопрос. Как применить параметр cart_clear.
   
fazli  ymv 10 марта 2015, 21:11:35
Как настроить вывод всплывающего окна "Товар добавлен в корзину" ?
   
fazli  ymv 10 марта 2015, 21:12:12
Сейчас это окно не выводится.
   
Описание проекта