Modx makeurl: makeUrl API MODX Evo ✈ Evolution CMS

Шаблонизатор Fenom в MODX Revolution

Сравнительная таблица элементов

Элементы ModX (пример) Fenom (пример)
Поля ресурса (Resource Fields) [[*pagetitle]] {$_modx->resource.pagetitle}
Переменные шаблона (Template Variables) [[*tag]] {$_modx->resource.tag}
Словари (Lexicon) [[%link_contacts]] {$_modx->lexicon(‘link_contacts’)} или
{‘link_contacts’ | lexicon}
Ссылки (links) [[~12]]
[[~[[*id]]]]
{$_modx->makeUrl(12)}
{$_modx->makeUrl($_modx->resource.id)}
Системные настройки (System settings) [[++access_category_enabled]] {$_modx->config. access_category_enabled} или
{‘access_category_enabled’ | config} или
{$_modx->config[‘access_category_enabled’]}
Плейсхолдеры (Placeholders) [[+image]] {$_modx->getPlaceholder(image)} или
{$image}
Плейсхолдеры с точкой или тире [[+tag.subtag]] {$_pls[‘tag.subtag’]}
Комментарии (Comments) [[- Это комментарий]] {* Это комментарий *}
Игнорирование кода с круглыми скобками {ignore} {/ignore}
Чанки (Chunks) [[$chunk]] {$_modx->getChunk(‘chunk’)} или
{include ‘chunk’}
Сниппеты (Snippets) [[!pdoMenu? &parents=`0` &level=`0`]] {$_modx->runSnippet(‘!pdoMenu’, [‘parents’=>’0′,’level’=>’0’])} или
{‘!pdoMenu’ | snippet:[‘parents’=>’0′,’level’=>’0’]}

Авторизация

Проверка авторизации пользователя Проверка доступа к контексту Проверка прав
{$_modx->isAuthenticated()} {$_modx->hasSessionContext(‘web’)} {$_modx->hasPermission(‘load’)}

Массивы и объекты

Массив/объект Описание Распечатать данные на экран
{$_modx->user} Массив с информацией о пользователе {$_modx->user | print_r}
{$_modx->context} Массив с информацией о контексте {$_modx->context | print_r}
{$_modx->resource} Массив с информацией о текущем ресурсе
{$_modx->resource | print_r}
{$_modx->lexicon} Объект modLexicon, который можно использовать для загрузки произвольных словарей

Полезные функции

Функция Описание
{$_modx->regClientCss(‘/assets/css/style. css’)} Подключение css файла
{$_modx->regClientScript(‘/assets/css/script.js’)} Подключение js файла
{$_modx->sendForward(1)} Загрузка ресурса без изменения ссылки
{$_modx->sendRedirect(‘http://modx.ru’)} Перенаправление на страницу
{$_modx->setPlaceholder(‘name’, ‘Ivan’)} Сохранение плейсхолдера
{$_modx->toPlaceholder(‘name’, ‘Ivan’,’my’)} Сохранение плейсхолдера с префиксом
{$_modx->toPlaceholders([‘city’ => ‘Moscow’, ‘man’ => [‘name’ => ‘Ivan’, ‘surname’ => ‘Ivanov’]],’my’)} Предает многоуровневый массив в плейсхолдер
{$_modx->setPlaceholders([‘name’ => ‘Ivan’, ‘surname’ => ‘Ivanov’])} Сохранение массива плейсхолдеров
{$_modx->getPlaceholder(‘name’)} Получение значения плейсхолдера
{$_modx->getPlaceholders()} Получение списка плейсхолдеров
{$_modx->unsetPlaceholder(‘name’)} Удаление плейсхолдера по ключу
{$_modx->unsetPlaceholders([‘name’, ‘surname’])} Удаление плейсхолдера по массиву ключей
{$_modx->regClientStartupScript(‘//ajax. googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js’)} Добавление js файла перед закрытием тега head
{$_modx->regClientStartupHTMLBlock(‘<strong>Привет мир</strong>’)} Добавление тегов перед закрытием тега head
{$_modx->regClientHTMLBlock(‘<div>(c) 2009 MODx</div>’)} Добавление тегов перед закрытием тега body
{$_modx->runProcessor(‘resource/update’, [‘id’ => 10,’alias’ => ‘test’,’context_key’ => ‘web’])} Запуск системного процессора
{$_modx->hasPermission(‘edit_chunk’)} Возвращает true, если пользователь имеет доступ к политике
{$_modx->isMember(‘Marketing’)} Проверяет, принадлежит ли пользователь группе
{$_modx->findResource(‘url-to/doc/’)} Возвращает true если ресурс найден
{$_modx->sendError(‘unavailable’)} Отправляем ошибку пользователю и прекращаем работу скрипта
{$_modx->getInfo()} Информация о скорости загрузки
{$_modx->getChildIds(23,6,[‘context’ => ‘web’]} Получаем список идентификаторов дочерних ресурсов
{$_modx->getParentIds(23,6,[‘context’ => ‘web’]} Получаем список идентификаторов родительских ресурсов, которым принадлежит данный ресурс
{$_modx->->getResource(1)} Получаем массив информации о текущем ресурсе по его id
{$_modx->getResources([‘published’ => 1, ‘deleted’ => 0])} Получаем массив ресурсов
{$_modx->cleanAlias()} Генерация псевдонима

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

Со всеми модификаторами можно ознакомиться здесь

Условный оператор


{set $pt = $_modx->resource. pagetitle}
{if $pt == 'Главная'}
    <p>Главная страница</p>
{else}
    <p>Не главная</p>
{/if}

Второй способ


{set $pt = $_modx->resource.pagetitle}

{$pt == 'Главная' ? '<p>Главная страница</p>' : '<p>Не главная</p>'}


Перебор элементов


{var $array = ['key' => 'value']}

{foreach $array as $key => $value}
    <p>{$key} is {$value}</p>
{/foreach}

Выборка из списка


{set $count = 3}
{set $array = [1,2,3,4,5,6]}
{if $count in list $array}
 // действия удовлетворяющие условию
{/if}

Множественный выбор


{switch  $_modx->resource.id}
{case '1'}
    <p>Главная страница</p>
{case '2'}
    <p>О компании</p>
{case '3'}
    <p>Услуги</p>
{/switch}

Шаблоны

Название шаблона «Базовый шаблон»


<!doctype html>
<html lang="ru">
  <head>
    <meta charset="{$_modx->config. modx_charset}">
    <base href="{$_modx->config.site_url}" />
    <title>{$_modx->resource.longtitle} - {$_modx->config.site_name} </title>
  </head>
  <body>
   
    // добавляем чанк
    {include 'file:chunks/header.html'}
    
    // расширяем шаблон
    {block 'center'}
           {include 'file:chunks/center.html'}
    {/block}
 
    {include 'file:chunks/footer.html'}
   
    {include 'file:chunks/js.html'}

  </body>
</html>


Шаблон «Второстепенные страницы»


// расширяем шаблон    
{extends 'template:Базовый шаблон'}

{block 'center'}
       {include 'file:chunks/othercenter.html'}
{/block}



@ru_modx — страница 1211 — Telegram web archive & catalog

« Назад

Страница 1211 из 1422

Далее »

Sergey

19.08.2018
16:49:06

$_modx->makeUrl($_modx->resource. id) вместо $_modx->resource.id

Евгений

19.08.2018
17:08:42

по ошибке нет id ресурса

Anton

19.08.2018
17:10:38

$_modx->makeUrl($_modx->resource.id) вместо $_modx->resource.id

Запутался. ( Как правильно написать? {$_modx->makeUrl($_modx->resource.id)|url:[‘service’=>’logout’]} ?

Миша

19.08.2018
17:11:18

Запутался. ( Как правильно написать? {$_modx->makeUrl($_modx->resource.id)|url:[‘service’=>’logout’]} ?

{$_modx->resource.id|url:[‘service’ => ‘logout’]}

Google

Sergey

19.08.2018
17:12:36

{$_modx->resource.id|url:[‘service’ => ‘logout’]}

а почему вы [[~[[*id]] переводите как $_modx->resource.id ведь это не верно

Миша

19.08.2018
17:13:06

[[~[[*id]]]] == {$_modx->resource.id|url}

Евгений

19.08.2018
17:16:03

https://docs.modx.pro/komponentyi/pdotools/parser искать по scheme

Anton

19.08.2018
17:35:33

{$_modx->resource. id|url:[‘scheme’=>’full’]:[‘service’=>’logout’]} вот так линк генерится вместе с ?service=logoutt, но при клике все равно не выходит, и ошибок в логах нету.

Anton

19.08.2018
18:08:03

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

 

и что-то вообще корзина не очищается.

 

я идиот, просто надо сниппеты некэшированными вызывать.

Sergey

19.08.2018
19:06:23

я идиот, просто надо сниппеты некэшированными вызывать.

Ты не идиот, просто теперь ты это знаешь ?

Anton

19.08.2018
19:08:16

Да я всегда это знал, просто делаю первый магаз на минишопе и тупо скопипастил из доков вызовы, а там кэшированные.

Pavel

19.08.2018
19:09:24

Помните Lays Мятный карась?

 

Евгений

19.08.2018
19:10:12

гурман

Serious

19.08.2018
19:10:51

Второе сметана зелень, а первое не понял что, но наверное перец

Google

Pavel

19. 08.2018
19:11:09

Ага, Lays С йогуртом и сезонной зеленью

 

Второй — Пряный

Serious

19.08.2018
19:11:41

Если что во многих странах йогурт это не очень сладкая вещь

 

Это на пост советском пространстве йогурт считается сладостью

Евгений

19.08.2018
19:12:14

салаты заправлять самое то, Миша не даст соврать)

Pavel

19.08.2018
19:12:37

Ну так классический греческмй йогурт это ксломолочный продукт без наполнителя

 

Я тут ещё нашёл местную тему — вспененный айран

 

Дичь какая-то ☺

 

0гтя кисломолочный продукты люблю

 

Anton

19.08.2018
19:14:35

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

Pavel

19.08.2018
19:14:40

Тут, это в Турции

 

Именно так

Anton

19.08.2018
19:15:54

а как-то можно сделать, чтоб в инлайновых чанках выполнился сниппет, или только если отдельный чанк делать?

Pavel

19. 08.2018
19:16:07

Самый клёвый кисломолочный продукт, что я пробовал, это специально скисленное свежее деревенской молоко. Скислено до состояния желе

Anton

19.08.2018
19:16:20

мне надо количество товаров в категории в пунктах меню отображать.

Pavel

19.08.2018
19:16:26

Моя бабушка так кислить умеет

Anton

19.08.2018
19:19:37

а кстати, некешированные сниппеты вообще не обновляются никогда, пока вручную кеш не сбросишь, или есть какой-то кулдаун?

karnas

19.08.2018
19:47:55

Моя бабушка так кислить умеет

простокваша называется)

Pavel

19.08.2018
19:57:10

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

Google

Anton

19.08.2018
20:01:28

а как сделать, чтоб мфильтр сам подхватывал опции для фильтрации? Или надо просто все возможные указать, а он лишние сам спрячет?

Николай

20.08.2018
04:17:58

а как сделать, чтоб мфильтр сам подхватывал опции для фильтрации? Или надо просто все возможные указать, а он лишние сам спрячет?

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

 

Можно pdoTools приспособить или написать сниппет обертку для mfilter

Евгений

20.08.2018
05:30:28

 

Очередная порция

Sergey

20.08.2018
06:01:54

а как сделать, чтоб мфильтр сам подхватывал опции для фильтрации? Или надо просто все возможные указать, а он лишние сам спрячет?

можно прописать все а чтобы не выводил пустые есть showEmptyFilters параметр

Evgeniy

20.08.2018
06:18:06

Иван накручивает))

Миша

20.08.2018
06:59:11

Иван харе )))

Евгений

20.08.2018
07:08:21

Mark — тот самый Марк?)

Derzaiii

20.08.2018
07:09:04

ух с утра подвалило)) народ не толпимся — расходимся по рабочим местам)

Sergey

20.08.2018
07:21:31

Китайцы поняли что их будут банить и маскируются.. ?

Ivan

20.08.2018
07:41:17

да хер его знает, боты или нет

 

может стыренные акки

Миша

20. 08.2018
08:08:27

где то давно была статья как убрать base_href с сайта

 

ни у кого в закладках нет?

Евгений

20.08.2018
08:08:58

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

Миша

20.08.2018
08:09:09

да модалки не пашут

 

хотя я первый раз на такое наталкиваюсь

Евгений

20.08.2018
08:10:34

помню табы не пахали

iWatchYouFromAfar

20.08.2018
08:10:39

https://web-revenue.ru/modx-seo-strict-zamenyaem-base-href-na-link-rel-canonical-href

Google

Anton

20.08.2018
08:15:56

Так просто суффикс контейнера поставить пустой

Admin

Anton

20.08.2018
08:16:06

В настройках чпу

Миша

20.08.2018
08:17:50

В настройках чпу

да он всегда пустой

Anton

20.08.2018
08:18:31

Ну и вложенные углы отключить. Я так делаю.

Ростислав

20.08.2018
08:25:20

Неделю назад обновил кучу сайтов до 2.6.5 и плагин gallery. Сейчас смотрю ломают понемногу, сайтмапы появляются и другие файлы которые я удалял. Я так понимаю без переименования директорий, создания htpasswd дела не будет?

Derzaiii

20.08.2018
08:26:05

Неделю назад обновил кучу сайтов до 2.6.5 и плагин gallery. Сейчас смотрю ломают понемногу, сайтмапы появляются и другие файлы которые я удалял. Я так понимаю без переименования директорий, создания htpasswd дела не будет?

без отката на бекап ДО взлома — толку не будет

 

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

Ростислав

20.08.2018
08:27:01

без отката на бекап ДО взлома — толку не будет

А если я антивирусом пришёлся и вручную почистил?

Derzaiii

20.08.2018
08:27:21

Повторюсь — очень сложно очистить всё.

Ростислав

20.08.2018
08:35:42

Повторюсь — очень сложно очистить всё.

Дело в том что много сайтов создано буквально 2-3 недели назад, особо нечего откатывать. Я думаю сейчас этот вирус популярный(который создаёт сайтмапы). Интересно хватит ли обновления движка и галереи чтобы его удержать или придётся дополнительно директории переименовывать и т.п.? Думаете aibolit не способен найти все вирусные файлы чтобы вручную почистить?

iWatchYouFromAfar

20.08.2018
08:37:47

Народ, на сайте есть несколько кастомных полей пользователя, во все эти поля пользователь вносит урлы, урлы вносят в разоброй (с протоколами и без). Как мне правильно применить сниппет валидации? Чтобы протокол вырезался?

Sergey

20.08.2018
08:38:04

Дело в том что много сайтов создано буквально 2-3 недели назад, особо нечего откатывать. Я думаю сейчас этот вирус популярный(который создаёт сайтмапы). Интересно хватит ли обновления движка и галереи чтобы его удержать или придётся дополнительно директории переименовывать и т.п.? Думаете aibolit не способен найти все вирусные файлы чтобы вручную почистить?

Айболит не способен

Ростислав

20.08.2018
08:40:38

Народ, на сайте есть несколько кастомных полей пользователя, во все эти поля пользователь вносит урлы, урлы вносят в разоброй (с протоколами и без). Как мне правильно применить сниппет валидации? Чтобы протокол вырезался?

я писал плагин который обрезает http/https. Он далек от идеала, но могу скинуть

iWatchYouFromAfar

20.08.2018
08:41:32

я писал плагин который обрезает http/https. Он далек от идеала, но могу скинуть

Именно плагин? Кидай конечно, буду благодарен. Я пока сниппетом пытаюсь вырезать, вырезает нафиг весь урл…

Ростислав

20.08.2018
08:42:11

Именно плагин? Кидай конечно, буду благодарен. Я пока сниппетом пытаюсь вырезать, вырезает нафиг весь урл…

сори, сниппет. Ща найду

Jack

20.08.2018
08:42:15

Ребят, что лучше/удобнее/пошустрее по возможностям для множества однотипных страниц, стандартные ресурсы с компонентом gallery или может быть minishop2 c ms2gallery?

Евгений

20.08.2018
08:42:45

я за ms2gallery

 

хотя gallery давно уже не пользовался

Jack

20.08.2018
08:46:45

просто есть ли смысл ставить компонент магазина, когда нужны простые страницы с галлереей и со своими чанками?

Google

Миша

20. 08.2018
08:47:05

просто есть ли смысл ставить компонент магазина, когда нужны простые страницы с галлереей и со своими чанками?

ms2Gallery, причем тут магазин\

Евгений

20.08.2018
08:47:27

просто есть ли смысл ставить компонент магазина, когда нужны простые страницы с галлереей и со своими чанками?

модуль галереи есть отедльно, он платный

Ростислав

20.08.2018
08:47:55

Народ, на сайте есть несколько кастомных полей пользователя, во все эти поля пользователь вносит урлы, урлы вносят в разоброй (с протоколами и без). Как мне правильно применить сниппет валидации? Чтобы протокол вырезался?

Возможно я не так понял. Пользователь заполняет поля в админке?

iWatchYouFromAfar

20.08.2018
08:48:11

Возможно я не так понял. Пользователь заполняет поля в админке?

нет, через фронт

Jack

20.08.2018
08:48:43

ms2Gallery, причем тут магазин\

а понял, я просто думал для минишоп она только, спасибо

iWatchYouFromAfar

20. 08.2018
08:49:13

Возможно я не так понял. Пользователь заполняет поля в админке?

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

Jack

20.08.2018
08:50:06

Еще вопросик важный. Мне нужно сделать мультиподдоменную региональную структуру сайта: spb.site.ru, ekb.site.ru и т.д. Но, нужно, чтобы в ресурсах контекстов вставлялись свои чанки и tv, например, в заголовок и текст подставлялся tv «в Санкт-Петербурге», tv со своим телефоном и адресом и т.п. Как это вообще правильно реализовать? Может есть что-то готовое?

Миша

20.08.2018
08:50:30

Еще вопросик важный. Мне нужно сделать мультиподдоменную региональную структуру сайта: spb.site.ru, ekb.site.ru и т.д. Но, нужно, чтобы в ресурсах контекстов вставлялись свои чанки и tv, например, в заголовок и текст подставлялся tv «в Санкт-Петербурге», tv со своим телефоном и адресом и т.п. Как это вообще правильно реализовать? Может есть что-то готовое?

changeDomain

Евгений

20. 08.2018
08:50:38

дело говорит

Ростислав

20.08.2018
08:51:26

нет, через фронт

а, ну тут не помогу, извините. Возможно нужно прикрутить какой-то inputmask

« Назад

Страница 1211 из 1422

Далее »

Открыть в Telegram

Перенаправление устаревших URI в MODX CMS

Проблема

Перенаправления — это факт жизни. (Да, в этом контексте Жизнь == Интернет.) К счастью, MODX предоставляет вам множество опций для обработки перенаправлений, включая основные методы и устанавливаемые дополнения. Вот обзор большинства, если не всех, этих вариантов.

Опции для перенаправления устаревших URI в MODX

Redirector

Redirector долгое время был незаменимым дополнением для обработки перенаправлений в MODX. Он полнофункциональный, включая страницу пользовательского менеджера (CMP), которая предоставляет простой в использовании интерфейс для людей, не являющихся техническими специалистами, для управления своими перенаправлениями.

Он может даже обрабатывать более сложные требования, такие как отслеживание действий диспетчера для измененных URI. Если вам нужна помощь в реализации некоторых более продвинутых функций или вы можете воспользоваться дополнительными функциями, свяжитесь с командой MODX PS.

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

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

Конечно, он срабатывает только при событии OnPageNotFound, так что общая производительность сайта, вероятно, не будет отправлена ​​в канализацию, но если вам нужна только отвертка, может быть, лучше не использовать дрель…?

htaccess или nginx перезаписывает

На сегодняшний день наиболее эффективным способом перенаправления трафика является настройка сервера. В Интернете есть много документации по этой теме, написанной гораздо более квалифицированными людьми, чем я, поэтому используйте этот всемогущий ресурс для разработчиков «Google», и вы почти наверняка найдете то, что вам нужно. Если вы используете MODX Cloud (или любой сервер nginx), вам, вероятно, будет полезна эта документация здесь.

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

Однако есть и недостатки. Если у вас есть огромный список URI для перенаправления, может быть неудобно управлять ими в файле .htaccess или .conf. Кроме того, вы ограничены в «динамических» вещах, которые вы можете делать… Я объясню, что это может означать, в следующем разделе…

Пользовательский плагин MODX с использованием основных методов

Допустим, вы только что перестроили веб-сайт клиента в MODX, но клиент обеспокоен SEO (а кого нет?) Вам нужно перенаправить устаревшие URI, но что, если вы также хотите сохранить контроль цели перенаправления путем «маршрутизации» через ресурс MODX?

Использование оператора Switch

Вот пример того, как вы можете сделать это с помощью пользовательского плагина, некоторых основных методов MODX и оператора switch:

Комментарии должны прояснить, что здесь происходит. Обратите внимание, что с помощью $modx->makeUrl() , у вас есть доступ к некоторым довольно надежным функциям динамической маршрутизации. При использовании оператора switch будет выполняться только соответствующий случай. Этот метод, вероятно, начинает падать, если вам нужно управлять кучей редиректов. Кроме того, он не раскрывает ничего из этого людям, не занимающимся кодированием. Для этого вернемся к Redirector.

Использование массива

Иногда клиент предоставляет список старых URI, которые он хочет сопоставить с новыми URI. Я сталкивался с этим несколько раз. Если нет необходимости использовать метод makeURL, простой PHP-массив может быть немного быстрее, чем оператор switch:

Опять же, не так быстро, как настройка сервера, но определенно быстрее, чем другие параметры плагина, упомянутые здесь, а также он более доступен, чем файл nginx .conf. Вы можете отредактировать этот плагин, например, в диспетчере MODX, и вы можете добавить переменную $baseUrl для обработки нескольких контекстов.

Фрагменты кода и другие параметры

Не каждое требование перенаправления требует обработки длинного списка URI. Иногда вам нужно перенаправить один Ресурс на внешнюю ссылку или на другой Ресурс. Вы можете сделать это, просто сделав свой ресурс документом WebLink, который является встроенной функцией MODX. Вы также можете динамически вызвать фрагмент Redirectoid в своем шаблоне или перенаправить на первый «дочерний» ресурс данного ресурса с помощью FirstChildRedirect.

Свобода творчества

Это ни в коем случае не исчерпывающий список, но вы можете видеть, что MODX дает вам множество вариантов, связанных с домашними обязанностями по перенаправлению старых URL-адресов. Если у вас есть собственные решения, поделитесь ими в комментариях 🙂

Информация для перенаправления — SiteDash, возьмите под контроль свои сайты MODX

перенаправление — это дополнение от sepiariver, впервые выпущенное 15 февраля 2022 года.

Описание упаковки

Инструкции по использованию/установке

Детали

Разработчик(и)
сепиарвер
Выпущено
15.02.2022
Первое появление
15.02.2022
Лицензия
GPLv2
Поддерживаемые базы данных
MySQL
Минимальные требования MODX
2

redirectoid Релизы

Поставщик Подпись Выпущено
MODX. com 3.0.0-rc1 2022-02-15 (1 год назад)
MODX.com 2.2.2-пл 2021-10-16 (1 год назад)
MODX.com 2.
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

© 2019 Штирлиц Сеть печатных салонов в Перми

Цифровая печать, цветное и черно-белое копирование документов, сканирование документов, ризография в Перми.