6

Magento: Боковое меню с категориями и фильтром

Posted февраля 16, 2010 in Magento and tagged , , by SpiRi7

В стандартном шаблоне 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. В данную очередь этот пост ориентирован для меня, т.к. регулярно приходиться искать подобную реализацию в интернете.

Похожие посты:

6 Responses so far.

  1. Дмитрий пишет:

    Хм… Не работает твой метод. Почему то выводится только фильтр, нет, даже два фильтра :) А вот список категорий увы нет :’(

  2. SpiRi7 пишет:

    Попробуйте переименовать название блоков catalog.leftnav и catalog.leftnav.layer. Включить отображение отладочной информации (пути шаблонов). Обновить кеш.
    Если не помогло поэтапно смотреть какой из циклов не отрабатывает.

  3. Дмитрий пишет:

    Спасибо, на самом деле пост помог понять кое-какие вещи, и породить еще больше вопросов, и это по идее нормально.
    И так дело, в том что способ вызова обоих блоков из 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 категории перед построением дерева и установил его текущим после. Все ок. Внимание вопрос, почему ваш код работает ведь теоретически (а у меня и практически) он должен работать не корректно :) .
    Теперь хочу вернутся к ошибке с повторным определением какого то параметра, вы бы не могли подсказать с чем связано. Так как вызов в шаблоне помог решить проблему на уровне топовой категории (не дефолтной), а вот с под категориями остается такая же беда.

  4. SpiRi7 пишет:

    Могла быть такая ситуация, что я не до конца скопировал код.

    >Решил это дело просто. Запомнил 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

    $layer->setCurrentCategory($_current_category); ?>
    < ?php endif; ?>

    < ?php endforeach; ?>

  5. Дмитрий пишет:

    Все понятно разобрался, не усмотрел в самом начале
    $_current_category=$this->getCurrentCategory(); + его установку.
    А что насчет ошибок при переходе по фильтру manufacturer (производитель), есть совет? Я конечно понимаю что не в тему, но все же.
    И еще по теме фильтров, есть ли возможность вывести их на главную, для всех категорий?

  6. SpiRi7 пишет:

    А что насчет ошибок при переходе по фильтру manufacturer (производитель), есть совет? Я конечно понимаю что не в тему, но все же.

    Вам надо смотреть в другом файле. Если не ошибаюсь /catalog/layer/filter.phtml. За счет чего выдается ошибка сложно сказать. На всякий случай проверьте кеш и индексы.

    С выводом на главную придется повозиться. Т.к. это все таки фильтр, он будет сортировать имеющиеся результаты выборки. Посмотрите в готовых расширениях для magento. Я вроде встречал что то похожее.

Leave a Reply