Очистка тегированного кеша для элементов с датой Начала активности в будущем

22.04.2024

Как очищать тегированный кеш для элементов инфоблока с датой активности в будущем?

Статья основана на другом решении, актуализированы используемые методы.

Указываем где удобно 2 обработчика событий (например в init.php) на создание и изменение элементов, которые добавят Агент на нужную Дату/Время на сброс тегированного кеша если указана Дата активности в будущем у элемента инфоблока.

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('iblock', 'OnAfterIBlockElementAdd', ['\Agents\TaggedCacheActiveFrom', 'AddAgentClear']);
$eventManager->addEventHandler('iblock', 'OnAfterIBlockElementUpdate', ['\Agents\TaggedCacheActiveFrom', 'AddAgentClear']);

В удобное место добавляем и подключаем класс ClearTaggedCacheActiveFrom с двумя методами.


namespace Agents;

use \Bitrix\Main\Application;

class TaggedCacheActiveFrom
{
    /**
     * @param array $arFields Поля элемента из событий
     * @return bool
     */
    public static function AddAgentClear(array $arFields): bool
    {
        if (!defined('BX_COMP_MANAGED_CACHE')) {
            return true;
        }

        $elementId = array_key_exists('ID', $arFields) ? $arFields['ID'] : false;

        $iblockId = array_key_exists('IBLOCK_ID', $arFields) ? $arFields['IBLOCK_ID'] : false;

        $activeFrom = array_key_exists('ACTIVE_FROM', $arFields) ? MakeTimeStamp($arFields['ACTIVE_FROM']) : 0;

        if ($elementId && $iblockId && $activeFrom > time()) {
            $agentName = __CLASS__ . "::ClearCacheByIBlockID($iblockId, $elementId);";
            // удаляем агент, если он есть
            \CAgent::RemoveAgent($agentName, 'main');
            // добавляем агент
            \CAgent::AddAgent(
                $agentName,
                'main',
                'N',
                0,
                '',
                'Y',
                ConvertTimeStamp($activeFrom, 'FULL')
            );
        }
        return true;
    }

    /**
     * @param int $iblockId Инфоблок для сброса кеша
     * @param int $elementId Используется для правильного опредления агента для удаления
     */
    public static function ClearCacheByIBlockID(int $iblockId, int $elementId): void
    {
        $taggedCache = Application::getInstance()->getTaggedCache();
        $taggedCache->clearByTag("iblock_id_$iblockId");
    }
}



Возврат к списку