Фильтры средствами MODX PDO и pdoResources AJAX

Фильтры средствами MODX PDO и pdoResources + AJAX

09.12.2014 Фильтры по TV-параметрам и AJAX в MODX на базе pdoResources

    My Code → MODX → Примеры усложненные → Фильтры средствами MODX PDO и pdoResources + AJAX

Фильтр на базе pdoResources

Если стоит задача отфильтровать ресурсы (часто — события), у которых заданы время начала и завершения, тип и город, решение можете найти ниже.

Самое оптимальное решение по фильтру — использовать фильтр в pdoResources — &tvFilters. Для тестирования пока что не задаем tpl, а выведем &select=`id,pagetitle`

Значения TV, которые прописаны в фильтре так же будут показаны.

По-умолчанию, формат даты, который записывается в таблицу БД из инпута типа date, будет иметь вид Y-m-d H:i:s, поэтому для сравнения передаем дату в том же формате.

Для того, чтобы передать в фильтр GET-параметры, используем кастомный сниппет с именем, например, «filter»:

Обратите внимание, ф-я implode(‘,’,$filter) соединяет параметры через запятую, это значит, что поиск работает по условию «И». Если соединить через «||», поиск будет идти по условию «ИЛИ».

В строке $filter[] = ‘event_type==’.$_GET[‘type’].’%’; использован метасимвол %, который указывает, что нужно искать в нескольких возмоных значениях, например найти «show» в значениях «show||conkurs».

Кастомные фильтры

В случае, когда нужно получить только список id актуальных событий (которые еще не завершились), отсортированых от завершающихся до будущих, используем сниппет:

Более сложный сниппет — это фильтр, принимающий несколько параметров.

Самым оптимальным по скорости и самим гибким решением будет использование «каскадов» выборки id ресурсов из таблицы со значениями TV параметров, по-очередно проверяя значения каждого TV. Конечно, можно написать условие выборки в одном запросе к БД, но тогда теряется гибкость, например, мы не сможем сортировать список id событий только по дате.

1) Получаем список всех id событий (дочерние этого контейнера).

2) Ищем множество id среди полученного в п.1 списка, для которых выполняется условие между параметром и значениями первого тв.

3) Перезаписываем список id, ищем по второму тв. Снова перезаписываем список id.

4) В последнем запросе сортируем, лимитируем, так, как нам нужно.

По-скольку такой фильтр — сугубо индивидуальное решение, то много параметров заданы в самом сниппете.

В примере мы можем задать 3 условия поиска:

1) Дата, которая должна вписываться в промежуток длительности события

2) Город, где событие проходит

3) Тип события (их может быть несколько для одного события)

4) Показать те, что в архиве

Список id передаем в pdoResources, Обязательно нужно сбросить сортировку самим pdoResources (&sortby=«), т.к. список id у нас уже отсортирован.

Теоретически, используя такую схему, можно сделать фильтр любой сложности.

. Рекомендую делать вызов pdoResources прямо в сниппете, который будет принимать GET или POST параметры, т.е. весь фильтр сделать одним сниппетом. Этот метод значительно добавит гибкости нашему фильтру:

Еще один вариант реализации AJAX-фильтра с AJAX-пагинацией на базе pdoResources

Сниппет нужно разместить непосредственно в шаблоне со страницой фильтра, и на странице ресурса (с пустым шаблоном), вызываемого аяксом.

В основной форме указываем атрибут data-ajax куда прописываем url ресурса для ajax.

Источник



MODX. MODX фильтры (PhX), модификаторы

MODX (Phx) фильтры, что это, с чем, и как использовать?

Phx (Placeholders Xtended) фильтры, или как их еще называют «модификаторы», позволяют выводить на страницах MODX информацию, с применением тех или иных условий. По сути, они являются упрощенной заменой php, которую можно применять в чанках. Можно использовать фильтры предусмотренные системой, или создавать свои, любой фильтр можно применять к любому тегу MODX.

Недостатки phx фильтров

У этого метода есть значительный недостаток — повышенная в сравнении с php и xpdo нагрузка на сервер, связанная с особенностью кеширования информации системой MODX. Не стоит увлекаться применением phx.

Часто встречаемые конструкции

Если id страницы не 1 и страница — каталог, то.

Упрощение слишком длинных конструкций:

Предустановленные фильтры MODX (PhX)

условия

Добавляет в тег обрабатываемые данные

Задает дополнительное условие

Условие «ИЛИ»

Условие «И»

Если тег равен модификатору, используется с «then» и «else»

Если тег не равен модификатору, используется с «then» и «else»

Если тег больше или равен модификатору, используется с «then» и «else»

Если тег больше модификатора, используется с «then» и «else»

Если тег меньше или равен модификатору, используется с «then» и «else»

Если тег меньше модификатора, используется с «then» и «else»

Если предыдущий модификатор возвращает положительное значение (true), то не выводится обработанный тег

Если предыдущий модификатор возвращает положительное значение (true), то выводим обработанный тег

Если тег соответствует модификатору, тогда выводим сообщение

Если тег соответствует модификатору, выводим сообщение, иначе выводим другое. Используется только в связке с «then»

Если тег содержит модификатор, используется с «then» и «else»

Если тег не содержит модификатор, используется с «then» и «else»

Установить свое значение, в зависимости от модификатора и вывода тега. Так же можно использовать «else», например если значение [[+controls]] — не подходит под шаблон select

Читайте также:  Фильтры воздушные для компрессора в Пензе 427 товаров

Работает аналогично php in_array, если тег совпадет с одним из элементов модификатора (разделяются запятыми), то выводим then, если не совпало — else

строки

Добавляет к тегу строку.

Переведет значение тега в нижний регистр, аналогично функции php strtolower.

Переведет текст в верхний регистр, аналогично функции php strtoupper.

Переведет каждую первую букву, каждого слова в верхний регистр, аналогично функции php ucwords.

Переведет только первую букву строки в верхний регистр, аналогично функции phpucfirst.

Преобразует все символы в соответствующие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции phphtmlentities. Использует текущие настройки системы «modx_charset» с флагом «ENT_QUOTES».

Экранирует разные «плохие символы», так же экранирует [ ] и `.

Заменяет все переносы строк, табуляции и множественные пробелы на один пробел.

Вырезает из строки заданную часть.

Обычная замена.

Вырезает все теги, кроме разрешенных, аналогично функции php strip_tags.

Теги которые надо разрешить, перечисляются в списке после знака равенства.

Одно время существовала проблема с безопасностью при использовании этого модификатора, но ее исправили.

Возвращает длину строки, аналогично функции php strlen

Переворачивает строку, аналогично функции php strrev

Устанавливает переносы в зависимости от количества символов слова, аналогично функции php wordwrap

Устанавливает лимит на длинну строки и обрезает ее.

Устанавливает лимит на длинну строки и обрезает ее, добавляя три точки в конце

Вернет необработанную запись тега.

Вернет значение + модификатор ( по умолчанию +1 ).

Вернет значение — модификатор ( по умолчанию -1 ).

Вернет значение * модификатор ( по умолчанию *2 ).

Вернет значение / модификатор ( по умолчанию /2 ).

Вернет значение % модификатор ( по умолчанию %2 ). Вернет 1 или 0.

Вернет указанный модификатор, если значение пусто.

Вернет указанный модификатор, если значение НЕ пусто.

Вернет строку с «<br />» или «<br>» вставленные перед всеми (\r\n, \n\r, \n и \r). аналогично функции php nl2br

Преобразует дату в указаный формат, аналогично функции PHP strftime.

Аналогично функции PHP strtotime. Вернет дату в unix.

Вернет дату. Типа вчера, сегодня.

Вернет дату в прошедших секундах, минутах, неделях или месяцах.

Вернет строку с шифрованием. Алгоритм хеширования аналогично функции php md5.

Вставляет строку в оболочку «CDATA» тегов. Для преобразования в XML

Возвращает запрошенные модификаторов данные о пользователе. Значение должно быть id-пользователя ( modUser ).

Возвращает true, если пользователь авторизирован в этом контексте.

Возвращает true, если пользователь НЕ авторизирован в этом контексте.

Кодирование url, аналогично функции php urlencode.

Декодирование url, аналогично функции php urldecode.

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

Прописывает файл CSS в <link> элемент перед закрывающим тегом </head>, где значение тега модификатора вписывается в аттрибут «href». Используется modX.regClientCSS.

Вписывает значение тега перед закрывающим тегом </head>. Используется modX.regClientStartupHTMLBlock.

Вписывает значение тега перед закрывающим тегом </body>. Используется modX.regClientHTMLBlock.

Прописывает файл JS в <link> элемент перед закрывающим тегом </head>. Используется modX.regClientStartupScript.

Прописывает файл JS в <link> элемент перед закрывающим тегом </body>. Используется modX.regClientScript.

Создание своего фильтра

Модификаторы по сути являются сниппетами и создаются соответственно также.

Источник

Фильтры-модификаторы PHx в Modx revo — примеры использования

Фильтры PHx (Placeholders Xtended) добавляют новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Фильтры модификаторы phx позволяют манипулировать значением тегов, непосредственно внутри шаблона.

Все довольно просто, модификаторы phx значительно облегчают жизнь разработчику сайта. Например есть сайт и необходимо только на главной странице показывать слайдер, ну или любой другой банер. В шаблоне сайта достаточно прописать

где 1 — это id главной страницы, а $slider — чанк с html кодом слайдера. и т.д. и т.п. Только чайники создают новый шаблон и копируют туда весь html-код страницы, ради пары строчек слайдера/банера. Но не печальтесь, все мы такими были, поэтому просвещайтесь и пользуйтесь в будущем фильтрами модификаторами phx.

— выводит id текущей страницы;
? и если ДА, то выводит содержимое then;
— выводит чанк в котором находится верстка и вывод слайдера.

, использовано может быть любое другое поле, например — выведет текущий используемый шаблон. Или можно проверять не пусто ли TV-поле или как там его?

Примеры использования PHx фильтра в MODx

Пример 1:

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

Т.к. в MODX чаще всего вы используете шаблоны страниц, в данном случае вам бы потребовалось создать два шаблона.

Один для главной без ссылки:
Второй для внутренних страниц со ссылкой:
Это неудобно. С помощью PHx модификатора is (равенство) вы можете сделать так:

Если id страницы равен 1, вернуть логотип без ссылки, а если id не равен 1, вернуть логотип со ссылкой. Тем самым вы избавляетесь от создания двух практически идентичных шаблонов и обходитесь одним, но с модификатором вывода.

Читайте также:  Фильтр топливный тонкой очистки FOTON 1049A 1069 1099 FF5135 T64102003

Пример 2:

Нам требуется вывести разные названия страницы в зависимости от шаблона.
Если шаблон страницы равен 1 или равен 2, вернуть ,
иначе вернуть
Как видите, можно использовать несколько модификаторов в одной цепочке. Хотя, правильнее было бы написать так:

В следующих таблицах перечислены некоторые модификаторы PHx, которые могут быть использованы для любого тега MODx Revolution.

Модификаторы условия

Модификатор Описание Пример
if,input if — задает дополнительное условие
input — добавляет в тег обратываемые данные
— добавляем в тег phx входное значение, следующим модификатором, например, можно обработать изображение.
Или проверить есть ли в пути определенная последовательность символов.

Модификаторы строки

Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор User Info:

— Выведет ID пользователя
— Выведет логин пользователя

Особое внимание обращаем на восклицательный знак !

Он позволяет НЕ кэшировать содержимое вывода. Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов. Почему нужно не кешировать.

Представим это так: на сайте 5 пользователей. Первый пользователь зашел на страницу с вызовом:

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

Источник

Фильтры ввода-вывода (модификаторы) в MODX Revo

Фильтры в Revolution позволяют обрабатывать и изменять значения тегов внутри ваших шаблонов, чанков и сниппетов.

Навигация по статье:

О фильтрах ввода-вывода в MODX Revolution

Фильтры в Revolution позволяют обрабатывать и изменять значения тегов внутри ваших шаблонов, чанков, сниппетов.

Фильтры ввода

В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри ядра MODX.

Фильтры вывода

В MODX Revolution фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро.

Синтаксис модификаторов:

Фильтры могут применяться последовательно (пишутся слева направо):

[ [+element:modifier=`value` :anothermodifier=`value2` :andanothermodifier:yetanother=`value3`]]

Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):

Модификаторы вывода

В таблице представлены некоторые модификаторы и примеры их использования. В примерах они применяются к плейсхолдерам, но вы должны помнить, что модификаторы могут применяться к любым тегам MODX Revolution.

Модификатор Описание Пример использования
if, input if — задает дополнительное условие, input — добавляет в тег обрабатываемые данные [ [+num:is=`10` :and:if=`[ [+num]]` :ne=`15` :then=`Да, равно 10 и не 15`]]
or, and Объединение нескольких модификаторов связью ИЛИ, и связью И [ [+numProducts:is=`10` :or:is=`11` :then=`Здесь 10 или 11 товаров` :else=`Не уверен, сколько товаров`]]
isequalto, isequal, equalto, equals, is, eq Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет — «else» [ [+numProducts:isequalto=`10` :then=`Здесь 10 товаров` :else=`Не уверен, сколько товаров`]]
notequalto, notequals, isnt, isnot, neq, ne Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет — «else» [ [+numProducts:notequalto=`10` :then=`Не уверен, сколько товаров` :else=`Здесь 10 товаров`]]
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte То же, только условие «Больше или равно» [ [+numProducts:gte=`10` :then=`Здесь 10 товаров или больше` :else=`Здесь меньше 10 товаров`]]
isgreaterthan, greaterthan, isgt, gt То же, только условие «Строго больше» [ [+numProducts:gt=`10` :then=`Здесь больше 10 товаров` :else=`Здесь 10 товаров или меньше`]]
equaltoorlessthan, lessthanorequalto, el, le, islte, lte То же, только условие «Меньше или равно» [ [+numProducts:lte=`10` :then=`Здесь 10 товаров или меньше` :else=`Здесь больше 10 товаров`]]
islowerthan, islessthan, lowerthan, lessthan, islt, lt То же, только условие «Строго меньше» [ [+numProducts:lte=`10` :then=`Здесь меньше 10 товаров` :else=`Здесь 10 товаров или больше`]]
hide Скрывает элемент, если условие выполняется [ [+numProducts:lt=`1` :hide]]
show Отображает элемент, если условие выполняется [ [+numProducts:gt=`0` :show]]
then Используется для составления условий [ [+numProducts:gt=`0` :then=`Товары в наличии!`]]
else Используется для составления условий (совместно с «then») [ [+numProducts:gt=`0` :then=`Товары в наличии!` :else=`Простите, но все продано.`]]
memberof, ismember, mo Проверяет, является ли пользователь членом указанной группы пользователей [ [+modx.user.id:memberof=`Administrator`]]

Модификаторы для работы со строками

Модификатор Описание Пример использования
cat Добавляет значение после тега [ [+numProducts:cat=` товаров`]]
lcase, lowercase, strtolower Переводит все буквы в нижний регистр [ [+title:lcase]]
ucase, uppercase, strtoupper Переводит все буквы в верхний регистр [ [+longtitle:ucase]]
ucwords Делает первую букву в словах заглавной [ [+title:ucwords]]
ucfirst Делает первую букву в строке заглавной [ [+name:ucfirst]]
htmlent, htmlentities Преобразует все символы в HTML-сущности [ [+email:htmlent]]
esc, escape Безопасно экранирует символы, используя регулярные выражения и str_replace. Также экранирует символы [, ] и ` [ [+email:escape]]
strip Заменяет все переносы, табуляции и любое количество пробелов только одним пробелом [ [+textdocument:strip]]
stripString Вырезает из строки указанную подстроку [ [+name:stripString=`Mr.`]]
replace Производит замену подстрок [ [+pagetitle:replace=`Mr.==Mrs.`]]
striptags, stripTags, notags, strip_tags Вырезает все теги (можно указать разрешенные теги). [ [+code:strip_tags=` `]]
len, length, strlen Выводит длину строки [ [+longstring:strlen]]
reverse, strrev Переворачивает строку символ за символом [ [+mirrortext:reverse]]
wordwrap Вставляет перенос строки после каждого n-ого символа (слова не разбиваются) [ [+bodytext:wordwrap=`80`]]
wordwrapcut Вставляет перенос строки после каждого n-ого символа, даже если этот символ будет внутри слова [ [+bodytext:wordwrapcut=`80`]]
limit Выводит определенное количество символов с начала строки (значение по умолчанию — 100) [ [+description:limit=`50`]]
ellipsis Добавляет многоточие и обрезает строку, если она длиннее, чем определенное количество символов (значение по умолчанию — 100) [ [+description:ellipsis=`50`]]
tag Экранирование. Отображает элемент так как он есть, без:tag. Для использования в документации [ [+showThis:tag]]
math Возвращает результат продвинутых вычислений (нагружает на процессор. Не рекомендуется)
add, increment, incr Прибавляет указанное число (значение по умолчанию +1) [ [+downloads:incr]], [ [+blackjack:add=`21`]]
subtract, decrement, decr Вычитает указанное число (значение по умолчанию -1) [ [+countdown:decr]], [ [+moneys:subtract=`100`]]
multiply, mpy Умножает на указанное число (значение по умолчанию *2) [ [+trifecta:mpy=`3`]]
divide, div Делит на указанное число (значение по умолчанию /2) [ [+rating:div=`4`]]
modulus, mod Возвращает деление числа по модулю
(по-умолчанию: %2, возвращает 0 или 1))
[ [+number:mod]]
ifempty, default, empty, isempty Возвращает значение модификатора, если значение тега пусто [ [+name:default=`anonymous`]]
notempty, !empty, ifnotempty, isnotempty Возвращает значение модификатора, если значение тега НЕ пусто [ [+name:notempty=`Привет, [ [+name]]!`]]
nl2br Заменяет символы новой строки (\n) на HTML-тег [ [+textfile:nl2br]]
date Переводит таймстамп в текст, в соответствии с указанным форматом (Формат даты) [ [+birthyear:date=`%Y`]]
strtotime Переводит дату в виде текста в UNIX таймстамп [ [+thetime:strtotime]]
fuzzydate Возвращает дату в формате «вчера, сегодня, …». Принимает значение даты. [ [+createdon:fuzzydate]]
ago Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. [ [+createdon:ago]]
md5 Создает MD5-хеш значения [ [+password:md5]]
cdata Оборачивает вывод тегами CDATA [ [+content:cdata]]
userinfo Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя [ [+modx.user.id:userinfo=`username`]]
isloggedin Возвращает true, если пользователь аутентифицирован в текущем контексте [ [+modx.user.id:isloggedin]]
isnotloggedin Возвращает true, если пользователь НЕаутентифицирован в текущем контексте [ [+modx.user.id:isnotloggedin]]
urlencode Конвертирует значение в URL [ [+mystring:urlencode]]
urldecode Конвертирует значение из URL [ [+myparam:urldecode]]

Использование модификаторов вывода совместно с параметрами

Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:

[ [pdoResources:default=`К сожалению, ничего не найдено`? &parents=`5` &includeTVs=`image` &tpl=`news_tpl` ]]

Создание пользовательского модификатора

Любой сниппет может использоваться и как модификатор вывода. Для его использования просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет makeExciting, добавляющий к выводу определенное количество восклицательных знаков:

Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:

Параметр Значение Значение в примере
input Значение элемента В переменной $input будет значение заголовка страницы ([ [*pagetitle]])
options Значение модификатора (после знака =) $options = 4
token Тип элемента $token = «*» (символ, определяющий, что данный элемент — поле ресурса)
name Имя элемента $name = «pagetitle»
tag Весь тег полностью $tag

Модификатор UserInfo

Прямой доступ к данным из таблицы modx_user_attributes в базе данных, с помощью модификаторов вывода вместо сниппетов, может быть достигнуто просто за счет использования модификатора UserInfo.

Выберите нужный столбец из таблицы и укажите его в качестве свойства модификатора, например, так:

Значение Модификатор
Внутренний ключ пользователя [ [!+modx.user.id:userinfo=`internalKey`]]
Логин [ [!+modx.user.id:userinfo=`username`]]
Полное имя [ [!+modx.user.id:userinfo=`fullname`]]
Роль [ [!+modx.user.id:userinfo=`role`]]
[ [!+modx.user.id:userinfo=`email`]]
Телефон [ [!+modx.user.id:userinfo=`phone`]]
Мобильный телефон [ [!+modx.user.id:userinfo=`mobilephone`]]
Факс [ [!+modx.user.id:userinfo=`fax`]]
Дата рождения [ [!+modx.user.id:userinfo=`dob` :date=`%Y-%m-%d`]]
Пол [ [!+modx.user.id:userinfo=`gender`]]
Страна [ [+modx.user.id:userinfo=`country`]]
Область [ [+modx.user.id:userinfo=`state`]]
Почтовый индекс [ [+modx.user.id:userinfo=`zip`]]
Фото [ [+modx.user.id:userinfo=`photo`]]
Комментарий [ [+modx.user.id:userinfo=`comment`]]
Пароль [ [+modx.user.id:userinfo=`password`]]
Кэш пароля [ [+modx.user.id:userinfo=`cachepwd`]]
Последняя авторизация [ [+modx.user.id:userinfo=`lastlogin` :date=`%Y-%m-%d`]]
Дата текущей авторизации [ [+modx.user.id:userinfo=`thislogin` :date=`%Y-%m-%d`]]
Количество авторизаций [ [+modx.user.id:userinfo=`logincount`]]

[ [!+modx.user.id]] возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на [ [*createdby]] или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.

Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор UserInfo:

// Выведет ID пользователя
[[!+modx.user.id]]

// Выведет логин пользователя
[[!+modx.user.username]]

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

Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения):

// Используем модификатор:
[[+title:lcase]]

// Используем сниппет:
[[lcase? &subject=`title`]]

// Используем общий сниппет фильтра:
[[filter?
&subject=`title`
&operator=`lcase`
]]

Кэширование

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

[ [+placeholder:default=`К сожалению, ничего не найдено`]]

Результат работы примера может быть пустым, а может и нет. Как мы можем кэшировать это? Пример, приведенный выше, отражает природу модификатора вывода.

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

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

Источник