Автоматическая очистка тегированного кеша для элементов с датой начала активности в будущем - amel-post/bitrix.help GitHub Wiki

<?php 
AddEventHandler('iblock', 'OnAfterIBlockElementAdd', array('CMyCache', 'AddClearingAgent'));
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', array('CMyCache', 'AddClearingAgent'));

class CMyCache
{

    // При добавлении/редактировании элемента с датой создания в будущем...
    // ...добавляем агент на очистку тегированного кеша.
    // Агент взводится на каждый элемент отдельно.
    function AddClearingAgent(&$arFields)
    {
        if (!defined('BX_COMP_MANAGED_CACHE'))
            return true;
        $ID = array_key_exists('ID', $arFields) ? $arFields['ID'] : false;
        $IBLOCK_ID = array_key_exists('IBLOCK_ID', $arFields) ? $arFields['IBLOCK_ID'] : false;
        $date = array_key_exists('ACTIVE_FROM', $arFields) ? MakeTimeStamp($arFields['ACTIVE_FROM']) : 0;
        if ($ID && $IBLOCK_ID && $date > time())
        {
            $agentName = "CMyCache::ClearCacheByIBlockID($IBLOCK_ID, $ID);";
            // удаляем агент, если он есть
            CAgent::RemoveAgent($agentName, 'main');
            // добавляем агент
            CAgent::AddAgent($agentName, 'main', 'N', 0, '', 'Y', ConvertTimeStamp($date, 'FULL')
            );
        }
    }

    // функция, вызываемая агентом
    function ClearCacheByIBlockID($IBLOCK_ID, $ID)
    {
        if (defined('BX_COMP_MANAGED_CACHE') && is_object($GLOBALS['CACHE_MANAGER']))
            $GLOBALS['CACHE_MANAGER']->ClearByTag('iblock_id_'.$IBLOCK_ID);
        return '';
    }

}