• Блог
  • Лайфхак для файловых сниппетов

Многие разработчики знают о проблеме кэширования кода файловых сниппетов. Она сильно раздражает. Не все понимают, почему это происходит. Сейчас я не буду это объяснять. Кому интересно, почитайте мой комментарий к этому вопросу в сообществе.

В чём отличие работы с обычным сниппетом и с файловым? При сохранении обычного сниппета (в админке), MODX очищает кэш элементов (и сниппетов и плагинов), который находится в папке core/cache/includes/elements/. И очистка запускается, потому что генерируется событие изменения сниппета. А когда вы правите файловый сниппет, MODX ничего об этом не знает. Поэтому старый код сниппета остаётся в кэше. Чтобы изменения сработали, нужно кэш элементов удалить вручную. Это очень геморройно. Поэтому я предлагаю небольшой костыль лайфхак, как обойти эту проблему.

Для этого нужно создать плагин на событие OnHandleRequest. Для удобства управления этим механизмом желательно создать системную настройку, которая будет включена при разработке и которую можно отключить на проде.

// Плагин ClearFileSnippetsCache  (OnHandleRequest)
if ($modx->getOption('debug_mode', null, false)) {
    $files = MODX_CORE_PATH . 'cache/includes/elements/modsnippet/*.include.cache.php';
    
    foreach (glob($files) as $file) {
        $name = basename($file, '.include.cache.php');
        if (!is_numeric($name)) {
            @unlink($file);
        }
    }
}

Если системная настройка включена, то при каждом обновлении страницы из папки кэша кода сниппетов будут удаляться все файлы, кэширующие файловые сниппеты. Кэш обычных сниппетов останется.

Теперь все изменения в файлах сразу отобразятся на сайте. Но не забывайте отключать это на рабочем сайте, чтобы не нагружать MODX лишней работой.

Или альтернативный вариант — можно сделать настройку окружения и проверять её вместо системной настройки. Например, в настройках Apache для вашего виртуального хоста сайта разработки указать

...
SetEnv APP_ENV dev

А проверять это через $_SERVER['APP_ENV'].

// Плагин ClearFileSnippetsCache  (OnHandleRequest)
if ( 'dev' === $_SERVER['APP_ENV'] ?? 'prod') {
    $files = MODX_CORE_PATH . 'cache/includes/elements/modsnippet/*.include.cache.php';
    
    foreach (glob($files) as $file) {
        $name = basename($file, '.include.cache.php');
        !is_numeric($name) && @unlink($file);
    }
}

Для nginx можно сделать аналогичную настройку.

0   524

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.