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"); } }