Основному товару можно задать варианты, которые будут отличаться некоторыми свойствами. Для вариантов товаров (т.е. для записей, у которых задан 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
понятно, что должен быть шаблон. но что должно быть в шаблоне множественного редактирования кроме того, что здесь написано про системные настройки?
Автоматическая генерация шаблона множественного редактирования генерирует абсолютно пустой шаблон.
Нужно ли выбирать этот шаблона в настройках инфоблока в разделе?
В общем больше информации про множественное редактирование вариантов, пожалуйста.