Нужен способ через API чистить кэш одного ресурса

Помогите кто знает

Нужен способ через API чистить кэш одного ресурса — товара в miniShop2

Что мне удалось нарыть самостоятельно:
forums.modx.com/index.php?topic=59814.0
Reply #6 — не работает
Reply #7 от Боба Рея — процессор не чистит кэш ресурса. Стопудово. Нужно чистить после внесения изменений. А я изменения вношу напрямую через MySQL (импортирую файл большого объёма) по расписанию каждый час.

Чистить кэш всего сайта каждый час — вообще не вариант, учитывая определённые уязвимости.

Последнее, что я пробовал, что в моём понимании должно было работать, но по факту не работает:
<?php
$id=27;
$resource=$modx->getObject('modResource',$id);
$alias=$resource->get('alias');
$params=array(
  'id' => $id
, 'alias' => $alias
, 'alias' => $alias
,'context_key' => 'web'
);
$options=array();
$res=$modx->runProcessor('resource/update', $params,$options);

return $res;
Илья Ершов
28 марта 2014, 09:02
modx.pro
4
6 360
0

Комментарии: 8

Василий Наумкин
28 марта 2014, 13:03
0
Я же те в твиттере ответил — не видел?
$cache = $modx->getCacheManager()->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
$key = $modx->resource->getCacheKey();
$cache->delete($key, array('deleteTop' => true));
$cache->delete($key);
    Илья Ершов
    28 марта 2014, 13:11
    0
    Видел :) По какой-то причине решил, что код не подходит… Сейчас ещё раз попробую.
      Василий Наумкин
      28 марта 2014, 13:12
      0
      Он уже
      а) принят в 2.3
      б) давно работает в Tickets и MS2
      в) я все равно его проверил перед тем, как тебе ответить. А ты… ай-ай-ай!
        Илья Ершов
        28 марта 2014, 13:13
        0
        ))))))) Ну прости, каюсь ))))

        Коммент Боба Рея задурил мне голову )))
    Илья Ершов
    28 марта 2014, 13:38
    2
    0
    Для потомков:
    Предложенный вариант
    $cache = $modx->getCacheManager()->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
    $key = $modx->resource->getCacheKey();
    $cache->delete($key, array('deleteTop' => true));
    $cache->delete($key);
    работает, но как-то странно… я наблюдал, что при первом обновлении страницы после выполнения этого кода — страница всё равно загружается из Кэша, очень похоже, что это был кэш браузера.

    А вот такой вариант чистит сразу:
    $id=79;
    $resource=$modx->getObject('modResource',$id);
    $cacheKey = $resource->getCacheKey();
    $modx->cacheManager->refresh(array(
        'resource' => array('key' => $cacheKey),
    ));
    Изменения видны при первом же обновлении страницы.

    Но в обоих вариантах используется объект cacheManager
      valentink2410
      20 октября 2014, 11:34
      0
      А вот такой вариант чистит сразу:
      да чистит, но только не конкретный id=79, а полностью все id обновляет, потому как проверил этот код сам и он подчищает все id что не есть гуд, так как если задача стоит обновить конкретный товар или каталог
        Василий Наумкин
        20 октября 2014, 12:08
        4
        0
        С версии MODX 2.3 у ресурса есть свой метод clearCache.
        if ($resource = $modx->getObject('modResource', 15)) {
        	$resource->clearCache();
        }
          valentink2410
          20 октября 2014, 18:47
          1
          0
          Спасибо это я возьму на вооружение себе, ну а по поводу чистки конкретного документа можно использовать твой код, я лишь добавил одну строчку, главное работает теперь можно чистить по id документа
          сам код:
          $id=9;
          $resource=$modx->getObject('modResource',$id);
          $resource->_contextKey = $resource->context_key;
          $cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
          $key = $resource->getCacheKey();
          $cache->delete($key, array('deleteTop' => true));
          $cache->delete($key);
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8