arrilot/bitrix-iblock-helper

This package is abandoned and no longer maintained. No replacement package was suggested.

0.3.4 2019-05-12 22:07 UTC

This package is auto-updated.

Last update: 2023-01-29 02:51:02 UTC


README

Latest Stable Version

Данный пакет больше активно не поддерживается

Причина - мы больше не используем Битрикс в своих проектах. Если вам интересен этот проект и вы хотите заняться его поддержкой - форкните его и создайте Issue в данном репозитории чтобы мы поместили здесь ссылку на форк.

Хэлперы для упрощения работы с инфоблоками/хайлоадблоками

Данный пакет представляет собой пару классов которые позволяют удобно и производительно получать

  1. Идентификаторы инфоблоков по их символьным кодам
  2. Различную информацию о хайлоадблоках по названию таблицы

Производительность достигается за счёт того, что мы не запрашиваем из БД данные каждый раз когда вызывается какой-либо из методов Вместо этого данные получаются из БД один раз и сразу по всем инфоблокам/хайлоадблокам и опционально могут еще и кэшироваться

Установка

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 можно получить при помощи одного из вариантов:

  1. $id = iblock_id('articles', 'other') - строгий вариант
  2. $id = iblock_id('other:articles') - тоже самое
  3. $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);