Получаем color и pattern из таблицы зная название цвета для дополнения msOptionsColor

Добрый день!
Заметка по сути больше для себя, чтобы использовать в будущем на других проектах, но если кому то пригодится, то буду рад.

Сильно не критикуйте для решения задачи использовал GPT, поэтому конструктивная критика по коду сниппета ниже, приветствуется.

И так в чем суть:

Появилась такая проблема при использовании дополнения msOptionsColor при выводе цветов в mFilter2.
Вызов фильтров в шаблоне подразумевает что будут выводиться не просто названия цветов, а и их иконки так сказать, см. пример:



Если использовать инструкцию из примера вызова на гист https://gist.github.com/vgrish/1c586e84e7b48cef82d4f9fdff979b0f из документации, все хорошо стилизуется и выглядит как в примере выше, но при фильтрации цветов в url добавляется это:



http://site_name.ru/catalog/?color=TestPattern~cdaa65~assets/images/colors/c5.webp

т.е. в код добавляется такая конструкция, которая указана по документации в вызове mFilter2:
msoc|color~value~color~pattern, где
value — название цвета, в моем случае = TestPattern
color — значение цвета, в моем случае = cdaa65
pattern — значение пути паттерна, в моем случае = assets/images/colors/c5.webp

На мой взгляд такая история в url совсем не годится, причем если мы вызовем фильтр цвета в стандартном чанке без иконок цвета или паттерна, то url будет выглядеть так:



http://site_name.ru/catalog/?color=TestPattern

И при этом все будет хорошо фильтроваться.

Отсюда следует задача:

Требуется написать сниппет, который будет брать значения color и pattern из таблицы дополнения msOptionsColor, зная название цвета и далее мы сможем стилизовать вывод чекбоксов с использованием параметров цвета или паттерна.

Цвета в таблице хранятся в таком виде:



Сниппет назовем getColorInfo:

<?php
// Входные параметры:
// &color - название цвета (обязательный параметр)

// Подключаем файл конфигурации MODX
include MODX_CORE_PATH . 'config/config.inc.php';

// Получаем значение цвета из параметра
$color = $modx->getOption('color', $scriptProperties, '');

if (empty($color)) {
    return json_encode(['error' => 'Цвет не указан.']); // Если цвет не передан, возвращаем ошибку в формате JSON
}

// Формируем имя таблицы с учетом префикса
$tableName = $table_prefix . 'msop_colors';

try {
    // Подготавливаем SQL-запрос
    $query = $modx->prepare("SELECT `color`, `pattern` FROM {$tableName} WHERE `value` = :color");

    // Выполняем запрос с передачей параметра
    $query->execute([':color' => $color]);

    // Получаем результат
    $result = $query->fetch(PDO::FETCH_ASSOC);

    if ($result) {
        // Если данные найдены, возвращаем их в виде массива
        return [
            'color' => $result['color'],
            'pattern' => $result['pattern']
        ];
    } else {
        // Если данные не найдены, возвращаем сообщение об ошибке
        return ['error' => 'Цвет не найден.'];
    }
} catch (PDOException $e) {
    // Логируем ошибку и возвращаем сообщение
    $modx->log(modX::LOG_LEVEL_ERROR, 'Ошибка при выполнении запроса: ' . $e->getMessage());
    return ['error' => 'Произошла ошибка при выполнении запроса.'];
}

Далее в mFilter вызываем стандартными средствами как для свойства color:

{'!mFilter2' | snippet : [
    ...
    'class' => 'msProduct',
    'element' => 'msProducts',
    'filters' => '
        msoption|color,
    ',
    'aliases' => '
        msoption|color==color,
    ',    
    'tplFilter.outer.color' => 'tpl.mFilter2.filter.outer.color',
    'tplFilter.row.color' => 'tpl.mFilter2.filter.checkbox.color',
...
]}

Чанк tpl.mFilter2.filter.checkbox.color, где выводятся чекбоксы с иконками цветов, в моем примере выглядит так:

{var $key = $table ~ $delimeter ~ $filter}
{set $data = '!getColorInfo' | snippet : [ 'color' => $value ]}
<li class="list-item d-flex gap-12 align-items-center">
    {if $data.pattern}
        <input type="checkbox" name="{$filter_key}" class="tf-check-color" style="background-image:url({$data.pattern}); border: 1px solid rgba(134, 134, 134, 0.12);" id="mse2_{$key}_{$idx}" value="{$value}" {$checked} {$disabled}>
        <label for="mse2_{$key}_{$idx}" class="label"><span>{$title}</span> <span>({$num})</span></label>
    {else}
        <input type="checkbox" name="{$filter_key}" class="tf-check-color" style="background-color:#{$data.color}; border: 1px solid rgba(134, 134, 134, 0.12);" id="mse2_{$key}_{$idx}" value="{$value}" {$checked} {$disabled}>
        <label for="mse2_{$key}_{$idx}" class="label"><span>{$title}</span> <span>({$num})</span></label>
    {/if}
</li>

Пояснения:

{set $data = '!getColorInfo' | snippet : [ 'color' => $value ]}
Тут мы получаем из нашего сниппета значения color и pattern зная название нашего цвета.
А дальше просто подставляем в вывод:
$data.pattern — будет содержать из моего примера assets/images/colors/c5.webp
$data.color — будет содержать из моего примера cdaa65

Что и требовалось получить. Все работает корректно, по крайней мере пока))))
Андрей Шевяков
13 января 2025, 12:20
modx.pro
1
571
+4
Поблагодарить автора Отправить деньги

Комментарии: 3

Павел Романов
13 января 2025, 12:49
1
+2
Сниппет можно сократить до такого ):
<?php
$out = [];
$table = $modx->getOption('table_prefix').'msop_colors';
if($query = $modx->query("SELECT color, pattern FROM {$table} WHERE value = '{$color}'")){
    $out = $query->fetch(PDO::FETCH_ASSOC);
}
return $out;
    Андрей Шевяков
    13 января 2025, 12:56
    0
    Четко! Вот это я понимаю, мое почтенье!!!
      Sergey (Sentinel)
      13 января 2025, 13:20
      +1
      скормите его gpt чтобы он знал это 😊😊
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3