Категории производителя с иерархией

Вывод категорий с подкатегориями на странице производителя выше списка товаров в Opencart

ноябрь 03 , 2016

Для вывода категорий производителя уже была отдельная статья в моем блоге по Opencart for-opencart.com. Основным недостатком такого решения было то, что категории были все скопом без разделения по иерархии (Категории - Подкатегории).

В этом уроке хочу поделиться моим модернизированным решением.

Логика работы категорий бренда состоит:

  • выбор всех товаров производителя
  • выбор всех категорий у этих товаров
  • формирование категорий

MicrodataPro;

Для начала надо в файл catalog/model/catalog/category.php добавить функцию выбора всех категорий товара:

/***ip-2016***/	
	public function getProductCategories($product_id) {
		$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");
		
		return $query->rows;
	}
/***ip-2016***/	

Далее в файл catalog/controller/product/manufacturer.php в функции info после формирования хлебных крошек $this->data['breadcrumbs'][] = array(... добавляем код

/***ip-2016***/
	$this->load->model('catalog/category');

	$categories = array();

	$products_ids = $this->model_catalog_product->getProducts(array('filter_manufacturer_id' => $manufacturer_id));		
	foreach ($products_ids as $id) {
		$product_categories = $this->model_catalog_category->getProductCategories($id['product_id']);	

		foreach ($product_categories as $product_category){
			if (!in_array($product_category['category_id'], $categories)) {
				$categories[] = $product_category['category_id'];
			}
		}
	}

	$this->data['categories'] = array();
				
	$all_categories = $this->model_catalog_category->getCategories(0);
	
	foreach ($all_categories as $category) {
		if (in_array($category['category_id'], $categories)) {
			$children_data = array();
			$children = $this->model_catalog_category->getCategories($category['category_id']);
			foreach ($children as $child) { 
				if (in_array($child['category_id'], $categories)) {
					$children_data[] = array(
						'name'  => $child['name'],
						'href'  => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id'])	
					);						
				}
			}

			if ($category['image']) {
				$image = $this->model_tool_image->resize($category['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
			} else {
				$image = $this->model_tool_image->resize('no_image.jpg', $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
			}				
			
			$this->data['categories'][] = array(
				'name'     => $category['name'],
				'thumb'    => $image,
				'children' => $children_data,
				'href'     => $this->url->link('product/category', 'path=' . $category['category_id'])
			);
		}
	}
	
	$this->data['manufacturer_id'] = $manufacturer_id;
/***ip-2016***/

После чего выводим массив категорий на страницу производителя. Для этого открываем файл catalog/view/theme/default/template/product/manufacturer_info.tpl и после строки <?php if ($products) { ?> добавляем вывод категорий.

<?php /***ip-2016***/ ?>
	<?php if ($categories) { ?>
	  <div class="category-list">
		<?php foreach ($categories as $category) { ?>
		 <div class="manufacturer-category">
			 <div class="name">
			  <?php if ($category['thumb']) { ?>
			  <a href="<?php echo $category['href']; ?>?filter_ocfilter=m:<?php echo $manufacturer_id; ?>">
				<img src="<?php echo $category['thumb']; ?>">
			  </a>
			  <?php } ?>
			  <a href="<?php echo $category['href']; ?>?filter_ocfilter=m:<?php echo $manufacturer_id; ?>">
				<?php echo $category['name']; ?>
			  </a>	
			 </div>
			 <?php if($category['children']){ ?>
			  <div>
				<?php foreach($category['children'] as $child){ ?>
					<a href="<?php echo $child['href']; ?>?filter_ocfilter=m:<?php echo $manufacturer_id; ?>"><?php echo $child['name']; ?></a>
				<?php } ?>
			  </div>
		     <?php } ?>
		  </div>
		<?php } ?>
	  </div>
	<?php } ?>
<?php /***ip-2016***/ ?>	

Как заметно для фильтрации товаров по выбранному бренду в конец ссылки мы задаем параметр ?filter_ocfilter=m: Если у вас на сайте не ocfilter а другой, просто в конец ссылки задайте параметр который будет срабатывать в вашем фильтре. А если не нужно сортировать в той категории товары, ничего не задавайте.

Стили уже можно сделать под сайт в индивидуальном порядке.