Фильтрация с учетом мультикатегорий
Всем привет!
Решил поделиться небольшим опытом и проблемами, которые у меня возникли при работе с mFilter2. Делаю фильтрацию товаров с учетом мультикатегорий. Вызов mFilter2 и структура каталога:
Проблемы, которые я обнаружил:
Фильтры должны выводиться именно только для текущей категории, а не для всех, в каких есть товар. Вот, что вышло: код
Здесь из изменений с родным фильтром, это:
P.S. Написал в вопросы, т. к. сам новичок и возможно кому-нить, что-нить сломаю :)
Решил поделиться небольшим опытом и проблемами, которые у меня возникли при работе с 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`
]]
Проблемы, которые я обнаружил:
- Фильтры с одинаковыми именами не отображаются. Т. е. добавил тестовый каталог «Кузов (181)» в каталог «Audi 80/90, (1986-1991)», добавил в него товар, теперь в фильтрах каталог «Кузов» с id 181 отображается, а с id 30 нет. Конечно, нет смысла в двух одинаковых каталогов, но это проблема будет ощутима, если делать фильтрацию с учетом мультикатегорий.
- Что уже касается конкретно мультикатегорий. Добавляем 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']; }
- Кэш.
Кэш хранится по ids (а у нас мультикатегории :) ). Т. е., если в разных категориях лежат одинаковые товары (через мультикатегории), то выходит баг, если не обновлять кэш.
Во всех категориях фильтрах лежат одни и те же товары
По id видно, что эта категория вообще из другого каталога.
Лечится так:
&cacheTime=`-1`
Фильтры должны выводиться именно только для текущей категории, а не для всех, в каких есть товар. Вот, что вышло: код
Здесь из изменений с родным фильтром, это:
- Добавлена выборка каталогов для текущей категории.
код
- Добавлено условие, чтобы не было дублей товара
код
- Для поля parent добавляется условие, чтобы из других категории не добавлялись категории в фильтрацию. Ну и, если поле не parent, то, вроде, все работает, как и раньше, я повторюсь, вроде! :)
код
код
P.S. Написал в вопросы, т. к. сам новичок и возможно кому-нить, что-нить сломаю :)