Opencart 1.5.x (catalog): как вывести третий уровень категорий в главном меню
Если используется тема, отличная от default, изменения надо производить в её файлах, разумеется (css, tpl). И только в случае отсутствия их в используемой теме их следует искать в default. И в этом случае может понадобиться индивидуальный подход, поскольку CSS может значительно отличаться. Так что будьте особенно аккуратны, делайте резервные копии изменяемых файлов.
Имейте в виду, что оригинальное решение, принятое в Опенкарт, очень неоптимальное по производительности и при большом количестве категорий и товаров этот блок надо переделать и сделать совершенно по-другому. Здесь показан способ, использующий стандартный механизм Опенкарт.
diff --git a/public_html/catalog/controller/common/header.php b/public_html/catalog/controller/common/header.php
index 21bfe6f..a603a5f 100644
--- a/public_html/catalog/controller/common/header.php
+++ b/public_html/catalog/controller/common/header.php
@@ -200,10 +200,11 @@ class ControllerCommonHeader extends Controller {
$children_data[] = array(
'name' => $child['name'] . ' (' . $product_total . ')',
- 'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
- );
+ 'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']),
+ 'children' => $this->getChildrenData($child['category_id'], $category['category_id']) // rb, 2011-09-03: menu 3rd level
+ );
}
-
+
// Level 1
$this->data['categories'][] = array(
'name' => $category['name'],
@@ -237,6 +238,28 @@ class ControllerCommonHeader extends Controller {
}
$this->render();
- }
+ }
+
+ // http://rb.labtodo.com/, 2011-09-03: menu 3rd level
+ private function getChildrenData( $ctg_id, $path_prefix )
+ {
+ $children_data = array();
+ $children = $this->model_catalog_category->getCategories($ctg_id);
+
+ foreach ($children as $child) {
+ $data = array(
+ 'filter_category_id' => $child['category_id'],
+ 'filter_sub_category' => true
+ );
+
+ $product_total = $this->model_catalog_product->getTotalProducts($data);
+
+ $children_data[] = array(
+ 'name' => $child['name'] . ' (' . $product_total . ')',
+ 'href' => $this->url->link('product/category', 'path=' . $path_prefix . '_' . $child['category_id'])
+ );
+ }
+ return $children_data;
+ }
}
?>
\ No newline at end of file
diff --git a/public_html/catalog/view/theme/default/stylesheet/stylesheet.css b/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
index ecee15b..3f89efa 100644
--- a/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
+++ b/public_html/catalog/view/theme/default/stylesheet/stylesheet.css
@@ -343,7 +343,9 @@ label {
#menu > ul > li > a.active {
background: #000;
}
-#menu > ul > li > a {
+#menu > ul > li > a
+/*#menu > ul > li > div > ul > li > a*/
+{
font-size: 13px;
color: #FFF;
line-height: 14px;
@@ -353,7 +355,8 @@ label {
z-index: 6;
position: relative;
}
-#menu > ul > li > div {
+#menu > ul > li > div
+{
display: none;
background: #FFFFFF;
position: absolute;
@@ -366,16 +369,39 @@ label {
border-radius: 0px 0px 5px 5px;
background: url('../image/menu.png');
}
-#menu > ul > li:hover > div {
+#menu > ul > li > div > ul > li > div
+{
+ display: none;
+ background: #FFFFFF;
+ position: absolute;
+ z-index: 5;
+ padding: 5px;
+ margin-left: 50px;
+ border: 1px solid #000000;
+ -webkit-border-radius: 0px 0px 5px 5px;
+ -moz-border-radius: 0px 0px 5px 5px;
+ -khtml-border-radius: 0px 0px 5px 5px;
+ border-radius: 0px 0px 5px 5px;
+ background: url('../image/menu.png');
+}
+#menu > ul > li:hover > div,
+#menu > ul > li:hover > div > ul > li:hover > div
+{
display: table;
}
-#menu > ul > li > div > ul {
+#menu > ul > li > div > ul,
+#menu > ul > li > div > ul > li > div > ul
+{
display: table-cell;
}
-#menu > ul > li ul + ul {
+#menu > ul > li ul + ul,
+#menu > ul > li ul > li ul + ul
+{
padding-left: 20px;
}
-#menu > ul > li ul > li > a {
+#menu > ul > li ul > li > a,
+#menu > ul > li ul > li ul > li > a
+{
text-decoration: none;
padding: 4px;
color: #FFFFFF;
@@ -386,9 +412,12 @@ label {
#menu > ul > li ul > li > a:hover {
background: #000000;
}
-#menu > ul > li > div > ul > li > a {
+#menu > ul > li > div > ul > li > a,
+#menu > ul > li > div > ul > li > div > ul > li > a
+{
color: #FFFFFF;
}
+
.breadcrumb {
color: #CCCCCC;
margin-bottom: 10px;
diff --git a/public_html/catalog/view/theme/default/template/common/header.tpl b/public_html/catalog/view/theme/default/template/common/header.tpl
index eef4ae7..d93120a 100644
--- a/public_html/catalog/view/theme/default/template/common/header.tpl
+++ b/public_html/catalog/view/theme/default/template/common/header.tpl
@@ -123,7 +123,17 @@ DD_belatedPNG.fix('#logo img');
<?php $j = $i + ceil(count($category['children']) / $category['column']); ?>
<?php for (; $i < $j; $i++) { ?>
<?php if (isset($category['children'][$i])) { ?>
- <li><a href="<?php echo $category['children'][$i]['href']; ?>"><?php echo $category['children'][$i]['name']; ?></a></li>
+ <li><a href="<?php echo $category['children'][$i]['href']; ?>"><?php echo $category['children'][$i]['name']; ?></a>
+ <?php if( $category['children'][$i]['children'] ) { ?>
+ <div>
+ <ul>
+ <?php foreach( $category['children'][$i]['children'] as $menu3item ) { ?>
+ <li><a href="<?php echo $menu3item['href']; ?>"><?php echo $menu3item['name']; ?></a></li>
+ <?php } ?>
+ </ul>
+ </div>
+ <?php } ?>
+ </li>
<?php } ?>
<?php } ?>
</ul>
- Opencart 1.5.x (catalog): как вывести третий уровень категорий в главном меню
Еще записи по теме
- Вывод Git branch в подсказку командной строки
- Opencart 1.5.1.3 (admin): пара мелких улучшений Admin Dashboard
- Как облегчить процесс публикации изменений на сервер
- Opera: добавляем "автоскролл" и быстрое скрытие/показ адресной строки
- Opencart 1.5.x (admin): улучшения при вводе атрибутов товаров
- Opencart 1.5.1.x: Упрощённое оформление заказа на одной странице (Quick one-page simple checkout)
- Извините за задержку




Комментариев: 15
Здравствуйте, Руслан!
Если все это проделать, то третий уровень категорий будет отражаться только в главном меню или в боковом левом тоже.
Спасибо большое за Ваш труд!!!
Не помню... Проверил - нет, только для главного меню сделано. Сбоку модуль категорий выводит только 1-й и 2-й уровни.
UPD. См. http://rb.labtodo.com/page/opencart-1512-modul-kategorij-tretij-uroven-bez-optimizacii-zaprosov
а можно ли вообще вывод третьей категории в боковом меню? Стоит ли заморачиваться поиском решения?
Можно вообще всё :) Было бы желание и время.
UPD. См. http://rb.labtodo.com/page/opencart-1512-modul-kategorij-tretij-uroven-bez-optimizacii-zaprosov
не совсем понятно, а что в этой записи измененно?
-#menu > ul > li > div {
+#menu > ul > li > div
+{
display: none;
background: #FFFFFF;
position: absolute;
@@ -366,16 +369,39 @@ label {
border-radius: 0px 0px 5px 5px;
background: url('../image/menu.png');
}
И что это ? @@ -386,9 +412,12 @@ label {
Скобка перенесена. Видимо, экспериментировал, а потом убрал лишнюю строку, а скобка перенесённой осталась.
@@ -386,9 +412,12
это примерные номера строк с изменениями и ещё какая-то доп. информация для diffutils. Примерные - потому что нумерация у меня и у других может быть разной из-за разных модификаций.
@@ label {
это функция, в которой это изменение встретилось. Для PHP - обычно имя функции или класса, в HTML/CSS/TPL сюда попадает что-то на них похожее. Можно использовать для ориентира и доп. контроля.
Скажите пожалуйста, как сделать что бы если в меню 2 строчки категорий, нижняя строчка категорий не мешала выпадающему меню верхних категорий, вот у меня на сайте такая проблема Сайт http://tuningdom.ru, Помогите.
В вёрстке я не силён, моих познаний для этого случая наверное не хватит. Возможно, поможет изменение поведения меню - чтобы выпадало только после клика, а не по движению мыши над ним.
Уважаемый Руслан!
Спасибо за интересное решение. Помогите, пожалуйста.
Можно ли в модуле категорий указать, из какой категории нужно отображать категории. То есть, у меня трехуровневый каталог: категория -> подкатегория -> товар
В модуле нужно вывести раскрытую категорию, в которой бы отображались ссылки на подкатегории.
То есть категорий получается две? Категория и подкатегория. Товары - в списке выводятся на странице. Или как-то не так?
То ли я не понял задачу, то ли это и так делается без переделок: одна категория верхнего уровня и все подкатегории в ней. Они и будут всегда раскрыты и показаны.
Вот здесь ошибка
> 'children' => $this->getChildrenData($child['category_id'], $category['category_id'])
Так на opencart 1.5.1.3 не заходит в категории 3 уровня.
Должно быть:
'children' => $this->getChildrenData($child['category_id'], $category['category_id']. '_' . $child['category_id'])
Ок, спасибо. На 1512 работает, на 1513 руки не доходили поставить, как раз скоро понадобится, проверю.
Только вот глядя на ошибку, думаю, причина не в версии. У вас скорей всего osCtore и SeoPro? Я не пользуюсь, поэтому скорей всего у меня другие результаты будут.
да ocStore, seo обычный. Сам подумал, что ошибка возможно не в этом. Сейчас модуль seo разбираю.
У меня почему-то после каждой категории выводится производители :(
Есть скрин, но сюда его не встаить
Как излечить? Версия 1.5.2