Как отобразить две корневые категории в навигации?
У меня есть две корневые категории в левой навигации. И это должно быть так:
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:
Я пробовал это:
-
Переписать класс на
Mage_Catalog_Block_Navigation
class Company_Catalog_Block_Navigation extends Mage_Catalog_Block_Navigation { //... }
-
Добавить функцию
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; }
-
Класс перезаписи 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 отчасти прав, но мы не должны менять веб-магазин во время создания представления.
2 answers
Мой вопрос заключается в том, почему вы пытаетесь использовать две корневые категории в одном магазине? Корневая категория предназначена для того, чтобы быть именно такой, родительской для всех категорий, доступных для использования в данном магазине. Это средство контроля доступа, построения URL-адресов, и список можно продолжать. Существует огромное количество мест, где вам нужно (буквально) взломать ядро, чтобы все это работало. Следуя этим маршрутом, вы столкнетесь с нюансами, которые, скорее всего, вернутся, чтобы укусить ты.
Я бы предложил просто использовать одну корневую категорию, как это предусмотрено Magento, и переместить все подкатегории, которые вы хотите отобразить, чтобы они были ее дочерними. Разрушьте иерархию под корнем. Если вам нужно использовать одну и ту же структуру для нескольких магазинов с одинаковым набором продуктов, вы можете установить тот же корень, что и корень нескольких магазинов, при их создании в администраторе.
Иногда лучший способ решить подобные проблемы - не лезть в код и не менять набирайтесь сил, но лучше посмотрите на применяемый подход и найдите другой способ достижения своих целей без необходимости вносить такие неудобные изменения в суть. Вы получите выгоду сейчас и в долгосрочной перспективе, используя эту методологию. В краткосрочной перспективе вы выиграете от меньшего количества модификаций и быстрее начнете работать, а в долгосрочной перспективе вы также выиграете от меньшего количества модификаций, потому что, когда придет время обновления, вам не придется вносить навязчивые изменения в то, как ядро функции для более новых версий Magento.
Вы можете временно изменить текущее хранилище на другое хранилище и выполнить ту же функцию:
$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()
принимает код магазина.
Я не проверял это, но я думаю, что это будет работать просто отлично, возможно, с небольшой настройкой.
РЕДАКТИРОВАТЬ
Просто проверьте это, и все работает отлично.