В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя». Сами «коллекции» это не что иное, как категории, а товары это уже сама плитка. Решением было сделать дополнительный вывод категорий производителя.

 

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

Для вывода категорий конкретного производителя мы будем использовать связь товар с производителем, который есть в стандартном исполнении магазина. Для этого выберем сначала все товары производителя, а потом циклом, используя связь товар – категории, сделаем выборку уникальных значений всех категорий, так как в одной может быть много товаров. Этими манипуляциями мы получили все id категорий в которых есть товары определенного производителя. Остается теперь сделать выборку данных о категориях. Для этого можно использовать стандартные методы.

После получения массива с данными, выводим его на странице в opencart.

Реализацию данного функционала разделим на три этапа:

1. Открываем файл модели, и добавляем функцию для выборки категорий товара (всех тех категорий в которых присутствует товар) по адресу:  /catalog/model/catalog/category.php  Находим строку:

public function getCategoryFilters($category_id) {

Перед! этой строкой вставляем нашу функцию:

 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; } 

2. Вставляем в контроллер код, который получая массив из id продуктов данного производителя делает по циклу, перебирая все id, выборку категорий каждого товара и добавляет уникальные значения id категорий в массив всех категорий в которых есть товар этого производителя. Далее мы циклом делаем выборку всех данных категории и записываем нужные (изображение, ссылка, имя) данные в массив категорий.

Для добавления этого кода переходим по адресу:  /catalog/controller/product/manufacturer.php  Находим строку:

$manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($manufacturer_id); 

Перед! этой строкой вставляем наш код::

$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) { $manufacturer_products[] = array('product_id' => $id['product_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['manufacturer_categories'] = array(); foreach ($categories as $value) { $categories_data = $this->model_catalog_category->getCategory($value); if ($categories_data['image']) { $image = $this->model_tool_image->resize($categories_data['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = false; } $this->data['manufacturer_categories'][] = array( 'category_id' => $categories_data['category_id'], 'name' => $categories_data['name'], 'thumb' => $image, 'href' => $this->url->link('product/category', '&path=' . $categories_data['category_id']) ); } 

3. После добавления всего программного кода, нам необходимо сделать вывод категорий производителя на страницу информации о производителе и его товарах. Для этого открываем файл шаблона по адресу: /catalog/view/theme/default/template/product/manufacturer_info.tpl  Находим строку:

 

Перед! этой строкой вставляем код вывода всех категорий производителя::

    

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

———- UPD ———-

По просьбам людей, которые прочитали эту статью — напишу еще небольшое дополнение. При переходе в одну из категорий выводятся все товары, независимо от производителя. Как мне пишут, что в некоторых магазинах это не логично и требуется, что бы выводились товары, производителя из которого мы перешли. Для наглядности приведу пример.

Мы открыли страницу производителя Apple. С помощью этой доработки, у нас, помимо товаров, вывелись еще и категории, в которых есть товары этого бренда. Категории будут: Телефоны, Планшеты, Ноутбуки. При переходе в Телефоны у нас будет стандартный вывод всех телефонов, и Apple и Samsung и других производителей.

Так вот, требуется сделать, при заходе в категории Apple, вывод только продуктов этого производителя. Для этого нам надо как-то передать на категорию параметр фильтрации по производителю. Будем использовать старый добрый, может не такой эстетичный, но рабочий, прием с GET переменной.

Для формирования ссылки на категории с параметром фильтрации нам надо открыть контроллер производителя catalog/controller/product/manufacturer.php и перед:

$this->data['manufacturer_categories'] = array();

Добавить:

$this->data['manufacturer_id'] = $manufacturer_id;

После этого переходим в файл шаблона catalog/view/theme/default/template/product/manufacturer_info.tpl и ищем цикл вывода категорий производителя:

Все ссылки вида:

Делаем такими:

?m='>

То есть мы добавляем параметр GET к ссылке. Этот метод будет работать, если у вас включено ЧПУ, если нет, то знак ? надо поменять на знак &.

После таких изменений у нас переходя в категорию бренда, будет передаваться данные для фильтрации по производителю. Но что бы стандартный вывод товаров в категории понял этот параметр, нам надо открыть контроллер категории catalog/controller/category.php и найти строку:

'filter_category_id' => $category_id,

После нее вставляем:

'filter_manufacturer_id' => isset($this->request->get['m'])?$this->request->get['m']:false,

После этих изменений ссылки у нас будут в конце с параметром производителя вида site.com/category/?m=11, что не совсем красиво, но оно не мешает и прекрасно выполняет поставленную функцию.


31.05.2015 17811
Новости из этой категории
11.09.2019 5068
В Opencart при копировании товара удаляет
Во втором Opencart замечен странный баг который вместо копирования товара в списке его удаляет. Что бы исправить необходимо открыть файлadmin/view/template/catalog/produc..
15.11.2018 17424
Как вывести любую информацию в любом месте в карточке товара
Приветствую тебя юный разработчик! Очень часто в заданиях или целых проектах у меня бывают похожие пункты. Очень популярный это вывод информационного блока в карточке тов..
29.09.2018 8222
Исправляем баг Opencart редирект с page=1 на страницу категории
В пагинации Opencart зарыто очень много багов. Например при перелистывании категории кнопками 1.2.3... у нас создаются дубли страниц, которые можно решить с помощью внедр..
11.02.2018 8006
Как задать разный порядок сортировки товара для каждой из категорий к которому он привязан
Приветствую! Недавно мне написал заказчик который попросил меня сделать достаточно интересную доработку. Суть ее в том что надо сделать порядок сортировки товара который ..
23.01.2018 9945
Пропадают заказы в Opencart - как вылечить?
Очень часто ко мне обращаются мои клиенты с просьбой разобраться почему у них пропадают заказы. То есть клиенты звонят и говорят что заказ сделали но никто не перезванива..
Вся информация, представленная на сайте, является демонстрационной и оставляя информацию о своих персональных данных, вы добровольно делаете их общедоступными.
Рекомендуем использовать обезличенные данные. Мы используем файлы cookie для вашего удобства пользования сайтом и повышения качества рекомендаций. Подробнее