Фильтрация по диапазону цен mFilter2
Задача: сделать фильтрацию по предустановленным диапазонам цен. Пример:
— До100
— 100-200
— От 200
Как это выглядит
Это разовая задача, решил не искать какого-то универсального решения.
Привожу свой вариант, просто потому что не нашел готового примера. Тут либо все сильно просто и нет смысла выкладывать, либо стесняются.
Итак, воспользуемся документацией методы фильтрации
1) создать свой класс
2) прописать его в сис настройках
3) дописать 2 метода
buildRpriceFilter (основной функционал)
filterRprice (просто вызов number )
По сути нам необходимо заменить фильтр number с небольшой доработкой.
Итак, нужно создать новый файл в директории /core/components/msearch2/custom/filters/ с именем имя.class.php и унаследовать mse2FiltersHandler.
Пример из документации:
Первый метод, вызов родного number
Второй метод, который построит наши диапазоны.
Часть кода можно было бы вынести в чанк, но сделал как сделал
Всегда можно добавить свои диапазоны цен
Ну и использовать просто (fenom)
— До100
— 100-200
— От 200
Как это выглядит
Это разовая задача, решил не искать какого-то универсального решения.
Привожу свой вариант, просто потому что не нашел готового примера. Тут либо все сильно просто и нет смысла выкладывать, либо стесняются.
Итак, воспользуемся документацией методы фильтрации
1) создать свой класс
2) прописать его в сис настройках
3) дописать 2 метода
buildRpriceFilter (основной функционал)
filterRprice (просто вызов number )
По сути нам необходимо заменить фильтр number с небольшой доработкой.
Итак, нужно создать новый файл в директории /core/components/msearch2/custom/filters/ с именем имя.class.php и унаследовать mse2FiltersHandler.
Пример из документации:
<?php
class myCustomFilter extends mse2FiltersHandler {
// Здесь надо будет написать приведенные ниже методы
}
Первый метод, вызов родного number
public function filterRprice(array $requested, array $values, array $ids)
{
return $this->filterNumber($requested, $values,$ids);
}
Второй метод, который построит наши диапазоны.
Часть кода можно было бы вынести в чанк, но сделал как сделал
Всегда можно добавить свои диапазоны цен
<?php
public function buildRpriceFilter(array $values, $name = '')
{
$results = [];
// мой диапазон цен, меняйте на нужный
$outputRanges = [
[0, 100],
[100, 200],
[200, 9999999]
];
foreach ($values as $value => $ids) {
if ($value !== '') {
foreach($outputRanges as $range) {
if($value > $range[0] && $value < $range[1]) {
// set title - можно было бы эти условия вынести в чанк, но мне так удобнее
// [[%from]] [[%to]] - добавьте лексиконы, если необходимо
switch($range[0]){
case 0:
$title = '[[%to]] '.$range[1]. ' MDL'; // 0 - 100
break;
case 100:
$title = $range[0]. ' MDL - '.$range[1]. ' MDL'; // 100 - 200
break;
case 200:
$title = '[[%from]] '.$range[0]. ' MDL'; // > 200
break;
default:
$title = $range[0]. ' MDL - '.$range[1]. ' MDL';
break;
}
if($results[$title]) $ids = array_merge($results[$title]['ids'], $ids);
$results[$title] = [
'title' => $title,
'value' => $range[0].','.$range[1],
'type' => 'default',
'resources' => $ids,
'sortfield' => $range[0] // добавил сортирующее поле
];
break;
}
}
}
}
// отсортировал по меньшему значению, если у вас только числовые значения, то можно вызвать дефолтную сортировку
usort($results, function($a,$b){
return ($a['sortfield']-$b['sortfield']);
});
return $results;
}
Ну и использовать просто (fenom)
'filters' => 'ms|price:rprice',
Комментарии: 1
Хех, реализую и в своём фильтре «для бедных») Только потрачу на это минут 5)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.