arrilot / bitrix-iblock-helper
Installs: 6 098
Dependents: 0
Suggesters: 0
Security: 0
Stars: 20
Watchers: 4
Forks: 2
Open Issues: 0
Requires
- php: >=5.6.4
- arrilot/bitrix-cacher: ~3
README
Данный пакет больше активно не поддерживается
Причина - мы больше не используем Битрикс в своих проектах. Если вам интересен этот проект и вы хотите заняться его поддержкой - форкните его и создайте Issue в данном репозитории чтобы мы поместили здесь ссылку на форк.
Хэлперы для упрощения работы с инфоблоками/хайлоадблоками
Данный пакет представляет собой пару классов которые позволяют удобно и производительно получать
- Идентификаторы инфоблоков по их символьным кодам
- Различную информацию о хайлоадблоках по названию таблицы
Производительность достигается за счёт того, что мы не запрашиваем из БД данные каждый раз когда вызывается какой-либо из методов Вместо этого данные получаются из БД один раз и сразу по всем инфоблокам/хайлоадблокам и опционально могут еще и кэшироваться
Установка
composer require arrilot/bitrix-iblock-helper
Использование
Инфоблоки
Рекомендуемый способ использования - добавить в проект следующую функцию-хэлпер:
/** * Получение ID инфоблока по коду (или по коду и типу). * * @param string $code * @param string|null $type * @return int * * @throws RuntimeException */ function iblock_id($code, $type = null) { return Arrilot\BitrixIblockHelper\IblockId::getByCode($code, $type); }
Допустим, есть инфоблок типа other
и с символьным кодом articles
.
Его ID можно получить при помощи одного из вариантов:
$id = iblock_id('articles', 'other')
- строгий вариант$id = iblock_id('other:articles')
- тоже самое$id = iblock_id('articles')
- более удобный в случае когда коды инфоблоков можно считать уникальными.
Независимо от количества вызовов iblock_id()
запрос в базу будет выполнен только один раз за и получит данные по всем инфоблокам.
Хайлоадблоки
Рекомендуемый способ использования - добавить в проект следующие функции-хэлперы:
/** * Получение данных хайлоадблока по названию его таблицы. * Всегда выполняет лишь один запрос в БД на скрипт и возвращает массив вида: * * array:3 [ * "ID" => "2" * "NAME" => "Subscribers" * "TABLE_NAME" => "app_subscribers" * ] * * @param string $table * @return array */ function highloadblock($table) { return Arrilot\BitrixIblockHelper\HLblock::getByTableName($table); } /** * Компилирование и возвращение класса для хайлоадблока для таблицы $table. * * Пример для таблицы `app_subscribers`: * $subscribers = highloadblock_class('app_subscribers'); * $subscribers::getList(); * * @param string $table * @return string */ function highloadblock_class($table) { return Arrilot\BitrixIblockHelper\HLblock::compileClass($table); } /** * Компилирование сущности для хайлоадблока для таблицы $table. * Выполняется один раз. * * Пример для таблицы `app_subscribers`: * $entity = \Arrilot\BitrixIblockHelper\HLblock::compileEntity('app_subscribers'); * $query = new Entity\Query($entity); * * @param string $table * @return \Bitrix\Main\Entity\Base */ function highloadblock_entity($table) { return Arrilot\BitrixIblockHelper\HLblock::compileEntity($table); }
Кэширование
Для увеличения быстродействия пакет использует два уровня кэша для массива идентификаторов Необходимо понимать как эти уровни работают, чтобы избежать некоторых подводных камней.
Первый уровень (локальный кэш) - кэширование массива данных в статическую переменную класса. По-умолчанию - включён. Это кэширование работает только в рамках одного HTTP запроса, но очень полезно потому что позваляет избежать множества запросов в БД.
Второй уровень (внешний кэш) - кэширование еще и во внешнем кэше через стандартный механизм кэширования Битрикса на N минут. По-умолчанию - выключен. Он может быть полезен, например, если на проекте есть очень много инфоблоков.
Для включения необходимо добавить в init.php
(или куда-то туда):
IblockId::setCacheTime(30 * 60); // кэшируем ID всех инфоблоков на 30 минут HLblock::setCacheTime(30 * 60); // кэшируем данные всех хайлоадблоков на 30 минут
Сброс кэша
Пакет предоставляет несколько методов для сброса кэша. Зачастую их использование не требуется, но бывают кейсы когда без них никуда.
// Очистка первого уровеня кэша. // По-сути единственный кейс, когда он нужен - когда вы добавили инфоблок/хлблок и хотите в том же запросе с ним работать через `iblock_id()`. IblockId::flushLocalCache(); HLblock::flushLocalCache(); // Очистка второго уровня кэша. // Нужна в случае, если вы его во-первых включили, а во-вторых добавили инфоблок через админку/код и не готовы ждать инвалидации этого кэша. IblockId::flushExternalCache(); HLblock::flushExternalCache(); // Также можно в любой момент выключить использование внешнего кэша для текущего запроса через IblockId::setCacheTime(0); HLblock::setCacheTime(0);