Adman хостинг
Оценок: 1
Opencart 2 вывод изображений подкатегорий как иконки на странице категории

OC2: Вывод изображения подкатегории как иконки

Здесь один из вариантов изменения отображения списка подкатегорий для Opencart 2, скорее всего подойдет и для версии 1.5 (большой разницы в этой части нет)

Понадобится: внести изменения в контроллер и шаблон квтегории, таблицу стилей и при необходимости найти изображение-заглушку для иконки, если не задано в настройках категории.

Что должно получиться в итоге:

  • Название категории изначально состоящее из заголовка и количества товаров разбивается на две части
  • Добавляется изображение

Изменения в контроллере категории

Открываем файл /catalog/controller/product/category.php

Здесь находим:

$data['categories'][] = array(

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

if ($result['image']) {
	$caimage = $this->model_tool_image->resize($result['image'], 100, 100);
} else {
	$caimage = $caimage = $this->model_tool_image->resize('no_image.png', 100, 100);
}

После найденной строки добавляем изображение, а так же разбиваем 'name' на 2 части - имя категории и счетчик товаров. Должно в итоге получиться так:

$data['categories'][] = array(
	'name'  => $result['name'],
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url),
	'image'  => $caimage,
	'count'  => ($this->config->get('config_product_count') ?  $this->model_catalog_product->getTotalProducts($filter_data) : '')
);

Теперь перейдем к шаблону.

Изменения в шаблоне

Открываем файл /catalog/view/theme/default/template/product/category.tpl и находим следующий код (29-54 строки в шаблоне по умолчанию, в других шаблонах могут быть отличия):

<?php if ($categories) { ?>
	<h3><?php echo $text_refine; ?></h3>
	<?php if (count($categories) <= 5) { ?>
		<div class="row">
			<div class="col-sm-3">
				<ul>
					<?php foreach ($categories as $category) { ?>
					<li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></li>
					<?php } ?>
				</ul>
			</div>
		</div>
	<?php } else { ?>
		<div class="row">
			<?php foreach (array_chunk($categories, ceil(count($categories) / 4)) as $categories) { ?>
				<div class="col-sm-3">
					<ul>
						<?php foreach ($categories as $category) { ?>
						<li><a href="<?php echo $category['href']; ?>"><?php echo $category['name']; ?></a></li>
						<?php } ?>
					</ul>
				</div>
			<?php } ?>
		</div>
	<?php } ?>
<?php } ?>

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

		<?php if ($categories) { ?>
			<h3><?php echo $text_refine; ?></h3>
			<div class="row">
				<div class="subcats">
					<ul>
						<?php foreach ($categories as $category) { ?>
						<li class="col-sm-3">
						<a href="<?php echo $category['href']; ?>">
						<img src="<?php echo $category['image']; ?>" alt="<?php echo $category['name']; ?>" />
						<?php echo $category['name']; ?>
						</a>
						<?php if ($category['count']) { echo '<span class="count">'. $category['count'].'</span>';} ?>
						</li>
						<?php } ?>
					</ul>
				</div>
			</div> 
		<?php } ?>

Добавляем в CSS

.subcats ul {padding: 0px;list-style-type:none;}
.subcats li {margin-bottom: 20px;text-align: center;}
.subcats li img {display: block;border-radius: 50px;margin: 0px auto 10px auto;border: 1px solid #ECECEC;}
.subcats .count {position: absolute;top: 0px;left: 50%;background: #FF6A00;color: #fff;text-align: center;line-height: 30px;width: 30px;border-radius: 15px;margin-left: 32px;border: 1px solid #ECECEC;}

Вывод подкатегорий с пропуском одного уровня

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

Если Нужно оставить второй уровень.. напремер в виде заголовков, то можно сделать по аналогии с модулем "категории", там очень похоже. Здесь же вариант, при котором будет отображен только третий уровень без разбивки. При этом не потребуется вносить дополнительные изменения в шаблон, только контроллер: /catalog/controller/product/category.php

1. Находим:

$data['categories'] = array();

Вырезаем оттуда где нашли и вставляем после

$results = $this->model_catalog_category->getCategories($category_id);
			foreach ($results as $result) {

2. Далее меняем (с изменениями из предыдущего примера):

$data['categories'][] = array(
	'name'  => $result['name'],
	'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $result['category_id'] . $url),
	'image'  => $caimage,
	'count'  => ($this->config->get('config_product_count') ?  $this->model_catalog_product->getTotalProducts($filter_data) : '')
);

На

$cats = $results = $this->model_catalog_category->getCategories($result['category_id']);
foreach ($cats as $cat) {
	if ($cat['image']) {
		$caimage = $this->model_tool_image->resize($cat['image'], 100, 100);
	} else {
		$caimage = $caimage = $this->model_tool_image->resize('no_image.png', 100, 100);
	}
	$data['categories'][] = array(
		'name'  => $cat['name'],
		'href'  => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '_' . $cat['category_id'] . $url),
		'image'  => $caimage,
		'count'  => ($this->config->get('config_product_count') ?  $this->model_catalog_product->getTotalProducts($filter_data) : '')
	);
}

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

Оценок: 1

Комментарии (97)