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

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

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

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

  • nc_netshop_item_variant_selector — для вывода элементов для переключения между вариантами
  • nc_netshop_item_variant_admin_helpers — вывод таблицы с вариантами товаров в режиме администрирования

Получение списка включённых вариантов товара

$variants = $item['_Variants'];

Получение элементов для выбора вариантов товара на странице (в виде <select>)

$item = new nc_netshop_item($resMsg);
 
// Указываем, какие поля отличают товары друг от друга — Color, Size
$selectors = new nc_netshop_item_variant_selector($item, array('Color', 'Size'));
 
echo 'Цвет: ', $selectors->as_select('Color'), "<br>",
// Если цвет только один — выведет только текстовое значение, без <select>
     'Размер: ', $selectors->as_select('Size', 'Выберите размер'), "<br>";
// Если указан второй аргумент, то в случае, если «основной» вариант товара отключён,
// в <select> будет добавлена <option>Выберите размер</option>
 
// Добавляем скрипт, инициализирующий подгрузку вариантов при изменении выбранного значения в <select>:
echo $selectors->init(); // можно передать параметры — см. также ниже
 
?>
<!-- начало .tpl-variable-part -->
<div class='tpl-variable-part'>
   Здесь выводим информацию о товаре, используем переменную $item (это позволяет наследовать свойства основного товара):
   <h3><?=$item['Name'] ?></h3>
   <p>Цена: <?=$item['ItemPriceF'] ?></p>
   <div><?=$item['Slider'] ?></div>
</div>
<!-- конец .tpl-variable-part -->
 
<?php if ($request_type != 'get_variant'): /* можем сэкономить трафик */ ?>
<div>
   Тут выводим то, что не нужно обновлять при переключении другого варианта — например, комментарии
</div>
<?php endif; ?>
 
<div class='tpl-variable-part'>
   Обновляемых фрагментов может быть несколько, главное чтобы в полном выводе и в naked-режиме количество фрагментов было одинаковое.
   <?=$item['Vendor'] ?>
</div>

Вывод переключателя вариантов по шаблону

$template = array(
    'prefix' => "<div>\n",
     // элемент, который выводится если основной вариант товара отключён:
    'first' => "",
     // варианты с таким же сочетанием опций (заданных в конструкторе
     // nc_netshop_item_variant_helper), что и у выбранного сейчас товара:
    'active' => "<div class='available-variant'><a href='%URL'>%NAME</a></div>",
     // выбранный вариант:
    'active_link' => "<div class='current-variant'>%NAME</div>",
     // товар доступен только с другим сочетанием характеристик:
    'unactive' => "<div class='unavailable-variant'><a href='%URL'>%NAME</a></div>",
    'suffix' => "</div>\n",
    'divider' => "\n",
);
 
echo 'Цвет: ', $selectors->by_template('Color', $template), "<br>";
echo $selectors->init();

В шаблонах доступны «псевдопеременные»:

  • %NAME — значение опции (то есть название цвета, размер и т.п.)
  • %URL — ссылка на страницу варианта

Внутри шаблона можно использовать (в экранированном виде) переменную $item, она будет указывать на соответствующий вариант товара:

$template['active'] = '<div><img src="$item[Image]"><br>$item[ItemPriceF]</img></div>';

Первому элементу тэгу в prefix будет добавлен атрибут data-role='variant-selector', который нужен для выборки переключателей через JS

Конфигурирование скрипта загрузки вариантов

Конфигурирует скрипт, подгружающий варианты товара (netshop/js/variant_selector.js)

echo $selectors->init(array(
    // Если какой-то параметр не определён — используются указанные ниже
    // значения по умолчанию
 
    // селектор для обновляемых областей
    "updated_regions" => ".tpl-variable-part",
 
    // селектор для элемента, откуда будет взят title страницы
    page_title => "title",
 
    // параметры, добавляемые к xhr-запросу вариантов товара
    "request_params" => "&isNaked=1",
 
    // кешировать результаты?
    "cache" => true,
 
    // заменять адрес в адресной строке?
    "replace_location" => true
 
    // тело функции-обработчика события «обновлён вариант». Если задана
    // строка, то будет создана функция function(updated_regions) { "ON_UPDATE" }
    // (параметр updated_regions содержит jQuery-объект с обновлёнными
    // областями страницы)
    "on_update": "",  // Пример: "updated_regions.find('select').chosen()"
 ));
 
// пример: загрузка страницы без isNaked:
echo $selectors->init(array("request_params" => ""));

Управление способом подключения скрипта загрузки вариантов

Подключение скрипта без инициализации переключателей:

echo $selectors->include_script();

По умолчанию скрипт полностью вставляется в код страницы (поскольку в сжатом виде он около 1Кб). Чтобы загружать скрипт отдельно:

echo $selectors->include_script(false);
echo $selectors->init();

если был вызван метод selection_script(), то скрипт не будет подключаться повторно; переключатели вариантов будут инициализированы по событию DOMReady

Шаблоны в админке

Вывод таблицы со списком вариантов

Функционал реализован в nc_netshop_item_variant_helpers::make_table(). Также существует функция для доступа к этому методу nc_netshop_item_variant_table():

// если метод вызван без параметров — вернёт таблицу с колонками 'ItemID', 'Name', 'OriginalPriceF'
echo nc_netshop_item_variant_admin_table($item); // если не admin_mode — ничего не выведет

// указать другой состав колонок в таблице:
echo nc_netshop_item_variant_admin_table($item, array('ItemID', 'Name', 'Color', 'Size'));

// не показывать заголовок в таблице:
echo nc_netshop_item_variant_admin_table($item, array('ItemID', 'Name', 'Color', 'Size'), false);

Множественное редактирование вариантов

Для включения множественного редактирования вариантов у компонента должен иметься шаблон типа «Множественное редактирование, в системных настройках которого производится подготовка переменных для модификации запроса:

extract(nc_netshop_item_variant_admin_helpers::multi_edit_variables());

Готовые шаблоны отображения вариантов для быстрого добавления в корзину

В виде переключателей

<?php
$variants = $item["_Variants"]->where('StockUnits', '0', '!==');
?>
<div class="item-variant-list">
<?php
$i = 0;
foreach ($variants as $variant) {
    echo '<div class="item-variant">',
         '<label>',
         '<input type="radio" name="items[]" value="' . $variant["_ItemKey"] . '"' .
         ($i++ == 0 ? " checked" : "") . '> ',
         $variant['Name'],
         '</label>',
         '</div>';
    }
?>
</div>

В виде выпадающего списка:

<?php
$variants = $item["_Variants"]->where('StockUnits', '0', '!==');
?>
<select class="item-variant-list" name="items[]">
<?php
$i = 0;
foreach ($variants as $variant) {
    echo '<option value="' . $variant["_ItemKey"] . '">' .
            htmlspecialchars($variant["Name"], ENT_QUOTES) .
         '</option>';
}
?>
</select>

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

Дмитрий  Life-work 29 марта 2015, 21:27:38
не хватает методов сортировки вариантов товара, импортируемых автоматически, как в панели управления так и на сайте.

что-то на подобии:
[CODE] $variants = ($item["_Variants"])->order_by('size','ASC');
и
echo nc_netshop_item_variant_admin_table($item,'order by size asc');
[/CODE]
   
ООО «РУМЕДИА»  RMB 01 декабря 2015, 11:37:54
Доброго времени суток! А каким образом выбрать только один товар из варианта товаров с максимальной ценой?
   
Владимир  Web-Element 19 января 2016, 21:00:00
Так как всё же сортировать варианты при выводе?
Кто-нибудь знает?
   
Дмитрий Коновалов  Activica 15 июля 2016, 16:29:51
page_title в кавычках в $selectors->init([_тут_]);
   
Дмитрий Коновалов  Activica 15 июля 2016, 17:31:13
Если у компонента "товар" есть дополнительные поля, которые обязательны для заполнения и имеют значение по умолчанию, то они не будут наследоваться от родительского товара, а это нужно например для переменной "Новый товар", "Товар можно заказать" и т.п.
   
Дмитрий Коновалов  Activica 15 июля 2016, 17:37:23
Решается вот так:

В системных настройках компонента прописать
$query_select .= "
, IF(a.`Parent_Message_ID` <> 0 AND a.`Parent_Message_ID` IS NOT NULL, (SELECT pr.`fororder` FROM `Message{$classID}` AS pr WHERE a.`Parent_Message_ID` = pr.`Message_ID`), a.fororder) AS `fororder`
, IF(a.`Parent_Message_ID` <> 0 AND a.`Parent_Message_ID` IS NOT NULL, (SELECT pr.`absent` FROM `Message{$classID}` AS pr WHERE a.`Parent_Message_ID` = pr.`Message_ID`), a.absent) AS `absent`
, IF(a.`Parent_Message_ID` <> 0 AND a.`Parent_Message_ID` IS NOT NULL, (SELECT pr.`soon` FROM `Message{$classID}` AS pr WHERE a.`Parent_Message_ID` = pr.`Message_ID`), a.soon) AS `soon`
";

При выводе использовать не $item['absent'], а $f_absent
   
Владимир  Web-Element 30 ноября 2016, 19:16:53
А можно подробнее про "Множественное редактирование вариантов"?
понятно, что должен быть шаблон. но что должно быть в шаблоне множественного редактирования кроме того, что здесь написано про системные настройки?
Автоматическая генерация шаблона множественного редактирования генерирует абсолютно пустой шаблон.
Нужно ли выбирать этот шаблона в настройках инфоблока в разделе?
В общем больше информации про множественное редактирование вариантов, пожалуйста.
   
Правильно ли я понимаю, если у нас есть товар и мы выбираем цвет и размер, а цветов у нас 20 штук и размеров еще 3, то в итогде мы должны создать 20*3 вариантов товара?
   
Nexwich  Панасин Александр 09 ноября 2017, 17:34:58
Верно
   
Описание проекта