Download the PHP package maximaster/tools.finder without Composer
On this page you can find all versions of the php package maximaster/tools.finder. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download maximaster/tools.finder
More information about maximaster/tools.finder
Files in maximaster/tools.finder
Package tools.finder
Short Description Библиотека, облегчающая поиск идентификаторов разных сущностей для 1С-Битрикс
License
Rated 5.00 based on 1 reviews
Informations about the package tools.finder
maximaster/tools.finder
Библиотека предоставляет функционал для выборки из БД идентификаторов различных сущностей. Это необходимо, чтобы отвязать свой код от необходимости использования в нем идентификаторов, как это обычно бывает
Библиотека состоит глобально из 3х частей:
- Абстрактный класс для всех Finder'ов
- Реализация Finder'ов для следующих сущностей:
- Инфоблок
- Свойство инфоблока
- Значение свойства типа "Список" инфоблока
- Раздел инфоблока
- Higload-блок
- Группа пользователей
- Тип цены
- Свойство заказа
- Обработчики событий на изменение CRUD операции с сущностями для обновления кеша
Пример использования
Основными входными точками для использования функционала являются методы get()
и getId()
. У каждой конкретной реализации Finder'а для сущности эти методы содержат разный перечень параметров (см. phpDoc для деталей).
Например, для инфоблока данным методам необходимо передать строчный идентификатор типа инфоблока, а также символьный код самого инфоблока.
, а для раздела инфоблока метод get()
будет иметь другой набор параметров, а именно идентификатор инфоблока и символьный код раздела. Если вы хотите обратиться к какому-то разделу из инфоблока с каталогом, нужно воспользоваться следующим примером:
Метод get()
получает массив с информацией о сущности. Там может быть набор различных полей, в будущем, возможно и всех полей сущности.
Метод getId()
получает только числовой идентификатор сущности
Более эффективная работа с идентификаторами
Для упрощения работы имеет смысл создать свои шорткаты, унаследовавшись от реализаций конкретных файндеров. Например для инфоблоков можно создать свой класс \Vendor\Finder\Iblock
, унаследоваться от частной реализации Finder'а инфоблока \Maximaster\Tools\Finder\Iblock
, и реализовать в нем методы для быстрого доступа к разным инфоблокам. Например, для того же каталога:
Реализация собственных Finder'ов
Для создания файндера для конкретной сущности необходимо унаследоваться от AbstractFinder
и реализовать несколько методов:
- абстрактный метод
getAdditionalCachePath()
, который будет возвращать строку. Эта строка будет использоваться для построения адреса кеша Finder'а конкретной сущности - абстрактный метод
requireModules()
. Должен возвращать массив тех модулей, которые нужно подключить при использовании Finder'а - метод
query()
. Метод должен выполнить 2 вещи- Сгенерировать инстанс \Bitrix\Main\Entity\Query и вернуть его. Нужно хорошенько подумать при составлении запроса. Не имеет смысла составлять запрос до конкретной сущности, лучше делать более широкий охват. Например, внутренняя реализация Finder'а для инфоблока выбирает и кеширует не один конкретный инфоблок, а список инфоблоков конкретного типа.
- Установить мета-информацию о сгенерированном запросе с помощью метода
setQueryMetadata()
, а именно:- Наименование поля, которое будет ключом массива со списком выбранных этим запросом сущностей
- Значение данного поля, по которому нужно будет отобрать нужную сущность из списка
- Массив дополнительных параметров, от которых будет зависеть кеш данного запроса Для подробностей проще будет изучить и просмотреть реализацию конкретных Finder'ов из поставки данной библиотеки, на деле все сильно проще, чем кажется.
- В дополнение можно реализовать методы
get()
иgetId()
, чтобы автокомплит в IDE работал правильно, т.к. изначально данные методы принимают любое количество параметров - Есть возможность переопределить метод
getItems()
. Данный метод получает на вход запрос, сгенерированный вquery()
, а также название ключевого поля из мета-информации запроса. В этом методе вы можете повлиять на структуру сохраняемых в кеш данных. Для примера можно смотреть реализацию вAbstrractFinder
Кроме класса самого Finder'а, который будет выбирать данные из БД необходимо реализовать еще и методы очистки данных при их изменении. Например, если инфоблок меняет свой код, то очевидно, что нужно инвалидировать кеш, иначе вы не сможете получить идентификатор сущности по ее актуальному символьному коду.
Для этого необходимо создать набор обработчиков OnAdd
, OnUpdate
и OnDelete
, которые будут обновлять кеш выбранной сущности. Для инвалидации кеша необходимо использовать метод AbstractFinder::invalidateCache()
. За примерами можно обращаться к классам из директории src/EventHandlers
данной библиотеки. Все обработчики событий в библиотеке подключаются с помощью maximaster/tools.events
.
WTF. Почему статика?
Потому-что ... Битрикс - статический синглтоновый глобальный монстр. Как только он даст возможность работать хотя бы в режиме ServiceLocator
, тогда и поговорим.