Вывод всех товаров коллекции в рекомендуемые товары OC2, OC3


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

 

Если у вас есть вопросы или пожелания, напишите нам в Telegram