В Интернет-магазине, разработанном с использованием системы управления сайтами NetCat, может быть представлено неограниченное количество различных типов товаров. Каждый компонент типа товара может иметь свой набор свойств, однако обязательно должен содержать следующие поля:
Создайте новый раздел и прикрепите к нему один из существующих в вашей системе компонентов
После прикрепления компонента раздел можно наполнять.
Если для ваших товаров нужен компонент с уникальными полями (характеристиками товара), создайте новый компонент на основе существующего компонента «Товар 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 реализует интерфейс ArrayAccess, доступ к свойствам — как к обычному массиву.
Например:
Ключ | Значение |
---|---|
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 |
Массив с информацией о применённых к товару скидках. Каждый элемент является ассоциативным массивом с указанными элементами:
|
_MinimumPrice | Минимальная цена из колоки PriceMinimum, пересчитанная в валюту магазина |
_PriceColumn | Название свойства, которое используется для получения цены без скидок (OriginalPrice), определённое исходя из существующих правил выбора цен) |
Все прочие свойства объекта компонента | Все поля из таблицы Message. Для полей типа «Список» и «Дата» также обработанные значения (как в nc_objects_list). |
Свойства, связанные с вариантами товаров | |
_Variants | Все включённые варианты товара (nc_netshop_item_collection). Доступно как для основного товара, так и для дочерних товаров. Если дочерних товаров (или сиблингов) нет, и текущий товар включён, возвращает коллекцию с одним товаром. Если дочерних товаров (или сиблингов) нет, и текущий товар выключен, возвращает пустую коллекцию. |
_Parent |
Для дочерних товаров (товаров, у которых указано свойство Parent_Messsage_ID) — родительский объект nc_netshop_item; |
_Children | Дочерние товары (nc_netshop_item_collection), у которых Checked = 1. Для товаров, которые сами являются дочерними — пустая коллекция (таким образом поддерживается только один уровень вложенности). |
_AllChildren | Все дочерние товары (в т.ч. с Checked = 0) |
OriginalPriceMin | Минимальная цена среди вариантов товара без скидок без форматирования. Равна цене товара для товаров без вариантов. |
OriginalPriceMax | Максимальная цена среди вариантов товара без скидок, без форматирования. Равна цене товара для товара без вариантов. |
OriginalPriceRange | Строка с отформатированным диапазоном цен на товар вида «от MIN до MAX». Для товара без вариантов равна OriginalPriceF. |
ItemPriceMin | Минимальная цена среди вариантов товара со скидками, без форматирования |
ItemPriceMax | Максимальная цена среди вариантов товара со скидками, без форматирования |
ItemPriceRange | Строка с отформатированным диапазоном цен на товар вида «от MIN до MAX» |
$item->get_field_total($field)
Возвращает произведение значения указанного свойства ($field) и количества (Qty)
Для вариантов товаров (т.е. для записей, у которых задан 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>