В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя». Сами «коллекции» это не что иное, как категории, а товары это уже сама плитка. Решением было сделать дополнительный вывод категорий производителя.
Однако у нас в магазине не было связки категории и производители, а делать её в админке вручную, при этом создавая дополнительные поля в базе данных, я считаю нецелесообразным. Да и при каждом изменении, удалении или дополнении товаров, категорий каждый раз все связки категорий и производителей надо делать вручную, что согласитесь и неудобно и можно во всем запутаться.
Для вывода категорий конкретного производителя мы будем использовать связь товар с производителем, который есть в стандартном исполнении магазина. Для этого выберем сначала все товары производителя, а потом циклом, используя связь товар – категории, сделаем выборку уникальных значений всех категорий, так как в одной может быть много товаров. Этими манипуляциями мы получили все 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, что не совсем красиво, но оно не мешает и прекрасно выполняет поставленную функцию.