CompareList

13 января 2017, 11:04

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

Параметры

Название По умолчанию Описание
&fields {"default":["price","article","vendor.name","color","size"]} JSON строка с массивом конфигурации списков сравнения. Ключ - это имя параметра, указанного в параметре &list сниппета addComparison, а значения - массив сравниваемых полей товара.
&tplRow tpl.Comparison.row Чанк с одной строкой таблицы сравнения товаров. Плейсхолдеры [[+cells]] и [[+same]].
&tplParam tpl.Comparison.param Чанк с именем параметра товара. Плейсхолдеры [[+param]] и [[+row_idx]].
&tplCell tpl.Comparison.cell Ячейка таблицы сравнения с одним значением параметра товара. Плейсхолдеры tpl.Comparison.cell, [[+classes]] и [[+cell_idx]].
&tplHead tpl.Comparison.head Ячейка заголовка товара в таблице сравнения. Здесь можно использовать все плейсхолдеры товара.
&tplCorner tpl.Comparison.corner Угловая ячейка таблицы, со ссылками на переключение параметров сравнения. Плейсхолдеров нет.
&tplOuter tpl.Comparison.outer Чанк-обёртка таблицы сравнения. Плейсхолдеры [[+head]] и [[+rows]].
&minItems 2 Минимальное количество товаров для сравнения.
&maxItems 10 Максимальное количество товаров для сравнения.
&formatSnippet - Произвольный сниппет для оформления значения параметра товара. Получает имя поля "$field" и его значение "$value". Должен вернуть отформатированную строку "$value".
&showLog false Вывести администратору подробный лог работы сниппета.

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

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

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

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

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

[[!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
// Получаемые массивы нужно преобразовать в строку, иначе вы получите слово 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:

[[!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
$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);

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

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

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