Задать вопрос
@EugeneNB

Возможна ли фильтрация по TV с диапазоном значений в mSearch2?

Возможно ли через mSearch2 (mFilter) фильтровать по TV с диапазоном значений?
В товарах есть несколько характеристик (TV полей) с диапазоном значений, например TV поле - workTemp (Рабочая температура). В этом поле стоят значения вида:
20-26
18-38
21-28
24-32
и т.д.

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

Единственная идея разделить на 2 поля и выводить 2 слайдера с мин и макс значением. Но таких характеристик несколько и будет перебор слайдеров... Хотелось бы все таки с одним TV.
  • Вопрос задан
  • 35 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Фронтенд-разработчик
    11 месяцев
    Далее
  • Skillfactory
    DevOps-инженер
    6 месяцев
    Далее
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
an-tar
@an-tar Куратор тега MODX
Full stack web developer
Верно, разделить диапазон на два числовых значения это хорошая идея.
Фильтровать диапазон вида 20-26 в одном TV штатно через mSearch2/mFilter нельзя, т.к. просто строка. Что тут можно предложить:
  1. Два TV (min и max). Тогда mFilter нормально работает с >= и <=, и можно повесить один слайдер.
  2. Один TV, но хранить внутри JSON. Например: {"min":20,"max":26}.
    Затем сделать два фильтра (min и max) через кастомный парсер TV. Работает корректно и остаётся один TV.
  3. Кастомный фильтр под строку 20-26
    Нужен свой класс, который парсит строку и формирует SQL для диапазона.
Ответ написан
Комментировать
DanArst
@DanArst
Гриффиндор в моде при любой погоде!
В принципе можно и с этими полями работать, но лучше создать два TV поля, причем с типом number, а не текст. В одно поле пишете min, в другое max, установить модуль Console и программно задать значения, что-то вроде этого:
<?php
$docs = $modx->getIterator('modResource', ['class_key' => 'msProduct', 'parent' => 3]); //вместо 3 поставьте ID родительской категории, если она у вас одна
foreach ($docs as $doc) {
    if ($val = $doc->getTVValue(5)) { //вместо 5 поставьте ID TV, в которой сейчас хранятся значения вида 30-45
        $temp = array_map('trim', explode('-', $val));
        $doc->setTVValue('tvmin', $temp[0]); //вместо tvmin ID или ключ TV для min значения
        $doc->setTVValue('tvmax', $temp[1]); //вместо tvmax ID или ключ TV для max значения
    }
}


А далее просто по примеру из доки расширяете модель и пишете кастомный фильтр. Который будет получать значения из слайдера и фильтровать по диапазону значений из двух полей. Можете не создавать два поля, а работать с текущим. Так и так придется расширять модель, если хотите отделаться одним слайдером
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы