Magento: как написать собственную функцию рендеринга навигации по каталогу?

По умолчанию функция Mage_Catalog_Block_Navigation->renderCategoriesMenuHtml рендерит его. Теперь я хотел бы изменить способ отображения навигации по каталогу.

Что мне тогда делать?

1) написать свой модуль? - тогда я должен скопировать те же файлы из модуля категорий.

2) создать собственную логику в шаблоне? - это не правильно. Шаблон не имеет внутри себя логики.

3) Какие тогда?


person Anthony    schedule 08.12.2011    source источник


Ответы (2)


Вы можете создать собственный модуль и переписать класс Block, как описано здесь: http://www.exploremagento.com/magento/override-a-magento-core-block-class.php

etc/config.xml вашего модуля будет содержать что-то вроде этого:

<?xml version="1.0"?>
    <config>
        <global>
            <blocks>
                <catalog>
                    <rewrite>
                        <navigation>YourModule_Block_Catalog_Navigation</navigation>
                    </rewrite>
                </catalog>
           </blocks>
        </global>
    </config>

В вашем YourModule/Block/Catalog/Navigation.php:

class YourModule_Block_Catalog_Navigation extends Mage_Catalog_Block_Navigation
{

    public function renderCategoriesMenuHtml() {
    // your logic
    // you might call
         $parentResult = parent::renderCategoriesMenuHtml();
    }
}
person Alex    schedule 08.12.2011
comment
Большое спасибо! Это именно то, что мне нужно!! - person Anthony; 08.12.2011
comment
Исходная ссылка в этом ответе была мертва, когда я проверял, но эта статья помогла мне: prattski.com/2010/06/24/ - person brandonjp; 20.08.2012

Есть более простой способ сделать это, без перезаписи какого-либо специального модуля и класса Block.

В local.xml в макете вашего шаблона добавьте следующее:

<reference name="catalog.topnav">
   <block type="page/html_topmenu_renderer" 
          name="catalog.topnav.renderer" 
          template="page/html/topmenu/renderer.phtml"/>
</reference>

Затем создайте файл renderer.phtml в указанном месте, содержащий следующее:

<?php

$html = '';

$children = $menuTree->getChildren();
$parentLevel = $menuTree->getLevel();
$childLevel = is_null($parentLevel) ? 0 : $parentLevel + 1;

$counter = 1;
$childrenCount = $children->count();

$parentPositionClass = $menuTree->getPositionClass();
$itemPositionClassPrefix = $parentPositionClass ? $parentPositionClass . '-' : 'nav-';

foreach ($children as $child) {
    $child->setLevel($childLevel);
    $child->setIsFirst($counter == 1);
    $child->setIsLast($counter == $childrenCount);
    $child->setPositionClass($itemPositionClassPrefix . $counter);

    $outermostClassCode = 'level'. $childLevel . ' ' . $child->getId();
    $_hasChildren = ($child->hasChildren()) ? 'has-children' : '';

    $html .= '<li '. $this->_getRenderedMenuItemAttributes($child) .'>';

    $html .= '<a href="'. $child->getUrl() .'" class="'. $outermostClassCode .' '. $_hasChildren .'">'. $this->escapeHtml($this->__($child->getName())) .'</a>';

    if (!empty($childrenWrapClass)) {
        $html .= '<div class="'. $childrenWrapClass .'">';
    }

    $nextChildLevel = $childLevel + 1;

    if (!empty($_hasChildren)) {
        $html .= '<ul class="level'. $childLevel .'">';
        $html .=     '<li class="level'. $nextChildLevel .'">';
        $html .=         '<a class="level'. $nextChildLevel .'" href="'. $child->getUrl() .'">';
        $html .=             $this->__('View All ') . $this->escapeHtml($this->__($child->getName()));
        $html .=         '</a>';
        $html .=     '</li>';
        $html .=     $this->render($child, $childrenWrapClass);
        $html .= '</ul>';
    }

    if (!empty($childrenWrapClass)) {
        $html .= '</div>';
    }

    $html .= '</li>';

    $counter++;
}

return $html;

Затем настройте файл под свои нужды.

person Razvan    schedule 13.02.2015
comment
Большое спасибо! Более простой способ - person Anh Nguyen; 10.11.2016
comment
Возможно, вам даже не потребуется ничего добавлять в файл local.xml, поскольку я смог реализовать собственный шаблон, просто поместив его в папку шаблонов моей пользовательской темы по адресу: template/page/html/topmenu/renderer. пхтмл - person Louis B.; 14.05.2019