Как отобразить две корневые категории в навигации?


У меня есть две корневые категории в левой навигации. И это должно быть так:

default: (root1 - doesn't appear on the view itself)
  - sub1
  - sub2
  - sub3

default1: (root2 - doesn't appear on the view itself)
  - ssub1
  - ssub2
  - ssub3

Чтобы отобразить первую корневую категорию, запустите этот код:

<?php $_menu = $this->renderCategoriesMenuHtml(0, 'level-top') ?>

Как насчет второй корневой категории? Как сделать так, чтобы он появился в интерфейсе?

ОБНОВЛЕНИЕ 1:

Я пробовал это:

  1. Переписать класс на Mage_Catalog_Block_Navigation

    class Company_Catalog_Block_Navigation extends Mage_Catalog_Block_Navigation
    {
        //...
    }
    
  2. Добавить функцию renderOtherCategoriesMenuHtml в Company_Catalog_Block_Navigation

    public function renderOtherCategoriesMenuHtml($otherRootID, $level = 0, $outermostItemClass = '', $childrenWrapClass = '')
    {
        $activeCategories = array();
    
        $categories = Mage::helper('catalog/category')->getOtherStoreCategories(otherRootID);
    
        foreach ($categories as $child) {
            if ($child->getIsActive()) {
                $activeCategories[] = $child;
            }
        }
    
        $activeCategoriesCount = count($activeCategories);
        $hasActiveCategoriesCount = ($activeCategoriesCount > 0);
    
        if (!$hasActiveCategoriesCount) {
            return '';
        }
    
        $html = '';
        $j = 0;
        foreach ($activeCategories as $category) {
            $html .= $this->_renderCategoryMenuItemHtml(
                $category,
                $level,
                ($j == $activeCategoriesCount - 1),
                ($j == 0),
                true,
                $outermostItemClass,
                $childrenWrapClass,
                true
            );
            $j++;
        }
    
        return $html;
    }
    
  3. Класс перезаписи mage_catalog_helper_category и добавьте пользовательскую функцию:

    class Company_Catalog_Helper_Category extends Mage_Catalog_Helper_Category{
    
    public function getOtherStoreCategories($idParent, $sorted=false, $asCollection=false, $toLoad=true)
    {
    
        $cacheKey   = sprintf('%d-%d-%d-%d', $idParent, $sorted, $asCollection, $toLoad);
    
        if (isset($this->_storeCategories[$cacheKey])) {
            return $this->_storeCategories[$cacheKey];
        }
    
        /**
         * Check if parent node of the store still exists
         */
        $category = Mage::getModel('catalog/category');
        /* @var $category Mage_Catalog_Model_Category */
        if (!$category->checkId($idParent)) {
            if ($asCollection) {
                return new Varien_Data_Collection();
            }
            return array();
        }
    
        $recursionLevel  = max(0, (int) Mage::app()->getStore()->getConfig('catalog/navigation/max_depth'));
        $storeCategories = $category->getCategories($idParent, $recursionLevel, $sorted, $asCollection, $toLoad);
    
        $this->_storeCategories[$cacheKey] = $storeCategories;
        return $storeCategories;
    }
    }
    

4. Вызовите renderOtherCategoriesMenuHtml в представлении с навигацией.

5. Неверно переписанные URL-адреса:

После этого вы получите меню навигации, но в нем неверные правила перезаписи. Я отладил его. Если мы посмотрим на функцию getCategories в Mage_Catalog_Model_Resource_Category, вы увидите следующее:

$tree->addCollectionData(null, $sorted, $parent, $toLoad, true);

Этот метод имеет некоторую функциональность, которая устанавливается правилами перезаписи:

class Mage_Catalog_Model_Resource_Category_Tree extends Varien_Data_Tree_Dbp
{
      public function addCollectionData($collection = null, $sorted = false, $exclude = array(), $toLoad = true, $onlyActive = false)
      {
            //...
            if ($this->_joinUrlRewriteIntoCollection) {
                $collection->joinUrlRewrite();
                $this->_joinUrlRewriteIntoCollection = false;
            }
            //...
      }

Эта функция получает правила из core_url_rewrite, где каждый путь запроса относится к определенному интернет-магазину. Это означает, что мы должны создать веб-магазин и новое представление магазина, чтобы получить его дочерние корневые категории с правильным URL-адресом.

Резюме: @Rickkuipers отчасти прав, но мы не должны менять веб-магазин во время создания представления.

Author: Himanshu Jansari, 2013-01-23

2 answers

Мой вопрос заключается в том, почему вы пытаетесь использовать две корневые категории в одном магазине? Корневая категория предназначена для того, чтобы быть именно такой, родительской для всех категорий, доступных для использования в данном магазине. Это средство контроля доступа, построения URL-адресов, и список можно продолжать. Существует огромное количество мест, где вам нужно (буквально) взломать ядро, чтобы все это работало. Следуя этим маршрутом, вы столкнетесь с нюансами, которые, скорее всего, вернутся, чтобы укусить ты.

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

Иногда лучший способ решить подобные проблемы - не лезть в код и не менять набирайтесь сил, но лучше посмотрите на применяемый подход и найдите другой способ достижения своих целей без необходимости вносить такие неудобные изменения в суть. Вы получите выгоду сейчас и в долгосрочной перспективе, используя эту методологию. В краткосрочной перспективе вы выиграете от меньшего количества модификаций и быстрее начнете работать, а в долгосрочной перспективе вы также выиграете от меньшего количества модификаций, потому что, когда придет время обновления, вам не придется вносить навязчивые изменения в то, как ядро функции для более новых версий Magento.

 3
Author: davidalger, 2013-01-24 14:40:02

Вы можете временно изменить текущее хранилище на другое хранилище и выполнить ту же функцию:

$oldStore = Mage::app()->getStore();
$_menu1 = $this->renderCategoriesMenuHtml(0, 'level-top');
Mage::app()->setCurrentStore('store2');
$_menu2 = $this->renderCategoriesMenuHtml(0, 'level-top');
Mage::app()->setCurrentStore($oldStore);

setCurrentStore() принимает код магазина. Я не проверял это, но я думаю, что это будет работать просто отлично, возможно, с небольшой настройкой.

РЕДАКТИРОВАТЬ

Просто проверьте это, и все работает отлично.

 1
Author: Rick Kuipers, 2013-01-23 19:32:36