Ruslan Brest, rb.labtodo.com

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

Opencart 1.5.1.2: Модуль категорий: третий уровень (без оптимизации запросов)

Опубликовано: 30 января 2012.
Автор: Ruslan Brest.

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

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

Запоздало публикую рецепт вывода 3-го уровня категорий для версии 1.5.1.2. Способ стандартный опенкартовский, чудовищно неоптимальный, но мне надо было сделать быстро, поэтому не стал голову морочить. Для 1.5.1.3 надо будет сделать получше (если это ещё не сделано кем-то ещё).

Количество категорий - 91. Первого уровня - около десятка. Визуально на скорости загрузки страниц это добавление третьего уровня никак не сказалось. Цифры не смотрел.

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

Тем, кому количество товаров в категориях захочется оставить - верните на место закомментированные в паре мест $product_total, я их оставил в коде. Но это вам и тормозов добавит. Я бы, если и оставлял отображение количества , то на небольших списках и желательно с короткими названиями (не многострочными).

commit 2f6f47af0cfe0bea4815b76579940eb8139f11cb
Author: Ruslan Brest <rb@labtodo.com>
Date:   Mon Jan 30 02:21:17 2012 +0200
    [+] oc1512 Модуль категорий: третий уровень (без оптимизации запросов)
    
    убрано отображение количества товаров в категориях (так гораздо аккуратней при большом кол-ве категорий)
    убраны точки и улучшены отступы -- для более аккуратного внешнего вида
diff --git a/public_html/catalog/controller/module/category.php b/public_html/catalog/controller/module/category.php
index 09a4bd1..5a9fcaa 100644
--- a/public_html/catalog/controller/module/category.php
+++ b/public_html/catalog/controller/module/category.php
@@ -23,6 +23,12 @@ class ControllerModuleCategory extends Controller {
 			$this->data['child_id'] = 0;
 		}
 
+		if (isset($parts[2])) {
+			$this->data['ch3_id'] = $parts[2];
+		} else {
+			$this->data['ch3_id'] = 0;
+		}
+
 		$this->load->model('catalog/category');
 		$this->load->model('catalog/product');
 
@@ -40,12 +46,22 @@ class ControllerModuleCategory extends Controller {
 					'filter_category_id'  => $child['category_id'],
 					'filter_sub_category' => true
 				);
-
-				$product_total = $this->model_catalog_product->getTotalProducts($data);
+				// $product_total = $this->model_catalog_product->getTotalProducts($data);
+
+				$level3 = $this->model_catalog_category->getCategories($child['category_id']);
+				$l3_data = array();
+				foreach ($level3 as $l3) {
+					$l3_data[] = array(
+						'category_id' => $l3['category_id'],
+						'name'        => $l3['name'],
+						'href'        => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']. '_' . $l3['category_id'])
+					);
+				}
 
 				$children_data[] = array(
 					'category_id' => $child['category_id'],
-					'name'        => $child['name'] . ' (' . $product_total . ')',
+					'name'        => $child['name'], // . ' (' . $product_total . ')',
+					'children'    => $l3_data,
 					'href'        => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])
 				);
 			}
@@ -55,11 +71,11 @@ class ControllerModuleCategory extends Controller {
 				'filter_sub_category' => true
 			);
 
-			$product_total = $this->model_catalog_product->getTotalProducts($data);
+			// $product_total = $this->model_catalog_product->getTotalProducts($data);
 
 			$this->data['categories'][] = array(
 				'category_id' => $category['category_id'],
-				'name'        => $category['name'] . ' (' . $product_total . ')',
+				'name'        => $category['name'], // . ' (' . $product_total . ')',
 				'children'    => $children_data,
 				'href'        => $this->url->link('product/category', 'path=' . $category['category_id'])
 			);
diff --git a/public_html/catalog/view/theme/crista_grey/stylesheet/stylesheet.css b/public_html/catalog/view/theme/crista_grey/stylesheet/stylesheet.css
index d215d29..7eff032 100644
--- a/public_html/catalog/view/theme/crista_grey/stylesheet/stylesheet.css
+++ b/public_html/catalog/view/theme/crista_grey/stylesheet/stylesheet.css
@@ -830,6 +830,12 @@ a.button:hover span {
 .box-category > ul > li ul > li > a.active {
 	font-weight: bold;
 }
+
+.box-category > ul > li ul > li ul > li {
+	padding: 5px 0 0 10px;
+}
+
+
 /* content */
 #content .content {
 	padding: 10px;
diff --git a/public_html/catalog/view/theme/default/template/module/category.tpl b/public_html/catalog/view/theme/default/template/module/category.tpl
index fca707f..5157259 100644
--- a/public_html/catalog/view/theme/default/template/module/category.tpl
+++ b/public_html/catalog/view/theme/default/template/module/category.tpl
@@ -16,17 +16,33 @@
 				<?php foreach ($category['children'] as $child) { ?>
 					<li>
 					<?php if ($child['category_id'] == $child_id) { ?>
-						<a href="<?php echo $child['href']; ?>" class="active">• <?php echo $child['name']; ?></a>
+						<a href="<?php echo $child['href']; ?>" class="active"><?php echo $child['name']; ?></a>
 					<?php } else { ?>
-						<a href="<?php echo $child['href']; ?>">· <?php echo $child['name']; ?></a>
+						<a href="<?php echo $child['href']; ?>"><?php echo $child['name']; ?></a>
 					<?php } ?>
+
+					<?php if ($child['children']) { ?>
+					<ul>
+					<?php foreach ($child['children'] as $ch3) { ?>
+						<li>
+						<?php if ($ch3['category_id'] == $ch3_id) { ?>
+							<a href="<?php echo $ch3['href']; ?>" class="active"><?php echo $ch3['name']; ?></a>
+						<?php } else { ?>
+							<a href="<?php echo $ch3['href']; ?>"><?php echo $ch3['name']; ?></a>
+						<?php } ?>
+						</li>
+					<?php } ?>
+					</ul>
+					<?php } ?>
+
+
 					</li>
 				<?php } ?>
 				</ul>
-			<?php } ?>
+				<?php } ?>
 			</li>
 		<?php } ?>
 		</ul>
 		</div>
 	</div>
-</div>
+</div>
\ No newline at end of file
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

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

  1. Олег
    30.01.2012 в 18:39:39 | #1

    Спасибо за статью! Мне очень помог. Клиент просит - понимаю, что не сложно должно быть, в править надо аж три файла.

    Спасибо еще раз!

  2. 15.03.2012 в 01:27:29 | #2

    сделал все изминения выдает ошибку

    Parse error: syntax error, unexpected T_IF, expecting T_FUNCTION in /home/carscoll/cars-collections.com.ua/www/catalog/controller/module/category.php on line 89

    по этому адресу такая строка

    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . 'template/module/category.tpl')) {

    //$this->template = $this->config->get('config_template') . '/template/module/category.tpl';

    } else {

    $this->template = 'yoodefault_2/template/module/category.tpl';

    }

    $this->render();

  3. Иван
    20.03.2012 в 14:23:42 | #3

    А как же сделать так, чтобы оставить количество товаров в подкатегории?

    Оставляю

    'name' => $category['name'] . ' (' . $product_total . ')',

    В результате выдает количество товаров в категории на уровень выше....

  4. Иван
    20.03.2012 в 14:56:42 | #4

    Все! Сам разобрался!

    Подскажите как 4 уровень сделать...

  5. 12.05.2012 в 04:21:30 | #5

    Здравствуйте! есть модуль меню акардион: http://maxzon.ru/module/module-151/168-modul-menyu-akkordeon-dlya-opencart.html, не могли бы вы подсказать как сделать так чтобы при переходе оно не сворачивалось и все пункты меню были кликабельны?

    Заранее спасибо за помощь.

  6. 12.05.2012 в 04:29:42 | #6

    Кстати, чуть не забыл: Если проблема не решается без денег, готов заплатить)

  7. Ruslan Brest
    12.05.2012 в 16:44:21 | #7

    Не знаю, разбираться надо. У меня дела, не возьмусь за это. Спросите на форумах, там же десятки людей, которые могут подсказать решение.

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

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

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

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

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