Ruslan Brest, rb.labtodo.com

Разработка ПО, сайтов и веб-сервисов. CodeIgniter, PHP, MySQL, W3C CSS/XHTML, MaxSite CMS, OpenCart, PrestaShop

Opencart 1.5.x (catalog): как вывести третий уровень категорий в главном меню

Опубликовано: 12 сентября 2011.
Автор: Ruslan Brest.

Рубрика: Howto | OpenCart.

Просмотров: 2120.
Подписаться на комментарии по RSS.

Если используется тема, отличная от 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>
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru digg.com friendfeed.com liveinternet.ru livejournal.ru yandex.ru del.icio.us

Комментариев: 15

  1. Юлия
    26.09.2011 в 12:51:57 | #1

    Здравствуйте, Руслан!

    Если все это проделать, то третий уровень категорий будет отражаться только в главном меню или в боковом левом тоже.

    Спасибо большое за Ваш труд!!!

  2. Ruslan Brest
    26.09.2011 в 13:15:57 | #2

    Не помню... Проверил - нет, только для главного меню сделано. Сбоку модуль категорий выводит только 1-й и 2-й уровни.

    UPD. См. http://rb.labtodo.com/page/opencart-1512-modul-kategorij-tretij-uroven-bez-optimizacii-zaprosov

  3. Юлия
    26.09.2011 в 19:52:00 | #3

    а можно ли вообще вывод третьей категории в боковом меню? Стоит ли заморачиваться поиском решения?

  4. Ruslan Brest
    26.09.2011 в 21:46:39 | #4

    Можно вообще всё :) Было бы желание и время.

    UPD. См. http://rb.labtodo.com/page/opencart-1512-modul-kategorij-tretij-uroven-bez-optimizacii-zaprosov

  5. Аноним
    16.10.2011 в 18:28:36 | #5

    не совсем понятно, а что в этой записи измененно?

    -#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');

    }

  6. Аноним
    16.10.2011 в 18:29:17 | #6

    И что это ? @@ -386,9 +412,12 @@ label {

  7. Ruslan Brest
    16.10.2011 в 19:15:32 | #7

    Скобка перенесена. Видимо, экспериментировал, а потом убрал лишнюю строку, а скобка перенесённой осталась.

    @@ -386,9 +412,12

    это примерные номера строк с изменениями и ещё какая-то доп. информация для diffutils. Примерные - потому что нумерация у меня и у других может быть разной из-за разных модификаций.

    @@ label {

    это функция, в которой это изменение встретилось. Для PHP - обычно имя функции или класса, в HTML/CSS/TPL сюда попадает что-то на них похожее. Можно использовать для ориентира и доп. контроля.

  8. Аноним
    17.10.2011 в 19:58:28 | #8

    Скажите пожалуйста, как сделать что бы если в меню 2 строчки категорий, нижняя строчка категорий не мешала выпадающему меню верхних категорий, вот у меня на сайте такая проблема Сайт http://tuningdom.ru, Помогите.

  9. Ruslan Brest
    17.10.2011 в 20:15:15 | #9

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

  10. Антон
    10.11.2011 в 14:09:43 | #10

    Уважаемый Руслан!

    Спасибо за интересное решение. Помогите, пожалуйста.

    Можно ли в модуле категорий указать, из какой категории нужно отображать категории. То есть, у меня трехуровневый каталог: категория -> подкатегория -> товар

    В модуле нужно вывести раскрытую категорию, в которой бы отображались ссылки на подкатегории.

  11. Ruslan Brest
    10.11.2011 в 19:30:09 | #11

    То есть категорий получается две? Категория и подкатегория. Товары - в списке выводятся на странице. Или как-то не так?

    То ли я не понял задачу, то ли это и так делается без переделок: одна категория верхнего уровня и все подкатегории в ней. Они и будут всегда раскрыты и показаны.

  12. 22.03.2012 в 19:35:17 | #12

    Вот здесь ошибка

    > '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'])

  13. Ruslan Brest
    22.03.2012 в 20:06:07 | #13

    Ок, спасибо. На 1512 работает, на 1513 руки не доходили поставить, как раз скоро понадобится, проверю.

    Только вот глядя на ошибку, думаю, причина не в версии. У вас скорей всего osCtore и SeoPro? Я не пользуюсь, поэтому скорей всего у меня другие результаты будут.

  14. 22.03.2012 в 20:10:08 | #14

    да ocStore, seo обычный. Сам подумал, что ошибка возможно не в этом. Сейчас модуль seo разбираю.

  15. 15.04.2012 в 21:11:54 | #15

    У меня почему-то после каждой категории выводится производители :(

    Есть скрин, но сюда его не встаить

    Как излечить? Версия 1.5.2

Оставьте комментарий!

Гость
Комментатор / хотите им стать

Чтобы стать комментатором, введите email и пароль. Напишите комментарий. В дальнейшем ваша связка email-пароль позволит комментировать, получать уведомления об ответах и редактировать свои данные. Не забудьте про активацию (инструкция придёт на email, указанный при регистрации).

Авторизация: Facebook. MaxSiteAuth. Loginza

(обязательно)