Решил внедрить в разрабатываемый интернет-магазин вот такую систему фильтров:
1. Администратор сайта создает группу фильтров, например, "Материал" и указывает, что её необходимо выводить на странице "Мягкая мебель".
2. Создает значения для фильтра и привязывает их к группе. Например, значения "Дерево", "Металл" и "Пластик" - привязывает к раннее созданной группе фильтров "Материал".
3. При создании или редактировании товара администратор теперь лишь устанавливает необходимые значения фильтров для данного товара. Например, данный создаваемый/редактируемый товар содержит следующие значения фильтров: "Дерево" (группа фильтров "Материал") и "Черный" (группа фильтров "Цвет").
Таким образом, рядовой пользователь, зайдя на страницу мягкой мебели в интернет-магазине увидит ровно те наборы фильтров, которые предпочел установить там администратор - все просто, логично и удобно.
Перед описанием самой проблемы я на всякий случай приведу необходимый описательный фрагмент структуры БД:
category - таблица категорий: |id|name|...
good - таблица товаров: |id|name|...
filter_group - таблица "группа фильтров": |id|name|...
filter_group_category - промежуточная таблица - |id|filter_group_id|category_id| - для связки таблиц category и filter_group отношением "многие-ко-многим" (т.е. определенная группа фильтров может выводиться в произвольном числе категорий)
filter_item - таблица "значение фильтра": |id|name|filter_group_id|, где filter_group_id - внешний ключ, ссылающийся на поле id в таблице filter_group
filter_item_good - промежуточная таблица - |id|filter_item_id|good_id| - для связки таблиц filter_item и good отношением "многие-ко-многим" (т.е. у определенного товара может быть сколь угодно значений фильтров)
А теперь сама суть проблемы: раньше каждый из фильтров выводился на странице категории в виде выпадающего списка (находясь при этом внутри <form></form>), и при изменении значения в нем форма автоматически сабмитилась GET-запросом, после чего товары сортировались согласно выбранным фильтрам, и при этом отличительная особенность "старого подхода" в том, что все эти фильтры были обособленны - у каждого из <select>'ов был свой name, согласно которому фильтры правильно и применялись, и по итогу URL был где-то таким:
mysite.ru/category/1?Good[color]=1&Good[country]=2 - думаю, тут суть ясна
А теперь логика совершенно другая - необходимо в цикле вывести на страницу набор групп фильтров (и связных с ними значений фильтров), которые непосредственно относятся к данной категории - с этим у меня проблем не возникло, а сложности возникли тогда, когда стал вопрос о необходимости правильной сортировки товаров, ведь URL теперь принял вот такой вид:
mysite.com/category/1?Good[filtersArray][]=1&Good[filtersArray][]=2
- таким он получился вот из-за этого:
Код: Выделить всё
<?php echo CHtml::activeDropDownList($goods, 'filtersArray[]', $filterGroup->getClientFilterItems()); ?>
mysite.com/category/1?Good[filtersArray][]=1, где 1 - filter_item_id - соотв. фильтру "черный" группы фильтров "Цвет"
но если позже я выберу буквально в том же выпадающем списке "фильтровать по цвету: белый", то теперь url станет вот таким:
mysite.com/category/1?Good[filtersArray][]=1&Good[filtersArray][]=2 - что вполне логично, увы, выбор "черного цвета" никуда не делся
а во-вторых (что, видимо, следует из "во-первых") - выбранное значение в выпадающем списке не сохраняется после сабмита формы
В общем, я очень надеюсь, что мою проблему вы поняли и сможете мне помочь дельным советом. Я извиняюсь за тему в "многобукоф", но это было необходимо для того, чтобы я однозначно и как можно проще и понятнее донес суть проблемы
Большое спасибо заранее!