Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Решение под катом.
На каждый элемент, дата начала активности которого находится в будущем, создаём агент, который в момент наступления нужной даты будет сбрасывать тегированный кеш соответствующего инфоблока.
Примечания.
1) Этот код может работать неправильно, если ваше локальное время отличается от времени на сервере.
2) Если вы будете менять названия класса и/или функции, вызываемой агентом, не забудьте поправить строку
Назад в раздел
Наверх
то ждем ваше обращение в нашей службе тех поддержки.
Автоматическая очистка тегированного кеша для элементов с датой начала активности в будущем
При использовании время жизни кешей обычно делают большим. Из-за этого возникает проблема с новостями, которые размещают на сайте заранее. Например, если редактор сайта в пятницу написал новость, которая должна появиться на сайте в воскресенье, для чего выставил ей соответствующую дату начала активности, то при дефолтных настройках битрикса в воскресенье эта новость на сайте не появится, поскольку кеш не сбросится.Решение под катом.
На каждый элемент, дата начала активности которого находится в будущем, создаём агент, который в момент наступления нужной даты будет сбрасывать тегированный кеш соответствующего инфоблока.
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 '';
}
}
|
1) Этот код может работать неправильно, если ваше локальное время отличается от времени на сервере.
2) Если вы будете менять названия класса и/или функции, вызываемой агентом, не забудьте поправить строку
$agentName = "CMyCache::ClearCacheByIBlockID($IBLOCK_ID, $ID);"; |
Назад в раздел
Подписаться на новые материалы раздела:
Загрузка...
Наверх