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