Разработка

OpenCart 2.3 - Создаем модуль товаров из этой категории

Краткое руководство

Для этого нам нужно создать следующие файлы:

- admin/controller/extension/module/products_incategory.php
- admin/language/ru-ru/extension/module/products_incategory.php
- admin/view/template/extension/module/products_incategory.tpl
- catalog/controller/extension/module/products_incategory.php
- catalog/model/extension/module/products_incategory.php
- catalog/anguage/ru-ru/extension/module/products_incategory.php
- catalog/view/theme/default/template/extension/module/products_incategory.tpl

Делаем модуль на базе categories (Категории) и related (отсюда возьмем все. что есть: то есть кусок кода в шаблоне товара).

1. Копируем файл контроллера в админке модуля категорий и заменяем название класса на свое. Например: ControllerExtensionModuleCategory меняем на ControllerExtensionModuleProductsInCategory

Далее меняем в пути к языковому файлу название файла на свое. Кстати, по традиции, да и по синтаксису opencart названия файлов должны быть одинаковыми и совпадать с названиями контроллеров.

в строке

$this->load->language('extension/module/category');

меняем на
$this->load->language('extension/module/products_incategory');

Далее в строке добавления настроек

$this->model_setting_setting->editSetting('category', $this->request->post);

меняем на свое имя модуля
$this->model_setting_setting->editSetting('products_incategory', $this->request->post);

Далее в строке подключения шаблона

$this->response->setOutput($this->load->view('extension/module/category', $data));

меняем на свое название модуля:
$this->response->setOutput($this->load->view('extension/module/products_incategory', $data));

Далее в строке валиками разрешения на редактирование

if (!$this->user->hasPermission('modify', 'extension/module/category')) {

также меняем на свое название модуля
if (!$this->user->hasPermission('modify', 'extension/module/products_incategory')) {

2. Копируем языковой файл админки модуля категории и заменяем название модуля на свое.

Так в строке:

$_['heading_title']    = 'Категории';

меняем на:
$_['heading_title']    = 'Товары из этой категории';

3. Копируем файл шаблона в админе модуля категории. Там будет только кнопка поле изменения статуса.
В имени селектор меняем на свое имя модуля.
Так в строке:

< select name="category_status" id="input-status" class="form-control">

меняем на:
< select name="products_incategory_status" id="input-status" class="form-control">

4. Создаем файл модели, в котором создадим только одну функцию получения ID категории товара.
Итак, копируем из файл модели товара объявление модели. Так в строке:

class ModelCatalogProduct extends Model {

заменяем на:
class ModelCatalogExtensionModuleProduct extends Model {

Пишем функцию с запросом к базе на получение Id главной (ближайшей) категории через ID товара.
public function getProductMainCategoryId($product_id) {$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "' AND main_category = '1' LIMIT 1");
return ($query->num_rows ? (int)$query->row['category_id'] : 0);
}

5. Создаем файл контроллера в каталоге нашего модуля.
В строке названия класса:

class ControllerExtensionModuleCategory extends Controller {

заменяем название модуля категории на название своего модуля:
class ControllerExtensionModuleProductsInCategory

Далее загружаем языковой файл:

$this->load->language('extension/module/products_incategory');

Выводим в переменную название:

$data['heading_title'] = $this->language->get('heading_title');

Загружаем модель модуля:

$this->load->model('extension/module/products_incategory');

Загружаем модель товара:

$this->load->model('catalog/product');

Получаем ID главной категории товара:

$main_category_id = $this->model_catalog_product->getProductMainCategoryId((int)$this->request->get['product_id']);

Настраиваем фильтрацию для поиска товаров в базе:

$filter = '';
$sort = 'p.sort_order-ASC';
$order = 'ASC';
$limit = 24;
$page = 1;
$filter_data_category = array(
filter_category_id' => $main_category_id,
'filter_filter'      => $filter,
'sort'               => $sort,
'order'              => $order,
'start'              => ($page - 1) * $limit,
'limit'              => $limit
);

Эти настройки взяты из файла контроллера категории (catalog/controller/product/category.php) при получении товаров.

Далее получаем массив товаров:

$result_products_in_category = $this->model_catalog_product->getProducts($filter_data_category); // Получаем товары главной категории

Обрабатываем полученный массив циклом foreach.
Берем из файла контроллера товара при получении сопутствующих товаров, т.е. после строчки

$results = $this->model_catalog_product->getProductRelated($this->request->get['product_id']);

И, наконец, загружаем шаблон модуля:

return $this->load->view('extension/module/products_incategory', $data);

6. Из шаблона товара копируем блок с сопутствующими товарами новый файл шаблона нашего модуля. А теперь немного изменим.
До блока

< div class="product-thumb transition"> 
вставим еще:
< section class="products_in_category"> // мы делаем блок на всю ширину внешнего блока
< div class="container"> // по правилам bootstrap
< div class="title">
< h2> // вывод названия блока
< /div>
< div class="slider"> 
< div class="products_in_category_slider owl-carousel">// для подключения owl-carousel
 // ну и цикл вывода товаров из той же категории, что и текущий товар.

И снизу под закрывающим тегом
< /div>
от дива с классом product-thumb :
< ?php } ?> // закрывающая скобка цикла
< /div> // закрывающий тег для дива с классом owl-carousel
< /div> // закрывающий тег для дива с классом slider
< /div> // закрывающий тег для дива с классом containe
< /section> // закрываем секцию

7. Создаем в папке catalog/veiw папку javascript и кладем туда скрипт карусели owl.carousel.min.js.
Она мне больше нравится, но вы можете подключить и другую карусель.

На этом все!
Модуль готов.
Заливаем готовые файлы на сервер и радуемся ).

Пример работы модуля.


Поделиться

А теперь поговорим о вашем проекте!