Чтобы сделать фильтр по атрибутам нужно купить/скачать и установить плагин.
Так я думал раньше. Что поменялось теперь и как я оседлал типовые фильтры opencart — читайте дальше.
Для opencart 2.3 и 3.0 вы можете скачать бесплатный фильтр:
2.3 — http://ocroshka.ru/products/prosto-filtr-opencart-2-3/
3.0 — http://ocroshka.ru/products/prosto-filtr-opencart/
Для начала я хорошенько изучил таблицы opencart 2.0, а затем накидал 1,5 десятка простых запросов MySQL, код которых привожу ниже
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
TRUNCATE TABLE tk_filter_group_description; TRUNCATE TABLE tk_filter_group; TRUNCATE TABLE tk_filter; TRUNCATE TABLE tk_filter_description; TRUNCATE TABLE tk_category_filter; TRUNCATE TABLE tk_product_filter; INSERT INTO tk_filter_group_description (filter_group_id, language_id, name) SELECT attribute_id, language_id, name FROM tk_attribute_description; INSERT INTO tk_filter_group (filter_group_id, sort_order) SELECT attribute_id, 0 FROM tk_attribute_description; ALTER TABLE tk_filter ADD name VARCHAR(256); ALTER TABLE tk_filter ADD language_id INT(11); INSERT INTO tk_filter (filter_group_id, sort_order, name, language_id) SELECT attribute_id, 0, text, language_id FROM tk_product_attribute GROUP BY attribute_id,text; INSERT INTO tk_filter_description (filter_id, filter_group_id, language_id, name) SELECT filter_id, filter_group_id, language_id, name FROM tk_filter; INSERT INTO tk_product_filter (product_id, filter_id) SELECT pa.product_id, pf.filter_id FROM tk_product_attribute pa LEFT JOIN tk_filter pf ON pf.name = pa.text AND pf.filter_group_id = pa.attribute_id; ALTER TABLE tk_filter DROP name; ALTER TABLE tk_filter DROP language_id; INSERT INTO tk_category_filter (category_id, filter_id) SELECT pc.category_id, pf.filter_id FROM tk_product_to_category pc LEFT JOIN tk_product_filter pf ON pc.product_id = pf.product_id GROUP BY pc.category_id,pf.filter_id |
И не забудьте поменять префикс tk_ на тот, который установлен в Вашей базе
Недостатков у этого решения много. Список недостатков:
- Нет фильтров для страницы производителя
- Фильтры не отрабатывают на условие «И», когда выбраны значения из разных групп фильтра, т.е. нельзя отобрать все телефоны с LTE из группы стандарт связи «И» ОС Android из группы ОС. Будет сделана выборка «ИЛИ»
- Нет выбора атрибутов для переноса. Приходиться потом ручками убирать ненужные фильтры.
- Нет ajax обработки установки галочек
И это только то, что сразу бросилось в глаза. Наверняка есть еще и другие. Если Вы знаете о них — пишите в комментариях.
Предчувствуя первый вопрос — хочу сразу на него ответить.
Будет ли это работать в opencart 1.5?
Не знаю, не пробовал. Скорее всего будет после некоторой модификации или без.
9 комментариев
Павел, Вы идёте в ногу со временем! Не первая Ваша публикация которая попадается мне в просторах интернета. Я с удовольствием протестирую как на Opencart 2.0.3.1 так и на 1.5.6.4. Уточните, будьте добры, как правильно использовать данный код? «И не забудьте поменять префикс tk_ на тот, который установлен в Вашей базе» если можно ткните как правильно 🙂 Заранее благодарен
Понадобились небольшие правки.
INSERT INTO tk_filter_group
(filter_group_id,
sort_order)
SELECT DISTINCT attribute_id,
0
FROM tk_attribute_description;
INSERT INTO tk_product_filter
(product_id,
filter_id)
SELECT DISTINCT pa.product_id,
pf.filter_id
FROM tk_product_attribute pa
LEFT JOIN oc_filter pf ON pf.name = pa.text AND
pf.filter_group_id = pa.attribute_id;
Здравствуйте! Как это сделать для конкретной категории для конкретного атрибута?
Только вчера написал небольшой скриптик для импорта фильтров для всех категорий по атрибутам. Смотрю тут это реализовали через sql, неплохо, но не пробовал это в деле. Впринципе проще наверно это всё перекинуть на PHP, что я и сделал.
Да, кстати, по умолчанию опенкарт выводит в фильтры данные с нулевыми значениями, это легко правится добавлением условия.
Вобщем если кому то интересно — пишите, помогу чем смогу (сайт с контактами здесь study-time.ru)
Спасибо за простое и элегантное решение. Оно меня вдохновило на дальнейшее развитие. От себя добавлю несколько слов:
Чтобы встроенные фильтры отрабатывали условие «И» нужно установить патч (бесплатный), который приводит логику работы фильтров к привычному и понятному виду (внтури группы — ИЛИ, т.е. процессор 1 или процессор 2), между группами — И (т.е. монитор 17 дюймов И диск 1 Тб).
Ненужные фильтры отфильтровываются по наличию/отсутствия товаров в этих фильтров.
Открываем файл \catalog\controller\module\filter.php, ищем там строки:
$childen_data[] = array(‘filter_id’ =>…
И обрамляем их условием проверки. Самый простой вариант вот так вот:
if (($totalProducts=$this->model_catalog_product->getTotalProducts($filter_data))>0) {
…
}
Если поиск по фильтру не дает результата — он не выводится. Таким образом, на странице остаются только те фильтры, которые нам нужны.
Так что вполне жизнеспособное решение. Работает очень быстро, поскольку, фактически, отбор по критериями происходит на этапе формирования базы фильтров — при рендеринге мы лишь показываем записи, отобранные ранее.
На самом деле не всегда правильно делать условие И вместо условия ИЛИ. Тут палка о двух концах. В 1-ом случае (И) человек может не знать о товаре какие-то атрибуты и выбрав 2 параметра система не выдаст ничего. Второй же случай наоборот, выдаст больше товаров чем надо. Чисто на мой взгляд, лучше вывести больше товаров, чем ничего.
Здравствуйте. У меня сайт на opencart 1.5.6.4 и фильтрация идет через группы атрибутов, и тоже возникла проблема с выводом пустых значений в фильтре. Подскажите пожалуйста, где и что можно поправить, чтобы фильтр по группам атрибутов выводил не все значения атрибутов, а только актуальные для данной категории товаров. был бы очень признателен за помощь.
Здравствуйте, на самом деле условие «И» очень полезное, когда речь об основных характеристиках товара. Спасибо за статью и правки.
Добрый день. Большое спасибо за статью.
Я пробывал выполнить Ваш запрос в phpmyadmin
Использовал ваш код без правок, только изменил на свой префикс
Но запрос не срабатывает выдает ошибку
Ошибка
SQL-запрос: Документация
INSERT INTO oc_filter_group(
filter_group_id,
sort_order
)
SELECT attribute_id, 0
FROM oc_attribute_description;
Ответ MySQL: Документация
#1062 — Duplicate entry ‘1’ for key ‘PRIMARY’
Подскажите пожалуйсто как исправить этот баг