Онлайн-руководство разработчика 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

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

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

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

Если вы хотите использовать автоматический расчёт стоимости доставки (Почта России, EMS), у всех товаров должно иметься поле Weight, содержащее вес товара с упаковкой в граммах.

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

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

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

Если для ваших товаров нужен компонент с уникальными полями (характеристиками товара), создайте новый компонент на основе существующего компонента «Товар 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 Полное наименование товара.
Для копий, изначально имевших версию младше 5.6, значение FullName формируется из значений полей Vendor (производитель), Name (название товара) и VariantName (название варианта товара).
У копий системы, изначально имевших версию 5.6 и старше, значение по умолчанию формируется из полей Name и VariantName.
В версии системы 5.6 появилась возможность указывать состав полного наименования на странице «Настройки интернет-магазина» панели управления модулем (поле «Шаблон полного названия товара по умолчанию»). Значение указывается в виде строки, для подстановки свойств товара используются названия полей в фигурных скобках, например:
  • {Vendor} {Name} {VariantName}
  • {Name} ({VariantName}), арт. {Article}
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), определённое исходя из существующих правил выбора цен). Валюта этой цены доступна в свойстве "_CurrencyColumn".
Все прочие свойства объекта компонента Все поля из таблицы 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 и варианты товаров

Для вариантов товаров (т.е. для записей, у которых задан 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>

Комментарии 7

Nexwich  Панасин Александр 22 мая 2014, 00:51:29
В список обязательных полей также входит "PriceMinimum"
   
skype: celenia_yaz  Mirson Dev Studio 15 июня 2014, 21:09:29
А как положить в корзину без перезагрузки страницы?
   
Nexwich  Панасин Александр 18 июля 2014, 18:30:59
Данный вопрос неоднократно обсуждался на форуме. По мере объяснения у вас будут возникать дополнительно вопросы(такие как "А как изменить значение количества товаров в информере корзины") и здесь возникнет не нужная дискуссия в виде портянки.
Так что "Добро пожаловать на форум".
   
Максим  BUDETWEB 25 августа 2014, 14:03:54
Вот бы еще ссылочка на нужную ветку прилагалась.
   
cray  Amega 28 сентября 2014, 16:14:58
Дружище это должно быть в документации, как было ранее в 4, а не на форуме в неструктурированной по темам каше.
   
Дмитрий  Life-work 08 июля 2014, 16:10:09
А где популярные товары? Теперь их надо задавать вручную?
   
Александр  Акцент-Дон 20 октября 2016, 15:00:58
Есть какой то признак, что товар уже добавлен в корзину?
Чтобы отобразить в каталоге в списке товаров или на странице товара?
   
Описание проекта