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

Установка, ошибки при работе с модулями, интеграции и прочее
tp-20
Сообщения: 5
Зарегистрирован: 10.08.2024

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

Непрочитанное сообщение tp-20 »

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 (1).jpg
Screenshot_1 (1).jpg (119.19 КБ) 8851 просмотр
specialforce22
Сообщения: 118
Зарегистрирован: 18.03.2022
Поблагодарил: 22 раз
Спасибо: 18 раз

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

Непрочитанное сообщение specialforce22 »

tp-20 писал(а): 22 фев 2025, 23:17 opencart 2.1.0.1.
В карточке товара нужно вывести все товары из этой же категории
Может, проще модуль? - https://liveopencart.ru/opencart-moduli ... ibutam-1-2
Аватара пользователя
Tom
Разработчик дополнений
Сообщения: 199
Зарегистрирован: 10.03.2022
Откуда: Казахстан - Алматы
Поблагодарил: 10 раз
Спасибо: 82 раз

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

Непрочитанное сообщение Tom »

Код: Выделить всё

public function getProductRelatedByCategory($product_id, $limit = 10) {
    // Пробуем кешировать это. Ранее добавили лимит в 10 шт.
    $cache_key = 'product.related.category.' . (int)$product_id . '.' . (int)$limit;

    // Может, оно уже в кеше?
    $product_data = $this->cache->get($cache_key);

    // Если нет пробуем заново
    if (!$product_data) {
        $product_data = array();

        // Получаем категории товара.
        $query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");

        // Если товар хоть к чему-то относится.
        if ($query->num_rows) {
            // Извлекаем ID категорий. 
            $category_ids = array_column($query->rows, 'category_id');

            // Теперь получаем связанные товары.
            $related_query = $this->db->query("SELECT DISTINCT p.product_id
                FROM " . DB_PREFIX . "product p
                LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)
                WHERE p2c.category_id IN (" . implode(',', $category_ids) . ")
                AND p.product_id != '" . (int)$product_id . "'
                AND p.status = '1'
                AND p.quantity > 0 // И, конечно, только то, что есть в наличии.
                ORDER BY p.sort_order ASC
                LIMIT " . (int)$limit);

            // Что-то нашлось.
            if ($related_query->num_rows) {
                // Извлекаем ID связанных товаров.
                $product_ids = array_column($related_query->rows, 'product_id');

                // Загружаем модель. 
                $this->load->model('catalog/product');

                // Получаем данные товаров.
                $products = $this->model_catalog_product->getProducts(array('filter_product_id' => $product_ids));

                // Формируем массив с данными. 
                foreach ($products as $product) {
                    $product_data[$product['product_id']] = $product;
                }
            }
        }

        // Сохраняем в кеш.
        $this->cache->set($cache_key, $product_data);
    }

    // Возвращаем массив. 
    return $product_data;
}
 
tp-20
Сообщения: 5
Зарегистрирован: 10.08.2024

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

Непрочитанное сообщение tp-20 »

specialforce22 писал(а): 24 фев 2025, 11:41 Может, проще модуль
поставил модуль. выводит непонятно для меня. иногда правильно, иногда рандомно, иногда все, иногда не все товары из текущей категории.
пример на скриншотах.

1 - вот есть три товара в категории - эспандеры.
2 - открываем первый товар. всё правильно - предлагает все товары из этой же категории кроме текущего товара.
3 - тут уже непонятно. предлагает только один товар.
4 - тут предлагает один товар из этой категории и четыре вообще из другой - кистевые эспандеры, вообще не в тему.
5 - пример с резинкой. почему-то предлагает только 5 других товаров, хотя в настройке в модуле лимит указан 10. где остальные - непонятно.

6 - настройки модуля "Похожие товары"
7 - как указана категория к товару в админке - аналогично ко всем остальным.
Вложения
7
7
7.jpg (39.6 КБ) 8345 просмотров
6
6
6.jpg (69.41 КБ) 8345 просмотров
5
5
5.jpg (119.81 КБ) 8345 просмотров
4
4
4.jpg (107.12 КБ) 8345 просмотров
3
3
3.jpg (94.95 КБ) 8345 просмотров
2
2
2.jpg (92.88 КБ) 8345 просмотров
1
1
1.jpg (236.69 КБ) 8345 просмотров
tp-20
Сообщения: 5
Зарегистрирован: 10.08.2024

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

Непрочитанное сообщение tp-20 »

Tom писал(а): 24 фев 2025, 18:33

Код: Выделить всё

public function getProductRelatedByCategory($product_id, $limit = 10) {
...
    return $product_data;
}
вставил ваш код в контроллер. обращение к БД должно же быть только в модели? ваш код нужно как-то раскидать по файлам? как вывести в шаблон - тоже не понял.
в шаблоне вывожу вар_дампом $product_data, $product, $cache_key - выводит NULL
$products - выводит весь массив данных, но упоминания о категории там нет 
Аватара пользователя
devimirochnik
Разработчик дополнений
Сообщения: 195
Зарегистрирован: 14.04.2022
Откуда: Россия
Мои дополнения: devimirochnik
Поблагодарил: 3 раз
Спасибо: 14 раз

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

Непрочитанное сообщение devimirochnik »

Ещё можете попробовать слинковать через https://liveopencart.ru/opencart-moduli ... duktov-seo Правда если категорий много, то придётся немного времени потратить для настройки. И также модуль заполняет только стандартную таблицу рекомендуемых (только в версии ниже 2.3, от 2.3 и выше там больше настроек).
Мои модули: Оптимизация, SEO, Скидки, Отчёты и прочее

Оказываю услуги поддержки и выполнения различного рода задач для сайтов (допилы) в рамках самозанятости (фриланс). Стоимость и прочее зависит от задач. График ненормированный, но дело делаю.
specialforce22
Сообщения: 118
Зарегистрирован: 18.03.2022
Поблагодарил: 22 раз
Спасибо: 18 раз

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

Непрочитанное сообщение specialforce22 »

tp-20 писал(а): 27 фев 2025, 23:57
specialforce22 писал(а): 24 фев 2025, 11:41 Может, проще модуль
поставил модуль. выводит непонятно для меня.
Закономерно, что выводит непонятное, если качать модули у пиратов...
Я давал ссылку на модуль и автора, который оказывает поддержку.

В целом, учитывая ваш выбор, дельнейшие попытки "заставить" сайт работать как надо, не имеют смысла. В основе сайта хлам, который может кишеть вирусами.

Используйте официальные дополнения, к ним прилагается профессиональная поддержка авторов!
 
Ответить