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