Skip to content

maximaster/tools.finder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

25 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

maximaster/tools.finder

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

Библиотека состоит глобально из 3х частей:

  • Абстрактный класс для всех Finder'ов
  • Реализация Finder'ов для следующих сущностей:
    • Инфоблок
    • Свойство инфоблока
    • Значение свойства типа "Список" инфоблока
    • Раздел инфоблока
    • Higload-блок
    • Группа пользователей
    • Тип цены
    • Свойство заказа
  • Обработчики событий на изменение CRUD операции с сущностями для обновления кеша

Пример использования

Основными входными точками для использования функционала являются методы get() и getId(). У каждой конкретной реализации Finder'а для сущности эти методы содержат разный перечень параметров (см. phpDoc для деталей). Например, для инфоблока данным методам необходимо передать строчный идентификатор типа инфоблока, а также символьный код самого инфоблока.

\Maximaster\Tools\Finder\Iblock::get('catalog', 'products');

, а для раздела инфоблока метод get() будет иметь другой набор параметров, а именно идентификатор инфоблока и символьный код раздела. Если вы хотите обратиться к какому-то разделу из инфоблока с каталогом, нужно воспользоваться следующим примером:

\Maximaster\Tools\Finder\IblockSection::get(
    \Maximaster\Tools\Finder\Iblock::get('catalog', 'products'),
    'section_code'
);

Метод get() получает массив с информацией о сущности. Там может быть набор различных полей, в будущем, возможно и всех полей сущности. Метод getId() получает только числовой идентификатор сущности

Более эффективная работа с идентификаторами

Для упрощения работы имеет смысл создать свои шорткаты, унаследовавшись от реализаций конкретных файндеров. Например для инфоблоков можно создать свой класс \Vendor\Finder\Iblock, унаследоваться от частной реализации Finder'а инфоблока \Maximaster\Tools\Finder\Iblock, и реализовать в нем методы для быстрого доступа к разным инфоблокам. Например, для того же каталога:

namespace Vendor\Finder;

class Iblock extends \Maximaster\Tools\Finder\Iblock 
{
    public static function catalog()
    {
        return static::get('catalog', 'products')
    }
}

Реализация собственных Finder'ов

Для создания файндера для конкретной сущности необходимо унаследоваться от AbstractFinder и реализовать несколько методов:

  • абстрактный метод getAdditionalCachePath(), который будет возвращать строку. Эта строка будет использоваться для построения адреса кеша Finder'а конкретной сущности
  • абстрактный метод requireModules(). Должен возвращать массив тех модулей, которые нужно подключить при использовании Finder'а
  • метод query(). Метод должен выполнить 2 вещи
    1. Сгенерировать инстанс \Bitrix\Main\Entity\Query и вернуть его. Нужно хорошенько подумать при составлении запроса. Не имеет смысла составлять запрос до конкретной сущности, лучше делать более широкий охват. Например, внутренняя реализация Finder'а для инфоблока выбирает и кеширует не один конкретный инфоблок, а список инфоблоков конкретного типа.
    2. Установить мета-информацию о сгенерированном запросе с помощью метода setQueryMetadata(), а именно:
    • Наименование поля, которое будет ключом массива со списком выбранных этим запросом сущностей
    • Значение данного поля, по которому нужно будет отобрать нужную сущность из списка
    • Массив дополнительных параметров, от которых будет зависеть кеш данного запроса Для подробностей проще будет изучить и просмотреть реализацию конкретных Finder'ов из поставки данной библиотеки, на деле все сильно проще, чем кажется.
  • В дополнение можно реализовать методы get() и getId(), чтобы автокомплит в IDE работал правильно, т.к. изначально данные методы принимают любое количество параметров
  • Есть возможность переопределить метод getItems(). Данный метод получает на вход запрос, сгенерированный в query(), а также название ключевого поля из мета-информации запроса. В этом методе вы можете повлиять на структуру сохраняемых в кеш данных. Для примера можно смотреть реализацию в AbstrractFinder

Кроме класса самого Finder'а, который будет выбирать данные из БД необходимо реализовать еще и методы очистки данных при их изменении. Например, если инфоблок меняет свой код, то очевидно, что нужно инвалидировать кеш, иначе вы не сможете получить идентификатор сущности по ее актуальному символьному коду. Для этого необходимо создать набор обработчиков OnAdd, OnUpdate и OnDelete, которые будут обновлять кеш выбранной сущности. Для инвалидации кеша необходимо использовать метод AbstractFinder::invalidateCache(). За примерами можно обращаться к классам из директории src/EventHandlers данной библиотеки. Все обработчики событий в библиотеке подключаются с помощью maximaster/tools.events.

WTF. Почему статика?

Потому-что ... Битрикс - статический синглтоновый глобальный монстр. Как только он даст возможность работать хотя бы в режиме ServiceLocator, тогда и поговорим.