mfilter2 — создание фильтра по алфавиту и вывод результатов по первой букве поля pagetitle
Всем привет! Столкнулся с задачей реализовать фильтрацию по первой букве ресурса (из поля pagetitle) в моём случае это фильтрация пород собак, но готового решения не нашёл. Вдохновился документацией и очень похожим решением в этой статье. Может кому будет полезно.
Итак, как это будет выглядеть:
Теперь по шагам:
1. Создаем файл custom.class.php в папке core/components/msearch2/custom/filters/custom.class.php
2. Пишем в custom.class.php следующий код:
3. Вписываем наш класс в системные настройки:
4. В вызове mFilter2 пишем:
Стилизацию радиокнопок думаю можно опустить, как и код чанков, так как чанки радиокнопок почти дефолтные, а стиль каждый пишет под себя.
Итого мы получаем — при клике на букву «А» выводятся все ресурсы, которые начинаются на «А», при клике на букву «Б» ресурсы на «Б» и тд.
Итак, как это будет выглядеть:
Теперь по шагам:
1. Создаем файл custom.class.php в папке core/components/msearch2/custom/filters/custom.class.php
2. Пишем в custom.class.php следующий код:
<?php
class lettersFilter extends mse2FiltersHandler {
public function buildLettersFilter(array $values, $name = '') {
if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
return array();
}
$results = array();
$this->letterssorting($values);
foreach ($values as $letter => $value) {
$results[$letter] = array(
'title' => $letter,
'value' => $letter,
'type' => 'radio',
'resources' => array()
);
foreach($value as $key => $ids) {
if ($key !== '') {
foreach($ids as $id) {
$results[$letter]['resources'][$id] = $id;
}
}
}
}
return $results;
}
public function filterLetters(array $requested, array $values, array $ids) {
$matched = array();
$myResources = array();
$this->letterssorting($values);
$tmp = array_flip($ids);
foreach ($values as $letter => $value) {
$myResources[$letter] = array();
foreach($value as $key => $ids) {
if ($key !== '') {
foreach($ids as $id) {
$myResources[$letter][$id] = $id;
}
}
}
}
foreach ($requested as $value) {
if (isset($myResources[$value])) {
$resources = $myResources[$value];
foreach ($resources as $id) {
if (isset($tmp[$id])) {
$matched[] = $id;
}
}
}
}
return $matched;
}
public function letterssorting( & $array ) {
$memory = NULL;
ksort( $array );
$sorting = array();
// Обходим массив
foreach( $array as $item => $value) {
# Получаем первую букву
$letter = mb_substr( $item, 0, 1, 'utf-8' );
// Если текущая буква не равна предыдущей
if( $letter != $memory ) {
$memory = $letter;
$sorting[$memory] = array();
}
// Дополняем массив
$sorting[$memory][$item] = $value;
}
$array = $sorting;
}
}
3. Вписываем наш класс в системные настройки:
mse2_filters_handler_class = lettersFilter
4. В вызове mFilter2 пишем:
&filters=`resource|pagetitle:letters`
Стилизацию радиокнопок думаю можно опустить, как и код чанков, так как чанки радиокнопок почти дефолтные, а стиль каждый пишет под себя.
Итого мы получаем — при клике на букву «А» выводятся все ресурсы, которые начинаются на «А», при клике на букву «Б» ресурсы на «Б» и тд.