Вопрос Как вывести все дочерние товары из этой же категории в карточке товара

  • Автор темы Автор темы tp-20
  • Дата начала Дата начала

tp-20

Пользователь
Сообщения
2
Реакции
0
opencart 2.1.0.1.
В карточке товара нужно вывести все товары из этой же категории. т.е. все дочерние товары.

Нашёл такой мануал, там выводятся вообще все товары. но взял его за основу.
подскажите, что поменять в этом коде (скриншот 1), чтобы выводились товары из текущей категории?

$results = $this->model_catalog_product->getProducts($filter_data); - в этой строке не подхватывается ID категории и выводятся вообще все имеющиеся товары. Думаю здесь в фильтре загвоздка.

Весь код целиком: (идёт в Файл controller/product/product.php )

$parts = explode('_', (string)$this->request->get['path']);
$category_id = (int)array_pop($parts);

$filter_data = array(
'filter_category_id' => $category_id
);


$data['products_variant'] = array();
$results = $this->model_catalog_product->getProducts($filter_data);

foreach ($results as $result) {
if ($result['image']) {
$image = 'image/' . $result['image'];
} else {
$image = $this->model_tool_image->resize('placeholder.png', $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height'));
}

$data['products_variant'][] = array(
//'category_id' => $category_id,
'name' => $result['name'],
'image' => $image,
'href' => $this->url->link('product/product', 'path=' . $this->request->get['path'] . '&product_id=' . $result['product_id'] . $url)
);
}
 

Вложения

  • Screenshot_1.jpg
    Screenshot_1.jpg
    92 КБ · Просмотры: 1
Решение
Чтобы выводить товары из текущей категории на странице товара в OpenCart 2.1.0.1, внесите следующие изменения в ваш код:

1. Правильное получение ID категории:
PHP:
Развернуть Свернуть Скопировать
   // Если товар открыт через категорию (path присутствует в URL)
   if (isset($this->request->get['path'])) {
       $parts = explode('_', (string)$this->request->get['path']);
       $category_id = (int)array_pop($parts);
   } else {
       // Если path отсутствует, попробуем получить первую категорию товара
       $categories = $this->model_catalog_product->getCategories($this->request->get['product_id']);
       if ($categories) {
           $category_id = (int)$categories[0]['category_id'];
       } else {
           $category_id = 0; // Если категорий нет, выводим...
Чтобы выводить товары из текущей категории на странице товара в OpenCart 2.1.0.1, внесите следующие изменения в ваш код:

1. Правильное получение ID категории:
PHP:
Развернуть Свернуть Скопировать
   // Если товар открыт через категорию (path присутствует в URL)
   if (isset($this->request->get['path'])) {
       $parts = explode('_', (string)$this->request->get['path']);
       $category_id = (int)array_pop($parts);
   } else {
       // Если path отсутствует, попробуем получить первую категорию товара
       $categories = $this->model_catalog_product->getCategories($this->request->get['product_id']);
       if ($categories) {
           $category_id = (int)$categories[0]['category_id'];
       } else {
           $category_id = 0; // Если категорий нет, выводим пустой список
       }
   }

2. Добавление фильтрации по категории:
PHP:
Развернуть Свернуть Скопировать
   $filter_data = array(
       'filter_category_id' => $category_id,
       // Опциональные параметры (если нужны)
       'start'              => 0,
       'limit'             => 100, // Лимит товаров, например 100
       'sort'              => 'p.sort_order',
       'order'             => 'ASC'
   );

3. Полный исправленный код:
PHP:
Развернуть Свернуть Скопировать
// Получаем ID текущей категории
   if (isset($this->request->get['path'])) {
       $parts = explode('_', (string)$this->request->get['path']);
       $category_id = (int)array_pop($parts);
   } else {
       $categories = $this->model_catalog_product->getCategories($this->request->get['product_id']);
       $category_id = $categories ? (int)$categories[0]['category_id'] : 0;
   }

   // Фильтр данных
   $filter_data = array(
       'filter_category_id' => $category_id,
       'start'              => 0,
       'limit'             => 100,
       'sort'              => 'p.sort_order',
       'order'             => 'ASC'
   );

   // Получаем товары
   $results = $this->model_catalog_product->getProducts($filter_data);

   // Формируем данные для вывода
   $data['products_variant'] = array();
   foreach ($results as $result) {
       // ... ваш код обработки товаров ...
   }

Объяснение изменений:

  • Проверка наличия path: Если товар открыт через категорию, path будет содержать её ID. Если нет (например, прямой доступ к товару), код автоматически получит первую категорию товара.
  • Фильтр filter_category_id: Корректно передаётся в модель, чтобы выбрать только товары из нужной категории.
  • Добавлены параметры sort и order: Для контроля сортировки (можно настроить под свои нужды).

Дополнительные советы:

  1. Проверьте модель [B]getProducts[/B]: Убедитесь, что метод getProducts в model/catalog/product.php поддерживает фильтр filter_category_id. В стандартной модели это реализовано.
  2. Лимит товаров: Установите 'limit' => 100 на своё усмотрение, чтобы избежать избыточной нагрузки.
  3. Шаблон вывода: Убедитесь, что в файле шаблона (например, product/product.tpl) выводится переменная $products_variant с нужной вёрсткой.

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

PHP:
Развернуть Свернуть Скопировать
// Получаем все дочерние категории текущей категории
$this->load->model('catalog/category');
$subcategories = $this->model_catalog_category->getCategories($category_id);
$category_ids = array($category_id);
foreach ($subcategories as $subcategory) {
    $category_ids[] = $subcategory['category_id'];
}

// Фильтр по всем ID категорий
$filter_data['filter_category_id'] = implode(',', $category_ids);
 
Последнее редактирование:
Решение
Чтобы выводить товары из текущей категории на странице товара в OpenCart 2.1.0.1, внесите следующие изменения в ваш код:
Большое спасибо за подробную инструкцию. Редко где встретишь, чтобы так всё по полочкам раскладывали. Спасибо!

На данный момент возникает ошибка - Fatal error: Call to a member function getProducts() on null
скорее всего на этой строке:
$results = $this->model_catalog_product->getProducts($filter_data);
Больше getProducts в файле controller/product/product.php нигде не встречается

В файле model/catalog/product.php в функции public function getProducts есть упоминание filter_category_id:
if (!empty($data['filter_category_id']))....
 
Назад
Сверху