Приветствую, дорогие друзья! В данной статье я решил рассказать о том, как решить проблему с обновлением скриптов и стилей у пользователей сайта (в частности, заказчика). Пойдем мы с вами двумя путями: сделаем версию для стандартного парсера MODX и для Fenom.
Для того, чтобы обновить кеш браузеров пользователей достаточно в дополнение к файлу передать какой-либо GET-параметр, тогда браузер решит, что файл изменился и загрузит новую версию. Сделать это можно, например, так:
<link rel="stylesheet" href="assets/css/style.css?time=3">
Как видите у нас передан GET-параметр time со значением 3. Конечно, после каждого изменения файла style.css можно изменять значение этого GET-параметра для обновления кеша у пользователей, но, как вы понимаете, это не совсем удобно. Тогда на помощь к нам приходит функция php filemtime(), которая возвращает время последнего изменения файла в формате временной метки Unix (количество секунд, которые прошли с полуночи 1 января 1970 года до настоящего времени). С ее помощью мы можем оптимизировать этот процесс.
Стандартный парсер MODX.
Если вы используете стандартный парсер MODX, то вы можете использовать фильтры ввода и вывода. Для этого, сначала создадим сниппет versions со следующим кодом:
<?php if(isset($input)) { $file = MODX_BASE_PATH.$input; if (file_exists($file)) { return $input.'?v='.filemtime($file); }else{ return $input; } }else{ return $input; }
Вы можете использовать, например, ClientConfig или системные настройки, где сможете указать пути до файлов скриптов и стилей. Я сделал это через системные настройки.
Теперь мы можем вызвать модификатор ввода вывода, например, для файлов стилей это будет выглядеть так:
<link rel="stylesheet" href="[[++base_css:versions]]">
Или можно передать значение напрямую в сниппет:
<link rel="stylesheet" href="[[!versions? &input=`assets/css/style.css`]]">
В итоге, мы с вами увидим, что в путь с помощью сниппета передался GET-параметр v с датой последнего изменения файла.
Fenom.
С парсером Fenom все проще. Создаем плагин на событие pdoToolsOnFenomInit:
<?php switch($modx->event->name){ case "pdoToolsOnFenomInit": $fenom->addModifier('versions', function($input){ if(isset($input)) return $input.'?v='.filemtime(MODX_BASE_PATH.$input); }); break; }
И теперь мы можем применять его прямо к строке:
<link rel="stylesheet" href="{'assets/css/style.css' | versions}">
Все! Теперь мы защитим себя от лишних вопросов и сэкономим свое время при общении с заказчиками.