Получаем color и pattern из таблицы зная название цвета для дополнения msOptionsColor
Добрый день!
Заметка по сути больше для себя, чтобы использовать в будущем на других проектах, но если кому то пригодится, то буду рад.
Сильно не критикуйте для решения задачи использовал GPT, поэтому конструктивная критика по коду сниппета ниже, приветствуется.
И так в чем суть:
Появилась такая проблема при использовании дополнения msOptionsColor при выводе цветов в mFilter2.
Вызов фильтров в шаблоне подразумевает что будут выводиться не просто названия цветов, а и их иконки так сказать, см. пример:

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

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

И при этом все будет хорошо фильтроваться.
Отсюда следует задача:
Требуется написать сниппет, который будет брать значения color и pattern из таблицы дополнения msOptionsColor, зная название цвета и далее мы сможем стилизовать вывод чекбоксов с использованием параметров цвета или паттерна.
Цвета в таблице хранятся в таком виде:

Сниппет назовем getColorInfo:
Далее в mFilter вызываем стандартными средствами как для свойства color:
Чанк tpl.mFilter2.filter.checkbox.color, где выводятся чекбоксы с иконками цветов, в моем примере выглядит так:
Пояснения:
А дальше просто подставляем в вывод:
$data.pattern — будет содержать из моего примера assets/images/colors/c5.webp
$data.color — будет содержать из моего примера cdaa65
Что и требовалось получить. Все работает корректно, по крайней мере пока))))
Заметка по сути больше для себя, чтобы использовать в будущем на других проектах, но если кому то пригодится, то буду рад.
Сильно не критикуйте для решения задачи использовал 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
Что и требовалось получить. Все работает корректно, по крайней мере пока))))
Поблагодарить автора
Отправить деньги
Комментарии: 3
Сниппет можно сократить до такого ):
<?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;
Четко! Вот это я понимаю, мое почтенье!!!
скормите его gpt чтобы он знал это 😊😊
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.