Онлайн-руководство разработчика NetCat
Новогодние скидки до 25%!
Подробнее
Модуль «Поиск по сайту» 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

Компоненты товаров

В Интернет-магазине, разработанном с использованием системы управления сайтами NetCat, может быть представлено неограниченное количество различных типов товаров. Каждый компонент типа товара может иметь свой набор свойств, однако обязательно должен содержать следующие поля:

  • Name: название товара
  • Vendor: Производитель
  • ItemID: внешний идентификатор товара
  • Price: основная цена товара
  • Currency: валюта основной цены товара (содержит значения из списка ShopCurrency)
  • ImportSourceID: служебное поле, используется при импорте данных из внешних источников (например 1С)
  • Units: Единицы измерения (содержит значения из списка ShopUnits)
  • StockUnits: Количество товара на складе
  • VAT: Ставка НДС

Использование существующего компонента

Создайте новый раздел и прикрепите к нему один из существующих в вашей системе компонентов

После прикрепления компонента раздел можно наполнять.

Если для ваших товаров нужен компонент с уникальными полями (характеристиками товара), создайте новый компонент на основе существующего компонента «Товар 2.0», при этом мы советуем не удалять поля, которые перечислены выше.

После копирования компонента можно добавить нужные поля.

Повторите операцию для нового типа товаров.

В любых компонентах или макетах дизайна, в которых используется модуль интернет-магазина, в первую очередь нужно получить объект магазина:

$netshop = nc_netshop::get_instance();

Это можно делать как в макете дизайна, так и в отдельных компонентах.

Отображение товара

Для доступа к свойствам товаров существует класс nc_netshop_item.

В списке товаров необходимо создать объект:

$item = new nc_netshop_item($res[$f_RowNum]);

На странице объекта:

$item = new nc_netshop_item($resMsg);

Также объект можно создать по ID записи в таблице Message.

Для создания объекта минимально должны быть заданы Class_ID (или Sub_Class_ID) и Message_ID, все остальные данные объект загрузит при необходимости из БД. В шаблонах, как правило, вся нужная информация уже загружена. Пример создания nc_netshop_item по ID компонента и ID объекта:

$item = new nc_netshop_item(array('Class_ID' => 300, 'Message_ID' => 5));
echo $item['ItemPrice']; // загрузит необходимые данные и выдаст значение

Свойства объекта nc_netshop_item

nc_netshop_item реализует интерфейс ArrayAccess, доступ к свойствам — как к обычному массиву.

Например:

  • $item['ItemPrice'] — стоимость товара
  • $item['Weight'] — вес товара и т. д.
Ключ Значение
RowID Строка в формате "[Class_ID][Message_ID]", где Class_ID — ID компонента, Message_ID — ID объекта. Для совместимости со старым модулем. Может быть полезно для генерации ссылки на скрипт добавления к корзине.
FullName Полное наименование товара, состоящее из значений полей Vendor (производитель), Name (название товара) и VariantName (название варианта товара).
Qty Количество товара. В корзине, заказах равно количеству товара. В прочих местах (в списке) — равно 1.
URL Полный путь к странице товара. То же самое, что "http(s)://" + имя домена + nc_message_link() для объекта.
OriginalPrice Цена без скидок в основной валюте магазина для пользователя (integer | float)
OriginalPriceF Отформатированная в соответствии с настройками модуля цена без скидок (string)
ItemPrice Цена со скидкой для пользователя (integer | float)
ItemPriceF Отформатированная цена со скидкой
TotalPrice ItemPrice × Qty, то есть стоимость со скидкой (имеет смысл в корзине или заказе, но доступна везде)
TotalPriceF Отформатированная стоимость указанного количества (Qty) товара
ItemDiscount Скидка на 1 шт. товара
ItemDiscountF Отформатированная скидка на 1 шт. товара
TotalDiscount Сумма скидки для всего количества товара (ItemDiscount × Qty)
TotalDiscountF Отформатированная сумма скидки для всего количества товара
DiscountPercent Скидка в процентах от изначальной цены (целое число или null)
Discounts

Массив с информацией о применённых к товару скидках. Каждый элемент является ассоциативным массивом с указанными элементами:

  • id — ID объекта nc_netshop_promotion_discount_item
  • name — название скидки
  • description — описание скидки
  • sum — сумма скидки для данного товара
  • price_minimum — достигнута ли минимальная цена на товар (0 или 1). (Если достигнута минимальная цена, указанная в колонке PriceMinimum, дальнейшее применение скидок прекращается, а сумма скидки устанавливается таким образом, чтобы цена со скидкой была равна минимальной.)
_MinimumPrice Минимальная цена из колоки PriceMinimum, пересчитанная в валюту магазина
_PriceColumn Название свойства, которое используется для получения цены без скидок (OriginalPrice), определённое исходя из существующих правил выбора цен)
Все прочие свойства объекта компонента Все поля из таблицы Message. Для полей типа «Список» и «Дата» также обработанные значения (как в nc_objects_list).
Свойства, связанные с вариантами товаров
_Variants Все включённые варианты товара (nc_netshop_item_collection). Доступно как для основного товара, так и для дочерних товаров.
Если дочерних товаров (или сиблингов) нет, и текущий товар включён, возвращает коллекцию с одним товаром.
Если дочерних товаров (или сиблингов) нет, и текущий товар выключен, возвращает пустую коллекцию.
_Parent

Для дочерних товаров (товаров, у которых указано свойство Parent_Messsage_ID) — родительский объект nc_netshop_item;
для товаров, не являющихся дочерними — null

_Children Дочерние товары (nc_netshop_item_collection), у которых Checked = 1.
Для товаров, которые сами являются дочерними — пустая коллекция (таким образом поддерживается только один уровень вложенности).
_AllChildren Все дочерние товары (в т.ч. с Checked = 0)
OriginalPriceMin Минимальная цена среди вариантов товара без скидок без форматирования. Равна цене товара для товаров без вариантов.
OriginalPriceMax Максимальная цена среди вариантов товара без скидок, без форматирования. Равна цене товара для товара без вариантов.
OriginalPriceRange Строка с отформатированным диапазоном цен на товар вида «от MIN до MAX». Для товара без вариантов равна OriginalPriceF.
ItemPriceMin Минимальная цена среди вариантов товара со скидками, без форматирования
ItemPriceMax Максимальная цена среди вариантов товара со скидками, без форматирования
ItemPriceRange Строка с отформатированным диапазоном цен на товар вида «от MIN до MAX»

Методы объекта nc_netshop_item

$item->get_field_total($field)

Возвращает произведение значения указанного свойства ($field) и количества (Qty)

nc_netshop_item и варианты товаров

Для вариантов товаров (т.е. для записей, у которых задан Parent_Message_ID) класс обеспечивает также «наследование» свойств: если какое-то свойство не задано у варианта, его значение будет равно значению этого свойства у родительского товара.

Некоторые детали внутренней реализации

При присвоении ранее существовавшего значения новой переменной PHP не копирует данные в памяти, а создаёт ссылку на значение. Старое значение копируется в памяти только после изменения новой переменной. Из этих соображений, чтобы избежать двойной копии данных в памяти (один — полученный в nc_object_list массив $res, второй — в nc_netshop_item) внутри объекта есть два свойства: $item_data (оригинальные данные) и $additional_data (дополнительные значения, такие как вычисленные значения).

Поэтому, если возникла необходимость добавить в nc_netshop_item какие-то данные помимо данных из $res, имеет смысл установить additional_data вместо модификации оригинальных данных:

$item = new nc_netshop_item($res[$f_RowNum], array('SomeExtraData' => 123));

Все вычисляемые свойства вычисляются при первом обращении и кэшируются в свойстве $additional_data. Все методы, вычисляющие значения (get_*) не кэшируют значения, поэтому внутри класса всегда стоит обращаться к свойствам через ArrayInterface (например, $item['ItemPrice']).

Добавить в корзину

Следующий код нужно прописать для добавления товара в корзину:

<form method="post" action="<?= nc_modules("netshop")->get_add_to_cart_url() ?>">
    <input type="hidden" name="redirect_url" value="<?= nc_message_link($item['Message_ID'], $item['Class_ID']) ?>"/>
    <input type="hidden" name="cart_mode" value="add"/>
    <input type="hidden" name="cart<?= $item["RowID"] ?>" value="1"/>
    <button type="submit">В корзину</button>
</form>
Описание проекта