arrilot/bitrix-iblock-helper

此包已被废弃,不再维护。没有建议的替代包。

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

此包不再积极维护

原因是我们不再在项目中使用Bitrix。如果您对这个项目感兴趣并想维护它 - 分支它并在此存储库中创建一个问题,以便我们将链接放置在此处。

简化与信息块/海加载块的工作的帮助器

此包包含两个类,允许方便且高效地获取

  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请求的范围内工作,但非常有用,因为它可以避免多次查询数据库。

第二级(外部缓存) - 通过Bitrix的标准缓存机制在外部缓存中进一步缓存。默认禁用。对于有大量信息块的项目来说可能很有用。

要启用,请将以下内容添加到 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);