В Opencart есть очень полезная функция рекомендованных товаров. Однако в стандартном исполнении очень не хватает сортировки по категориям. Согласитесь, что к ноутбуку могут быть множество аксессуаров, наушники, мышки, сумки и тому подобное. Рекомендованных товаров может быть большое количество, и если пользователю нужны только мышки, при стандартном исполнении, ему нужно все просматривать, что согласитесь неудобно. В данной доработке мы сделаем вывод рекомендованных товаров по категориям.
С помощью дополнительных скриптов, например скрывающегося и раскрывающегося блока div можно показать только названия категорий, а содержимое, то есть все товары скрыть и при нажатии нужной категории покупатель увидит все рекомендованные товары, которые ему интересные.
Для реализации задуманного нам надо будет изменить три файла и соответственно разделим все на три этапа.
1. Для начала добавим функцию выборки всех категорий в которых находится данный товар. Для этого открываем файл: /catalog/model/catalog/product.php
Находим строку:
public function getProductRelated($product_id) {
Перед ней вставляем:
public function getProductCategory($product_id) { $product_data = array(); $query = $this->db->query('SELECT * FROM ' . DB_PREFIX . 'product_to_category p2c LEFT JOIN ' . DB_PREFIX . 'product p ON (p2c.product_id = p.product_id) LEFT JOIN ' . DB_PREFIX . 'product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.product_id = '' . (int)$product_id . '' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '' . (int)$this->config->get('config_store_id') . '''); foreach ($query->rows as $result) { $product_data[$result['category_id']] = $this->model_catalog_category->getCategory($result['category_id']); } return $product_data; }
Сохраняем, теперь у нас есть массив с id категорий товара.
2. Далее добавим необходимый функционал в контроллер, для этого открываем: /catalog/controller/product/product.php Находим строки:
$this->data['products'] = array();
После неё вставляем:
$this->data['categories'] = array(); $category_names = array();
Далее находим строку
$this->data['products'][] = array(
Перед ней вставляем:
$category_data = $this->model_catalog_product->getProductCategory($result['product_id']); foreach($category_data as $id){ $category_name = $id['name']; $category_category_id = $id['category_id']; $category_sort_order = $id['sort_order']; }
Далее находим строку:
'name' => $result['name'],
После нее вставляем:
'category_name' => $category_name, 'category_id' => $category_category_id, 'category_sort' => $category_sort_order,
Далее находим строку:
'href' => $this->url->link('product/product', 'product_id=' . $result['product_id'])
После нее вставляем:
if(!in_array($category_name, $category_names)){ $category_names[] = $category_name; } $this->data['products_cat'] = $category_names;
Далее находим строку:
$this->data['tags'] = array();
Перед ней вставляем:
foreach ($this->data['products_cat'] as $name) { $products = array(); foreach ($this->data['products'] as $result) { if($name == $result['category_name']){ $products[] = array( 'product_id' => $result['product_id'], 'thumb' => $result['thumb'], 'name' => $result['name'], 'price' => $result['price'], 'special' => $result['special'], 'rating' => $result['rating'], 'reviews' => $result['reviews'], 'href' => $result['href'] ); } } $this->data['categories'][] = array( 'name' => $name, 'products' => $products ); }
Сохраняем, теперь у нас есть массив с категориями у которого есть массив с товарами этих категорий. Осталось дело за малым, отредактировать вывод рекомендованных товаров.
3. Для этого открываем файл шаблона: /catalog/view/theme/default/template/product/product.tpl Находим строку:
Заменяем её на:
Далее находим строку:
Заменяем её на строки:
Далее находим строку:
');'?>
После неё добавляем:
Все готово! После внесения изменений все рекомендованные товары сортируются по категориям. Ниже можно скачать модуль в vqmod xml формате