Skip to content

Instantly share code, notes, and snippets.

@andronex
Created October 9, 2024 14:55
Show Gist options
  • Save andronex/bb3ac5cd88bd3c53e5ffa513de7c487d to your computer and use it in GitHub Desktop.
Save andronex/bb3ac5cd88bd3c53e5ffa513de7c487d to your computer and use it in GitHub Desktop.
Принудительный сброс кеша у ресурса MODX в момент посещения страницы, если вдруг в кеше старые данные, а в БД новее.
<?php
switch ($modx->event->name) {
case 'OnLoadWebDocument':
// id ресурса
$id = $modx->resource->get('id');
// объект ресурса
$doc = $modx->resource;
// текущий контекст
$mgrCtx = $modx->context->get('key');
// время сохранения/изменения ресурса текущее из БД @$editedon
$table_name = $modx->getTableName('modResource');
$sql = "SELECT editedon FROM ".$table_name." WHERE id = :id";
$statement = $modx->prepare($sql);
if ( $statement->execute(array('id'=>$id)) ) {
$editedon = $statement->fetch(PDO::FETCH_COLUMN);
}
if(!$editedon){
$editedon = time() + 1;
}
// время сохранения/изменения ресурса из существующего кеша @$editedon_cache
$ck = $doc->getCacheKey();
$cache_exists = $modx->cacheManager->get($ck, array(
xPDO::OPT_CACHE_KEY => 'resource',
));
$editedon_cache = isset($cache_exists['resource']['editedon'])?$cache_exists['resource']['editedon']:time();
// если время обновления из кеша старее реального времени обновления ресурса, то удаляем кеш ресурса
if($editedon_cache < $editedon){
$modx->resource = $modx->getObject('modResource', $id);
$modx->cacheManager->deleteTree(MODX_CORE_PATH.'cache/context_settings/'.$mgrCtx.'/',array(
'skipDirs' => true,
'deleteTop' => false,
'extensions' => array('.cache.php')
));
$modx->cacheManager->deleteTree(MODX_CORE_PATH.'cache/resource/'.$mgrCtx.'/resources/',array(
'skipDirs' => true,
'deleteTop' => false,
'extensions' => array($id.'.cache.php')
));
}
break;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment