Найти в Дзене

Делаем сложный фильтр для новостей при помощи Bitrix D7

Введение Примечание: Код написанный для конкретного проекта и этот текст несет исключительно информационную ценность, возможно кому-то пригодится, как вариант реализации в вашем проекте. Статья написана после того, как в реальном проекте появилась необходимость использовать сложные фильтры с большим набором условий и возможность простого масштабирования фильтрации. Было принято решение использовать ядро D7 и класс запросов Query для построения фильтра. Какая задача решалась Была база новостей с большим количеством различных параметром, например, таких как языковая версия новости, тип новости(Анонс, новость, мероприятие, видео и другие), отображать на определенном сайте или нет и множество других условий. Новостей было более 100 тыс., так что и производительность при выполнении запросов нужна была оптимальная. Процесс написания фильтра Еще одним из важных моментов было то, что данный фильтр необходимо было использоваться в разных компонентах, которые выводят новости для того, чтобы в ра
Оглавление

Введение

Примечание: Код написанный для конкретного проекта и этот текст несет исключительно информационную ценность, возможно кому-то пригодится, как вариант реализации в вашем проекте.

Статья написана после того, как в реальном проекте появилась необходимость использовать сложные фильтры с большим набором условий и возможность простого масштабирования фильтрации. Было принято решение использовать ядро D7 и класс запросов Query для построения фильтра.

Какая задача решалась

Была база новостей с большим количеством различных параметром, например, таких как языковая версия новости, тип новости(Анонс, новость, мероприятие, видео и другие), отображать на определенном сайте или нет и множество других условий. Новостей было более 100 тыс., так что и производительность при выполнении запросов нужна была оптимальная.

Процесс написания фильтра

Еще одним из важных моментов было то, что данный фильтр необходимо было использоваться в разных компонентах, которые выводят новости для того, чтобы в рамкам одного сайта на главной странице и странице со списком новостей были одни и те же новости. Чтобы не было, так сказать, рассинхрона между страницами, вынесли это в модуль.

Первое, что необходимо сделать при написании нового класса, это подключить модули, с которыми будем работать. В нашем случае достаточно было подключить модуль iblock и forumedia.common (собственная разработка для более удобного использования стандартного API).

Заранее необходимо продумать все возможные варианты фильтрации и учесть их при построении логики. А так все поля и свойства, которые вам необходимы.

Обрабатываем входные параметры и значения по умолчанию

Первым делом решил написать небольшой обработчик для входящий параметров и параметров по умолчанию, которые не зависят от контента, который фильтруется. За это отвечает функция initParams. В ней мы сразу узнаем админ ли текущий пользователь или нет, а также активные новости будем достать или любые (это необходимо, так как в проекте для админов свои кнопки для редактирования новостей, а создатели новости видят в добавок только свои новости).

Читайте также Bitrix: Популярный инструмент для управления бизнесом

Далее мы создали «справочники» возможных значений для свойств Языковая версия и Тип ресурса, на котором новость отображается и справочник Типов новости.  Так же обработали входящие значения для более удобного использования в дальнейшем.

В функции initLanguageList использовали ORM Bitrix с использованием кэша на 10 дней, так как нет смысла каждый раз получать список языков, он меняется очень редко, а может и никогда:)

Обратите внимание на обработку $params[‘SECTION’].Добавлена проверка, что мы передали ID раздела или символьный код, мы не разделяли название параметра для указания раздела на SECTION_ID и SECTION_CODE во имя своего удобства.

Думаю, суть понятна, что мы хотели сделать. Переходим к не менее  важной части — построение самого фильтра. Функция getFilter().

Строим фильтр

Тут все просто, думаю особых объяснений не требуется, если что-то не понятно, можете оставить комментарий, подскажу и помогу.

Хотелось бы отметить, что у нас реализована возможность поиска И по тегам, и по разделу, что вы можеет увидеть в коде.

return \Bitrix\Main\Entity\Query::filter() ->logic('or') ->where($this->filter) ->where($this->filterTags);

Исходный код фильтра

Смотреть код на источнике https://code-culture.ru/bitrix/bitrix-d7/delaem-slozhnyj-filtr-dlya-novostej-pri-pomoshhi-bitrix-d7/