Вывод фильтров в разных чанках. Фильтры вывода modx
Фильтры ввода и вывода / Основы / Система / docs.modx.pro
Фильтры в Revolution позволяют манипулировать тем, как будут обрабатываться те или иные теги. Они позволяют вам изменять значения прямо внутри ваших шаблонов.
Фильтры ввода
В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри движка MODX.
Фильтры вывода
В Revolution фильтры вывода ведут себя так же, как и PHx в Evolution, только фильтры теперь встроены прямо в движок MODX. Синтаксис выглядит так:
[[element:modifier=`value`]]Фильтры могут применяться последовательно. Для этого напишите их подряд (слева направо):
[[element:modifier:anothermodifier=`value`:andanothermodifier:yetanother=`value2`]]Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):
[[mySnippet:modifier=`value`? &mySnippetParam=`something`]]
Модификаторы вывода
В таблице представлены некоторые модификаторы и примеры их использования. В примерах модификаторы применяются к плейсхолдерам, но вы должны помнить, что они могут применяться к любым тегам MODX. Убедитесь, что используемый тег выводит хоть что-то, что модификатор будет обрабатывать.
Условные модификаторы вывода
if, input | Передаёт произвольный текст на ввод, для следующего модификатора | [[*id:input=`[[+placeholder]]`:is=`1`:then=`Да`:else=`Нет`]] |
or | Объединение нескольких модификаторов связью ИЛИ | [[+numbooks:is=`5`:or:is=`6`:then=`Здесь 5 или 6 книг`:else=`Не уверен, сколько книг`]] |
and | Объединение нескольких модификаторов связью И | [[+numbooks:gt=`5`:and:lt=`10`:then=`Здесь от 5 до 10 книг`:else=`Книг или меньше 5, или больше 10`]] |
isequalto, isequal, equalto, equals, is, eq | Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет - «else» | [[+numbooks:isequalto=`5`:then=`Здесь 5 книг`:else=`Не уверен, сколько книг`]] |
notequalto, notequals, isnt, isnot, neq, ne | Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет - «else» | [[+numbooks:notequalto=`5`:then=`Не уверен, сколько книг`:else=`Здесь 5 книг`]] |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | То же, только условие «Больше или равно» | [[+numbooks:gte=`5`:then=`Здесь 5 книг или больше`:else=`Здесь меньше пяти книг`]] |
isgreaterthan, greaterthan, isgt, gt | То же, только условие «Строго больше» | [[+numbooks:gt=`5`:then=`Здесь больше пяти книг`:else=`Здесь 5 книг или меньше`]] |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | То же, только условие «Меньше или равно» | [[+numbooks:lte=`5`:then=`Здесь 5 книг или меньше`:else=`Здесь больше пяти книг`]] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | То же, только условие «Строго меньше» | [[+numbooks:lte=`5`:then=`Здесь меньше пяти книг`:else=`Здесь 5 книг или больше`]] |
hide | Скрывает элемент, если условие выполняется | [[+numbooks:lt=`1`:hide]] |
show | Отображает элемент, если условие выполняется | [[+numbooks:gt=`0`:show]] |
then | Используется для составления условий | [[+numbooks:gt=`0`:then=`Книги в наличии!`]] |
else | Используется для составления условий (совместно с «then») | [[+numbooks:gt=`0`:then=`Книги в наличии!`:else=`Простите, но все продано.`]] |
memberof, ismember, mo | Проверяет, является ли пользователь членом указанной группы пользователей | [[!+modx.user.id:memberof=`Administrator`]] |
Модификаторы для работы со строками
cat | Добавляет значение после тега | [[+numbooks:cat=`книг`]] |
lcase, lowercase, strtolower | Переводит все буквы в нижний регистр | [[+title:lcase]] |
ucase, uppercase, strtoupper | Переводит все буквы в верхний регистр | [[+headline:ucase]] |
ucwords | Делает первую букву в словах заглавной | |
ucfirst | Делает первую букву в строке заглавной | [[+name:ucfirst]] |
htmlent, htmlentities | Преобразует все символы в соответствющие HTML-сущности | [[+email:htmlent]] |
esc, escape | Безопасно экранирует символы, используя регулярные выражения и `str_replace()`. Также экранирует теги MODX. | [[+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]] |
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=`Hello [[+name]]!`]] |
nl2br | Заменяет символы новой строки \n на HTML-тег br | [[+textfile:nl2br]] |
date | Переводит таймстамп в текст, в соответствии с указанным форматом (формат даты) | [[+birthyear:date=`%Y`]] |
strtotime | Переводит дату в виде текста в UNIX таймстамп | [[+thetime:strtotime]] |
fuzzydate | Принимает таймстамп и возвращает дату в виде "Сегодня в 16:20 PM" | [[+createdon:fuzzydate]] |
ago | Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. | [[+createdon:ago]] |
md5 | Создает MD5-хеш значения | [[+password:md5]] |
cdata | Оборачивает вывод тегами CDATA | [[+content:cdata]] |
userinfo | Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя | [[!+modx.user.id:userinfo=`username`]] |
isloggedin | Возвращает 1, если пользователь авторизован в текущем контексте | [[!+modx.user.id:isloggedin:is=`1`:then=`Yes`:else=`No`]] |
isnotloggedin | Возвращает 1, если пользователь неавторизован в текущем контексте | [[!+modx.user.id:isnotloggedin:is=`1`:then=`No`:else=`Yes`]] |
urlencode | Конвертирует значение как URL, то есть применяет PHP фнукцию `urlencode()` | [[+mystring:urlencode]] |
urldecode | Конвертирует значение как из URL, то есть применяет PHP фнукцию `urldecode()` | [[+myparam:urldecode]] |
Модификаторы для работы с пользователями нужно вызывать некэшированными, чтобы каждый юзер видел актуальные данные.
Использование модификаторов вывода совместно с параметрами
Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:
[[!getResources:default=`К сожалению, ничего не найдено`? &tplFirst=`blogTpl` &parents=`2,3,4,8` &tvFilters=`blog_tags==%[[!tag:htmlent]]%` &includeTVs=`1` ]]Создание пользовательского модификатора
Любой сниппет может использоваться как модификатор вывода. Для этого просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет [[makeExciting]], добавляющий к выводу определенное количество восклицательных знаков:
[[*pagetitle:makeExciting=`4`]]Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:
input | Значение элемента | $input = `[[*pagetitle]]`; | Значение элемента, к которому применяется модификатор. |
options | Значение модификатора | $options = 4; | Дополнительные параметры (после знака =) |
token | Тип элемента | $token = *; | Cимвол, определяющий тип тега. |
name | Имя элемента | $name = `pagetitle`; | Имя плейсхолдера, к которому применяется модификатор. |
tag | Весь тег полностью | $tag = `[[*pagetitle:makeExciting=`4`]]`; | Весь тег, полностью. |
Приведем пример кода нашего сниппета makeExciting:
<?php $defaultExcitementLevel = 1; $result = $input; if (isset($options)) { $numberOfExclamations = $options; } else { $numberOfExclamations = $defaultExcitementLevel; } for ($i = $numberOfExclamations; $i > 0; $i--) { $result = $result . '!'; } return $result;Тег выводит всё, что возвращает сниппет. В нашем случае он вернет значение тега [[*pagetitle]] с четырьмя восклицательными знаками.
Если сниппет вернет пустую строку, то на страницу будет выведено изначальное значение тега.
Цепочки фильтров (Множественные модификаторы)
Хорошим примером цепочки фильтров будет форматирование даты, например, так:
[[*publishedon:strtotime:date=`%d.%m.%Y`]]Модификатор 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 пользователя.
Обратите внимание, что профиль текущего пользователя уже доступен в MODX по умолчанию, так что вам не нужно использовать модификатор UserInfo для него:
- [[!+modx.user.id]] - Выведет идентификатор пользователя
- [[!+modx.user.username]] - Выведет логин пользователя
- [[!+modx.user.fullname]] - Полное имя пользователя
- [[!+modx.user.dob]] - Дата рождения
Фильтр userinfo нужно вызывать некэшированным, иначе пользователи будут видеть чужие закэшированные данные.
docs.modx.pro
cat |
Добавляет к тегу строку. [[+num:cat=` раз`]], выведет «10 раз». |
lcase, lowercase, strtolower |
Переведет значение тега в нижний регистр, аналогично функции php strtolower. [[*pagetitle:lcase]] |
ucase, uppercase, strtoupper |
Переведет текст в верхний регистр, аналогично функции php strtoupper. [[*pagetitle:ucase]] |
ucwords |
Переведет каждую первую букву, каждого слова в верхний регистр, аналогично функции php ucwords. [[*pagetitle:ucwords]] |
ucfirst |
Переведет только первую букву строки в верхний регистр, аналогично функции phpucfirst. [[*pagetitle:ucfirst]] |
htmlent, htmlentities |
Преобразует все символы в соответствующие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции phphtmlentities. Использует текущие настройки системы «modx_charset» с флагом «ENT_QUOTES». [[*pagetitle:htmlentities]] |
esc,escape |
Экранирует разные «плохие символы», так же экранирует [ ] и `. [[*content:esc]] |
strip |
Заменяет все переносы строк, табуляции и множественные пробелы на один пробел. [[*content:strip]] |
stripString |
Вырезает из строки заданную часть. [[*pagetitle:stripString=`modx`]] |
replace |
Обычная замена. [[*pagetitle:replace=`modx==конфетка`]] |
striptags, stripTags, notags, strip_tags |
Вырезает все теги, кроме разрешенных, аналогично функции php strip_tags [[*longtitle:strip_tags=``]] |
len, length, strlen |
Возвращает длину строки, аналогично функции php strlen [[*longtitle:strlen]] |
reverse, strrev |
Переворачивает строку, аналогично функции php strrev [[*longtitle:reverse]] |
wordwrap |
Устанавливает переносы в зависимости от количества символов слова, аналогично функции php wordwrap [[*pagetitle:wordwrap=`10`]] |
limit |
Устанавливает лимит на длинну строки и обрезает ее. [[*pagetitle:limit=`10`]] |
ellipsis |
Устанавливает лимит на длинну строки и обрезает ее, добавляя три точки в конце [[*pagetitle:ellipsis=`10`]] |
tag |
Вернет необработанную запись тега. [[*pagetitle:ellipsis=`10`:tag]] вернет: [[*pagetitle:ellipsis=`10`]] |
add, increment, incr |
Вернет значение + модификатор ( по умолчанию +1 ). [[+num:incr]] или [[+num:add=`97`]] |
subtract, decrement, decr |
Вернет значение - модификатор ( по умолчанию -1 ). [[+num:decr]] или [[+num:decr=`97`]] |
multiply, mpy |
Вернет значение * модификатор ( по умолчанию *2 ). [[+num:mpy]] или [[+num:mpy=`5`]] |
divide, div |
Вернет значение / модификатор ( по умолчанию /2 ). [[+num:div]] или [[+num:div=`5`]] |
modulus, mod |
Вернет значение % модификатор ( по умолчанию %2 ). Вернет 1 или 0. [[+num:mod]] или [[+num:mod=`5`]] |
ifempty, default, empty, isempty |
Вернет указанный модификатор, если значение пусто. [[*pagetitle:empty=`Пусто`]] |
notempty, !empty, ifnotempty, isnotempty |
Вернет указанный модификатор, если значение НЕ пусто. [[*pagetitle:!empty=`Не пусто!`]] |
nl2br |
Вернет строку с "<br />" или "<br>" вставленные перед всеми (\r\n, \n\r, \n и \r)..., аналогично функции php nl2br [[*pagetitle:nl2br]] |
date |
Преобразует дату в указаный формат, аналогично функции PHP strftime. [[+birthyear:date=`%Y`]] |
strtotime |
Аналогично функции PHP strtotime. Вернет дату в unix. [[*createdon:strtotime]], — вернет типа "1505900347" |
fuzzydate |
Вернет дату. Типа вчера, сегодня... [[*createdon:fuzzydate]], — вернет типа "сент. 20" |
ago |
Вернет дату в прошедших секундах, минутах, неделях или месяцах. [[*createdon:ago]], — вернет типа "10 месяцев, 3 недель назад" |
md5 |
Вернет строку с шифрованием. Алгоритм хеширования аналогично функции php md5. [[+password:md5]]. |
cdata |
Вставляет строку в оболочку «CDATA» тегов. Для преобразования в XML [[*pagetitle:cdata]]. |
userinfo |
Возвращает запрошенные модификаторов данные о пользователе. Значение должно быть id-пользователя ( modUser ). [[+modx.user.id:userinfo=`username`]]. |
isloggedin |
Возвращает true, если пользователь авторизирован в этом контексте. [[+modx.user.id:isloggedin]]. |
isnotloggedin |
Возвращает true, если пользователь НЕ авторизирован в этом контексте. [[+modx.user.id:isnotloggedin]]. |
urlencode |
Кодирование url, аналогично функции php urlencode. [[+stringi:urlencode]]. |
urldecode |
Декодирование url, аналогично функции php urldecode. [[+stringi:urldecode]]. |
toPlaceholder |
Помещает результат вывода тега в плейсхолдер, причем там где был помещен — ничего не выводится, а телепортируется в указанный плейсхолдер. До этого модификатора можно использовать любые другие модификаторы. [[+number:toPlaceholder=`итого`]], помещает содержимое [[+number]] в плейсхолдер [[+итого]]. Можно усложнять запись добавляя в левую часть выражения любые другие модификаторы: [[+number:is=`10`:then=`ровно 10`:else=`точно не 10!`:toPlaceholder=`итого`]], если [[+number]] = 10, тогда выводим в плейсхолдер [[+итого]]: «ровно 10», если же нет «точно не 10!». |
cssToHead |
Прописывает файл CSS в <link> элемент перед закрывающим тегом </head>, где значение тега модификатора вписывается в аттрибут "href". Используется modX.regClientCSS. [[+cssTV:cssToHead]] перед закрывающим тегом </head>, регистрирует CSS, например: <link rel="stylesheet" href="значение +cssTv" type="text/css" /> |
htmlToHead |
Вписывает значение тега перед закрывающим тегом </head>. Используется modX.regClientStartupHTMLBlock. [[+htmlTV:htmlToHead]] перед закрывающим тегом </head>, регистрирует значение тега в HTML код. |
htmlToBottom |
Вписывает значение тега перед закрывающим тегом </body>. Используется modX.regClientHTMLBlock. [[+htmlTV:htmlToBottom]] перед закрывающим тегом </body>, регистрирует значение тега в HTML код. |
jsToHead |
Прописывает файл JS в <link> элемент перед закрывающим тегом </head>. Используется modX.regClientStartupScript. [[+jsTV:jsToHead]] перед закрывающим тегом </head>, регистрирует JS, например: <script type="text/javascript" src="значение +jsTv"></script> |
jsToBottom |
Прописывает файл JS в <link> элемент перед закрывающим тегом </body>. Используется modX.regClientScript. [[+jsTV:jsToBottom]] перед закрывающим тегом </body>, регистрирует JS, например: <script type="text/javascript" src="значение +jsTv"></script> |
www.riwkus.pro
if, input | if — дополнительное условие "если"input — добавляет в тег данные для обработки | [[*id:is=`1`:and:if=`[[*template]]`:ne=`2`:then=`Yes`]] Если id равен 1 и template не равен 2, возвращаем Yes.[[*content:input=`Текст красивый`:ucase]] C помощью модификатора input назначим тегу content значение и модифицируем его. |
or, and | or — условие "ИЛИ"and — условие "И" | [[*id:is=`1`:or:is=`2`:then=`Yes`]] Если id равен 1 или 2, возвращаем Yes.[[*id:is=`1`:and:if=`[[*template]]`:is=`2`:then=`Yes`]] Если id равен 1 и template равен 2, возвращаем Yes. |
is синонимы isequalto, isequal, equalto, equals, eq | Если значение тега равно значению модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else». | [[*id:is=`1`:then=`Yes`:else=`No`]] Если id равен 1, возвращаем Yes, иначе Нет. |
ne синонимы notequalto, notequals, isnt, isnot, neq | Если значение тега не равно значению модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else». | [[*id:ne=`1`:then=`Yes`:else=`No`]] Если id не равен 1, возвращаем Yes, иначе Нет. |
ge синонимы greaterthanorequalto, equalorgreaterthen, eg, isgte, gte | Если значение тега больше или равно значению модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else». | [[*id:ge=`1`:then=`Yes`:else=`No`]] Если id больше или равен 1, возвращаем Yes, иначе Нет. |
gt синонимы isgreaterthan, greaterthan, isgt | Если значение тега больше значения модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else». | [[*id:gt=`1`:then=`Yes`:else=`No`]] Если id больше 1, возвращаем Yes, иначе Нет. |
el синонимы equaltoorlessthan, lessthanorequalto, le, islte, lte | Если значение тега меньше или равно значению модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else». | [[*id:el=`1`:then=`Yes`:else=`No`]] Если id меньше или равен 1, возвращаем Yes, иначе Нет. |
lt синонимы islowerthan, islessthan, lowerthan, lessthan, islt | Если значение тега меньше значения модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else». | [[*id:lt=`1`:then=`Yes`:else=`No`]] Если id меньше 1, возвращаем Yes, иначе Нет. |
contains | Если значение тега содержит значение модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else».Регистрозависимый! | [[*content:contains=`Искомый текст`:then=`Yes`:else=`No`]] Если content содержит строку «Искомый текст», возвращаем Yes, иначе Нет. |
containsnot | Если значение тега не содержит значение модификатора, выполняется следующее действие или модификатор. Используется с «then» и «else».Регистрозависимый! | [[*content:containsnot=`Искомый текст`:then=`Yes`:else=`No`]] Если content не содержит строку «Искомый текст», возвращаем Yes, иначе Нет. |
andmax.ru
Вывод фильтров в разных чанках. / modx.pro
Добрый день! Стоит mFilter2. Есть фильтры по категориям и производителям, они выводятся в одном месте. Но вывод фильтров по производителям нужно выводить в другом чанке, помогите реализовать.Вызов mFilter
[[!mFilter2? &pageFirstTpl=`<a[[+classes]][[+title]] href="[[+href]]"></a>` &pageLastTpl=`<a[[+classes]][[+title]] href="[[+href]]"></a>` &pageNextTpl=`<a[[+classes]][[+title]] href="[[+href]]"><span></span></a>` &pagePrevTpl=`<a[[+classes]][[+title]] href="[[+href]]"><span></span></a>` &pageNavTpl=`<a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a>` &pageActiveTpl=`<a[[+classes]][[+title]] href="[[+href]]">[[+pageNo]]</a>` &limit=`5` &parents=`[[*id]]` &element=`msProducts` &includeThumbs=`210x` &includeTVs=`colorFasad,furnitura,washing` &class=`msProduct` &filters=`resource|parent:categories,ms|vendor:vendors` &sort=`resource|publishedon:desc` &tpls=`tpl.msProducts.row` &disableSuggestions=`0` &where=`{"class_key":"msProduct"}` &tplFilter.outer.ms|vendor=`tpl.mFilter2.filter.vendor` ]]Чанк tpl.mFilter2.outer<div> <div> [[*id:ne=`2`:then=`[[$mFilter2_categoryFilter]]`]] <!-- Тут плейсхолдер [[+filter]] --> </div> <div> <div> <a href="#" data-sort="resource|pagetitle:desc">По алфавиту, [[%mse2_sort_desc]]</a> / <a href="#" data-sort="resource|pagetitle:asc">По алфавиту, [[%mse2_sort_asc]]</a> </div> <div> <p>[[!+page.nav]]</p> </div> <div> [[+results]] </div> <div> <p>[[!+page.nav]]</p> </div> </div> </div>modx.pro