Основному товару можно задать варианты, которые будут отличаться некоторыми свойствами. Для вариантов товаров (т.е. для записей, у которых задан Parent_Message_ID) класс обеспечивает также «наследование» свойств: если какое-то свойство не задано у варианта, его значение будет равно значению этого свойства у родительского товара.
Для облегчения создания типовых элементов, отображающих варианты товара, существуют классы:
$variants = $item['_Variants'];
$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();
В шаблонах доступны «псевдопеременные»:
Внутри шаблона можно использовать (в экранированном виде) переменную $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
что-то на подобии:
[CODE] $variants = ($item["_Variants"])->order_by('size','ASC');
и
echo nc_netshop_item_variant_admin_table($item,'order by size asc');
[/CODE]
Кто-нибудь знает?
В системных настройках компонента прописать
$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
понятно, что должен быть шаблон. но что должно быть в шаблоне множественного редактирования кроме того, что здесь написано про системные настройки?
Автоматическая генерация шаблона множественного редактирования генерирует абсолютно пустой шаблон.
Нужно ли выбирать этот шаблона в настройках инфоблока в разделе?
В общем больше информации про множественное редактирование вариантов, пожалуйста.