• Блог
  • Кэширование элементов в ZoomX

Давненько я ничего не писал. С Нового года устроился на работу, чтобы набраться нового опыта — распределённые системы и т.п. (микросервисы, очереди, контейнеры). Всё это очень интересно и является трендом современной разработки. Но эта работа отнимает всё время. Поэтому личные планы на этот год придётся пересматривать. Хотя в любую минуту всё может измениться. Ладно, давайте вернёмся к теме.

ZoomX постепенно начинает набирать популярность. В связи с чем возникает ряд вопросов. Один из которых — кэширование элементов в шаблонизаторе Smarty. В принципе, по документации не сложно разобраться. Но, конечно, модыксерам хотелось бы работать так, как они привыкли. В этом плане Fenom из pdoTools реализован именно по этому принципу — для запрета кэширования в названии элемента указывается восклицательный знак. Всё привычно. Но работает не всегда.

Информация!

Fenom, в отличие от Smarty (хоть он и сделан по его подобию), не имеет встроенного механизма управления кэшированием своих тегов. Он работает на уровне целого шаблона. Т.е. вы можете управлять кэшированием всего шаблона целиком. А все теги шаблонизатора Fenom (модификаторы, вызовы сниппетов и т.д.) останутся динамическими. Таким образом, даже в кэшированном шаблоне кэшированный сниппет всё равно будет вызван. Но его обработку перехватит шаблонизатор MODX и проверит свой кэш. И если сниппет есть в кэше, то MODX не будет его выполнять и вернёт его результат.

Всё это происходит под капотом и скрыто для простого пользователя MODX. Но пытливому разработчику хотелось бы работать по понятным правилам. И не только работать, но и понимать их. Уверен, многие хотели бы управлять кэшированием файловых элементов, к которым обычная логика с восклицательным знаком не применима.

А вот что касается Smarty, то его подход к кэшированию немного похож на MODX. Вполне допускаю мысль, что принцип кэширования отдельных тегов MODX перенял именно у него, исходя из того, что Smarty появился раньше и включён в MODX.

Итак, давайте подробно разберёмся и сравним как работает кэширование элементов в шаблонах в MODX и в ZoomX.

Кэширование в MODX

Чтобы элементы кэшировались, необходимо включить кэширование страницы. За это отвечает чекбокс «Кэшируемый» на странице ресурса. Теперь рассмотрим 2 варианта.

Кэширование отключено

Если ресурс не кэшируется, то соответственно не будут кэшироваться и теги кэшируемых элементов. Ведь они сохраняются в кэше страницы. А раз страница не кэшируется, то и сохранять некуда. Значит и обрабатываться они будут при каждом запросе ресурса вместе с некэшируемымы тегами.

Кэширование включено

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

Кэширование в ZoomX

ZoomX отвязан от логики кэширования MODX и работает с кэшем самостоятельно. Использование восклицательного знака не допустимо. У Smarty, который используется в качестве шаблонизатора, есть свой механизм управления кэшированием тегов. Опять же, всё зависит от режима.

Кэширование отключено

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

{"название_сниппета"|snippet:['foo' => 'bar']:300}  - кэширование на 5 минут
// если параметров нет, то время кэширования можно указать вместо них
{"название_сниппета"|snippet:0}  - кэширование навсегда
// или через функцию run
{run file="название_сниппета" cache_lifetime=60}

В этом случае в папке /core/cache/zoomx/snippets/ будет создан файл кэша. Для чанков соответственно в папке /core/cache/zoomx/chunks/.

Кэширование включено

В этом случае как и в MODX необходимо указать какие теги должны остаться некэшированными. Иначе в кэш (у Smarty свой кэш) сохранятся только значения и вы получите полностью статическую страницу. Это касается любых тегов Smarty — и переменных, и модификаторов, и блоков. Чтобы оставить динамику, нужно в конце тега указать специальный атрибут nocache.

{"название_сниппета"|snippet:['foo' => 'bar'] nocache} 

Если нужно оставить часть страницы динамической, то эту часть нужно заключить между тегами {nocache} и {/nocache}.

{nocache}
{"название_сниппета"|snippet:['foo' => 'bar']} 

{auth} 
    Контент для залогиненных пользователей
    ...
{/auth} 
{/nocache}

Эти элементы не будут закэшированы и будут обрабатыватся при каждом вызове. Но как и в случае некэшируемых ресурсов, вы можете использовать встроенный механизм кэширования элементов ZoomX и указать время, на которое нужно сохранить результат. Причём, данный механизм работает одинаково и для обычных элементов и для файловых.

Заключение

Как видите, ZoomX предлагает более продвинутый механизм кэширования элементов, который работает как для кэшируемой страницы, так и для некэшируемой. Шаблонизатор MODX даже вместе с Fenom предложить подобное не могут.

0   1227

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

  1. shock 17 апреля 2022 # +1
    Прочитал с интересом. Спасибо за труд, Сергей.
    1. accusser 15 марта 2024 # 0
      Доброго времени суток. Подскажите будет ли поддержка modx 3?
      1. Сергей Шлоков Вчера в 11:28 # 0
        Приветствую! Скорее нет, чем да.

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

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