Фильтр по атрибутам opencart 2.0

1с и web разработка

Чтобы сделать фильтр по атрибутам нужно купить/скачать и установить плагин.

Так я думал раньше. Что поменялось теперь и как я оседлал типовые фильтры 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, код которых привожу ниже

И не забудьте поменять префикс tk_ на тот, который установлен в Вашей базе

Недостатков у этого решения много. Список недостатков:

  1. Нет фильтров для страницы производителя
  2. Фильтры не отрабатывают на условие «И», когда выбраны значения из разных групп фильтра, т.е. нельзя отобрать все телефоны с LTE из группы стандарт связи «И» ОС Android из группы ОС. Будет сделана выборка «ИЛИ»
  3. Нет выбора атрибутов для переноса. Приходиться потом ручками убирать ненужные фильтры.
  4. Нет ajax обработки установки галочек

И это только то, что сразу бросилось в глаза. Наверняка есть еще и другие. Если Вы знаете о них — пишите в комментариях.

Предчувствуя первый вопрос — хочу сразу на него ответить.

Будет ли это работать в opencart 1.5?

Не знаю, не пробовал. Скорее всего будет после некоторой модификации или без.

9 комментариев

  1. Павел, Вы идёте в ногу со временем! Не первая Ваша публикация которая попадается мне в просторах интернета. Я с удовольствием протестирую как на Opencart 2.0.3.1 так и на 1.5.6.4. Уточните, будьте добры, как правильно использовать данный код? «И не забудьте поменять префикс tk_ на тот, который установлен в Вашей базе» если можно ткните как правильно 🙂 Заранее благодарен

  2. Александр:

    Понадобились небольшие правки.
    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;

  3. Алек:

    Здравствуйте! Как это сделать для конкретной категории для конкретного атрибута?

  4. Только вчера написал небольшой скриптик для импорта фильтров для всех категорий по атрибутам. Смотрю тут это реализовали через sql, неплохо, но не пробовал это в деле. Впринципе проще наверно это всё перекинуть на PHP, что я и сделал.
    Да, кстати, по умолчанию опенкарт выводит в фильтры данные с нулевыми значениями, это легко правится добавлением условия.
    Вобщем если кому то интересно — пишите, помогу чем смогу (сайт с контактами здесь study-time.ru)

  5. luckywalrus:

    Спасибо за простое и элегантное решение. Оно меня вдохновило на дальнейшее развитие. От себя добавлю несколько слов:

    Чтобы встроенные фильтры отрабатывали условие «И» нужно установить патч (бесплатный), который приводит логику работы фильтров к привычному и понятному виду (внтури группы — ИЛИ, т.е. процессор 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 и фильтрация идет через группы атрибутов, и тоже возникла проблема с выводом пустых значений в фильтре. Подскажите пожалуйста, где и что можно поправить, чтобы фильтр по группам атрибутов выводил не все значения атрибутов, а только актуальные для данной категории товаров. был бы очень признателен за помощь.

  6. Здравствуйте, на самом деле условие «И» очень полезное, когда речь об основных характеристиках товара. Спасибо за статью и правки.

  7. benson:

    Добрый день. Большое спасибо за статью.
    Я пробывал выполнить Ваш запрос в 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’

    Подскажите пожалуйсто как исправить этот баг

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *