Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

Исправление логики работы стандартного фильтра 1.0

   (7 отзывов)    Все дополнения автора

sv2109
  764 11 162

1 изображение



    Создайте аккаунт или авторизуйтесь для скачивания файла

  • +1 2

Информация о файле

Эта простая модификация изменяет логику стандартного фильтра.

Лучше объяснить на примере.

Допустим есть фильтры:

Цвет:

- синий

- зеленый

Размер:

- большой

- маленький

Если пользователь выберет напр. "синий", "зеленый" И "большой" то стандартный фильтр 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 = B) 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, на других версиях - не тестировался, у кого есть возможно - протестируйте.



sv2109's Other Downloads


Отзывы пользователей

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.