Документация по макросам и шаблонам UMI.CMS. Документация umi cms


Формат UMI Data

Каждый раз, когда вы запрашиваете страницу своего сайта в окне браузера, система UMI.CMS формирует XML-файл в формате UMI Data. Чтобы увидеть этот файл, наберите в адресной строке браузера адрес созданной страницы, добавив к нему расширение .xml, например http://ваш_сайт/mypage.xml.

Пример файла в формате UMIData

<?xml version="1.0" encoding="utf-8" ?> <result module="content" method="content" domain="www.somedomain.com" lang="ru" header="Нет страницы для отображения" title="Заголовок моей страницы (TITLE)" request-uri="/mypage/?xmlMode=force" pageId="23052"> <meta> <keywords>Ключевые слова моей страницы</keywords> <description>Описание моей страницы</description> </meta> <user status="auth" login="username" /> <parents /> <page parentId="0" link="/mypage/" is-visible="1" object-id="27089" type-id="10"> <name>Моя страница</name> <properties> <group name="common"> <title>Основные</title> <property name="title" type="string"> <title>Поле TITLE</title> <value>Заголовок моей страницы (TITLE)</value> </property> <property name="h2" type="string"> <title>Поле h2</title> <value>Заголовок моей страницы</value> </property> <property name="meta_keywords" type="string"> <title>Поле meta KEYWORDS</title> <value>Ключевые слова моей страницы</value> </property> <property name="meta_descriptions" type="string"> <title>Поле meta DESCRIPTIONS</title> <value>Описание моей страницы</value> </property> <property name="content" type="wysiwyg"> <title>Контент</title> <value>Текст моей страницы</value> </property> <property name="tags" type="tags"> <title>Тэги</title> <value>tag1</value> </property> </group> <group name="more_params"> <title>Дополнительные параметры</title> <property name="show_submenu" type="boolean"> <title>Показывать подменю</title> <value>1</value> </property> </group> </properties> </page> </result>

Как видим, файл в формате UMI Data имеет следующую структуру:

Вывод значений формата UMIData

Итак, вы ознакомились с описанием формата UMI Data. Теперь вы можете создать XSLT-шаблон, который преобразует исходный XML-файл в формате UMI Data в итоговую HTML-страницу, содержащую нужные элементы исходного файла.

Например, чтобы вывести значения полей заголовка и контента страницы, добавим в тестовый XSLT-шаблон следующий код (выделен жирным шрифтом):

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <html> <head> <title><xsl:value-of select="/result/@title" /></title> </head> <body> <div> <h2><xsl:value-of select=".//property[@name ='h2']/value" /></h2> <xsl:value-of select=".//property[@name = 'content']/value" disable-output-escaping="yes"/> </div> </body> </html> </xsl:template> </xsl:stylesheet>

Первая инструкция <xsl:value-of> выводит значение атрибута title корневого тега result, две другие выводят значение элемента value для поля h2 и значение элемента value для поля content.

Замечание

Атрибут disable-output-escaping="yes" отключает экранирование символов. Его следует указывать для вывода полей, содержимым которых является HTML-код.

Можно видеть, что мы можем получить доступ к отдельным элементам XML-файла, запрашивая их при помощи "путей", похожих на пути к папкам в файловой системе.

Для доступа к атрибутам в этой записи необходимо использовать символ "@", а символы "[" и "]" используются для задания условий. Запись ".//" говорит о том, что надо искать этот элемент среди всех доступных. Так запись <xsl:value-of select=".//property[@name = 'h2']/value"/> дословно означает следующее:

Вывести значение элемента value расположенного внутри элемента property с атрибутом name равным h2, при этом элемент property может располагаться в любом месте обрабатываемого XML.

Замечание

Рассмотренное выше выражение является выражением на языке XPath. Интересующиеся могут изучить его самостоятельно, так как в большинстве случаев достаточно будет аналогии с адресацией в файловой системе.

dev.docs.umi-cms.ru

Объекты в UMI.CMS

Объекты в UMI.CMS — особый вид хранения данных UMI.CMS. Каждый созданный объект имеет имя и свой уникальный идентификатор (id). Объект структурно повторяет тип данных, по которому он создан, а поля объекта могут принимать различные значения.

Рассмотрим в качестве примера объекта пользователя, приведенного выше на рисунке (Рисунок 1.2, «Редактирование пользователя»). Предположим, что id этого пользователя 27163. Тогда мы можем посмотреть значения полей следующим образом (см. описание «Объекты: протокол UObject») — наберем в адресной строке:

http://ваш_сайт/uobject/27163

Мы должны будем увидеть примерно следующее:

<udata generation-time="0.002585"> <object name="username" type-id="4" ownerId="14"> <properties> <group name="identify_data"> <title>Идентификационные данные</title> <property name="login" type="string"> <title>Логин</title> <value>username</value> </property> <property name="e-mail" type="string"> <title>E-mail</title> <value>my_email@my_email.ru</value> </property> <property name="groups" type="relation"> <title>Группы пользователей</title> <value> <item name="Зарегистрированные пользователи" type-id="6" xlink:href="uobject://2374"/> </value> </property> <property name="is_activated" type="boolean"> <title>Активирован</title> <value>1</value> </property> </group> <group name="more_info"> <title>Дополнительная информация</title> <property name="user_dock" type="string"> <title>Пользовательская панель</title> <value> ... </value> </property> <property name="preffered_currency" type="relation"> <title>Предпочитаемая валюта</title> <value> ... </value> </property> </group> <group name="short_info"> <title>Краткая информация</title> <property name="lname" type="string"> <title>Фамилия</title> <value>Last_name</value> </property> <property name="fname" type="string"> <title>Имя</title> <value>Name</value> </property> </group> </properties> </object> </udata>

Таким образом, мы можем видеть группы полей (выделены жирным шрифтом) — элементы group, с непустыми полями — дочерними элементами property с атрибутами (id, name, type) и значениями поля, заключенными в элемент value.

dev.docs.umi-cms.ru

Документация по макросам и шаблонам UMI.CMS

Макрос возвращает набор доступных списков адресов, существующих на сайте, а также список полей для создания формы по id указанному в параметре form. Если этот параметр отсутствует, то будет выведены данные о последней добавленной форме.

Саму форму необходимо самостоятельно верстать в шаблоне (см. пример ниже).

XML-ответ UData

<udata form_id="832" module="webforms" method="add" generation-time="0.501507"> <items> <item>Письмо администраторам</item> <item>Письмо в рекламный отдел</item> </items> <groups> <group name="lichnye_dannye" title="личные данные"> <field name="imya" title="имя" input_name="data[new][imya]" type="string" required="required"/> <field name="familiya" title="фамилия" input_name="data[new][familiya]" type="string"/> <field name="email" title="e-mail" input_name="data[new][email]" type="string" tip="это подсказка" required="required"/> <field name="soobwenie" title="сообщение" input_name="data[new][soobwenie]" type="text" required="required"/> </group> </groups> </udata>

В случае если указан параметр who конкретного списка адресов, то вместо ветви items будет присутствовать 2 элемента (address_select и res_to). Содержимое любого из них необходимо указать при верстке формы:

<address_select> <input type="hidden" name="system_email_to" value="27683" /> </address_select> <res_to> <input type="hidden" name="system_email_to" value="27683" /> </res_to>

Элементы и атрибуты

<items>

Ветвь, описывающая набор списков адресов, созданных на сайте — элементы item.

<item>

Элемент описывающий отдельный список адресов.

@id

Идентификатор списка адресов

<groups>

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

<group>

Элемент, описывающий отдельную группу полей из списка групп.

<field>

Отдельное поле из группы полей. Данные из атрибутов необходимо использовать при создании формы.

@name

Имя поля

@title

Заголовок поля

@input_name

Имя, необходимое для задания атрибута name у тега <input>

@type

Тип данных для этого поля

@id

Идентификатор поля

@required

Атрибут, указывающий, что это поле является обязательным к заполнению

@tip

Подсказка к полю. Можно использовать для объяснения, что именно должно быть введено в это поле при верстке формы

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

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

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

<xsl:apply-templates select="document('udata://webforms/add/832')/udata" mode="mywebform"/>

Теперь необходимо описать шаблоны обработки результатов макроса. Создаем форму:

<xsl:template match="udata[@module = 'webforms'][@method = 'add']" mode="mywebform"> <form method="post" action="/webforms/send/"> <input type="hidden" name="system_form_id" value="{@form_id}" /> <input type="hidden" name="ref_onsuccess" value="/webforms/posted/" /> <table> <tr> <td>Куда отправить:</td> <td> <select name="system_email_to"> <xsl:apply-templates select=".//item" mode="form-select"/> </select> </td> </tr> <xsl:apply-templates select=".//field" mode="form-fields"/> <xsl:apply-templates select="document('udata://system/captcha')/udata[url]" /> </table> <p><input type="submit" value="Отправить" /></p> </form> </xsl:template>

Далее необходимо описать шаблон, выводящий набор списков адресов:

<xsl:template match="item" mode="form-select"> <option value="{@id}"> <xsl:value-of select="." /> </option> </xsl:template>

А также, например, 2 шаблона для полей типа string (для ввода таких данных как Имя, Фамилия, e-mail) и text (для ввода самого сообщения):

<xsl:template match="field[@type = 'string']" mode="form-fields"> <tr> <td><xsl:value-of select="@title"/>:</td> <td><input type="text" name="{@input_name}"/></td> </tr> </xsl:template> <xsl:template match="field[@type = 'text']" mode="form-fields"> <tr> <td><xsl:value-of select="@title"/>:</td> <td><textarea name="{@input_name}"/></td> </tr> </xsl:template>

Для того, чтобы использовать защитный код, вставлен вызов макроса %system captcha()%, где проверка на наличие элемента url будет гарантировать, что зарегистрированные пользователи CAPTCHA не увидят:

<xsl:apply-templates select="document('udata://system/captcha')/udata[url]" />

Для которого необходимо описать шаблон, например, следующим образом:

<xsl:template match="udata[@method='captcha']"> <tr> <td><label for="{@input_id}">Защитный код:</label></td> <td><img src="{url}{@random_string}"/> <input type="text" name="captcha"/></td> </tr> </xsl:template>

dev.docs.umi-cms.ru

Уроки, статьи UMI.CMS. Бесплатные уроки UMI.CMS

В данной статье я буду рассказывать про то, как вызывать кастомные макросы UMI.CMS.

Давайте сначала определимся, для чего нужны кастомные макросы(?)

Иногда бывает такое, что стандартных макросов UMI.CMS бывает не достаточно, ну или просто не хватает чего-либо, вот тут вам и понадобятся кастомные макросы.

Какие есть стандартные макросы в UMI.CMS

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

Давненько я не писал про работу с UMI.CMS. Последней статьей было про то, как сделать для сайта акцию с обратный отсчетом для вашего интернет магазина. В этой статье я расскажу про то, как можно сделать удобную работу с вашей корзиной.(далее…)

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

В UMI.CMS есть очень замечательная особенность — это управление несколькими сайтами из одной админки. Это особенность называется мультидоменность или мультисайтовость.

C подключением на живом сайте мультисайтовости проблем не происходит, а вот, что делать, если нужно подключить мультидоменность на локальном компьютере, ведь все нужно протестировать перед переносом? Да и для подключения мультисайтовости требует не 1 и даже иного не 3 часов ожидания, что делать если их нет. Все просто. Сейчас я вам расскажу, как можно быстро поднять мультидоменный сайт на  UMI.CMS на локальном компьютере. (далее…)

Достаточно давно работаю с UMI.CMS версии Shop и при создание интернет магазинов постоянно возникает одна и та же проблема, от которой к сожалению не получиться избавиться, а именно — в ЧПУ после домена идет название каталога, а потом уже и правильное ЧПУ.

Любой разработчик на UMI.CMS сразу же скажет, что не следует создавать иерархического каталога, просто в модуле «Каталог» добавлять нужные вам разделы.

Может не совсем понятно, о чем именно сейчас идет речь, я объясню. Смотрите, если мы хотим, чтобы у нас в модуле «Структура» UMI.CMS все было красиво и структурированно, для этого мы в модуле «Каталог» создаем дополнительный раздел «Каталог товаров» и уже в него добавляем подразделы и товары: (далее…)

Давненько я не писал про работу с UMI.CMS, нужно исправлять ситуацию.

Не так давно на работе столкнулись с такой задачей — нужно было прикрепить файл к письму, но к тому который отправляет пользователь, такие варианты решения есть на wiki UMi.CMS, а к тому, который отправляется пользователю — автоответ на его письмо. Как говорит wiki.umisoft.ru такой возможности нет.

Стандартного функционала, для прикрепления загруженного файла к письму, которое придет администратору — не предусмотрено. Однако, имеется возможность указать в письме прямую ссылку на загруженный файл.

Для того, чтобы ясно понимать ситуацию прикрепления файла в автоответе пользователю, вот пример - пользователь решил запросить прайс лист вашей продукции, а вам нужно взамен на прайс лист получить данные пользователя. Ну я думаю примерно задача ясна, теперь я вам все распишу. Первое что нужно сделать — это в UMI.CMS создать новую форму связи. Нужно перейти в Модули -> Обратная связь. Если у вас нет формы связи, то нужно ее создать. Я не буду описывать процесс создания формы, в документации UMI.CMS это прекрасно описано. Если у вас формы есть, то вам этот шаг нужно пропустить 😉 Сразу переходите в Модули -> Шаблоны данных и тут нужно найти "Шаблон письма"(далее…)

Приходилось ли вам в популярных интернет магазинах видеть мотивирующий покупателя блок, в котором написано — «ДО КОНЦА АКЦИИ ОСТАЛОСЬ ... ДНЕЙ!»? В данном блоке есть часы с обратным отсчетом, классное описание, мотивирующие 10, 20, 30% скидки на товар!

А хотели ли вы предложить такой функционал своему заказчику или добавить в свой интернет магазин на UMI.CMS?

Теперь вы это можете сделать прочитав данную статью, которая подробно описывает функционал создания таймера обратного отсчета на акции товаров в UMI.CMS 😉 (далее…)

pontyk.com.ua

UMI.CMS

UMI.CMS — в топе ключевых рейтингов CMS России и СНГ. Более 9 000 сайтов работают сегодня на платформе UMI.CMS.

Класс продукта

CMS, eCommerce CMS

Другие CMS, на которых работает Cetera: Cetera CMS, Fastsite, Wordpress, «1C-Битрикс: Управление сайтом», NetCat, Magento, Tilda, Craft CMS, Shopify, Drupal.

Документация UMI.CMS

  1. Для контент-менеджеров.
  2. Для разработчиков.
  3. Для администраторов.

Статус партнёрства с вендором

Партнёр.

Портфолио

Посмотреть портфолио

Услуги Cetera на основе UMI.CMS

Редакции UMI.CMS

Для магазинов

  1. Ultimate — 79 900 рублей
  2. Сommerce — 34 900 рублей
  3. Shop — 22 900 рублей

Для сайтов

  1. Сorporate — 11 900 рублей
  2. Business — 22 900 рублей
  3. Lite — 4 900 рублей

Преимущества UMI.CMS

Самая удобная CMS для сайта

Процесс управления сайтом на UMI.CMS настолько прост, что для этого не требуется никаких специальных знаний, кроме стандартных навыков работы в MS Word. Для того, чтобы добавить на сайт страницу или новый раздел, изменить структуру меню, отредактировать текст или добавить картинку, обновить каталог, цены или список производителей в интернет-магазине, вам не потребуется админка или какая-либо дополнительная программа для управления — моментальное редактирование происходит прямо на страницах сайта.

Масштабируемый функционал

Возможностей младшей редакции системы достаточно, чтобы создать веб-ресурс небольшой компании и с уже настроенным типовым функционалом. Далее при необходимости инструментарий CMS сайта можно расширять, переходя на старшие редакции или настраивая платформу под ваши задачи. Сайт на UMI.CMS будет служить вам долго, эффективно и развиваться вместе с вашим бизнесом.

Экономична для владельцев

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

Быстрый запуск сайта

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

Поделиться в соц. сетях:    

cetera.ru

UMI.CMS | permissionsCollection

Калька с текущей документации с официального сайта, разбитая для удобства пользования не классы. Соответственно, все тамошние ошибки повторяются и здесь. Для сравнения смотрите раздел "Примеры работы с классами umi.api"

Chapter 48. permissionsCollection

Список методов

__construct() getOwnerType(Integer $owner_id) makeSqlWhere(Integer $owner_id) isAllowedModule(Integer $owner_id, String $module) isAllowedMethod(Integer $owner_id, String $module, String $method) isAllowedObject(Integer $owner_id, Integer $object_id) isSv(Integer $user_id) isAdmin(Integer $user_id) isOwnerOfObject(Integer $object_id, user_id id) setDefaultPermissions(Integer $element_id) resetElementPermissions(Integer $elementId, Integer $ownerId = false) resetModulesPermissions(Integer $ownerId, Array $modules = NULL) setElementPermissions(Integer $ownerId, Integer $elementId, Integer $level) hasUserPermissions(Integer $ownerId) copyHierarchyPermissions(Integer $fromUserId, Integer $fromUserId) getUserId() isAllowedDomain(Integer $owner_id, Integer $domain_id) setAllowedDomain(Integer $owner_id, Integer $domain_id, Boolean $allow = true) setDefaultElementPermissions(umiHierarchyElement $element, Integer $owner_id) setAllElementsDefaultPermissions(Integer $owner_id) getUsersByElementPermissions(Integer $elementId, Integer $level) pushElementPermissions(Integer $elementId, Integer $level) getInstance() getGuestId()

Управляет правами доступа на страницы и ресурсы модулей. Синглтон. Экземпляр класса можно получить через статичесик метод getInstance.

getOwnerType(Integer $owner_id)

Внутрисистемный метод, не является частью публичного API

  1. Integer $owner_id id пользователя или группы

Возвращает Integer|Array

makeSqlWhere(Integer $owner_id)

Внутрисистемный метод, не является частью публичного API

  1. Integer $owner_id id пользователя или группы

Возвращает String фрагмент SQL-запроса

isAllowedModule(Integer $owner_id, String $module)

Узнать, разрешен ли пользователю или группе $owner_id доступ к модулю $module

  1. Integer $owner_id id пользователя или группы пользователей

  2. String $module название модуля

Возвращает Boolean true если доступ разрешен

isAllowedMethod(Integer $owner_id, String $module, String $method)

Узнать, разрешен ли пользователю или группе $owner_id доступ к методу $method модуля $module

  1. Integer $owner_id id пользователя или группы пользователей

  2. String $module название модуля

  3. String $method название метода

Возвращает Boolean true если доступ на метод разрешен

isAllowedObject(Integer $owner_id, Integer $object_id)

Узнать, разрешен ли пользователю или группе $owner_id доступ на чтение страницы $object_id (класс umiHierarchyElement)

  1. Integer $owner_id id пользователя или группы пользователей

  2. Integer $object_id id страницы, доступ к которой проверяется

Возвращает Boolean true если есть доступ хотя бы на чтение

Узнать, является ли пользователь $user_id супервайзером

  1. Integer $user_id id пользователя (по умолчанию используется id текущего пользователя)

Возвращает Boolean true, если пользователь является супервайзером

isAdmin(Integer $user_id)

Узнать, является ли пользователь $user_id администратором, т. е. есть ли у него доступк администрированию хотя бы одного модуля

  1. Integer $user_id = false id пользователя (по умолчанию используется id текущего пользователя)

Возвращает Boolean true, если пользователь является администратором

isOwnerOfObject(Integer $object_id, user_id id)

Узнать, является ли пользователь $user_id владельцем объекта (класс umiObject) $object_id

  1. Integer $object_id id объекта (класс umiObject)

  2. $user_id id пользователя

Возвращает Boolean true, если пользователь является владельцем

setDefaultPermissions(Integer $element_id)

Сбросить настройки прав до дефолтных для страницы (класс umiHierarchyElement) $element_id

  1. Integer $element_id id страницы (класс umiHierarchyElement)

Возвращает Boolean false если произошла ошибка

resetElementPermissions(Integer $elementId, Integer $ownerId = false)

Удалить все права на странциу $elementId для ползователя или группы $ownerId

  1. Integer $elementId id страницы (класс umiHierarchyElement)

  2. Integer $ownerId=false id пользователя или группы, чьи права сбрасываются. Если false, то права сбрасываются для всех пользователей

resetModulesPermissions(Integer $ownerId, Array $modules = NULL)

Сбросить все права на модули и методы для пользователя или группы $ownerId

  1. Integer $ownerId id пользователя или группы пользователей

  2. Array $modules=NULL массив, который указывает модули, для которых сбросить права. По умолчанию, сбрасываются права на все модули

setElementPermissions(Integer $ownerId, Integer $elementId, Integer $level)

Установить определенные права на страница $elementId для пользователя или группы $ownerId

  1. Integer $ownerId id пользователя или группы пользователей

  2. Integer $elementId id страницы (класс umiHierarchyElement), для которой меняются права

  3. Integer $level уровень выставляемых прав то "0" до "2". "нет доступа" (0), "только чтение" (1), "чтение и запись" (2)

Возвращает Boolean true если не произошло ошибки

hasUserPermissions(Integer $ownerId)

Узнать, имеет ли пользователь или группа в принципе права на какие-нибудь страницы

  1. Integer $ownerId id пользователя или группы

Возвращает Boolean false, если записей нет

copyHierarchyPermissions(Integer $fromUserId, Integer $fromUserId)

Скопировать права на все страницы из $fromUserId в $toUserId

  1. Integer $fromUserId id пользователя или группы пользователей, из которых копируются права

  2. Integer $fromUserId id пользователя или группы пользователей, в которые копируются права

Получить id текущего пользователя

Возвращает Integer id текущего пользователя

isAllowedDomain(Integer $owner_id, Integer $domain_id)

Узнать, разрешено ли пользователю или группе $owner_id администрировать домен $domain_id

  1. Integer $owner_id id пользователя или группы пользователей

  2. Integer $domain_id id домена (класс domain)

Возвращает Integer 1, если доступ разрешен, 0 если нет

setAllowedDomain(Integer $owner_id, Integer $domain_id, Boolean $allow = true)

Установить права пользователю или группе $owner_id на администрирование домена $domain_id

  1. Integer $owner_id id пользователя или группы пользователей

  2. Integer $domain_id id домена (класс domain)

  3. Boolean $allow=true если true, то доступ разрешен

setDefaultElementPermissions(umiHierarchyElement $element, Integer $owner_id)

Установить права по умолчанию для страницы $element по отношению к пользователю $owner_id

  1. umiHierarchyElement $element экземпляр страницы

  2. Integer $owner_id id пользователя или группы пользователей

Возвращает Integer уровен доступа к странице, который был выбран системой

setAllElementsDefaultPermissions(Integer $owner_id)

Сбросить для пользователя или группы $owner_id права на все страницы на дефолтные

  1. Integer $owner_id id пользователя или группы пользователей

getUsersByElementPermissions(Integer $elementId, Integer $level)

Получить список всех пользователей или групп, имеющих права на страницу $elementId

  1. Integer $elementId id страницы

  2. Integer $level = 1 искомый уровень прав

Возвращает Array массив id пользователей или групп, имеющих права на страницу

pushElementPermissions(Integer $elementId, Integer $level)

Указать права на страницу. Влияет только на текущую сессию, данные в базе изменены не будут

  1. Integer $elementId id страницы

  2. Integer $level = 1 уровень прав доступа (0-3).

Возвращает permissionsCollection экземпляр класса permissionsCollection

Возвращает Integer $guestId id пользователя "Гость"

umi-cms.spb.su


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