mfilter2 - вывод значений фильтра в алфавитном порядке, с группировкой по первой букве
Добрый день, давно не писал ничего, вот делюсь рабочим вариантом группировки значений фильтра по первой букве.
Как это должно выглядеть:
Внешний вид оставим верстальщикам, перейдем к формированию фильтра.
Согласно документации расширяем фильтр.
1) Создаем файл myfilters.class.php в папке core/components/msearch2/custom/filters/myfilters.class.php
2) Вписываем туда следующий код
3) Вписываем наш класс в системные настройки
mse2_filters_handler_class = myFilter
По итогу в чанке для row вы получите разделение на группы, достаточно будет сделать проверку
4) В вызове фильтра указывать так:
Может где-то есть решение и получше, ищите
Как это должно выглядеть:
Согласно документации расширяем фильтр.
1) Создаем файл myfilters.class.php в папке core/components/msearch2/custom/filters/myfilters.class.php
2) Вписываем туда следующий код
<?php
class myFilter extends mse2FiltersHandler {
public function buildAlphabetFilter(array $values, $name = '') {
if (count($values) < 2 && empty($this->config['showEmptyFilters'])) {
return array();
}
$results = array();
$this->alphabetsorting($values);
foreach ($values as $letter => $value) {
$results[$letter] = array(
'title' => $letter,
'value' => ''
);
foreach($value as $key => $ids) {
if ($key !== '') {
$results[$key] = array(
'title' => $key,
'value' => $key,
'type' => 'default',
'resources' => $ids
);
}
}
}
return $this->sortFilters($results, 'default', array('name' => $name));
}
public function alphabetsorting( & $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 = myFilter
По итогу в чанке для row вы получите разделение на группы, достаточно будет сделать проверку
{if $value}
// тут вот чанк обычный с чекбоксами (взято из родных чанков, перепишите на феном)
<label for="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]" class="[[+disabled]]">
<input type="checkbox" name="[[+filter_key]]" id="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]" value="[[+value]]" [[+checked]] [[+disabled]]/> [[+title]] <sup>[[+num]]</sup>
</label>
{else}
// а тут вот вывод буквы
<div class="letter">{$title}</div>
{/if}
4) В вызове фильтра указывать так:
'filters' => 'tv|brands:alphabet',
Может где-то есть решение и получше, ищите
Комментарии: 1
Молодец, дядь Жень.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.