Как разместить список продуктов в меню Magento

Как и этот вопрос: Magento: КАК добавить активные продукты в раскрывающийся список в главном меню навигации

...Я хочу перечислить продукты из категории в главном меню. Я попытался использовать предоставленный код, но он все еще не работает. Я использую Magento вер. 1.7.0.2, поэтому я думаю, что это может быть проблемой.

Любая помощь будет оценена по достоинству.


person GarethWyn    schedule 12.07.2013    source источник
comment
Пожалуйста, определите не работает более точно. Вы получаете ошибки? Если да, напишите сообщения об ошибках   -  person Jürgen Thelen    schedule 12.07.2013
comment
ОК. Теперь я понял, что это не работает, потому что мне нужно редактировать файл Mage_Page_Block_Html_Topmenu, но я не могу применить код из исходного вопроса (ссылка выше ), потому что он не содержит правильный класс. Любые идеи?   -  person GarethWyn    schedule 15.07.2013


Ответы (1)


У меня была такая же проблема, и через несколько часов у меня есть решение. Я использую Magento 1.9.1, и мне также нужно было отредактировать файл Topmenu.php. Вероятно, это не лучший способ сделать это, но он работает. Я постарался все прокомментировать, так может быть проще понять.

Я изменил функцию «_getHtml», чтобы включить продукты и изменить классы «li»-тегов, если это необходимо:

protected function _getHtml(Varien_Data_Tree_Node $menuTree, $childrenWrapClass, $correctClasses = 0)
{
    $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 = '';
        $outermostClass = $menuTree->getOutermostClass();

        if ($childLevel == 0 && $outermostClass) {
            $outermostClassCode = ' class="' . $outermostClass . '" ';
            $child->setClass($outermostClass);
        }

        // avoid 'last'-class if there are products after categories
        $renderedAttributes = $this->_getRenderedMenuItemAttributes($child);
        if($correctClasses = 1) {
            $renderedAttributes = str_replace(' last', '', $renderedAttributes);
        }

        // add 'category' class to category elements
        $renderedAttributes = str_replace('class="', 'class="type-category ', $renderedAttributes);

        $html .= '<li ' . $renderedAttributes . '>';
        $html .= '<a href="' . $child->getUrl() . '" ' . $outermostClassCode . '><span>' . $this->escapeHtml($child->getName()) . '</span></a>';

        // check if there are more categories or products inside
        $hasProducts = $this->hasProducts($child);
        if ($child->hasChildren() || $hasProducts) {

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

            // build ul-wrapper
            $html .= '<ul class="level' . $childLevel . '">';

            // if categories and products are in this category
            if($child->hasChildren() && $hasProducts) {
                $correctClasses = 1;
                $html .= $this->_getHtml($child, $childrenWrapClass, $correctClasses);
                $html .= $this->getProducts($child, $childLevel, $correctClasses);
            // if only categories are in this category
            } elseif($child->hasChildren()) {
                $html .= $this->_getHtml($child, $childrenWrapClass);
            // if only products are in this category
            } elseif($hasProducts) {
                $html .= $this->getProducts($child, $childLevel);
            }
            $html .= '</ul>';

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

        $counter++;
    }

    return $html;
}

Дополнительно я написал 3 новые функции для обработки всего.

Одна новая небольшая функция для получения коллекции товаров из текущей категории:

// get product collection    
protected function getProductCollection($child) {
    // get current category
    $catId = str_replace('category-node-', '', $child->getId());
    $curCategory = Mage::getModel('catalog/category')->load($catId);

    // get prouct collection from current category
    return Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($curCategory)->setOrder('position','ASC');
}

Функция проверки наличия товаров в текущей категории:

// check if there are products in this category
protected function hasProducts($child) {
    // get number of products in current (sub-)category
    $productCount = $this->getProductCollection($child)->count();

    if($productCount > 0) {
        return 1;
    } else {
        return 0;
    }
}

И одна функция для создания html для элементов списка продуктов:

// get product html
protected function getProducts($child, $level, $correctClasses = 0) {
    $productCollection = $this->getProductCollection($child);

    // set product counter
    $p = 1;

    // get number of products in current (sub-)category
    $productCount = $productCollection->count();

    $pChild = '';
    if ($productCount > 0) {
        $level++;
        foreach ($productCollection as $product) {

            // get current product in loop
            $curProduct = Mage::getModel('catalog/product')->load($product->getId());

            // check if current product in loop is activated
            if ($curProduct->getStatus()) {

                // build list-item with classes
                $pChild .= '<li';
                $pChild .= ' class="type-product level'.$level;
                if ($p == 1 && $correctClasses == 0) {
                    $pChild .= ' first';
                }
                if ($p == $productCount) {
                    $pChild .= ' last';
                }
                $pChild .= '">'."\n";
                $pChild .= ' <a href="'.$curProduct->getProductUrl().'">'.$this->htmlEscape($curProduct->getName()).'</a>'."\n";
                $pChild .= '</li>';

                // increment product counter
                $p++;
            }
        }
    }

    return $pChild;
}

Надеюсь, это поможет кому-то! Если у кого-то есть предложения, чтобы написать его более чистым или добавить некоторые функции, опубликуйте что-нибудь или прокомментируйте! :)

person sagacity    schedule 17.04.2015