Разобрался сам, надеюсь что кому то поможет мое решение:
Открываем файл catalog\model\catalog\product.php
Вместо строки (примерно 100 строка):
$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)";
Вставляем:
$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf_1 ON (p2c.product_id = pf_1.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";
$fid_array = array();
$filters = explode(',', $data['filter_filter']);
foreach ($filters as $filter_id) {
$fid_array[] = (int)$filter_id;
}
$query = $this->db->query("SELECT COUNT(DISTINCT filter_group_id) AS num_fgid FROM " . DB_PREFIX . "filter_description WHERE filter_id IN(" . implode(',', $fid_array) . ")");
if(!empty($query->row['num_fgid'])) {
for ($thisgrp = 2; $thisgrp <= $query->row['num_fgid']; $thisgrp++) {
$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf_" . $thisgrp . " ON (p2c.product_id = pf_" . $thisgrp . ".product_id) ";
}
}
Дальше вместо (Примерно 130 строка):
$implode = array();
$filters = explode(',', $data['filter_filter']);
foreach ($filters as $filter_id) {
$implode[] = (int)$filter_id;
}
$sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
Вставляем:
$query = $this->db->query("SELECT fd.filter_group_id, fd.filter_id, n.num_sel_filters_in_grp FROM " . DB_PREFIX . "filter_description fd left join (SELECT filter_group_id, count(filter_group_id) as num_sel_filters_in_grp FROM " . DB_PREFIX . "filter_description WHERE filter_id IN (" . implode(',', $fid_array) . ") GROUP BY filter_group_id) as n on fd.filter_group_id = n.filter_group_id WHERE filter_id IN (" . implode(',', $fid_array) . ") GROUP BY fd.filter_group_id, fd.filter_id");
if ($query->num_rows) {
$g_count = 0;
$f_count = 0;
$last_fgid = -1;
foreach ($query->rows as $frow) {
$f_count += 1;
if ($frow['filter_group_id'] != $last_fgid) {
$g_count += 1;
$f_count = 1;
$last_fgid = $frow['filter_group_id'];
$sql .= " AND (pf_" . $g_count . ".filter_id = " . $frow['filter_id'];
}
else {
if ($frow['num_sel_filters_in_grp'] > 1) {
$sql .= " OR pf_" . $g_count . ".filter_id = " . $frow['filter_id'];
}
}
if ($f_count == $frow['num_sel_filters_in_grp']) {
$sql .= ")";
}
}
}
Дальше вместо (примерно 510 строка):
$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf ON (p2c.product_id = pf.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (pf.product_id = p.product_id)";
Вставляем
$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf_1 ON (p2c.product_id = pf_1.product_id) LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id)";
$fid_array = array();
$filters = explode(',', $data['filter_filter']);
foreach ($filters as $filter_id) {
$fid_array[] = (int)$filter_id;
}
$query = $this->db->query("SELECT COUNT(DISTINCT filter_group_id) AS num_fgid FROM " . DB_PREFIX . "filter_description WHERE filter_id IN(" . implode(',', $fid_array) . ")");
if(!empty($query->row['num_fgid'])) {
for ($thisgrp = 2; $thisgrp <= $query->row['num_fgid']; $thisgrp++) {
$sql .= " LEFT JOIN " . DB_PREFIX . "product_filter pf_" . $thisgrp . " ON (p2c.product_id = pf_" . $thisgrp . ".product_id) ";
}
}
Дальше вместо (примерно 517 строка):
$implode = array();
$filters = explode(',', $data['filter_filter']);
foreach ($filters as $filter_id) {
$implode[] = (int)$filter_id;
}
$sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
Вставляем
$query = $this->db->query("SELECT fd.filter_group_id, fd.filter_id, n.num_sel_filters_in_grp FROM " . DB_PREFIX . "filter_description fd left join (SELECT filter_group_id, count(filter_group_id) as num_sel_filters_in_grp FROM " . DB_PREFIX . "filter_description WHERE filter_id IN (" . implode(',', $fid_array) . ") GROUP BY filter_group_id) as n on fd.filter_group_id = n.filter_group_id WHERE filter_id IN (" . implode(',', $fid_array) . ") GROUP BY fd.filter_group_id, fd.filter_id");
if ($query->num_rows) {
$g_count = 0;
$f_count = 0;
$last_fgid = -1;
foreach ($query->rows as $frow) {
$f_count += 1;
if ($frow['filter_group_id'] != $last_fgid) {
$g_count += 1;
$f_count = 1;
$last_fgid = $frow['filter_group_id'];
$sql .= " AND (pf_" . $g_count . ".filter_id = " . $frow['filter_id'];
}
else {
if ($frow['num_sel_filters_in_grp'] > 1) {
$sql .= " OR pf_" . $g_count . ".filter_id = " . $frow['filter_id'];
}
}
if ($f_count == $frow['num_sel_filters_in_grp']) {
$sql .= ")";
}
}
}
У меня заработало на версии Opencart 1.5.5.1, там есть повторяющиеся строки, главное не удалить то что не нужно, ориентируйтесь по примерному номеру строки... Модуль который писал выше можно не использовать, достаточно только такого изменения.