Фильтрация по диапазону цен mFilter2

Задача: сделать фильтрацию по предустановленным диапазонам цен. Пример:
— До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',
Евгений Webinmd
01 июля 2024, 20:43
modx.pro
1
307
+11

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

Денис Усманов
01 июля 2024, 21:07
0
Хех, реализую и в своём фильтре «для бедных») Только потрачу на это минут 5)
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    1