Категории производителя с иерархией
Вывод категорий с подкатегориями на странице производителя выше списка товаров в Opencart
Для вывода категорий производителя уже была отдельная статья в моем блоге по Opencart for-opencart.com. Основным недостатком такого решения было то, что категории были все скопом без разделения по иерархии (Категории - Подкатегории).
В этом уроке хочу поделиться моим модернизированным решением.
Логика работы категорий бренда состоит:
- выбор всех товаров производителя
- выбор всех категорий у этих товаров
- формирование категорий
Для начала надо в файл 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 а другой, просто в конец ссылки задайте параметр который будет срабатывать в вашем фильтре. А если не нужно сортировать в той категории товары, ничего не задавайте.
Стили уже можно сделать под сайт в индивидуальном порядке.