Jump to content
  • entries
    4
  • comments
    52
  • views
    2,183

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


mpn2005

2,430 views

 Share

Для различных типов товаров часто возникает необходимость вывести товары в рекомендуемые автоматически, по определённому критерию. Нередко товары группируются по коллекциям, но штатными средствами 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_', он у вас может отличаться или отсутствовать.

 Share

18 Comments


Recommended Comments

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

Edited by Алексей
Link to comment
В 27.05.2022 в 15:38, Алексей сказал:

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

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

Цитата

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

 

Link to comment
В 27.05.2022 в 15:38, Алексей сказал:

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

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

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

Link to comment
2 часа назад, Tom сказал:

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

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

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

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

Link to comment

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

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

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

Ну итд итп.

Link to comment

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

 

Link to comment

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

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

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

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

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

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

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

Цитата

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

 

Link to comment
56 минут назад, Tom сказал:

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

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

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

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

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

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

 

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

Link to comment

Спасибо, именно эта инструкция помогла мне для создания коллекций у светильников. Но есть ли вариант к примеру еще сделать альтернативу, что если товаров больше 20 добавить ссылку на посадочную страницу с этой коллекцией? К примеру есть коллекций "Star" в ней 700+ товаров, выводим рандомные 20 товаров и добавляем ссылку "Посмотреть всю коллекцию" и брать ссылку из другого поля?

Link to comment
В 18.01.2023 в 12:59, greendaytoday сказал:

Спасибо, именно эта инструкция помогла мне для создания коллекций у светильников. Но есть ли вариант к примеру еще сделать альтернативу, что если товаров больше 20 добавить ссылку на посадочную страницу с этой коллекцией? К примеру есть коллекций "Star" в ней 700+ товаров, выводим рандомные 20 товаров и добавляем ссылку "Посмотреть всю коллекцию" и брать ссылку из другого поля?

 

Link to comment
В 18.01.2023 в 13:59, greendaytoday сказал:

Спасибо, именно эта инструкция помогла мне для создания коллекций у светильников. Но есть ли вариант к примеру еще сделать альтернативу, что если товаров больше 20 добавить ссылку на посадочную страницу с этой коллекцией? К примеру есть коллекций "Star" в ней 700+ товаров, выводим рандомные 20 товаров и добавляем ссылку "Посмотреть всю коллекцию" и брать ссылку из другого поля?

Тут уже так просто не сделать. Нужно делать отдельный контроллер, для вывода всех этих товаров.

Если делать ссылку в доп поле, то будет проще. Но по заполнению - это будет сущий ад. Работать с этим будет тяжело, особенно если товаров много.

 

В 20.01.2023 в 00:48, greendaytoday сказал:

А модуль тут при чем? 

А он как раз и позволяет отобрать товары по критерию и из адмнки налепить нужных страниц.

Link to comment
В 21.01.2023 в 22:25, mpn2005 сказал:

Тут уже так просто не сделать. Нужно делать отдельный контроллер, для вывода всех этих товаров.

Если делать ссылку в доп поле, то будет проще. Но по заполнению - это будет сущий ад. Работать с этим будет тяжело, особенно если товаров много.

 

А он как раз и позволяет отобрать товары по критерию и из адмнки налепить нужных страниц.

будьте добры, скажите, вот я не использую поле EAN , ну и чтобы не заполнять эти поля, могу я использовать модель для подборки рекомендуемых? заменив в коде ниже "ean" на "model"

я в рекомендемые хочу добавлять только товары из категории, а в поле "model" у меня как раз категория прописана. И еще такой момент, по сколько добавляется товаров? В идеале для меня чтобы по 4 было

public function getProductRelatedCollection($product) {
    // Поле товара, по которому идёт выборка коллекции
    $collection_field = 'ean';
Link to comment
В 23.04.2023 в 18:13, Леонид сказал:

заменив в коде ниже "ean" на "model"

Да. Можно.

 

В 23.04.2023 в 18:13, Леонид сказал:

В идеале для меня чтобы по 4 было

Можете добавить к запросу выборки "LIMIT 4" если надо ограничить.

Link to comment
В 24.04.2023 в 15:45, mpn2005 сказал:

Да. Можно.

 

Можете добавить к запросу выборки "LIMIT 4" если надо ограничить.

и еще уточню: если так сделаю, после каждого посещения страницы они (рекомендованные) будут меняться или как при стандартном функционале что назначил товару, то и будет?

Link to comment
В 24.04.2023 в 17:51, Леонид сказал:

и еще уточню: если так сделаю, после каждого посещения страницы они (рекомендованные) будут меняться или как при стандартном функционале что назначил товару, то и будет?

Это зависит от используемой сортировки.

Можно отсортировать по нужному критерию и они будут те же.

Можно сделать сортировку по RAND() и они будут всё время разные.

 

Link to comment
Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...