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

Opencart 1.5.x: индикация текущей категории в главном меню

Просмотров: 16637 RSS 21
Howto » Web development » OpenCart

Добавляем визуальную индикацию текущей выбранной категории в главном меню магазина. Учитывается только первая указанная в пути категория, возможные альтернативы не обрабатываются.

Модифицируемые файлы:

catalog/controller/common/header.php
catalog/view/theme/default/stylesheet/stylesheet.css
catalog/view/theme/default/template/common/header.tpl

В файле catalog/controller/common/header.php ищем

// Level 1
				$this->data['categories'][] = array(
					'name'     => $category['name'],
					'children' => $children_data,
					'column'   => $category['column'] ? $category['column'] : 1,
					'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
				);
			}
		}

изменяем:

// Level 1
				$this->data['categories'][] = array(
					'name'     => $category['name'],
					'children' => $children_data,
					'column'   => $category['column'] ? $category['column'] : 1,
					'href'     => $this->url->link('product/category', 'path=' . $category['category_id']),
					'category_id' => $category['category_id']	// http://rb.labtodo.com/opencart-15x-show-current-category-in-menu
				);
			}
		}
		// http://rb.labtodo.com/opencart-15x-show-current-category-in-menu :: BEGIN
		if (isset($this->request->get['path'])) {
			$parts = explode('_', (string)$this->request->get['path']);
		} else {
			$parts = array();
		}
		if (isset($parts[0])) {
			$this->data['category_id'] = $parts[0];
		} else {
			$this->data['category_id'] = 0;
		}
		// http://rb.labtodo.com/opencart-15x-show-current-category-in-menu :: END

В файле catalog/view/theme/default/stylesheet/stylesheet.css ищем

#menu > ul > li:hover {
	background: #000;
}

добавляем:

#menu > ul > li:hover {
	background: #000;
}
#menu > ul > li > a.active {
	background: #000;
}

В файле catalog/view/theme/default/template/common/header.tpl ищем

<div id="menu">
  <ul>
    <?php foreach ($categories as $category) { ?>
    <li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a>

изменяем:

<div id="menu">
  <ul>
    <?php foreach ($categories as $category) { ?>
    <li><?php if ($category['category_id'] == $category_id) { ?>
	<a href="<?php echo $category['href']; ?>" class="active"><?php echo $category['name']; ?></a>
	<?php } else { ?>
	<a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a>
	<?php } ?>
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
Комментариев: 21
  1. А вы не могли бы подсказать, как вывести меню третьего уровня в стандартном горизонтальном меню ocStore v1.0.1, излазил практически весь интернет но решения так и не нашёл. Прошу извинить если проблема всего лишь в моей невнимательности

  2. 2011-09-03 в 23:03:26 | Ruslan Brest

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

    catalog/controller/common/header.php

    catalog/view/theme/default/template/common/header.tpl

    catalog/view/theme/default/stylesheet/stylesheet.css

    Подробней не смотрел.

  3. Вы знаете Руслан, к сожалению я всего лишь любитель, и пока ещё код для, меня как тёмный лес. Возможно в будущем всё изменится.

    Если вам будет интересно самому - и вы найдёте немного времени "разжевать и в рот положить" ;) это поможет не только мне одному, тема поднимается часто но решения нет как нет. Возможно вам Руслан сделать это будет под силу ?

  4. 2011-09-04 в 22:07:33 | Ruslan Brest

    Под силу, реализация там несложная, у меня она займёт 1-2 часа. Но всё упирается в ресурсы и приоритеты. Я сейчас не успеваю справляться с двумя очень важными для меня проектами, которые кормят, а список задач (если отбросить неважные и несрочные) состоит из 184 пунктов. Из них 118 - важные.

    То есть для того, чтобы эта задача попала в список ближайших кандидатов на исполнение, она должна успешно конкурировать с сотней других. И хоть Опенкарт входит в число этих 2 "горящих" проектов, вопрос наличия 3-го уровня меню для меня сейчас неактуален: по этому проекту у меня есть масса других забот. Поэтому шансы на переключение на эту задачу пока минимальны.

  5. Да, конечно, семью надо кормить, это основной и безусловный приоритет. Спасибо за ответ Руслан.

  6. 2011-09-12 в 19:52:10 | Ruslan Brest

    Алексей, я добавил сегодня заметку о том, как сделать в главном меню вывод ещё одного уровня категорий. См. в рубрике OpenCart.

    Надеюсь, формат diff-ов не вызовет затруднений, там вроде бы всё понятно: имена файлов указаны, где найти, что убрать и что добавить (плюсики, минусы) - мне кажется, интуитивно понятно.

  7. Блестяще, Руслан! Огромное вам спасибо!

    Руслан, могу ли я как то пропиарить ваш труд ? (Извиняюсь что пишу не из своего аккаунта, куда то пароль затерял :( )

  8. 2011-09-20 в 19:17:20 | Ruslan Brest

    Конечно! Я буду только рад любому пиару, ссылкам и мешкам денег :)

    Авторство комментария поправил, а пароль зарегистрированного пользователя можно восстановить, найдя себя среди старых комментариев или на странице http://rb.labtodo.com/users/

  9. А возможно ли выделить скажем жирным или большим шрифтом категории, чтоб при этом подкатегории остались прежними?

  10. 2011-12-07 в 03:43:16 | Ruslan Brest

    Да, конечно. Стили у них разные, что в меню, что в модуле категорий, поэтому достаточно их найти и изменить. Зависит от темы. Добавить что-то вроде text-transform:uppercase;

  11. Для модуля категорий я так понимаю нужно искать в файле

    \catalog\view\theme\....\template\module\category.tpl

    или все таки category.php

  12. 2011-12-07 в 05:16:46 | Ruslan Brest

    Нет, в стилях. Обычно stylesheet.css в соответствующей теме. Если тема не сильно отличается от default - ищите там стили для

    .box-category > ul > li > a

  13. Спасибо дальше сам разберусь, удачи в начинаниях!

  14. Здравствуйте.

    Правильно ли я понимаю, этот метод будет работать только в случае отображения ЧПУ товаров с категориями или же при серфинге по категориям. Только когда в урл страницы есть path. Правильно?

    Спасибо за отличные материалы. Уважение Вам.

  15. 2014-04-19 в 03:26:10 | Ruslan Brest

    Главное условие - наличие параметра "path" в итоговом адресе. То есть насколько понимаю, в ocStore с включенным SeoPro он должен всегда присутствовать. В оригинальном Opencart этого параметра нет у товаров, выводимых через модули последних, рекомендуемых, акционных и т.п. (а, ещё скорей всего и из вкладки "похожих/рекомендуемых" на странице товара) - там, где нет информации о категориях. А при навигации по категориям -- всё правильно, параметр "path" сохраняется и передаётся.

    То есть работать не будет только при переходах из модулей, если используется стандартный Опенкарт. Во всех остальных случаях вроде должно работать.

    Галка "показывать категории в ЧПУ" вроде не должна влиять. Показывать или не показывать - то такое. Главное, что там всегда есть и однозначно указана главная категория, а значит, полный путь к товару всегда известен. Хотя я и не разбирался с внутренней кухней SeoPro.

  16. Спасибо за ответ. Вы подтвердили мои наблюдения, не работает...

    Есть ли возможность другим способом определять категорию (на странице товара) в которой находится пользователь, не используя "path". Интересует определение не основной категории товара (у него их может быть несколько), а именно ту в которой находится пользователь?

  17. 2014-04-22 в 21:53:08 | Ruslan Brest

    Главных категорий товара не может быть несколько. Она одна, и это главное отличие SeoPro-модификации (ocStore, Yesvik) от стандартного метода (называемого обычно SeoUrl). Ещё она (main category) всегда присутствует у товара - и это тоже существенное отличие.

    Та категория, в которую пришёл пользователь, формируется передачей параметра исключительно при навигации по категориям.

    На странице товара, не зная ни ID категории, ни PATH, а только ID товара, можно только найти все категории, к которым он привязан. В стандартном Опенкарт в принципе нет такого понятия, как "текущая категория", "та, в которой он находится".

    Ну или же самостоятельно вводить это понятие и модифицировать движок с той целью, чтобы где-то хранилась "текущая категория". Или скорее та, в которой последний раз был пользователь.

  18. 2014-06-06 в 09:18:49 | Аноним

    Спасибо Ruslan Brest, ваше решение помогло мне добавить в главное меню CSS class="active". Версия движка opencart 1.5.6.4

  19. 2014-10-04 в 02:02:49 | Александр

    Здравствуйте.

    Скажите пожалуйста, а можно реализовать подсветку активной подкатегории?

  20. 2014-10-04 в 02:53:37 | Ruslan Brest

    Наверное можно. Я уже не помню, что там сделано. Только верхняя категория?

    Сегодня занят и в ближайшие дни скорей всего тоже.

  21. Notice: Undefined index: category_id in C:\server\OpenServer\domains\opencart\catalog\view\theme\wacom\template\common\header.tpl on line 58Notice: Undefined variable: category_id in C:\server\OpenServer\domains\opencart\catalog\view\theme\wacom\template\common\header.tpl on line 58

    в OC2.011

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

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

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

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

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

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