Вывод фильтров в разных чанках. Фильтры вывода 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 Делает первую букву в словах заглавной
[[+title: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`]]
E-mail [[!+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 для него:

Фильтр userinfo нужно вызывать некэшированным, иначе пользователи будут видеть чужие закэшированные данные.

docs.modx.pro

MODX фильтры (PhX)

Модификатор Описание
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

Группа компаний Andmax - Фильтры ввода/вывода MODX Revolution PHx (модификаторы)

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


Prostoy-Site | Все права защищены © 2018 | Карта сайта