Фильтрация с учетом мультикатегорий

Всем привет!

Решил поделиться небольшим опытом и проблемами, которые у меня возникли при работе с mFilter2. Делаю фильтрацию товаров с учетом мультикатегорий. Вызов mFilter2 и структура каталога:

[[!mFilter2?
	&class=`msProduct`
	&element=`msProducts`
	&cacheTime=`-1`
	&paginator=`pdoPage`
	&limit=`10`
	&pageLimit=`5`
	&suggestions=`1`
	&aliases=`
		resource|parent==category
	`
	&filters=`
	   parent:categories
	`
	&tpl=`Product_list.product`
	&tplOuter=`Product_list.outer`
	&tplPageWrapper=`@INLINE <ul>[[+first]][[+prev]][[+pages]][[+next]][[+last]]</ul>`
	&tplPageActive=`@INLINE <li class="active"><span>[[+pageNo]]</span></li>`
	&tplFilter.outer.default=`Product_list.filter.outer`
	&tplFilter.row.default=`Product_list.filter.checkbox`
]]





Проблемы, которые я обнаружил:

  1. Фильтры с одинаковыми именами не отображаются. Т. е. добавил тестовый каталог «Кузов (181)» в каталог «Audi 80/90, (1986-1991)», добавил в него товар, теперь в фильтрах каталог «Кузов» с id 181 отображается, а с id 30 нет. Конечно, нет смысла в двух одинаковых каталогов, но это проблема будет ощутима, если делать фильтрацию с учетом мультикатегорий.
  2. Что уже касается конкретно мультикатегорий. Добавляем 2 товара и указываем все дочерние категории для категорий Audi 80/90, (1986-1991) и Audi 80, 1991-1996, т.е. Кузов, Двигатель и т.д…. Основные категории для этих двух товаров 30 и 51. Смотрим, что вышло, а именно предварительные результаты:




    Двигатель 16….чтоа?! :)
    Расширяем класс фильтрации, добавляем вывод массива фильтров, чтобы посмотреть что там такое:

    Array
    (
        [parent] => Array
            (
                [30] => Array
                    (
                        [0] => 170
                        [1] => 170
                        [2] => 170
                        [3] => 170
                        [4] => 170
                        [5] => 170
                        [6] => 170
                        [7] => 170
                        [8] => 170
                        [9] => 170
                        [10] => 170
                        [11] => 170
                        [12] => 170
                        [13] => 170
                        [14] => 170
                        [15] => 180
                    )
    
                [39] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [44] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [45] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [46] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [47] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [48] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [49] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [51] => Array
                    (
                        [0] => 170
                        [1] => 180
                        [2] => 180
                        [3] => 180
                        [4] => 180
                        [5] => 180
                        [6] => 180
                        [7] => 180
                        [8] => 180
                        [9] => 180
                        [10] => 180
                        [11] => 180
                        [12] => 180
                        [13] => 180
                        [14] => 180
                        [15] => 180
                    )
    
                [52] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [53] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [54] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [55] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [56] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [57] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
                [58] => Array
                    (
                        [0] => 170
                        [1] => 180
                    )
    
            )
    
    )

    Отсюда уже видно, что при работе с мультикатегориями мы получаем много дублей в тех категориях, которые являются основными, и что касается пункта 1: половина фильтров пропала (если сменить фильтр categories на parents, то появятся, но если и названия в фильтрах parents будут одинаковые, то и они пропадут).
    Дубли лечатся так: сюда нужно добавить условие:

    if (in_array($v, $catalog)) {
    	$filters[$k][$v][] = $row['id'];
    }

  3. Кэш.

    Кэш хранится по ids (а у нас мультикатегории :) ). Т. е., если в разных категориях лежат одинаковые товары (через мультикатегории), то выходит баг, если не обновлять кэш.
    Во всех категориях фильтрах лежат одни и те же товары



    По id видно, что эта категория вообще из другого каталога.
    Лечится так:
    &cacheTime=`-1`
Ну, а теперь, собственно, что нужно было мне сделать:

Фильтры должны выводиться именно только для текущей категории, а не для всех, в каких есть товар. Вот, что вышло: код

Здесь из изменений с родным фильтром, это:

  1. Добавлена выборка каталогов для текущей категории.
    код
  2. Добавлено условие, чтобы не было дублей товара
    код
  3. Для поля parent добавляется условие, чтобы из других категории не добавлялись категории в фильтрацию. Ну и, если поле не parent, то, вроде, все работает, как и раньше, я повторюсь, вроде! :)
    код
    код
Ну вроде все, может кому пригодится :) Если, есть косяки в коде, или вообще эта проблема решается по другому, буду рад услышать.

P.S. Написал в вопросы, т. к. сам новичок и возможно кому-нить, что-нить сломаю :)
Александр Комков
22 апреля 2015, 12:05
modx.pro
1 587
0

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

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