Лайфхак для файловых сниппетов
Многие разработчики знают о проблеме кэширования кода файловых сниппетов. Она сильно раздражает. Не все понимают, почему это происходит. Сейчас я не буду это объяснять. Кому интересно, почитайте мой комментарий к этому вопросу в сообществе.
В чём отличие работы с обычным сниппетом и с файловым? При сохранении обычного сниппета (в админке), 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 можно сделать аналогичную настройку.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()