Перейти к содержанию
  • записи
    3
  • комментариев
    16
  • просмотров
    456

Автоматический вывод товаров коллекции в рекомендуемые товары


mpn2005

471 просмотр

Для различных типов товаров часто возникает необходимость вывести товары в рекомендуемые автоматически, по определённому критерию. Нередко товары группируются по коллекциям, но штатными средствами OpenCart нет возможности их корректно объединить и добавить автоматически друг к другу как рекомендуемые товары. 

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

Данная доработка не затрагивает шаблоны, поэтому подходит для любой версии движка и сборки.

 

Для примера рассматривается вариант объединения в коллекции по совпадению поля EAN. 

По принципу - если поле EAN не пустое, то выводим такие товары в рекомендуемые.

 

В файле catalog/controller/product/product.php

Находим строку:

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

И заменяем её на это:

$results = $this->model_catalog_product->getProductRelatedCollection($product_info);

 

В файле catalog/model/catalog/product.php

Перед строкой:

public function getProductRelated($product_id) {

Добавляем:

public function getProductRelatedCollection($product) {
    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';
    
    $product_data = array();

    if (!empty($product[$collection_field])) {
        $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE product_id != '" . (int)$product['product_id'] . "' AND status = '1' AND `" . $this->db->escape($collection_field) . "` LIKE '" . $this->db->escape($product[$collection_field]) . "' ORDER BY sort_order");

        foreach ($query->rows as $result) {
            $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
        }
    }

    return $product_data;
}

 

Если нужно выбирать товары только того же производителя, то функция должна выглядеть так:

public function getProductRelatedCollection($product) {
    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';
    
    $product_data = array();

    if (!empty($product[$collection_field])) {
        $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE product_id != '" . (int)$product['product_id'] . "' AND status = '1' AND manufacturer_id = '" . (int)$product['manufacturer_id'] . "' AND `" . $this->db->escape($collection_field) . "` LIKE '" . $this->db->escape($product[$collection_field]) . "' ORDER BY sort_order");

        foreach ($query->rows as $result) {
            $product_data[$result['product_id']] = $this->getProduct($result['product_id']);
        }
    }

    return $product_data;
}

 

Если у вас много товаров, то стоит зайти в phpMyAdmin и добавить индекс для поля EAN. Это ускорит выборку товаров для коллекции. Добавить индекс можно таким запросом:

ALTER TABLE `oc_product` ADD INDEX `ean` (`ean`)

Обратите внимание на префикс 'oc_', он у вас может отличаться или отсутствовать.

10 Комментариев


Рекомендуемые комментарии

Спасибо за статью, не увидел только, для всех версий подходит это решение? И если это возможно, то как вывести если в атрибуте прописана коллекция?

Изменено пользователем Алексей
Ссылка на комментарий
В 27.05.2022 в 15:38, Алексей сказал:

Спасибо за статью, не увидел только, для всех версий подходит это решение? И если это возможно, то как вывести если в атрибуте прописана коллекция?

Вот тут написано.

Цитата

Данная доработка не затрагивает шаблоны, поэтому подходит для любой версии движка и сборки.

 

Ссылка на комментарий
В 27.05.2022 в 15:38, Алексей сказал:

если в атрибуте прописана коллекция?

Тут надо добавить запрос атрибута товара. И поменять выборку.

Как будет время, допишу данный момент.

Ссылка на комментарий
2 часа назад, Tom сказал:

А что, если по схожему названию товаров?

Тоже можно, но тут уже надо определять какой-то чёткий критерий.

Например по совпадению последнего слова в названии. Или иметь в названии какой-то чёткий разделитель для анализа.

Частичное совпадение по тексту - сам по себе не чёткий критерий, без дополнительного уточнения.

Ссылка на комментарий

Ну из тех просьб, что мне озвучивают чаще это первые скажем несколько символов в названии, так как обычно полное название содержит уже какие то особенности.

Как вариант магазины мебели (шкаф, кровать, диван, банкетка).

Рыболовные снасти (леска, удилище, блесна).

Ну итд итп.

Ссылка на комментарий

Сделал модификатор для вывода коллекций в товарах, по описанному принципу, проверил - все работает. Если кому надо, выкладываю тут. Это мой первый опыт создания модификатора.

 

Ссылка на комментарий

Читал недавно описание одного из модулей модуля "Серии товаров".

Так вот он объединяет товары по схожему значению в поле mpn.

Имеем как вариант 15-20 товаров , у которых в поле mpn, вписано например "2022".

Получаем в карточке товара комплект схожих товаров...

Эта тема близка к данному решению.

Единственное, что принцип объединения разный.

Ну если я конечно правильно понял :
 

Цитата

По принципу - если поле EAN не пустое, то выводим такие товары в рекомендуемые.

 

Ссылка на комментарий
56 минут назад, Tom сказал:

Единственное, что принцип объединения разный.

Ну если я конечно правильно понял :

Получается всё так же.

Только поле EAN.

Но его легко и поменять:

    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';

 

Если поле пустое, то товары не тянутся, иначе туда все товары магазина могут улететь, что не очень хорошо.

Ссылка на комментарий
Гость
Добавить комментарий...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...