[mFilter2] Вывод товаров со смежными значениями
Небольшая заготовка из вчерашнего рукоделия.
Имеем сайт с подбором товаров по характеристикам, реализованным на mFilter2.
Один из параметров «Мощность активная» выглядит так (увеличение по клику):

Как видно, есть большое разнообразие товаров с близкими значениями мощностей, но общее количество товаров не столь велико.
Это приводит к тому, что когда посетитель выбирает, к примеру, мощность 10 кВт, то он видит 1 товар в результатах подбора. А специфика продукции такова, что логично предложить пользователю аналогичные изделия как с чуть меньшей мощностью, например 9 кВт, так и с большей, до 12-15 кВт.
Нет, конечно можно сказать, что пусть нащелкает нужные цифры в подборе, но всегда есть «но». На страницу «Товары с мощностью 10 кВт» (где уже стоит галочка в фильтре) пользователь приходит из поисковых систем, фильтра он не видел и не нажимал. Если на странице будет 1 товар, пользователь может быстро уйти, решив, что мы предлагаем крайне скудный ассортимент, так и не увидев, что есть фильтр.
В общем, небольшая зарисовка на тему того, как при выборе в фильтре параметра со значением 10, показать все товары в диапазоне -x%....+y%.
1. Расширяем класс фильтрации. Документация.
2. Код нового класса. Новый тип фильтрации назовем «tolerance».
Имеем сайт с подбором товаров по характеристикам, реализованным на mFilter2.
Один из параметров «Мощность активная» выглядит так (увеличение по клику):

Как видно, есть большое разнообразие товаров с близкими значениями мощностей, но общее количество товаров не столь велико.
Это приводит к тому, что когда посетитель выбирает, к примеру, мощность 10 кВт, то он видит 1 товар в результатах подбора. А специфика продукции такова, что логично предложить пользователю аналогичные изделия как с чуть меньшей мощностью, например 9 кВт, так и с большей, до 12-15 кВт.
Нет, конечно можно сказать, что пусть нащелкает нужные цифры в подборе, но всегда есть «но». На страницу «Товары с мощностью 10 кВт» (где уже стоит галочка в фильтре) пользователь приходит из поисковых систем, фильтра он не видел и не нажимал. Если на странице будет 1 товар, пользователь может быстро уйти, решив, что мы предлагаем крайне скудный ассортимент, так и не увидев, что есть фильтр.
В общем, небольшая зарисовка на тему того, как при выборе в фильтре параметра со значением 10, показать все товары в диапазоне -x%....+y%.
1. Расширяем класс фильтрации. Документация.
2. Код нового класса. Новый тип фильтрации назовем «tolerance».
<?php
class myCustomFilter extends mse2FiltersHandler {
/** Значение допуска для фильтра вверх, +30% */
private $toleranceUp = 0.3;
/** Значение допуска для фильтра вниз, -15% */
private $toleranceDown = 0.15;
/**
* Данный метод совпадает с buildDefaultFilter
*
* @param array $values
* @param string $name
*
* @return array Prepared values
*/
public function buildToleranceFilter(array $values, $name = '') {
if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
return array();
}
$results = array();
foreach ($values as $value => $ids) {
if ($value !== '') {
$results[$value] = array(
'title' => $value,
'value' => $value,
'type' => 'default',
'resources' => $ids
);
}
}
ksort($results);
return $results;
}
/**
* Переопределяем стандартный метод filterDefault
* Здесь мы ищем не совпадение параметра с запрашиваемым, а задаем диапазон ±X%, в который должно попасть значение
* Конечно же, метод применим только к числовым параметрам
*
* @param array $requested Filtered ids of resources
* @param array $values Filter data with value and ids of matching resources
* @param array $ids Ids of currently active resources
*
* @return array
*/
public function filterTolerance(array $requested, array $values, array $ids) {
$matched = array();
$tmp = array_flip($ids);
foreach ($requested as $value) {
$min = ($value - ($value * $this->toleranceDown));
$max = ($value + ($value * $this->toleranceUp));
foreach ($values as $number => $resources) {
if ($number >= $min && $number <= $max) {
foreach ($resources as $id) {
if (isset($tmp[$id])) {
$matched[] = $id;
}
}
}
}
}
return $matched;
}
}3. Используем фильтр:[[!mFilter?
&filters=`ms|power:tolerance`
]] Комментарии: 6
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Правда вариантов тогда получится гораздо больше, что, наверное, не очень хорошо для SEO.