- 2
About This File
Эта простая модификация изменяет логику стандартного фильтра.
Лучше объяснить на примере.
Допустим есть фильтры:
Цвет:
- синий
- зеленый
Размер:
- большой
- маленький
Если пользователь выберет напр. "синий", "зеленый" И "большой" то стандартный фильтр OpenCart покажет все товары, у которых есть хотя бы один из фильтров: "синий" ИЛИ "зеленый" ИЛИ "большой"
После установки этой модификации будут отображаться товары, у которых есть фильтры И ("синий" ИЛИ "зеленый") И "большой"
То есть, фильтры из одной группы работают по логике "ИЛИ", стандартно, а фильтры из разных групп по логике "И", что более логично, правильно и удобно для пользователя.
На оф. сайте есть модуль, который делает тоже самое, что и этот:
https://www.opencart.com/index.php?route=extension/extension/info&extension_id=23603
он рабочий, если судить по отзывам, но когда я открыл код этого модуля, то увидел там вот это:
// FixFilter
$minq=$this->db->query("
SELECT id.product_id FROM(SELECT
product_id, count(i.product_id) as t, c.filter_group as b
FROM
(SELECT
f.filter_id, f.product_id, p.filter_group_id
FROM
". DB_PREFIX ."product_filter f
left join ". DB_PREFIX ."filter p ON p.filter_id = f.filter_id
where
p.filter_id IN (" . implode(',', $implode) . ")
GROUP BY product_id , filter_group_id) as i,
(select
count(distinct filter_group_id) as filter_group
from
". DB_PREFIX ."filter_description f_b
WHERE f_b.filter_id in (" . implode(',', $implode) . ")) as c
GROUP BY product_id
HAVING t = as id");
$min=array();
for($x=0;$xrows);$x++){
foreach($minq->rows[$x] as $value){
$min[]=$value;
}
}
$imp=implode(',',$min);
// FixFilter END
// FixFilter
if(isset($filters)){
if(!count($min)){
$imp='0000000';
}
$sql .= " AND p.product_id IN(".$imp.")";
}
// FixFilter END
Мне это решение не понравилось и я решил написать свой вариант, который на мой взгляд получился более элегантным, простым и, возможно, даже и более быстрым (скорость этих 2-х решений я не проверял, если кто-то это сможет сделать - буду благодарен).
Поэтому теперь у пользователей есть выбор какое решение использовать.
Модуль тестировался на OpenCart 2.1.0.2, на других версиях - не тестировался, у кого есть возможно - протестируйте.