Skip to content
ms3Variants
ms3Variants
Компонент вариантов товаров для MiniShop3
  • MODX 3
  • PHP 8.2
  • miniShop3
  • Vue 3
  1. Компоненты
  2. ms3Variants
  3. Сниппеты

Сниппеты ​

msProductVariants ​

Выводит варианты товара на странице товара: готовый HTML по чанкам или массив данных для своей разметки.

Вызывайте сниппет некэшируемым

Пишите '!msProductVariants', с восклицательным знаком. Без него цены и остатки вариантов попадают в кэш страницы: изменение варианта в админке и списание остатков этот кэш не сбрасывают, и покупатель видит старую цену и наличие. С параметром returnData кэшируемый вызов приводит к ошибке 500 при повторной загрузке страницы.

Параметры ​

ПараметрПо умолчаниюОписание
productтекущий ресурсID товара. Если ресурс не товар — пустой вывод (см. ниже)
tplms3_variantsЧанк-обёртка для всех вариантов
tplRowms3_variants_rowЧанк для одного варианта
activeOnly11 — только активные варианты, 0 — все. Неактивный вариант считается отсутствующим, поэтому при ms3variants_show_out_of_stock = Нет он скрыт и при 0. По умолчанию настройка — Да
sortbypositionЛюбое поле варианта: position, price, old_price, sku, count, weight, id. Ошибка в имени поля — сниппет ничего не выводит, а в журнале ошибок MODX появляется запись Error … executing query
sortdirASCНаправление: ASC или DESC
includeJs1Подключить JavaScript (1/0). При returnData не подключается
includeCss1Подключить CSS (1/0). При returnData не подключается
outputSeparator\nРазделитель между вариантами
returnData0Вернуть массив данных вместо HTML (1/0)

Вызов ​

fenom
{'!msProductVariants' | snippet}

Свои чанки, сортировка, другой товар:

fenom
{'!msProductVariants' | snippet : [
    'tpl' => 'my_variants_wrapper',
    'tplRow' => 'my_variant_item',
    'sortby' => 'price',
    'sortdir' => 'ASC',
    'product' => 42
]}

Данные в переменную ​

С returnData сниппет возвращает массив, а разметку вы пишете сами.

fenom
{set $variantsData = '!msProductVariants' | snippet : ['returnData' => 1]}

{if $variantsData.total > 0}
    {foreach $variantsData.variants as $variant}
        <div>{$variant.sku} — {$variant.price}</div>
    {/foreach}
{/if}
КлючТипОписание
product_idintID товара
variantsarrayВарианты со всеми полями строки варианта, включая idx и options_string
available_optionsarrayЗначения опций вариантов — как в обёртке
totalintКоличество вариантов

JavaScript и CSS в этом режиме не подключаются. Если ваша разметка использует data-ms3v-*, подключите assets/components/ms3variants/js/web/ms3variants.js и assets/components/ms3variants/css/web/ms3variants.css сами.

Если вариантов нет ​

СитуацияОбычный вызовС returnData
У товара нет вариантов или все скрытыпустая строка, чанк tpl не выводитсяпустой массив []
Ресурс не товарпустая строка и запись в журнале ошибок MODXпустая строка, а не массив

Товаром считается только ресурс с class_key = MiniShop3\Model\msProduct. Не вызывайте сниппет в общем шаблоне для всех страниц: каждая страница-не-товар добавит запись в журнал ошибок.

Плейсхолдеры в tpl (обёртка) ​

ПлейсхолдерТипОписание
{$product_id}intID товара
{$rows}stringСтроки вариантов из чанка tplRow
{$variants}arrayМассив вариантов для Fenom
{$available_options}arrayЗначения опций вариантов по ключам: {color: ['Красный', 'Синий']}
{$total}intКоличество вариантов
{$options_json}stringavailable_options в JSON
{$variants_json}stringОпции каждого варианта в JSON: {"12": {"color": "Красный"}}

available_options собирается по всем активным вариантам товара. Настройку ms3variants_show_out_of_stock он не учитывает: значение, у которого все варианты закончились, в нём остаётся, хотя строк с ним нет.

Плейсхолдеры в tplRow (строка варианта) ​

ПлейсхолдерТипОписание
{$id}intID варианта
{$product_id}intID товара
{$sku}string, может быть пустымАртикул
{$price}floatЦена
{$old_price}float, может быть пустымСтарая цена
{$count}intОстаток
{$weight}float, может быть пустымВес
{$active}boolВариант активен
{$position}intПозиция
{$in_stock}boolВ наличии: вариант активен и остаток больше нуля. При ms3variants_check_stock = Нет — у любого активного варианта. По умолчанию настройка — Да
{$file_id}int, может быть пустымID изображения из галереи товара
{$image_url}string, может быть пустымURL изображения. Пусто, если изображение не выбрано
{$options}arrayОпции варианта списком: [{key, value}, ...]
{$options_string}stringЗначения опций строкой: «Красный, XL»
{$options_array}arrayОпции по ключам: {color: 'Красный', size: 'XL'}
{$created_at}, {$updated_at}stringДаты создания и изменения
{$idx}intПорядковый номер, начиная с 0

Цены — числа без форматирования.

Варианты в каталоге (msProducts) ​

Чтобы вывести варианты в каталоге, передайте стандартному сниппету msProducts параметр usePackages:

fenom
{'msProducts' | snippet : [
    'parents' => 0,
    'usePackages' => 'ms3Variants',
    'tpl' => 'ms3_products_row_variants'
]}

Значение ms3Variants пишется с учётом регистра: при ms3variants варианты не загрузятся.

В каталог попадают только активные варианты в порядке position. Параметры activeOnly и sortby сниппета msProductVariants здесь не действуют. Закончившиеся варианты скрываются по той же настройке ms3variants_show_out_of_stock, что и на странице товара.

Без замены ProductCardUI в корзину попадёт товар, а не вариант

Чтобы кнопки каталога добавляли выбранный вариант, замените стандартный модуль MiniShop3 на модуль ms3Variants — см. раздел «Модуль ProductCardUI» на странице Каталог товаров.

Плейсхолдеры товара с вариантами ​

ПлейсхолдерТипОписание
{$has_variants}boolЕсть ли варианты у товара
{$variants_count}intКоличество вариантов
{$variants_json}stringТе же данные, что в {$variants}, JSON-массивом. Структура не совпадает с {$variants_json} обёртки msProductVariants
{$variants}arrayМассив вариантов для Fenom

У товара без вариантов: {$has_variants} = false, {$variants_count} = 0, {$variants} — пустой массив, {$variants_json} — [].

Поля варианта в {$variants} ​

php
[
    'id' => 1,
    'product_id' => 42,
    'sku' => 'ABC-123-red-XL',
    'price' => 1500.00,
    'old_price' => 2000.00,
    'count' => 10,
    'weight' => 0.5,
    'active' => true,
    'position' => 0,
    'in_stock' => true,
    'file_id' => 7,
    'image_url' => '/assets/images/products/42/product.jpg',
    'small' => '/assets/images/products/42/small/product.jpg', // только с includeThumbs
    'options' => [['key' => 'color', 'value' => 'red'], ['key' => 'size', 'value' => 'XL']],
    'options_array' => ['color' => 'red', 'size' => 'XL'],
]

С эскизами изображений ​

includeThumbs — стандартный параметр msProducts. Эскизы вариантов загружаются, только если указан и usePackages. Передайте имена эскизов из настроек источника файлов товаров:

fenom
{'msProducts' | snippet : [
    'parents' => 0,
    'usePackages' => 'ms3Variants',
    'includeThumbs' => 'small,medium'
]}

У варианта с изображением появятся поля small, medium с URL эскизов. У варианта без изображения этих полей нет. Сниппет msProductVariants эскизы не загружает.