mfilter2 — создание фильтра по алфавиту и вывод результатов по первой букве поля pagetitle

Всем привет! Столкнулся с задачей реализовать фильтрацию по первой букве ресурса (из поля pagetitle) в моём случае это фильтрация пород собак, но готового решения не нашёл. Вдохновился документацией и очень похожим решением в этой статье. Может кому будет полезно.


Итак, как это будет выглядеть:



Теперь по шагам:

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`

Стилизацию радиокнопок думаю можно опустить, как и код чанков, так как чанки радиокнопок почти дефолтные, а стиль каждый пишет под себя.

Итого мы получаем — при клике на букву «А» выводятся все ресурсы, которые начинаются на «А», при клике на букву «Б» ресурсы на «Б» и тд.
Андрей Чаплыгин
08 апреля 2024, 12:04
modx.pro
5
351
+10

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0