Ruslan Brest, rb.labtodo.com
Backend web-developer: CodeIgniter, PHP, MySQL, OpenCart, PrestaShop, MaxSite CMS

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

Просмотров: 13933 RSS 19
Howto » OpenCart

Запоздало публикую рецепт вывода 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
Комментариев: 19
  1. Спасибо за статью! Мне очень помог. Клиент просит - понимаю, что не сложно должно быть, в править надо аж три файла.

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

  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. А как же сделать так, чтобы оставить количество товаров в подкатегории?

    Оставляю

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

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

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

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

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

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

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

  7. 2012-05-13 в 01:44:21 | Ruslan Brest

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

  8. вместо списка подкатегорий 3-го уровня выдает такую ошибку:

    Notice: Undefined index: children in Z:\home\karisha.com.ua\www\catalog\view\theme\theia\template\module\category.tpl on line 22

    пробовала на своем и на дефолтном шаблоне - одинаково. Подскажите, как исправить?

  9. 2012-09-27 в 03:30:52 | Ruslan Brest
    Подскажите, как исправить?

    Вероятно, искать ошибку. У меня же есть 'children' и заполняется в контроллере. Почему его у вас не оказывается - я не знаю.

  10. 2012-12-01 в 08:31:10 | Андрей

    Подскажите пожалуйста, а можно ли сделать так чтоб выводился список товаров в выбранной под категории, так как сделано на rozetka.ua Там если находишься в карточке товара в правой колонке отображается так сказать развёрнутая под категория товара со списком всех входящих в неё товаром. Насколько сложно это реализовать на практике?

  11. 2013-06-07 в 07:10:02 | Сигизмунд

    А на opencartforum решение не хотите выложить?

  12. 2013-06-07 в 18:58:09 | Ruslan Brest

    А смысл?

    Понятней не станет. Легче искать не станет: поиск в гугле работает на порядок лучше, чем поиск на форуме. Даже внутренний поиск по этому блогу работает лучше поиска там по форуму. Решение неоптимальное, поэтому сильно его распространять нет смысла. Сопровождать, бекапить, исправлять и перекрашивать свой контент мне удобней здесь, в одном месте, вместо 3-4 разных.

  13. А для opencart 1.5.3.1 как сделать?

  14. 2013-06-11 в 19:58:14 | Ruslan Brest
    А для opencart 1.5.3.1 как сделать?

    Наверное по аналогии. Понять, что сделано тут, и сделать аналогично на 1.5.3. Там сильно код отличается? Записал себе в Todo, появится время - посмотрю на 1.5.3.

  15. Добрый день, вы случайно не знаете как увеличить количество подкатегорий, их всего 3, хотелось бы сделать около 10, нужно для магазина автозапчестей.

  16. Работает для ocStore 1.5.5.1.1. Спасибо!

  17. Афтар, привет.

    Заработало на 1.5.5.1.1.

    Только стили совсем не работают.

    Требуется помощь?!

  18. Поставил на 1.5.5.1.1, заработало, конечно, но сервер стал часто возвращать 503. Саппорт говорит, что перегрузка запросами к БД. Жаль!!

  19. 2014-06-16 в 06:40:37 | Ruslan Brest

    @Andrey, можно попробовать модуль категорий, который динамически сворачивает-разворачивает узлы. Там, насколько помню, на лету AJAX-ом подгружалось разворачиваемое. Это точно решит проблему нагрузки на БД.

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

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

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

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

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