В стандартном шаблоне Magento левый блок меню представляет собой список подкатегорий для текущей выбранной категории товаров магазина. Такой подход является оправданным для магазинов с большим количеством товаров. Нет необходимости дублировать полный список категорий в левом блоке, поскольку главное меню уже отображает его. В этой статье я хочу рассмотреть ситуацию когда верхнее меню заменяется на статическое, а в левой части находится список всех категорий и список фильтров.
Первым шагом нам необходимо произвести изменение в layout – xml файлов конфигурации какие блоки необходимо отображать.
design/frontend/default/default/layout/catalog.xml
Находим блок
<block type="catalog/navigation" name="catalog.leftnav" after="currency" template="catalog/navigation/left.phtml"/> <block type="catalog/layer_view" name="catalog.leftnav.layer" after="catalog.leftnav" template="catalog/layer/view.phtml"/>
Производим проверку остальных блоков и удаляем их них упоминания catalog/navigation и catalog/layer_view
Следующим этапом производим модификацию левого блока меню — отображающего список категорий и подкатегорий
Файл design/frontend/default/default/template/catalog/navigation/left.phtml
<?php /* Get the categories that are active for the store */ $_main_categories=$this->getStoreCategories(); /* Get the current category the user is in */ $_current_category=$this->getCurrentCategory(); /* Get the current category path */ $_categorypath = $this->getCurrentCategoryPath(); ?> <?php if ($_main_categories): ?> <div class="box normal-nav"> <div class="box-top"> </div> <div class="box-content"> <ul> <?php /* This bit cycles through the categories - setting the next one to current */ foreach ($_main_categories as $_main_category): if($_main_category->getIsActive()): $cur_category=Mage::getModel('catalog/category')->load($_main_category->getId()); $layer = Mage::getSingleton('catalog/layer'); $layer->setCurrentCategory($cur_category); ?> <li><a href="<?php echo $this->getCurrentCategory()->getUrl()?>"><?php echo $this->getCurrentCategory()->getName();?></a> <?php $_maincategorylisting=$this->getCurrentCategory()?> <?php $_categories=$this->getCurrentChildCategories()?> <?php if($_categories->count()): ?> <ul class="subcategory"> <? foreach ($_categories as $_category):?> <? if($_category->getIsActive()): $cur_subcategory=Mage::getModel('catalog/category')->load($_category->getId()); $layer = Mage::getSingleton('catalog/layer'); $layer->setCurrentCategory($cur_subcategory); ?> <li><a href="<?php echo $this->getCategoryUrl($_category)?>"> <?php echo $_category->getName()?></a></li> <? endif;?> <?endforeach?> </ul> <?php $layer->setCurrentCategory($_current_category); ?> <? endif; ?> </li> <?php endif; ?> <?php endforeach; ?> </ul> </div> <div class="box-bottom"> </div> </div> <?php endif; ?>
Производим редактирование шаблона фильтров для соответствии нашем требованиям. Файл: app/design/frontend/default/default/template/catalog/layer/view.phtml
В результате получаем:


P.S. В данную очередь этот пост ориентирован для меня, т.к. регулярно приходиться искать подобную реализацию в интернете.

Хм… Не работает твой метод. Почему то выводится только фильтр, нет, даже два фильтра
А вот список категорий увы нет :’(
Попробуйте переименовать название блоков catalog.leftnav и catalog.leftnav.layer. Включить отображение отладочной информации (пути шаблонов). Обновить кеш.
Если не помогло поэтапно смотреть какой из циклов не отрабатывает.
Спасибо, на самом деле пост помог понять кое-какие вещи, и породить еще больше вопросов, и это по идее нормально.
.
И так дело, в том что способ вызова обоих блоков из layout не совсем подошел так как фильтр по производителю (был добавлен такой атрибут) выдавал ошибку (You cannot define a correlation name ‘manufacturer_idx’ more than once, кстати тоже до конца не понял что это такое, пока не решено), посоветовали вызвать блок непосредственно в шаблоне. Помогло.
Скажу сразу что написанное снизу актуально и для вызова через xml если указать к примеру атрибут порядка вывода befor/after. То есть для такого варианта как показано у вас — вызов фильтра после построения дерева категорий.
Столкнулся с такой проблемой, что текущий фильтр зависел от построения дерева категорий, и при вызове вывода блока фильтров после построения дерева, выводил фильтры для последнего установленной категории.
В вашем коде такие строки, они то и переопределяют категорию:
$cur_subcategory=Mage::getModel(‘catalog/category’)->load($_category->getId());
$layer = Mage::getSingleton(‘catalog/layer’);
$layer->setCurrentCategory($cur_subcategory);
Решил это дело просто. Запомнил ID категории перед построением дерева и установил его текущим после. Все ок. Внимание вопрос, почему ваш код работает ведь теоретически (а у меня и практически) он должен работать не корректно
Теперь хочу вернутся к ошибке с повторным определением какого то параметра, вы бы не могли подсказать с чем связано. Так как вызов в шаблоне помог решить проблему на уровне топовой категории (не дефолтной), а вот с под категориями остается такая же беда.
Могла быть такая ситуация, что я не до конца скопировал код.
>Решил это дело просто. Запомнил ID категории перед построением дерева и
>установил его текущим после.
В самом начала непосредственно получаем текущую категорию, что бы не сбивать выбранные.
/* Get the current category the user is in */
$_current_category=$this->getCurrentCategory();
Кусок кода возвращающий выбранную категорию находится в блоке foreach + if.
$layer->setCurrentCategory($_current_category);
Скажите, у вас выполнение заходит в if:
< ?php if($_categories->count()): ?>
И попробуйте кусок кода переместить чуть ниже.
< ?php $layer->setCurrentCategory($_current_category); ?>
< ? endif; ?>
< ?php endif; ?>
< ?php endforeach; ?>
перемещаем в:
< ?php
endif; ?>
$layer->setCurrentCategory($_current_category); ?>
< ?php endif; ?>
< ?php endforeach; ?>
Все понятно разобрался, не усмотрел в самом начале
$_current_category=$this->getCurrentCategory(); + его установку.
А что насчет ошибок при переходе по фильтру manufacturer (производитель), есть совет? Я конечно понимаю что не в тему, но все же.
И еще по теме фильтров, есть ли возможность вывести их на главную, для всех категорий?
Вам надо смотреть в другом файле. Если не ошибаюсь /catalog/layer/filter.phtml. За счет чего выдается ошибка сложно сказать. На всякий случай проверьте кеш и индексы.
С выводом на главную придется повозиться. Т.к. это все таки фильтр, он будет сортировать имеющиеся результаты выборки. Посмотрите в готовых расширениях для magento. Я вроде встречал что то похожее.