Skip to content
  1. Компоненты
  2. Comparison
  3. CompareList

CompareList ​

Сниппет вывода таблицы сравнения.

Параметры ​

НазваниеПо умолчаниюОписание
&fields{"default": ["price", "article", "vendor.name", "color", "size"]}JSON строка с массивом конфигурации списков сравнения. Ключ - это имя параметра, указанного в параметре &list сниппета addComparison, а значения - массив сравниваемых полей товара.
&tplRowtpl.Comparison.rowЧанк с одной строкой таблицы сравнения товаров. Плейсхолдеры [[+cells]] и [[+same]].
&tplParamtpl.Comparison.paramЧанк с именем параметра товара. Плейсхолдеры [[+param]] и [[+row_idx]].
&tplCelltpl.Comparison.cellЯчейка таблицы сравнения с одним значением параметра товара. Плейсхолдеры tpl.Comparison.cell, [[+classes]] и [[+cell_idx]].
&tplHeadtpl.Comparison.headЯчейка заголовка товара в таблице сравнения. Здесь можно использовать все плейсхолдеры товара.
&tplCornertpl.Comparison.cornerУгловая ячейка таблицы, со ссылками на переключение параметров сравнения. Плейсхолдеров нет.
&tplOutertpl.Comparison.outerЧанк-обёртка таблицы сравнения. Плейсхолдеры [[+head]] и [[+rows]].
&minItems2Минимальное количество товаров для сравнения.
&maxItems10Максимальное количество товаров для сравнения.
&formatSnippetПроизвольный сниппет для оформления значения параметра товара. Получает имя поля "$field" и его значение "$value". Должен вернуть отформатированную строку "$value".
&showLogfalseВывести администратору подробный лог работы сниппета.

Сниппет выбирает и оформляет товары при помощи pdoTools. Вы можете использовать общие параметры этой библиотеки.

Если в системе установлен miniShop2, то сниппет будет выбирать товары с учетом их дополнительных таблиц, включая изображения галереи.

Конфигурация сравнения ​

На вашем сайте могут быть разные типы товаров и, чтобы не создавать 10 разных страниц сравнения, вы можете указать конфигурацию для всех них в одном параметре &fields.

Это JSON строка с массивом, содержащим произвольное имя списка и массив сравниваемых полей. Если вы указываете параметр &list у сниппета addComparison, то вы должны указать и массив полей для него при вызове CompareList.

modx
[[!addComparison?
  &list_id=`15`
  &list=`mobile`
]]

[[!CompareList?
  &fields=`{"mobile":["price","article","year","vendor.name","option.memory","option.cpu","country"]}`
]]

Если вы не указываете &list, то будет использована конфигурация default, прописанная по умолчанию.

Префиксы ​

В настройках полей сравнения можно указывать поля ресурса, ТВ параметры, и даже параметры товаров miniShop2.

  • option. - префикс для опций товаров из miniShop2.2
  • vendor. - префикс для полей производителя товара
  • ТВ параметры считаются полями ресурса и указываются без префикса
  • Поля объекта msProductData (price, weight, country и др.) тоже считаются полями ресурса

Оформление ​

Таблица сравнения строится из 6 чанков, которые перечислены в параметрах сниппета.

Обратите внимание, что в чанке &tplHead доступны все плейсхолдеры товара, включая выбираемые поля для сравнения.

Имена параметров (полей товара) ​

Все имена параметров выводятся через системный лексикон. То есть, для поля price в системе есть запись comparison_field_price, для weight - comparison_field_weight и т.д.

Если вы указываете параметры, для которых нет записей в лексиконе - нужно добавить их самостоятельно. Например, если вы сравниваете по ТВ параметру date, то нужно добавить в словари comparison_field_date.

Значения параметров ​

Для оформления внешнего вида значений параметров (цена, вес, артикул и т.д.) вы можете указать произвольный &formatSnippet. Он должен принять название обрабатываемого поля, полученное значение из БД, и выдать в оформленном виде.

Пример такого сниппета:

php
<?php
// Получаемые массивы нужно преобразовать в строку, иначе вы получите слово Array, вместо значения
if (is_array($value)) {
  natsort($value);
  $value = implode(',', $value);
}

// Форматирование цены и веса товаров miniShop2
if ($miniShop2 = $modx->getService('minishop2')) {
  switch ($field) {
    case 'price':
      $value = $miniShop2->formatPrice($value) . ' ' . $modx->lexicon('ms2_frontend_currency');
      break;
    case 'weight':
      $value = $miniShop2->formatWeight($value) . ' ' . $modx->lexicon('ms2_frontend_weight_unit');
      break;
  }
}

// Возвращаем значение
return $value;

Также для &tplCell добавляется CSS класс с именем параметра и префиксом field-. Например, для цены добавляется CSS класс field-price, который по умолчанию выводится жирным текстом.

Замена картинки ​

Если вы используете компонент с miniShop2 и нужно получить миниатюру не по умолчанию, то вы можете подключить значения из таблицы msProductFile.

Добавляем в вызов CompareList:

modx
[[!CompareList?
  &leftJoin=`{
    "200x200": {
      "class": "msProductFile",
      "on": "`200x200`.`product_id` = `msProduct`.`id` AND `200x200`.`rank` = 0 AND `200x200`.`path` LIKE '%/200x200/%'"
    }
  }`
  &select=`{
    "200x200" : "`200x200`.`url` as `200x200`"
  }`
]]

Где "200x200" нужная миниатюра. При работе будет добавлен недостающий плейсхолдер [[+200x200]] с миниатюрой.

Если же вы используете компонент без miniShop2 или по каким-то причинам не можете подключить нужную таблицу, то есть вариант использовать специальный сниппет подготовки данных prepareSnippet - это стандартная возможность библиотеки pdoTools.

Давайте выберем картинку из ТВ параметра с id = 10. Создаём сниппет подготовки данных addThumb:

php
<?php
$tv_id = 10; // Id ТВ параметра с картинкой
$empty = '/assets/img/no_image.jpg'; // Путь к картинке, которую нужно выводить если ТВ пуст

if (empty($row) || !is_array($row)) {return $row;}
$q = $modx->newQuery('modTemplateVarResource', array('tmplvarid' => $tv_id, 'contentid' => $row['id']));
$q->select('value');
if ($q->prepare() && $q->stmt->execute()) {
  $row['thumb'] = $q->stmt->fetchColumn();
}
if (empty($row['thumb'])) {
  $row['thumb'] = $empty;
}

return json_encode($row);

И указываем его в вызове сниппета:

modx
[[!CompareList?
  &fields=`{"mobile":["price","article","year","vendor.name","option.memory","option.cpu","country"]}`
  &prepareSnippet=`addThumb`
]]

При работе будет добавлен недостающий плейсхолдер [[+thumb]] с картинкой из ТВ параметра или изображением по умолчанию, если ТВ пуст.