diff --git a/README.md b/README.md
index 9fa5016d..6ba99e2d 100755
--- a/README.md
+++ b/README.md
@@ -1,8 +1,18 @@
-MODX Evolution Docs
+Evolution CMS Documentation
=========
-Документация по MODX Evolution
+This is a repository of [Evolution CMS](https://evo.im/) documentation.
-Разработка мануала сообща через pull-requests + issues.
+Help us develop a good documentation with your feedback (open issues) and new edits (pull-requests)!
-Автоматический билд после вливания в мастер на сайт.
+The website will be updated automatically after merging your branch with master.
+
+
+
+Документація Evolution CMS
+=========
+Це репозиторій документації [Evolution CMS](https://evo.im/).
+
+Допоможи нам розробити гарну документацію за допомогою pull-request та відкриттям issues.
+
+Сайт документації буде автоматично оновлено після вливання вашої гілки в мастер-гілку.
diff --git a/config.json b/config.json
index 3ecd05d0..854c211e 100644
--- a/config.json
+++ b/config.json
@@ -1,6 +1,6 @@
{
"title": "EVO Docs 1.3",
- "tagline": "Документация по Evolution CMS 1.3",
+ "tagline": "Документація по Evolution CMS 1.3",
"docs_path": "docs",
"date_modified": true
}
diff --git a/en/01_General information/10_More_about_Evolution_CMS/01_Website_management_in_Evolution.md b/en/01_General information/10_More_about_Evolution_CMS/01_Website_management_in_Evolution.md
new file mode 100644
index 00000000..7414de32
--- /dev/null
+++ b/en/01_General information/10_More_about_Evolution_CMS/01_Website_management_in_Evolution.md
@@ -0,0 +1,26 @@
+Most of our new users after couple hours of studying are able to confidently work and understand all features of Evolution CMS on their own.
+There's no need of constant consultation as it often happens with other CMS.
+
+## What makes Evolution CMS so simple? ##
+
+**All necessary information right at hand**
+
+Evolution has simple list of all document which is present on website. It has a tree structured UI and resemblances familiar file/directory structure.
+Clicking right button opens the menu that consist of necessary actions on documents, such as:
+
+- create new document
+- publish / unpublish document
+- delete document
+- move document
+- make a copy of a document
+
+## Control documents the way you want ##
+
+Documents in the document tree have different visual representation depending on their states, which helps with easier navigation and orientation inside of system.
+Deleted documents are not removed from the document tree, but have a strikethrough and highlighted with red color.
+
+There's a feature to duplicate documents and all of their nested children, this is a huge time saver when you need to make multiple sections of the same kind.
+
+## Managing TV-parameters ##
+
+Depending on your TV-parameter settings, it could be a text field, dropdown menu, checkboxes, radio buttons, image uploading field or an additional rich text editor.
\ No newline at end of file
diff --git a/en/01_General information/10_More_about_Evolution_CMS/02_SEO_in_Evolution.md b/en/01_General information/10_More_about_Evolution_CMS/02_SEO_in_Evolution.md
new file mode 100644
index 00000000..28fed7a5
--- /dev/null
+++ b/en/01_General information/10_More_about_Evolution_CMS/02_SEO_in_Evolution.md
@@ -0,0 +1,5 @@
+## SEO and HTML markup management ##
+
+Just because that all code is under full developer's control, Evolution makes it easier to create websites with search engine optimisation in mind. Fully customizible URLs, tools for managing meta tags and keywords.
+
+Based on our experience we could condfidently say that many Evolution websites are on top of search results.
\ No newline at end of file
diff --git "a/en/01_Info/10_More/04_\320\237\320\265\321\200\320\265\320\262\320\276\320\264_GNU_GPLv3.md" b/en/01_General information/10_More_about_Evolution_CMS/04_Unofficial_translation_GNU_GPLv3.md
similarity index 100%
rename from "en/01_Info/10_More/04_\320\237\320\265\321\200\320\265\320\262\320\276\320\264_GNU_GPLv3.md"
rename to en/01_General information/10_More_about_Evolution_CMS/04_Unofficial_translation_GNU_GPLv3.md
diff --git a/en/01_General information/10_More_about_Evolution_CMS/05_Hosting_requirements.md b/en/01_General information/10_More_about_Evolution_CMS/05_Hosting_requirements.md
new file mode 100644
index 00000000..22100383
--- /dev/null
+++ b/en/01_General information/10_More_about_Evolution_CMS/05_Hosting_requirements.md
@@ -0,0 +1,60 @@
+## Minimum requirements ##
+### Server ###
+* Linux x86, x86-64
+* Windows
+* Mac OS X
+* Web Server
+* Apache 1.3.x or Apache 2.2.x
+* IIS 6.0+
+* Zeus
+* lighthttpd
+* Cherokee
+
+### Database ###
+* MySQL >4.1.20
+* Default table encoding of UTF-8
+* SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP
+* InnoDB and MyISAM table types
+
+
+### PHP ###
+* PHP 5.4
+* JSON
+* GD lib
+* Freetype
+* SimpleXML
+* safe_mode off
+* register_globals off
+* magic_quotes_gpc off
+* PHP memory_limit 24MB
+
+## Recommended requirements ##
+### Server ###
+* Linux x86, x86-64
+* Windows Server 2008
+* Web Server
+* Apache 2.2.x
+* Nginx
+* IIS 7.0
+
+### Database ###
+
+* MySQL >4.1.20 (latest stable release)
+* Default table encoding of UTF-8 BOM
+* SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP, CREATE TEMPORARY TABLES
+* InnoDB and MyISAM table types
+
+### PHP ###
+
+* PHP version >= 7.3
+* Running as FastCGI
+* zlib
+* JSON
+* cURL
+* Imagemagick
+* GD lib
+* SimpleXML
+* safe_mode off
+* register_globals off
+* magic_quotes_gpc off
+* PHP memory_limit >=32MB
\ No newline at end of file
diff --git a/en/01_General information/10_More_about_Evolution_CMS/index.md b/en/01_General information/10_More_about_Evolution_CMS/index.md
new file mode 100644
index 00000000..dc391793
--- /dev/null
+++ b/en/01_General information/10_More_about_Evolution_CMS/index.md
@@ -0,0 +1,41 @@
+Evolution is a functional, extensible and user-friendly site development system (CMF), as well as a user-friendly management system (CMS). This engine is a new generation, which was originally designed to create Web 2.0 generation projects
+
+## Key Features ##
+- intuitive control system interface
+- simple template language
+- full control of HTML-code, allowing to implement any design
+- convenient document tree
+- integrated mechanism for working with ajax
+- built-in NC support (SEF)
+- user management
+- separation of managers and web users
+- create user groups
+- creating groups of documents with limited access for both visitors and managers
+- effective work with documents
+- publication and cancellation of the publication of the document, including automation at the specified time
+- support for different types of documents (MIME)
+- creation of additional parameters of various types (text box, checkboxes, drop-down list, etc.)
+- integrated SEO engine (keyword and meta tag management)
+- excellent extensibility (with the help of snippets, plug-ins and modules)
+
+**Common used extensions:**
+
+**DocLister** - The ideal solution for the output of news feeds, lists of goods. It is possible to work with arbitrary tables. From the access box, filters, extensions, various types of sorting by standard system fields and TV-parameters.
+
+**DLMenu** - Tool for organizing menus. It gives an opportunity to organize both a simple, multi-level and drop-down menu. Easy to change and customizable.
+
+**FormLister** - Manages the work of forms in the CMS. Allows to organize any form and its processing. It can simply send to the mail the information entered or process it to get some result - say, create a new document with the information filled in.
+
+**DLCrumbs** - Creation of chain links ("bread crumbs") on the site.
+
+**evoSearch** - search the site.
+
+A large number of ready-made add-ons are available on our website and the official repository.
+
+## License ##
+
+Evolution CMS is distributed under the GNU / GPL license, which makes it possible to use this CMS for free without any restrictions and makes it possible to work with open source.
+
+## Requirements ##
+
+Evolution CMS 3.0 requires PHP >= 7.3.
diff --git a/en/01_General information/index.md b/en/01_General information/index.md
new file mode 100644
index 00000000..8e31f70c
--- /dev/null
+++ b/en/01_General information/index.md
@@ -0,0 +1,2 @@
+This section contains general information about Evolution CMS.
+This is a great resourse for professionals who already worked with Evolution and for the newcomers. If you want to know what EVO has to offer, we recommend that you read everything in the order of these help pages. If you have any questions or the information seems insufficient to you, then it's best to contact the community. Based on your questions, we constantly improve our material which means quality of documentation depends on you!
\ No newline at end of file
diff --git "a/en/01_Info/10_More/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274_\320\275\320\260_Evolution.md" "b/en/01_Info/10_More/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274_\320\275\320\260_Evolution.md"
deleted file mode 100644
index 4b994d24..00000000
--- "a/en/01_Info/10_More/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274_\320\275\320\260_Evolution.md"
+++ /dev/null
@@ -1,22 +0,0 @@
-При том, что MODx имеет отличную гибкость в плане разработки сайтом, он остается очень простым в использовании. Большинству начинающих пользователей хватает около 2 часов для обучения, после чего они уверенно начинают работать и самостоятельно осваивать новые возможности. Постоянного консультирования, как это часто происходит с другими CMS, как правило не требуется.
-
-Что же позволяет MODx оставаться таким простым?
-
-Нужная информация всегда под рукой
-
-В MODx организован простой список всех документов, которые присутствуют на сайте. Он организован в виде дерева и очень похож на привычную концепцию папок и файлов. С помощью правой кнопки вызывается меню, которое позволяет осуществлять необходимые действия над документами:
-
-создавать
-публиковать или снимать с публикации
-удалять
-переносить
-делать копию
-Документы под контролем
-
-Документы в дереве отличаются своим видом, в зависимости от их настройки и это позволяет сразу определить какие действия нужно сделать для получения результата. Даже удаленные документы не выкидываются из общего списка, а аккуратно зачеркиваются и выделяются красным цветом. Также отличаются опубликованные и неопубликованные документы, а также расположенные в меню.
-
-Не менее интересна возможность копировать документы, включая все вложенные. Таким образом легко можно создать однотипные разделы за короткий промежуток времени.
-
-Управление TV-параметрами
-
-В зависимости от настройки TV-параметр предлагает тот или иной вариант управления. Он может выглядеть как обычное текстовое поле, выпадающий список, набор флажков (checkbox), переключателей (radio), поля для выбора изображения или дополнительного поля с большим визуальным редактором.
\ No newline at end of file
diff --git "a/en/01_Info/10_More/02_\320\237\321\200\320\276\320\264\320\262\320\270\320\266\320\265\320\275\320\270\320\265_\320\275\320\260_Evolution.md" "b/en/01_Info/10_More/02_\320\237\321\200\320\276\320\264\320\262\320\270\320\266\320\265\320\275\320\270\320\265_\320\275\320\260_Evolution.md"
deleted file mode 100644
index 59bdd653..00000000
--- "a/en/01_Info/10_More/02_\320\237\321\200\320\276\320\264\320\262\320\270\320\266\320\265\320\275\320\270\320\265_\320\275\320\260_Evolution.md"
+++ /dev/null
@@ -1,3 +0,0 @@
-Уже благодаря только тому, что весь код находится под полным контролем разработчика, MODx позволяет изначально делать сайты с учетом внутренней оптимизации. Полная поддержка ЧПУ очень нравится поисковикам. Кроме того, есть инструменты для управления мета-тегами и ключевыми словами.
-
-Исходя из опыта можно с уверенностью сказать, что многие сайты на MODx очень часто самостоятельно занимают хорошие позиции в поисковиках.
\ No newline at end of file
diff --git a/en/01_Info/10_More/index.md b/en/01_Info/10_More/index.md
deleted file mode 100644
index a11e1111..00000000
--- a/en/01_Info/10_More/index.md
+++ /dev/null
@@ -1,53 +0,0 @@
-MODx - функциональная, расширяемая и удобная система разработки сайта (cmf), а также удобная система управления(cms). Это движок нового поколения, который изначально рассчитан на создание проектов поколения Веб 2.0
-
-## Основные особенности ##
-- интуитивно понятный интерфейс системы управления
-- простой язык шаблонов
-- полный контроль HTML-кода, позволяющий реализовать любой дизайн
-- удобное дерево документов
-- интегрированный механизм работы с ajax
-- встроенная поддержка ЧПУ (SEF)
-- управление пользователями
-- разделение менеджеров и веб-пользователей
-- создание групп пользователей
-- создание групп документов с ограниченным доступом как для посетителей, так и менеджеров
-- эффективная работа с документами
-- публикация и отмена публикации документа, в том числе в указанное время
-- поддержка документов разных типов (MIME)
-- создание дополнительных параметров различных типов (текстовое поле, чекбоксы, выпадающий список и т.д.)
-- встроенный механизм SEO (управление ключевыми словами и мета-тегами)
-- отличная расширяемость (с помощью сниппетов, плагинов и модулей)
-
-** Стандартные расширения:**
-
-**Ditto** - формирует списки материалов с разбиением на страницы. Это может быть лента новостей или блогов, каталог товаров. Позволяет вывести как обычный списочек документов в виде ссылок, так и сортированный по заданному параметру. Позволяет использовать любые дополнительные параметры и вывести имя автора статьи, количество комментариев, стоимость товара и т.д. В данный момент устарел.
-
-**DocLister** - современная и мощная замена Ditto. Идеальное решения для вывода новостных лент, списков товаров. Есть возможность работать с произвольными таблицами.
-Работает быстрее, чем Ditto, потребляет в разы меньше памяти. Из коробки доступы фильтры, расширения, различные типы сортировки по стандартным полям Modx и TV-параметрам.
-
-**Wayfinder** - инструмент организации меню. Дает возможность организации как простого, так многоуровневого и выпадающего меню. Легко изменяется и настраивается.
-
-**eForm** - управляет работой форм в CMS. Позволяет организовать любую форму и ее обработку. Может просто отправить на почту введенную информацию или обработать для получения какого-то результата -- допустим, создать новый документ с заполненной информацией.
-
-**Jot** - механизм комментарования пользователями.
-
-**Breadcrumbs** - создание на сайте цепочных ссылок («хлебные крошки»).
-
-**AjaxSearch** - поиск по сайту с использованием Ajax.
-
-Есть большое количество готовых дополнений на нашем сайте и официальном репозитории.
-
-## Лицензия ##
-
-MODx распространяется под лицензией GNU/GPL, что позволяет использовать эту CMS бесплатно без ограничений и дает возможность работать с открытым кодом (opensource).
-
-## Требования ##
-
-PHP 4.3.10 или старше. На PHP 5 также сложностей не замечено. Также в ближайшем будущем разработчики обещают специальные возможности именно для PHP 5.
-MySQL 4.1.x или старше.
-
-### Награды ###
-
-MODx - самая многообещающая CMS 2007 года.
-
-MODx получил 1 место в номинации «самая многообещающая CMS 2007 года».
diff --git a/en/01_Info/index.md b/en/01_Info/index.md
deleted file mode 100755
index 64194932..00000000
--- a/en/01_Info/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-В этом разделе содержится общая информация о Evolution CMS. В основном она будет полезна тем, кто только начинает свое знакомство с этой CMS. Хотя и для специалистов здесь найдется много интересного.
-
-Если вы хотите разобраться в том, что вам может предложить EVO, то рекомендуем вам читать все в том порядке, который существует. Если возникли какие-то вопросы или материал показался вам недостаточно раскрытым, то лучше всего обратиться в сообщество. На основе ваших вопросов мы постоянно улучшаем наши материалы, а значит их качество зависит от вас.
\ No newline at end of file
diff --git a/en/02_For_users/01_Site management/20_Friendly_URL_Solutions.md b/en/02_For_users/01_Site management/20_Friendly_URL_Solutions.md
index 936f1599..ae63121d 100644
--- a/en/02_For_users/01_Site management/20_Friendly_URL_Solutions.md
+++ b/en/02_For_users/01_Site management/20_Friendly_URL_Solutions.md
@@ -1,16 +1,15 @@
-
Evo supports Friendly URLs via this .htaccess file. You must serve web pages via Apache with mod_rewrite to use this functionality, and you must change the file name from ht.access to .htaccess. Additional tweaks and environment specific additions follow the default template below:
# Exclude /assets and/manager directories from rewrite rules
RewriteRule ^(manager|assets) - [L]
# For Friendly URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1[L,QSA]
# Reduce server overhead by enabling output compression ifsupported.
#php_flag zlib.output_compression On
#php_value zlib.output_compression_level 5
+ + [Common Edits to the Default .htacces File](#commonedits)
+ + [Admin Protection](#adminprotection)
+ + [Session Handling](#sessionhandling)
+ + [CSS or JS files as Evo documents](#cssjsdocuments)
+ + [Timezone](#timezone)
+ + [Default Character Sets](#defaultcharsets)
+ + [Register Globals](#registerglobals)
+ + [Solving Internet Explorer Woes](#solvingie)
+
+## Apache mod_rewrite .htaccess Solutions for Evo
+Evo supports Friendly URLs via this `.htaccess` file. You must serve web pages via Apache with `mod_rewrite` to use this functionality, and you must change the file name from `ht.access` to `.htaccess`. Additional tweaks and environment specific additions follow the default template below:
+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
# Fix Apache internal dummy connections from breaking [(site_url)] cache
If you're working off of virtual domains and have a preview for development or while waiting for DNS updates to occur such as accessing your site through "http://10.0.0.1/~myacct", the rewrite rule should be written as follows. Don't forget to change it back when you go live.
If you would like to limit the admin interface to being accessed by only a specific IP address, but need access to some things on the public site like the captcha, use the following. Make sure this goes inside the admins interface directory:
The first line ("Options +FollowSymlinks") may need to be commented out in some situations where a similar line is present in the site install root to prevent server errors.
-
Session Handling
+
Session Handling
If you are deployed in an environment that has problems with aggressive garbage collection, as evidenced by unexpected and frequent logouts from the admin interface, then you can adjust the location of the sessions to remove them from the default and shared global tmp/session location:
If you add this to your .htaccess file, make sure to also add it to the .htaccess file located in the admin interface directory.
By default, Evo's htaccess template file excludes the /assets and admin interface directories from rewrite rules. If you are using a Evo document as a CSS file, you'll need to adjust the one line to allow rewrites in the /assets directory if that's where you store your CSS file.
@@ -40,15 +39,15 @@
If you still wish to maintain some subdirectories in the exclusions, you could disable /assets/images and /assets/snippets for example with the following rule:
Some servers do not have their timezone settings set, which can cause issues. You can try the following setting with full details of timezone definitions available in the full List of Supported Timezones
Really, you should fix your code and database to handle character sets properly. But, if you insist, please read the AddDefaultCharset Directive and you might consider using:
Warning
If your server has register_globals enabled (and it's not possible to disable), run as fast as possible to a new webhost. Seriously.
As of Evo v.1.2.1 your server must have register_globals deactivated, otherwise Evo will not work.
@@ -58,9 +57,9 @@
IF REGISTER_GLOBALS DIRECTIVE CAUSES 500 INTERNAL SERVER ERRORS:
Your server does not allow PHP directives to be set via .htaccess. In that case you must make this change in your php.ini file instead. If you are using a commercial web host, contact the administrators for assistance in doing this. Not all servers allow local php.ini files, and they should include all PHP configurations (not just this one), or you will effectively reset everything to PHP defaults. Consult www.php.net for more detailed information about setting PHP directives.
# Turn off register_globals because I have a lazy webhost that doesn't care about security
php_flag register_globals Off
-
Solving Internet Explorer Woes
+
Solving Internet Explorer Woes
If htc files are being used on your site, some servers may serve this with the incorrect mime type. The following can be added to resolve this. The following is critical for MS Windows XP SP2 surfers:
The following directives stop screen flicker in IE on CSS rollovers. When they're in place, you may have to do a force-refresh in order to see changes in your designs.
# Fix screen flicker forimages in Internet Explorer
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
BrowserMatch "MSIE"brokenvary=1
BrowserMatch "Mozilla/4.[0-9]{2}"brokenvary=1
BrowserMatch "Opera"!brokenvary
SetEnvIf brokenvary 1 force-no-vary
-
.htaccess directives provide directory-level configuration overrides when you cannot access the main Apache httpd.conf file. The main configuration file should be used for server directives whenever possible because .htaccess rules result in increased page processing times.
\ No newline at end of file
+
.htaccess directives provide directory-level configuration overrides when you cannot access the main Apache httpd.conf file. The main configuration file should be used for server directives whenever possible because .htaccess rules result in increased page processing times.
diff --git a/en/02_For_users/01_Terminology.md b/en/02_For_users/01_Terminology.md
new file mode 100644
index 00000000..c5f68051
--- /dev/null
+++ b/en/02_For_users/01_Terminology.md
@@ -0,0 +1,17 @@
+## Template ##
+Template - the main part of the page of the site, which determines its design. The template does not require special syntax and is a simple HTML code (and possibly XHTML or other) with the call of the necessary chunks, parameters and snippets.
+
+The number of templates most often depends on the appearance and functionality of the site. As a rule, templates are created for various sections and pages of the site.
+
+For example, it will be logical to create different templates for the product and for the news and attach various TV parameters to them. This will allow the content manager to fill the site faster and more correctly. It will also greatly facilitate the work of a programmer if you need to make some news feeds or products.
+
+## Chunk ##
+A chunk is a small piece of HTML code or other information that can be reused in a template, other chunk, or snippet.
+
+## TV Parameter ##
+TB parameter - an element that contains certain information for the current page. Parameters can be directly displayed on the page or pass a snippet as a parameter.
+
+## Snippet ##
+A snippet is a PHP code that displays the result of its work in the place of the template/chunk where the call to this snippet is placed.
+
+Typically, snippets are used to output dynamically changing content. They can be used to create menus, comments, news feeds, blogs or any other functionality that is possible in the php language in conjunction with the Evolution API system.
diff --git "a/en/02_For_users/01_\320\242\320\265\321\200\320\274\320\270\320\275\320\276\320\273\320\276\320\263\320\270\321\217.md" "b/en/02_For_users/01_\320\242\320\265\321\200\320\274\320\270\320\275\320\276\320\273\320\276\320\263\320\270\321\217.md"
deleted file mode 100644
index 16d0d954..00000000
--- "a/en/02_For_users/01_\320\242\320\265\321\200\320\274\320\270\320\275\320\276\320\273\320\276\320\263\320\270\321\217.md"
+++ /dev/null
@@ -1,21 +0,0 @@
-## Шаблон ##
-Шаблон - основная часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
-
-Количество шаблонов чаще всего зависит от внешнего вида и функционала сайта. Как правило, для различных разделов и страниц сайта создаются свои шаблоны.
-
-Например, будет логичным создать разные шаблоны для товара и для новости и прикрепить к ним различные ТВ-параметры. Это позволит контент-менеджеру быстрей и правильней заполнить сайт. Также это существенно облегчит работу программиста, если потребуется сделать какие-то ленты новостей или товаров.
-
-
-## Чанк ##
-Чанк это небольшой кусок HTML-кода или другой информации, который можно многократно использовать в шаблоне, другом чанке или сниппете.
-
-
-## ТВ-параметр ##
-
-TВ-параметр - элемент, который содержит определенную информацию для текущей страницы. Параметры можно непосредственно вывести на страницу или передать сниппету в качестве параметра.
-
-## Сниппет ###
-Сниппет — это код на языке PHP, который выводит результат своей работы в том месте шаблона/чанка, где размещен вызов этого сниппета.
-
-Как правило, сниппеты используются вывода динамически меняющегося содержимого.
-Они могут использоваться для создания меню, комментариев, новостных лент, блогов или любого другого функционала, который возможен на языке php в связке с API системы Evolution.
\ No newline at end of file
diff --git a/en/02_For_users/02_ContentEditing/10_Resources/60_Caching.md b/en/02_For_users/02_ContentEditing/10_Resources/60_Caching.md
new file mode 100644
index 00000000..3d0e6b62
--- /dev/null
+++ b/en/02_For_users/02_ContentEditing/10_Resources/60_Caching.md
@@ -0,0 +1,19 @@
+Caching for a document can be enabled using the "Cached" option on the "Page Setup" tab.
+
+If you enable document caching, this means that the document and its contents will only run the first time the document is requested. Then the results of the work are "saved" in the cache and retrieved from there for any subsequent requests.
+
+** This can speed up page loading because snippets won't be executed on every request. **
+
+If you clear the site's cache by clicking "Clear Cache" in the admin interface, you'll see new content because the page will be parsed again.
+
+## Snippet caching ##
+Snipets, if you call them using the [[Snippet]] construct, will be cached.
+
+You can make the snippet work every time the page loads, even if the document itself is cached, by calling: (Note that the parentheses are replaced with exclamation points) Such a snippet will be executed each time the page is visited.[!Snippet!]
+
+As a rule, on sites with low traffic, all snippets are launched uncachable. But if you want to optimize your site, you can call snippets whose data rarely changes in cached mode. This will speed up the site.
+
+## Caching and development ##
+When you design a site, it is best to disable caching in the system configuration. This can help you, as data changes frequently during the development process and you should always see the latest version of how snippets and documents work.
+
+Then, once your site is up and running, you can set some snippets to cache mode.
diff --git "a/en/02_For_users/02_ContentEditing/10_Resources/60_\320\232\321\215\321\210\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.md" "b/en/02_For_users/02_ContentEditing/10_Resources/60_\320\232\321\215\321\210\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.md"
deleted file mode 100644
index 881d2cbd..00000000
--- "a/en/02_For_users/02_ContentEditing/10_Resources/60_\320\232\321\215\321\210\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265.md"
+++ /dev/null
@@ -1,24 +0,0 @@
-Кэширование для документа можно включить при помощи опции "Кэшируемый" на вкладке "Настройка страницы".
-
-Если вы включите кеширование документа, это означает, что документ и его содержимое будут выполняться только при первом запросе документа.
-Затем результаты работы «сохраняются» в кеше и извлекаются оттуда по любым последующим запросам.
-
-** Это может ускорить загрузку страниц, поскольоку сниппеты не будут выполняться при каждом запросе. **
-
-Если вы очистите кеш сайта, нажав "Очистить кэш" в интерфейсе администратора, вы увидите новый контент, потому что страница будет разобрана снова.
-
-## Кэширование сниппетов ##
-Снипеты, если вы вызываете их с помощью конструкции [[Snippet]] будут кэшироваться.
-
-Вы можете заставить сниппет работать по каждый раз при загрузке страницы, даже если сам документ кэшируется, с помощью вызова:
-```[!Snippet!]```
-(Обратите внимание, скобки заменены на восклицательные знаки)
-Такой сниппет будет выполняться при каждом посещении страницы.
-
-
-Как правило на сайтах с низким трафиком все сниппеты запускаются некэшируемыми. Но если вы хотите оптимизировать свой сайт, вы можете вызывать сниппеты, чьи данные редко меняются в режиме кэширования. Это ускорит сайт.
-
-## Кэширование и разработка ##
-Когда вы разрабатываете сайт, лучше всего отключить кэширование в конфигурации системы. Это может помочь вам, так как в процессе разработки данные часто изменяются и необходимо всегда видеть актуальную версию работы сниппетов и документов.
-
-Затем, после того, как ваш сайт начнет работать, вы можете установить для некоторых сниппетов режим кэширования.
\ No newline at end of file
diff --git a/en/02_For_users/02_ContentEditing/index.md b/en/02_For_users/02_ContentEditing/index.md
index 1b35c31b..bdf7eef6 100644
--- a/en/02_For_users/02_ContentEditing/index.md
+++ b/en/02_For_users/02_ContentEditing/index.md
@@ -2,9 +2,10 @@ This guide is designed to assist editors in using the Evo CMS website.
This guide should be used in conjunction with the Evo Administrator's Guide, which covers more advanced topics such as
-Backing up
-Creating users
-Creating secure areas
+* Backing up
+* Creating users
+* Creating secure areas
+
In preparing this guide we have presumed that your web developer has already configured the basic setup for your website.
-Accordingly, we deal with the basic administration issues you are likely to face in the order in which they are likely to occur.
\ No newline at end of file
+Accordingly, we deal with the basic administration issues you are likely to face in the order in which they are likely to occur.
diff --git a/en/02_For_users/03_Designing/01_What_is_a_template.md b/en/02_For_users/03_Designing/01_What_is_a_template.md
new file mode 100644
index 00000000..9fc62dd8
--- /dev/null
+++ b/en/02_For_users/03_Designing/01_What_is_a_template.md
@@ -0,0 +1,116 @@
+Using a template
+
+The template in MODx is the main immutable part of the site page that determines its design. The template does not require special syntax and is a simple HTML code (and possibly XHTML or other) with the call of the necessary chunks, parameters and snippets.
+
+The number of templates most often depends on the number of different types of design. Because each document in MODx has a binding to a specific template, which determines its final appearance.
+
+It is also worth mentioning that there is a special blank template that does not contain any design and cannot be edited.
+
+####Пример template:
+
+[*pagetitle*]
+[[Wayfinder? &startId=`5` &level=`1`]]
+{{Search}}
+
+[*longtitle*]
+[*content*]
+{{Basement}}
+
+{{Google}}
+
+As we can see - this is a completely understandable HTML-markup of the page in which special constructions are used. Among them:
+Chunky - {{Search}}, {{Footer}}, {{Google}}
+
+Параметры - [pagetitle], [longtitle], [content], [(site_url)]
+
+Сниппет - [[Wayfinder? &startId= &level=51]]
+
+Create and edit a template
+
+All templates are located in the following location:
+
+Resources → Resource Management → Template The list of templates is as follows:
+
+List of MODX EVO templates
+
+To create, you need to click on the New template link, and to edit an existing template, just click on the link with its name. The following form appears:
+
+Creating a template in MODX EVO
+
+Assign fields
+
+Template name - used in the template selection list. You may also need snippets for some operations. You can use both English and Russian, as well as a hyphen (-), an underscore (_), and a space.
+
+Description - displayed next to the name of the template in the general list. Used only to describe the purpose of the template and not required.
+
+Create Category - allows you to select an existing category in which the template will be placed. A category allows you to separate a template from the rest in the general list. If no category is selected, the template will fall into the general category Without category.
+
+New category - if there is no suitable category in the list of existing categories, you can create it simply by writing the name in this field.
+
+Restrict access to editing a template - if you enable a checkbox, no one except administrators will be able to edit this template.
+
+Template code (html) - the content of the template itself is placed here.
+
+Conservation
+
+Let's pay attention to the possibilities when saving. To do this, there are the following control buttons:
+
+Template control buttons in MODX EVO
+
+With the main buttons, everything is clear:
+
+Save - creates a new template
+
+Undo - will return us to the list of templates without saving the result.
+
+Make a copy - appears only in edit mode. See Create a copy of the template.
+
+Удалить - появляется только в режиме редактирования. Смотрите пункт Удаление шаблона.
+
+Но MODx позволяет определить еще действие после сохранения шаблона:
+
+Создать новый - сразу после сохранения шаблона откроется форма для создания нового. Таким образом можно быстро создать серию шаблонов.
+
+Продолжить редактирование - после сохранения шаблон снова откроется для редактирования. В этом режиме удобно вносить небольшие правки и проверять конечный результат.
+
+Закрыть - после сохранения мы вернемся в общий список шаблонов.
+
+Создание копии шаблона
+
+Иногда бывает необходимо создать копию существующего шаблона. Сделать это очень просто. Для этого необходимо зайти в редактирование нужного шаблона и нажать на кнопку Сделать копию.
+
+Template control buttons in MODX EVO
+
+Just in case, the system will ask you for confirmation:
+
+Copy of template in MODX EVO
+
+This opens a copy of the template for editing. The copy differs in that Duplicate of is added to its name. You just have to correct the name to a more appropriate one and make other necessary changes.
+
+A copy is created immediately after confirmation, so if you click Cancel, a copy will still remain in the list of templates.
+
+Delete a template
+
+To delete, you need to go into the editing mode of the corresponding template and click the Delete button.
+
+Template control buttons in MODX EVO
+
+After that, the system will ask you for confirmation:
+
+Deleting a template in MODX EVO
+
+Attention! Templates are deleted completely and there is no way to restore them.
+
+Default template
+
+When you create a document, a default template is automatically offered (if the Inherit Parent Template plugin is disabled). It is most convenient when the template that is needed most often is offered. To configure the default template, you must do the following:
+
+Go to the management system settings: Tools → Configuration → Site Find the Default Template parameter and change to the desired Save settings. FAQ
+
+Are there any restrictions on website design templates?
+
+Absolutely none. MODx allows you to implement any design.
+
+Where can I get ready-made templates?
+
+MODx makes it easy to use any well-established HTML-layout, which can be ordered from specialists or found on specialized sites. There are not so many ready-made templates for MODx, but they are there.
diff --git "a/en/02_For_users/03_Designing/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md" "b/en/02_For_users/03_Designing/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md"
deleted file mode 100644
index 72979f60..00000000
--- "a/en/02_For_users/03_Designing/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md"
+++ /dev/null
@@ -1,137 +0,0 @@
-Использование шаблона
-
-Шаблон в MODx - основная неизменяемая часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
-
-Количество шаблонов чаще всего зависит от числа различных видов оформления. Так как каждый документ в MODx имеет привязку к конкретному шаблону, что и определяет его конечный вид.
-
-Стоит упомянуть также, что существует специальный шаблон blank, который не содержит никакого оформления и не поддается редактированию.
-
-####Пример шаблона:
-
-
-
-[*pagetitle*]
-
-
-
-
-
-[[Wayfinder? &startId=`5` &level=`1`]]
-
-
-{{Поиск}}
-
-
-
-
[*longtitle*]
- [*content*]
-
-
-
-{{Подвал}}
-
-{{Google}}
-
-
-Как мы видим - это вполне понятная HTML-разметка страницы в которой используются специальные конструкции. Среди них:
-
-Чанки - {{Поиск}}, {{Подвал}}, {{Google}}
-
-Параметры - [*pagetitle*], [*longtitle*], [*content*], [(site_url)]
-
-Сниппет - [[Wayfinder? &startId=`5` &level=`1`]]
-
-Создание и редактирование шаблона
-
-Все шаблоны находятся в следующем месте:
-
-Ресурсы → Управление ресурсами → Шаблон
-Список шаблонов выглядит следующим образом:
-
-Список шаблонов MODX EVO
-
-Для создания необходимо нажать на ссылку Новый шаблон, а для редактирования существующего шаблона достаточно нажать на ссылку с его названием. Появится следующая форма:
-
-Создание шаблона в MODX EVO
-
-Назначение полей
-
-Имя шаблона - используется в списке выбора шаблона. Также может понадобиться для некоторых операций сниппетов. Можно использовать как английский так и русский язык, а также дефис (-), знак подчеркивания (_) и пробел.
-
-Описание - выводится рядом с названием шаблона в общем списке. Используется только для описания назначения шаблона и для заполнения не обязательно.
-
-Создать категорию - позволяет выбрать существующую категорию, в которую будет помещен шаблон. Категория позволяет отделить шаблон от остальных в общем списке. Если ни одна категория не выбрана, то шаблон попадет в общую категория Без категории.
-
-Новая категория - если в списке существующих категорий нет подходящей, то можно создать ее просто написав название в этом поле.
-
-Ограничить доступ к редактированию шаблона - если включить флажок, то никто кроме администраторов не сможет редактировать этот шаблон.
-
-Код шаблона (html) - сюда размещается само содержимое шаблона.
-
-Сохранение
-
-Обратим внимание на возможности при сохранении. Для этого есть следующие управляющие кнопки:
-
-Кнопки управления шаблоном в MODX EVO
-
-С основными кнопками все понятно:
-
-Сохранить - создаст новый шаблон
-
-Отмена - вернет нас в список шаблонов без сохранения результата.
-
-Сделать копию - появляется только в режиме редактирования. Смотрите пункт Создание копии шаблона.
-
-Удалить - появляется только в режиме редактирования. Смотрите пункт Удаление шаблона.
-
-Но MODx позволяет определить еще действие после сохранения шаблона:
-
-Создать новый - сразу после сохранения шаблона откроется форма для создания нового. Таким образом можно быстро создать серию шаблонов.
-
-Продолжить редактирование - после сохранения шаблон снова откроется для редактирования. В этом режиме удобно вносить небольшие правки и проверять конечный результат.
-
-Закрыть - после сохранения мы вернемся в общий список шаблонов.
-
-Создание копии шаблона
-
-Иногда бывает необходимо создать копию существующего шаблона. Сделать это очень просто. Для этого необходимо зайти в редактирование нужного шаблона и нажать на кнопку Сделать копию.
-
-Кнопки управления шаблоном в MODX EVO
-
-На всякий случай система попросит от вас подтверждение:
-
-Копия шаблона в MODX EVO
-
-После этого откроется для редактирования копия шаблона. Копия отличается тем, что к ее названию добавляется Duplicate of. Вам остается только исправить название на более подходящее и внести другие необходимые правки.
-
-Копия создается сразу после подтверждения, поэтому если вы нажмете отмену, то в списке шаблонов копия все равно останется.
-
-Удаление шаблона
-
-Для удаления необходимо зайти в режим редактирования соответствующего шаблона и нажать кнопку Удалить.
-
-Кнопки управления шаблоном в MODX EVO
-
-После этого система попросит от вас подтверждение:
-
-Удаление шаблона в MODX EVO
-
-Внимание! Шаблоны удаляются полностью и возможности их восстановить нет.
-
-Шаблон по умолчанию
-
-При создании документа автоматически предлагается шаблон по умолчанию (если отключен плагин Inherit Parent Template). Удобнее всего когда предлагается именно тот шаблон, который необходим чаще всего. Для настройки шаблона по умолчанию необходимо выполнить следующие действия:
-
-Переходим в настройки системы управления:
-Инструменты → Конфигурация → Сайт
-Находим параметр Шаблон по умолчанию и меняем на нужный
-Сохраняем настройки.
-FAQ
-
-Есть ли какие-то ограничения на шаблоны дизайна для сайта?
-
-Абсолютно никаких. MODx позволяет реализовать любой дизайн.
-
-Где можно взять готовые шаблоны?
-
-MODx позволяет легко использовать любой сверстанный HTML-макет, который можно заказать у специалистов или найти на специализированных сайтах. Готовых шаблонов именно для MODx не так много, но они есть.
\ No newline at end of file
diff --git a/en/02_For_users/03_Designing/02_What_Is_A_Chunk.md b/en/02_For_users/03_Designing/02_What_Is_A_Chunk.md
new file mode 100644
index 00000000..7e188808
--- /dev/null
+++ b/en/02_For_users/03_Designing/02_What_Is_A_Chunk.md
@@ -0,0 +1,124 @@
+## Chunks ##
+
+A chunk in MODx is a small piece of HTML code or other information that can be reused in a template, other chunk, or snippet.
+
+As a rule, templates use several chunks that contain a matching appearance. For example, you can take out the header, basement, main menu, crumbs. Thanks to this, changes can be made in one chunk, and not several templates. This is both simpler and there is no risk of leaving some template without an important change.
+
+The second most common use of chunk is snippet templates. Thanks to this, there is a separation of the control code and design. Depending on the complexity of the snippet, the number of templates may vary. For example, to create a feedback form, you may need 3 main templates - a form, a text about the successful acceptance of the form, the text of a letter to the administrator with the information received. In order for the chunk to be not just a piece of HTML code, but to work as a template, it is necessary to mark the appropriate places in it where the snippet will record its information. The role of such places is performed by placeholders.
+
+#### Example chunk contents with placeholders:
+
+[+wf.linktext+]
+This is a template that is used for menu items in MODx-cms.ru. And respectively , [+wf.classes+] and [+wf.linktext+] are placeholders that will be replaced by the Wayfinder snippet on the CSS class used and the name of the menu item.
+In addition to these two options, the chunk can be used to store some special information. For example, you can store a set of parameters for a snippet (for example, a list of files), which can be generated manually or by other MEANS of MODx.
+
+Creating and Editing Chunk
+
+All Chunks are located in the following location:
+
+Resources → Resource Management → Chunky The chunk list looks something like this:
+
+List of Chunks in MODX EVO
+
+To create, you need to click on the New Chunk link, and to edit an existing Chunk, just click on the link with its name. The following form appears:
+
+New chunk in MODX EVo
+
+Assign fields:
+
+The name chanka is used to invoke chunk. You can use both English and Russian, as well as a hyphen (-) and an underscore (_). You can't use a space!
+
+Description - displayed next to the name of the chunk in the general list. Used only to describe the purpose of the chunk and for filling is optional.
+
+Create Category - allows you to select an existing category in which the chunk will be placed. The category allows you to separate the chunk from the others in the general list. If no category is selected, the chunk will be placed in the general category Without category.
+
+New category - if there is no suitable category in the list of existing categories, you can create it simply by writing the name in this field.
+
+Restrict access to editing chunk - if you enable the check box, no one except administrators will be able to edit this chunk.
+
+Chunk code (html) - this is where the chunk content itself is placed.
+
+Editor - allows you to choose a visual editor. By default, it is disabled, but you can enable it if necessary. There are also editors that allow you to highlight the syntax.
+
+Conservation
+
+Let's pay attention to the possibilities when saving. To do this, there are the following control buttons:
+
+Chunk control in MODX EVO
+
+With the main buttons, everything is clear:
+
+Save - create a new chunk
+
+Cancellation - will return us to the list of chunks without saving the result.
+
+Make a copy - appears only in edit mode. See Create a copy of the chunk.
+
+Delete - appears only in edit mode. See Removing The Chunk.
+
+But MODx allows you to determine another action after saving the chunk:
+
+Create a new one - immediately after saving the chunk, a form will open to create a new one. In this way, you can quickly create a series of chunks.
+
+Continue editing - after saving, the chunk will open for editing again. In this mode, it is convenient to make small changes to the chunk and check the final result.
+
+Close - after saving, we will return to the general list of chunks.
+
+Create a copy of the chunk
+
+Sometimes it is necessary to create a copy of an existing chunk. It's very easy to do. To do this, go to the editing of the desired chunk and click on the Make a copy button.
+
+Chunk control in MODX EVO
+
+Just in case, the system will ask you for confirmation:
+
+Copy of the chunk in MODX EVO
+
+This will open a copy of the chunk for editing. The copy differs in that Duplicate of is added to its name. You just have to correct the name to a more appropriate one and make other necessary changes.
+
+A copy is created immediately after confirmation, so if you click Cancel, a copy will still remain in the chunk list.
+
+## Chunk removal ##
+
+To delete, you need to go into the editing mode of the corresponding chunk and click the Delete button.
+
+Chunk control in MODX EVO
+
+After that, the system will ask you for confirmation:
+
+Attention! Chunks are removed completely and there is no way to restore them.
+
+## Chunk Call ##
+
+In template and other chunk
+
+An existing chunk in a template (or other chunk) is invoked very simply. To do this, use the construction in the form of the name of the chunk surrounded by curly brackets:
+
+{{NameChanka}} It is worth remembering that the name is case sensitive (The name Chunka and the name Chunka are different Chunks in terms of MODx).
+
+#### Example chunk template:
+
+{{Head}}
+{{Main Menu}} {{Search}}
+
+{{Content}}
+{{Basement}}
+
+{{Google}}
+
+This example template contains only chunks, but in practice it also contains TV parameters and snippets. Therefore, it is not necessary to assume that chunks must be used necessarily and in large quantities.
+Via API
+
+To retrieve chunk content through the API, use the getChunk method.
+
+#### Example call:
+
+$chunk = $modx->getChunk('ChunkName'); FAQ
+
+I made a chunk, but it doesn't work. Why might that be?
+
+Check the name of the chunk. It must not contain a space, and the case of the letters must match the name of the chunk when the precision is invoked.
+
+Can I invoke a chunk in a chunk?
+
+Yes you can.
diff --git "a/en/02_For_users/03_Designing/02_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\207\320\260\320\275\320\272.md" "b/en/02_For_users/03_Designing/02_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\207\320\260\320\275\320\272.md"
deleted file mode 100644
index bb3cf278..00000000
--- "a/en/02_For_users/03_Designing/02_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\207\320\260\320\275\320\272.md"
+++ /dev/null
@@ -1,143 +0,0 @@
-Использование чанка
-
-Чанк в MODx - это небольшой кусок HTML-кода или другой информации, который можно многократно использовать в шаблоне, другом чанке или сниппете.
-
-Как правило в шаблонах используется несколько чанков, которые содержат совпадающее оформление. Например можно вынести шапку, подвал, основное меню, крошки. Благодаря этому изменения можно будет вносить в одном чанке, а не нескольких шаблонах. Это и проще и нет риска оставить какой-то шаблон без важного изменения.
-
-Второе наиболее частое использование чанка - шаблоны для сниппетов. Благодаря этому происходит разделение управляющего кода и оформления. В зависимости от сложности сниппета количество шаблонов может отличаться. Например для создания формы обратной связи может потребоваться 3 основных шаблона - форма, текст об успешном приеме формы, текст письма администратору с полученной информацией. Для того, чтобы чанк был не просто куском HTML-кода, а работал как шаблон, необходимо отметить в нем соответствующие места, куда сниппет запишет свою информацию. Роль таких мест выполняют плейсхолдеры.
-
-####Пример содержимого чанка с плейсхолдерами:
-
-
[+wf.linktext+]
-Это шаблон, который используется для пунктов меню в MODx-cms.ru. И соответственно [+wf.classes+] и [+wf.linktext+] - плейсхолдеры, которые будут заменены сниппетом Wayfinder на используемый CSS-класс и название пункта меню.
-
-Кроме указанных двух вариантов, чанк можно использовать для хранения какой-то специальной информации. Например можно хранить некий набор параметров для сниппета (допустим список файлов), который может формироваться вручную или другими средствами MODx.
-
-Создание и редактирование чанка
-
-Все чанки находятся в следующем месте:
-
-Ресурсы → Управление ресурсами → Чанки
-Список чанков выглядит примерно так:
-
-Список чанков в MODX EVO
-
-Для создания необходимо нажать на ссылку Новый чанк, а для редактирования существующего чанка достаточно нажать на ссылку с его названием. Появится следующая форма:
-
-Новый чанк в MODX EVo
-
-Назначение полей:
-
-Название чанка - используется для вызова чанка. Можно использовать как английский так и русский язык, а также дефис (-) и знак подчеркивания (_). Пробел использовать нельзя!
-
-Описание - выводится рядом с названием чанка в общем списке. Используется только для описания назначения чанка и для заполнения не обязательно.
-
-Создать категорию - позволяет выбрать существующую категорию, в которую будет помещен чанк. Категория позволяет отделить чанк от остальных в общем списке. Если ни одна категория не выбрана, то чанк попадет в общую категория Без категории.
-
-Новая категория - если в списке существующих категорий нет подходящей, то можно создать ее просто написав название в этом поле.
-
-Ограничить доступ к редактированию чанка - если включить флажок, то никто кроме администраторов не сможет редактировать этот чанк.
-
-Код чанка (html) - сюда размещается само содержимое чанка.
-
-Редактор - позволяет выбрать визуальный редактор. По умолчанию он отключен, но при необходимости можно включить. Есть также редакторы, которые позволяют подсветить синтаксис.
-
-Сохранение
-
-Обратим внимание на возможности при сохранении. Для этого есть следующие управляющие кнопки:
-
-Управление чанком в MODX EVO
-
-С основными кнопками все понятно:
-
-Сохранить - создаст новый чанк
-
-Отмена - вернет нас в список чанков без сохранения результата.
-
-Сделать копию - появляется только в режиме редактирования. Смотрите пункт Создание копии чанка.
-
-Удалить - появляется только в режиме редактирования. Смотрите пункт Удаление чанка.
-
-Но MODx позволяет определить еще действие после сохранения чанка:
-
-Создать новый - сразу после сохранения чанка откроется форма для создания нового. Таким образом можно быстро создать серию чанков.
-
-Продолжить редактирование - после сохранения чанк снова откроется для редактирования. В этом режиме удобно вносить небольшие правки в чанк и проверять конечный результат.
-
-Закрыть - после сохранения мы вернемся в общий список чанков.
-
-Создание копии чанка
-
-Иногда бывает необходимо создать копию существующего чанка. Сделать это очень просто. Для этого необходимо зайти в редактирование нужного чанка и нажать на кнопку Сделать копию.
-
-Управление чанком в MODX EVO
-
-На всякий случай система попросит от вас подтверждение:
-
-Копия чанка в MODX EVO
-
-После этого откроется для редактирования копия чанка. Копия отличается тем, что к ее названию добавляется Duplicate of. Вам остается только исправить название на более подходящее и внести другие необходимые правки.
-
-Копия создается сразу после подтверждения, поэтому если вы нажмете отмену, то в списке чанков копия все равно останется.
-
-Удаление чанка
-
-Для удаления необходимо зайти в режим редактирования соответствующего чанка и нажать кнопку Удалить.
-
-Управление чанком в MODX EVO
-
-После этого система попросит от вас подтверждение:
-
-
-
-Внимание! Чанки удаляются полностью и возможности их восстановить нет.
-
-Вызов чанка
-
-В шаблоне и другом чанке
-
-Существующий чанк в шаблоне (или другом чанке) вызывается очень просто. Для этого используется конструкция в виде названия чанка окруженного фигурными скобками:
-
-{{НазваниеЧанка}}
-При этом стоит помнить, что название чувствительно к регистру (НазваниеЧанка и названиеЧанка - разные чанки с точки зрения MODx).
-
-####Пример шаблона с вызовом чанка:
-
-
-
-{{Head}}
-
-
-
-{{ОсновноеМеню}}
-{{Поиск}}
-
-
-
- {{Содержимое}}
-
-
-
-{{Подвал}}
-
-{{Google}}
-
-
-Этот пример шаблона содержит только чанки, но на практике в нем также встречаются TV-параметры и сниппеты. Поэтому не стоит предполагать, что чанки использовать необходимо обязательно и в большом количестве.
-
-Через API
-
-Для получения содержимого чанка через API используется метод getChunk.
-
-####Пример вызова:
-
-$chunk = $modx->getChunk('НазваниеЧанка');
-FAQ
-
-Я сделал чанк, но он не работает. Из-за чего это может быть?
-
-Проверьте название чанка. Оно не должно содержать пробела, а регистр букв при вызове точности должен совпадать с названием чанка.
-
-Можно ли вызывать чанк в чанке?
-
-Да.
\ No newline at end of file
diff --git a/en/02_For_users/03_Designing/03_What_are_Template_Variables.md b/en/02_For_users/03_Designing/03_What_are_Template_Variables.md
new file mode 100644
index 00000000..b0cc0eae
--- /dev/null
+++ b/en/02_For_users/03_Designing/03_What_are_Template_Variables.md
@@ -0,0 +1,9 @@
+## What are TV Settings? ##
+
+A TV parameter in Evolution CMS is an element that contains specific information for the current page. They can be displayed on the page, or pass the snippet as a parameter.
+
+TV processing in a template can be completely different - widgets, sliders, data tables, anything. Also in the administration panel - the external view of the TV parameter can be either just a text field, or a checkbox, a list, a table, a multi-field.
+
+#### Example parameter:
+[*myParam*]
+For more information about TV settings, we recommend that you visit the section for developers.
diff --git "a/en/02_For_users/03_Designing/03_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200.md" "b/en/02_For_users/03_Designing/03_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200.md"
deleted file mode 100644
index 27f1d219..00000000
--- "a/en/02_For_users/03_Designing/03_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200.md"
+++ /dev/null
@@ -1,13 +0,0 @@
-Что такое ТВ-параметры
-
-ТВ-параметр в Evolution CMS - элемент, который содержит определенную информацию для текущей страницы. Их можно как вывести на страницу, так и передать сниппету в качестве параметра.
-
-Обработка ТВ в шаблоне может быть абсолютно разная - виджеты, слайдеры, таблицы данных, всё, что угодно.
-Также и в панели администрирования - внеший вид ТВ-параметра может быть как просто текстовым полем, так и чекбоксом, списком, таблицей, мульти-полем.
-
-### Пример параметра:
-```
-[*myParam*]
-```
-
-Для дополнительной информации о ТВ-параметрах советуем посетить раздел для разработчиков.
\ No newline at end of file
diff --git a/en/02_For_users/10_Cheat_Sheet.md b/en/02_For_users/10_Cheat_Sheet.md
new file mode 100644
index 00000000..357c75e8
--- /dev/null
+++ b/en/02_For_users/10_Cheat_Sheet.md
@@ -0,0 +1,133 @@
+## Placeholders
+
+Place holders must take the format as:
+```
+[*pagetitle*]
+```
+
+| Placeholders | Description |
+| --- | --- |
+| pagetitle | document title |
+|longtitle | long document title |
+|description| document description |
+|introtext| document summary text |
+|content| document content
+|alias| URL alias |
+|link_attributes| document link attributes |
+|id| document id number |
+|pub_date| publish date |
+|unpub_date| unpublish date |
+|createdby| created by username |
+|createdon| created on |
+|editedby| edited by username |
+|editedon| edited on
+|type| type of document |
+|contentType| |
+|published| yes or no |
+|parent| parent document id |
+|isfolder| is this document a container |
+|richtext| richtext or plaintext
+|template| template id
+|menuindex| integer for ordering documents
+|searchable| 0 or 1 |
+|cacheable| 0 or 1 |
+|deleted| 0 or 1 |
+|deletedon| deleted date |
+|deletedby| delete by username |
+|menutitle| Short menu title |
+|donthit| 0 or 1 |
+|haskeywords|
+|hasmetatags| 0 or 1 |
+|privateweb| The document is part of a private group of user documents (1|0) |
+|privatemgr| The document is included in the private group of management documents (1|0) |
+|content_dispo|
+|hidemenu| Show in Menu 0 or 1 |
+
+## Tags
+
+The below tags represent the different ways EvolutionCMS can produce output
+
+| Tags | Description |
+| --- | --- |
+| [[snippet]] |
+| [!snippet!] |
+| [(setting)] |
+| ```[*resourceField/TV*]``` |
+| [^timing^] |
+| ```[~link~]``` |
+| {{chunk}} |
+| [+placeholder+] |
+
+### SystemInfo
+
+| System Info | Description |
+| --- | --- |
+| [^qt^] |
+| [^q^] |
+| [^p^] |
+| [^t^] |
+| [^s^] |
+| [^m^] |
+
+## System settings
+
+System settings are the configurable variables that can be changed from Manager | Configuration.
+
+| System Settings | Description |
+| --- | --- |
+| [(allow_duplicate_alias)] |
+| [(automatic_alias)] |
+| [(base_url)] or [(site_url)] |
+| [(cache_default)] |
+| [(captcha_words)] |
+| [(custom_contenttype)] |
+| [(default_template)] |
+| [(editor_css_path)] |
+| [(emailsender)] |
+| [(emailsubject)] |
+| [(error_page)] |
+| [(modx_charset)] |
+| [(fck_editor_autolang)] |
+| [(fck_editor_style)] |
+| [(fck_editor_toolbar)] |
+| [(filemanager_path)] |
+| [(friendly_alias_urls)] |
+| [(friendly_urls)] |
+| [(friendly_url_prefix)] |
+| [(friendly_url_suffix)] |
+| [(manager_language)] |
+| [(manager_layout)] |
+| [(manager_theme)] |
+| [(number_of_logs)] |
+| [(number_of_messages)] |
+| [(number_of_results)] |
+| [(publish_default)] |
+| [(rb_base_dir)] |
+| [(rb_base_url)] |
+| [(reset_template)] |
+| [(resolve_hostnames)] |
+| [(search_default)] |
+| [(server_offset_time)] |
+| [(server_protocol)] |
+| [(settings_version)] |
+| [(show_preview)] |
+| [(signupemail_message)] |
+| [(site_name)] |
+| [(site_start)] |
+| [(site_status)] |
+| [(site_unavailable_message)] |
+| [(site_unavailable_page)] |
+| [(strip_image_paths)] |
+| [(top_howmany)] |
+| [(track_visitors)] |
+| [(udperms_allowroot)] |
+| [(unauthorized_page)] |
+| [(upload_files)] |
+| [(upload_maxsize)] |
+| [(use_alias_path)] |
+| [(use_captcha)] |
+| [(use_editor)] |
+| [(use_udperms)] |
+| [(webpwdreminder_message)] |
+| [(websignupemail_message)] |
+| [(which_editor)] |
diff --git a/en/03_Develop/01_Elements/01_Template.md b/en/03_Develop/01_Elements/01_Template.md
deleted file mode 100644
index 0fe1be4f..00000000
--- a/en/03_Develop/01_Elements/01_Template.md
+++ /dev/null
@@ -1,116 +0,0 @@
-# Использование шаблона
-
-Шаблон в Evolution - основная часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
-
-Количество шаблонов чаще всего зависит от внешнего вида и функционала сайта. Как правило, для различных разделов и страниц сайта создаются свои шаблоны. Например, будет логичным создать разные шаблоны для товара и для новости и прикрепить к ним различные ТВ-параметры. Это позволит контент-менеджеру быстрей и правильней заполнить сайт. Также это существенно облегчит работу программиста, если потребуется сделать какие-то ленты новостей или товаров.
-
-Стоит упомянуть также, что существует специальный шаблон blank, который не содержит никакого оформления и не поддается редактированию.
-
-#### Пример шаблона:
-````
-
-
- [*pagetitle*]
-
-
-
-
- [[Wayfinder? &startId=`5` &level=`1`]]
-
-
-
-
[*longtitle*]
- [*content*]
-
-
- {{footer}}
- {{Google}}
-
-
-````
-
-Как мы видим - это вполне понятная HTML-разметка страницы в которой используются специальные конструкции. Среди них:
-
-Чанки - ```` {{footer}}, {{Google}}````
-
-Параметры - ````[*pagetitle*], [*content*]````
-
-Плейсхолдер - ```` [(site_url)] ````
-
-Вызов сниппета - ````[[Wayfinder? &startId=`5` &level=`1`]]````
-
-## Создание и редактирование шаблона
-
-Все шаблоны находятся в следующем месте:
-
-Ресурсы → Управление ресурсами → Шаблон
-Список шаблонов выглядит следующим образом:
-
-Для создания нового шаблона необходимо нажать на ссылку "Новый шаблон", а для редактирования существующего достаточно нажать на ссылку с его названием.
-При создании шаблона также можно выбрать, какие TV-параметры ему принадлежат и отсортировать их так, как необходимо.
-
-### Создание шаблона в Evolution CMS
-
-#### Назначение полей
-
-**Имя шаблона** - используется в списке выбора шаблона. Также может понадобиться для некоторых операций сниппетов, плагинов или модулей. Можно использовать как английский или русский язык, а также дефис, знак подчеркивания и пробел.
-
-**Описание** - выводится рядом с названием шаблона в общем списке. Используется только для описания назначения шаблона и для заполнения не обязательно.
-
-**Создать категорию** - позволяет выбрать существующую категорию, в которую будет помещен шаблон. Категория позволяет отделить шаблон от остальных в общем списке. Если ни одна категория не выбрана, то шаблон попадет в общую категорию "Без категории".
-
-**Новая категория** - если в списке существующих категорий нет подходящей, то можно создать ее, просто написав название в этом поле.
-
-**Ограничить доступ к редактированию шаблона** - если включить флажок, то никто, кроме администраторов, не сможет редактировать этот шаблон.
-
-**Код шаблона (html)** - сюда размещается само содержимое шаблона.
-
-### Сохранение
-
-**Сохранить** - создаст новый шаблон
-
-**Отмена** - вернет нас в список шаблонов без сохранения результата.
-
-**Сделать копию** - появляется только в режиме редактирования.
-
-**Удалить** - появляется только в режиме редактирования.
-
-Evolution позволяет определить еще несколько действий после сохранения шаблона:
-
-**Создать новый** - сразу после сохранения шаблона откроется форма для создания нового. Таким образом можно быстро создать серию шаблонов.
-
-**Продолжить редактирование** - после сохранения шаблон снова откроется для редактирования. В этом режиме удобно вносить небольшие правки и проверять конечный результат.
-
-**Закрыть** - после сохранения мы вернемся в общий список шаблонов.
-
-## Создание копии шаблона
-
-Иногда бывает необходимо создать копию существующего шаблона. Сделать это очень просто. Для этого необходимо зайти в редактирование нужного шаблона и нажать на кнопку "Сделать копию".
-
-После этого откроется для редактирования копия шаблона. Копия отличается тем, что к ее названию добавляется Duplicate of. Вам остается только исправить название на более подходящее и внести другие необходимые правки.
-
-Копия создается сразу после подтверждения, поэтому если вы нажмете отмену, то в списке шаблонов копия все равно останется.
-
-## Удаление шаблона
-
-Для удаления необходимо зайти в режим редактирования соответствующего шаблона и нажать кнопку "Удалить".
-
-**Внимание! Шаблоны удаляются полностью и возможности их восстановить нет.**
-
-## Шаблон по умолчанию
-
-При создании документа автоматически предлагается шаблон по умолчанию. Для настройки шаблона по умолчанию необходимо выполнить следующие действия:
-
-Переходим в настройки системы управления:
-Инструменты → Конфигурация → Сайт
-Находим параметр "Шаблон по умолчанию" и меняем на нужный.
-Сохраняем настройки.
-
-## FAQ
-Есть ли какие-то ограничения на шаблоны дизайна для сайта?
-
-Абсолютно никаких. Evolution позволяет реализовать любой дизайн.
-
-## Где можно взять готовые шаблоны?
-
-Evolution позволяет легко использовать любой сверстанный HTML-макет, который можно заказать у специалистов или найти на специализированных сайтах.
diff --git "a/en/03_Develop/01_Elements/06_Template_Variables/01_\320\236\321\201\320\275\320\276\320\262\320\275\321\213\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/en/03_Develop/01_Elements/06_Template_Variables/01_\320\236\321\201\320\275\320\276\320\262\320\275\321\213\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
deleted file mode 100644
index 0bd4554d..00000000
--- "a/en/03_Develop/01_Elements/06_Template_Variables/01_\320\236\321\201\320\275\320\276\320\262\320\275\321\213\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
+++ /dev/null
@@ -1,74 +0,0 @@
-###Список основных параметров заранее определен и содержит основную информацию о документе.
-
-
-*[\*pagetitle\*]* - заголовок документа
-
-*[\*longtitle\*]* - расширенный заголовок документа
-
-*[\*description\*]* - описание документа
-
-*[\*introtext\*]* - аннотация документа
-
-*[\*content\*]* - содержимое документа
-
-*[\*alias\*]* - псевдоним документа
-
-*[\*link_attributes\*]* - атрибуты ссылки
-
-*[\*id\*]* - идентификатор (номер) документа
-
-*[\*pub_date\*]* - дата публикации дкоумента
-
-*[\*unpub_date\*]* - дата завершения публикации
-
-*[\*createdby\*]* - Идентификатор пользователя создавшего документ
-
-*[\*createdon\*]* - Дата создания документа
-
-*[\*editedby\*]* - Идентификатор пользователя редактировавшего документ
-
-*[\*editedon\*]* - Дата редактирования документа
-
-*[\*type\*]* - вариант (документ, папка или ссылка)
-
-*[\*contentType\*]* - тип содержимого (например, text/html)
-
-*[\*published\*]* - опубликован ли документ (1|0)
-
-*[\*parent\*]* - номер (ID) родительского документа
-
-*[\*isfolder\*]* - является ли документа папкой (1|0)
-
-*[\*richtext\*]* - используется ли при редактировании документа визуальный редактор
-
-*[\*template\*]* - номер (ID) используемого шаблона для документа
-
-*[\*menuindex\*]* - порядковый номер отображения в меню
-
-*[\*searchable\*]* - доступен ли документ для поиска (1|0)
-
-*[\*cacheable\*]* - Кэшируется ли документ (1|0)
-
-*[\*deleted\*]* - Документ удален (1|0)
-
-*[\*deletedon\*]* - Возвращает дату удаления документа (в секундах с 1 января 1970 г.)
-
-*[\*deletedby\*]* - Идентификатор пользователя удалившего документ
-
-*[\*menutitle\*]* - Заголовок меню. Если не используется, то заголовок документа
-
-*[\*donthit\*]* - Слежение за количеством посещений отключено (1|0)
-
-*[\*haskeywords\*]* - Документ содержит ключевые слова (1|0)
-
-*[\*hasmetatags\*]* - Документ имеет метатеги (1|0)
-
-*[\*privateweb\*]* - Документ входит в частную группу пользовательских документов (1|0)
-
-*[\*privatemgr\*]* - Документ входит в частную группу менеджерских документов (1|0)
-
-*[\*content_dispo\*]* - Вариант выдачи содержимого (1 - для отображения | 0 - для скачивания)
-
-*[\*hidemenu\*]* - Документ не отображается в меню (1|0)
-
-*[\*alias_visible\*]* - Документ учавствует в ЧПУ при использовании вложенных ЧПУ (1|0)
\ No newline at end of file
diff --git "a/en/03_Develop/01_Elements/06_Template_Variables/02_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\213\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/en/03_Develop/01_Elements/06_Template_Variables/02_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\213\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
deleted file mode 100644
index be92d97f..00000000
--- "a/en/03_Develop/01_Elements/06_Template_Variables/02_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\213\320\265_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
+++ /dev/null
@@ -1,27 +0,0 @@
-###Параметры которые отображают системые данные
-
-*[^qt^]* - время на запросы к базе данных
-
-*[^q^]* - запросов к базе данных
-
-*[^p^]* - время на работу PHP скриптов
-
-*[^t^]* - общее время на генерацию страницы
-
-*[^s^]* - источник содержимого (база или кэш)
-
-*[^m^]* - количество потребляемой памяти
-
-***
-
-####Пример:
-
-````html
-
-````
\ No newline at end of file
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/index.md b/en/03_Develop/01_Elements/06_Template_Variables/index.md
deleted file mode 100644
index 94842c25..00000000
--- a/en/03_Develop/01_Elements/06_Template_Variables/index.md
+++ /dev/null
@@ -1,186 +0,0 @@
-TV-параметр в MODx - элемент (поле), который содержит определенную информацию для текущей страницы.
-
-TV-параметры позволяют добавить к документу дополнительную информацию, которую затем можно использовать наравне с основными параметрами. Они имеют различные типы и в зависимости от этого меняется их поведение и внешний вид. Значение параметра можно вывести на страницу или передать сниппету для дальнейшей обработки.
-
-#### Для чего нужен TV-параметр?
-
-Для упорядочненного и логичного хранения информации на сайте. Допустим, на сайте есть 2 типа материалов - товары и новости. Для товара можно создать параметры, в одном из которых будет храниться цена, а в другом фотография. А для новостей - теги и сюжет.
-
-Зачастую TV-параметры используются для создания SEO-полей наподобие meta description, keywords и т.д.
-Параметры привязываются к шаблонам, и это позоляет в зависимости от типа материала задавать абсолютно разные для заполнения поля.
-
-### Пример параметра:
-
-[\*pagetitle\*] - вызов параметра в шаблоне, который вернет заголовок страницы. Чаще всего он используется для вывода title:
-```
-
-[*pagetitle*]
-
-```
-
-Все параметры можно разделить на основные, системные и пользовательские.
-
-### Основные параметры:
-
-Список основных параметров заранее определен в cms и содержит основную информацию о документе. Большую часть из них можете увидеть при создании и редактировании любого документа.
-
-#### Наиболее используемые:
-
-- **[\*pagetitle\*]** - заголовок документа
-- **[\*longtitle\*]** - расширенный заголовок документа
-- **[\*description\*]** - описание документа
-- **[\*introtext\*]** - аннотация документа
-- **[\*content\*]** - содержимое документа
-- **[\*id\*]** - идентификатор (номер) документа
-- **[\*parent\*]** - номер (ID) родительского документа
-- **[\*pub_date\*]** - дата публикации дкоумента
-- **[\*unpub_date\*]** - дата завершения публикации
-- **[\*createdby\*]** - Идентификатор пользователя создавшего документ
-- **[\*createdon\*]** - Дата создания документа
-- **[\~идентификатор\~]** - URL документа по указанному идентификатору
-
-Стоит отдельно упомянуть о том, что параметры можно сочетать. В особенности это актуально для создания ссылок на разные документы с помощью параметра **[\~идентификатор\~]**. В качестве идентификатора можно также задать параметр.
-
-**[\~[\*id\*]\~]** -Вывести ссылку на текущий документ.
-
-**[\~[\*parent\*]\~]** - Вывести ссылку на родителя текущего документа.
-
-#### Дополнительные
-
-- **[\*alias\*]** - псевдоним документа
-- **[\*editedby\*]** - идентификатор пользователя, редактировавшего документ
-- **[\*editedon\*]** - дата редактирования документа
-- **[\*type\*]** - тип ресурса (документ, папка или ссылка)
-- **[\*contentType\*]** - тип содержимого (например, text/html)
-- **[\*published\*]** - опубликован ли документ (1|0)
-- **[\*isfolder\*]** - является ли документа папкой (1|0)
-- **[\*richtext\*]** - используется ли при редактировании документа визуальный редактор
-- **[\*template\*]** - номер (ID) используемого шаблона для документа
-- **[\*menuindex\*]** - порядковый номер отображения в меню
-- **[\*searchable\*]** - доступен ли документ для поиска (1|0)
-- **[\*cacheable\*]** - Кэшируется ли документ (1|0)
-- **[\*deleted\*]** - документ удален (1|0)
-- **[\*deletedby\*]** - идентификатор пользователя удалившего документ
-- **[\*menutitle\*]** - заголовок меню.
-- **[\*donthit\*]** - Слежение за количеством посещений отключено (1|0)
-- **[\*haskeywords\*]** - Документ содержит ключевые слова (1|0)
-- **[\*hasmetatags\*]** - Документ имеет метатеги (1|0)
-- **[\*privateweb\*]** - Документ входит в частную группу пользовательских документов (1|0)
-- **[\*privatemgr\*]** - Документ входит в частную группу менеджерских документов (1|0)
-- **[\*content_dispo\*]** - Вариант выдачи содержимого (1 - для отображения | 0 - для скачивания)
-- **[\*hidemenu\*]** - Документ не отображается в меню (1|0)
-- **[\*alias_visible\*]** - Участвует ли документ в формировании URL(1|0)
-
-### Системные параметры
-
-Параметры, которые отображают системные данные
-
-- **[^qt^]** - время на запросы к базе данных
-- **[^q^]** - запросов к базе данных
-- **[^p^]** - время на работу PHP скриптов
-- **[^t^]** - общее время на генерацию страницы
-- **[^s^]** - источник содержимого (база или кэш)
-- **[^m^]** - количество потребляемой памяти
-
-#### Пример:
-
-```
-Memory : [^m^],
-MySQL: [^qt^], [^q^] request(s),
-PHP: [^p^],
-Total time: [^t^],
-Document from [^s^].
-```
-
-### Пользовательские TV-параметры
-
-Пользовательские параметры создаются программистом вручную, исходя из опыта и структуры сайта.
-
-#### Создание и редактирование TV-параметра
-
-Для создания параметра необходимо нажать на ссылку "Элементы - Параметры (TV)" и выбрать "Новый параметр (TV)".
-
-
-
-#### Назначение полей
-
-- **Имя параметра** - используется для вызова TV-параметра. Можно использовать как английский так и русский язык, а также дефис и знак подчеркивания. Пробел использовать нельзя!
-- **Заголовок** - используется для названия TV-параметра в документе при редактировании.
-- **Описание** - используется для более расширенной информации о параметре в документе при редактировании, а также в общем списке TV-параметров.
-- **Тип ввода** - определяет вид получаемой информации. В зависимости от выбранного типа интерфейс меняется. Более подробно смотрите "Типы ввода".
-- **Значение по умолчанию** - определеяет значение TV-параметра по умолчанию при редактировании документа.
-- **Возможные значения** - используются в некоторых типах ввода (например Radio Options, Check Box) для предоставления вариантов выбора. Более подробно смотрите Определение значений TV-параметра.
-- **Визуальный компонент** - определеяет вариант вывода TV-параметра на страницу сайта. Более подробно смотрите Вид TV-параметра.
-- **Порядок в списке** - определяет порядок TV-параметра в документе.
-- **"Замок" в имени параметра** - если включить флажок, то никто, кроме администраторов не сможет редактировать этот TV-параметр.
-
-#### Типы ввода ####
-
-- **Text** - поле ввода.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **Raw Text, Raw Textarea** - устарели и не рекомендуются к использованию.
-Вместо них рекомендуется использовать Textarea и Textarea (Mini).
-
-- **Textarea и Textarea (Mini)** - текстовое поле. Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **RichText** - поле с визуальным редактором.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **DropDown List Menu** - раскрывающийся список.
-Поле "Возможные значения" задает список значений и определеляется специальным форматом. Более подробно смотрите Определение значений TV-параметра. Значение по-умолчанию определяет выбранный пункт при первом редактировании.
-
-- **Listbox (Single-Select) и Listbox (Multi-Select)** - список множественного выбора.
-Single-Select и Multi-Select отличаются только тем, что в первом варианте можно выбрать одно значение, а во втором несколько (с использование Ctrl).
-Поле "Возможные значения" задает конечный список значений и определеляется специальным форматом. Более подробно смотрите Определение значений TV-параметра. Значение по умолчанию определяет выбранный пункт при первом редактировании.
-
-- **Radio Options** - переключатели.
-Поле Возможные значения задает конечный список значений и определеляется специальным форматом. Более подробно смотрите Определение значений TV-параметра. Значение по умолчанию определяет выбранный пункт при первом редактировании.
-
-- **Check Box** - флажки.
-Поле Возможные значения задает конечный список значений и определеляется специальным форматом. Более подробно смотрите Определение значений TV-параметра. Значение по умолчанию определяет выбранный пункт при первом редактировании.
-
-- **Image** - изображение.
-При нажатии кнопки "Вставить" открывается файловый менеджер, который позволяет выбрать необходимое изображение и загрузить его.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **File** - файл.
-При нажатии кнопки "Вставить" открывается файловый менеджер, который позволяет выбрать необходимый файл и загрузить его.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **URL** - ссылка.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **Email** - электронная почта.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **Number** - число.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-- **Date** - дата.
-Первая кнопка вызывает календарик, с помощью которого можно выбрать дату. Вторая кнопка стирает дату.
-Возможные значения не используются. Значение по умолчанию автоматически записывается в поле при первом редактировании.
-
-#### Определение значений TV-параметра ####
-
-Настройкой "Возможные значения" определяются варианты для таких параметров как DropDown List Menu, Listbox,Check Box и Radio Options.
-
-Формат определения значений следующий:
-```
-параметр1==значение1||параметр2==значение2||параметр3==значение3
-```
-Разделитель "==" используется для разделения отображаемого и фактического значения, а разделитель "||" разделяет значения между собой.
-
-Если фактические и отображаемые значения совпадают, то можно использовать упрощенный вариант записи:
-```
-значение1||значение2||значение3
-```
-#### Пример ####
-
-Тип ввода: DropDown List Menu
-Возможные значения:
-```
-Красный==#FF0000||Зеленый==#00FF00||Синий==#0000FF
-```
-
-Когда пользователь будет редактировать документ, то увидит выпадающий список со значениями "Красный, Зеленый, Синий". При выборе значения и сохранения документа в базу сохранится одно из значений - #FF0000, #00FF00 или #0000FF.
diff --git a/en/03_Develop/01_Elements/07_Tags/10_Resource_Fields.md b/en/03_Develop/01_Elements/07_Tags/10_Resource_Fields.md
deleted file mode 100644
index d0fc3d0c..00000000
--- a/en/03_Develop/01_Elements/07_Tags/10_Resource_Fields.md
+++ /dev/null
@@ -1,2 +0,0 @@
-http://www.evolution-docs.com/documentation/designing/adding-tags/resource-fields
-need copy this
\ No newline at end of file
diff --git "a/en/03_Develop/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/03_\320\221\320\260\320\267\320\276\320\262\321\213\320\265 \320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213.md" "b/en/03_Develop/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/03_\320\221\320\260\320\267\320\276\320\262\321\213\320\265 \320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213.md"
deleted file mode 100644
index f6d1d6b0..00000000
--- "a/en/03_Develop/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/03_\320\221\320\260\320\267\320\276\320\262\321\213\320\265 \320\277\321\200\320\270\320\275\321\206\320\270\320\277\321\213.md"
+++ /dev/null
@@ -1,120 +0,0 @@
-Любой, кто начнет разбираться в MODx столкнется с новыми терминами. Все довольно просто запоминается. А чтобы не приходилось запоминать, что и как пишется, мы все отметим здесь.
-
-Также здесь мы отметим небольшие моменты, которые периодически можно подсматривать.
-
-## Терминология ##
-
-**Шаблон** - содержит общую верстку страницы со структурой и дизайном. Также в нем определяются места для вывода динамического содержимого. Для каждого документа можно выбрать свой шаблон.
-
-**Параметры (TV)** - дополнительные параметры, которые подключаются к шаблону. Параметры могут быть разных типов (текст, ссылка, файл, дата, число и т.д.). Более подробно о типах ждите в следующих статьях.
-
-**Чанк** - маленький шаблон, который может использоваться как просто для вывода какого-то содержимого (телефона на всех страницах), так и для обработки (шаблон отправляемого письма eForm, шаблон каталога выводимого Ditto и т.д.). Таким образом, вид (представление) информации отделяется от места обработки и легко управляется.
-
-**Сниппет** - код для обработки информации. Анализируют полученную информацию (например, сообщение пользователя) и предоставляют результат (например, отправляют сообщение по почте, а пользователю показывают сообщение о результате). Сниппеты формируют меню (Wayfinder), выводят списки статей с разбиением на страницы (Ditto), строят формы (eForm). Для вывода используют Чанки.
-
-**Плагин** - код, который запускается при наступлении какого-то события. Например, подсвечивает искомые слова (Search Highlighting) при переходе со страницы поиска. Событий много и их рассмотрение стоит отдельной статьи.
-
-## Специальные теги ##
-
-Для вывода динамических данных используются специальные теги.
-
-### Системные ###
-
-- [(site_name)] - название сайта
-- [(base_url)] или [(site_url)] - адрес сайта (https://www.evolutioncms.org)
-- [(modx_charset)] - используемая кодировка
-- [(lang_code)] - код языка, используемого на сайте
-- [^m^] - количество использованной памяти
-- [^qt^] - время на запросы к базе данных
-- [^q^] - количество запросов к базе данных
-- [^p^] - время на работу PHP скриптов
-- [^t^] - общее время на генерацию страницы
-- [^s^] - источник содержимого (база или кэш)
-
-### Стандартные ###
-
-- [\*pagetitle\*] - заголовок документа
-- [\*longtitle\*] - расширенный заголовок документа
-- [\*description\*] - описание документа
-- [\*introtext\*] - аннотация документа
-- [\*content\*] - содержимое документа
-- [\*alias\*] - псевдоним документа
-- [\*id\*] - идентификатор (номер) документа
-- [\*pub_date\*] - дата публикации дкоумента
-- [\*unpub_date\*] - дата завершения публикации
-- [\*createdby\*] - Идентификатор пользователя создавшего документ
-- [\*createdon\*] - Дата создания документа
-- [\*editedby\*] - Идентификатор пользователя редактировавшего документ
-- [\*editedon\*] - Дата редактирования документа
-- [~идентификатор~] - URL указанного документа
-
-### Дополнительные ###
-
-- [\*type\*] - вариант (документ, папка или ссылка)
-- [\*contentType\*] - тип содержимого (например, text/html)
-- [\*published\*] - опубликован ли документ (1|0)
-- [\*parent\*] - номер (ID) родительского документа
-- [\*isfolder\*] - является ли документа папкой (1|0)
-- [\*richtext\*] - используется ли при редактировании документа визуальный редактор
-- [\*template\*] - номер (ID) используемого шаблона для документа
-- [\*menuindex\*] - порядковый номер отображения в меню
-- [\*searchable\*] - доступен ли документ для поиска (1|0)
-- [\*cacheable\*] - Кэшируется ли документ (1|0)
-- [\*deleted\*] - Документ удален (1|0)
-- [\*deletedby\*] - Идентификатор пользователя удалившего документ
-- [\*menutitle\*] - Заголовок меню. Если не используется, то заголовок документа
-- [\*donthit\*] - Слежение за количеством посещений отключено (1|0)
-- [\*haskeywords\*] - Документ содержит ключевые слова (1|0)
-- [\*hasmetatags\*] - Документ имеет метатеги (1|0)
-- [\*privateweb\*] - Документ входит в частную группу пользовательских документов (1|0)
-- [\*privatemgr\*] - Документ входит в частную группу менеджерских документов (1|0)
-- [\*content_dispo\*] - Вариант выдачи содержимого (1 - для отображения | 0 - для скачивания)
-- [\*hidemenu\*] - Документ не отображается в меню (1|0)
-
-## Параметры TV, сниппеты и чанки ##
-
-[\*НазваниеПараметраTV\*] - выводит значение параметра в документе.
-
-{{НазваниеЧанка}} - возвращает содержимое чанка.
-
-[[название сниппета]] - возвращает результат работы сниппета. Можно передавать сниппету дополнительные параметры, перечисляя их при вызове. Допустим, если мы хотим получить id текущего документа и обработать его в сниппете, то вызов может быть похож на этот:
-```
-[[название сниппета?docId=`[+id+]`]]
-```
-[+НазваниеПеременной+] - плейсхолдер - встречается в чанках, которые используются для обработки результатов работы сниппетов. После обработки вместо них вставляются значения. В примере выше вы видите, как в параметр docId для сниппета мы подставили системный плейсхолдер [+id+], в котором будет id текущего документа. Плейсхолдеры можно создавать самому.
-
-**Нюансы**
-
-На самом деле есть два варианта вызова сниппета:
-1. [[название сниппета]] - кэшируемый вызов сниппета
-2. [!НазваниеСниппета!] - некэшируемый вызов сниппета
-
-**Где использовать**
-
-Все очень гармонично используется друг с другом.
-В шаблонах можно использовать параметры TV, сниппеты и чанки.
-В чанках можно вызывать сниппеты, параметры TV и другие чанки.
-В сниппетах можно вызывать вообще все, но через PHP.
-В конечном счете вам вернется итоговый результат обработки всех сниппетов/чанков/параметровTV.
-
-### Пример шаблона ###
-```html
-
-
-{{head_tags}}
-
- [*content*]
-
-
-```
-где head_tags это чанк со следующим содержимым:
-
-```html
-
-
-
- [*pagetitle*] / [(site_name)]
-
-```
-А в поле [\*content\*] будет выведено содержимое страницы, заданное из админки.
-На эту информацию опирается все остальное.
diff --git "a/en/03_Develop/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md" "b/en/03_Develop/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md"
deleted file mode 100644
index 5528dcb0..00000000
--- "a/en/03_Develop/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md"
+++ /dev/null
@@ -1,16 +0,0 @@
-
Разархивируйте файлы в любую папку на вашем локальном диске.
-
-
Подключитесь к сайту по FTP и скопируйте все файлы из локальной директории на сервер.
-
-
Evolution использует СУБД MySQL. Вам необходимо знать имя пользователя и пароль доступа к базе данных, либо создать самим базу и пользователя.
-
-
Наберите в строке вашего браузера имя_вашего_сайта/install/. Вместо «имя_вашего_сайта» введите домен, по которому сайт доступен в сети интернет.
-
-
Следуйте появившемся на экране инструкциям мастера установки.
-После завершения работы мастера установки, убедитесь, что папки install на сервере больше не существует. Если это не так, удалите ее вручную.
-
-
Опционально: проверьте и измените права доступа к файлу config.inc.php в папке /manager/includes на -0444 (r--r--r--) - это предотвратит ваш сайт от возможной атаки.
-
diff --git a/en/03_Develop/02_API/02_changeWebUserPassword.md b/en/03_Develop/02_API/02_changeWebUserPassword.md
deleted file mode 100644
index 3867850c..00000000
--- a/en/03_Develop/02_API/02_changeWebUserPassword.md
+++ /dev/null
@@ -1,20 +0,0 @@
-###Смена пароля для WEB-пользователя
-
-*Замечание: при возникновении ошибок метод возвращает информацию об ошибке на английском языке.*
-
-mixed changeWebUserPassword(string $oldPwd, string $newPwd);
-
-**$oldPwd** - старый пароль
-**$newPwd** - новый пароль
-
-
-
-####Пример:
-
-````php
-$txt = $modx->changeWebUserPassword('oldpassword','newpassword');
-print_r($txt);
-// полученный результат: true
-````
-
-
diff --git a/en/03_Develop/02_API/03_clearCache.md b/en/03_Develop/02_API/03_clearCache.md
deleted file mode 100644
index 6750731e..00000000
--- a/en/03_Develop/02_API/03_clearCache.md
+++ /dev/null
@@ -1,34 +0,0 @@
-###Очистка кэша сайта
-
-boolean clearCache([string $type]);
-
-**$type** - используем с значением *full* если нужно очистить весь кеш с учетом индексных файлов
-
-***
-
-####Пример
-
-````php
-//Очистит кэш сайта.
-$modx->clearCache();
-
-//Очистит кэш сайта с учетом индексных файлов(доступно с версии 1.0.13).
-$modx->clearCache('full');
-````
-*Замечание: Выполнение функции без параметра 'type' очищает не весь кэш. При использовании этой функции удаляются файлы с кэшем всех документов, но индексный файл кэша не изменяется. Из-за этого документы, которые были созданы программным путем, могут на сайте отсутствовать.*
-
-***
-
-####Полная очистка кэша для версий < 1.0.13
-
-````php
-function clearCache() {
- global $modx;
- $modx->clearCache();
- include_once MODX_MANAGER_PATH . 'processors/cache_sync.class.processor.php';
- $sync = new synccache();
- $sync->setCachepath(MODX_BASE_PATH . "assets/cache/");
- $sync->setReport(false);
- $sync->emptyCache();
-}
-````
\ No newline at end of file
diff --git a/en/03_Develop/03_DBAPI/10_getRecordCount.md b/en/03_Develop/03_DBAPI/10_getRecordCount.md
deleted file mode 100644
index ca2c35a5..00000000
--- a/en/03_Develop/03_DBAPI/10_getRecordCount.md
+++ /dev/null
@@ -1,26 +0,0 @@
-### Количество записей в результате запроса
-
-integer getRecordCount ($data_set)
-
-**$data_set** - соединение с базой
-
-Возвращает количество записей, которое было получено в результате запроса SELECT.
-
-***
-
-#### Пример
-````
-$output = '';
-$result = $modx->db->select('make, model, color, year', 'cars', 'year > 2001');
-$total_rows = $modx->db->getRecordCount( $result );
-
-if( $total_rows >= 1 ) {
- $output .= $total_rows . ' машин новее 2001 года: ';
- while( $row = $modx->db->getRow( $result ) ) {
- $output .= 'Производитель: ' . $row['make'] . ' | Модель: ' . $row['model'] . ' | Цвет: ' . $row['color'] . ' | Год: ' . $row['year'] . ' ';
- }
-}else{
- $output = 'Нет машин новее 2001 года!';
-}
-echo $output;
-````
diff --git a/en/03_Develop/03_DBAPI/13_getValue.md b/en/03_Develop/03_DBAPI/13_getValue.md
deleted file mode 100644
index 8432dbf5..00000000
--- a/en/03_Develop/03_DBAPI/13_getValue.md
+++ /dev/null
@@ -1,20 +0,0 @@
-###Значение первой колонки из результата запроса
-
-mixed getValue($dsq)
-
-**$dsq** - результат выполнения запроса или SQL-запрос
-
-Эта функция возвращает первое значение из первой колонки в результате запроса. Благодаря этому можно быстро получить единственное предполагаемое значение (например, результат запроса SELECT COUNT(*)).
-
-***
-
-####Пример
-
- function display_rows() {
- global $modx;
- $count = $modx->db->getValue( $modx->db->select( 'count(*)', 'people' ) ); if( $count < 1 ) {
- return 'No records found';
- }else{
- return 'Найдено ' . $count . ' записей в базе.';
- }
- }
\ No newline at end of file
diff --git a/en/03_Develop/03_DBAPI/16_makeArray.md b/en/03_Develop/03_DBAPI/16_makeArray.md
deleted file mode 100644
index 85dcdaeb..00000000
--- a/en/03_Develop/03_DBAPI/16_makeArray.md
+++ /dev/null
@@ -1,24 +0,0 @@
-###Результат запроса в виде массива
-
-mixed makeArray( $rs )
-
-**$rs** - результат выполнения запроса
-
-Этот метод возвращает многомерный ассоциативный массив с данными результата запроса в формате Key => Array( FieldName => Value ).
-
-***
-
-####Пример
-
- function show_members() {
- global $modx;
- $output = '';
- $table = $modx->getFullTableName( 'members' );
-
- $result = $modx->db->select( 'id, name, picture', $table, '', 'name ASC', '' ); $members = $modx->db->makeArray( $result );
- foreach( $members as $p_val ) {
- foreach( $p_val as $m_key => $m_val ) {
- $output .= '' . $m_key . ': ' . $m_val . ' ';
- }
- }
- }
\ No newline at end of file
diff --git a/en/03_Develop/03_DBAPI/18_query.md b/en/03_Develop/03_DBAPI/18_query.md
deleted file mode 100644
index 18e5b9c5..00000000
--- a/en/03_Develop/03_DBAPI/18_query.md
+++ /dev/null
@@ -1,23 +0,0 @@
-### Прямой запрос в базу данных
-
-mixed query($sql)
-
-**$sql** - строка с SQL-запросом
-
-Различные методы DBAPI делают в конечном итоге запрос в базу с помощью метода "query". Если не хватает стандартных возможностей специальных методов, то можно сделать любой SQL-запрос напрямую.
-
-***
-
-#### Пример
-
- $output = '';
- $result = $modx->db->query('SELECT id, name, joined FROM ' . $modx->getFullTableName('user_table') . ' GROUP BY `member_type` ORDER BY name ASC');
-
- while( $row = $modx->db->getRow( $result ) ) {
- $output .= ' Идентификатор: ' . $row['id'] .
- ' Имя: ' . $row['name'] .
- ' Участие: ' . $row['joined'] .
- ' --------- ';
- }
-
- echo $output;
diff --git a/en/03_Develop/03_DBAPI/19_select.md b/en/03_Develop/03_DBAPI/19_select.md
deleted file mode 100644
index 0256e186..00000000
--- a/en/03_Develop/03_DBAPI/19_select.md
+++ /dev/null
@@ -1,36 +0,0 @@
-###Получение данных
-
-resource select($fields , $from [, $where [, $orderby [, $limit]]])
-
-**$fields** - список необходимых полей из запроса
-**$from** - таблица для выборки
-**$where** - условие выборки
-**$orderby** - поле по которому нужно сделать сортировку
-**$limit** - ограничение количества записей в результате запроса
-
-Метод "select" позволяет сделать обычный запрос в базу для получения данных, которые соответствуют заданным параметрам.
-
-***
-
-####Пример
-
- function login($username, $password) {
- global $modx;
- // предполагается, что эти значения были получены
- // с помощью POST до вызова функции
- $username = $modx->db->escape($username);
- $password = $modx->db->escape($password);
-
- $res = $modx->db->select("id", $modx->getFullTableName('web_users'), "username='" . $username ."' AND password='".md5($password)."'");
-
- if($modx->db->getRecordCount($res)) {
-
- $id = $modx->db->getValue($res);
- $_SESSION['userid'] = $id;
- // прочие действия...
-
- }else{
-
- // подходящей записи не нашлось
- }
- }
\ No newline at end of file
diff --git a/en/03_Develop/index.md b/en/03_Develop/index.md
deleted file mode 100644
index 4f8e89c0..00000000
--- a/en/03_Develop/index.md
+++ /dev/null
@@ -1 +0,0 @@
-Здесь пока нет нужной информации
\ No newline at end of file
diff --git a/en/03_Developers/01_Installation/index.md b/en/03_Developers/01_Installation/index.md
new file mode 100644
index 00000000..a9a3612a
--- /dev/null
+++ b/en/03_Developers/01_Installation/index.md
@@ -0,0 +1,16 @@
+
+
Download the latest version of the system.
+
+
Unzip the files to any folder on your local drive.
+
+
Connect to the site via FTP and copy all the files from the local directory to the server.
+
+
Evolution uses mySQL. You need to know the username and password to access the database, or create the database and the user yourself.
+
+
Type your_site_name/install/ in the line of your browser. Instead of "your_site_name", enter the domain by which the site is available on the Internet.
+
+
Follow the on-screen instructions in the Installation Wizard.
+After you complete the Installation Wizard, verify that the install folder on the server no longer exists. If it is not, delete it manually.
+
+
Optional: check and change the permissions to the config.inc.php file in the /manager/includes folder to -0444 (r--r--r--) - this will prevent your site from a possible attack.
+
diff --git a/en/03_Developers/02_Elements/01_Console/02_Schedule.md b/en/03_Developers/02_Elements/01_Console/02_Schedule.md
new file mode 100644
index 00000000..8a9c9890
--- /dev/null
+++ b/en/03_Developers/02_Elements/01_Console/02_Schedule.md
@@ -0,0 +1,66 @@
+> [!IMPORTANT]
+> Commands are not executed automatically if the site is put into maintenance mode (Configuration -> Site -> Site Status -> Offline).
+
+In order for the commands to be executed automatically on the server side without the involvement of the developer, the Schedule is used.
+
+To configure the schedule, you need to add the `schedule()` method to the command file.
+```
+/**
+ * Define the command's schedule.
+ *
+ * @param \Illuminate\Console\Scheduling\Schedule $schedule
+ * @return void
+ */
+public function schedule(Schedule $schedule)
+{
+ $schedule->command(static::class)->everyFiveMinutes();
+}
+```
+
+In the `boot()` method, the provider service initializes the schedule.
+```
+if (count($this->commands)) {
+ $this->app->booted(function () {
+ $this->defineConsoleSchedule();
+ });
+}
+```
+
+Add the necessary methods to the service provider's file
+```
+/**
+ * Define the application's command schedule.
+ *
+ * @note check timezones list timezone_identifiers_list()
+ *
+ * @return void
+ */
+protected function defineConsoleSchedule()
+{
+ $this->app->singleton(Schedule::class, function ($app) {
+ return tap(new Schedule(now()->timezoneName), function ($schedule) {
+ $this->schedule($schedule->useCache('file'));
+ });
+ });
+}
+
+/**
+ * Define the application's command schedule.
+ *
+ * @param \Illuminate\Console\Scheduling\Schedule $schedule
+ * @return void
+ */
+public function schedule(Schedule $schedule)
+{
+ foreach ($this->commands as $command) {
+ (new $command)->schedule($schedule);
+ }
+}
+```
+
+Configure the crown startup
+```
+* * * * * cd /path-to-your-project/core && php artisan schedule:run >> /dev/null 2>&1
+```
+
+More details here https://laravel.com/docs/9.x/scheduling
diff --git a/en/03_Developers/02_Elements/01_Console/index.md b/en/03_Developers/02_Elements/01_Console/index.md
new file mode 100644
index 00000000..38b7ff7d
--- /dev/null
+++ b/en/03_Developers/02_Elements/01_Console/index.md
@@ -0,0 +1,6 @@
+Artisan is a command line interface included with Evolutions CMS. It provides a number of useful commands that can help you build your application. You can find more detailed information here: https://laravel.com/docs/9.x/artisan
+
+To use console commands, just type in the terminal
+`php artisan`. This will show a list of all commands that are currently available.
+
+Creating a console command is described at https://github.com/evolution-cms/example-package#console.
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/01_If_Statements.md b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/01_If_Statements.md
new file mode 100644
index 00000000..59255fad
--- /dev/null
+++ b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/01_If_Statements.md
@@ -0,0 +1,31 @@
+You can create `if' operators using `@if`, `@elseif`, `@else` and `@endif` directives. These directives function identically to their PHP counterparts:
+
+```blade
+@if (count($records) === 1)
+ I have one record!
+@elseif (count($records) > 1)
+ I have many records!
+@else
+ I have no records!
+@endif
+```
+
+For convenience, Blade also provides the `@unless` directive:
+
+```blade
+@unless (evo_role())
+ You are not logged in, so your role on the site is not defined.
+@endunless
+```
+
+In addition to the conditional directives already discussed, the `@isset` and `@empty` directives can be used as convenient shortcuts for the corresponding PHP functions:
+
+```blade
+@isset($records)
+ // $records is defined and not null...
+@endisset
+
+@empty($records)
+ // $records is "empty"...
+@endempty
+```
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/02_Switch_Statements.md b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/02_Switch_Statements.md
new file mode 100644
index 00000000..eb7ebec5
--- /dev/null
+++ b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/02_Switch_Statements.md
@@ -0,0 +1,11 @@
+You may construct `if` statements using the `@if`, `@elseif`, `@else`, and `@endif` directives. These directives function identically to their PHP counterparts:
+
+```blade
+@if (count($records) === 1)
+ I have one record!
+@elseif (count($records) > 1)
+ I have multiple records!
+@else
+ I don't have any records!
+@endif
+```
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/03_Loops.md b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/03_Loops.md
new file mode 100644
index 00000000..4f89ef9e
--- /dev/null
+++ b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/03_Loops.md
@@ -0,0 +1,95 @@
+In addition to conditional statements, Blade provides simple directives for working with PHP's loop structures. Again, each of these directives functions identically to their PHP counterparts:
+
+```blade
+@for ($i = 0; $i < 10; $i++)
+ Current value is {{ $i }}
+@endfor
+
+@foreach ($users as $user)
+
This is user {{ $user->id }}
+@endforeach
+
+@forelse ($users as $user)
+
{{ $user->name }}
+@empty
+
No users
+@endforelse
+
+@while (true)
+
I loop forever.I loop forever.
+@endwhile
+```
+
+> **Note**
+> When iterating through a foreach loop, you can use [the-loop-variable](#the-loop-variable) to get valuable information about the loop, such as whether you are on the first or last iteration of the loop.
+
+When using loops, you can also skip the current iteration or end the loop using `@continue` and `@break` directives:
+
+```blade
+@foreach ($users as $user)
+ @if ($user->type == 1)
+ @continue
+ @endif
+
+
{{ $user->name }}
+
+ @if ($user->number == 5)
+ @break
+ @endif
+@endforeach
+```
+
+You can also include a continue or break condition in the directive declaration:
+```blade
+@foreach ($users as $user)
+ @continue($user->type == 1)
+
{{ $user->name }}
+ @break($user->number == 5)
+@endforeach
+```
+
+
+### Loop variable
+
+During `foreach' traversal of the `$loop` loop, the variable will be accessible inside the loop. This variable provides access to some useful information, such as the current loop index and whether this is the first or last iteration of the loop:
+
+```blade
+@foreach ($users as $user)
+ @if ($loop->first)
+ This is the first iteration.
+ @endif
+
+ @if ($loop->last)
+ This is the latest iteration.
+ @endif
+
+
This is user {{ $user->id }}
+@endforeach
+```
+
+If you are inside a nested loop, you can access the `$loop` variable of the parent loop using the `parent` property:
+
+```blade
+@foreach ($users as $user)
+ @foreach ($user->posts as $post)
+ @if ($loop->parent->first)
+ This is the first iteration of the parent loop.
+ @endif
+ @endforeach
+@endforeach
+```
+
+The `$loop` variable also contains a number of other useful properties:
+
+| Property | Description |
+|--------------------|---------------------------------------------------------------|
+| `$loop->index` | The index of the current iteration of the loop (starts at 0). |
+| `$loop->iteration` | The current iteration of the loop (starting at 1). |
+| `$loop->remaining` | The remaining iterations in the loop. |
+| `$loop->count` | The total number of elements in the repeating array. |
+| `$loop->first` | Is this the first iteration of the loop. |
+| `$loop->last` | Is this the last iteration of the loop. |
+| `$loop->even` | Is this an even loop iteration. |
+| `$loop->odd` | Is this an odd iteration of the loop. |
+| `$loop->depth` | Nesting level of the current cycle. |
+| `$loop->parent` | When in a nested loop, the parent loop variable. |
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/04_Check_user_role.md b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/04_Check_user_role.md
new file mode 100644
index 00000000..29e942a1
--- /dev/null
+++ b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/04_Check_user_role.md
@@ -0,0 +1,46 @@
+
+
+Starting with version Evolution CMS >= 3.2.1, it became possible to display content depending on the user's role using the `@evoRole` directive. Example:
+
+```blade
+@evoRole('Administrator')
+ This text will only be visible to a user with the Administrator role.
+@evoEndRole
+```
+
+> **Warning**
+> Be very careful, the `@evoRole` directive requires the `@evoEndRole` directive to close the display block. If the `@evoEndRole' directive is omitted, it will lead to errors in the site's operation.
+
+By default, the following roles are available after installing Evolution CMS:
+
+* Administrator
+* Editor
+* Publisher
+
+### Output data subject to role validation
+
+Above is the simplest case of user role verification. At the expense of displaying your own text for each role, in this case the `@evoElseRole` directive will be useful. Example:
+
+```blade
+@evoRole('Administrator')
+ This text will only be visible to a user with the Administrator role.
+@evoElseRole('Editor')
+ This text will only be visible to a user with the Editor role.
+@evoElseRole()
+ This text will be shown to all users who are authorized on the site.
+@else
+ This text will be shown to all others, including unauthorized users.
+@evoEndRole
+```
+
+### User authorization check
+
+If an empty string is passed as an argument to the `@evoRole` and `@evoElseRole` directives, or nothing is passed, the check is performed only for user authorization.
+
+```blade
+@evoRole()
+ This user is authorized on the site.
+@else
+ This user is not authorized on the site.
+@evoEndRole
+```
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/index.md b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/index.md
new file mode 100644
index 00000000..409427ba
--- /dev/null
+++ b/en/03_Developers/02_Elements/02_Template/01_Blade_Directives/index.md
@@ -0,0 +1,88 @@
+Blade is a simple yet powerful templating engine built into Evolution CMS. Unlike some PHP templating engines, Blade doesn't restrict you from using plain PHP code in your templates. In fact, all Blade templates are compiled into plain PHP code and cached until they are changed, meaning Blade adds virtually no overhead to your application. Blade template files use the `.blade.php` file extension and are usually stored in the `/views/` directory.
+
+## Display data
+
+You can display the data that is passed to your Blade views by enclosing a variable in curly braces. For example, you can display the contents of the `name` variable like this:
+
+```blade
+Hello {{ $name }}.
+```
+
+> **Note**
+> Blade `{{ }}` echo expressions are automatically sent via PHP's `htmlspecialchars` function to prevent XSS attacks.
+
+You are not limited to displaying the contents of variables passed to the view. You can also iterate over the results of any PHP function. In fact, you can put any PHP code you want inside the Blade echo statement:
+
+```blade
+Current UNIX timestamp {{ time() }}.
+```
+
+### Displaying unshielded data
+
+By default, `{{ }}` Blade statements are automatically sent through PHP's `htmlspecialchars` function to prevent XSS attacks. If you don't want your data to be escaped, you can use the following syntax:
+
+```blade
+Hello, {!! $name !!}.
+```
+
+> **Warning**
+> Be very careful when reproducing content provided by users of your app. Normally, you should use escaped double curly braces syntax to prevent XSS attacks when displaying user-supplied data.
+
+### Blade and JavaScript
+
+Since many JavaScript frameworks also use curly braces to indicate that a given expression should be rendered in the browser, you can use the `@` symbol to tell the Blade rendering engine that the expression should be left untouched. Example:
+
+```blade
+
Evolution CMS
+
+Hi @{{ $name }}.
+```
+
+In this example, the @symbol will be removed from Blade, but the `{{ name }}` expression will remain untouched by the Blade handler, allowing it to be rendered in your JavaScript structure.
+
+The `@` character can also be used to escape Blade directives:
+
+```blade
+{{-- Blade template --}}
+@@if()
+
+
+@if()
+```
+
+#### JSON visualization
+
+Sometimes you can pass an array to your view with the intention of displaying it as JSON to initialize a JavaScript variable. Example:
+
+```blade
+
+```
+
+However, instead of calling `json_encode` manually, you can use the `Js::from` method. The `from` method takes the same arguments as PHP's `json_encode` function, but this will ensure that the resulting JSON is properly escaped for HTML quoting. The `from` method will return a string `JSON.parse` JavaScript operator that will convert the given object or array into a valid JavaScript object:
+
+```blade
+
+```
+
+> **Warning**
+> You should only use the `Js::from` method to render existing variables as JSON. The Blade pattern is based on regular expressions, and attempts to pass a complex expression to a directive can cause unexpected errors.
+
+#### The `@verbatim` directive
+
+If you expose JavaScript variables in a large part of your template, you can wrap the HTML in the `@verbati` directive so that you don't have to append the `@` symbol to each Blade echo statement:
+
+```blade
+@verbatim
+
+ Hello {{ $name }}.
+
+@endverbatim
+```
+
+## Blade Directives
+
+In addition to template inheritance and data mapping, Blade also provides convenient shortcuts for common PHP control structures such as conditional statements and loops. These shortcuts provide a very clean, concise way of working with PHP control structures while remaining familiar to their PHP counterparts.
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/02_Template/index.md b/en/03_Developers/02_Elements/02_Template/index.md
new file mode 100644
index 00000000..8ebe8c2b
--- /dev/null
+++ b/en/03_Developers/02_Elements/02_Template/index.md
@@ -0,0 +1,115 @@
+A template in Evolution CMS is the main part of the site page, which determines its design. The template does not require special syntax and is a regular HTML code (or possibly XHTML or another) with the call of the necessary chunks, parameters and snippets.
+
+The number of templates most often depends on the appearance and functionality of the site. As a rule, templates are created for various sections and pages of the site. For example, it will be logical to create different templates for the product and for the news and attach various TV parameters to them. This will allow the content manager to fill the site faster and more correctly. It will also greatly facilitate the work of a programmer if you need to make some news feeds or products.
+
+It is also worth mentioning that there is a special blank template that does not contain any design and cannot be edited.
+
+#### Example template:
+
+
+ [*pagetitle*]
+
+
+
+
+ [[Wayfinder? &startId=`5` &level=`1`]]
+
+
+
+
[*longtitle*]
+ [*content*]
+
+
+ {{footer}}
+ {{Google}}
+
+
+As we can see - this is a completely understandable HTML-markup of the page in which special constructions are used. Among them:
+
+Chunky - {{footer}}, {{Google}}
+
+Parameters - [*pagetitle*], [*content*]
+
+Placeholder - [(site_url)]
+
+Snippet Call - [[Wayfinder? &startId=`5` &level=`1`]]
+
+## Create and edit a template
+
+All templates are located in the following location:
+
+Resources → Resource Management → Template The list of templates is as follows:
+
+To create a new template, you need to click on the "New template" link, and to edit an existing one, just click on the link with its name. When you create a template, you can also choose which TV settings it owns and sort them as needed.
+
+### Blade
+
+Starting with the Evolution CMS 2.0 version, it became possible to use the Blade template generator to create site templates.
+
+To get the ability to use Blade for your selected template, you should add a nickname to it in the editing mode of the template, and then check the "Create a template file when saving" checkbox.
+
+All created templates will be placed in the /views/ folder at the root of the site. After that, you can work with the template using your favorite code editor.
+
+### Creating a template in Evolution CMS
+
+#### Assign fields
+
+Template name - used in the template selection list. You may also need snippets, plugins, or modules for some operations. You can use both English or Russian, as well as a hyphen, an underscore, and a space.
+
+**Description** - displayed next to the name of the template in the general list. Used only to describe the purpose of the template and not required.
+
+**Create Category** - allows you to select an existing category in which the template will be placed. A category allows you to separate a template from the rest in the general list. If no category is selected, the template will fall into the general category "Uncategorized".
+
+**New category** - if there is no suitable category in the list of existing categories, you can create it by simply writing the name in this field.
+
+Restrict access to editing a template - if you enable the checkbox, no one except administrators will be able to edit this template.
+
+**Template code (html)** - the content of the template itself is placed here.
+
+### Conservation
+
+**Save** - creates a new template
+
+**Undo** - will return us to the list of templates without saving the result.
+
+**Make a copy** - appears only in edit mode.
+
+**Delete** - appears only in edit mode.
+
+Evolution allows you to define a few more actions after saving the template:
+
+**Create a new one** - immediately after saving the template, a form will open to create a new one. In this way, you can quickly create a series of templates.
+
+**Continue editing** - after saving, the template will open again for editing. In this mode, it is convenient to make small changes and check the final result.
+
+**Close** - after saving, we will return to the general list of templates.
+
+## Create a copy of a template
+
+Sometimes it is necessary to create a copy of an existing template. It's very easy to do. To do this, go to the editing of the desired template and click on the "Make a copy" button.
+
+This opens a copy of the template for editing. The copy differs in that Duplicate of is added to its name. You just have to correct the name to a more appropriate one and make other necessary changes.
+
+A copy is created immediately after confirmation, so if you click Cancel, a copy will still remain in the list of templates.
+
+## Delete a template
+
+To delete, you need to go into the editing mode of the corresponding template and click the "Delete" button.
+
+**Attention! Templates are deleted completely and there is no way to restore them.**
+
+## Default template
+
+When you create a document, a default template is automatically suggested. To configure the default template, you must do the following:
+
+Go to the management system settings: Tools → Configuration → Site Find the "Default Template" parameter and change to the desired one. Save the settings.
+
+## FAQ
+
+Are there any restrictions on website design templates?
+
+Absolutely none. Evolution allows you to implement any design.
+
+## Where can I get ready-made templates?
+
+Evolution makes it easy to use any laid out HTML-layout, which can be ordered from specialists or found on specialized sites.
diff --git a/en/03_Developers/02_Elements/03_Chunks.md b/en/03_Developers/02_Elements/03_Chunks.md
new file mode 100644
index 00000000..c9c94676
--- /dev/null
+++ b/en/03_Developers/02_Elements/03_Chunks.md
@@ -0,0 +1,129 @@
+A chunk in Evolution is a small piece of HTML code or other information that can be reused multiple times in a template, another chunk, or a snippet.
+
+## Using chunks
+
+### Option 1
+A chunk is created for any pieces of code that will be used multiple times.
+For example, you can remove the header, footer, main menu, crumbs. Thanks to this, changes can be made in one chunk, and not in several templates. It's easier and doesn't have the risk of leaving a certain template without an important change.
+### Option 2
+The second most common use of a chunk is templates for snippets.
+Due to this, control code and design are separated. Depending on the complexity of the snippet, the number of templates may vary.
+For example, to create a feedback form, you may need 3 main templates - the form, the text about successful reception, the text of the letter to the administrator with the received information. In order for the chunk to be not only part of the HTML code, but work as a template, it is necessary to indicate the appropriate places where the snippet will write its information. Placeholders play the role of such places.
+
+**Example chunk content with placeholders:**
+```
+
[+wf.linktext+]
+```
+This is the template used for menu items. Accordingly, [+wf.classes+] and [+wf.linktext+] are placeholders that will be replaced by the Wayfinder snippet with the used CSS class and the name of the menu item.
+
+In addition to these two options, a chunk can be used to store some special information. For example, you can store a set of parameters for a snippet (eg a list of files), which can be generated manually or by other means.
+
+### Creating and editing a chunk ###
+
+All chunks are located in the following location:
+```
+Elements → Chunks
+```
+To create, you need to click on "New Chunk", and to edit an existing chunk, just click on the link with its name.
+
+## Assignment of fields: ##
+
+**Chunk Name** - used to call a chunk. You can use both English and Russian, as well as hyphens and underscores. You cannot use a space!
+
+**Description** - displayed next to the chunk name in the general list. It is used only to describe the purpose of the chunk and is not mandatory.
+
+**Create category** - allows you to select an existing category in which the chunk will be placed. The category allows you to separate a chunk from others in the general list. If no category is selected, the chunk falls into the general "Uncategorized" category.
+
+**New Category** - if the list of existing categories does not have the required one, you can create one by simply writing the name in this field.
+
+**Restrict access to chunk editing** - if you enable the checkbox, no one except administrators will be able to edit this chunk.
+
+**Chunk code (html)** - here we place the chunk code.
+
+**Editor** - enables the visual editor. It is disabled by default, but you can enable it if necessary. There are also editors that allow syntax highlighting.
+
+### Savings ###
+
+Everything is clear with the main buttons:
+
+**Save** - will create a new chunk
+
+**Cancel** - will return us to the list of chunks without saving the result.
+
+**Make a copy** - appears only in edit mode.
+
+**Remove** - appears only in edit mode.
+
+Evolution allows you to define more actions after saving a chunk:
+
+**Create new** - immediately after saving a chunk, a form for creating a new one will open. This way, you can quickly create a series of chunks.
+
+**Continue editing** - after saving, the chunk will open again for editing. In this mode, it is convenient to make small changes and check the final result.
+
+**Close** - after saving, we will return to the general list of chunks.
+
+### Creating a copy of the chunk ###
+Sometimes it is necessary to create a copy of an existing chunk. It's very easy to do. To do this, you need to go to edit the desired chunk and click the "Make a copy" button.
+
+After that, a copy of the chunk will be opened for editing. A copy differs in that the line "Duplicate of..." is added to its name. All you have to do is correct the title to a more appropriate one and make other necessary edits.
+
+A copy is created immediately after confirmation, so if you press cancel, the copy will still remain in the list of chunks.
+
+### Deleting a chunk
+To delete, you need to enter the editing mode of the corresponding chunk and press the Delete button.
+WARNING! Chunks are deleted completely and there is no way to restore them.
+
+### Summon a chunk
+An existing chunk in a template (or another chunk) is called very simply. For this purpose, the structure is used in the form of the name of the chunk surrounded by curly brackets:
+
+```
+{{ChanName}}
+```
+### Call chunk with parameters
+
+Starting with Evolution 1.4.0, parameters can be passed to chunks.
+```
+{{mychank? &firstparam=`value` &secondparam=`value2`}}
+```
+Inside the chunk, the transferred parameters can be obtained by calling the placeholder of the same name.
+```
+[+firstparam+] and [+secondparam+]
+```
+
+It is worth remembering that the name is case-sensitive (Mychank and myChank are different chanks fromsystem poison).
+
+## Example of a template with a chunk call: ##
+```
+
+
+ {{Head}}
+
+
+ {{menu}}
+
+
+ {{content}}
+
+
+ {{footer}}
+
+
+```
+This example template contains only chunks, but in practice it also contains TV parameters and snippets. Therefore, it should not be assumed that chunks must be used necessarily and in large quantities.
+
+## API ##
+The getChunk method is used to get the contents of a chunk through the API.
+
+### Example of a call:
+```
+$chunk = $modx->getChunk('ChunkName');
+```
+
+## FAQ
+I made a chunk but it doesn't work. Why could this be?
+
+Check the name of the chunk. It should not contain spaces, and the case of letters when called should exactly match the name of the chunk.
+
+Is it possible to call a chunk into a chunk?
+
+Yes.
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/04_Snippets.md b/en/03_Developers/02_Elements/04_Snippets.md
new file mode 100644
index 00000000..06939501
--- /dev/null
+++ b/en/03_Developers/02_Elements/04_Snippets.md
@@ -0,0 +1,71 @@
+### What are snippets ###
+
+A snippet is PHP code that outputs the result of its work at the place in the template/chunk where this snippet can be called. Any parameters can be passed in snippets, including other snippets, TV parameters or chunks.
+
+### What are snippets for ###
+As a rule, snippets are used to display dynamically changing content.
+They can be used to create menus, comments, news feeds, blogs or any other functionality that is possible in the php language in connection with the API of the Evolution system.
+
+### Snippet Call ###
+
+You can call the snippet anywhere in the resource. As a general rule, this usually happens in a template or chunks.
+It is highly discouraged to call snippets in the content field, especially if this field is editable by site managers.
+
+```
+[!mySnippet? ¶m=`Value`!] - non-cacheable call
+[[mySnippet? ¶m=`Value`]] - cached call
+```
+
+### API call ###
+```
+$params => array('param' => 'Value');
+$modx->runSnippet('mySnippet', $params);
+```
+
+### Snippet example ###
+
+For example, let's make a snippet that shows the date the document was created in a human-readable format.
+The document creation date is in the system TV parameter [\*createdon\*].
+The parameter stores the creation date of the document in unixtime format and its value looks something like this: 1144904400.
+
+```
+ 'January',
+ '2' => 'February',
+ '3' => 'March',
+ '4' => 'April',
+ '5' => 'May',
+ '6' => 'June',
+ '7' => 'July',
+ '8' => 'August',
+ '9' => 'September',
+ '10' => 'October',
+ '11' => 'November',
+ '12' => 'December');
+$output = strftime('%d.%m.%Y',$date);
+$date = explode("., $output);
+$month = (int)$date[1];
+$m = $fullMonth[$month];
+$out = $date[0] . ' ' . $m. ' ' . $date[2];
+return $out;
+```
+
+**Using.**
+
+Let's pass the TV parameter [\*createdon\*] to the snippet:
+```
+[[ruDate? &date=`[*createdon*]`]]
+```
+As a result, we will get something like this:
+```
+May 21, 2018
+```
+
+### Popular Snippets ###
+
+- **DocLister** - allows you to output data from any tables. Ideal for creating news feeds, blogs, product or service catalogs.
+- **FormLister** - a snippet for working with forms. Perfectly suitable for forms for sending messages from the site, authorization-registration and any possible functionality related to a personal account.
+- **phpthumb** - a snippet for creating thumbnails of images, applying watermarks and other work with images.
+- **JotX** - a snippet for creating comments.
+- **Sitemap** - sitemap.xml generator.
\ No newline at end of file
diff --git a/en/03_Developers/02_Elements/05_Plugins/02_Plugin_events.md b/en/03_Developers/02_Elements/05_Plugins/02_Plugin_events.md
new file mode 100644
index 00000000..f4c09096
--- /dev/null
+++ b/en/03_Developers/02_Elements/05_Plugins/02_Plugin_events.md
@@ -0,0 +1,273 @@
+## Template Service Events ##
+All events related to the display of the page
+### OnAfterLoadDocumentObject
+### OnBeforeLoadDocumentObject
+### OnBeforeLoadExtension
+### OnBeforeParseParams
+
+### OnDocPublished
+Runs when a document is published
+```
+manager/processors/publish_content.processor.php
+```
+**Returns:**
+```
+docid - id Document
+```
+
+### OnDocUnPublished
+Runs when a document is unpublished
+```
+manager/processors/unpublish_content.processor.php
+```
+**Returns:**
+```
+docid - id Document
+```
+
+### OnLoadDocumentObject
+Runs after formation $modx->documentObject
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnLoadWebDocument
+Runs if the document was taken from the database
+```
+manager/includes/document.parser.class.inc.php
+```
+
+
+### OnLogPageHit
+It is launched if the "Track visits" setting is selected. This event is raised before the document is loaded.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnMakeDocUrl
+
+### OnParseDocument
+Runs before TV, snippets and chunks are processed
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnParseProperties
+
+### OnWebPageComplete
+Triggered when the "Track visits" setting is worth it
+```
+manager/includes/document.parser.class.inc.php
+```
+
+
+### OnWebPageInit
+Runs after the cache has been loaded into the $modx
+
+### OnWebPagePrerender
+Runs before the page is given to the client. This is the last event raised before the page is sent to the client browser.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+
+## Cache Service Events ##
+Caching events
+
+### OnBeforeCacheUpdate
+Runs before the cache is refreshed
+
+### OnBeforeSaveWebPageCache
+Runs after the page is cached
+
+### OnCacheUpdate
+Runs immediately after being written to the cache
+
+### OnLoadWebPageCache
+Runs after the cached page is loaded
+
+### OnMakePageCacheKey
+
+## Web Access Service Events ##
+
+### OnBeforeWebLogin
+### OnBeforeWebLogout
+### OnWebAuthentication
+### OnWebChangePassword
+### OnWebCreateGroup
+### OnWebDeleteUser
+### OnWebLogin
+### OnWebLogout
+### OnWebSaveUser
+
+## Manager Access Events ##
+
+### OnBeforeManagerLogin
+### OnBeforeManagerLogout
+### OnBeforeManagerPageInit
+### OnManagerAuthentication
+### OnManagerChangePassword
+### OnManagerCreateGroup
+### OnManagerDeleteUser
+### OnManagerFrameLoader
+### OnManagerLogin
+### OnManagerLoginFormPrerender
+### OnManagerLoginFormRender
+### OnManagerLogout
+### OnManagerMainFrameHeaderHTMLBlock
+### OnManagerMenuPrerender
+### OnManagerNodePrerender
+### OnManagerNodeRender
+### OnManagerPageInit
+### OnManagerPreFrameLoader
+### OnManagerSaveUser
+### OnManagerTopPrerender
+### OnManagerTreeInit
+### OnManagerTreePrerender
+### OnManagerTreeRender
+### OnManagerWelcomeHome
+Use this event you can add custom widgets to home page of admin panel.
+```php
+ Event::listen(
+ 'evolution.OnManagerWelcomeHome',
+ function ($params) {
+ $params['widgets']['tutorial'] = [
+ 'menuindex' => '1',
+ 'id' => 'tutorial',
+ 'cols' => 'col-sm-12',
+ 'icon' => 'fab fa-leanpub',
+ 'title' => 'Video-tutorial',
+ 'body' => '
+
+
'
+ ];
+ return serialize($params['widgets']);
+ }
+ );
+```
+### OnManagerWelcomePrerender
+### OnManagerWelcomeRender
+
+## Parser Service Events ##
+
+### OnFileManagerUpload
+### OnPageNotFound
+### OnPageUnauthorized
+### OnSiteRefresh
+
+## Chunks ##
+
+### OnBeforeChunkFormDelete
+### OnBeforeChunkFormSave
+### OnChunkFormDelete
+### OnChunkFormPrerender
+### OnChunkFormRender
+### OnChunkFormSave
+
+## Documents ##
+
+### OnAfterMoveDocument
+### OnBeforeDocDuplicate
+### OnBeforeDocFormDelete
+### OnBeforeDocFormSave
+### OnBeforeEmptyTrash
+### OnBeforeMoveDocument
+### OnCreateDocGroup
+### OnDocDuplicate
+### OnDocFormDelete
+### OnDocFormPrerender
+### OnDocFormRender
+### OnDocFormSave
+### OnDocFormTemplateRender
+### OnDocFormUnDelete
+### OnEmptyTrash
+### OnStripAlias
+
+## File Browser Events ##
+
+### OnFileBrowserUpload
+
+## Modules ##
+
+### OnBeforeModFormDelete
+### OnBeforeModFormSave
+### OnModFormDelete
+### OnModFormPrerender
+### OnModFormRender
+### OnModFormSave
+
+## Plugins ##
+
+### OnBeforePluginFormDelete
+### OnBeforePluginFormSave
+### OnPluginFormDelete
+### OnPluginFormPrerender
+### OnPluginFormRender
+### OnPluginFormSave
+
+## RichText Editor
+
+### OnRichTextEditorInit
+### OnRichTextEditorRegister
+
+## Snippets ##
+
+### OnBeforeSnipFormDelete
+### OnBeforeSnipFormSave
+### OnSnipFormDelete
+### OnSnipFormPrerender
+### OnSnipFormRender
+### OnSnipFormSave
+
+## System Settings ##
+
+### OnFriendlyURLSettingsRender
+### OnInterfaceSettingsRender
+### OnMiscSettingsRender
+### OnSiteSettingsRender
+### OnUserSettingsRender
+
+## Template Variables ##
+
+### OnBeforeTVFormDelete
+### OnBeforeTVFormSave
+### OnTVFormDelete
+### OnTVFormPrerender
+### OnTVFormRender
+### OnTVFormSave
+
+## Templates ##
+
+### OnBeforeTempFormDelete
+### OnBeforeTempFormSave
+### OnTempFormDelete
+### OnTempFormPrerender
+### OnTempFormRender
+### OnTempFormSave
+
+## Users ##
+
+### OnBeforeUserFormDelete
+### OnBeforeUserFormSave
+### OnUserFormDelete
+### OnUserFormPrerender
+### OnUserFormRender
+### OnUserFormSave
+
+## Web Users ##
+
+### OnBeforeWUsrFormDelete
+### OnBeforeWUsrFormSave
+### OnWUsrFormDelete
+### OnWUsrFormPrerender
+
+### OnWUsrFormRender
+Runs when the Web user's edit form is displayed
+```
+manager/actions/mutate_web_user.dynamic.php
+```
+Returns:
+```
+id - User Id
+```
+### OnWUsrFormSave
diff --git a/en/03_Developers/02_Elements/05_Plugins/index.md b/en/03_Developers/02_Elements/05_Plugins/index.md
new file mode 100644
index 00000000..dfb9d7ea
--- /dev/null
+++ b/en/03_Developers/02_Elements/05_Plugins/index.md
@@ -0,0 +1,61 @@
+## What is a plugin
+Plugins are snippets of code that are tied to system events and are executed when that event occurs.
+
+## How plugins work
+When performing almost any action, the system generates events. For example, when a resource is published, the OnDocPublished event occurs, when authorizing, OnManagerLogin occurs, and so on.
+
+Often, add-ons themselves can generate events. For example, the Shopkeeper add-on creates more than a dozen different events, to each of which you can attach your code and add or change the functionality of almost any event that occurs on the site.
+
+**Important:** plugins work both for events inside the administration panel and for events on the front of the site. You can see the full list of events when creating the plugin on the "SYSTEM EVENTS" tab.
+
+## Examples of plugins
+### Word replacement plugin
+This plugin will work before the contents of the resource are shown to the visitor (OnWebPagePrerender) and replace the words from the array with a stub.
+
+```
+$words = array("bad word", "one more"); // words for filtration
+$e = &$modx->Event;
+if($e->name == 'OnWebPagePrerender') { // check if this is the event we need
+ $out = &$modx->documentOutput; // get a link to the content of the resource
+ $out = str_replace($words,"censorship",$out); // replace the words from the array with "stub".
+}
+```
+
+### Plugin to modify the resource tree
+The previous example worked on a custom part of the site. And this plugin will work on the event of the formation of the left menu in the administration panel. It will replace the resource icon with id=3 and create its own context menu for it.
+
+```
+$e = &$modx->Event;
+if($e->name = 'OnManagerNodePrerender'){
+ if($ph['id'] == '3'){
+ $ph['icon'] = "";
+ $ph['icon_folder_open'] = "";
+ $ph['icon_folder_close'] = "";
+ $ph['contextmenu'] = array(
+ 'header1' => array(
+ 'innerText' => "This is a catalogue"
+ ),
+ 'item3' => array(
+ 'innerHTML' => ' Add product',
+ 'title' => 'Child resource',
+ 'id' => 'item3',
+ 'onclick' => "modx.tree.menuHandler(3);"
+ ),
+ 'item2' => array(
+ 'innerHTML' => ' Edit',
+ 'title' => ' Edit',
+ 'id' => 'item2',
+ 'onclick' => "modx.tree.menuHandler(2);"
+ ),
+ 'item12' => array(
+ 'innerHTML' => ' Scan',
+ 'title' => 'Scan',
+ 'id' => 'item12',
+ 'onclick' => "modx.tree.menuHandler(12);",
+ )
+ );
+ }
+}
+$e->output(serialize($ph));
+```
+Often, add-ons give plugins variables to change. As a rule, these variables are described in the documentation for the addendum.
diff --git a/en/03_Develop/01_Elements/05_Modules/10_How_to_create_and_run_a_module_from_within_the_Admin_Interface.md b/en/03_Developers/02_Elements/06_Modules/10_How_to_create_and_run_a_module_from_within_the_Admin_Interface.md
similarity index 100%
rename from en/03_Develop/01_Elements/05_Modules/10_How_to_create_and_run_a_module_from_within_the_Admin_Interface.md
rename to en/03_Developers/02_Elements/06_Modules/10_How_to_create_and_run_a_module_from_within_the_Admin_Interface.md
diff --git a/en/03_Develop/01_Elements/05_Modules/20_Managing_module_dependencies.md b/en/03_Developers/02_Elements/06_Modules/20_Managing_module_dependencies.md
similarity index 100%
rename from en/03_Develop/01_Elements/05_Modules/20_Managing_module_dependencies.md
rename to en/03_Developers/02_Elements/06_Modules/20_Managing_module_dependencies.md
diff --git a/en/03_Develop/01_Elements/05_Modules/30_Setting_up_configuration_parameters.md b/en/03_Developers/02_Elements/06_Modules/30_Setting_up_configuration_parameters.md
similarity index 100%
rename from en/03_Develop/01_Elements/05_Modules/30_Setting_up_configuration_parameters.md
rename to en/03_Developers/02_Elements/06_Modules/30_Setting_up_configuration_parameters.md
diff --git a/en/03_Develop/01_Elements/05_Modules/40_Writing_the_module_code.md b/en/03_Developers/02_Elements/06_Modules/40_Writing_the_module_code.md
similarity index 100%
rename from en/03_Develop/01_Elements/05_Modules/40_Writing_the_module_code.md
rename to en/03_Developers/02_Elements/06_Modules/40_Writing_the_module_code.md
diff --git a/en/03_Develop/01_Elements/05_Modules/index.md b/en/03_Developers/02_Elements/06_Modules/index.md
similarity index 100%
rename from en/03_Develop/01_Elements/05_Modules/index.md
rename to en/03_Developers/02_Elements/06_Modules/index.md
diff --git a/en/03_Developers/02_Elements/07_Template_Variables/01_Basic_Parameters.md b/en/03_Developers/02_Elements/07_Template_Variables/01_Basic_Parameters.md
new file mode 100644
index 00000000..b5f09795
--- /dev/null
+++ b/en/03_Developers/02_Elements/07_Template_Variables/01_Basic_Parameters.md
@@ -0,0 +1,73 @@
+### List of basic parameters is predefined and contains basic information about the document.
+
+[*pagetitle*] - document title
+
+[*longtitle*] - extended document title
+
+[*description*] - description of the document
+
+[*introtext*] - document annotation
+
+[*content*] - document content
+
+[*alias*] - document alias
+
+[*link_attributes*] - link attributes
+
+[*id*] - document identifier (number)
+
+[*pub_date*] - date of publication of the documentary
+
+[*unpub_date*] - date of completion of publication
+
+[*createdby*] - Id of the user who created the document
+
+[*createdon*] - Document creation date
+
+[*editedby*] - User ID of the person who edited the document
+
+[*editedon*] - Date of document editing
+
+[*type*] - variant (document, folder or link)
+
+[*contentType*] - content type (e.g. text/html)
+
+[*published*] - is the document published (1|0)
+
+[*parent*] - number (ID) of the parent document
+
+[*isfolder*] - whether the document is a folder (1|0)
+
+[*richtext*] - whether the visual editor is used when editing the document
+
+[*template*] - number (ID) of the template used for the document
+
+[*menuindex*] - serial number of the display in the menu
+
+[*searchable*] - is the document searchable (1|0)
+
+[*cacheable*] - Is the document cached (1|0)
+
+[*deleted*] - Document deleted (1|0)
+
+[*deletedon*] - Returns the date of deletion of the document (in seconds from January 1, 1970)
+
+[*deletedby*] - User ID of the person who deleted the document
+
+[*menutitle*] - The title of the menu. If not in use, the title of the document
+
+[*donthit*] - Tracking of the number of visits disabled (1|0)
+
+[*haskeywords*] - The document contains keywords (1|0)
+
+[*hasmetatags*] - The document has meta tags (1|0)
+
+[*privateweb*] - The document is included in the private group of user documents (1|0)
+
+[*privatemgr*] - The document is included in the private group of management documents (1|0)
+
+[*content_dispo*] - Content delivery option (1 - to display | 0 - for download)
+
+[*hidemenu*] - Document does not appear in the menu (1|0)
+
+[*alias_visible*] - The document participates in the CNC when using nested CNC (1|0)
diff --git a/en/03_Developers/02_Elements/07_Template_Variables/02_System_Settings.md b/en/03_Developers/02_Elements/07_Template_Variables/02_System_Settings.md
new file mode 100644
index 00000000..9a8fdb83
--- /dev/null
+++ b/en/03_Developers/02_Elements/07_Template_Variables/02_System_Settings.md
@@ -0,0 +1,22 @@
+### Options that display system data
+
+[^qt^] - time for database queries
+
+[^q^] - database queries
+
+[^p^] - time for PHP scripts to run
+
+[^t^] - total time to generate the page
+
+[^s^] - content source (base or cache)
+
+[^m^] - amount of memory consumed
+
+#### Example:
+```
+Memory : [^m^],
+MySQL: [^qt^], [^q^] request(s),
+PHP: [^p^],
+Total time: [^t^],
+Document from [^s^].
+```
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/20_@_CHUNK.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/20_@_CHUNK.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/20_@_CHUNK.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/20_@_CHUNK.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/30_@_DIRECTORY.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/30_@_DIRECTORY.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/30_@_DIRECTORY.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/30_@_DIRECTORY.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/40_@_DOCUMENT.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/40_@_DOCUMENT.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/40_@_DOCUMENT.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/40_@_DOCUMENT.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/50_@_EVAL.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/50_@_EVAL.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/50_@_EVAL.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/50_@_EVAL.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/60_@_FILE.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/60_@_FILE.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/60_@_FILE.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/60_@_FILE.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/70_@_INHERIT.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/70_@_INHERIT.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/70_@_INHERIT.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/70_@_INHERIT.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/80_@_SELECT.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/80_@_SELECT.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/80_@_SELECT.md
rename to en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/80_@_SELECT.md
diff --git a/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/index.md b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/index.md
new file mode 100644
index 00000000..d534fc7d
--- /dev/null
+++ b/en/03_Developers/02_Elements/07_Template_Variables/10_@_Bindings/index.md
@@ -0,0 +1,34 @@
+In the context to Template Variables, a Data Source is the location of the information to be displayed. A Data source can come from any of the following sources:
+
+*an externally generated file that is sent via FTP to the server
+*a Database table accessible to Evo
+*a Document in the document tree
+*a Chunk in the Admin Interface
+*the result of an evaluated PHP script
+
+These Data Sources can be tied (or "bound") to a Template Variable for formatting and displaying in document. In addition, the bound data in the TVs can be almost effortlessly formatted via the Display Controls within the TV system for some truly stunning results. The format for using the five types of data source bindings available to all template variables follows:
+```
+@FILE file_path
+@DOCUMENT document_id
+@CHUNK chunk_name
+@SELECT sql_query
+@EVAL php_code
+@DIRECTORY _path_to_folder
+
+```
+These five "@" commands or bindings will allow you to quickly and easily attach your template variables to virtually any database system available.
+
+The value returned from the data source can either be a string value (including numbers, dates, etc), an array or a recordset. The value returned is dependent on the type of binding used. Some display controls will attempt to either convert the returned value into a string or an array.
+
+For example, controls that accept string values such as a radio button group or select list will attempt to convert a record set (rows and columns) into the following format:
+
+```
+col1row1Value==col2row1Value||col1row2Value==col2row2Value,…
+```
+Please note that @ bindings will work only when used inside "Input Option Values" or "Default Value" fields (indicated by the database icon next to them).
+
+
+
+When placing @ bindings inside the "Input Option Values" field, they are used to format input options only when editing document within the Admin Interface, for example to create a drop-down list of Cities or Countries.
+
+When placing @ bindings inside the "Default Value" field the returned value is used to render to the final web page. This makes it simple to build complex forms for data input on the web very quickly.
\ No newline at end of file
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/20_Creating_a_Template_Variable.md b/en/03_Developers/02_Elements/07_Template_Variables/20_Creating_a_Template_Variable.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/20_Creating_a_Template_Variable.md
rename to en/03_Developers/02_Elements/07_Template_Variables/20_Creating_a_Template_Variable.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/30_What_are_Template_Variables.md b/en/03_Developers/02_Elements/07_Template_Variables/30_What_are_Template_Variables.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/30_What_are_Template_Variables.md
rename to en/03_Developers/02_Elements/07_Template_Variables/30_What_are_Template_Variables.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/10_What_are_Widgets.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/10_What_are_Widgets.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/10_What_are_Widgets.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/10_What_are_Widgets.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/20_DataGrid_Widget.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/20_DataGrid_Widget.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/20_DataGrid_Widget.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/20_DataGrid_Widget.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/30_Hyperlink_Widget.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/30_Hyperlink_Widget.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/30_Hyperlink_Widget.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/30_Hyperlink_Widget.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/40_Misc._Widget.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/40_Misc._Widget.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/40_Misc._Widget.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/40_Misc._Widget.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/50_RichTextBox_Widget.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/50_RichTextBox_Widget.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/50_RichTextBox_Widget.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/50_RichTextBox_Widget.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/60_Viewport_Widget.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/60_Viewport_Widget.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/60_Viewport_Widget.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/60_Viewport_Widget.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/index.md b/en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/index.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/index.md
rename to en/03_Developers/02_Elements/07_Template_Variables/40_Widgets/index.md
diff --git a/en/03_Developers/02_Elements/07_Template_Variables/index.md b/en/03_Developers/02_Elements/07_Template_Variables/index.md
new file mode 100644
index 00000000..84332967
--- /dev/null
+++ b/en/03_Developers/02_Elements/07_Template_Variables/index.md
@@ -0,0 +1,151 @@
+TV parameter in MODx is an element (field) that contains certain information for the current page.
+
+TV parameters allow you to add additional information to the document, which can then be used along with the main parameters. They have different types and depending on this, their behavior and appearance change. The parameter value can be displayed on the page or passed to a snippet for further processing.
+
+#### What is the TV parameter for?
+For orderly and logical storage of information on the site. Let's say there are 2 types of materials on the site - products and news. For a product, you can create parameters, in one of which the price will be stored, and in the other a photo. And for news, tags and a story.
+
+Often, TV parameters are used to create SEO fields like meta description, keywords, etc. Parameters are tied to templates, and this allows you to set completely different fields depending on the type of material.
+
+### Example parameter:
+[\*pagetitle\*] - call a parameter in the template that will return the page title. It is most commonly used to output title:
+```
+
+[*pagetitle*]
+
+```
+All parameters can be divided into basic, system and user.
+
+### Main parameters:
+The list of basic parameters is predefined in the cms and contains basic information about the document. Most of them can be seen when creating and editing any document.
+
+The most used are:
+- **[\*pagetitle\*]** - document title
+- **[\*longtitle\*]** - extended document title
+- **[\*description\*]** - description of the document
+- **[\*introtext\*]** - document annotation
+- **[\*content\*]** - document content
+- **[\*id\*]** - document identifier (number)
+- **[\*parent\*]** - number (ID) of the parent document
+- **[\*pub_date\*]** - date of publication of the documentary
+- **[\*unpub_date\*]** - date of completion of publication
+- **[\*createdby\*]** - Id of the user who created the document
+- **[\*createdon\*]** - Document creation date
+- **[\~identifier\~]** - URL of the document by the specified identifier
+It is worth mentioning separately that the parameters can be combined. This is especially true for creating links to different documents using the **[\~identifier\~]** parameter. You can also set a parameter as an identifier.
+
+**[\~[\*id\*]\~]** -Display a link to the current document.
+
+**[\~[\*parent\*]\~]** - Display a link to the parent of the current document.
+
+#### Additional
+- **[\*alias\*]** - document alias
+- **[\*editedby\*]** - id of the user who edited the document
+- **[\*editedon\*]** - date of document editing
+- **[\*type\*]** - resource type (document, folder or link)
+- **[\*contentType\*]** - content type (e.g. text/html)
+- **[\*published\*]** - is the document published (1|0)
+- **[\*isfolder\*]** - whether the document is a folder (1|0)
+- **[\*richtext\*]** - whether the visual editor is used when editing the document
+- **[\*template\*]** - number (ID) of the template used for the document
+- **[\*menuindex\*]** - serial number of the display in the menu
+- **[\*searchable\*]** - is the document searchable (1|0)
+- **[\*cacheable\*]** - Is the document cached? (1|0)
+- **[\*deleted\*]** - document deleted (1|0)
+- **[\*deletedby\*]** - id of the user who deleted the document
+- **[\*menutitle\*]** - menu title.
+- **[\*donthit\*]** - Tracking the number of visits is disabled (1|0)
+- **[\*haskeywords\*]** - The document contains keywords (1|0)
+- **[\*hasmetatags\*]** - The document has meta tags (1|0)
+- **[\*privateweb\*]** - The document is part of a private group of user documents (1|0)
+- **[\*privatemgr\*]** - The document is part of a private group of management documents (1|0)
+- **[\*content_dispo\*]** - Content delivery option (1 - to display | 0 - to download)
+- **[\*hidemenu\*]** - The document does not appear in the menu (1|0)
+- **[\*alias_visible\*]** - Is the document involved in URL generation(1|0)
+
+### System Parameters
+Settings that display system data
+
+- **[^qt^]** - time to query the database
+- **[^q^]** - database queries
+- **[^p^]** - time for PHP scripts to run
+- **[^t^]** - total time to generate the page
+- **[^s^]** - content source (database or cache)
+- **[^m^]** - amount of memory consumed
+
+#### Example:
+```
+Memory : [^m^],
+MySQL: [^qt^], [^q^] request(s),
+PHP: [^p^],
+Total time: [^t^],
+Document from [^s^].
+```
+
+### Custom TV Settings
+Custom parameters are created manually by the programmer, based on the experience and structure of the site.
+
+#### Create and edit a TV setting
+To create a parameter, click on the link "Items - Settings (TV)" and select "New parameter (TV)".
+
+(Picture should be here!)
+
+#### Assign fields
+- **Parameter name** - used to call the TV parameter. You can use both English and Russian, as well as a hyphen and an underscore. You can't use a space!
+- **Title** - used to name the TV parameter in the document when editing.
+- **Description** - used for more advanced information about the parameter in the document when editing, as well as in the general list of TV parameters.
+- **Input type** - defines the type of information received. Depending on the selected type, the interface changes. For more information, see "Input Types".
+- **Default value** - Specifies the default value of the TV parameter when editing a document.
+- **Possible values** - used in some types of input (for example, Radio Options, Check Box) to provide choices. For more details, see Determining TV Parameter Values.
+- **Visual component** - determines the option of displaying the TV-parameter on the page of the site. For more details, see TV Parameter View.
+- **Order in the list** - determines the order of the TV parameter in the document.
+- **"Lock" in the parameter name** - if you enable the checkbox, then no one except administrators will be able to edit this TV-parameter.
+
+#### Input Types
+- **Text** - input field. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **Raw Text, Raw Textarea** - outdated and not recommended for use. Instead, we recommend using Textarea and Textarea (Mini).
+
+- **Textarea and Textarea (Mini)** - text field. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **RichText** - a field with a visual editor. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **DropDown List Menu** - drop-down list. The Possible Values field specifies a list of values and is defined in a special format. For more details, see Determining TV Parameter Values. The default value determines the selected item when you first edit it.
+
+- **Listbox (Single-Select) and Listbox (Multi-Select)** - a list of multiple selections. Single-Select and Multi-Select differ only in that in the first option you can select one value, and in the second several (using Ctrl). The Possible Values field specifies the final list of values and is defined in a special format. For more details, see Determining TV Parameter Values. The default value determines the selected item when you first edit it.
+
+- **Radio Options** - switches. The Possible Values field specifies a finite list of values and is defined in a special format. For more details, see Determining TV Parameter Values. The default value determines the selected item when you first edit it.
+
+- **Check Box** - checkboxes. The Possible Values field specifies a finite list of values and is defined in a special format. For more details, see Determining TV Parameter Values. The default value determines the selected item when you first edit it.
+
+- **Image** - image. When you click the "Insert" button, a file manager opens, which allows you to select the desired image and upload it. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **File** - file. When you click the "Insert" button, a file manager opens, which allows you to select the necessary file and download it. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **URL** - link. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **Email** - e-mail. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **Number** - number. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+- **Date** - date. The first button invokes a calendar that you can use to select a date. The second button erases the date. The possible values are not used. The default value is automatically written to the field the first time you edit it.
+
+#### Determining TV Parameter Values
+The Possible Values setting defines options for parameters such as DropDown List Menu, Listbox, Check Box, and Radio Options.
+
+The format for determining the values is as follows:
+```
+parameter1==value1|| parameter2==value2|| parameter3==value3
+```
+The separator "==" is used to separate the displayed and actual value, and the separator "||" separates the values from each other.
+
+If the actual and displayed values match, you can use a simplified version of the record:
+```
+value1|| value2|| value3
+```
+#### Example
+Input Type: DropDown List Menu Possible values:
+```
+Red==#FF0000|| Green==#00FF00|| Blue==#0000FF
+```
+When the user edits the document, he will see a drop-down list with the values "Red, Green, Blue". When you select a value and save the document to the database, one of the values will be saved - #FF0000, #00FF00 or #0000FF.
diff --git a/en/03_Develop/01_Elements/08_Modifiers/10_@_Modifiers.md b/en/03_Developers/02_Elements/08_Modifiers/10_@_Modifiers.md
similarity index 100%
rename from en/03_Develop/01_Elements/08_Modifiers/10_@_Modifiers.md
rename to en/03_Developers/02_Elements/08_Modifiers/10_@_Modifiers.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/index.md b/en/03_Developers/02_Elements/08_Modifiers/index.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/40_Widgets/index.md
rename to en/03_Developers/02_Elements/08_Modifiers/index.md
diff --git a/en/03_Developers/02_Elements/09_Tags/10_Resource_Fields.md b/en/03_Developers/02_Elements/09_Tags/10_Resource_Fields.md
new file mode 100644
index 00000000..b527dc11
--- /dev/null
+++ b/en/03_Developers/02_Elements/09_Tags/10_Resource_Fields.md
@@ -0,0 +1,51 @@
+This is a listing of all of the (currently) available document-specific resource fields. Each one is a field in the Evo site_content table. They are accessed with **[*resource-field-name*]** tags. These values can also usually be retrieved from the array.
+
+```
+$modx->documentObject['resource-field-name']
+```
+
+**id** - The document's ID. Can also be obtained with $modx->documentIdentifier.
+**type** - Whether document, folder or weblink.
+**contentType** - The content type, such as text/html.
+**pagetitle** - The title of the page.
+**longtitle** - The longtitle of the page.
+**description** - The description of the page.
+**alias** - The alias of the page. Used in creating Friendly URLs.
+**link_attributes** - The Link Attributes of the page, eg. rel=, target= etc.
+**published** - [0|1] Whether or not the document is published.
+**pub_date**- Date the document is to be published. This is not a "normal" date, and must be processed by a script for meaningful output.
+
+```
+Example: strftime("%d/%m/%y %H:%M:%S", $value)
+```
+
+**unpub_date** - Date the document is to be unpublished. See 'pub_date'.
+**parent** - The ID of the document's parent.
+**isfolder** - [0|1] Whether or not the document is a folder.
+**introtext** - The summary of the document.
+**content** - The content of the document.
+**richtext** - [0|1] Whether or not a RichText Editor is to be used when editing the document.
+**template** - The ID of the template to used for the document.
+**menuindex** - The order in which the document is to be listed in the menu.
+**searchable** - [0|1] Whether or not the document is to be searchable.
+**cacheable** - [0|1] Whether or not the document is to be cached.
+**createdby** - The user ID of the creator of the document.
+**createdon** - The date the document was created. See pub_date.
+**editedby** - The ID of the user who last edited the document.
+**editedon** - The date the document was last edited. See pub_date.
+**deleted** - [0|1] Whether or not the document has been deleted (but not yet completely removed from the database by emptying the trash).
+**deletedon** - The date the document was deleted. See pub_date.
+**deletedby** - The ID of the user who deleted the document.
+**menutitle** - The title to be shown in the menu. If empty, the pagetitle is used.
+**donthit** - [0|1] Disable page hit count for the document.
+**haskeywords** - [0|1] Whether or not the document has links to keywords.
+**hasmetatags** - [0|1] Whether or not the document has links to meta tags
+**privateweb** - [0|1] Whether or not this document has been assigned to a private web document group.
+**privatemgr** - [0|1] Whether or not this document has been assigned to a private admin document group.
+**content_dispo** - [0|1] Whether the document's content-disposition is attachment or inline.
+**hidemenu** - [0|1] Whether or not the document is to be hidden in the menu
+
+http://www.evolution-docs.com/documentation/designing/adding-tags/resource-fields
+need copy this. Done.
+
+Is it the same as this page: https://github.com/BBloke/docs/blob/master/en/03_Developers/02_Elements/06_Template_Variables/index.md
diff --git a/en/03_Develop/01_Elements/07_Tags/index.md b/en/03_Developers/02_Elements/09_Tags/index.md
similarity index 100%
rename from en/03_Develop/01_Elements/07_Tags/index.md
rename to en/03_Developers/02_Elements/09_Tags/index.md
diff --git a/en/03_Developers/02_Elements/10_Predefined_variables.md b/en/03_Developers/02_Elements/10_Predefined_variables.md
new file mode 100644
index 00000000..f95ff287
--- /dev/null
+++ b/en/03_Developers/02_Elements/10_Predefined_variables.md
@@ -0,0 +1,39 @@
+PHP provides all scripts with a large number of predefined variables. These variables contain everything from external data to environment variables, from the text of error messages to the most recently received headers.
+
+Evolution supports calling in templates and chunks to call some of them.
+
+## Example ###
+```
+[!$_GET['username'] !]
+[!$_GET['username']:ifempty=!]
+[!$_SERVER['REQUEST_TIME']:dateFormat='d.m.Y'!]
+[!$_SERVER['HTTP_USER_AGENT']:find='Chrome':then='Chrome':else='Other'!]
+
$_SERVER:
+
+ [!$_SERVER!]
+
+
+
$_POST:
+
+ [!$_POST!]
+
+
+
$_GET:
+
+ [!$_GET!]
+
+
$_COOKIE:
+
+ [!$_COOKIE!]
+
+
+
$_REQUEST:
+
+ [!$_REQUEST!]
+
+
+
$_SESSION:
+
+ [!$_SESSION!]
+
+```
diff --git a/en/03_Developers/02_Elements/index.md b/en/03_Developers/02_Elements/index.md
new file mode 100644
index 00000000..2a70a5c1
--- /dev/null
+++ b/en/03_Developers/02_Elements/index.md
@@ -0,0 +1,118 @@
+Anyone who starts to understand Evolution will come across new terms.
+Here we will note small points that you can periodically spy on.
+
+## Terminology ##
+
+**Template** - Contains the general layout of the page with structure and design. It also defines where to display dynamic content. You can choose your own template for each document.
+
+**Parameters (TV)** - Additional parameters that are connected to the template. Parameters can be of different types (text, link, file, date, number, etc.). For more details on types, see the following articles.
+
+**Chunk** - Chunk is a small template that can be used both simply for displaying some content (phone on all pages), and for processing (template of the sent eForm letter, template of the directory displayed by Ditto, etc.). Thus, the kind (presentation) of information is separated from the place of processing and is easily controlled.
+
+**Snippet** - Snippet is a code for processing information. The received information is analyzed (for example, the user's message) and the result is provided (for example, the message is sent by mail, and the user is shown a message about the result). Snippets form menus (Wayfinder), output lists of articles with pagination (Ditto), build forms (eForm). Chunks are used for withdrawal.
+
+**Plugin** - A plugin is a code that runs when an event occurs. For example, it highlights search words (Search Highlighting) when navigating from a search page. There are many events and their consideration is worth a separate article.
+
+## Special tags ##
+
+Special tags are used to display dynamic data.
+
+### Systemic ###
+
+- [(site_name)] - site name
+- [(base_url)] or [(site_url)] - site address (https://evo.im)
+- [(modx_charset)] - used encoding
+- [(lang_code)] - the code of the language used on the site
+- [^m^] - the amount of used memory
+- [^qt^] - time for database queries
+- [^q^] - the number of requests to the database
+- [^p^] - time spent for PHP scripts
+- [^t^] - total time to generate the page
+- [^s^] - content source (database or cache)
+
+### Standard ###
+
+- [\*pagetitle\*] - document title
+- [\*longtitle\*] - расширенный заголовок документа
+- [\*description\*] - описание документа
+- [\*introtext\*] - аннотация документа
+- [\*content\*] - содержимое документа
+- [\*alias\*] - псевдоним документа
+- [\*id\*] - идентификатор (номер) документа
+- [\*pub_date\*] - дата публикации дкоумента
+- [\*unpub_date\*] - дата завершения публикации
+- [\*createdby\*] - Идентификатор пользователя создавшего документ
+- [\*createdon\*] - Дата создания документа
+- [\*editedby\*] - Идентификатор пользователя редактировавшего документ
+- [\*editedon\*] - Дата редактирования документа
+- [~идентификатор~] - URL указанного документа
+
+### Additional ###
+
+- [\*type\*] - variant (document, folder or link)
+- [\*contentType\*] - content type (for example, text / html)
+- [\*published\*] - whether the document has been published (1 | 0)
+- [\*parent\*] - number (ID) of the parent document
+- [\*isfolder\*] - is the document a folder (1 | 0)
+- [\*richtext\*] - whether a visual editor is used when editing a document
+- [\*template\*] - number (ID) of the used template for the document
+- [\*menuindex\*] - ordernumber of the display in the menu
+- [\*searchable\*] - is the document searchable (1 | 0)
+- [\*cacheable\*] - Whether the document is cached (1 | 0)
+- [\*deleted\*] - Document deleted (1 | 0)
+- [\*deletedby\*] - ID of the user who deleted the document
+- [\*menutitle\*] - Menu title. If not used, then the title of the document
+- [\*donthit\*] - Tracking the number of visits is disabled (1 | 0)
+- [\*haskeywords\*] - The document contains keywords (1 | 0)
+- [\*hasmetatags\*] - Document has metatags (1 | 0)
+- [\*privateweb\*] - The document belongs to the private group of user documents (1 | 0)
+- [\*privatemgr\*] - The document is included in the private group of managerial documents (1 | 0)
+- [\*content_dispo\*] - Option for serving content (1 - for display | 0 - for download)
+- [\*hidemenu\*] - The document is not displayed in the menu (1 | 0)
+
+## TV parameters, snippets and chunks ##
+```
+[\*TVname\*] - prints the value of the parameter in the document.
+```
+```
+{{ChunkName}} - returns the contents of the chunk.
+```
+```
+[[SnippetName]] - returns the result of the snippet.
+```
+You can pass additional parameters to the snippet, listing them when called. Suppose, if we want to get the id of the current document and process it in a snippet, then the call may look like this:
+```
+[[snippetname?docId=`[+id+]`]]
+```
+[+VariableName+] - placeholder - found in chunks that are used to process the results of snippets. After processing, values are inserted instead. In the example above, you can see how we have substituted the system placeholder [+id+] in the docId parameter for the snippet, in which the id of the current document will be. You can create placeholders yourself.
+
+** Nuances **
+
+There are actually two options for calling a snippet:
+1. [[SnippetName]] - cached snippet call
+2. [!SnippetName!] - noncacheable snippet call
+
+**Where to use**
+
+Everything is very harmoniously used with each other. In templates, you can use TV parameters, snippets and chunks. In chunks, you can call snippets, TV parameters and other chunks. In snippets, you can call anything at all, but through PHP. Ultimately, you will receive the final result of processing all snippets/chunks/TV parameters.
+
+### Пример шаблона ###
+```html
+
+
+{{head_tags}}
+
+ [*content*]
+
+
+```
+where head_tags is a chunk with the following content:
+
+```html
+
+
+
+ [*pagetitle*] / [(site_name)]
+
+```
+And in the field [\*content\*] will be displayed the content of the page, set from the admin panel. Everything else is based on this information.
diff --git a/en/03_Develop/02_API/01_addEventListener.md b/en/03_Developers/03_API/01_addEventListener.md
similarity index 81%
rename from en/03_Develop/02_API/01_addEventListener.md
rename to en/03_Developers/03_API/01_addEventListener.md
index 199219c4..b62a4527 100644
--- a/en/03_Develop/02_API/01_addEventListener.md
+++ b/en/03_Developers/03_API/01_addEventListener.md
@@ -1,4 +1,4 @@
-###Add an event handler for the plugin
+### Add an event handler for the plugin
Note: This is used only for the current execution cycle.
diff --git a/en/03_Developers/03_API/02_changeWebUserPassword.md b/en/03_Developers/03_API/02_changeWebUserPassword.md
new file mode 100644
index 00000000..936ba81e
--- /dev/null
+++ b/en/03_Developers/03_API/02_changeWebUserPassword.md
@@ -0,0 +1,17 @@
+### Changing the password for the WEB-user
+Note: If errors occur, the method returns error information in English.
+
+mixed changeWebUserPassword(string $oldPwd, string $newPwd);
+
+**$oldPwd** - old password
+**$newPwd** - new password
+
+#### Example:
+
+````php
+$txt = $modx->changeWebUserPassword('oldpassword','newpassword');
+print_r($txt);
+// result: true
+````
+
+
diff --git a/en/03_Developers/03_API/03_clearCache.md b/en/03_Developers/03_API/03_clearCache.md
new file mode 100644
index 00000000..4c97adb6
--- /dev/null
+++ b/en/03_Developers/03_API/03_clearCache.md
@@ -0,0 +1,29 @@
+### Clear the site cache
+
+boolean clearCache([string $type]);
+
+$type - use with a value of full if you need to clear the entire cache taking into account index files
+
+#### Example
+```php
+// Clears the site cache.
+$modx->clearCache();
+
+Clears the site cache based on index files (available since version 1.0.13).
+$modx->clearCache('full');
+```
+
+Note: Running a function without the 'type' parameter does not clear the entire cache. When you use this feature, the files that contain the cache of all documents are deleted, but the index cache file is not modified. Because of this, documents that were created programmatically may not be available on the site.
+
+### Full cache clear for < versions 1.0.13
+```php
+function clearCache() {
+ global $modx;
+ $modx->clearCache();
+ include_once MODX_MANAGER_PATH . 'processors/cache_sync.class.processor.php';
+ $sync = new synccache();
+ $sync->setCachepath(MODX_BASE_PATH . "assets/cache/");
+ $sync->setReport(false);
+ $sync->emptyCache();
+}
+```
\ No newline at end of file
diff --git a/en/03_Develop/02_API/04_getActiveChildren.md b/en/03_Developers/03_API/04_getActiveChildren.md
similarity index 100%
rename from en/03_Develop/02_API/04_getActiveChildren.md
rename to en/03_Developers/03_API/04_getActiveChildren.md
diff --git a/en/03_Develop/02_API/05_getAllChildren.md b/en/03_Developers/03_API/05_getAllChildren.md
similarity index 100%
rename from en/03_Develop/02_API/05_getAllChildren.md
rename to en/03_Developers/03_API/05_getAllChildren.md
diff --git a/en/03_Develop/02_API/06_getCachePath.md b/en/03_Developers/03_API/06_getCachePath.md
similarity index 100%
rename from en/03_Develop/02_API/06_getCachePath.md
rename to en/03_Developers/03_API/06_getCachePath.md
diff --git a/en/03_Develop/02_API/07_getChildIds.md b/en/03_Developers/03_API/07_getChildIds.md
similarity index 100%
rename from en/03_Develop/02_API/07_getChildIds.md
rename to en/03_Developers/03_API/07_getChildIds.md
diff --git a/en/03_Develop/02_API/08_getChunk.md b/en/03_Developers/03_API/08_getChunk.md
similarity index 100%
rename from en/03_Develop/02_API/08_getChunk.md
rename to en/03_Developers/03_API/08_getChunk.md
diff --git a/en/03_Develop/02_API/09_getConfig.md b/en/03_Developers/03_API/09_getConfig.md
similarity index 100%
rename from en/03_Develop/02_API/09_getConfig.md
rename to en/03_Developers/03_API/09_getConfig.md
diff --git a/en/03_Develop/02_API/10_getDocument.md b/en/03_Developers/03_API/10_getDocument.md
similarity index 100%
rename from en/03_Develop/02_API/10_getDocument.md
rename to en/03_Developers/03_API/10_getDocument.md
diff --git a/en/03_Develop/02_API/11_getDocumentChildren.md b/en/03_Developers/03_API/11_getDocumentChildren.md
similarity index 100%
rename from en/03_Develop/02_API/11_getDocumentChildren.md
rename to en/03_Developers/03_API/11_getDocumentChildren.md
diff --git a/en/03_Develop/02_API/12_getDocumentChildrenTVarOutput.md b/en/03_Developers/03_API/12_getDocumentChildrenTVarOutput.md
similarity index 100%
rename from en/03_Develop/02_API/12_getDocumentChildrenTVarOutput.md
rename to en/03_Developers/03_API/12_getDocumentChildrenTVarOutput.md
diff --git a/en/03_Develop/02_API/13_getDocumentChildrenTVars.md b/en/03_Developers/03_API/13_getDocumentChildrenTVars.md
similarity index 100%
rename from en/03_Develop/02_API/13_getDocumentChildrenTVars.md
rename to en/03_Developers/03_API/13_getDocumentChildrenTVars.md
diff --git a/en/03_Develop/02_API/14_getDocuments.md b/en/03_Developers/03_API/14_getDocuments.md
similarity index 100%
rename from en/03_Develop/02_API/14_getDocuments.md
rename to en/03_Developers/03_API/14_getDocuments.md
diff --git a/en/03_Develop/02_API/15_getFullTableName.md b/en/03_Developers/03_API/15_getFullTableName.md
similarity index 100%
rename from en/03_Develop/02_API/15_getFullTableName.md
rename to en/03_Developers/03_API/15_getFullTableName.md
diff --git a/en/03_Develop/02_API/16_getKeywords.md b/en/03_Developers/03_API/16_getKeywords.md
similarity index 100%
rename from en/03_Develop/02_API/16_getKeywords.md
rename to en/03_Developers/03_API/16_getKeywords.md
diff --git a/en/03_Develop/02_API/17_getLoginUserID.md b/en/03_Developers/03_API/17_getLoginUserID.md
similarity index 100%
rename from en/03_Develop/02_API/17_getLoginUserID.md
rename to en/03_Developers/03_API/17_getLoginUserID.md
diff --git a/en/03_Develop/02_API/18_getLoginUserName.md b/en/03_Developers/03_API/18_getLoginUserName.md
similarity index 100%
rename from en/03_Develop/02_API/18_getLoginUserName.md
rename to en/03_Developers/03_API/18_getLoginUserName.md
diff --git a/en/03_Develop/02_API/19_getLoginUserType.md b/en/03_Developers/03_API/19_getLoginUserType.md
similarity index 100%
rename from en/03_Develop/02_API/19_getLoginUserType.md
rename to en/03_Developers/03_API/19_getLoginUserType.md
diff --git a/en/03_Develop/02_API/20_getManagerPath.md b/en/03_Developers/03_API/20_getManagerPath.md
similarity index 100%
rename from en/03_Develop/02_API/20_getManagerPath.md
rename to en/03_Developers/03_API/20_getManagerPath.md
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/21_getMETATags.md" b/en/03_Developers/03_API/21_getMETATags.md
similarity index 94%
rename from "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/21_getMETATags.md"
rename to en/03_Developers/03_API/21_getMETATags.md
index 58c92d7b..8852f363 100644
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/21_getMETATags.md"
+++ b/en/03_Developers/03_API/21_getMETATags.md
@@ -11,7 +11,7 @@ array getMETATags(int $id);
Array (
[Автор] => Array (
[tag] => author
- [tagvalue] => modx-cms.ru
+ [tagvalue] => evo.im
[http_equiv] => 0
)
)
diff --git a/en/03_Develop/02_API/22_getPageInfo.md b/en/03_Developers/03_API/22_getPageInfo.md
similarity index 100%
rename from en/03_Develop/02_API/22_getPageInfo.md
rename to en/03_Developers/03_API/22_getPageInfo.md
diff --git a/en/03_Develop/02_API/23_getParent.md b/en/03_Developers/03_API/23_getParent.md
similarity index 100%
rename from en/03_Develop/02_API/23_getParent.md
rename to en/03_Developers/03_API/23_getParent.md
diff --git a/en/03_Develop/02_API/24_getParentIds.md b/en/03_Developers/03_API/24_getParentIds.md
similarity index 100%
rename from en/03_Develop/02_API/24_getParentIds.md
rename to en/03_Developers/03_API/24_getParentIds.md
diff --git a/en/03_Develop/02_API/25_getPlaceholder.md b/en/03_Developers/03_API/25_getPlaceholder.md
similarity index 100%
rename from en/03_Develop/02_API/25_getPlaceholder.md
rename to en/03_Developers/03_API/25_getPlaceholder.md
diff --git a/en/03_Develop/02_API/26_getSnippetId.md b/en/03_Developers/03_API/26_getSnippetId.md
similarity index 100%
rename from en/03_Develop/02_API/26_getSnippetId.md
rename to en/03_Developers/03_API/26_getSnippetId.md
diff --git a/en/03_Develop/02_API/27_getSnippetName.md b/en/03_Developers/03_API/27_getSnippetName.md
similarity index 100%
rename from en/03_Develop/02_API/27_getSnippetName.md
rename to en/03_Developers/03_API/27_getSnippetName.md
diff --git a/en/03_Develop/02_API/28_getTemplateVar.md b/en/03_Developers/03_API/28_getTemplateVar.md
similarity index 100%
rename from en/03_Develop/02_API/28_getTemplateVar.md
rename to en/03_Developers/03_API/28_getTemplateVar.md
diff --git a/en/03_Develop/02_API/29_getTemplateVarOutput.md b/en/03_Developers/03_API/29_getTemplateVarOutput.md
similarity index 100%
rename from en/03_Develop/02_API/29_getTemplateVarOutput.md
rename to en/03_Developers/03_API/29_getTemplateVarOutput.md
diff --git a/en/03_Develop/02_API/30_getTemplateVars.md b/en/03_Developers/03_API/30_getTemplateVars.md
similarity index 100%
rename from en/03_Develop/02_API/30_getTemplateVars.md
rename to en/03_Developers/03_API/30_getTemplateVars.md
diff --git a/en/03_Develop/02_API/31_getUserData.md b/en/03_Developers/03_API/31_getUserData.md
similarity index 100%
rename from en/03_Develop/02_API/31_getUserData.md
rename to en/03_Developers/03_API/31_getUserData.md
diff --git a/en/03_Develop/02_API/32_getUserDocGroups.md b/en/03_Developers/03_API/32_getUserDocGroups.md
similarity index 100%
rename from en/03_Develop/02_API/32_getUserDocGroups.md
rename to en/03_Developers/03_API/32_getUserDocGroups.md
diff --git a/en/03_Develop/02_API/33_getUserInfo.md b/en/03_Developers/03_API/33_getUserInfo.md
similarity index 100%
rename from en/03_Develop/02_API/33_getUserInfo.md
rename to en/03_Developers/03_API/33_getUserInfo.md
diff --git a/en/03_Develop/02_API/34_getVersionData.md b/en/03_Developers/03_API/34_getVersionData.md
similarity index 100%
rename from en/03_Develop/02_API/34_getVersionData.md
rename to en/03_Developers/03_API/34_getVersionData.md
diff --git a/en/03_Develop/02_API/35_getWebUserInfo.md b/en/03_Developers/03_API/35_getWebUserInfo.md
similarity index 100%
rename from en/03_Develop/02_API/35_getWebUserInfo.md
rename to en/03_Developers/03_API/35_getWebUserInfo.md
diff --git a/en/03_Develop/02_API/36_hasPermission.md b/en/03_Developers/03_API/36_hasPermission.md
similarity index 100%
rename from en/03_Develop/02_API/36_hasPermission.md
rename to en/03_Developers/03_API/36_hasPermission.md
diff --git a/en/03_Develop/02_API/37_insideManager.md b/en/03_Developers/03_API/37_insideManager.md
similarity index 100%
rename from en/03_Develop/02_API/37_insideManager.md
rename to en/03_Developers/03_API/37_insideManager.md
diff --git a/en/03_Develop/02_API/38_invokeEvent.md b/en/03_Developers/03_API/38_invokeEvent.md
similarity index 100%
rename from en/03_Develop/02_API/38_invokeEvent.md
rename to en/03_Developers/03_API/38_invokeEvent.md
diff --git a/en/03_Develop/02_API/39_isBackend.md b/en/03_Developers/03_API/39_isBackend.md
similarity index 100%
rename from en/03_Develop/02_API/39_isBackend.md
rename to en/03_Developers/03_API/39_isBackend.md
diff --git a/en/03_Develop/02_API/40_isFrontend.md b/en/03_Developers/03_API/40_isFrontend.md
similarity index 100%
rename from en/03_Develop/02_API/40_isFrontend.md
rename to en/03_Developers/03_API/40_isFrontend.md
diff --git a/en/03_Develop/02_API/41_isMemberOfWebGroup.md b/en/03_Developers/03_API/41_isMemberOfWebGroup.md
similarity index 100%
rename from en/03_Develop/02_API/41_isMemberOfWebGroup.md
rename to en/03_Developers/03_API/41_isMemberOfWebGroup.md
diff --git a/en/03_Develop/02_API/42_logEvent.md b/en/03_Developers/03_API/42_logEvent.md
similarity index 100%
rename from en/03_Develop/02_API/42_logEvent.md
rename to en/03_Developers/03_API/42_logEvent.md
diff --git a/en/03_Develop/02_API/43_makeList.md b/en/03_Developers/03_API/43_makeList.md
similarity index 100%
rename from en/03_Develop/02_API/43_makeList.md
rename to en/03_Developers/03_API/43_makeList.md
diff --git a/en/03_Develop/02_API/44_makeUrl.md b/en/03_Developers/03_API/44_makeUrl.md
similarity index 100%
rename from en/03_Develop/02_API/44_makeUrl.md
rename to en/03_Developers/03_API/44_makeUrl.md
diff --git a/en/03_Develop/02_API/45_mapPath.md b/en/03_Developers/03_API/45_mapPath.md
similarity index 100%
rename from en/03_Develop/02_API/45_mapPath.md
rename to en/03_Developers/03_API/45_mapPath.md
diff --git a/en/03_Develop/02_API/46_parseText.md b/en/03_Developers/03_API/46_parseText.md
similarity index 100%
rename from en/03_Develop/02_API/46_parseText.md
rename to en/03_Developers/03_API/46_parseText.md
diff --git a/en/03_Develop/02_API/47_parseProperties.md b/en/03_Developers/03_API/47_parseProperties.md
similarity index 100%
rename from en/03_Develop/02_API/47_parseProperties.md
rename to en/03_Developers/03_API/47_parseProperties.md
diff --git a/en/03_Develop/02_API/48_putChunk.md b/en/03_Developers/03_API/48_putChunk.md
similarity index 100%
rename from en/03_Develop/02_API/48_putChunk.md
rename to en/03_Developers/03_API/48_putChunk.md
diff --git a/en/03_Develop/02_API/49_regClientCSS.md b/en/03_Developers/03_API/49_regClientCSS.md
similarity index 100%
rename from en/03_Develop/02_API/49_regClientCSS.md
rename to en/03_Developers/03_API/49_regClientCSS.md
diff --git a/en/03_Develop/02_API/50_regClientHTMLBlock.md b/en/03_Developers/03_API/50_regClientHTMLBlock.md
similarity index 100%
rename from en/03_Develop/02_API/50_regClientHTMLBlock.md
rename to en/03_Developers/03_API/50_regClientHTMLBlock.md
diff --git a/en/03_Develop/02_API/51_regClientScript.md b/en/03_Developers/03_API/51_regClientScript.md
similarity index 100%
rename from en/03_Develop/02_API/51_regClientScript.md
rename to en/03_Developers/03_API/51_regClientScript.md
diff --git a/en/03_Develop/02_API/52_regClientStartupHTMLBlock.md b/en/03_Developers/03_API/52_regClientStartupHTMLBlock.md
similarity index 100%
rename from en/03_Develop/02_API/52_regClientStartupHTMLBlock.md
rename to en/03_Developers/03_API/52_regClientStartupHTMLBlock.md
diff --git a/en/03_Develop/02_API/53_regClientStartupScript.md b/en/03_Developers/03_API/53_regClientStartupScript.md
similarity index 100%
rename from en/03_Develop/02_API/53_regClientStartupScript.md
rename to en/03_Developers/03_API/53_regClientStartupScript.md
diff --git a/en/03_Develop/02_API/54_removeAllEventListener.md b/en/03_Developers/03_API/54_removeAllEventListener.md
similarity index 100%
rename from en/03_Develop/02_API/54_removeAllEventListener.md
rename to en/03_Developers/03_API/54_removeAllEventListener.md
diff --git a/en/03_Develop/02_API/55_removeEventListener.md b/en/03_Developers/03_API/55_removeEventListener.md
similarity index 100%
rename from en/03_Develop/02_API/55_removeEventListener.md
rename to en/03_Developers/03_API/55_removeEventListener.md
diff --git a/en/03_Develop/02_API/56_runSnippet.md b/en/03_Developers/03_API/56_runSnippet.md
similarity index 100%
rename from en/03_Develop/02_API/56_runSnippet.md
rename to en/03_Developers/03_API/56_runSnippet.md
diff --git a/en/03_Develop/02_API/57_sendAlert.md b/en/03_Developers/03_API/57_sendAlert.md
similarity index 100%
rename from en/03_Develop/02_API/57_sendAlert.md
rename to en/03_Developers/03_API/57_sendAlert.md
diff --git a/en/03_Develop/02_API/58_setPlaceholder.md b/en/03_Developers/03_API/58_setPlaceholder.md
similarity index 100%
rename from en/03_Develop/02_API/58_setPlaceholder.md
rename to en/03_Developers/03_API/58_setPlaceholder.md
diff --git a/en/03_Develop/02_API/59_stripTags.md b/en/03_Developers/03_API/59_stripTags.md
similarity index 100%
rename from en/03_Develop/02_API/59_stripTags.md
rename to en/03_Developers/03_API/59_stripTags.md
diff --git a/en/03_Develop/02_API/60_toPlaceholder.md b/en/03_Developers/03_API/60_toPlaceholder.md
similarity index 100%
rename from en/03_Develop/02_API/60_toPlaceholder.md
rename to en/03_Developers/03_API/60_toPlaceholder.md
diff --git a/en/03_Develop/02_API/61_toPlaceholders.md b/en/03_Developers/03_API/61_toPlaceholders.md
similarity index 100%
rename from en/03_Develop/02_API/61_toPlaceholders.md
rename to en/03_Developers/03_API/61_toPlaceholders.md
diff --git a/en/03_Develop/02_API/62_userLoggedIn.md b/en/03_Developers/03_API/62_userLoggedIn.md
similarity index 100%
rename from en/03_Develop/02_API/62_userLoggedIn.md
rename to en/03_Developers/03_API/62_userLoggedIn.md
diff --git a/en/03_Develop/02_API/63_webAlert.md b/en/03_Developers/03_API/63_webAlert.md
similarity index 100%
rename from en/03_Develop/02_API/63_webAlert.md
rename to en/03_Developers/03_API/63_webAlert.md
diff --git a/en/03_Developers/03_API/64_sendmail.md b/en/03_Developers/03_API/64_sendmail.md
new file mode 100644
index 00000000..b888eb99
--- /dev/null
+++ b/en/03_Developers/03_API/64_sendmail.md
@@ -0,0 +1,36 @@
+Функция отправки почты через API Evolution CMS.
+
+Работает в связке с настройками, то есть отправляет почту способом, указанным в панели управления сайта.
+```
+$modx->sendmail($params = array(), $msg = '', $files = array())
+```
+
+## Пример использования: ##
+
+### простой вариант
+```
+ $param = array();
+ $param['from'] = "{$site_name}<{$emailsender}>";
+ $param['subject'] = $emailsubject;
+ $param['body'] = $message;
+ $param['to'] = $email;
+ $rs = $modx->sendmail($param);
+```
+
+### вариант с расширенными настройками
+
+```
+ $modx->loadExtension('MODxMailer');
+ $modx->mail->IsHTML($isHtml);
+ $modx->mail->From = $from;
+ $modx->mail->FromName = $fromname;
+ $modx->mail->Subject = $subject;
+ $modx->mail->Body = $report;
+ AddAddressToMailer($modx->mail,"replyto",$replyto);
+ AddAddressToMailer($modx->mail,"to",$to);
+ AddAddressToMailer($modx->mail,"cc",$cc);
+ AddAddressToMailer($modx->mail,"bcc",$bcc);
+ AttachFilesToMailer($modx->mail,$attachments);
+ if(!$modx->mail->send()) return 'Main mail: ' . $_lang['ef_mail_error'] . $modx->mail->ErrorInfo;
+ ```
+Значения некоторых из полей (From и Fromname, допустим) при при инициализации ModxMailer подставляются из конфигурации сайта. Так что, если нет необходимости их заменять, число параметров можно сократить.
diff --git a/en/03_Developers/03_API/65_getIdFromAlias.md b/en/03_Developers/03_API/65_getIdFromAlias.md
new file mode 100644
index 00000000..6d83c623
--- /dev/null
+++ b/en/03_Developers/03_API/65_getIdFromAlias.md
@@ -0,0 +1,10 @@
+Returns the ID of the document by URL
+```
+string getIdFromAlias(string $alias);
+```
+**$alias** - document alias
+
+### Пример
+```
+ $id = $modx->getIdFromAlias('folder/folder/doc.html')
+```
diff --git a/en/03_Develop/02_API/46_parseChunk.md b/en/03_Developers/03_API/66_parseChunk.md
similarity index 100%
rename from en/03_Develop/02_API/46_parseChunk.md
rename to en/03_Developers/03_API/66_parseChunk.md
diff --git a/en/03_Developers/03_API/67_sendRedirect.md b/en/03_Developers/03_API/67_sendRedirect.md
new file mode 100644
index 00000000..a1b5334a
--- /dev/null
+++ b/en/03_Developers/03_API/67_sendRedirect.md
@@ -0,0 +1,85 @@
+Осуществляет редирект на заданную страницу
+
+```
+bool|null sendRedirect(string $url, int $count_attempts = 0, string $type = '', string $responseCode = '')
+```
+
+**$url** - url страницы, на которую будет производиться редирект
+
+**$count_attempts** - добавить счетчик количества переадресаций в url. Возможные значения - '0', '1'. По умолчанию - '0'
+
+**$type** - Тип редиректа. Возможные значения - 'REDIRECT_REFRESH' (немедленная переадресация), 'REDIRECT_META' (переадресация средствами html), 'REDIRECT_HEADER' (редирект средствами php). По умолчанию - пустая строка, что аналогично значению 'REDIRECT_HEADER'.
+
+**$responseCode** - код http-ответа. Возможные значения - 'HTTP/1.1 301 Moved Permanently', 'HTTP/1.1 302 Moved Temporarily' (постоянная и временная переадресация соответственно).
+
+
+## Пример:
+
+**Вызов:**
+```
+return $modx->sendRedirect('url.html', 0, 'REDIRECT_HEADER', 'HTTP/1.1 301 Moved Permanently');
+```
+
+## Исходный код функции
+```
+ /**
+ * Redirect
+ *
+ * @param string $url
+ * @param int $count_attempts
+ * @param string $type $type
+ * @param string $responseCode
+ * @return bool|null
+ * @global string $base_url
+ * @global string $site_url
+ */
+ public function sendRedirect($url, $count_attempts = 0, $type = '', $responseCode = '')
+ {
+ $header = '';
+ if (empty ($url)) {
+ return false;
+ }
+ if ($count_attempts == 1) {
+ // append the redirect count string to the url
+ $currentNumberOfRedirects = isset ($_REQUEST['err']) ? $_REQUEST['err'] : 0;
+ if ($currentNumberOfRedirects > 3) {
+ $this->messageQuit('Redirection attempt failed - please ensure the document you\'re trying to redirect to exists.
Redirection URL: ' . $url . '
');
+ } else {
+ $currentNumberOfRedirects += 1;
+ if (strpos($url, "?") > 0) {
+ $url .= "&err=$currentNumberOfRedirects";
+ } else {
+ $url .= "?err=$currentNumberOfRedirects";
+ }
+ }
+ }
+ if ($type == 'REDIRECT_REFRESH') {
+ $header = 'Refresh: 0;URL=' . $url;
+ } elseif ($type == 'REDIRECT_META') {
+ $header = '';
+ echo $header;
+ exit;
+ } elseif ($type == 'REDIRECT_HEADER' || empty ($type)) {
+ // check if url has /$base_url
+ global $base_url, $site_url;
+ if (substr($url, 0, strlen($base_url)) == $base_url) {
+ // append $site_url to make it work with Location:
+ $url = $site_url . substr($url, strlen($base_url));
+ }
+ if (strpos($url, "\n") === false) {
+ $header = 'Location: ' . $url;
+ } else {
+ $this->messageQuit('No newline allowed in redirect url.');
+ }
+ }
+ if ($responseCode && (strpos($responseCode, '30') !== false)) {
+ header($responseCode);
+ }
+
+ if(!empty($header)) {
+ header($header);
+ }
+
+ exit();
+ }
+```
diff --git a/en/03_Developers/03_API/68_sendForward.md b/en/03_Developers/03_API/68_sendForward.md
new file mode 100644
index 00000000..161305e4
--- /dev/null
+++ b/en/03_Developers/03_API/68_sendForward.md
@@ -0,0 +1,50 @@
+Загружает выбранный ресурс не изменяя URL страницы
+
+```
+null sendForward(int $id, string $responseCode = '')
+```
+
+**$id** - id ресурса, который будет загружен
+
+**$responseCode** - код http-ответа. Возможные значения - 'HTTP/1.1 301 Moved Permanently', 'HTTP/1.1 302 Moved Temporarily' (постоянная и временная переадресация соответственно).
+
+
+## Пример:
+
+**Вызов:**
+
+```
+return $modx->sendForward(5);
+```
+
+с передачей заголовка с кодом http-ответа:
+```
+return $modx->sendForward(5, 'HTTP/1.1 301 Moved Permanently');
+```
+
+## Исходный код функции
+```
+ /**
+ * Forward to another page
+ *
+ * @param int|string $id
+ * @param string $responseCode
+ */
+ public function sendForward($id, $responseCode = '')
+ {
+ if ($this->forwards > 0) {
+ $this->forwards = $this->forwards - 1;
+ $this->documentIdentifier = $id;
+ $this->documentMethod = 'id';
+ if ($responseCode) {
+ header($responseCode);
+ }
+ $this->prepareResponse();
+ exit();
+ } else {
+ $this->messageQuit("Internal Server Error id={$id}");
+ header('HTTP/1.0 500 Internal Server Error');
+ die('
ERROR: Too many forward attempts!
The request could not be completed due to too many unsuccessful forward attempts.
');
+ }
+ }
+```
diff --git a/en/03_Develop/02_API/index.md b/en/03_Developers/03_API/index.md
similarity index 100%
rename from en/03_Develop/02_API/index.md
rename to en/03_Developers/03_API/index.md
diff --git a/en/03_Developers/04_DBAPI/01_connect.md b/en/03_Developers/04_DBAPI/01_connect.md
new file mode 100644
index 00000000..cfb2123d
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/01_connect.md
@@ -0,0 +1,32 @@
+### Connection with the database
+
+void connect(string $host, string $dbase, string $uid, string $pwd, boolean $persist)
+
+* **$host** - server to connect
+* **$dbase** - select the working base of the
+* **$uid** - login
+* **$pwd** - password
+* **$persist** - keep the connection active
+
+This function also tracks the time spent on the connection and adds it to the total time of requests.
+
+If the connection fails, it reports an error and crashes.
+
+***
+
+#### Example
+
+```
+//Connection to a third-party database
+$modx->db->connect('123.45.6.7', 'mydb', 'user', 'password', true);
+$res = $modx->db->select('*', 'this_table');
+while($tmp = $modx->db->getRow($res, 'assoc')) {
+ // processing of received data
+}
+// Shut down
+$modx->db->disconnect()
+
+// Reconnect
+$modx->db->connect();
+```
+If necessary, you can create a separate instance of the object and organize a connection to a separate database without binding to the $modx.
diff --git a/en/03_Developers/04_DBAPI/02_delete.md b/en/03_Developers/04_DBAPI/02_delete.md
new file mode 100644
index 00000000..f82512ab
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/02_delete.md
@@ -0,0 +1,18 @@
+### Delete data from the database
+
+bool delete(string $from [, string $where [, string $fields]])
+
+* **$from** - table in which you want to delete data
+* **$where** - condition under which it is necessary to delete data
+* **$fields** - list of fields that you want to delete. if not specified the entire row is deleted
+
+***
+
+#### Example
+
+Deleting a user from the database by ID
+```
+global $modx, $table_prefix;
+$id = $modx->db->escape($id);
+$modx->db->delete($table_prefix.".modx_web_users", "id = $id");
+```
diff --git a/en/03_Developers/04_DBAPI/03_disconnect.md b/en/03_Developers/04_DBAPI/03_disconnect.md
new file mode 100644
index 00000000..9ccbeb7f
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/03_disconnect.md
@@ -0,0 +1,25 @@
+### Closes the current connection to the database
+
+void Disconnect()
+
+***
+
+#### Example
+
+Create a connection
+```
+$honey->db->connect('123.45.6.7', 'midb', 'uzer', 'password', tru);
+$res = $honey->db->select('*', 'such_table');
+wild($tmp = $honey->db->getrow($res, 'assok')) {
+ // processing of received data
+}
+```
+
+Shut down
+```
+$honey->db->disconent();
+```
+Reconnecting
+```
+$honey->db->connect();
+```
diff --git a/en/03_Developers/04_DBAPI/04_escape.md b/en/03_Developers/04_DBAPI/04_escape.md
new file mode 100644
index 00000000..8d26d486
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/04_escape.md
@@ -0,0 +1,29 @@
+### Escaping potentially dangerous characters
+
+string escape(string $s)
+
+* **$s** - string for processing
+
+This function uses the standard function **mysql_real_escape_string**, and if it is not, **mysql_escape_string**.
+
+We recommend that you always use this method for data before querying the database. This will protect the database from SQL injections.
+
+***
+
+#### Example
+```
+login function($username, $password) {
+ global $honey, $table_prefix;
+ $username = $honey->db->escape($username);
+ $password = $honey->db->escape($password);
+
+ $res = $honey->db->select("id", $table_prefix.". meds_web_users", "username='$username' and password='".md5($password)."'');
+
+ if($honey->db->getrecordcont($res)) {
+ $_session['uzerid'] = $id;
+ // other actions...
+ } else {
+ // there was no suitable record
+ }
+}
+```
diff --git a/en/03_Developers/04_DBAPI/05_getAffectedRows.md b/en/03_Developers/04_DBAPI/05_getAffectedRows.md
new file mode 100644
index 00000000..0281943a
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/05_getAffectedRows.md
@@ -0,0 +1,24 @@
+### Number of rows processed by the last request
+
+integer getAffectedRows ([$conn])
+
+* **$conn** - connection to the database
+
+Returns the number of rows that were processed by the last INSERT, UPDATE, REPLACE, or DELETE request. If the last request failed, a value of -1 will be returned.
+
+When using the UPDATE query, MySQL does not affect columns with values that have not been updated. As a result, the php function used mysql_affected_rows() can only return the number of records that have been changed.
+
+The REPLACE query first deletes the old records and then inserts the new ones, causing the method to return the sum of the deleted and added records.
+
+***
+
+#### Example
+````
+function deleteid($id) {
+ $modx->db->query("DELETE FROM my_table WHERE userid=".$id);
+ if($modx->db->getAffectedRows()) {
+ return true;
+ }
+ return false;
+}
+```
diff --git a/en/03_Developers/04_DBAPI/06_getColumn.md b/en/03_Developers/04_DBAPI/06_getColumn.md
new file mode 100644
index 00000000..3870c156
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/06_getColumn.md
@@ -0,0 +1,28 @@
+### Array of values from a given column
+
+mixed getColumn (string $name, $dsq)
+
+* **$name** - column name
+
+* **$dsq** - query result or SQL query
+
+This method returns a numbered array of values from the specified column in retrieved from the database. A dataset can be retrieved by using a SELECT query and contain multiple columns, one of which can be retrieved by the getColumn method.
+
+***
+
+#### Example
+```
+function myColumn() {
+ global $modx;
+ $output = '';
+
+ $result = $modx->db->select( 'id, name', 'colors', 'favorite_color = "blue"' );
+ $col = $modx->db->getColumn( 'name', $result );
+
+ for( $i = 0; $i < count( $col ); $i++ ) {
+ $output .= $col[$i] . "'s favorite color is blue. ";
+ }
+
+ return $output;
+}
+```
diff --git a/en/03_Developers/04_DBAPI/07_getColumnNames.md b/en/03_Developers/04_DBAPI/07_getColumnNames.md
new file mode 100644
index 00000000..80a39756
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/07_getColumnNames.md
@@ -0,0 +1,28 @@
+### Column Name Array
+
+array getColumnNames($dsq)
+
+* **$dsq** - query result or SQL query
+
+This method returns a numbered array of column names in the retrieved from the database. A dataset can be retrieved by using a SELECT query and contain multiple columns, a list of which can be retrieved by the getColumnNames method.
+
+***
+
+#### Example
+```
+$result = $modx->db->select( 'id, name, age', 'people_table' );
+
+// Get a list of column names
+$cols = $modx->db->getColumnNames( $result );
+
+for( $i = 0; $i < count( $cols ); $i++ ) {
+ // Column name list for a simple header
+ $output .= $cols[$i] . ' | ';
+}
+
+while( $row = $modx->db->getRow( $result ) ) { // Get data from query result
+ $output .= ' ' . $row['ItemID'] . ' | ' . $row['Name'] . ' | ' . $row['Image'];
+}
+
+return $output;
+```
diff --git a/en/03_Developers/04_DBAPI/08_getHTMLGrid.md b/en/03_Developers/04_DBAPI/08_getHTMLGrid.md
new file mode 100644
index 00000000..c0d8b953
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/08_getHTMLGrid.md
@@ -0,0 +1,48 @@
+### Generates an HTML table with query data
+
+string getHTMLGrid($dsq, $params)
+
+* **$dsq** - query result or SQL query
+* **$params** - an array of HTML table output settings
+
++ columnHeaderClass
++ cssClass
++ itemClass
++ altItemClass
++ columnHeaderStyle
++ tableStyle
++ itemStyle
++ altItemStyle
++ columns
++ fields
++ colWidths
++ colAligns
++ colColors
++ colTypes
++ cellPadding
++ cellSpacing
++ header
++ footer
++ pageSize
++ pagerLocation
++ pagerClass
++ pagerStyle
+
+The method generates an HTML table based on the query data, taking into account an extensive list of possible output settings.
+
+***
+
+#### Example
+```
+$resource = $modx->db->query('SELECT id,name FROM modx_site_tmplvars order by name');
+$result = $modx->db->getHTMLGrid(
+ $resource,
+ array('fields'=>'id,name',
+ 'columns'=>'Number,Name',
+ 'cssClass'=>'sortable resizable editable',
+ 'columnHeaderClass'=>'noedit',
+ 'columnHeaderStyle'=>'color: black; background-color: silver;'
+ );
+ );
+return $result;
+```
diff --git a/en/03_Developers/04_DBAPI/09_getInsertId.md b/en/03_Developers/04_DBAPI/09_getInsertId.md
new file mode 100644
index 00000000..ffa4c993
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/09_getInsertId.md
@@ -0,0 +1,24 @@
+### ID of the added record
+
+integer getInsertId([$conn])
+
+* **$conn** - connection to the database
+
+Returns the AUTO_INCREMENT identifier for the last record that was added by using the INSERT query. Returns 0 if the AUTO_INCREMENT fields are not created.
+
+***
+
+#### Example
+```
+function insert_user( $fields, $table ) {
+ if( is_array( $fields ) {
+ if( $modx->db->insert( $table, $fields ) ) {
+ return $modx->db->getInsertId();
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+}
+```
diff --git a/en/03_Developers/04_DBAPI/10_getRecordCount.md b/en/03_Developers/04_DBAPI/10_getRecordCount.md
new file mode 100644
index 00000000..c72b7ddf
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/10_getRecordCount.md
@@ -0,0 +1,26 @@
+### Number of records in the query result
+
+integer getRecordCount ($data_set)
+
+* **$data_set** - connection to the database
+
+Returns the number of records that were retrieved as a result of a SELECT query.
+
+***
+
+#### Example
+````
+$output = '';
+$result = $modx->db->select('make, model, color, year', 'cars', 'year > 2001');
+$total_rows = $modx->db->getRecordCount( $result );
+
+if( $total_rows >= 1 ) {
+ $output .= $total_rows . ' cars newer than 2001: ';
+ while( $row = $modx->db->getRow( $result ) ) {
+ $output .= 'Manufacturer: ' . $row['make'] . ' | Model: ' . $row['model'] . ' | Цвет: ' . $row['color'] . ' | Год: ' . $row['year'] . ' ';
+ }
+}else{
+ $output = 'There are no cars newer than 2001!';
+}
+echo $output;
+````
diff --git a/en/03_Developers/04_DBAPI/11_getRow.md b/en/03_Developers/04_DBAPI/11_getRow.md
new file mode 100644
index 00000000..0bc1543c
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/11_getRow.md
@@ -0,0 +1,35 @@
+### Retrieving a record from a query result
+
+array getRow($ds, $mode)
+
+* **$ds** - query result
+* **$mode** - operating mode
+
++ assoc - obtaining an associative array
++ num - obtaining a numbered array
++ both - obtaining an array combining associative and numbered
+
+***
+
+#### Example
+```
+function getAlbum() {
+ global $modx;
+ $output = '';
+ $table = $modx->getFullTableName( 'albums' );
+
+ $result = $modx->db->select( 'id, album_name, artist', $table, '', 'artist ASC', '0, 50');
+
+ if( $modx->db->getRecordCount( $result ) >= 1 ) {
+ $output .= '
';
+ }else{
+ $output = 'No records found.';
+ }
+
+ return $output;
+}
+```
diff --git a/en/03_Developers/04_DBAPI/12_getTableMetaData.md b/en/03_Developers/04_DBAPI/12_getTableMetaData.md
new file mode 100644
index 00000000..cfc4ef46
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/12_getTableMetaData.md
@@ -0,0 +1,45 @@
+### Table Structure Information
+
+array getTableMetaData($table)
+
+**$table** - table name
+
+This function returns a multidimensional array with detailed information about the structure of the specified MySQL table.
+
+The array has the form *TableField => Array( Info => Value )*, where
+
++ TableField - column name,
++ Info - one of the 6 information parameters,
++ Value - the value of a specific parameter.
+
+***
+
+#### Information parameters:
+
+* **Field** - table field name
+* **Type** - field type and size (e.g. int(5), varchar(40) or text)
+* **Null** - can contain a null value
+* **Key** - contains a key for a value of type "UNI" (UNIQUE) or "PRI" (PRIMARY)
+* **Default** - default value
+* **Extra** - additional information, such as the use of auto_increment
+
+***
+
+#### Example
+```
+$table = 'my_table';
+$data = $modx->db->getTableMetaData( $table );
+$output = '';
+
+// Loop through all columns
+foreach( $data as $field => $arr ) {
+ // Column name
+ $output .= '' . $field . ' ';
+
+ // Cycle for all information parameters
+ foreach( $arr as $info => $value )
+ $output .= $info . ': ' . $value . ' '; // Output value
+ }
+}
+return $output;
+```
diff --git a/en/03_Developers/04_DBAPI/13_getValue.md b/en/03_Developers/04_DBAPI/13_getValue.md
new file mode 100644
index 00000000..0dcf37cc
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/13_getValue.md
@@ -0,0 +1,22 @@
+### Value of the first column from the query result
+
+mixed getValue($dsq)
+
+* **$dsq** - query result or SQL query
+
+This function returns the first value from the first column of the query result. This allows you to quickly retrieve a single expected value (for example, the result of a SELECT COUNT(*) query).
+
+***
+
+#### Example
+```
+function display_rows() {
+ global $modx;
+ $count = $modx->db->getValue( $modx->db->select( 'count(*)', 'people' ) );
+ if( $count < 1 ) {
+ return 'No records found';
+ }else{
+ return 'Найдено ' . $count . ' записей в базе.';
+ }
+}
+```
diff --git a/en/03_Developers/04_DBAPI/14_getXML.md b/en/03_Developers/04_DBAPI/14_getXML.md
new file mode 100644
index 00000000..a9b1de89
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/14_getXML.md
@@ -0,0 +1,34 @@
+### Query result in XML format
+
+string getXML($dsq)
+
+* **$dsq** - query result or SQL query
+
+#### Data of received query results are displayed in the following format:
+```
+
+
+
+ Value1
+ Value2
+ Value3
+
+
+ Value1
+ Value2
+ Value3
+
+
+
+```
+Each entry is enclosed in an tag. "Field#" corresponds to column names, and "Value#" to values.
+
+***
+
+#### Example
+```
+$result = $modx->db->select( 'id, name, location', 'places', '' );
+$xml = $modx->db->getXML( $result );
+$output = '';
+return $output;
+```
diff --git a/en/03_Developers/04_DBAPI/15_insert.md b/en/03_Developers/04_DBAPI/15_insert.md
new file mode 100644
index 00000000..e7291a41
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/15_insert.md
@@ -0,0 +1,32 @@
+### Add entry
+
+mixed insert($fields, $intotable [, $fromfields [, $fromtable [, $where [, $limit ]]]])
+
+* **$fields** - associative array of added values, with field name as a key
+* **$intotable** - table to add
+* **$fromfields** - list of fields used for import from another table
+* **$fromtable** - table used for import
+* **$where** - condition for requesting data from a table for import
+* **$limit** - limit on the number of entries to import
+
+The INSERT method allows you to add new records to the database. Values are passed as an associative array $fields, the format of which is field => value. The key "field" indicates the name of the column, and "value" indicates the value to be added.
+
+The $fromfields, $fromtable, $where, and $limit parameters are used to copy data from one table to another.
+
+This method returns the AUTO_INCREMENT ID for the added entry.
+
+***
+
+#### Example
+```
+function insert_my_rows( $data = array() ) {
+ global $modx;
+ $table_name = $modx->getFullTableName( 'cars' );
+ $fields = array('name' => $data['name'],
+ 'color' => $data['color'],
+ 'make' => $data['make'],
+ 'model' => $data['model'],
+ );
+ $modx->db->insert( $fields, $table_name);
+}
+```
diff --git a/en/03_Developers/04_DBAPI/16_makeArray.md b/en/03_Developers/04_DBAPI/16_makeArray.md
new file mode 100644
index 00000000..40dc13bb
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/16_makeArray.md
@@ -0,0 +1,28 @@
+### Query result as an array
+
+mixed makeArray($rs, $index = false)
+
+**$rs** - результат виконання запиту
+
+**$index** - ім'я поля для використання його значення як ключ в масиві, якщо рівне false - ключі в масиві будуть числові.
+
+This method returns a multidimensional associative array with query result data in the format Key => Array(FieldName => Value).
+
+***
+
+#### Example
+```
+function show_members() {
+ global $modx;
+ $output = '';
+ $table = $modx->getFullTableName('members');
+
+ $result = $modx->db->select('id, name, picture', $table, '', 'name ASC', '');
+ $members = $modx->db->makeArray($result, 'id');
+ foreach ($members as $p_val) {
+ foreach ($p_val as $m_key => $m_val) {
+ $output .= '' . $m_key . ': ' . $m_val . ' ';
+ }
+ }
+}
+```
diff --git a/en/03_Developers/04_DBAPI/17_prepareDate.md b/en/03_Developers/04_DBAPI/17_prepareDate.md
new file mode 100644
index 00000000..f31f192c
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/17_prepareDate.md
@@ -0,0 +1,28 @@
+### Date output formatting
+
+string prepareDate($timestamp, $fieldType)
+
+**$timestamp** - date in Unix timestamp format
+
+**$fieldType** - formatting option
+
++ DATE - Y-m-d format. Example: "2007-04-30"
++ TIME - H:i:s format. Example: "13:43:27"
++ YEAR - Y format. Example: "2007"
++ DATETIME (default) - Y-m-d H:i:s format. Example: "2007-04-30 13:43:27"
+
+***
+
+#### Example
+```
+function getEvents( $date ) {
+ global $modx;
+ $output = '';
+ $fulldate = $modx->db->prepareDate( $date, 'DATE' );
+ // Converts the date to a readable form
+ $result = $modx->db->select( 'event_name', 'events', 'timestamp = ' . intval( $date ) );
+ while( $row = $modx->db->getRow( $result ) ) {
+ $output .= $row['event_name'] . ' состоится ' . $fulldate . '.';
+ }
+}
+```
diff --git a/en/03_Developers/04_DBAPI/18_query.md b/en/03_Developers/04_DBAPI/18_query.md
new file mode 100644
index 00000000..95c4b913
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/18_query.md
@@ -0,0 +1,24 @@
+### Direct database query
+
+mixed query($sql)
+
+**$sql** - string with SQL query
+
+Various DBAPI methods end up querying the database using the "query" method. If the standard features of special methods are not enough, then you can make any SQL query directly.
+
+***
+
+#### Example
+```
+$output = '';
+$result = $modx->db->query('SELECT id, name, joined FROM ' . $modx->getFullTableName('user_table') . ' GROUP BY `member_type` ORDER BY name ASC');
+
+while( $row = $modx->db->getRow( $result ) ) {
+ $output .= ' ID: ' . $row['id'] .
+ ' Name: ' . $row['name'] .
+ ' Joined: ' . $row['joined'] .
+ ' --------- ';
+}
+
+echo $output;
+```
diff --git a/en/03_Developers/04_DBAPI/19_select.md b/en/03_Developers/04_DBAPI/19_select.md
new file mode 100644
index 00000000..32df97b1
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/19_select.md
@@ -0,0 +1,34 @@
+### Getting data
+
+resource select($fields , $from [, $where [, $orderby [, $limit]]])
+
+* **$fields** - list of required fields from the request
+* **$from** - table to select
+* **$where** - selection condition
+* **$orderby** - field to sort by
+* **$limit** - limit on the number of records in the query result
+
+The "select" method allows you to make a regular query to the database to get data that matches the given parameters.
+***
+
+#### Example
+```
+function login($username, $password) {
+ global $modx;
+ // assume these values have been received
+ // using POST before calling the function
+ $username = $modx->db->escape($username);
+ $password = $modx->db->escape($password);
+
+ $res = $modx->db->select("id", $modx->getFullTableName('web_users'), "username='" . $username ."' AND password='".md5($password)."'");
+
+ if($modx->db->getRecordCount($res)) {
+
+ $id = $modx->db->getValue($res);
+ $_SESSION['userid'] = $id;
+ // Other Actions
+ }else{
+ // no matching entry found
+ }
+}
+```
diff --git a/en/03_Developers/04_DBAPI/20_update.md b/en/03_Developers/04_DBAPI/20_update.md
new file mode 100644
index 00000000..e8ef545c
--- /dev/null
+++ b/en/03_Developers/04_DBAPI/20_update.md
@@ -0,0 +1,30 @@
+### Data update
+
+boolean update($fields, $table, $where)
+
+* **$fields** - array of updated values
+* **$table** - table to update
+* **$where** - condition for searching for updated records
+
+The "update" method allows you to update the data in the database by passing new values in the $fields array. The format of the updated values array is field => new_value, where "field" is the name of the updated field, and "new_value" is the new value.
+
+***
+
+#### Example
+```
+$table = $modx->getFullTableName( 'cars_table' );
+
+$fields = array('make' => $new_make,
+ 'model' => $new_model,
+ 'color' => $new_color,
+ 'year' => $new_year,
+ 'updated'=> time()
+ );
+
+$result = $modx->db->update( $fields, $table, 'id = "' . $id . '"' );
+if( $result ) {
+ echo 'Information updated!';
+} else {
+ echo 'There was a problem during the request...';
+}
+```
diff --git a/en/03_Develop/03_DBAPI/index.md b/en/03_Developers/04_DBAPI/index.md
similarity index 100%
rename from en/03_Develop/03_DBAPI/index.md
rename to en/03_Developers/04_DBAPI/index.md
diff --git a/en/03_Developers/05_SystemVariables/01_Config.md b/en/03_Developers/05_SystemVariables/01_Config.md
new file mode 100644
index 00000000..72670c89
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/01_Config.md
@@ -0,0 +1,247 @@
+## System Settings
+
+### Array Config
+
+Contains information about system settings in the form of an associative array. It is not recommended to use it directly and to get information there is an API method - getConfig
+
+#### Exmaple
+````
+echo $modx->config['modx_charset'];
+````
+You can see all the possible elements of the settings
+
+````
+var_dump($modx->config);
+````
+
+Returns:
+
+````
+array(162) {
+ ["manager_theme"]=> string(20) "MODxRE2_DropdownMenu"
+ ["settings_version"]=> string(12) "1.2.1-d9.1.3"
+ ["show_meta"]=> string(1) "1"
+ ["server_offset_time"]=> string(1) "0"
+ ["server_protocol"]=> string(4) "http"
+ ["manager_language"]=> string(12) "russian-UTF8"
+ ["modx_charset"]=> &string(5) "UTF-8"
+ ["site_name"]=> string(6) "site"
+ ["site_start"]=> string(1) "1"
+ ["error_page"]=> string(2) "41"
+ ["unauthorized_page"]=> string(2) "43"
+ ["site_status"]=> string(1) "1"
+ ["site_unavailable_message"]=> string(33) "The site is currently unavailable"
+ ["track_visitors"]=> string(1) "0"
+ ["top_howmany"]=> string(2) "10"
+ ["auto_template_logic"]=> string(7) "sibling"
+ ["default_template"]=> string(1) "3"
+ ["old_template"]=> string(1) "3"
+ ["publish_default"]=> string(1) "1"
+ ["cache_default"]=> string(1) "1"
+ ["search_default"]=> string(1) "1"
+ ["friendly_urls"]=> string(1) "1"
+ ["friendly_url_prefix"]=> string(0) ""
+ ["friendly_url_suffix"]=> string(5) ".html"
+ ["friendly_alias_urls"]=> string(1) "1"
+ ["use_alias_path"]=> string(1) "1"
+ ["use_udperms"]=> string(1) "1"
+ ["udperms_allowroot"]=> string(1) "0"
+ ["failed_login_attempts"]=> string(1) "3"
+ ["blocked_minutes"]=> string(2) "60"
+ ["use_captcha"]=> string(1) "0"
+ ["captcha_words"]=> string(19) "0,1,2,3,4,5,6,7,8,9"
+ ["emailsender"]=> string(15) "email@mail.ru"
+ ["email_method"]=> string(4) "mail"
+ ["smtp_auth"]=> string(1) "0"
+ ["smtp_host"]=> string(0) ""
+ ["smtp_port"]=> string(2) "25"
+ ["smtp_username"]=> string(0) ""
+ ["emailsubject"]=> string(18) "Your login details"
+ ["number_of_logs"]=> string(3) "100"
+ ["number_of_messages"]=> string(2) "30"
+ ["number_of_results"]=> string(2) "20"
+ ["use_editor"]=> string(1) "1"
+ ["use_browser"]=> string(1) "1"
+ ["rb_base_dir"]=> string(46) "/home/site/web/site.ru/public_html/assets/"
+ ["rb_base_url"]=> string(7) "assets/"
+ ["which_editor"]=> string(4) "none"
+ ["fe_editor_lang"]=> string(12) "russian-UTF8"
+ ["fck_editor_toolbar"]=> string(8) "standard"
+ ["fck_editor_autolang"]=> string(1) "0"
+ ["editor_css_path"]=> string(0) ""
+ ["editor_css_selectors"]=> string(0) ""
+ ["strip_image_paths"]=> string(1) "1"
+ ["upload_images"]=> string(37) "bmp,ico,gif,jpeg,jpg,png,psd,tif,tiff"
+ ["upload_media"]=> string(31) "au,avi,mp3,mp4,mpeg,mpg,wav,wmv"
+ ["upload_flash"]=> string(11) "fla,flv,swf"
+ ["upload_files"]=> string(210) "bmp,ico,gif,jpeg,jpg,png,psd,tif,tiff,fla,flv,swf,aac,au,avi,css,cache,doc,docx,gz,gzip,htaccess,htm,html,js,mp3,mp4,mpeg,mpg,ods,odp,odt,pdf,ppt,pptx,rar,tar,tgz,txt,wav,wmv,xls,xlsx,xml,z,zip,JPG,JPEG,PNG,GIF"
+ ["upload_maxsize"]=> string(7) "1048576"
+ ["new_file_permissions"]=> string(4) "0644"
+ ["new_folder_permissions"]=> string(4) "0755"
+ ["filemanager_path"]=> string(39) "/home/site/web/site.ru/public_html/"
+ ["theme_refresher"]=> string(13) "1492629357000"
+ ["manager_layout"]=> string(1) "4"
+ ["custom_contenttype"]=> string(156) "application/rss+xml,application/pdf,application/vnd.ms-word,application/vnd.ms-excel,text/html,text/css,text/xml,text/javascript,text/plain,application/json"
+ ["auto_menuindex"]=> string(1) "1"
+ ["session.cookie.lifetime"]=> string(6) "604800"
+ ["mail_check_timeperiod"]=> string(3) "600"
+ ["manager_direction"]=> string(3) "ltr"
+ ["tinymce_editor_theme"]=> string(6) "editor"
+ ["tinymce_custom_plugins"]=> string(112) "style,advimage,advlink,searchreplace,print,contextmenu,paste,fullscreen,nonbreaking,xhtmlxtras,visualchars,media"
+ ["tinymce_custom_buttons1"]=>
+ string(216) "undo,redo,selectall,separator,pastetext,pasteword,separator,search,replace,separator,nonbreaking,hr,charmap,separator,image,link,unlink,anchor,media,separator,cleanup,removeformat,separator,fullscreen,print,code,help"
+ ["tinymce_custom_buttons2"]=>
+ string(201) "bold,italic,underline,strikethrough,sub,sup,separator,bullist,numlist,outdent,indent,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect,separator,styleprops"
+ ["tree_show_protected"]=> string(1) "0"
+ ["rss_url_news"]=> string(41) "http://feeds.feedburner.com/modx-announce"
+ ["rss_url_security"]=> string(40) "http://feeds.feedburner.com/modxsecurity"
+ ["validate_referer"]=> string(1) "1"
+ ["datepicker_offset"]=> string(3) "-10"
+ ["xhtml_urls"]=> string(1) "0"
+ ["allow_duplicate_alias"]=> string(1) "0"
+ ["automatic_alias"]=> string(1) "1"
+ ["datetime_format"]=> string(10) "dd-mm-YYYY"
+ ["warning_visibility"]=> string(1) "0"
+ ["remember_last_tab"]=> string(1) "1"
+ ["enable_bindings"]=> string(1) "1"
+ ["seostrict"]=> string(1) "1"
+ ["cache_type"]=> string(1) "2"
+ ["maxImageWidth"]=> string(4) "1600"
+ ["maxImageHeight"]=> string(4) "2500"
+ ["thumbWidth"]=> string(3) "150"
+ ["thumbHeight"]=> string(3) "150"
+ ["thumbsDir"]=> string(7) ".thumbs"
+ ["jpegQuality"]=> string(2) "90"
+ ["denyZipDownload"]=> string(1) "0"
+ ["denyExtensionRename"]=> string(1) "0"
+ ["showHiddenFiles"]=> string(1) "0"
+ ["docid_incrmnt_method"]=> string(1) "0"
+ ["make_folders"]=> string(1) "1"
+ ["tree_page_click"]=> string(2) "27"
+ ["clean_uploaded_filename"]=> string(1) "1"
+ ["site_id"]=> string(13) "58f7b74c2db76"
+ ["site_unavailable_page"]=> string(0) ""
+ ["reload_site_unavailable"]=> string(0) ""
+ ["siteunavailable_message_default"]=> string(63) "В настоящее время сайт недоступен."
+ ["aliaslistingfolder"]=> string(1) "0"
+ ["check_files_onlogin"]=> string(72) "index.php
+.htaccess
+manager/index.php
+manager/includes/config.inc.php"
+ ["error_reporting"]=> string(1) "1"
+ ["send_errormail"]=> string(1) "3"
+ ["pwd_hash_algo"]=> string(7) "UNCRYPT"
+ ["reload_captcha_words"]=> string(0) ""
+ ["captcha_words_default"]=> string(379) "MODX,Access,Better,BitCode,Chunk,Cache,Desc,Design,Excell,Enjoy,URLs,TechView,Gerald,Griff,Humphrey,Holiday,Intel,Integration,Joystick,Join(),Oscope,Genetic,Light,Likeness,Marit,Maaike,Niche,Netherlands,Ordinance,Oscillo,Parser,Phusion,Query,Question,Regalia,Righteous,Snippet,Sentinel,Template,Thespian,Unity,Enterprise,Verily,Tattoo,Veri,Website,WideWeb,Yap,Yellow,Zebra,Zygote"
+ ["smtp_secure"]=> string(4) "none"
+ ["reload_emailsubject"]=> string(0) ""
+ ["emailsubject_default"]=> string(42) "Данные для авторизации"
+ ["reload_signupemail_message"]=> string(0) ""
+ ["signupemail_message"]=> string(450) "Здравствуйте, !
+
+Ваши данные для авторизации в системе управления сайтом :
+
+Имя пользователя:
+Пароль:
+
+После успешной авторизации в системе управления сайтом (), вы сможете изменить свой пароль.
+
+С уважением, Администрация"
+ ["system_email_signup_default"]=>
+ string(450) "Здравствуйте, !
+
+Ваши данные для авторизации в системе управления сайтом :
+
+Имя пользователя:
+Пароль:
+
+После успешной авторизации в системе управления сайтом (), вы сможете изменить свой пароль.
+
+С уважением, Администрация"
+ ["reload_websignupemail_message"]=> string(0) ""
+ ["websignupemail_message"]=> string(366) "Здравствуйте, !
+
+Ваши данные для авторизации на :
+
+Имя пользователя:
+Пароль:
+
+После успешной авторизации на (), вы сможете изменить свой пароль.
+
+С уважением, Администрация"
+ ["system_email_websignup_default"]=> string(366) "Здравствуйте, !
+
+Ваши данные для авторизации на :
+
+Имя пользователя:
+Пароль:
+
+После успешной авторизации на (), вы сможете изменить свой пароль.
+
+С уважением, Администрация"
+ ["reload_system_email_webreminder_message"]=> string(0) ""
+ ["webpwdreminder_message"]=> string(490) "Здравствуйте, !
+
+Чтобы активировать ваш новый пароль, перейдите по следующей ссылке:
+
+
+
+Позже вы сможете использовать следующий пароль для авторизации:
+
+Если это письмо пришло к вам по ошибке, пожалуйста, проигнорируйте его.
+
+С уважением, Администрация"
+ ["system_email_webreminder_default"]=> string(490) "Здравствуйте, !
+
+Чтобы активировать ваш новый пароль, перейдите по следующей ссылке:
+
+
+
+Позже вы сможете использовать следующий пароль для авторизации:
+
+Если это письмо пришло к вам по ошибке, пожалуйста, проигнорируйте его.
+
+С уважением, Администрация"
+ ["resource_tree_node_name"]=> string(9) "pagetitle"
+ ["mce_editor_skin"]=> string(7) "cirkuit"
+ ["mce_template_docs"]=> string(0) ""
+ ["mce_template_chunks"]=> string(0) ""
+ ["mce_entermode"]=> string(1) "p"
+ ["mce_element_format"]=> string(5) "xhtml"
+ ["mce_schema"]=>
+ string(5) "html4"
+ ["tinymce_custom_buttons3"]=> string(0) ""
+ ["tinymce_custom_buttons4"]=> string(0) ""
+ ["tinymce_css_selectors"]=> string(35) "left=justifyleft;right=justifyright"
+ ["rb_webuser"]=> string(1) "0"
+ ["sys_files_checksum"]=> string(198) "a:2:{s:48:"/home/site/web/site.ru/public_html/index.php";s:32:"ed8dd02021b28b9227b44d5a76ef7440";s:48:"/home/site/web/site.ru/public_html/.htaccess";s:32:"8e4ef1ec7e19ae4055764166b85cad6f";}"
+ ["use_breadcrumbs"]=> string(1) "1"
+ ["tinymce4_theme"]=> string(8) "advanced"
+ ["tinymce4_skin"]=> string(9) "lightgray"
+ ["tinymce4_template_docs"]=> string(0) ""
+ ["tinymce4_template_chunks"]=> string(0) ""
+ ["tinymce4_entermode"]=> string(1) "p"
+ ["tinymce4_element_format"]=> string(5) "xhtml"
+ ["tinymce4_schema"]=> string(5) "html5"
+ ["tinymce4_custom_plugins"]=> string(328) "advlist autolink lists link image charmap print preview hr anchor pagebreak searchreplace wordcount visualblocks visualchars code fullscreen spellchecker insertdatetime media nonbreaking save table contextmenu directionality emoticons template paste textcolor codesample colorpicker textpattern imagetools paste modxlink youtube"
+ ["tinymce4_custom_buttons1"]=> string(186) "undo redo | cut copy paste | searchreplace | bold italic underline strikethrough | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent blockquote | styleselect"
+ ["tinymce4_custom_buttons2"]=> string(168) "link unlink anchor image media codesample table | hr removeformat | subscript superscript charmap | nonbreaking | visualchars visualblocks print preview fullscreen code"
+ ["tinymce4_custom_buttons3"]=> string(0) ""
+ ["tinymce4_custom_buttons4"]=> string(0) ""
+ ["tinymce4_blockFormats"]=> string(47) "Paragraph=p;Header 1=h1;Header 2=h2;Header 3=h3"
+ ["which_browser"]=> string(5) "mcpuk"
+ ["enable_filter"]=> string(1) "0"
+ ["minifyphp_incache"]=> string(1) "0"
+ ["session_timeout"]=> string(2) "15"
+ ["allow_eval"]=> string(9) "with_scan"
+ ["safe_functions_at_eval"]=> string(28) "time,date,strtotime,strftime"
+ ["lang_code"]=> string(2) "ru"
+ ["etomite_charset"]=> &string(5) "UTF-8"
+ ["base_url"]=> string(1) "/"
+ ["base_path"]=> string(39) "/home/site/web/site.ru/public_html/"
+ ["site_url"]=> string(17) "http://site.ru/"
+ ["valid_hostnames"]=> string(0) ""
+ ["site_manager_url"]=> string(24) "http://site.ru/dostup/"
+ ["site_manager_path"]=> string(46) "/home/site/web/site.ru/public_html/dostup/"
+}
+````
diff --git a/en/03_Developers/05_SystemVariables/02_documentIdentifier.md b/en/03_Developers/05_SystemVariables/02_documentIdentifier.md
new file mode 100644
index 00000000..50d70160
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/02_documentIdentifier.md
@@ -0,0 +1,9 @@
+### Identifier of the current resource
+
+int documentIdentifier
+
+Contains the ID of the document on which code was invoked.
+
+#### Example
+
+ documentIdentifier; ?>
diff --git a/en/03_Developers/05_SystemVariables/03_documentMethod.md b/en/03_Developers/05_SystemVariables/03_documentMethod.md
new file mode 100644
index 00000000..bbbe0fa5
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/03_documentMethod.md
@@ -0,0 +1,15 @@
+### Method to get a resource
+
+string documentMethod
+
+Possible Values:
+
+**alias** - obtained using the passed alias
+
+**id** - received using the passed identifier none - method not defined
+
+Contains information about the method by which the page was retreived. Even if an alias was used, after the resource identifier is determined, the method automatically changed to id.
+
+#### Пример
+
+ documentMethod; ?>
diff --git a/en/03_Developers/05_SystemVariables/04_documentGenerated.md b/en/03_Developers/05_SystemVariables/04_documentGenerated.md
new file mode 100644
index 00000000..5407eaee
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/04_documentGenerated.md
@@ -0,0 +1,15 @@
+### Page has been generated
+
+bool documentGenerated
+
+Possible values are:
+
+**1** - page was generated
+
+**0** - the page was obtained from the cache
+
+Contains information about the whether the document was generated, or taken from cache.
+
+#### Example
+
+ documentGenerated; ?>
diff --git a/en/03_Developers/05_SystemVariables/05_documentContent.md b/en/03_Developers/05_SystemVariables/05_documentContent.md
new file mode 100644
index 00000000..75c10a2b
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/05_documentContent.md
@@ -0,0 +1,9 @@
+### Contents
+
+string documentContent
+
+Contains the full content of the page. During the generation process, the content gradually changed and written to this variable.
+
+#### Example
+
+ documentContent; ?>
diff --git a/en/03_Developers/05_SystemVariables/06_tstart.md b/en/03_Developers/05_SystemVariables/06_tstart.md
new file mode 100644
index 00000000..e1cf1d83
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/06_tstart.md
@@ -0,0 +1,13 @@
+### EvoCMS start time
+
+float tstart
+
+Contains the start time of EvoCMS in the "unix time" format, allowing you to estimate the page generation time.
+
+#### Example
+
+ tstart;
+ echo strftime("%H:%M:%S", $time);
+ // returns "17:56:10"
+ ?>
diff --git a/en/03_Developers/05_SystemVariables/07_minParserPasses.md b/en/03_Developers/05_SystemVariables/07_minParserPasses.md
new file mode 100644
index 00000000..835d12a2
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/07_minParserPasses.md
@@ -0,0 +1,9 @@
+### Minimum number of parser passes
+
+int minParserPasses
+
+Contains the minimum number of passes by the parser.
+
+#### Example
+
+ minParserPasses; ?>
diff --git a/en/03_Developers/05_SystemVariables/08_maxParserPasses.md b/en/03_Developers/05_SystemVariables/08_maxParserPasses.md
new file mode 100644
index 00000000..678bb5aa
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/08_maxParserPasses.md
@@ -0,0 +1,9 @@
+### Maximum number of parser passes
+
+int maxParserPasses
+
+Contains the maximum number of times the parser processes content.
+
+#### Example
+
+ maxParserPasses; ?>
diff --git a/en/03_Developers/05_SystemVariables/09_documentObject.md b/en/03_Developers/05_SystemVariables/09_documentObject.md
new file mode 100644
index 00000000..2aac66d2
--- /dev/null
+++ b/en/03_Developers/05_SystemVariables/09_documentObject.md
@@ -0,0 +1,14 @@
+### Current resource data
+
+array documentObject
+
+Contains the complete dataset for the current page as an associative array. Including this array gets information about TV-parameters. All data can be accessed using tags of the form .
+
+There is no suitable API method for retrieving data from a documentObject.
+
+#### Example
+
+ documentObject['pagetitle'];
+ // Displays the page title
+ ?>
diff --git a/en/03_Develop/04_SystemVariables/10_documentListing.md b/en/03_Developers/05_SystemVariables/10_documentListing.md
similarity index 100%
rename from en/03_Develop/04_SystemVariables/10_documentListing.md
rename to en/03_Developers/05_SystemVariables/10_documentListing.md
diff --git a/en/03_Develop/01_Elements/08_Modifiers/index.md b/en/03_Developers/05_SystemVariables/index.md
similarity index 100%
rename from en/03_Develop/01_Elements/08_Modifiers/index.md
rename to en/03_Developers/05_SystemVariables/index.md
diff --git a/en/03_Develop/10_MMrules/11_Restriction_ddMaxLenght.md b/en/03_Developers/10_MMrules/11_Restriction_ddMaxLenght.md
similarity index 100%
rename from en/03_Develop/10_MMrules/11_Restriction_ddMaxLenght.md
rename to en/03_Developers/10_MMrules/11_Restriction_ddMaxLenght.md
diff --git a/en/03_Develop/10_MMrules/12_Restriction_ddNumericField.md b/en/03_Developers/10_MMrules/12_Restriction_ddNumericField.md
similarity index 100%
rename from en/03_Develop/10_MMrules/12_Restriction_ddNumericField.md
rename to en/03_Developers/10_MMrules/12_Restriction_ddNumericField.md
diff --git a/en/03_Develop/10_MMrules/13_Restriction_hideTemplates.md b/en/03_Developers/10_MMrules/13_Restriction_hideTemplates.md
similarity index 100%
rename from en/03_Develop/10_MMrules/13_Restriction_hideTemplates.md
rename to en/03_Developers/10_MMrules/13_Restriction_hideTemplates.md
diff --git a/en/03_Develop/10_MMrules/14_Restriction_requireFields.md b/en/03_Developers/10_MMrules/14_Restriction_requireFields.md
similarity index 100%
rename from en/03_Develop/10_MMrules/14_Restriction_requireFields.md
rename to en/03_Developers/10_MMrules/14_Restriction_requireFields.md
diff --git a/en/03_Develop/10_MMrules/15_Restriction_hideFields.md b/en/03_Developers/10_MMrules/15_Restriction_hideFields.md
similarity index 100%
rename from en/03_Develop/10_MMrules/15_Restriction_hideFields.md
rename to en/03_Developers/10_MMrules/15_Restriction_hideFields.md
diff --git a/en/03_Develop/10_MMrules/16_Restriction_ddReadonly.md b/en/03_Developers/10_MMrules/16_Restriction_ddReadonly.md
similarity index 100%
rename from en/03_Develop/10_MMrules/16_Restriction_ddReadonly.md
rename to en/03_Developers/10_MMrules/16_Restriction_ddReadonly.md
diff --git a/en/03_Develop/10_MMrules/21_Values_inherit.md b/en/03_Developers/10_MMrules/21_Values_inherit.md
similarity index 100%
rename from en/03_Develop/10_MMrules/21_Values_inherit.md
rename to en/03_Developers/10_MMrules/21_Values_inherit.md
diff --git a/en/03_Develop/10_MMrules/22_Values_default.md b/en/03_Developers/10_MMrules/22_Values_default.md
similarity index 100%
rename from en/03_Develop/10_MMrules/22_Values_default.md
rename to en/03_Developers/10_MMrules/22_Values_default.md
diff --git a/en/03_Develop/10_MMrules/23_Values_ddSetFieldValue.md b/en/03_Developers/10_MMrules/23_Values_ddSetFieldValue.md
similarity index 100%
rename from en/03_Develop/10_MMrules/23_Values_ddSetFieldValue.md
rename to en/03_Developers/10_MMrules/23_Values_ddSetFieldValue.md
diff --git a/en/03_Develop/10_MMrules/24_Values_synch_fields.md b/en/03_Developers/10_MMrules/24_Values_synch_fields.md
similarity index 100%
rename from en/03_Develop/10_MMrules/24_Values_synch_fields.md
rename to en/03_Developers/10_MMrules/24_Values_synch_fields.md
diff --git a/en/03_Develop/10_MMrules/31_Changing_renameField.md b/en/03_Developers/10_MMrules/31_Changing_renameField.md
similarity index 100%
rename from en/03_Develop/10_MMrules/31_Changing_renameField.md
rename to en/03_Developers/10_MMrules/31_Changing_renameField.md
diff --git a/en/03_Develop/10_MMrules/32_Changing_changeFieldHelp.md b/en/03_Developers/10_MMrules/32_Changing_changeFieldHelp.md
similarity index 100%
rename from en/03_Develop/10_MMrules/32_Changing_changeFieldHelp.md
rename to en/03_Developers/10_MMrules/32_Changing_changeFieldHelp.md
diff --git a/en/03_Develop/10_MMrules/41_Enhance_ddMultipleFields.md b/en/03_Developers/10_MMrules/41_Enhance_ddMultipleFields.md
similarity index 100%
rename from en/03_Develop/10_MMrules/41_Enhance_ddMultipleFields.md
rename to en/03_Developers/10_MMrules/41_Enhance_ddMultipleFields.md
diff --git a/en/03_Develop/10_MMrules/42_Enhance_ddSelectDocuments.md b/en/03_Developers/10_MMrules/42_Enhance_ddSelectDocuments.md
similarity index 100%
rename from en/03_Develop/10_MMrules/42_Enhance_ddSelectDocuments.md
rename to en/03_Developers/10_MMrules/42_Enhance_ddSelectDocuments.md
diff --git a/en/03_Develop/10_MMrules/43_Enhance_widget_tags.md b/en/03_Developers/10_MMrules/43_Enhance_widget_tags.md
similarity index 100%
rename from en/03_Develop/10_MMrules/43_Enhance_widget_tags.md
rename to en/03_Developers/10_MMrules/43_Enhance_widget_tags.md
diff --git a/en/03_Develop/10_MMrules/44_Enhance_widget_colors.md b/en/03_Developers/10_MMrules/44_Enhance_widget_colors.md
similarity index 100%
rename from en/03_Develop/10_MMrules/44_Enhance_widget_colors.md
rename to en/03_Developers/10_MMrules/44_Enhance_widget_colors.md
diff --git a/en/03_Develop/10_MMrules/51_Sections_ddCreateSection.md b/en/03_Developers/10_MMrules/51_Sections_ddCreateSection.md
similarity index 100%
rename from en/03_Develop/10_MMrules/51_Sections_ddCreateSection.md
rename to en/03_Developers/10_MMrules/51_Sections_ddCreateSection.md
diff --git a/en/03_Develop/10_MMrules/52_Sections_ddMoveFieldsToSection.md b/en/03_Developers/10_MMrules/52_Sections_ddMoveFieldsToSection.md
similarity index 100%
rename from en/03_Develop/10_MMrules/52_Sections_ddMoveFieldsToSection.md
rename to en/03_Developers/10_MMrules/52_Sections_ddMoveFieldsToSection.md
diff --git a/en/03_Develop/10_MMrules/53_Sections_hideSections.md b/en/03_Developers/10_MMrules/53_Sections_hideSections.md
similarity index 100%
rename from en/03_Develop/10_MMrules/53_Sections_hideSections.md
rename to en/03_Developers/10_MMrules/53_Sections_hideSections.md
diff --git a/en/03_Develop/10_MMrules/54_Sections_renameSection.md b/en/03_Developers/10_MMrules/54_Sections_renameSection.md
similarity index 100%
rename from en/03_Develop/10_MMrules/54_Sections_renameSection.md
rename to en/03_Developers/10_MMrules/54_Sections_renameSection.md
diff --git a/en/03_Develop/10_MMrules/55_Sections_minimizablesections.md b/en/03_Developers/10_MMrules/55_Sections_minimizablesections.md
similarity index 100%
rename from en/03_Develop/10_MMrules/55_Sections_minimizablesections.md
rename to en/03_Developers/10_MMrules/55_Sections_minimizablesections.md
diff --git a/en/03_Develop/10_MMrules/61_Tabs_createTab.md b/en/03_Developers/10_MMrules/61_Tabs_createTab.md
similarity index 100%
rename from en/03_Develop/10_MMrules/61_Tabs_createTab.md
rename to en/03_Developers/10_MMrules/61_Tabs_createTab.md
diff --git a/en/03_Develop/10_MMrules/62_Tabs_moveFieldsToTab.md b/en/03_Developers/10_MMrules/62_Tabs_moveFieldsToTab.md
similarity index 100%
rename from en/03_Develop/10_MMrules/62_Tabs_moveFieldsToTab.md
rename to en/03_Developers/10_MMrules/62_Tabs_moveFieldsToTab.md
diff --git a/en/03_Develop/10_MMrules/63_Tabs_hideTabs.md b/en/03_Developers/10_MMrules/63_Tabs_hideTabs.md
similarity index 100%
rename from en/03_Develop/10_MMrules/63_Tabs_hideTabs.md
rename to en/03_Developers/10_MMrules/63_Tabs_hideTabs.md
diff --git a/en/03_Develop/10_MMrules/64_Tabs_renameTab.md b/en/03_Developers/10_MMrules/64_Tabs_renameTab.md
similarity index 100%
rename from en/03_Develop/10_MMrules/64_Tabs_renameTab.md
rename to en/03_Developers/10_MMrules/64_Tabs_renameTab.md
diff --git a/en/03_Develop/10_MMrules/71_Maps_ddGMap.md b/en/03_Developers/10_MMrules/71_Maps_ddGMap.md
similarity index 100%
rename from en/03_Develop/10_MMrules/71_Maps_ddGMap.md
rename to en/03_Developers/10_MMrules/71_Maps_ddGMap.md
diff --git a/en/03_Develop/10_MMrules/72_Maps_ddYMap.md b/en/03_Developers/10_MMrules/72_Maps_ddYMap.md
similarity index 100%
rename from en/03_Develop/10_MMrules/72_Maps_ddYMap.md
rename to en/03_Developers/10_MMrules/72_Maps_ddYMap.md
diff --git a/en/03_Develop/10_MMrules/81_Misc_widget_showimagetvs.md b/en/03_Developers/10_MMrules/81_Misc_widget_showimagetvs.md
similarity index 100%
rename from en/03_Develop/10_MMrules/81_Misc_widget_showimagetvs.md
rename to en/03_Developers/10_MMrules/81_Misc_widget_showimagetvs.md
diff --git a/en/03_Develop/10_MMrules/82_Misc_ddResizeImage.md b/en/03_Developers/10_MMrules/82_Misc_ddResizeImage.md
similarity index 100%
rename from en/03_Develop/10_MMrules/82_Misc_ddResizeImage.md
rename to en/03_Developers/10_MMrules/82_Misc_ddResizeImage.md
diff --git a/en/03_Develop/10_MMrules/83_Misc_ddAutoFolders.md b/en/03_Developers/10_MMrules/83_Misc_ddAutoFolders.md
similarity index 100%
rename from en/03_Develop/10_MMrules/83_Misc_ddAutoFolders.md
rename to en/03_Developers/10_MMrules/83_Misc_ddAutoFolders.md
diff --git a/en/03_Develop/10_MMrules/84_Misc_ddFillMenuindex.md b/en/03_Developers/10_MMrules/84_Misc_ddFillMenuindex.md
similarity index 100%
rename from en/03_Develop/10_MMrules/84_Misc_ddFillMenuindex.md
rename to en/03_Developers/10_MMrules/84_Misc_ddFillMenuindex.md
diff --git a/en/03_Develop/10_MMrules/85_Misc_widget_accessdenied.md b/en/03_Developers/10_MMrules/85_Misc_widget_accessdenied.md
similarity index 100%
rename from en/03_Develop/10_MMrules/85_Misc_widget_accessdenied.md
rename to en/03_Developers/10_MMrules/85_Misc_widget_accessdenied.md
diff --git a/en/03_Develop/10_MMrules/86_Misc_ddHTMLCleaner.md b/en/03_Developers/10_MMrules/86_Misc_ddHTMLCleaner.md
similarity index 100%
rename from en/03_Develop/10_MMrules/86_Misc_ddHTMLCleaner.md
rename to en/03_Developers/10_MMrules/86_Misc_ddHTMLCleaner.md
diff --git "a/en/03_Develop/10_MMrules/91_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 php \320\262 mm_rules.md" "b/en/03_Developers/10_MMrules/91_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 php \320\262 mm_rules.md"
similarity index 100%
rename from "en/03_Develop/10_MMrules/91_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 php \320\262 mm_rules.md"
rename to "en/03_Developers/10_MMrules/91_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 php \320\262 mm_rules.md"
diff --git a/en/03_Develop/10_MMrules/99_Module_ddMMEditor.md b/en/03_Developers/10_MMrules/99_Module_ddMMEditor.md
similarity index 100%
rename from en/03_Develop/10_MMrules/99_Module_ddMMEditor.md
rename to en/03_Developers/10_MMrules/99_Module_ddMMEditor.md
diff --git a/en/03_Develop/10_MMrules/index.md b/en/03_Developers/10_MMrules/index.md
similarity index 100%
rename from en/03_Develop/10_MMrules/index.md
rename to en/03_Developers/10_MMrules/index.md
diff --git a/en/03_Developers/11_PhpStorm_Interaction.md b/en/03_Developers/11_PhpStorm_Interaction.md
new file mode 100644
index 00000000..26b4efdf
--- /dev/null
+++ b/en/03_Developers/11_PhpStorm_Interaction.md
@@ -0,0 +1,63 @@
+This instruction will help you configure IDE [PhpStorm](https://jetbrains.com/phpstorm/) in such a way that Blade directives have correct highlighting when working with the program code of the site.
+
+> **Note**
+> When using the [Laravel Idea](https://laravel-idea.com/) plugin, all Blade directives are added automatically. But Evolution CMS has certain Blade directives not supplied by PhpStorm Laravel Idea plugin.
+
+## PhpStorm extension
+
+1. In PhpStorm, open Preferences and go to PHP -> Blade (File | Settings | PHP | Blade).
+2. Uncheck "Use default settings" and then click the "Directives" tab.
+3. Add new directives.
+
+## Blade directives for Evolution CMS
+
+This list contains only those Blade directives registered with Evolution CMS. To add other directives you may need, refer to the relevant instructions.
+
+### @makeUrl()
+
+The directive `@makeUrl($id)` in the Blade template corresponds to the `UrlProcessor::makeUrl($id);` method call in the PHP code.
+
+Accepts only one argument - resource ID.
+
+#### makeUrl
+
+* Has parameter = YES
+* Prefix: makeUrlWithString(
+* Suffix: );?>
+
+### @evoRole()
+
+The `@evoRole($role)` directive in the Blade template is responsible for displaying content depending on the user's role.
+
+Accepts only one argument - the role key, or nothing.
+
+#### evoRole
+
+* Has parameter = YES
+* Prefix:
+
+#### evoElseRole
+
+* Has parameter = YES
+* Prefix:
+
+#### evoEndRole
+
+* Has parameter = NO
+* Prefix: empty
+* Suffix: empty
+
+### evoConfig
+
+The `@evoConfig($name, $default)` directive in the Blade template corresponds to the `evo()->getConfig($name, $default);` method call in PHP code.
+
+Takes one or two arguments:
+
+- The first argument (required) is the name of the configuration.
+- The second argument (optional) is the value if the config returned nothing.
+
+* Has parameter = YES
+* Prefix: getConfig(
+* Suffix: , "");?>
diff --git a/en/03_Developers/index.md b/en/03_Developers/index.md
new file mode 100644
index 00000000..07e1efbf
--- /dev/null
+++ b/en/03_Developers/index.md
@@ -0,0 +1 @@
+Under Construction!
diff --git a/en/04_Extras/Combacart/index.md b/en/04_Extras/Combacart/index.md
new file mode 100644
index 00000000..b838f57d
--- /dev/null
+++ b/en/04_Extras/Combacart/index.md
@@ -0,0 +1,237 @@
+## Repository ##
+https://github.com/zatomant/combacart
+
+## Capabilities ##
+Using CombaCart, you can create a full-featured online store or marketplace (multiple Sellers on one website) based on EVO 1.4+ or Evolution CMS 3.+, and manage customer Orders.
+
+Important: for editing extended product properties, use separate plugins or modules (multiTV and similar)
+
+For Buyer:
+- viewing, adding and editing Products in Cart, and further checkout of Cart into customer Order
+- Order Tracking and Payment page
+- Nova Poshta shipment tracking
+- QR code with payment details
+- online payment through LiqPay or monobank
+- viewing Order history (personal cabinet). User registration and authorization should be done using Evolution CMS tools or through a specialized plugin, for example HybridAuth.
+- multilingual support: Ukrainian, English.
+
+For Manager:
+- managing customer Orders on a separate page, by default //your_site/comba
+- viewing, editing, changing processing statuses and printing Orders
+- sending text messages via email, SMS, text for messengers.
+
+For Administrator:
+- automatic removal of Product from Carts if "Available for order" is removed from the product (editing Product page in admin panel (evo))
+- for each product you can assign its own Seller
+- Seller is a separate legal entity or individual entrepreneur with their own settings.
+- when checking out Cart, several Orders will be automatically formed if Products in the cart are from different Sellers (optional)
+- if Buyer made a payment on the site, callback from payment service will be processed, and order status will be changed to "Notified about payment"
+
+
+## Minimum Technical Configuration ##
+
+PHP 7.4 and higher
+
+Composer
+
+EVO CMS 1.4+ [Evolution CMS 1.4](https://github.com/evolution-cms/evolution/tree/1.4.x)
+or
+Evolution CMS 3.+ [Evolution CMS 3](https://github.com/evolution-cms/evolution/tree/3.2.x)
+
+
+## Installation ##
+
+For new installation, I recommend using the CombaCart extras package, which is prepared as a file for the Extras module in Evolution CMS.
+To learn details, go to the CombaCart extras page [combacart-extras](https://github.com/zatomant/combacart-extras)
+
+## Updating CombaCart ##
+
+**Option 1 - Automatically through browser**:
+open in browser the page
+```
+your_site/assets/plugins/combacart/update/
+```
+
+**Option 2 - Automatically through web server console**:
+execute in console
+```
+cd _root_directory_of_your_site_/assets/plugins/combacart/update/
+
+php process.php
+```
+_Options 1 and 2 for automatic update operation require removal of the blocking file in the /combacart/update/ directory_.
+
+
+**Option 3 - Manual file update**:
+- download the latest CombaCart release [github.com](https://github.com/zatomant/combacart) and overwrite files in /assets/plugins/combacart
+- in the /assets/plugins/combacart directory execute **composer update** to update dependencies
+
+The composer.json file contains a list of components used in CombaCart.
+You can remove unnecessary dependencies at your discretion and modify templates as needed.
+
+
+## Configuration ##
+
+I recommend setting your own "secret" in the file /assets/custom/Config/secret.php or in the .env file of your environment variables.
+Otherwise the secret will be formed automatically and its value will depend on server settings.
+
+**file /src/Config/**
+* contains default marketplace settings. don't change anything in this directory.
+
+**directory /assets/custom/Config/**
+* contains files with your overridden settings according to [Settings Update Rules](https://github.com/zatomant/combacart/docs/override_settings.md)
+* for example, place here your marketplace settings and authentication data for third-party services:
+ - Nova Poshta (*as of May 2025, for Nova Poshta shipment tracking you may not need to use API key*)
+ - LiqPay
+ - monobank (currently requires callback testing)
+ - SMS provider AlphaSMS
+ - and others
+
+
+**file /src/Bundle/Standalone/Server.php**
+* contains the class of standalone local Comba server for Order management:
+1. marketplace() method
+ - returns general online store settings
+
+2. sellers() method
+ - returns data about Sellers (public data)
+ - Sellers besides main parameters contain links to Payment Recipients
+
+3. payee() method
+ - returns Payment Recipients data
+ - Payment Recipients are legal entities or individual entrepreneurs with payment options they support
+
+4. delivery() method
+ - returns list of delivery options
+
+5. payment() method
+ - returns list of payment options
+
+
+
+## First Steps After Installation and Configuration Completion ##
+
+1. Optional step, but it makes things easier.
+ On the Evolution CMS administration page open `Configuration -> Friendly URLs and disable "Use nested URLs"`
+ Use nested URLs: No
+
+2. When installing via Extras [combacart-extras](https://github.com/zatomant/combacart-extras) the necessary elements will be automatically created (otherwise you'll have to create them manually), namely:
+
+ * template for Product Page goods_tmplt
+ * template for Checkout page checkout_tmplt
+ * template for other pages blank_tmplt
+
+ * tv
+ - goods_avail flag whether product is available for order
+ - goods_code product article (sku)
+ - goods_price product price
+ - goods_price_old old product price
+ - goods_weight product weight
+ - goods_isnewproduct "new product" flag
+ - goods_isondemand "product on demand" flag
+ - goods_seller Product Seller
+ - goods_inbalances flag for product dependency on stock
+ - goods_images contains list of images, details about [Images](https://github.com/zatomant/combacart/docs/images.md)
+ - goods_goods contains list of product types (optional), uses multiTV
+
+ * snippets:
+ - CombaHeader
+ - CombaFooter
+ - CombaHelper
+ - CombaFunctions
+
+ * plugin CombaHelper
+
+3. Create a new page (document), assign it the goods_tmplt template.
+ This will be your first product.
+ Product code (article) must be unique within the page (document) context.
+ Details [Products](/docs/product.md)
+
+4. Create a page with alias checkout and assign it the checkout_tmplt template
+ This will be the Checkout page.
+ If using a different alias, then override 'PAGE_CHECKOUT'
+
+5. Optional: create a page with alias tnx to which the Buyer will be redirected after creating an order.
+ If using a different alias, then override 'PAGE_TNX'
+ In the absence of such a page, the modx event 'OnPageNotFound' will be intercepted and processed
+
+6. Create a page with alias cabinet, assign the blank_tmplt template and insert into the resource content ```[!CombaFunctions? &fnct=`cabinet`!]```
+ Details [Buyer Personal Cabinet](https://github.com/zatomant/combacart/docs/cabinet.md)
+
+7. Optional: create a page with alias t - this will be the order tracking page.
+ Details [Order Tracking](https://github.com/zatomant/combacart/docs/tracking.md)
+
+8. Optional: create a page with alias p - this will be the page with order payment options.
+ Details [Order Payment](https://github.com/zatomant/combacart/docs/payment.md)
+
+
+
+## Order Processing ##
+
+After the Buyer has formed an Order (Cart with products sent for processing by Marketplace managers), it can be viewed on the management page.
+Any user with 'manager' role who has passed authorization through the EVO administrative page (http(s)://your_site/manager) has access to the page.
+After authorization, open the order management page at http(s)://site_name/comba
+On the page you can:
+- view the list of orders for any time period
+- search orders by number, Customer and their email
+- edit orders
+- print orders
+- send emails, SMS messages and generate texts for further use in messengers.
+
+There is a possibility to change language and interface theme.
+
+
+## Dependencies and Configuration Requirements ##
+
+0. if you get error Class 'IntlDateFormatter' not found
+ install and activate php_intl extension
+
+1. **twig** (required) https://twig.symfony.com/
+ *available in composer.json
+ CombaCart uses twig for templates (after data processing by Modx/Evo parser)
+
+2. **boostrap, bootstrap-icon** (required, optional) https://getbootstrap.com/
+ *available in composer.json
+ CombaCart layout is based on Bootstrap 5
+ if you have an existing bootstrap copy, change the paths to your bootstrap in the snippetGoodsFooter.php file
+
+3. bootbox.js (optional) [bootboxjs](https://github.com/bootboxjs/bootbox)
+ *available in installation package
+ for working with bootstrap dialog forms
+
+4. ~~phpthumb~~
+ decided to abandon this in favor of the more actively updated Intervention/image
+
+5. Intervention\Image (required) [github](https://github.com/Intervention/image)
+ *available in composer.json
+ if you use a different image processor than phpthumb, modify the ModxImage class for your needs.
+
+6. multiTV (optional) [multiTV](https://github.com/extras-evolution/multiTV)
+ *installed with extras
+ - used for image lists in TV goods_images. instead of lists you can use TV goods_images as "string" for one image
+ - used for product subtype lists in TV goods_goods
+
+ To fix the error with image property editing window positioning after multiTV installation
+ replace in file assets/tvs/multitv/css/colorbox.css
+ line 5
+ ```#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z1-index:9999; overflow:hidden;}```
+ with this
+ ```#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; overflow:hidden;}```
+
+7. cropper.js (optional, multiTV component)
+ *available in CombaCart extras installation package
+ Description for cropper setup [multiTV](https://github.com/extras-evolution/multiTV)
+ used together with multiTV for image lists
+
+8. venobox (optional) [VenoBox](https://github.com/nicolafranchini/VenoBox)
+ *available in installation package
+ used for working with image dialog forms
+
+9. reCaptcha (optional)
+ enter your keys for 'reCaptcha' provider in the override file /assets/custom/Config/provider.php if you want to use captcha when checking order placement
+
+
+## Other ##
+
+By default, to support multilingualism on the site and in the order management panel, a built-in "translator" is used.
+Details about [Multilingualism in templates](https://github.com/zatomant/combacart/docs/template.md)
diff --git "a/en/04_Extras/Commerce/01_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.md" "b/en/04_Extras/Commerce/01_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.md"
new file mode 100644
index 00000000..610d69cd
--- /dev/null
+++ "b/en/04_Extras/Commerce/01_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.md"
@@ -0,0 +1,24 @@
+## Параметры сниппета ##
+
+Настройки расположены в разделе "Конфигурация" плагина Commerce.
+
+* Page ID for redirect after successfull payment - Идентификатор страницы для перенаправления после успешной оплаты
+* Page ID for redirect after payment error - Идентификатор страницы для перенаправления после ошибки оплаты
+* Status ID after payment - Идентификатор статуса после оплаты
+* Product templates IDs - Идентификаторы шаблонов продуктов
+* Product title field name - Название поля названия продукта
+* Product price field name - Название поля цены товара
+* Chunk name for status change notification - Имя чанка для уведомления об изменении статуса
+* Chunk name for order paid notification - Название чанка для заказа оплаченного уведомления
+* Email notifications recipient - Получатель уведомлений по электронной почте
+* Default payment code - Код оплаты по умолчанию
+* Default delivery code - Код доставки по умолчанию
+
+
+
+
+
+
+
+
+
diff --git "a/en/04_Extras/Commerce/02_\320\232\320\276\321\200\320\267\320\270\320\275\320\260 \320\267\320\260\320\272\320\260\320\267\320\276\320\262.md" "b/en/04_Extras/Commerce/02_\320\232\320\276\321\200\320\267\320\270\320\275\320\260 \320\267\320\260\320\272\320\260\320\267\320\276\320\262.md"
new file mode 100644
index 00000000..11de8046
--- /dev/null
+++ "b/en/04_Extras/Commerce/02_\320\232\320\276\321\200\320\267\320\270\320\275\320\260 \320\267\320\260\320\272\320\260\320\267\320\276\320\262.md"
@@ -0,0 +1,124 @@
+
+Корзина вызывается на всех страницах, где необходима работа магазина -- добавление, редактирование и удаление товаров.
+
+**Совет:** корзина - это обёртка для сниппета DocLister и в ней работают практически все его параметры.
+
+**Как это может пригодиться?**
+Скажем, вы хотите показывать в корзине фотографию товара. Пускай она хранится в ТВ с именем `mainphoto`. Как и в DocLister, вам необходимо указать сниппету, что в выборку включается это тв при помощи параметра `&tvList=mainphoto`.
+
+## Пример вызова ##
+
+```
+[!Cart
+ &instance=`products`
+ &theme=``
+ &tpl=`tpl`
+ &optionsTpl=`optionsTpl`
+ &ownerTPL=`ownerTPL`
+ &subtotalsRowTpl=`subtotalsRowTpl`
+ &subtotalsTpl=`subtotalsTpl`
+!]
+```
+
+## Примеры чанков ##
+Больше примеров вы можете найти в папке
+```
+assets/plugins/commerce/templates/front/
+```
+
+###ownerTPL###
+
+Шаблон обёртки корзины
+
+```
+
+```
+Совет: для вывода различных шаблонов пустой или полной корзины вы можете воспользоваться любым сниппетом, который сможет проверить плейсхолдер `[+count+]`:
+```
+[[if? &is=`[+count+]:>:0` &then=`ШАБЛОН ПОЛНОЙ КОРЗИНЫ`
+&else=`ШАБЛОН ПУСТОЙ КОРЗИНЫ`]]
+```
+
+###tpl###
+
+Шаблон одного товара в корзине
+```
+
+
+```
+
+###subtotalsTpl###
+
+Обёртка для доп. опций типа "Доставка"
+```
+[+wrap+]
+
+```
+
+###subtotalsRowTpl###
+
+Один пункт в доп. опциях
+
+```
+
+
[+title+]:
+
[[PriceFormat? &price=`[+price+]` &convert=`0`]]
+
+
+```
\ No newline at end of file
diff --git "a/en/01_Info/10_More/05_\320\242\321\200\320\265\320\261\320\276\320\262\320\260\320\275\320\270\321\217_\320\272_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md" "b/en/04_Extras/Commerce/03_\320\240\320\260\320\267\320\274\320\265\321\202\320\272\320\260 \321\202\320\276\320\262\320\260\321\200\320\260.md"
similarity index 100%
rename from "en/01_Info/10_More/05_\320\242\321\200\320\265\320\261\320\276\320\262\320\260\320\275\320\270\321\217_\320\272_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md"
rename to "en/04_Extras/Commerce/03_\320\240\320\260\320\267\320\274\320\265\321\202\320\272\320\260 \321\202\320\276\320\262\320\260\321\200\320\260.md"
diff --git "a/en/04_Extras/Commerce/04_\320\236\320\277\320\273\320\260\321\202\320\260_\320\267\320\260\320\272\320\260\320\267\320\260.md" "b/en/04_Extras/Commerce/04_\320\236\320\277\320\273\320\260\321\202\320\260_\320\267\320\260\320\272\320\260\320\267\320\260.md"
new file mode 100644
index 00000000..895f7a23
--- /dev/null
+++ "b/en/04_Extras/Commerce/04_\320\236\320\277\320\273\320\260\321\202\320\260_\320\267\320\260\320\272\320\260\320\267\320\260.md"
@@ -0,0 +1 @@
+Оплата заказов в магазине
diff --git "a/en/04_Extras/Commerce/05_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260.md" "b/en/04_Extras/Commerce/05_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260.md"
new file mode 100644
index 00000000..b2acc229
--- /dev/null
+++ "b/en/04_Extras/Commerce/05_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\270\320\265 \320\267\320\260\320\272\320\260\320\267\320\260.md"
@@ -0,0 +1,14 @@
+Оформление заказа
+
+### Пример ###
+```
+[!Order
+ &formTpl=`formTpl`
+ &deliveryTpl=`deliveryTpl`
+ &deliveryRowTpl=`deliveryRowTpl`
+ &paymentsTpl=`paymentsTpl`
+ &paymentsRowTpl=`paymentsRowTpl`
+ &reportTpl=`reportTpl`
+ &ccSenderTpl=`ccSenderTpl`
+!]
+```
\ No newline at end of file
diff --git a/en/04_Extras/Commerce/index.md b/en/04_Extras/Commerce/index.md
new file mode 100644
index 00000000..c585d9f1
--- /dev/null
+++ b/en/04_Extras/Commerce/index.md
@@ -0,0 +1,50 @@
+Программный комплекс для создания интернет-магазина на базе Evolution CMS.
+
+## Установка ##
+* Скачать архив со страницы репозитория https://github.com/mnoskov/commerce
+* Зайти в админ-панель Evolution CMS
+* Нажать "Модуль-Extras", выбрать "Установка из архива:" и далее следовать инструкциям.
+
+## Что для чего? ##
+После установки вы увидите несколько установленных дополнений. Давайте разберёмся, какое из них за что отвечает.
+
+
+
Плагин Commerce - это основной плагин необходимый для работы всего дополнения. Обратите внимание, что в разделе "Конфигурация" плагин имеет множество настроек.
+
Модуль управления заказами (Commerce) - модуль внутри админ-панели (Модули -> Commerce). Нужен для отслеживания заказов, их статусов и просмотра подробностей о каждом конкретном заказе.
+
Плагины
+ Обратите внимание - часть плагинов отключена. Также после включения проверьте, отмечены ли нужные плагину события в разделе "Системные события".
+
+
Delivery Fixed - Простая доставка
+
Delivery Pickup - Pickup
+
Discount example - Пример скидки
+
Payment OnDelivery - Оплата при получении
+
несколько плагинов для обработки платежей:
+ - Payment Paykeeper
+ - Payment Paymaster
+ - Payment Robokassa
+ - Payment Sberbank
+ - Payment Yandexkassa
+
+
+
+
+
+## Принципы работы ##
+
+---
+
+### Покупка ###
+На каждой странице, где осуществляется покупка, должен быть вызван сниппет Cart. Именно он будет отображать корзину и он же отвечает за добавление в неё товаров.
+
+Подробнее о разметке корзины смотрите в материале "Корзина заказов".
+
+Для добавления товара в корзину вёрстка каждого товара должна быть соответствующим образом модифицирована.
+
+Подробнее о разметке товаров смотрите в материале "Разметка товара".
+
+### Оформление заказа ###
+
+Подробнее смотрите на странице "Оформление заказа".
+
+### Оплата заказа ###
+Подробнее смотрите на странице "Оплата заказа".
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/01_Description.md b/en/04_Extras/DLBuildMenu/01_Description.md
new file mode 100644
index 00000000..4acccc54
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/01_Description.md
@@ -0,0 +1,29 @@
+## DLBuildMenu:
+
+### Brief Description
+Brief description of the DLBuildMenu snippet - for displaying the site menu on Evolution CMS.
+
+DLBuildMenu is a snippet for displaying the site menu on Evolution CMS. Built on the basis of DocLister, in fact it is a snippet wrapper with a call to DocLister inside - so it can use almost all the parameters and chips of the DocLister itself.
+
+By applying prepare, we get unlimited possibilities of data preparation. And the developed template system of DocLister, supplemented in DLBuildMenu with new parameters, gives in my hands, in my opinion, even an excessively rich toolkit.
+
+### Dependencies and requirements
+* For DLBuildMenu to work, you must have DocLister installed (available in recent releases of MODx Evo by default).
+* Requires PHP 5.3 or later.
+
+### Installation
+* DLBuildMenu is included by default in the new custom assembly MODx Evo 1.2.1-d9.1.2 from 21.03.2017.
+* On older custom builds and on the official build, to install it, you need to install or reinstall the DockLister from Extras, while you need DLBuildMenu to be marked with a check mark in the list during installation.
+
+### Files
+* assets/snippets/DocLister/snippet. DLBuildMenu.php
+* assets/snippets/DocLister/lib/DLFixedPrepare.class.php (buildMenu method)
+
+### Advantages of DLBuildMenu
+* it is possible to use prepare to process data before output.
+* a wide range of ways to set templates, including inline templates.
+* sorting by TV-parameters with conversion to the desired type.
+* can filter by TV parameters.
+* you can come up with and set your own parameters and process them in prepare.
+
+In addition, DLBuildMenu has other chips from the DocLister arsenal, which I will not describe here, for this you need to study the DL itself.
diff --git "a/en/04_Extras/DLBuildMenu/01_\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265.md" "b/en/04_Extras/DLBuildMenu/01_\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265.md"
deleted file mode 100644
index 97e4ef1b..00000000
--- "a/en/04_Extras/DLBuildMenu/01_\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265.md"
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
DLBuildMenu: Краткое описание
-Краткое описание cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
DLBuildMenu – сниппет для вывода меню сайта на Evolution CMS. Построен на основе ДокЛистера, по сути это сниппет-обертка с вызовом DocLister внутри – поэтому в нём можно использовать практически все параметры и фишки самого DocLister.
-
Применяя prepare, мы получаем неограниченные возможности подготовки данных. А развитая система шаблонизации ДокЛистер, дополненная в DLBuildMenu новыми параметрами, даёт в руки, на мой взгляд, даже чрезмерно богатый инструментарий.
-
Зависимости и требования
-
-
Для работы DLBuildMenu у вас должен быть установлен DocLister (есть в последних релизах MODx Evo по умолчанию).
-
Требуется PHP не ниже версии 5.3.
-
-
Установка
-
-
DLBuildMenu входит по умолчанию в новую кастомную сборку MODx Evo 1.2.1-d9.1.2 от 21.03.2017.
-
На более старых кастомных сборках и на официальной сборке для его установки нужно установить или переустановить ДокЛистер из Extras, при этом нужно, чтобы DLBuildMenu был отмечен галочкой в списке при установке.
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/02_Parameters.md b/en/04_Extras/DLBuildMenu/02_Parameters.md
new file mode 100644
index 00000000..7dae0645
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/02_Parameters.md
@@ -0,0 +1,48 @@
+## DLBuildMenu:
+### Basiic Parameters
+Basic parameters of the DLBuildMenu snippet - to display the site menu on Evolution CMS.
+#### &idType (hardcoded)
+The sample type is similar to DocLister.
+
+Possible values are: parents
+
+Note: The value of the &idType parameter is hard-coded as parents.
+
+#### &parents
+The parent (start) folder.
+
+The possible values are parent ID, or a comma-separated list of parent IDs.
+
+The default value is: 0
+
+Note: Note that in DLBuildMenu, the default value of &parents is 0, which means "output starting from the site root". This is different from the default value of the &parents parameter in DockLister.
+
+#### ¤tDepth
+Initial nesting level (depth).
+
+The possible values are an integer of 1 or greater.
+
+The default value is: 1
+
+#### &maxDepth
+Max. depth
+
+The possible values are an integer of 1 or greater.
+
+The default value is: 5
+
+#### &BeforePrepare and &AfterPrepare
+Data processing through prepare is similar to DocLister.
+
+Possible values: set according to The DockLister's rules. They can be a list of snippet names and method calls rather than loaded classes, or an anonymous function.
+
+Note: For prepare, DLBuildMenu already has a built-in mandatory call to DLFixedPrepare::buildMenu. Handlers from &BeforePrepare are called before the built-in call, from &AfterPrepare after the built-in call.
+
+#### &activeClass
+The CSS class of the active (current) menu item and its parent elements of all levels.
+
+Possible notations: The name of the CSS class, or multiple CSS class names specified as in the HTML tag (with a space).
+
+Default value: active
+
+Note: This CSS class and this parameter exist in addition to the first, last, odd, even, and current classes already in Docklister and their corresponding parameters (see the DocLIster documentation).
diff --git "a/en/04_Extras/DLBuildMenu/02_\320\221\320\260\320\267\320\276\320\262\321\213\320\265 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/en/04_Extras/DLBuildMenu/02_\320\221\320\260\320\267\320\276\320\262\321\213\320\265 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
deleted file mode 100644
index 3682279b..00000000
--- "a/en/04_Extras/DLBuildMenu/02_\320\221\320\260\320\267\320\276\320\262\321\213\320\265 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
DLBuildMenu: Базовые параметры
-Базовые параметры cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
&idType (hardcoded)
-
Тип выборки аналогично DocLister.
-
Возможные значения: parents
-
Примечание: значение параметра &idType жестко записано в коде как parents.
-
&parents
-
Родительская (начальная) папка.
-
Возможные значения: ID родителя, либо список ID родителей через запятую.
-
Значение по умолчанию: 0
-
Примечание: Обратите внимание, что в DLBuildMenu значение &parents по умолчанию равно 0, что означает «выводить начиная с корня сайта». Это отличается от дефолтного значения &parents параметра в ДокЛистере.
-
¤tDepth
-
Исходный уровень вложенности (глубина).
-
Возможные значения: целое число от 1 и больше.
-
Значение по умолчанию: 1
-
&maxDepth
-
Макс. глубина
-
Возможные значения: целое число от 1 и больше.
-
Значение по умолчанию: 5
-
&BeforePrepare и &AfterPrepare
-
Обработка данных через prepare аналогично DocLister.
-
Возможные значения: задаются по правилам ДокЛистера. Могут быть списком имен сниппетов и вызовов методов ренее загруженных классов, либо анонимной функцией.
-
Примечание: для prepare в DLBuildMenu уже имеется встроенный обязательный вызов DLFixedPrepare::buildMenu. Обработчики из &BeforePrepare вызываются перед встроенным, из &AfterPrepare - после встроенного вызова.
-
&activeClass
-
CSS-класс активного (текущего) пункта меню и его родительских элементов всех уровней.
-
Возможные значиения: Имя CSS-класса, или несколько имён CSS-классов, заданные как в HTML-теге (через пробел).
-
Значение по умолчанию: active
-
Примечание: этот CSS-класс и этот параметр существуют в дополнение к уже имеющимся в ДокЛистере классам first, last, odd, even и current и соответствующим параметрам для них (см. документацию по DocLIster).
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/03_Parameter_Sorting.md b/en/04_Extras/DLBuildMenu/03_Parameter_Sorting.md
new file mode 100644
index 00000000..9ae63a92
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/03_Parameter_Sorting.md
@@ -0,0 +1,18 @@
+## DLBuildMenu: Collation
+Sorting parameters of the DLBuildMenu snippet - to display the site menu on Evolution CMS.
+
+### &orderBy
+Sorting conditions for documents of all levels
+
+Possible values: set as in DocLister (according to mySQL rules for ORDER BY).
+
+Default value: menuindex ASC, id ASC
+
+### &orderByN
+Document sorting criteria of the Nth nesting level, for the corresponding levels & orderBy takes precedence over &orderBy.
+
+The possible values are set according to the MySQL rules for ORDER BY.
+
+Default value: None
+
+Note: If &orderByN is not specified, &orderBy is used for all levels.
diff --git "a/en/04_Extras/DLBuildMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\201\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\276\320\272.md" "b/en/04_Extras/DLBuildMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\201\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\276\320\272.md"
deleted file mode 100644
index 328acdc7..00000000
--- "a/en/04_Extras/DLBuildMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213 \321\201\320\276\321\200\321\202\320\270\321\200\320\276\320\262\320\276\320\272.md"
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
DLBuildMenu: Параметры сортировки
-Параметры сортировки cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
&orderBy
-
Условия сортировки документов всех уровней
-
Возможные значения: задаются как в DocLister (по правилам MySQL для ORDER BY).
-
Значение по умолчанию: menuindex ASC, id ASC
-
&orderByN
-
Условия сортировки документов N-го уровня вложенности, для соответствующих уровней &orderBy имеет приоритет над &orderBy.
-
Возможные значения: задаются по правилам MySQL для ORDER BY.
-
Значение по умолчанию: нет
-
Примечание: Если &orderByN не задан, для всех уровней используется &orderBy.
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/04_TV_Parameters.md b/en/04_Extras/DLBuildMenu/04_TV_Parameters.md
new file mode 100644
index 00000000..3a4bc8b0
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/04_TV_Parameters.md
@@ -0,0 +1,17 @@
+## DLBuildMenu: TV List Options
+Parameters "TV List" of the DLBuildMenu snippet - to display the site menu on Evolution CMS.
+### &tvList
+A list of TV parameters that are involved in the sample (as in DocLister).
+
+The possible values are a comma-separated list of TV parameter names.
+
+Default value: None
+
+### &tvListN
+The list of TV parameters in the selection for the Nth nesting level, for the corresponding levels & tvListN takes precedence over &tvList.
+
+The possible values are a comma-separated list of TV parameter names.
+
+Default: Empty.
+
+Note: If &tvListN is not specified, &tvList is used for all levels.
diff --git "a/en/04_Extras/DLBuildMenu/04_\320\241\320\277\320\270\321\201\320\276\320\272 \320\242\320\222.md" "b/en/04_Extras/DLBuildMenu/04_\320\241\320\277\320\270\321\201\320\276\320\272 \320\242\320\222.md"
deleted file mode 100644
index a190f1b4..00000000
--- "a/en/04_Extras/DLBuildMenu/04_\320\241\320\277\320\270\321\201\320\276\320\272 \320\242\320\222.md"
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
DLBuildMenu: Параметры «Список TV»
-Параметры «Список TV» cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
&tvList
-
Список TV-параметров, которые участвуют в выборке (как в DocLister).
-
Возможные значения: список имён TV-параметров через запятую.
-
Значение по умолчанию: нет
-
&tvListN
-
Список TV-параметров в выборке для N-го уровня вложенности, для соответствующих уровней &tvListN имеет приоритет над &tvList.
-
Возможные значения: список имён TV-параметров через запятую.
-
По умолчанию: пусто.
-
Примечание: Если &tvListN не задан, для всех уровней используется &tvList.
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/05_Sampling_Conditions.md b/en/04_Extras/DLBuildMenu/05_Sampling_Conditions.md
new file mode 100644
index 00000000..d5cecf97
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/05_Sampling_Conditions.md
@@ -0,0 +1,17 @@
+## DLBuildMenu: Sampling Condition Settings
+Parameters of DLBuildMenu snippet selection criteria - to display the site menu on Evolution CMS.
+### &addWhereList
+Document selection criteria for all levels.
+
+Possible values: set as in DocLister (according to MySQL rules for the WHERE condition).
+
+The default value is: c.hidemenu = 0
+
+### &addWhereListN
+The sampling criteria for N-th level documents for the corresponding levels &addWhereListN takes precedence over &addWhereList.
+
+Possible values: Specified by MySQL rules for the WHERE condition.
+
+Default value: None
+
+Note: If &addWhereListN is not specified, &addWhereList is used for all tiers.
diff --git "a/en/04_Extras/DLBuildMenu/05_\320\243\321\201\320\273\320\276\320\262\320\270\321\217 \320\262\321\213\320\261\320\276\321\200\320\272\320\270.md" "b/en/04_Extras/DLBuildMenu/05_\320\243\321\201\320\273\320\276\320\262\320\270\321\217 \320\262\321\213\320\261\320\276\321\200\320\272\320\270.md"
deleted file mode 100644
index 363311fb..00000000
--- "a/en/04_Extras/DLBuildMenu/05_\320\243\321\201\320\273\320\276\320\262\320\270\321\217 \320\262\321\213\320\261\320\276\321\200\320\272\320\270.md"
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
DLBuildMenu: Параметры условий выборки
-Параметры условий выборки cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
&addWhereList
-
Условия выборки документов для всех уровней.
-
Возможные значения: задаются как в DocLister (по правилам MySQL для условия WHERE).
-
Значение по умолчанию: c.hidemenu = 0
-
&addWhereListN
-
Условия выборки документов N-го уровня, для соответствующих уровней &addWhereListN имеет приоритет над &addWhereList.
-
Возможные значения: задаются по правилам MySQL для условия WHERE.
-
Значение по умолчанию: нет
-
Примечание: Если &addWhereListN не задан, для всех уровней используется &addWhereList.
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/06_Placeholders.md b/en/04_Extras/DLBuildMenu/06_Placeholders.md
new file mode 100644
index 00000000..53d282b4
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/06_Placeholders.md
@@ -0,0 +1,36 @@
+## DLBuildMenu: Placeholders
+DLBuildMenu snippet placeholders - to display the site menu on Evolution CMS.
+### Major placeholders
+#### [+dl.wrap+]
+With its help, the generated HTML code of the menu/submenu is substituted into the wrapper template for output.
+
+Note: Used only for wrapper templates &TplMainOwner, &TplSubOwner and &TplOwnerN.
+
+#### [+dl.submenu+]
+The generated HTML code of the submenu is substituted here along with the wrapper template.
+
+Note: Used for menu item templates, both current and current.
+
+#### [+dl.currentDepth+]
+The current nesting level (the current depth).
+
+Note: Note that the current nesting level starts at 1.
+
+#### [+dl.class+]
+It works in the same way as in DocLister, automatically adding classes last, first, current, even, odd respectively for the last, first, current, even and odd points. It also adds a class from the &activeClass parameter to the current item and its parent elements at all levels.
+
+Note: The last, first, current, even, odd, and active classes can be overridden in the &lastClass, ¤tClass, &firstClass, &evenClass, &oddClass, and &activeClass parameters.
+
+#### [+url+]
+URL resource is similar to DocLister.
+
+#### [+e.title+]
+The escaped value of menutitle or pagetitle (if menutitle is empty) is similar to Docklister.
+
+#### [+id+]
+The resource ID is similar to DocLister.
+
+### Other docLister placeholders
+You can use other DockLister placeholders installed by the site_content controller and various extenders.
+
+For example, placeholders of the form [+tvPrefix.tvName+], placeholders of escaped values of the form [+e.fieldName+] (where fieldName is the field name of the table site_content), [+date+] and others (see documentation for DocLister).
diff --git "a/en/04_Extras/DLBuildMenu/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\321\213.md" "b/en/04_Extras/DLBuildMenu/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\321\213.md"
deleted file mode 100644
index 54dc753a..00000000
--- "a/en/04_Extras/DLBuildMenu/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\321\213.md"
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
DLBuildMenu: Плейсхолдеры
-Плейсхолдеры cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
Основные плейсхолдеры
-
[+dl.wrap+]
-
С его помощью в шаблон-обёртку подставляется сформированный HTML-код меню/субменю для вывода.
-
Примечание: используется только для шаблонов-обёрток &TplMainOwner, &TplSubOwner и &TplOwnerN.
-
[+dl.submenu+]
-
Сюда подставляется сформированный HTML-код субменю вместе с шаблоном-обёрткой.
-
Примечание: используется для шаблонов пункта меню, как не текущих, так и текущих.
-
[+dl.currentDepth+]
-
Текущий уровень вложенности (текущая глубина).
-
Примечание: обратите внимание, что отсчёт текущего уровня вложенности начинается с 1.
-
[+dl.class+]
-
Работает так же, как и в DocLister, автоматически добавляя классы last, first, current, even, odd соответственно для последнего, первого, текущего, четного и нечетного пункта. Кроме того, добавляет класс из параметра &activeClass для текущего элемента и его родительских элементов всех уровней.
-
Примечание: классы last, first, current, even, odd и active могут быть переопределены в параметрах &lastClass, ¤tClass, &firstClass, &evenClass, &oddClass и &activeClass.
-
[+url+]
-
УРЛ ресурса аналогично ДокЛистеру.
-
[+e.title+]
-
Экранированное значение menutitle или pagetitle (если menutitle пуст) аналогично Доклистеру.
-
[+id+]
-
ID ресурса аналогично ДокЛистеру.
-
Другие плейсхолдеры из DocLister
-
Вы можете использовать и другие плейсхолдеры ДокЛистера, устанавливаемые контроллером site_content и различными экстендерами.
-
Например, плейсхолдеры вида [+tvPrefix.tvName+], плейсхолдеры экранированных значений вида [+e.fieldName+] (где fieldName - это имя поля таблицы site_content), [+date+] и другие (см. документацию к DocLister).
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/07_Template_Cheat_Sheet.md b/en/04_Extras/DLBuildMenu/07_Template_Cheat_Sheet.md
new file mode 100644
index 00000000..6d0c4ab8
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/07_Template_Cheat_Sheet.md
@@ -0,0 +1,14 @@
+## DLBuildMenu: Template Priority Cheat Sheet
+Priorities of DLBuildMenu snippet templates - to display the site menu on Evolution CMS.
+The DLBuildMenu template system is really very flexible, but it takes some getting used to. To simplify the task below I give cheatsheet (cheatsheet) for template priorities.
+
+The left column lists the types of menu items, and to the right of each item are the templates applied to it in descending order of priority.
+
+| Menu item type | Top Priority | Priority 1 | Priority 2 | Priority 3 | Priority 4 | Priority 5 |
+| --- | --- | --- | --- | --- | --- | --- |
+| Full menu wrapper (level 1) | &TplOwner1 | &TplMainOwner | default value &TplMainOwner |
+| Sub-menu wrapper (level N is 2 or more) | &TplOwnerN | &TplSubOwner | default value &tplSubOwner |
+| Not the current menu item with children (any level N) | &TplDepthN | &TplOneItem | default value &TplOneItem |
+| Not the current menu item with no children (any level N) | &TplNoChildrenDepthN | &noChildrenRowTPL | &TplDepthN | &TplOneItem | default value &TplOneItem |
+| Current menu item with children (any level N) | &TplCurrentN | &TplCurrent | &TplDepthN | &TplOneItem | default value &TplOneItem |
+| Current menu item with no children (any level N) | &TplCurrentNoChildrenN | &TplNoChildrenDepthN | &noChildrenRowTPL | &TplDepthN | &TplOneItem | default value &TplOneItem |
diff --git "a/en/04_Extras/DLBuildMenu/07_\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\321\213 \321\210\320\260\320\261\320\273\320\276\320\275\320\276\320\262.md" "b/en/04_Extras/DLBuildMenu/07_\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\321\213 \321\210\320\260\320\261\320\273\320\276\320\275\320\276\320\262.md"
deleted file mode 100644
index cb782521..00000000
--- "a/en/04_Extras/DLBuildMenu/07_\320\237\321\200\320\270\320\276\321\200\320\270\321\202\320\265\321\202\321\213 \321\210\320\260\320\261\320\273\320\276\320\275\320\276\320\262.md"
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
DLBuildMenu: Шпаргалка по приоритетам шаблонов
-Приоритеты шаблонов cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
Система шаблонов DLBuildMenu действительно очень гибкая, но к ней нужно привыкнуть. Для упрощения задачи ниже привожу cheatsheet (шпаргалку) по приоритетам шаблонов.
-
В левой колонке перечислены типы элементов меню, а справа от каждого элемента идут применяемые для него шаблоны в порядке убывания приоритета.
-
-
-
-
-
Тип элемента меню
-
Высший приоритет
-
Приоритет 1
-
Приоритет 2
-
Приоритет 3
-
Приоритет 4
-
Приоритет 5
-
-
-
-
-
Обёртка для всего меню (уровень 1)
-
&TplOwner1
-
&TplMainOwner
-
дефолтное значение &TplMainOwner
-
-
-
-
-
-
Обёртка для суб-меню (уровень N равен 2 и более)
-
&TplOwnerN
-
&TplSubOwner
-
дефолтное значение &TplSubOwner
-
-
-
-
-
-
Не текущий пункт меню с дочерними (любой уровень N)
-
&TplDepthN
-
&TplOneItem
-
дефолтное значение &TplOneItem
-
-
-
-
-
-
Не текущий пункт меню без дочерних (любой уровень N)
-
&TplNoChildrenDepthN
-
&noChildrenRowTPL
-
&TplDepthN
-
&TplOneItem
-
дефолтное значение &TplOneItem
-
-
-
-
Текущий пункт меню с дочерними (любой уровень N)
-
&TplCurrentN
-
&TplCurrent
-
&TplDepthN
-
&TplOneItem
-
дефолтное значение &TplOneItem
-
-
-
-
Текущий пункт меню без дочерних (любой уровень N)
-
&TplCurrentNoChildrenN
-
&TplNoChildrenDepthN
-
&noChildrenRowTPL
-
&TplDepthN
-
&TplOneItem
-
дефолтное значение &TplOneItem
-
-
-
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/08_Templates.md b/en/04_Extras/DLBuildMenu/08_Templates.md
new file mode 100644
index 00000000..6e6960fa
--- /dev/null
+++ b/en/04_Extras/DLBuildMenu/08_Templates.md
@@ -0,0 +1,78 @@
+## DLBuildMenu: Templates
+DLBuildMenu snippet templates - to display the site menu on Evolution CMS.
+DLBuildMenu templates are defined according to the rules of DL, that is, they can be both inline templates and chunk names, or loaded from a file, from a MODx document, from a config, from a global placeholder.
+
+### Wrapper templates
+#### &TplMainOwner
+The main wrapper template (for depth level 1).
+
+The default value is:
+```
+@CODE:
[+dl.wrap+]
+```
+Note: You must have the &TplMainOwner or &TplOwner1 template set, otherwise the default value of the &TplMainOwner template will be used.
+
+#### &TplSubOwner
+Wrapper template for nested levels (for submenus).
+
+The default value is:
+```
+@CODE:
[+dl.wrap+]
+```
+Note: To display the N-level menu, you must have at least &TplSubOwner and/or &TplOwnerN templates set in addition to the main wrapper. Otherwise, the default value of &TplSubOwner will be used.
+
+#### &TplOwnerN
+The wrapper template for the Nth nesting level submenu, for the corresponding levels &TplOwnerN takes precedence over &TplMainOwner and &TplSubOwner (see Note).
+
+Default value: None
+
+Note: If both &TplOwner1 and &TplMainOwner are specified, &TplOwner1 will be used. If both &TplOwner2 and &TplSubOwner are specified, &TplOwner2 will be used for level 2, and &TplSubOwner will be used for levels 3.
+
+### Menu item templates
+#### &TplOneItem
+Basic template for each menu item of all levels.
+
+The default value is:
+````
+@CODE:
+````
+Note: You must have all the menu item templates you need set, at least &TplOneItem. Otherwise, for items where you have not defined a template, the default value &TplOneItem will be used.
+
+#### &TplDepthN
+The nesting menu item template N, for the corresponding levels &TplDepthN, takes precedence over &TplOneItem.
+
+Default value: None
+
+Note: For example, if &TplDepth2 is specified, it will replace the &TplOneItem template at the 3rd nesting level.
+
+### Item templates without child elements
+#### &noChildrenRowTPL
+The main menu item template with no child elements for all levels.
+
+Default value: None
+
+#### &TplNoChildrenDepthN
+The menu item template without child nesting elements N. For the corresponding levels, &TplNoChildrenDepthN takes precedence over &noChildrenRowTpl.
+
+Default value: None
+
+Note: If neither &noChildrenRowTPL nor &TplNoChildrenDepthN is specified for a menu item, the template you specified in the other parameters (&TplOneItem or &TplDepthN) will be used as the template for the "childless" items.
+
+### Current item templates
+#### &TplCurrent
+The current menu item template with children takes precedence over all menu item templates except &TplCurrentN.
+
+Default value: None
+
+#### &TplCurrentN
+The template of the current nesting menu item N with children, for the Nth level, the &TplCurrentN template takes precedence over all child menu item templates, including &TplCurrent.
+
+The default value is None.
+
+#### &TplCurrentNoChildrenN
+The template of the current menu item without child elements, where N is the nesting level number. For level N, it takes precedence over any other "childless" menu item templates.
+
+The default value is None.
diff --git "a/en/04_Extras/DLBuildMenu/08_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md" "b/en/04_Extras/DLBuildMenu/08_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md"
deleted file mode 100644
index b49f426f..00000000
--- "a/en/04_Extras/DLBuildMenu/08_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md"
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
DLBuildMenu: Шаблоны
-Шаблоны cниппета DLBuildMenu - для вывода меню сайта на Evolution CMS.
-
-
Шаблоны DLBuildMenu задаются по правилам DL, то есть могут быть и инлайн-шаблонами, и именами чанков, или загружаться из файла, из документа MODx, из конфига, из глобального плейсхолдера.
Примечание: для вывода N-уровневого меню у вас в дополнение к основной обёртке должен быть задан по крайней мере &TplSubOwner и/или шаблоны &TplOwnerN. Иначе будет использовано дефолтное значение &TplSubOwner.
-
&TplOwnerN
-
Шаблон-обертка для субменю N-го уровня вложенности, для соответствующих уровней &TplOwnerN имеет приоритет над &TplMainOwner и &TplSubOwner (см. Примечание).
-
Значение по умолчанию: нет
-
Примечание: Если заданы и &TplOwner1, и &TplMainOwner, то будет использован &TplOwner1. Если заданы и &TplOwner2 и &TplSubOwner, то для уровня 2 будет использован &TplOwner2, а для уровней начиная с 3-го – &TplSubOwner.
-
-
Шаблоны пункта меню
-
&TplOneItem
-
Основной шаблон для каждого пункта меню всех уровней.
Примечание: у вас должны быть заданы все нужные вам шаблоны пунктов меню, по крайней мере &TplOneItem. Иначе для пунктов, у которых шаблон не определен вами, будет использовано дефолтное значение &TplOneItem.
-
&TplDepthN
-
Шаблон пункта меню вложенности N, для соответствующих уровней &TplDepthN имеет приоритет над &TplOneItem.
-
Значение по умолчанию: нет
-
Примечание: Например, если задан &TplDepth2, он заменит собой шаблон &TplOneItem на 3-м уровне вложенности.
-
-
Шаблоны пункта без дочерних элементов
-
&noChildrenRowTPL
-
Основной шаблон пункта меню без дочерних элементов для всех уровней.
-
Значение по умолчанию: нет
-
&TplNoChildrenDepthN
-
Шаблон пункта меню без дочерних элементов вложенности N. Для соответствующих уровней &TplNoChildrenDepthN имеет приоритет над &noChildrenRowTpl.
-
Значение по умолчанию: нет
-
Примечание: если для пункта меню не задан ни &noChildrenRowTPL, ни &TplNoChildrenDepthN, то в качестве шаблона для «бездетных» пунктов будет использован шаблон, заданный вами в других параметрах (&TplOneItem или &TplDepthN).
-
-
Шаблоны текущего пункта
-
&TplCurrent
-
Шаблон текущего пункта меню с дочерними, имеет приоритет перед всеми шаблонами пунктов меню, кроме &TplCurrentN.
-
Значение по умолчанию: нет
-
&TplCurrentN
-
Шаблон текущего пункта меню вложенности N с дочерними , для N-го уровня шаблон &TplCurrentN имеет приоритет перед всеми шаблонами пунктов меню с дочерними, включая &TplCurrent.
-
Значение по умолчанию: нет.
-
&TplCurrentNoChildrenN
-
Шаблон текущего пункта меню без дочерних элементов, где N – номер уровня вложенности. Для уровня N имеет приоритет перед любыми другими шаблонами «бездетных» пунктов меню.
-
Значение по умолчанию: нет.
\ No newline at end of file
diff --git a/en/04_Extras/DLBuildMenu/index.md b/en/04_Extras/DLBuildMenu/index.md
index 4519560e..0aa1cae7 100644
--- a/en/04_Extras/DLBuildMenu/index.md
+++ b/en/04_Extras/DLBuildMenu/index.md
@@ -1,4 +1,2 @@
-
-
-
DLBuildMenu: документация, параметры, шаблоны
-Документация по сниппету DLBuildMenu для создания меню на MODx Evo.
+## DLBuildMenu: documentation, parameters, templates
+Documentation on the DLBuildMenu snippet for creating a menu in MODx Evo.
diff --git a/en/04_Extras/DLGlossary/04_Examples/01_Each_Alphabet_Letter.md b/en/04_Extras/DLGlossary/04_Examples/01_Each_Alphabet_Letter.md
new file mode 100644
index 00000000..4799a3f9
--- /dev/null
+++ b/en/04_Extras/DLGlossary/04_Examples/01_Each_Alphabet_Letter.md
@@ -0,0 +1,38 @@
+## Produce a glossary page for each letter of the alphabet
+In order to achieve this we need to call the snippet for each letter.
+### pre-requisites
+* DocLister
+* DLGlossary
+
+### Required
+You will need to create a new snippet to loop through each letter. This allows you to add one snippet call to your resource for the output.
+
+#### Snippet: GlossaryList
+```
+[+title+] ([+id+])";
+
+ $output .= "
".chr($alpha)."
";
+ $output .= $modx->runSnippet("DLGlossary", $params);
+}
+
+return $output;
+```
+
+### Parameters
+
+* parents - a comma seperated list of parent document ids.
+* debug - 0 - none, 1 - debug code. default: 0
+
+### Snippet call
+```
+[[GlossaryList? &parents=`145` &debug=`0`]]
diff --git a/en/04_Extras/DLGlossary/04_Examples/02_With_TV_Parameters.md b/en/04_Extras/DLGlossary/04_Examples/02_With_TV_Parameters.md
new file mode 100644
index 00000000..48187109
--- /dev/null
+++ b/en/04_Extras/DLGlossary/04_Examples/02_With_TV_Parameters.md
@@ -0,0 +1,179 @@
+## Produce a glossary page for each letter of the alphabet including TV Parameters
+In order to achieve this we need to call the snippet for each letter.
+We also need to duplicate and amend the original DLGlossary snippet in order to make this work.
+### pre-requisites
+* DocLister
+* DLGlossary
+
+### Required
+You will need to create a new snippet to loop through each letter. This allows you to add one snippet call to your resource for the output.
+
+You will need to duplicate DLGlossary and make a change to the code in order to allow this to work.
+
+#### Snippet: GlossaryList
+```
+[+dl.wrap+]';
+$params['noneTPL'] = '@CODE:Nothing to display';
+$params['noneWrapOuter'] = 0;
+$params['tpl'] = "@CODE:
";
+ $output .= $modx->runSnippet("DLGlossaryTags", $params);
+}
+
+return $output;
+```
+
+### Parameters
+
+* parents - a comma seperated list of parent document ids.
+* tvList - a comma seperated list of TV parameters to include.
+* debug - 0 - none, 1 - debug code. default: 0
+
+### Snippet call
+```
+[[GlossaryList? &parents=`145` &tvList=`documentTags` &debug=`0`]]
+```
+
+## DLGlossaryTags
+### create a new snippet: DLGlossaryTags
+
+```
+sendErrorPage();
+}
+
+$p = &$modx->event->params;
+if (! is_array($p)) {
+ $p = array();
+}
+if (! empty($loadfilter)) {
+ $field = explode(".", $field);
+ $field = end($field);
+ if (! empty($p['filters'])) {
+ $p['filters'] = rtrim(trim($p['filters']), ";") . ";";
+ }
+ $p['filters'] = "AND({$loadfilter}:{$field}:{$action}:{$char})";
+} else {
+ $field = sqlHelper::tildeField($field);
+ if ($action === 'regexp') {
+ $where = $field . " REGEXP '" . $modx->db->escape($char) . "'";
+ } else {
+ $where = sqlHelper::LikeEscape($modx, $field, $char, '=', '[+value+]%');
+ }
+ if (empty($p['addWhereList'])) {
+ $p['addWhereList'] = $where;
+ } else {
+ $p['addWhereList'] = sqlHelper::trimLogicalOp($p['addWhereList']) . " AND " . $where;
+ }
+}
+// We have to unset this parameter so the SQL statement looks in the TVs only.
+unset($p['addWhereList']);
+
+return $modx->runSnippet("DocLister", $p);
+```
+
+This snippet is identical to the original but with one change. We are removing the &addWhereList parameter completely so we can allow for TV parameters.
+#### Caveat
+
+This method will duplicate the documents in the glossary list as each step runs through the parent document and TV parameters.
+
+For instance, a document with a title "How To" and a TV Parameter "Tutorial" will show up in both **H** and **T**.
+
+Also, when using TV parameters the program will view a comma seperated list as a string. So, "Test, Tutorial, First" would only appear in **T** for "Test" as this is the first letter in the string.
diff --git a/en/04_Extras/DLGlossary/index.md b/en/04_Extras/DLGlossary/index.md
new file mode 100644
index 00000000..7046703b
--- /dev/null
+++ b/en/04_Extras/DLGlossary/index.md
@@ -0,0 +1,23 @@
+Allows you to display only those documents whose specific field begins with the desired letter. Let's say that from the documents with ID 2,4,23,3 we will show only those whose longtitle (the extended title begins with the letter "H" regardless of the case)
+
+### Options
+* fromget – Whether to take data from GET
+* frompost – Whether to take data from POST
+* char – Which character should the text begin with?
+* field – Default field to filter by:c.pagetitle
+* setActive - Activate character sets, default:0
+* regexpSep - Separator in regular sets, default:||
+* regexp - Sets of supported regulars, default:a-z|| 0-9|| a-z
+* loadfilter - Which filter to load, default:empty
+* register – Case sensitivity, default:0
+
+### Example of a call
+```
+[[DLglossary?
+&documents=`2,4,23,3`
+&idType=`documents`
+&field=`c.longtitle`
+&char=`н`
+®ister=`1`
+]]
+```
diff --git a/en/04_Extras/DLLastViews/index.md b/en/04_Extras/DLLastViews/index.md
index 0a4c50cb..5fe36a26 100644
--- a/en/04_Extras/DLLastViews/index.md
+++ b/en/04_Extras/DLLastViews/index.md
@@ -1,20 +1,16 @@
+## DLLastViews: Most Recently Viewed Documents
+A snippet to display the most recently viewed documents, for example, you can display viewed products for stores.
+There are two parameters in the snippet properties:
-
-
DLLastViews: последние просмотренные документы
-Сниппет для вывода последних просмотренных документов, например можно для магазинов выводить просмотренные товары.
-
В свойствах сниппета есть два параметра:
-
-
Время хранения cookie. Задается в секундах, по умолчанию 30 дней
Поставить галочку «Анализировать DocBlock» и сохранить
-
-
-<?php
+* Cookie storage time. Set in seconds, default 30 days
+* How many documents should I remember? Default: 5
+Author: Maxim
+
+### Installation:
+* Create a new snippet and paste the code there
+* Tick "Analyze DocBlock" and save
+```
+';
+if (!isset($params['tpl'])) $params['tpl'] = '@CODE: ';
$maxDocs = isset($maxDocs) ? $maxDocs : 5;
$expired = isset($expired) ? $expired : 2592000;
$params['idType'] = 'documents';
$item = array();
+
if (isset($_COOKIE['last_view']) and $_COOKIE['last_view'] != '') {
- $params['documents'] = $_COOKIE['last_view'];
- $item = explode(',', $_COOKIE['last_view']);
+$params['documents'] = $_COOKIE['last_view'];
+
+$item = explode(',', $_COOKIE['last_view']);
+
}
+
switch ($params['mode']) {
- case 'register':
- if (!in_array($modx->documentIdentifier, $item)) {
- array_unshift($item, $modx->documentIdentifier);
- array_slice($item, 0, $maxDocs - 1);
- setcookie('last_view', implode(',', $item), time()+$expired, '/');
- }
- break;
-
- case 'show':
- if (!empty($item)) {
- return $modx->runSnippet('DocLister',$params);
- }
+case 'register':
+if (!in_array($modx->documentIdentifier, $item)) {
+array_unshift($item, $modx->documentIdentifier);
+array_slice($item, 0, $maxDocs - 1);
+setcookie('last_view', implode(',', $item), time()+$expired, '/');
+}
+break;
+
+
+case 'show':
+ if (!empty($item)) {
+ return $modx->runSnippet('DocLister',$params);
+ }
+break;
+ default:
break;
- default:
- break;
+
}
-
-
Использование:
-
На страницах, которые нужно запоминать написать не кэшируемый вызов без параметров
-
[!DLLastViews!]
-
Там где нужно выводить список просмотренных документов написать некэшируемы вызов с параметрами. Все параметры, как у DocLister'а (кроме idType, он жестко задан в сниппете) и добавить параметр &mode=`show`
-
+```
+### Use:
+On pages that you want to remember, write a non-cached call without parameters
+```
+[!DLLastViews!]
+```
+Where you need to display a list of viewed documents, write a non-cached call with parameters. All parameters like The DocLister (except idType, it is hard-coded in the snippet) and add the parameter &mode='show'
+```
[!DLLastViews?
&mode=`show`
- &ownerTPL=`
`
!]
-
\ No newline at end of file
+````
diff --git a/en/04_Extras/DLMenu/index.md b/en/04_Extras/DLMenu/index.md
index 3b89a2e3..c3f3b07b 100644
--- a/en/04_Extras/DLMenu/index.md
+++ b/en/04_Extras/DLMenu/index.md
@@ -132,7 +132,7 @@ Possible values - name of a template given according to the DocLister template s
Default - parentRowTpl value.
-## Классы
+## Class
Document classes:
* __rowClass__ - document class, provided by innerClass parameter;
* __firstClass__ - first document class, provided by firstClass parameter (default - first);
diff --git a/en/04_Extras/DLRequest/index.md b/en/04_Extras/DLRequest/index.md
index 5d16492c..b8f4288d 100644
--- a/en/04_Extras/DLRequest/index.md
+++ b/en/04_Extras/DLRequest/index.md
@@ -1,27 +1,32 @@
+## DLRequest - run snippets with parameters from get/post
+Snippet is designed to replace Ditto with a request extender at the request of Extremum and at its own expense, for which I thank you very much.
-
-
DLRequest - запуск сниппетов с параметрами из get/post
-DLRequest - запуск сниппетов с параметрами из get/post
-
Сниппет разработан для замены Ditto с экстендером request по просьбе Extremum и на его же средства, за что большое спасибо.
-
Сниппет принимает значения из post или get-массива и использует их в качестве параметров для запуска другого сниппета. Изначально планировалась работа только с DocLister (отсюда и название), но в итоге можно вызывать любой сниппет. Тем не менее, наличие установленного DocLister'а обязательно.
-
DLRequest умеет не только передавать параметры, но и строить форму для управления этими самыми параметрами, без костылей типа:
-
-<?php
+A snippet takes values from a post or get array and uses them as parameters to start another snippet. Initially, it was planned to work only with DocLister (hence the name), but in the end you can call any snippet. However, having DocLister installed is mandatory.
+
+DLRequest is able not only to pass parameters, but also to build a form to control these very parameters, without crutches like:
+```
+
-
Важный момент – возможные значения параметров задаются разработчиком, то есть если в форме для выбора количества документов на странице указано «10, 20, 50, 100», то подставить руками url?display=100500 не получится – такой параметр будет просто проигнорирован.
-
Предусмотрена также возможность сохранять значения параметров, которые передаются из браузера для других сниппетов, например, для DocLister это будет параметр page. То есть если в списке документов вы находитесь на странице 5, то после смены, например, направления сортировки, все равно останетесь на странице 5.
-
Теперь приведу пример вызова, из которого понятно, как это все работает:
-
+```
+
+An important point is that the possible parameter values are set by the developer, that is, if in the form for selecting the number of documents on the page it is indicated "10, 20, 50, 100", then it will not be possible to substitute url?display=100500 with your hands - such a parameter will simply be ignored.
+
+It is also possible to save parameter values that are passed from the browser for other snippets, for example, for DocLister it will be the page parameter. That is, if in the list of documents you are on page 5, then after changing, for example, the direction of sorting, you will still remain on page 5.
+
+Now I'll give you an example of a call that shows how it all works:
+```
[+paramsForm+]
-<div>
+
\ No newline at end of file
+```
+After & spaces stand, because otherwise the editor replaces the characters.
+
+Author: Pathologic
diff --git a/en/04_Extras/DLSiblings/index.md b/en/04_Extras/DLSiblings/index.md
index 90436b75..20b4aa94 100644
--- a/en/04_Extras/DLSiblings/index.md
+++ b/en/04_Extras/DLSiblings/index.md
@@ -1,88 +1,107 @@
+## DLSiblings: Output neighboring resources with templating
+Output of adjacent resources with templating (multiple ring linking).
+Output adjacent resources with templating (multiple ring linking)
-
-
DLSiblings: Вывод соседних ресурсов с шаблонизацией
-Вывод соседних ресурсов с шаблонизацией (множественная кольцевая перелинковка).
-
Вывод соседних ресурсов с шаблонизацией (множественная кольцевая перелинковка)
(целое), кол-во предыдущих и следующих соседей. Имеет приоритете над &prevQty и &nextQty.
-
Если &Qty=`3`, то общее кол-во будет 6 - то есть 3 перед и 3 после.
-
Значение по умолчанию: 2.
-
&prevQty
-
Кол-во соседей-предшественников. Приоритет меньше $Qty
-
Значение по умолчанию:default 2
-
&nextQty
-
Кол-во соседей-последователей. Приоритет меньше $Qty
-
Значение по умолчанию: 2
-
-
Также можно использовать унаследованные от DocLister (такие же, как у него): условия выборки &addWhereList и &filters, условия сортировки &orderBy, глубина выборки &depth, prepare, многие другие параметры.
-
Нужно лишь понимать, имеют ли смысл эти параметры в вызове. Например, если задать &idType=`documents` и &documents=`1,2,3` (всего 3 документа), а &Qty задать как 6, то выводиться все равно будут всегда эти 3 документа - смысла в этом нет.
-
Параметры-исключения:
-
-
режим api принудительно устанавливается в 1 (нет смысла задавать в сниппете)
-
режим debug устанавливается в 0 (также нет смысла задавать).
-
параметр &display принудительно устанавливается в &display=`0`, так как за кол-во отвечают параметры &Qty, &prevQty и &nextQty.
-
-
Шаблоны сниппета
-
-
&ownerTPL, шаблон-обертка аналогично DocLister, но плейсхолдер НЕ [+dl.wrap+], а [+wrap+]. Значение по умолчанию null (вывод не оборачивается в ownerTPL).
-
&tpl, &tplOdd и &tplEven, &tplIdN, &tplFirst и &tplLast Шаблоны элемента как в DocLister в порядке увеличения приоритета.
-
&noneTPL Шаблон с информацией, что ничего нет, как в DocLister. По умолчанию - пусто.
-
&noneWrapOuter Как в DocLister, оборачивать ли шаблон noneTPL в обёртку ownerTPL. Параметр &noneWrapOuter имеет смысл, только если ничего не нашлось и при этом задан ownerTPL.
-
-
Другие шаблоны DL не используются.
-
ВНИМАНИЕ:
-
!!! В шаблонах сниппета плейсхолдеры ТВ-параметров записываются НЕ через точку, а через нижнее подчеркивание. То есть, будет не [+tv.h1+], а [+tv_h1+]. То же самое касается экстендеров, например экстендера e: вместо [+e.title+] пишем [+e_title+].
-
В общем, в плейсхолдерах шаблонов (только в них!) все точки меняем на нижнее подчеркивание (см. примеры вызова сниппета ниже).
-
ПРИМЕРЫ
-
Пример 1: Простой вызов сниппета.
-
+Author: https://github.com/Aharito/DLSiblings Aharito
+
+### Snippet parameters:
+#### &idType, &parents, &documents, &ignoreEmpty
+- As in DocLister.
+
+#### &Qty
+(whole), the number of previous and next neighbors. Takes precedence over &prevQty and &nextQty.
+
+If &Qty='3', then the total number will be 6 - that is, 3 before and 3 after.
+
+The default value is 2.
+
+#### &prevQty
+Number of predecessor neighbors. Priority less than $Qty
+
+Default value:default 2
+
+#### &nextQty
+Number of neighbors-followers. Priority less than $Qty
+
+Default value: 2
+
+You can also use those inherited from DocLister (the same as its): fetch conditions &addWhereList and &filters, sort conditions &orderBy, sample depth &depth, prepare, and many other parameters.
+
+You just need to understand whether these parameters make sense in the call. For example, if you set &idType='documents' and &documents='1,2,3' (3 documents in total), and set &Qty as 6, then these 3 documents will always be displayed - this makes no sense.
+
+### Exclusion parameters:
+* api mode is forcibly set to 1 (it makes no sense to set in the snippet)
+* the debug mode is set to 0 (there is also no point in setting it).
+* the &display parameter is forcibly set to &display='0' because the &Qty, &prevQty, and &nextQty parameters are responsible for the count.
+
+### Snippet Templates
+* &ownerTPL, the wrapper template is similar to DocLister, but the placeholder is NOT [+dl.wrap+], but [+wrap+]. The default value is null (the output does not turn into ownerTPL).
+* &tpl, &tplOdd and &tplEven, &tplIdN, &tplFirst and &tplLast Item templates as in DocLister in ascending order of priority.
+* &noneTPL Template with information that there is nothing like in DocLister. The default is empty.
+* &noneWrapOuter As in DocLister, whether to wrap the noneTPL template into the ownerTPL wrapper. The &noneWrapOuter parameter makes sense only if nothing is found and the ownerTPL is specified.
+No other DL templates are used.
+
+## ATTENTION:
+!!! In snippet templates, TV parameter holders are recorded NOT through a period, but through an underscore. That is, it will not be [+tv.h1+], but [+tv_h1+]. The same applies to extenders, such as extender e: instead of [+e.title+], we write [+e_title+].
+
+In general, in template placeholders (only in them!), all points are changed to underline (see examples of snippet calls below).
+
+### EXAMPLES
+#### Example 1: A simple snippet call.
+```
+[[DLSiblings?
+ &idType=`parents`
+ &parents=`152`
+ &tpl=`@CODE: [+tv_h1+] `
+ &Qty=`2`
+ &tvList=`h1`
+]]
+```
+
+#### Example 2: A more complex example with prepare and FastImage previews
+```
[[DLSiblings?
- &idType=`parents`
- &parents=`152`
- &tpl=`@CODE: <a href="[+url+]">[+tv_h1+]</a><br>`
- &Qty=`2`
- &tvList=`h1`
-]]
-
Пример 2: Более сложный пример с prepare и превьюшками FastImage
Примечание: Это только примеры. Для того, чтобы они заработали на вашем сайте, у вас должны быть такие же TV и такие же prepare-сниппеты.
-
Результат работы примера 2
-
-
Скорость работы
-
1) Кол-во запросов и т.д. при кешированном вызове сниппета на кешированном ресурсе на микро-сайте, выборка 4 из 8 статей с сортировкой
-
&orderBy=`if(pub_date=0,createdon,pub_date) DESC`
-
-
2) Кол-во запросов и т.д. при некешированном вызове сниппета на кешированном ресурсе на микро-сайте, выборка 4 из 8 статей с сортировкой
-
&orderBy=`if(pub_date=0,createdon,pub_date) DESC`
-
-
Недостатки
-
-
Длинная JSON-строка, содержащая все поля, в том числе контент (расход памяти)
-
Формирование доп. индексного массива $ids (время)
-
В результате сниппет подойдет для не очень больших выборок (навскидку до 1-2 тыс. ресурсов), для больших сайтов требуется другое решение
-
\ No newline at end of file
+ &idType=`parents`
+ &parents=`152`
+ &thumbSnippet=`sgThumb`
+ &thumbOptions=`{"tv.article_intro_img":{"small":"280x160","medium":"700x400"}}` // There is NO need to change the period to underlining here (this is not a template)
+ &ownerTPL=`@CODE:
[+wrap+]
`
+ &tpl=`@CODE:
+
// And here everywhere needs to be changed (this is a template)
+
`
+ &Qty=`2`
+ &tvList=`article_intro_img,h1`
+ &prepare=`FastImagePreviews`
+]]
+```
+Note: These are examples only. In order for them to work on your site, you must have the same TVs and the same prepare-snippets.
+
+#### Output of Example 2
+
+
+#### Speed of work
+1) Number of requests, etc. when caching a snippet on a cached resource on a micro-site, sampling 4 out of 8 articles with sorting
+```
+&orderBy=`if(pub_date=0,createdon,pub_date) DESC`
+```
+¬[siblings_requests](https://cloud.githubusercontent.com/assets/6253807/24569985/4e7dedd6-1693-11e7-955c-95574150e8de.png)
+
+2) Number of requests, etc. in case of uncushed snippet call on a cached resource on a micro-site, sampling 4 out of 8 articles with sorting
+```
+&orderBy=`if(pub_date=0,createdon,pub_date) DESC`
+```
+¬[siblings_requests_nocache](https://cloud.githubusercontent.com/assets/6253807/24570665/e1272e60-1696-11e7-8b7d-832009a2be07.png)
+
+### Disadvantages
+* Long JSON string containing all fields, including content (memory consumption)
+* Formation of an additional index array $ids (time)
+* As a result, the snippet is suitable for not very large samples (up to 1-2 thousand resources), for large sites a different solution is required.
diff --git a/en/04_Extras/DLSitemap/index.md b/en/04_Extras/DLSitemap/index.md
index 6c2c0c33..ab938133 100644
--- a/en/04_Extras/DLSitemap/index.md
+++ b/en/04_Extras/DLSitemap/index.md
@@ -1,7 +1,6 @@
## Overview
DLSitemap is a snippet to build XML site map for search engines and robots. It's much faster than [sitemap](https://github.com/extras-evolution/sitemap/) and can define priority and change frequency by the time of the last document modification.
-The snippet itself is a wrapper for DocLister to run it with predefined parameters (see assets/snippets/DocLister/config/core/sitemap.json), so you can use all DocLister parameters to filter docs, change order and so on. But "prepare" parameter is filled with DLSitemap, so use "BeforePrepare" и "AfterPrepare" parameters instead of it.
-
-If you want to control priority and change frequency manually, then you have to create TV-parameters named sitemap_priority and sitemap_changefreq (these names can be changed with priority и changefreq parameters). If document has no these TV-parameters, then priority and change frequency are defined automatically.
+The snippet itself is a wrapper for DocLister to run it with predefined parameters (see `assets/snippets/DocLister/config/core/sitemap.json`), so you can use all [DocLister parameters](http://docs.evo.im/en/04_extras/doclister.html) to filter docs, change order and so on. But `prepare` parameter is filled with DLSitemap, so use `BeforePrepare` and `AfterPrepare` parameters instead of it.
+If you want to control priority and change frequency manually, then you have to create TV-parameters named `sitemap_priority` and `sitemap_changefreq` (these names can be changed with `priority` и `changefreq` parameters). If document has no these TV-parameters, then priority and change frequency are defined automatically.
diff --git a/en/04_Extras/DocLister/01_Parameters.md b/en/04_Extras/DocLister/01_Parameters.md
index d619030a..f096868f 100644
--- a/en/04_Extras/DocLister/01_Parameters.md
+++ b/en/04_Extras/DocLister/01_Parameters.md
@@ -1,6 +1,52 @@
-##Parameters
-
-###controller
+## Parameters
+
+### Parameters at a glance
+| Parameter | Description | Default |
+| --- | --- | --- |
+| controller | Specifies the class to fetch the data | site_content |
+| idType | Type of Documents | parents |
+| parents | Selection of documents based on parental documents | (page_id) |
+| documents | Selection of arbitrary documents | |
+| ignoreEmpty | Allows you to select all the records from the table | 0 |
+| display | Maximum number of documents per query | 0 |
+| queryLimit | Maximum number of documents per query | 0 |
+| depth | The depth of the query using the parameter **parents** | 0 |
+| offset | Number of documents to skip from the beginning | 0 |
+| start | Number of documents to skipped from the beggining of the query | 0 |
+| total | The maximum number of documents to display | 0 |
+| addWhereList | Additional conditions for retrieving documents | |
+| showParent | The exclusio of documents from which a query was made | 0 |
+| selectFields | The names of the fields to include in the selection | |
+| groupBy | Group results by any field | |
+| table | The name of the table query | site_content |
+| idField | The name of the primary key field | id |
+| parentField | The name of the field in which the idField values of the parent documents are stored | parent |
+| debug | Provide debug log for snippet call | 0 |
+| tvPrefix | Prefix for placeholders created from TV parameters | tv |
+| tvList | List of TV parameter names that should be in the query | |
+| renderTV | TV parameter names to render as per their widget settings | |
+| sortType | Sort type | none |
+| orderBy | A single sort string | id DESC |
+| sortBy | Sorting criterion without sorting direction | |
+| order | Sorting direction | DESC |
+| sortDir | A synonym for **order** parameter | DESC |
+| tvSortType | Rules for converting the types of TV parameter sorting | |
+| tvSortWithDefault | | |
+| showNoPublish | Show unpublished documents in the output | 0 |
+| filters | Rules for filtering documents | |
+| filer_delimiter | Filter separator for **containsOne** mode | |
+| tagsData | The string that defines the source of the tags | |
+| urlScheme | URL generating scheme | |
+| dateSource | The document field in which the date is located. | |
+| dateFormat | Formatting rules for PHP function strftime | %d.%b.%y %H:%M |
+| summary | Text processing rules for the formation of a brief description | |
+| introField | The name of the field for the short text source from the content Field | |
+| contentField | The name of the field in which the main content of the document is stored | |
+| e | Screening of field values | |
+| jotcount | Adds JotX comments number to the section when using the jotcount extender | 0 |
+
+
+### controller
Specifies the class to fetch the data. Base classes (located in the folder DocLister/core/controller/):
@@ -11,7 +57,7 @@ Specifies the class to fetch the data. Base classes (located in the folder DocLi
Default value - site_content
-###idType
+### idType
Type of documents. Possible Values - parents, documents.
@@ -21,7 +67,7 @@ To avoid misunderstandings, it is recommended to always explicitly define this p
Default value - parents
-###parents
+### parents
Selection of documents based on the list of parental documents.
@@ -29,7 +75,7 @@ Possible values are the id values of the parent documents, separated by a comma.
The default value is the page id on which the snippet is called.
-###documents
+### documents
Selection of arbitrary documents.
@@ -37,7 +83,7 @@ If the parameter parents__ is used, then the documents listed in this parameter
Possible values are document id values, separated by a comma.
-###ignoreEmpty
+### ignoreEmpty
Allows you to select all the records from the table if the documents parameter is not specified. The idType parameter in this case must be documents.
@@ -45,7 +91,7 @@ Possible values - 1 or 0.
Default - 0.
-###display
+### display
Maximum number of documents per query.
@@ -63,7 +109,7 @@ Possible values are an integer that is greater than or equal to zero.
Default value - 0.
-###depth
+### depth
The depth of the query using the parameter parents.
@@ -71,7 +117,7 @@ Possible values are an integer that is greater than or equal to zero.
Default value - 0.
-###offset
+### offset
Number of documents to skip from the beginning of the list. Overridden when using pagination. If you want to always skip N documents, you must use the start parameter.
@@ -79,7 +125,7 @@ Possible values are an integer that is greater than or equal to zero.
Default value - 0.
-###start
+### start
Number of documents skipped from the beginning of the query. Folds with an offset value that is automatically set when pagination occurs.
@@ -87,7 +133,7 @@ Possible values are an integer that is greater than or equal to zero.
Default value - 0.
-###total
+### total
The maximum number of documents displayed on 1 page in the query.
@@ -95,13 +141,13 @@ Possible values are an integer that is greater than or equal to zero.
Default value - 0.
-###addWhereList
+### addWhereList
Additional conditions for retrieving documents. Any string that meets the requirements of the string to be substituted in the WHERE clause of the SQL query.
Default value - empty.
-###showParent
+### showParent
The exclusion of documents from which a query was made using the parameter parents.
@@ -113,21 +159,21 @@ Possible values:
Default value - 0.
-###selectFields
+### selectFields
The names of the fields to include in the selection.
Default value - empty.
-###groupBy
+### groupBy
Group results by any field.
Default value - defined in the controller
-##Query parameters for arbitrary tables (onetable controller)
+## Query parameters for arbitrary tables (onetable controller)
-###table
+### table
The name of the table for query. If the table PrimaryKey differs from id, then you must additionally specify the name of this field in the idField parameter.
@@ -135,7 +181,7 @@ Possible values - any table name without the EVO table prefix.
Default value - site_content
-###idField
+### idField
The name of the PrimaryKey field. The documents specified through the documents parameter will be selected by this field.
@@ -143,7 +189,7 @@ Possible values - any field name available in the table specified by the table p
Default value - id
-###parentField
+### parentField
The name of the field in which the idField values of the parent documents are stored. Used when fetching documents from the parents parameter.
@@ -151,15 +197,15 @@ Possible values - any name of the field available in the table specified by the
Default value - parent.
-##Query with TV-parameters
+## Query with TV-parameters
-###tvPrefix
+### tvPrefix
Prefix for placeholders created from the names of TV-parameters.
Default value - tv
-###tvList
+### tvList
List of TV that should be in the query.
@@ -167,16 +213,16 @@ Possible values - names of TV, separated by a comma.
Default value - empty.
-###renderTV
+### renderTV
TV-names, the value of which must be prepared for display in accordance with the installed widgets. TV parameters which are not present in the value of the tvList parameter will be ignored.
Possible values - * or a list of TV names, separated by a comma.
Default value - empty.
-##Sorting
+## Sorting
-###sortType
+### sortType
The value "none" specifies automatic sorting by MySQL rules (usually by primary key).
@@ -188,7 +234,7 @@ Possible values:
Default value - none.
-###orderBy
+### orderBy
A single sort string (at least a collection of sortBy and sortDir parameters, but has a higher priority).
@@ -198,7 +244,7 @@ For sorting in random order, the value of the orderBy parameter will be "RAND()"
Default value - id DESC (or defined in the controller)
-###sortBy
+### sortBy
Sorting criterion without sorting direction.
@@ -206,7 +252,7 @@ Possible values - any string that meets the rules for constructing the ORDER BY
Default value - empty. The default value can be hard-coded in the controller.
-###order
+### order
Sorting direction.
@@ -214,7 +260,7 @@ Possible values are ASC, DESC. The value of this parameter can be overridden by
Default value - DESC.
-###sortDir
+### sortDir
A synonym for the "order" parameter, but it has a higher priority. If "order" and "sortDir" parameters are set, the value of the sortDir parameter will be used.
@@ -222,9 +268,9 @@ Possible values - ASC, DESC.
Default value - DESC (or defined in the controller).
-##Sorting by TV
+## Sorting by TV
-###tvSortType
+### tvSortType
Rules for converting the types of TV when sorting.
@@ -237,14 +283,14 @@ Possible values (are separated by commas in the order in which the TV names in t
* DATETIME - date;
* TVDATETIME- outputs the string to the date according to the format used by the TV with the type of input "Date" (available only from the controllers based on site_content).
-###tvSortWithDefault
+### tvSortWithDefault
Due to the engine features (TV whose values coincide with the default values are not saved in a separate table), sorting records may not be corrected if the Default value is different from the empty page.
Therefore, it is recommended to specify the TV parameters for which the Default value is forcibly specified.
-##Filtering
+## Filtering
-###showNoPublish
+### showNoPublish
Output of deleted or unpublished resources (used only in controllers based on site_content)
@@ -252,7 +298,7 @@ Possible values - 0/1.
Default value - 0
-###filters
+### filters
Rules for filtering documents.
@@ -260,13 +306,13 @@ Possible values - The string is formed according to the rules described in DocLi
Default value - empty.
-####Example string
+#### Example string
```
OR(AND(filter:field:operator:value;filter2:field:operator:value);(...))
```
-###filter_delimiter
+### filter_delimiter
The filter separator for mode containsOne.
@@ -274,7 +320,7 @@ Possible values - any string.
##Sort by tags
-###tagsData
+### tagsData
The string that defines the source of the tags.
@@ -284,9 +330,9 @@ Default value - empty.
To automatically substitute tags from a GET variable, you must specify the name of this variable by passing a value of type get:tag in this parameter. In this case, the tags should be substituted into $_GET['tag']. In case if static query is necessary, it is possible to replace get on static and after a colon to transfer value of the tag, for example, static:value_tag
-##Additional information
+## Additional information
-###urlScheme
+### urlScheme
URL genereting scheme
@@ -294,7 +340,7 @@ Possible values are the schemes available in Evolution (relative, http, https, f
Default value - empty (the relative)
-###dateSource
+### dateSource
The document field in which the date is located.
@@ -302,7 +348,7 @@ Possible values - name of the field in the table. If the value was a string othe
Default value - pub_date.
-###dateFormat
+### dateFormat
Formatting rules for the PHP function strftime.
@@ -310,7 +356,7 @@ The date source is the dateSource parameter. In addition, the date offset on the
Default value - %d.%b.%y %H:%M.
-###summary
+### summary
Text processing rules for the formation of a brief description. Loads the summary extender. The controller site_content has an additional rule for the processed text: by default, the content field is sent to the processing. But if the introtext field is not empty, then the text from this field will be passed in addition to the summary. Similarly, the onetable controller itself leads.
@@ -322,25 +368,25 @@ action1:parameter1,action2:parameter2A:parameter2B,action3
Default value - empty.
-###introField
+### introField
The name of the field for the short text source from the contentField. Used only if the summary extender is loaded.
Default value - empty.
-###contentField
+### contentField
The name of the field in which the main content of the document is stored. Used only if the summary extender is loaded.
Default value - empty.
-###e
+### e
Screening of field values. Field names are available in templates via placeholders with the prefix e: [+e.pagetitle+], [+e.longtitle+].
Possible values - field names, separated by commas.
-###jotcount
+### jotcount
Adds JotX comments number to the selection when using the jotcount extender.
diff --git a/en/04_Extras/DocLister/02_Data processing before output.md b/en/04_Extras/DocLister/02_Data processing before output.md
index 93ca455c..58f882a6 100644
--- a/en/04_Extras/DocLister/02_Data processing before output.md
+++ b/en/04_Extras/DocLister/02_Data processing before output.md
@@ -1,34 +1,31 @@
+Most often, the data obtained are not displayed in pure form. For example, it is required to fulfill when displaying any conditions or treatments (displaying a preview for a picture, recalculating the price, formatting values).
-Чаще всего полученные данные выводятся не в чистом виде. Например, требуется выполнение при выводе каких-либо условий или обработок (вывод превью для картинки, пересчет цены, форматирование значений).
+The traditional way in MODX is to invoke snippets in output patterns or use modifiers (phx). This approach is often used by beginners because of its simplicity, but it increases the load on the parser and the database.
-Традиционным способом в MODX является вызов сниппетов в шаблонах вывода или использование модификаторов (phx). Такой подход часто используется новичками в силу простоты, но при этом увеличивается нагрузка на парсер и базу данных.
+DocLister provides the ability to preprocess data using php using the prepare parameter.
-В DocLister предусмотрена возможность предварительной обработки данных средствами PHP с помощью параметра prepare.
+The value of the prepare parameter can be:
-Значением параметра prepare может быть:
+ * snippet name
+ * call a method of a preloaded class.
+ * anonymous function.
-* имя сниппета;
-* вызов метода заранее загруженного класса;
-* анонимная функция.
+You can specify multiple values for sequential processing.
-Можно задавать несколько значений для последовательных обработок.
+## Using Snippets
+The snippet processes array values $data returns an array $data or false after processing. In the latter case, the data will not be displayed, i.e. you can use prepare in this way to filter the data.
-##Использование сниппетов
+You can also use the $_DocLister and $_extDocLister objects in the snippet.
-Сниппет обрабатывает значения массива $data после обработки возвращает массив $data или false. В последнем случае данные выводиться не будут, т.е. можно использовать prepare таким образом для фильтрации данных.
-
-Также в сниппете можно использовать объекты $_DocLister и $_extDocLister.
-
-Объект $_DocLister дает возможность обращаться к методам и свойствам контроллера. Например, можно подменить текущий шаблон вывода:
+The $_DocLister object enables you to access the methods and properties of the controller. For example, you can replace the current output template:
```
$_DocLister->renderTPL = "@CODE:[+pagetitle+]";
```
-В объекте $_extDocLister доступны методы getStore и setStore. setStore сохраняет, а getStore, соответственно, извлекает данные из памяти. Как только DocLister завершил свою работу, сохраненные блоки удаляются из памяти.
-
-##Использование методов класса
+The getStore and setStore methods are available in the $_extDocLister object. setStore stores, and getStore, respectively, retrieves data from memory. Once The DocLister has finished its work, the saved blocks are removed from memory.
+## Using Class Methods
```
class DLprepare {
public static function prepare(array $data = array(), DocumentParser $modx, $_DL, prepare_DL_Extender $_extDocLister) {
@@ -36,34 +33,27 @@ class DLprepare {
}
}
```
-Значение параметра в этом случае: DLprepare::prepare
-
-Аналогичным образом можно использовать анонимные функции.
+Parameter value in this case: DLprepare::p repare
-##Примеры из блога Agel Nash
-
-###Пример 1
-
-Итак, представим, что у нас есть некий вызов DocLister'a:
+Similarly, you can use anonymous functions.
+## Examples from the Agel Nash blog
+### Example 1
+So, let's imagine that we have some kind of DocLister call:
```
[[DocLister? &tpl=`tplChunk` &parents=`1`]]
```
-
-Где tplChunk это ни что иное, как:
-
+Where tplChunk is none other than:
```
[[if? &is=`[+longtitle+]:notempty` &then=`[+longtitle+]` &else=`[[snippet? &text=`[+pagetitle+]`]]`]]
```
+Inside the tplChunk chunk, there is a nested if call (let's say the one that was specified at the beginning of the topic). What do we do?
-Внутри чанка tplChunk имеется вложенный вызов if (допустим тот, что был указан в начале топика). Что мы делаем?
+Add the &prepare= parameter to the DocLister call (you can use any other value instead of a test).test
-Добавляем к вызову DocLister параметр &prepare=`test` (можно и не тест, а любое другое значение).
-
-Создаем сниппет с именем test (ну или с тем именем, которое было указано в параметре prepare)
-
-В сниппете пишем такой код:
+Create a snippet named test (or the name that was specified in the prepare parameter)
+In the snippet we write this code:
```
[+longtitle+]` &parents=`1`]]
```
+Now you can summarize: Checking conditions with php (using the prepare snippet) avoids unnecessary calls to nested snippets (nested calls occur only when the condition is true). And yet, in my humble opinion, inline templates are very convenient, because you can clearly see both the call and the template - all in 1 place.
-Теперь можно подвести итог: Проверка условий средствами php (при помощи сниппета prepare) позволяет избежать ненужных вызовов вложенных сниппетов (вложенных вызов происходит только тогда, когда условие true). А еще, на мой скромный взгляд, inline шаблоны это очень удобно, т.к. наглядно виден и сам вызов и шаблон - все в 1 месте.
-
-###Пример №2
-
-Этот пример будет сложнее для понимания. Но он еще более наглядно демонстрирует преимущество параметра prepare.
+### Example No 2
+This example will be harder to understand. But it demonstrates even more clearly the advantage of the prepare parameter.
-На сайте имеются несколько групп товаров (телефоны, телевизоры, магнитофоны). В каждой группе соответственно свои позиции, которые пользователь добавляет в корзину. На странице оформления заказа все выбранные позиции должны еще иметь подпись (к какой группе товаров они принадлежат). Помимо каждый товар в корзине имеет такие характеристики, как кол-во заказываемого товара, стоимость товара и общая стоимость с учетом количества. Так же нужно посчитать общее ИТОГО в виде полной суммы заказа.
-
-Упростим немного эту задачку переместив в TV-параметр count заказываемое количество позиций. А саму корзину выведем точным перечислением ID документов. Таким образом вызов принимает следующий вид:
+The site has several groups of products (phones, TVs, tape recorders). Each group has its own items, which the user adds to the cart. On the checkout page, all selected items must still have a signature (to which product group they belong). In addition, each product in the cart has characteristics such as the number of goods ordered, the cost of the goods and the total cost taking into account the quantity. You also need to calculate the total TOTAL in the form of the full amount of the order.
+Let's simplify this task a little by moving the ordered number of positions to the TV-parameter count. And the basket itself will be displayed by the exact listing of the ID of the documents. Therefore, the call takes the following form:
```
[!DocLister?
&documents=`5133, 5132, 5135, 5131, 5136`
@@ -104,9 +88,7 @@ $data['longtitle'] = "[[snippet? &text=`".$data['pagetitle']."`]]";
&ownerTPL=`@CODE:
Категория
Позиция
Остаток
Стоимость
Общая стоимость
[+dl.wrap+]
`
!]
```
-
-А чанк ListShop содержит такой код:
-
+And Chunk ListShop contains the following code:
```
[[FullPrice? &price=`[+tv.price+]` &count=`[+tv.count+]`]] руб.
```
-
-Если сниппет DocInfo всем знаком, то сниппет FullPrice это ни что иное, как банальное перемножение двух чисел:
-
+If the DocInfo snippet is familiar to everyone, then the FullPrice snippet is nothing more than a banal multiplication of two numbers:
```
```
+To make it clearer, this is what the resource tree looks like:
-Чтобы стало понятнее, вот так выглядит дерево ресурсов:
-
-Дерево ресурсов
-
-Добьем последний штрих - посчитаем на какую сумму у нас всего товаров в корзине. Для этого потребуется накидать небольшой сниппет, который пробежится опять по всем документам и посчитает общую сумму FullPrice. Назовем этот сниппет totalFullPrice (где 27 и 26 это ID тв-параметров с ценой и количеством):
+Resource tree
+Let's finish off the last touch - let's calculate for how much we have all the goods in the basket. To do this, you will need to throw a small snippet, which will run again through all the documents and calculate the total amount of FullPrice. Let's call this snippet totalFullPrice (where 27 and 26 are TV parameter ID with price and quantity):
```
$data){
return $price;
?>
```
+Since this is a basket, we make all calls to snippets unclassified and look at the result (I am interested in the total number of queries): 12 SQL queries to solve such a plough problem.
-Т.к. это корзина, то все вызовы сниппетов делаем не кешированными и смотрим на результат (меня интересует общее число запросов): 12 SQL запросов для решения такой плевой задачи.
-
-Пробуем теперь сделать тоже самое при помощи prepare сниппета.
-
+Now let's try to do the same thing with the prepare snippet.
```
[!DocLister?
&documents=`5133, 5132, 5135, 5131, 5136`
@@ -170,9 +146,7 @@ return $price;
&tvList=`price,count`
&ownerTPL=`@CODE:
Категория
Позиция
Остаток
Стоимость
Общая стоимость
[+dl.wrap+]
`!]
```
-
-Как видите, в этом случае мы опять отказались от чанка в пользу inline шаблона в котором используются 2 непонятных плейсхолдера - category и fullPrice. Давайте посмотрим на код сниппета prepare, чтобы стало понятнее:
-
+As you can see, in this case we again abandoned the chunk in favor of the inline template in which 2 incomprehensible placeholders are used - category and fullPrice. Let's take a look at the prepare snippet code to make it clearer:
```
setPlaceholder($key,$price);
return $data;
?>
-
```
-fullPrice это ни что иное, как банальное перемножение 2 числе (цены и количества). Согласитесь, нет необходимости для такой банальной операции создавать/вызывать еще 1 сниппет, когда можно произвести расчет прямо как говорится "не отходя от кассы".
-
-category запускает тот же самый DocInfo при помощи runSnippet (т.е. ничего не поменялось).
+fullPrice is nothing more than a banal multiplication of 2 numbers (price and quantities). Agree, there is no need for such a banal operation to create / call another 1 snippet, when you can make a calculation directly as they say "without departing from the cash register".
-А теперь самое главное! Создается глобальный плейсхолдер totalFullPrice, который можно уже использовать вне чанков DocLister'a! Если его нет - то устанавливается значение 0. Если есть, то к нему прибавляется fullPrice. Таким образом, мы избавляемся от необходимости делать повторную выборку тех же самых данных только ради того, чтобы посчитать общую стоимость. Т.е. считаем все и сразу. Соответственно вызов [!totalFullPrice!] на странице заменяется на [+totalFullPrice+] (я еще ни разу не встречал, чтобы подобные данных получали при помощи сниппета вложенного в чанк ListShop. Как правило их получают именно при помощи сниппета похожего на totalFullPrice.)
+category runs the same DocInfo using runSnippet (i.e. nothing has changed).
-Проверяем результат - 9 SQL запросов.
+And now the most important thing! A global totalFullPrice placement holder is being created, which can already be used outside of DocLister's chunks! If it is not present, the value is set to 0. If there is, then fullPrice is added to it. In this way, we get rid of the need to re-sample the same data just to calculate the total cost. That is, we count everything at once. Accordingly, the call [!totalFullPrice!] on the page is replaced by [+totalFullPrice+] (I have never seen such data obtained using a snippet nested in the ListShop chunk. As a rule, they are obtained using a snippet similar to totalFullPrice.)
-Давайте опять подведем итог: Благодаря prepare сниппету получилось избавиться от необходимости повторной обработки тех же самых данных, которые нужны для получения и вывода какой-то другой информации в произвольном месте этой же страницы.
+Check the result - 9 SQL queries.
-###Пример №3
-Этот пример еще сложнее, но одновременно с этим еще более полезней и интересней.
+Let's summarize again: Thanks to prepare, the snippet was able to get rid of the need to re-process the same data that is needed to obtain and display some other information at any place on the same page.
-Итак, если посмотреть внимательно на скриншот дерева ресурсов и список ID документов которые мы выводим, то можно заметить, что из разделов телевизоры и магнитофоны выводится по 2 документа. Таким образом, parents у документов 5135, 5131 и 5136, 5132 будут одинаковыми соответственно. Т.е. у первой пары parents будет 5638, а у второй 5639. Что нам это дает? А это дает вот что - мы целых 2 раза вызываем DocInfo просто так. Представьте, вы получили pagetitle документа 5638 и запомнили его. Если он понадобился вам опять - то вы не повторно его запрашиваете, а сразу используете.
+### Example No 3
+This example is even more complicated, but at the same time even more useful and interesting.
-Именно для этой цели в DocLister, а если быть точнее в экстендере prepare есть 2 метода: getStore и setStore. Один сохраняет, а второй соответственно извлекает данные из памяти. Как только DocLister завершил свою работу, сохраненные блоки удаляются из памяти (массив автоматически очищается) и все работает дальше без каких-либо глюков, как это могло бы быть, если бы мы сохраняли временные данные в глобальный массив плейсхолдеров. Более того, при таком подходе и больших объемах потребовалось бы очень много памяти...
+So, if you look carefully at the screenshot of the resource tree and the list of IDs of documents that we display, you can see that 2 documents are displayed from the TV and tape recorders sections. Thus, the parents of documents 5135, 5131 and 5136, 5132 will be the same respectively. That is, the first pair of parents will have 5638, and the second 5639. What does this give us? And this gives this - we call DocInfo as many as 2 times just like that. Imagine you received the pagetitle of document 5638 and remembered it. If you need it again, then you do not re-request it, but immediately use it.
-Ладно, хватит лирики. Давайте посмотрим как можно переписать сниппет prepare с учетом getStore и setStore:
+It is for this purpose that docLister, or to be more precise, the prepare extender, has 2 methods: getStore and setStore. One stores, and the second, respectively, retrieves data from memory. Once DocLister has finished its work, the saved blocks are deleted from memory (the array is automatically cleared) and everything runs on without any glitches, as it might be if we saved the temporary data to a global array of placeholders. Moreover, with this approach and large volumes, a lot of memory would be required...
+Okay, enough lyrics. Let's see how you can rewrite the prepare snippet with getStore and setStore in mind:
```
if(($data['category']=$_extDocLister->getStore('currentParents'.$data['parent'])) === null){
//[[DocInfo? &docid=`[+parent+]` &field=`pagetitle`]]
@@ -218,15 +190,14 @@ if(($data['category']=$_extDocLister->getStore('currentParents'.$data['parent'])
$_extDocLister->setStore('currentParents'.$data['parent'], $data['category']);
}
```
+I didn't copy-paste the entire source, I just quoted the modified part. But I think it's clear that we've wrapped up calling the DocInfo snippet into these 2 functions. And as a unique key, they specified currentParents[+parent+]. Thus, modx needed only 7 SQL queries to generate the same page.
-Я не стал копипастить весь исходник, а только процитировал измененную часть. Но думаю тут и так понятно, что мы "обернули" вызов сниппета DocInfo в эти 2 функции. А в качестве уникального ключа указали currentParents[+parent+]. Таким образом, для формирований этой же страницы MODX-у потребовалось всего 7 SQL запросов.
-
-Таким образом: сниппет prepare позволяет не только обрабатывать данные, но и исключить бесполезное повторное выполнение кода.
+Thus: the prepare snippet allows not only to process data, but also to exclude useless re-execution of code.
-##Обработка шаблона обертки
-После того, как каждый документ обработан, DocLister пытается применить обертку ownerTPL. Порой бывает необходимо эту обертку дополнительно обработать и возможно подменить в зависимости от различных условий (кол-во выводимых документов, даты и т.п.).
+## Process a wrapper template
+After each document is processed, DocLister attempts to apply the ownerTPL wrapper. Sometimes it is necessary to further process this wrapper and it is possible to replace it depending on various conditions (number of documents to be displayed, dates, etc.).
-### Вывод 3 блоков с равномерным наполнением за 1 вызов
+### Output of 3 blocks with uniform filling in 1 call
```
return $modx->runSnippet('DocLister', array(
'ownerTPL' => '@CODE:
@@ -267,7 +238,7 @@ return $modx->runSnippet('DocLister', array(
}
));
```
-### Подстановка данных в шаблон обертку для меню определенного уровня
+### Lookup data into a template wrapper for a specific level of menu
```
return $modx->runSnippet('DLBuildMenu', array(
'idType' => 'parents',
diff --git a/en/04_Extras/DocLister/03_Templates.md b/en/04_Extras/DocLister/03_Templates.md
index 33bdf959..1ee0d76d 100644
--- a/en/04_Extras/DocLister/03_Templates.md
+++ b/en/04_Extras/DocLister/03_Templates.md
@@ -1,211 +1,169 @@
-##Templates
+## Templates
-По умоланию считается, что в параметрах шаблона передано имя чанка. Но если имя чанка начинается с символа @, то происходит сверка начального слова в имени шаблона с заранее зарезервироваными правилами загрузки шаблонов. Все последующие слова используется в качестве параметра к выбранному правилу.
+By prayer, it is assumed that the name of the chunk is passed in the parameters of the template. However, if the chunk name begins with the @ symbol, the initial word in the template name is checked against the pre-reserved template loading rules. All subsequent words are used as a parameter to the selected rule.
-__@FILE__
-Загрузка шаблона из html файла расположенного в папке или подпапках assets/templates/
+__@FILE__ Loading a template from an html file located in the assets/templates/ folder or subfolders
-__@CHUNK__
-Обычная загрузка шаблона из чанка
+__@CHUNK__ Normal template loading from chunk
-__@TPL, @CODE__
-Значение параметра используется в роли inline шаблона
+__@TPL__ __@CODE__ parameter value is used in the inline role of the template
-__@DOCUMENT, @DOC__
-Шаблон берется из content поля указанного документа
+__@DOCUMENT__ __@DOC__ Template is taken from the content field of the specified document
-__@PLH, @PLACEHOLDER__
-Шаблон загружается из глобального плейсхолдера MODX
+__@PLH__ __@PLACEHOLDER__ Template is downloaded from the MODX Global Placeholder
-__@CFG, @CONFIG, @OPTIONS__
-Шаблон берется из глобальных настроек текущей установки MODX Evolution
+__@CFG__, __@CONFIG__, __@OPTIONS__ Template is taken from the global settings of the current MODX Evolution installation
-Стоит заметить, что даже если начальный символ был @ и после обработки всех правил шаблон все равно оказался пустым, то происходит попытка обнаружить чанк по полному имени шаблона
+It is worth noting that even if the initial character was @ and after processing all the rules the template was still empty, then an attempt is made to detect the chunk by the full name of the template
-##Плейсхолдеры
+## Placeholders
-Плейсхолдеры в DocLister:
+DocLister Placeholders:
-* плейсхолдер таблицы, имя такого плейсхолдера совпадает с названием колонки в таблице;
-* виртуальный плейсхолдер, который стал доступен после запуска экстендера или каких-то вычислений внутри контроллера;
-* глобальный плейсхолдер, который доступен из вне шаблонов передаваемых в сниппет (как правило имеет префикс dl и может быть переопределен при помощи параметров sysKey или id).
+* table placeholder, the name of such a placeholder coincides with the name of the column in the table;
+* virtual placeholder, which became available after starting the extender or some calculations inside the controller;
+* a global placeholder that is accessible from outside the templates passed to the snippet (usually prefixed with dl and can be overridden using the sysKey or id parameters).
-> Экстендер в DocLister - это вспомогательный класс для каких-либо обработок, не имеет ничего общего с экстендерами Ditto.
+> The extender in DocLister is a helper class for any processing, has nothing to do with Ditto extenders.
-###Плейсхолдеры таблицы
+### Table Placeholders
-Если указан контроллер site_content или любой другой его расширяющий, то по умолчанию используется таблица site_content. В случае с контроллером onetable имя таблицы определяется параметром table. Таким образом, получить полный список плейсхолдеров можно открыв таблицу mysql, например, через phpmyadmin и подсмотрев какие в этой таблице имеются поля.
+If you specify a site_content controller or any other controller that extends it, the default site_content table is used. In the case of the onetable controller, the table name is determined by the table parameter. Thus, you can get a complete list of placeholders by opening the mysql table, for example, through phpmyadmin and looking at what fields are in this table.
-###Виртуальный плейсхолдер
+### Virtual Placeholder
-####Плейсхолдеры устанавливаемые экстендером paginate
+#### Placeholders installed by the paginate extender
-__[+параметр_id.pages+]__
-Пагинация
+__[+parameter_id.pages+]__ Pagination
-__[+параметр_id.totalPages+]__
-Общее число страниц
+__[+parameter_id.totalPages+]__ Total number of pages
-__[+параметр_id.isstop+]__
-1 если текущая страница — последная
+__[+parameter_id.isstop+]__ 1 if the current page is the last page
-__[+параметр_idisstart+]__
-1 если текущая страница — первая
+__[+parameter_idisstart+]__ 1 if the current page is the first
-####Плейсхолдеры устанавливаемые экстендером jotcount
+#### Placeholder installed by the jotcount extender
-Экстендер загружается, если при вызове сниппета задан параметр __&jotcount__.
+The extender loads if the &jotcount parameter is specified when the snippet is invoked.
-__[+jotcount+]__
-Число комментариев из сниппета JOT
+__[+jotcount+]__ Number of comments from jot snippet
-####Плейсхолдеры устанавливаемые экстендером tv
+#### Placeholder installed by the tv extender
-__[+tv.имяТВпараметра+]__
-Значение ТВ параметра
+__[+tv.nameTIntro+]__ Tv parameter value
-По умолчанию ко всем ТВ параметрам добавляется префикс tv, но от него можно избавиться или переопределить параметром tvPrefix.
+By default, the tv prefix is added to all TV settings, but you can get rid of it or override it with the tvPrefix parameter.
-####Плейсхолдеры устанавливаемые экстендером e
+#### Placeholder installed by extender e
-Экстендер загружается, если при вызове сниппета задан параметр __&е=`имена полей через запятую`__
+The extender loads if the parameter &e=comma-separated field names are specified when the snippet is invoked
-__[+e.имяПоля+]__
-Экранированное значение поля.
+__[+e.namefield+]__ The escaped value of the field.
-####Плейсхолдеры устанавливаемые экстендером summary
+#### Placeholder set by the extender summary
-__[+summary+]__
-Аннотация к странице
+__[+summary+]__ Annotation to the page
-####Плейсхолдеры устанавливаемые экстендером user
+#### Placeholder set by the user extender
-Экстендер необходимо загрузить вручную, указав его имя в параметре &extender. Также должны быть заданы параметры:
-* usertype - возможные значения: manager, mgr, web. Определяет из каких таблиц брать данные пользователей;
-* userFields - названия колонок через запятую, в которых указан id пользователя, например createdby, publishedby.
+The extender must be loaded manually by specifying its name in the &extender parameter. The following parameters must also be specified:
-__[+user.id.НазваниеКолонки+]__
-ID пользователя
+* usertype - possible values: manager, mgr, web. Determines which tables to take user data from;
+* userFields - comma-separated column names in which the user id is specified, for example, createdby, publishedby.
-__[+user.username.НазваниеКолонки+]__
-Логин пользователя
+__[+user.id.ColumnName+]__ User ID
-__[+user.fullname.НазваниеКолонки+]__
-Полное имя пользователя
+__[+user.username.NameColumn+]__ User login
-__[+user.role.НазваниеКолонки+]__
-ID роли пользователя
+__[+user.fullname.Columnname+]__ Full username
-__[+user.email.НазваниеКолонки+]__
-e-mail
+__[+user.role.NameColumn+]__ User Role ID
-__[+user.phone.НазваниеКолонки+]__
-Телефон
+__[+user.email.NameColumn+]__ e-mail
-__[+user.mobilephone.НазваниеКолонки+]__
-Мобильный телефон
+__[+user.phone.NameColumn+]__ Phone
-__[+user.blocked.НазваниеКолонки+]__
-Статус блокировки
+__[+user.mobilephone.NameColumns+]__ Mobile phone
-__[+user.blockeduntil.НазваниеКолонки+]__
-До какого UNIX-времени пользователь будет заблокирован
+__[+user.blocked.ColumnName+]__ Lock Status
-__[+user.blockedafter.НазваниеКолонки+]__
-После какого UNIX-времени пользователь будет заблокирован
+__[+user.blockeduntil.Columnname+]__ Until what UNIX-time the user will be locked
-__[+user.logincount.НазваниеКолонки+]__
-Общее число авторизаций
+__[+user.blockedafter.NameColumn+]__ After which UNIX-time the user will be blocked
-__[+user.lastlogin.НазваниеКолонки+]__
-UNIX-время последней авторизации
+__[+user.logincount.Columnname+]__ Total number of authorizations
-__[+user.thislogin.НазваниеКолонки+]__
-UNIX-время текущей авторизации
+__[+user.lastlogin.ColumnName+]__ UNIX last authorization time
-__[+user.failedlogincount.НазваниеКолонки+]__
-Число неудачных попыток авторизоваться
+__[+user.thislogin.ColumnName+]__ UNIX time of current authorization
-__[+user.lastlogin.НазваниеКолонки+]__
-UNIX-время последней авторизации
+__[+user.failedlogincount.NameColumn+]__ Number of failed login attempts
-__[+user.dob.НазваниеКолонки+]__
-Дата рождения
+__[+user.lastlogin.ColumnName+]__ UNIX last authorization time
-__[+user.gender.НазваниеКолонки+]__
-Пол
+__[+user.dob.NameColumn+]__ Date of birth
-__[+user.country.НазваниеКолонки+]__
-Страна
+__[+user.gender.NameColumn+]__ Gender
-__[+user.state.НазваниеКолонки+]__
-Регион
+__[+user.country.NameColumn+]__ Country
-__[+user.zip.НазваниеКолонки+]__
-Почтовый индекс
+__[+user.state.Columnname+]__ Region
-__[+user.fax.НазваниеКолонки+]__
-Факс
+__[+user.zip.NameColumn+]__ Postal code
-__[+user.photo.НазваниеКолонки+]__
-Фотография
+__[+user.fax.NameColumn+]__ Fax
-__[+user.comment.НазваниеКолонки+]__
+__[+user.photo.NameColumn+]__ Photo
-####Плейсхолдеры устанавливаемые в контроллерах site_content
+__[+user.comment.NameColumn+]__
-__[+title+]__
-Название документа для списков. Если menutitle пуст, то используется pagetitle
+#### Placeholder installed in site_content controllers
-__[+iteration+]__, __[+ЗначениеПараметраsysKey.full_iteration+]__
-Порядковый номер элемента в списке; порядковый номер в списке с учетом пагинации.
+__[+title+]__ The name of the document for the lists. if menutitle is empty pagetitle is used
-**Примечание:** для контроллера **site_content** и для контроллера **shopkeeper** плейсхолдер [+iteration+] выглядит как указано выше - [+iteration+] без префикса, а для контроллера **onetable** - как [+ЗначениеПараметраsysKey.iteration+] с префиксом. Префикс ЗначениеПараметраsysKey по умолчанию равен dl, то есть для **onetable** этот плейсхолдер по умолчанию - [+dl.iteration+].
+__[+iteration+]__, __[+Parameter Value sysKey.full_iteration+]__ The sequence number of an item in the list; serial number in the list taking into account pagination.
-__[+url+]__
-Ссылка на документ
+Note: for the site_content controller and for the shopkeeper controller, the placeholder __[+iteration+]__ looks like the above - __[+iteration+]__ without prefix, and for the onetable controller - as __[+ValueSysKey.iteration+]__ with a prefix. The default value of the SysKey parameter is dl, which means that for onetable this default placeholder is __[+dl.iteration+]__.
-__[+date+]__
-дата публикации документа сформированая по правилам указаным в параметре dateFormat (по умолчанию %d.%b.%y %H:%M). Помимо этого учитывается server_offset_time в настройках движка.
+__[+url+]__ Link to the document
-__[+ЗначениеПараметраsysKey.active+]__
-Флаг определяющий, что обрабатываемый документ совпадает и документ на котором был вызван сниппет это одно и тоже (1 - если правда, 0 если нет)
+__[+date+]__ the date of publication of the document is formed according to the rules specified in the dateFormat parameter (by default%, %d.%b.%y %H:%M). In addition, the server_offset_time in the engine settings is taken into account.
-__[+ЗначениеПараметраsysKey.class+]__
-Классы которые могут быть автоматически присвоены документу (first, last, current, odd, even)
+__[+ValueThe parametersysKey.active+]__ Flag indicating that the processed document coincides and the document on which the snippet was called is the same thing (1 - if true, 0 if not)
-__[+ЗначениеПараметраsysKey.wrap+]__
-HTML код списка подготовленный для вывода пользователю (используется только для шаблона ownerTPL)
+__[+ValueSYsKey parameter.class+]__ Classes that can be automatically assigned to a document (first, last, current, odd, even)
-##Параметры для установки плейсхолдеров
+__[+ValueThe ParametersysKey.wrap+]__ HTML code of the list prepared for display to the user (used only for the ownerTPL template)
-###sysKey
+## Options for setting placeholders
-Префикс для системных плейсхолдеров.
+### sysKey
-Возможные значения - любая строка. На выходе получается плейсхолдер с именем [+sysKey.placeholder+], где sysKey это значение данного параметра
+The prefix for system placeholders.
-Значение по умолчанию - dl
+The possible values are any string. The output is a placeholder named __[+sysKey.placeholder+]__, where sysKey is the value of this parameter
-###id
+The default value is dl
-Префикс для локальных плейсхолдеров.
+### id
-Возможные значения - любая строка. Если id указано, то на выходе получается [+id.placeholder+]. Где id это и есть переданое значение. В случае если id не задано, то перед именем плейсхолдера точка не ставится.
+The prefix for local placeholders.
-Значение по умолчанию - пусто.
+The possible values are any string. If id is specified, the output is __[+id.placeholder+]__. Where id is the value passed. If the id is not specified, then a period is not put before the name of the placeholder.
-##Параметры вывода в шаблоны
+The default value is empty.
-###ownerTPL
+## Options output to templates
-Шаблон в который оборачивается список результатов. Если подходящих результатов не обнаружено, то по умолчанию результат с шаблоном noneTPL тоже оборачивается в этот шаблон. За подробностями обращайтесь к описанию параметра noneWrapOuter.
+### ownerTPL
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+A template in which the list of results is wrapped. If no matching results are found, then by default the result with the noneTPL template is also wrapped in that template. For details, refer to the description of the noneWrapOuter parameter.
-Значение по умолчанию - пусто.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-####Пример:
+The default value is empty.
+
+#### Example:
```
&ownerTPL=`@CODE:
@@ -213,16 +171,15 @@ HTML код списка подготовленный для вывода пол
`
```
+### tpl
-###tpl
-
-Шаблон.
+Template.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister. Значение параметра может быть изменено из prepare-сниппета c помощью свойства $_DocLister->renderTPL.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister. The value of the parameter can be changed from the prepare snippet using the $_DocLister->renderTPL property.
-Значение по умолчанию - определяется в контроллере.
+The default value is defined in the controller.
-####Пример:
+#### Example:
```
&tpl=`@CODE:
@@ -231,261 +188,255 @@ HTML код списка подготовленный для вывода пол
`
```
+### tplId1, tplId2, ..., tplIdN
-###tplId1, tplId2, ..., tplIdN
-
-Шаблон для оформления документа под номером 1, 2 и т.д., где номер - это номер итерации начиная с 1.
-
-Значение по умолчанию берется из значения параметра tpl.
+A template for issuing a document under the number 1, 2, etc., where the number is the iteration number starting from 1.
-**Примечание:** Обратите внимание, Id в названиях шаблонов не должно вводить вас в заблуждение, на самом деле номер - это не Id документа, а его номер по порядку в выводе (номер итерации).
+The default value is taken from the value of the tpl parameter.
-###tplOdd, tplEven
+Note: Please note, the Id in the template names should not mislead you, in fact the number is not the Id of the document, but its number in order in the output (iteration number).
-Шаблон для оформления четного/нечетного документа.
+### tplOdd, tplEven
-Значение по умолчанию берется из значения параметра tpl.
+Template for even/odd document formatting.
-###tplFirst
+The default value is taken from the value of the tpl parameter.
-Шаблон для оформления первого документа в списке. Синоним параметра tplId1, но имеет больший приоритет.
+### tplFirst
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister. Если не задано, то совпадает с шаблоном tpl.
+Template for the design of the first document in the list. The parameter is synonymous with tplId1, but takes precedence.
-Значение по умолчанию - пусто.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister. If not specified, it matches the tpl pattern.
-###tplLast
+The default value is empty.
-Шаблон для оформления последнего документа в списке.
+### tplLast
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister. Если не задано, то совпадает с шаблоном tpl.
+Template for the last document in the list.
-Значение по умолчанию - пусто.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister. If not specified, it matches the tpl pattern.
-###tplСurrent
+The default value is empty.
-Шаблон для оформления текущего документа в списке документов.
+### tplСurrent
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister. Если не задано, то совпадает с шаблоном tpl.
+A template for formatting the current document in the list of documents.
-Значение по умолчанию - пусто.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister. If not specified, it matches the tpl pattern.
-###noneTPL
+The default value is empty.
-Шаблон с уведомлением о том, что по заданным критериям ничего не обнаружено.
+### noneTPL
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+A template with a notification that nothing was detected according to the specified criteria.
-Значение по умолчанию - пусто.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-###noneWrapOuter
+The default value is empty.
-Оборачивать ли ответ noneTPL в шаблон ownerTPL. Параметр актуален только в том случае, если нет документов для построения списка и задан ownerTPL.
+### noneWrapOuter
-Возможные значения - 1 или 0.
+Wrap the noneTPL response into the ownerTPL template. The parameter is relevant only if there are no documents to build the list and the ownerTPL is set.
-Значение по умолчанию - 1.
+The possible values are 1 or 0.
-##Пагинация
+The default value is 1.
-###paginate
+## Pagination
-Вывод данных с пагинацией. Смотрите плейсхолдеры устанавливаемые экстендером paginate.
+### paginate
-Возможные значения:
+Data output with pagination. See placeholders set by the paginate extender.
-* offset - пагинация в стиле Ditto;
-* pages - пагинация с прострелами.
+Possible values are:
-Значение по умолчанию - pages.
+offset - pagination in the style of Ditto;
+pages - pagination with shoots.
+The default value is pages.
-###TplFirstP
+### TplFirstP
-Шаблон для вставки ссылки "первая страница".
+Template for inserting a "first page" link.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию: пусто.
+The default value is empty.
-###TplLastP
+### TplLastP
-Шаблон для вставки ссылки "последняя страница".
+A template for inserting a "last page" link.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию: пусто.
+The default value is empty.
-###TplNextP
+### TplNextP
-Шаблон для вставки ссылки "следующая страница".
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Template for inserting a "next page" link. Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE: ' . $this->DocLister->getMsg('paginate.next', 'Next') . ' >
```
+There are no placeholders to substitute data from the language pack yet.
-Плейсхолдеров для подстановки данных из языкового пакета пока нет.
+### TplPrevP
-###TplPrevP
+Template for inserting a previous page link.
-Шаблон для вставки ссылки "предыдущая страница".
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию:
+The default value is:
```
@CODE: < ' . $this->DocLister->getMsg('paginate.prev', 'Prev') . '
```
+There are no placeholders to substitute data from the language pack yet.
-Плейсхолдеров для подстановки данных из языкового пакета пока нет.
-
-###TplPage
+### TplPage
-Шаблон для вставки номера страницы в пагинатор.
+A template for inserting a page number into a paginator.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE: [+num+]
```
-###TplCurrentPage
+### TplCurrentPage
-Шаблон оформления текущей страницы в пагинаторе
+Current page design template in paginator
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE: [+num+]
```
-###TplWrapPaginate
+### TplWrapPaginate
-Шаблон контейнер для обертки страниц пагинации.
+Template container for wrapping pages pagination.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE:
[+wrap+]
```
-###pageLimit
+### pageLimit
-Число страниц отображаемое в пагинаторе.
+The number of pages displayed in the paginator.
-Возможные значения - целое число больше ноля.
+The possible values are an integer greater than zero.
-Значение по умолчанию - 1.
+The default value is 1.
-###pageAdjacents
+### pageAdjacents
-Максимальное число страниц слева и справа относительно текущей страницы.
+The maximum number of pages on the left and right relative to the current page.
-Возможные значения - целое число больше ноля.
+The possible values are an integer greater than zero.
-Значение по умолчанию - 4.
+The default value is 4.
-###PaginateClass
+### PaginateClass
-Класс для контейнера в который будут вложены страницы пагинации.
+The class for the container in which the pagination pages will be nested.
-Возможные значения - любая строка сформированная по правилам для подстановки в HTML аттрибут тегов class.
+Possible values - any string generated according to the rules for substitution in HTML attributes of class tags.
-Значение по умолчанию - paginate.
+The default value is paginate.
-###PrevNextAlwaysShow
+### PrevNextAlwaysShow
-Всегда показывать "следующая страница" и "предыдущая страница".
+Always show "next page" and "previous page".
-Возможные значения - 1 или 0.
+The possible values are 1 or 0.
-Значение по умолчанию - 0.
+The default value is 0.
-###TplFirstI
+### TplFirstI
-Шаблон для вставки ссылки "первая страница", используется совместно с PrevNextAlwaysShow.
+A template for inserting a "first page" link is used in conjunction with PrevNextAlwaysShow.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию: пусто.
+The default value is empty.
-###TplLastI
+### TplLastI
-Шаблон для вставки ссылки "последняя страница", используется совместно с PrevNextAlwaysShow.
+A template for inserting a "last page" link is used in conjunction with PrevNextAlwaysShow.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию: пусто.
+The default value is empty.
-###TplNextI
+### TplNextI
-Шаблон для вставки неактивной ссылки "следующая страница", используется совместно с PrevNextAlwaysShow.
+A template for inserting an inactive "next page" link is used in conjunction with PrevNextAlwaysShow.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE: [%paginate.next%] >
```
-###TplPrevI
+### TplPrevI
-Шаблон для вставки неактивной ссылки "предыдущая страница", используется совместно с PrevNextAlwaysShow.
+A template for inserting an inactive "previous page" link is used in conjunction with PrevNextAlwaysShow.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE: < [%paginate.prev%]
```
+### TplDotsPage
-###TplDotsPage
-
-Шаблон прострела.
+Shooting template.
-Возможные значения - имя шаблона указанное по правилам задания шаблонов в DocLister.
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
-Значение по умолчанию:
+The default value is:
```
@CODE: ...
```
-###noRedirect
+### noRedirect
-Запрещает переадресацию при запросе несуществующей страницы.
+Prevents redirects when a page that does not exist is requested.
-Возможные значения - 0 или 1.
+The possible values are 0 or 1.
-Значение по умолчанию - 0.
+The default value is 0.
-##Вывод в плейсхолдеры
+## Inference to placeholders
-###contentPlaceholder
+### contentPlaceholder
-Установка значений документов в персонализованные плейсхолдеры.
+Set document values in personalized placeholders.
-Возможные значения - 0, 1. Если значение параметра равно 1, то DocLister создает плейсхолдеры вида [+id.item[x]+]. Где x это порядковый номер документа в списке, а id это значение параметра id (см. описание параметра id).
+The possible values are 0, 1. If the parameter value is 1, DocLister creates placeholders of the form [+id.item[x]+]. Where x is the sequence number of the document in the list and id is the value of the id parameter (see the id parameter description).
-Значение по умолчанию - 0
+The default value is 0
-##API-режим
+## API Mode
-###api
+### api
-Используется для формирования выдачи в формате JSON.
+Used to generate output in JSON format.
-Возможные значения - 0, 1 или список полей выбираемых документов.
+The possible values are 0, 1 or the list of selectable document fields.
-Значение по умолчанию - 0.
+The default value is 0.
-###JSONformat
+### JSONformat
-По какому принципу формировать JSON-ответ.
+On what principle to form a JSON-response.
-Возможные значения - old, new. В формате old ответ выглядит в виде обычного массива. В формате new ответ заворачивается в rows секцию + добавляется примесь total в которой указано общее число учавствующих в выборке
+The possible values are old, new. In the old format, the response looks like a regular array. In the new format, the answer is wrapped in a rows section + an admixture total is added in which the total number of participants in the sample is indicated
-Значение по умолчанию - old.
+The default value is old.
diff --git a/en/04_Extras/DocLister/04_Filters.md b/en/04_Extras/DocLister/04_Filters.md
index 586ec729..fa32657c 100644
--- a/en/04_Extras/DocLister/04_Filters.md
+++ b/en/04_Extras/DocLister/04_Filters.md
@@ -1,89 +1,88 @@
-##Filters
+## Filters
-В комплекте следующие фильтры:
+The following filters are included:
-* content - для фильтрации по полям таблицы site_content, можно заменить параметром addWhereList;
-* tv - для фильтрации по TV-параметрам;
-* tvd - для фильтрации по TV-параметрам с учетом значений по умолчанию;
-* private - для фильтрации документов с учетом прав доступа.
+* content - to filter by the fields of the table, site_content can be replaced with the addWhereList parameter;
+* tv - for filtering by TV-parameters;
+* tvd - to filter by TV-parameters taking into account the default values;
+* private - to filter documents taking into account access rights.
-##Построение фильтра
-####Пример
+# filter
+## Construction
+#### Example
```
OR(AND(filter:field:operator:value;filter2:field:operator:value);(...))
```
+## Operators
-##Операторы
-###=, eq, is
+### =, eq, is
+Equally.
-Равно.
+### !=, no, isnot
+Not equal.
+NB: By design this creates a WHERE call which will include IS NULL. This may produce undesired results when trying to filter for empty values.
+#### Example:
+AND(tv:images:!=;)
+Would show all records. Please use isnull
-###!=, no, isnot
+### isnull
+empty records
-Не равно.
+### isnotnull
+records containing something
-###>, gt
+### >, gt
+More than.
-Больше.
+### <, lt
+Less than.
-###<, lt
+### <=, elt
+Less than or equal.
-Меньше.
+### >=, egt
+Greater than or equal to.
-###<=, elt
+### %, like
+Contains a string.
-Меньше или равно.
+### like-r
+Starts with a string.
-###>=, egt
-Больше или равно.
+### like-l
+Ends with a string.
-###%, like
-Содержит строку.
+### regexp Fetch using REGEXP regular expressions.
-###like-r
-Заканчивается строкой.
+### against Full-text search.
+#### Example
-###like-l
-Начинается строкой.
-
-###regexp
-Выборка с использованием регулярных выражений [REGEXP](https://dev.mysql.com/doc/refman/5.5/en/regexp.html).
-
-###against
-Полнотекстовый поиск.
-####Пример
```
-[[DocLister? &filters=`AND(content:pagetitle,description,content,introtext:against:искомая строка)`]]
+[[DocLister? &filters=`AND(content:pagetitle,description,content,introtext:against:search string)`]]
```
-Из данного примера предполагается, что в базе данных имеется FULLTEXT индекс по полям pagetitle,description,content,introtext
+This example assumes that the database has a FULLTEXT index on the fields pagetitle,description,content,introtext
-###containsOne
-Поиск любого слова или его части в тексте при помощи LIKE.
-####Примера:
-```
-[[DocLister? &filters=`AND(content:content:containsOne:когда,наступит,мир)`]]
-```
-Будет построен SQL запрос вида
+### containsOne
+Search for any word or part of it in text using LIKE.
+
+#### Example:
```
-(content LIKE '%когда%' OR content LIKE '%наступит%' OR content LIKE '%мир%')
+[[DocLister? &filters=`AND(content:content:containsOne:when,will come,peace)`]]
```
-Т.е. в конечном счете из базы будут выбраны документы в тексте которых используется слова "когда" или "наступит" или "мир".
-Из примера вызова видно, что слова разделены запятой. Это поведение можно переопределить параметром ___filter_delimiter___.
+A SQL query of the form will be built
-###in
-Входит в множество.
+(content LIKE '%when%' OR content LIKE '%will come%' OR content LIKE '%peace%')
+That is, in the end, documents will be selected from the database in the text of which the words "when" or "will come" or "peace" are used. From the sample call, you can see that the words are separated by a comma. You can override this behavior with the filter_delimiter parameter.
-###notin
-Не входит в множество.
+### in Included in the set.
-####Пример вызова с фильтрацией по цене от 0 до 300:
+### notin Not included in the set.
+#### Example of a call with filtering at a price from 0 to 300:
```
[[DocLister? &filters=`AND(tv:price:gt:0;tv:price:lt:300)`]]
```
-
-А теперь тоже самое, только с учетом значений по умолчанию
-
+And now it's the same, only taking into account the default values
```
[[DocLister? &filters=`AND(tvd:price:gt:0;tvd:price:lt:300)`]]
-```
\ No newline at end of file
+```
diff --git a/en/04_Extras/DocLister/05_Options.md b/en/04_Extras/DocLister/05_Options.md
index bbfd503f..21d5a86b 100644
--- a/en/04_Extras/DocLister/05_Options.md
+++ b/en/04_Extras/DocLister/05_Options.md
@@ -1,11 +1,11 @@
-##Options
+## Options
-###customLang
+### customLang
-Загрузка произвольного лексикона.
+Loading an arbitrary lexicon.
-Возможные значения - имя php файла из папки /lang/ с ассоциативным массивом $_lang
+The possible values are the name of the php file from the /lang/ folder with the associative array $_lang
-Значение по умолчанию - пусто.
+The default value is empty.
-При помощи лексикона можно переопределить как стандартные языковые сообщения из папки /core/lang/[(manager_language)]/, так и создавать новые. Для переопределения важно в массиве указывать полные название стандартного языкового ключа (например, core.test или paginate.next). Для использования лексикона достаточно в шаблоне написать тег [%КлючЛексикона%]
\ No newline at end of file
+Using the lexicon, you can override both standard language messages from the /core/lang/[(manager_language)]/ folder and create new ones. To override, it is important to specify the full name of the standard language key in the array (for example, core.test or paginate.next). To use the lexicon, it is enough to write the [%Lexicon Key%] tag in the template
diff --git a/en/04_Extras/DocLister/06_Examples.md b/en/04_Extras/DocLister/06_Examples.md
index 6c6ecf73..4adeacf3 100644
--- a/en/04_Extras/DocLister/06_Examples.md
+++ b/en/04_Extras/DocLister/06_Examples.md
@@ -1,4 +1,4 @@
-##A simple example without pagination
+## A simple example without pagination
```
[!DocLister?
@@ -31,7 +31,7 @@ For clarity, dl-list-item chunk:
```
-##Using configs
+## Using configs
```
[!DocLister?
@@ -55,7 +55,7 @@ Then create the JSON file test.json in the /config/custom/ snippet subfolder wit
The result of this call will be identical to the previous example.
-##Using lexicon
+## Using lexicon
```
[!DocLister?
@@ -77,7 +77,7 @@ return $_lang;
Now in the example chunk you can use the tag [%newsTitle%] and it will automatically be replaced with the "Latest News" message.
-##A complex example with pagination
+## A complex example with pagination
```
[!DocLister?
@@ -122,7 +122,7 @@ For clarity, dl-list-item chunk
```
-##Example of displaying information from a table other than site_content
+## Example of displaying information from a table other than site_content
```
[!DocLister?
diff --git a/en/04_Extras/DocLister/08_Developers.md b/en/04_Extras/DocLister/08_Developers.md
index 2d6bc163..24ca6a82 100644
--- a/en/04_Extras/DocLister/08_Developers.md
+++ b/en/04_Extras/DocLister/08_Developers.md
@@ -1,22 +1,22 @@
-##Controllers
+## Controllers
-Имя класса расположенного в файле php файле должно заканчиваться на DocLister, а сам класс должен быть унаследован от абстрактного класса DocLister.
+The class name located in the php file must end in DocLister, and the class itself must be inherited from the abstract DocLister class.
-В параметре dir можно указать пусть от корня сайта к папке с контроллером.
+In the dir parameter, you can specify let from the site root to the folder with the controller.
-##Экстендеры
+## Extenders
-Экстендеры могут загружаться из контроллера или с помощью параметра extenders, в котором перечислены имена файлов *.extender.inc из папки /core/extender/
+Extenders can be loaded from the controller or by using the extenders parameter, which lists the *.extender.inc file names from the /core/extender/ folder
-Загружаемый экстендер должен быть классом имя которого должно начинаться с имени экстендера и заканчиваться на _DL_Extender. Помимо этого, загружаемый экстендер должен быть унаследован от абстрактного класса extDocLister.
+The extender to be loaded must be a class whose name must begin with the name of the extender and end with the _DL_Extender. In addition, the loadable extender must inherit from the abstract extDocLister class.
-##Фильтры
+## Filters
-Правила фильтрации можно найти в файле *.filter.php по имени фильтра из папки /core/filter/. Класс в файле должен быть унаследован от абстрактного гласса filterDocLister, а само имя должно заканчиваться на _DL_filter.
+Filtering rules can be found in the *.filter file.php by filter name from the /core/filter/ folder. The class in the file must inherit from the abstract glass filterDocLister, and the name itself must end in _DL_filter.
-##Приведение типов TV-параметров
+## Reproduction of tv parameter types
-####Пример в контроллере site_content:
+#### Example in the site_content controller:
```
public function changeSortType($field, $type)
{
@@ -36,11 +36,9 @@ public function changeSortType($field, $type)
}
```
+## Construction of the DocLister object
-##Сохранение объекта DocLister
-
-Это может быть удобно, когда один и тот же список необходимо шаблонизировать 2 раза.
-
+This can be handy when the same list needs to be templated 2 times.
```
$out1 = $modx->runSnippet('DocLister', array(
'idType' => 'parents',
@@ -54,16 +52,14 @@ $out2 = $_DL->docsCollection()->reduce(function($out, $data) use ($_DL, $modx){
$data['url'] = $modx->makeUrl($data['id']);
return $out.$_DL->parseChunk('@CODE: [+title+] ', $data);
});
-/** Либо через подмену конфига, чтобы задействовать экстендеры и штатную подготовку плейсхолдеров */
+/** Or through the substitution of the config to use extenders and full-time training of placeholders */
$_DL->setConfig(array(
'tpl' => '@CODE: [+title+] '
));
$out2 = $_DL->render();
return implode("", array($out1, $out2));
```
-
-Или, например, нужно получить массив ID документов, которые задействованы в выводе
-
+Or, for example, you need to get an array of IDs of documents that are involved in the output
```
$out = $modx->runSnippet('DocLister', array(
'saveDLObject' => '_DL'
@@ -75,23 +71,19 @@ $ids = $_DL->docsCollection()->map(function($val){
return $val['id'];
})->toArray();
```
+## Use of the DocLister template engine in your snippets By connecting the DLTemplate class, you can already use a template engine that:
-##Использование шаблонизатора DocLister в своих сниппетах
-Подключив класс DLTemplate вы уже можете пользоваться шаблонизатором, который:
+* Understands inline templates
+* Able to create placeholders from multidimensional arrays
+* Automatically activates phx when needed
+* Allows you to render a document using any template (both with and without the use of events)
- - Понимает inline шаблоны
- - Умеет создавать плейсхолдеры из многомерных массивов
- - Автоматически активирует phx при необходимости
- - Позволяет отрендерить документ применив любой шаблон (как с применением событий, так и без них)
-
-
-Наиболее удачная практика - создание шаблонизатора в переменной tpl у объекта $modx. Чтобы не делать это постоянно, лучше всего воспользоваться небольшим плагином на событиях OnWebPageInit и OnPageNotFound
+The most successful practice is to create a templating device in the tpl variable on the object $modx. To avoid doing this all the time, it's best to use a small plugin on the OnWebPageInit and OnPageNotFound events.
```
require_once(MODX_BASE_PATH.'assets/snippets/DocLister/lib/DLTemplate.class.php');
$modx->tpl = DLTemplate::getInstance($modx);
```
-
-###Обычная шаблонизация
+### Standard templating
```
$data = array(
array('id' => 1, 'text' => 'hello',
@@ -113,17 +105,15 @@ foreach($data as $item){
}
return $out;
```
+### Substition template for the document
+The most successful example is the printable version. Sometimes it is easier to make a minimal template of each type and customize the output as needed than to play with CSS.
-###Подмена шаблона у документа
-Наиболее удачный пример - версия для печати. Порой бывает проще сделать минимальный шаблон каждого типа и настроить вывод так, как нужно, нежели играться с CSS.
-
-Для упрощения восприятия, весь процесс настройки ТВ параметров будет упущен. Поэтому представим, что у нас имеется:
+To simplify the perception, the whole process of setting up TV parameters will be missed. So let's imagine that we have:
- - Плагин cfgTV с префиксом для настроек cfg_.
- - ТВ параметр со списком ID возможных шаблонов для печати (для каждого документа можно выбрать свой шаблон)
- - Ссылки на версию для печати выводятся в виде [~[*id*]~]?save=print
-
-Создаем плагин для событий OnLoadWebDocument и OnLoadWebPageCache
+* CfgTV plugin with prefix for cfg_ settings.
+* TV option with a list of IDs of possible templates for printing (for each document you can choose a different template)
+* Links to the printable version are displayed as [[id]]?save=print
+Creating a plugin for the OnLoadWebDocument and OnLoadWebPageCache events
```
if(isset($modx->print)) return;
@@ -148,4 +138,4 @@ if($modx->print){
$modx->sendErrorPage();
}
```
-Использовать подмену шаблонов может быть удобно, если вы редактируете сайт на горячую (без разворачивания девелоперских версий).
+Using template substitution can be convenient if you are editing the site hot (without deploying development versions).
diff --git a/en/04_Extras/DocLister/09_MODxAPI.md b/en/04_Extras/DocLister/09_MODxAPI.md
index 99d6b4de..65f261e7 100644
--- a/en/04_Extras/DocLister/09_MODxAPI.md
+++ b/en/04_Extras/DocLister/09_MODxAPI.md
@@ -1,19 +1,17 @@
-##Introduction
-MODxAPI это попытка реализовать паттерн [Data mapper](https://en.wikipedia.org/wiki/Data_mapper_pattern).
-Изначально проектировалось как замена библиотеки DocManager, но в итоге оптимизирован код и заложен потенциал для создания обертки с произвольной логикой для любых таблиц.
-
-###Поддерживаемые модели
-*modResource* - Документы (данные из таблицы site_content и site_tmplvar_contentvalues)
-*modUsers* - Веб-пользователи (данные из таблиц web_users и web_user_attributes)
-*modCategories* - Категории (данные из таблиц categories)
-*modChunk* - Чанки (данные из таблиц site_htmlsnippets)
-*modModule* - Модули (данные из таблиц site_modules)
-*modPlugin* - Плагины (данные из таблиц site_plugins
-*modSnippet* - Сниппеты (данные из таблиц site_snippets)
-*modTV* - ТВ параметры (данные из таблиц site_tmplvars)
-*modTemplate* - Шаблоны (данные из таблиц site_templates)
-
-При желании можно быстро создать свою модель для любой таблицы. Для этого существует заготовка класса autoTable. В самом примитивном случае достаточно указать лишь название вашей таблицы. Взгляните на пример создания модели для таблицы с именем tests:
+## Introduction MODxAPI
+is an attempt to implement the Data mapper pattern. It was originally designed as a replacement for the DocManager library, but in the end, the code was optimized and the potential to create a wrapper with arbitrary logic for any tables was laid.
+
+### Supports
+* modResource models - Documents (data from site_content and site_tmplvar_contentvalues tables)
+* modUsers - Web users (data from web_users tables and web_user_attributes)
+* modCategories - Categories (data from categories tables)
+* modChunk - Chunks (data from tables site_htmlsnippets)
+* modModule - Modules (data from tables site_modules)
+* modPlugin - Plugins (data from tables site_plugins
+* modSnippet - Snippets (data from tables site_snippets)
+* modTV - TV parameters (data from tables site_tmplvars) modTemplate - Templates (data from tables site_templates)
+
+If you want, you can quickly create your own model for any table. To do this, there is a preset of the autoTable class. In the most primitive case, it is enough to specify only the name of your table. Take a look at an example of creating a model for a table named tests:
```
create(array(
'pagetitle' => 'example',
@@ -43,86 +39,82 @@ $doc->create(array(
));
/**
-* зменить pagetitle заголовок документа на new title
+* change the pagetitle title of the document to a new title
*/
$doc->set('pagetitle', 'new title');
/*
-* Сохранить документ вызвав события OnBeforeDocFormSave OnDocFormSave,
-* но не производить сброс кеша.
-* ID нового документа поместить в переменную id
+* Save document by raising the OnBeforeDocFormSave OnDocFormSave event,
+* but do not reset the cache.
+* Put the ID of the new document in the id variable
*/
$id = $doc->save(true, false);
/**
-* Открыть на редактирование документ с ID = 10
+* Open for editing document with ID = 10
*/
$doc->edit(10);
/**
-* Меняем родителя родителя документа
+* Change parent document
*/
$doc->set('parent', 0);
/*
-* Сохраняем документ не вызывая события OnBeforeDocFormSave OnDocFormSave,
-* Но при этом производим соброс кеша.
-* ID документа сохраняется в переменной $id
+* Save the document without raising the OnBeforeDocFormSave OnDocFormSave event,
+* But at the same time we produce a cache.
+* Document ID is stored in a variable $id
*/
$id = $doc->save(false, true);
/***
-* Удалить все документы помеченые на удаление.
-* При этом вызвать события OnBeforeEmptyTrash и OnEmptyTrash
-* Если значение параметра изменить с true на false, то события вызваны не будут, хотя документы удалятся
+* Delete all documents marked for deletion.
+* This will raise the OnBeforeEmptyTrash and OnEmptyTrash events
+* If you change the parameter value from true to false, no events will be raised, although the documents will be deleted
*/
$doc->clearTrash(true);
/**
-* Удалить документ с ID = 5, минуя корзину
-* При этом события OnBeforeEmptyTrash и OnEmptyTrash, будут вызваны.
+* Delete a document with ID = 5, bypassing the cart
+* This will cause the OnBeforeEmptyTrash and OnEmptyTrash events.
*/
$doc->delete(5, true);
```
-
-При помощи модели modUsers можно производить не только запись и получение данных, но еще и производить манипуляции с авторизацией:
+With the help of the modUsers model, you can not only record and receive data, but also manipulate authorization:
```
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modUsers.php");
$user = new modUsers($modx);
/**
-* Авторизоваться от имени веб-пользователя с ID = 1
+* Log in as a web user with ID = 1
*/
$user->authUser(1);
/**
-* Проверить статус блокировки веб-пользователя с ID = 1
-* Данный метод возвращает значение типа boolean
-* true - заблокирован
-* false - активен
+* Check the status of blocking a web user with ID = 1
+* This method returns a boolean value
+* true - blocked
+* false - active
*/
$flag = $user->checkBlock(1);
/**
-* Проверить пароль myPassword для веб-пользвоателя с ID = 1
-* После чего выполнить проверку статуса блокировки. Если даже пароль указан верный, а пользователь заблокирован, то данный метод вернет значение false. В случае, если изменить значение 3 параметра на false, то статус блокировки проверяться не будет.
-* Данный метод возвращает значение типа boolean
-* true - верный пароль
-* false - пароль не корректен
+* Check myPassword password for web user with ID = 1
+* Then check the lock status. Even if the password is correct and the user is locked, this method will return false. If you change the value of parameter 3 to false, the lock status will not be checked.
+* This method returns a boolean value
+* true - correct password
+* false - password is not correct
*/
$flag = $user->testAuth(1, 'myPassword', true);
/**
-* Принудительно разлогинить веб-пользователя
+* Force logout of the web user
*/
$user->logOut();
```
-
-
-###Практическое применение
-*modUsers*
-Следующий плагин для событий OnWebPageInit и OnPageNotFound, позволяет производить моментальное применение блокировки. Это бывает полезно, когда пользователь вроде бы забанен, но продолжает проявлять активность, т.к. сессия не истекла.
+### Practical the use of modUsers
+The following plugin for the OnWebPageInit and OnPageNotFound events allows you to instantly apply the lock. This is useful when the user seems to be banned, but continues to be active, because the session has not expired.
```
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modUsers.php");
$modx->user = new modUsers($modx);
@@ -133,14 +125,12 @@ if($modx->isFrontend() && $modx->getLoginUserID('web')){
}
}
```
-
-*modResource*
-Следующий сниппет позволяет последовательно получать значения полей одного и того же документа не выполняя при этом повторый SQL запрос.
+modResource The following snippet allows you to sequentially retrieve the field values of the same document without having to run a retry SQL query.
```
/**
*
[[DocInfo? &id=`6` &field=`pagetitle`]]
*
-* С данным сниппетом будет выполнен всего 1 SQL запрос
+* Only 1 SQL query will be executed with this snippet
*/
if(empty($modx->doc)){
include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");
@@ -162,4 +152,4 @@ if($field == 'id'){
}
}
return (string)$out;
-```
\ No newline at end of file
+```
diff --git a/en/04_Extras/DocLister/10_Features.md b/en/04_Extras/DocLister/10_Features.md
index d1f85877..ad9c9a71 100644
--- a/en/04_Extras/DocLister/10_Features.md
+++ b/en/04_Extras/DocLister/10_Features.md
@@ -1,49 +1,49 @@
-
Features
-
Features of DocLister
-
Сниппет для вывода информации из различных таблиц. Изначально разрабатывался как замена сниппета Ditto, но в итоге существенно превзошел его в возможностях, гибкости и производительности. При этом в простых случаях использовать DocLister не сложнее, чем Ditto (многие параметры совпадают).
-
Для работы DocLister требуется PHP 5.6 или выше.
-
Отличительные особенности снипетта DocLister:
-
-
легко расширяется;
-
позволяет выводить данные из любых таблиц (в том числе из каталога Shopkeeper);
-
есть возможность вывести данные в json-формате;
-
возможность произвольной обработки данных перед выводом;
-
удобные средства отладки;
-
сортировка по TV-параметрам с преобразованием типов;
-
фильтрация документов, в том числе по TV-параметрам;
-
поддержка лексиконов;
-
загрузка параметров из файлов.
-
-
Класс для вывода информации из таблиц по предопределенным правилам. Если нет правил, то данные отображаются без дополнительной обработки и связи. Т.е. все поля и значения совпадают с базой данных.
-
Правила для обработки информации описаны в контроллерах. Главный контроллер - site_content, который определяет связь основных документов site_content с данными в TV-параметрах
-
На базе класса DocLister сформировано 12 сниппетов:
-
-
DocLister - основной сниппет для вывода информации по принципу сниппетов Ditto и CatalogView
-
DLcrumbs - для формирования хлебных крошек по принципу сниппета Breadcrumbs
-
DLglossary - для фильтрации документов по первому символу в определенном поле
-
DLvaluelist - для замены сниппета DropDownDocs
-
DLTemplate - для замены $modx->parseChunk()
-
DLFirstChar - выборка документов и группировках в блоках по первой букве
-
DLPrevNext - цикличная навигация вперед/назад между соседними документами
\ No newline at end of file
+## Features
+### Features of DocLister
+
+Snippet for displaying information from various tables. It was originally developed as a replacement for the Ditto snippet, but in the end significantly surpassed it in capability, flexibility and performance. However, in simple cases, using DocLister is no more difficult than Ditto (many parameters are the same).
+
+DocLister requires PHP 5.6 or higher.
+
+## Distinctive features of the DocLister snipette:
+* easy to expand;
+* allows you to display data from any tables (including the Shopkeeper catalog);
+* it is possible to output data in json-format;
+* the possibility of arbitrary data processing before output;
+* convenient debugging tools
+* sorting by TV parameters with type conversion;
+* filtering of documents, including by TV-parameters;
+* lexicon support;
+* load parameters from files.
+A class for displaying information from tables according to predefined rules. If there are no rules, the data is displayed without additional processing and communication. That is, all fields and values are the same as the database.
+
+Rules for information processing are described in controllers. Main Controller - site_content that determines the relationship of the main documents of the site_content with the data in the TV parameters
+
+## On the basis of the DocLister class, 12 snippets have been formed:
+* __DocLister__ - the main snippet for displaying information on the principle of Ditto and CatalogView snippets
+* __DLcrumbs__ - for the formation of bread crumbs on the principle of the Breadcrumbs snippet
+* __DLglossary__ - to filter documents by the first character in a specific field
+* __DLvaluelist__ - to replace the DropDownDocs snippet
+* __DLTemplate__ - to replace $modx->parseChunk()
+* __DLFirstChar__ - fetch documents and groupings in blocks by the first letter
+* __DLPrevNext__ - circular forward/backward navigation between adjacent documents
+* __DLMenu__ - Building a Menu of Unlimited Nesting
+* __DLSitemap__ - Building an xml sitemap
+* __DLReflect__ - Building a list of dates
+* __DLReflectFilter__ - Filter documents by date
+* __DLBeforeAfter__ - Pagination of past and upcoming events taking into account the current date
+
+### Components based on DocLister:
+* __SimpleGallery__ – display the gallery on the page
+* __SimpleTube__ – plugin and snippet for creating video galleries
+* __SimpleFiles__ – attach files to the page
+* __SimplePolls__
+* __LikeDislike__ – ability to rate
+* __FormLister__ - a snippet for working with forms
+* __FastImageTV__
+* __DLRequest__ - run snippets with parameters from get/post
+* __evoSearch__
+* __eFilter__
+* __Selector__ - custom TV for compiling a list of documents
+
+Author: Agel_Nash
diff --git a/en/04_Extras/FormLister/010_Controllers.md b/en/04_Extras/FormLister/010_Controllers.md
new file mode 100644
index 00000000..dac73a67
--- /dev/null
+++ b/en/04_Extras/FormLister/010_Controllers.md
@@ -0,0 +1,50 @@
+## Controllers
+Controller is the class extending \FormLister\Core base class, which perfoms:
+
+- loading classes to validate data and generate captcha;
+- processing form data (form data here is the value of formData property, not only of $_REQUEST array);
+- processing form template and success template.
+
+The way it works:
+
+1. Data are loaded from form.
+2. Data are loaded from external sources.
+3. Snippets are called to process data.
+4. Data validation if it's received from form;
+3. Snippets are called to process data again.
+6. Final processing - if data came from form and passed validation successfully.
+7. Output.
+
+Final processing is done by controller's process() method. Result flag has to be set with setFormStatus() method after successful processing, then fill renderTpl property with template to output processing results.
+
+These are some base controllers, feel free to extend them:
+
+### Form
+Sends e-mail using form data.
+
+### Login
+Authorizes users.
+
+### Register
+Creates users and sends needed notifications.
+
+### Activate
+Processes a special link to confirm user registration or sends it via e-mail.
+
+### DeleteUser
+Allows users to delete their profiles. It requests password to confirm.
+
+### Profile
+Allows users to edit their profiles.
+
+### Reminder
+Helps users to remind their passwords.
+
+### Content
+Allows to create and edit resources with MODxAPI classes.
+
+### DeleteContent
+Allows users to delete resources they created.
+
+### MailChimp
+Adds users to MailChimp mailing lists. It's provided as example of \FormLister\Core class extension.
diff --git "a/en/04_Extras/FormLister/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md" "b/en/04_Extras/FormLister/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md"
deleted file mode 100644
index e566b9da..00000000
--- "a/en/04_Extras/FormLister/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\321\213.md"
+++ /dev/null
@@ -1,50 +0,0 @@
-## Контроллеры
-Контроллер представляет собой класс, унаследованный от базового класса \FormLister\Core, который реализует:
-
-- загрузку классов для валидации и генерации капчи;
-- работу с данными (под данными здесь и далее подразумеваются значения свойства formData, то есть не только значения массива $_REQUEST);
-- работу с шаблоном формы и шаблоном успешной обработки.
-
-Схема работы:
-
-1. Загрузка данных из формы
-2. Загрузка данных из внешних источников
-3. Вызов сниппетов для обработки данных.
-4. Валидация данных - если получены данные из формы;
-3. Вызов сниппетов для обработки данных.
-6. Итоговая обработка - если получены данные из формы и пройдена валидация.
-7. Вывод.
-
-Итоговая обработка формы происходит в методе process() контроллера. После успешной обработки необходимо установить флаг результа обработки формы с помощью метода setFormStatus(), а также и указать в свойстве renderTpl шаблон для вывода информации с результатами обработки.
-
-Ниже перечислены базовые контроллеры.
-
-### Контроллер Form
-Отправляет письма с данными формы.
-
-### Контроллер Login
-Авторизует пользователя в контексте web.
-
-### Контроллер Register
-Создает web-пользователя и отправляет соответствующие письма.
-
-### Контроллер Activate
-Обрабатывает ссылку из письма с подтверждением регистрации или отправляет такое письмо.
-
-### Контроллер DeleteUser
-Позволяет пользователям удалять свои учетные записи. Для подтверждения запрашивает пароль.
-
-### Контроллер Profile
-Предназначен для редактирования данных web-пользователя.
-
-### Контроллер Reminder
-Предназначен для восстановления паролей web-пользователями.
-
-### Контроллер Content
-Позволяет создавать и изменять записи с помощью классов MODxAPI.
-
-### Контроллер DeleteContent
-Позволяет пользователям удалять созданные ими записи.
-
-### Контроллер MailChimp
-Добавляет пользователей в список рассылки сервиса MailChimp. Добавлен как пример расширения базового класса \FormLister\Core.
diff --git a/en/04_Extras/FormLister/020_Parameters.md b/en/04_Extras/FormLister/020_Parameters.md
new file mode 100644
index 00000000..e27a1296
--- /dev/null
+++ b/en/04_Extras/FormLister/020_Parameters.md
@@ -0,0 +1,408 @@
+## General parameters
+
+These parameters are processed by FormLister core class. Controllers can change parameters purposes.
+
+### Parameters at a glance
+| Parameter | Description | Default |
+| --- | --- | --- |
+| controller | Sets the class extending \FormLister\Core to process data | Form |
+| dir | Folder where controller class is located | assets/snippets/FormLister/core/controller/ |
+| formid | The name of the form, required parameter | |
+| formMethod | Determines the source of request data | post |
+| disableSubmit | Disables form submission | 0 |
+| config | Loads parameters from json file | |
+| api | Output method | 0 |
+| apiFormat | Output format for api 1 or api 2 mode | json |
+| debug | Output debug information | 0 |
+| saveObject | Saves FormLister object to placeholder, so other snippets can use it. | |
+| removeGpc | Restores data sanitized by MODX as it contains {{ | 0 |
+| defaultsSources | Allows to load data from external sources | array |
+| defaults | Data for the "array" source. | array |
+| keepDefaults | Allows to load external data after the form is sent. | 0 |
+| allowEmptyFields | Allows to set fields with empty values. | 1 |
+| formControls | The list of fields hold by form controls (selects, checkboxes, radio buttons) | |
+| emptyFormControls | This parameter allows to solve the problem of unchecked checkboxes | |
+| fieldAliases | Allows to set field aliases. | |
+| prepare prepareProcess prepareAfterProcess | It's similar to the "prepare" parameter of DocLister. | |
+| filterer |Class name to filter data. Is has to be loaded before snippet call | \FormLister\Filters |
+| filters | Filtering rules array.| |
+| validator | Class name to validate data. Is has to be loaded before snippet call. | \FormLister\Validator |
+| rules | Validation rules array. | |
+| fileValidator | Class name to validate files. This class has to be loaded before snippet call.| \FormLister\FileValidator |
+| fileRules | Files validation rules array. | |
+| formTpl | Form template. It needs to have the required field named "formid" with the same value as "formid" parameter's one. | |
+| arraySplitter | The separator to convert arrays to strings. | ; |
+| {field}.arraySplitter | The separator to convert arrays to strings, but for particular {field}. | |
+| errorTpl | Template for validation messages. | ```@CODE:
[+message+]
``` |
+| requiredClass errorClass | Class name for empty required fields and wrong filled fields.| |
+| {field}.requiredClass {field}.errorClass | Allows to set classes mentioned above for particular fields. | |
+| messagesTpl | Template for controller messages. It outputs message groups (messages, required, error). | ```@CODE:
[+messages+]
``` |
+| messagesOuterTpl | Wrapper template for controller message groups. | ```@CODE: [+messages+]``` |
+| messagesRequiredOuterTpl | Wrapper template for the "required" message group. | ```@CODE: [+messages+]``` |
+| messagesErrorOuterTpl | Wrapper template for the "error" message group. |```@CODE: [+messages+]```|
+| messagesSplitter messagesRequiredSplitter messagesErrorSplitter | Messages separator in groups. | ``` ``` |
+| removeEmptyPlaceholders | Removes placeholders without values from templates. | 1 |
+| parseDocumentSource | Enables MODX-parser for output post-processing. | 0 |
+| rewriteUrls | Allows to parse links in templates if the "parseDocumentSource" parameter is off. | 0 |
+| skipPrerender | Allows to skip some form fields processing | 0 |
+| prerenderErrors | Allows to process form errors if "skipPrerender" parameter is on. The results are saved to placeholders. | 0 |
+| templatePath templateExtension | Sets template files folder and template files extension. These parameters are needed to use with EvoTwig plugin. | |
+| redirectTo | Target page id to redirect if form is processed successfully.| |
+
+## Settings
+### controller
+Sets the class extending \FormLister\Core to process data.
+
+Possible values - class name. If it has no namespace, then namespace is assumed to be \FormLister. So Form means \FormLister\Form.
+Default value - Form.
+
+### dir
+Folder where controller class is located.
+
+Default value - assets/snippets/FormLister/core/controller/
+
+### formid
+The name of the form, required parameter.
+
+Form needs to have a hidden field named "formid" and its value has to be the same as parameter value. The form means to be sent, if there is a key named "formid" in the $_REQUEST array and its value is equal to the parameter value.
+
+### formMethod
+Determines the source of request data:
+* post - $_POST array;
+* get - $_GET array;
+* request - $_REQUEST array;
+* anonymous function or class method name - the result of its call.
+
+Possible values - post, get, request, anonymous function or class method name.
+
+Default value - post.
+
+### disableSubmit
+Disables form submission, if the parameter value is set to 1.
+
+Possible value - 1, 0.
+
+Default value - 0.
+
+### config
+Loads parameters from json file.
+
+Possible values - filename:folder, several values are separated by the semicolon.
+
+#### Example
+myparams:core - loads parameters from assets/snippets/FormLister/config/core/myparams.json file;
+myparams - loads parameters from assets/snippets/FormLister/config/custom/myparams.json file; myparams:/assets/myfolder - loads parameters from assets/myfolder/myparams.json file.
+
+Default value - none.
+
+### api
+The way of output.
+
+Possible values:
+
+- 0: html only (default);
+- 1: array with form data;
+- 2: array with form data and html.
+- 3: pure FormLister object;
+
+Default Value: 0
+
+### apiFormat
+Output format for mode 1 or mode 2.
+
+Possible value - json or array.
+
+Defaut value - json.
+
+### debug
+Enables debug mode. Debug data is sent to MODX events log.
+
+Possible values - 0, 1.
+
+Default value - 0.
+
+### saveObject
+Saves FormLister object to placeholder, so other snippets can use it. The object is saved only if form processing is finished successfully.
+
+Possible values - placeholder name.
+
+Default value - none.
+
+### removeGpc
+Restores data sanitized by MODX as it contains {{, [[ and so on. MODX tags will be sanitized in output.
+
+Default value - 0, 1 or field names comma separated.
+
+Default value - 0.
+
+## Data sources
+### defaultsSources
+Allows to load data from external sources, to pre-fill form fields, for example. External data are loaded only before initial form output and ignored after form is sent. This behaviour can be changed with "keepDefaults" parameter.
+
+Possible values: sources, semicolon separated. The order of loading data matches the sources order in parameter.
+
+The source can be set as "name:key:prefix". A prefix with a dot is added to field name, if set - for example, config.site_name. If a prefix is ended with an underscore (_), then an underscore will be used instead of a dot - that allows to avoid dot to underscore conversion made by PHP (https://www.php.net/manual/en/language.variables.external.php).
+
+Possible sources:
+
+- array: json or php array, its values are defined by the parameter named "defaults";
+- param:parameter name:prefix - the same as the "array" source but you can specify any snippet parameter, not only "defaults";
+- session:array keys, comma separated:prefix - loads data from $_SESSION according to the given keys, the values can be arrays;
+- plh:keys, comma separated:prefix - loads data from $modx->placeholders property according to the given keys, the values can be arrays;
+- cookie:keys, comma separated:префикс - loads data from the $_COOKIE array according to the given keys, the values can be json-arrays;
+- config:prefix- loads data from MODX configuration;
+- MODxAPI class name:key:prefix - a key is the argument of edit() method, the class has to be loaded before snippet call;
+- document:prefix - loads current document data from modResource model. It needs no key;
+- user:key:prefix - load authorized user data from modUsers model. User type is provided by key value (web or mgr).
+
+Default value - array.
+
+### defaults
+Data for the "array" source.
+
+Possible values: json or php array.
+
+### keepDefaults
+Allows to load external data after the form is sent. If fields list is specified, then only these fields will be loaded.
+
+Possible values: 1, 0; field names, comma separated.
+
+Default value - 0.
+
+### allowEmptyFields
+Allows to set fields with empty values.
+
+Possible values - 0 or 1.
+
+Default value - 1.
+
+## Form Controls
+### formControls
+The list of fields hold by form controls (selects, checkboxes, radio buttons). It needs to determine their state.
+
+Possible values - field names, comma separated.
+
+Default value - none.
+
+### emptyFormControls
+This parameter allows to solve the problem of unchecked checkboxes, as they are excluded from fields array during form submission: if there's no needed element in the $_REQUEST array, then it's set according to this parameter. The problem is actual mostly for MODxAPI classes usage, because MODxAPI requires to list changed fields in fromArray() method. But it's possible to use it in common forms to set the value of unchecked checkbox in templates.
+
+Possible values - an array:
+```
+&emptyFormControls=`{
+ "mycheckbox" : "No",
+ "published" : 0
+}`
+```
+
+### fieldAliases
+Allows to set field aliases. For example, "foo" field has "bar" alias:
+```
+$FormLister->setField("foo", 10);
+$FormLister->getField("bar"); //10
+$FormLister->setField("bar", 20);
+$FormLister->getField("foo"); //20
+$FormLister->unsetField("foo");
+$FormLister->getField("foo"); //Nothig
+$FormLister->getField("bar"); //Nothing (but "bar" field stays untouched when function call is unsetField("foo", false));
+```
+
+Possible values - an array:
+```
+&fieldAliases=`{
+ "field name":"alias",
+ "field name":"alias"
+}
+```
+Default value - none.
+
+## Data Processing
+### prepare, prepareProcess, prepareAfterProcess
+It's similar to the "prepare" parameter of DocLister.
+
+Snippets defined in the "prepare" parameter are run after form data loaded, "prepareProcess" - after validation is passed successfully, "prepareAfterProcess" - after form processing is finished. Controller object is available in prepare-snippets via $FormLister variable, while $data array contains the values of form fields. Additional $name variable allows to determine the parameter initiated snippet call; so you can use one snippet for all cases. Use controller methods (setField, setFields etc.) to change form data in prepare-snippets, or return data to change as an array.
+
+Possible values - snippet names, anonymous functions, static methods of loaded classes.
+
+Default value - none.
+
+## Filtering
+### filterer
+Class name to filter data. Is has to be loaded before snippet call.
+
+Default value - \FormLister\Filters.
+
+### filters
+Filtering rules array.
+
+Default value - none.
+
+## Validation
+### validator
+Class name to validate data. Is has to be loaded before snippet call.
+
+Default value - \FormLister\Validator.
+
+### rules
+Validation rules array.
+
+Default value - none.
+
+### fileValidator
+Class name to validate files. This class has to be loaded before snippet call.
+
+Default value - \FormLister\FileValidator
+
+### fileRules
+Files validation rules array.
+
+Default value - none.
+
+## Templates
+### formTpl
+Form template. It needs to have the required field named "formid" with the same value as "formid" parameter's one.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### arraySplitter
+
+The separator to convert arrays to strings.
+
+Default value - semicolon.
+
+### {field}.arraySplitter
+The separator to convert arrays to strings, but for particular {field}. Example: groups.arraySplitter - the separator for the field named "groups".
+
+If not set, then the "arraySplitter" parameter is used.
+
+### errorTpl
+Template for validation messages.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value:
+```
+@CODE:
[+message+]
+```
+
+### requiredClass, errorClass
+Class name for empty required fields and wrong filled fields.
+
+Default value - required and error accordingly.
+
+### {field}.requiredClass, {field}.errorClass
+Allows to set classes mentioned above for particular fields.
+
+If not set, then "requiredClass", "errorClass" parameters are used.
+
+### messagesTpl
+Template for controller messages. It outputs message groups (messages, required, error).
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value:
+```
+@CODE:
[+messages+]
+```
+
+### messagesOuterTpl
+Wrapper template for controller message groups.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value -
+```
+@CODE: [+messages+]
+```
+
+### messagesRequiredOuterTpl
+Wrapper template for the "required" message group.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value:
+```
+@CODE: [+messages+]
+```
+
+### messagesErrorOuterTpl
+Wrapper template for the "error" message group.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value:
+```
+@CODE: [+messages+]
+```
+
+### messagesSplitter, messagesRequiredSplitter, messagesErrorSplitter
+Messages separator in groups.
+
+Possible values - string.
+
+Default value:
+```
+
+```
+
+### removeEmptyPlaceholders
+Removes placeholders without values from templates.
+
+Possible values - 0 or 1.
+
+Default value - 1.
+
+### parseDocumentSource
+Enables MODX-parser for output post-processing.
+
+Possible values - 0 or 1.
+
+Default value - 0.
+
+### rewriteUrls
+Allows to parse links in templates if the "parseDocumentSource" parameter is off.
+
+Possible values - 0 or 1.
+
+Default value - 0.
+
+### skipPrerender
+Allows to skip some form fields processing (sanitizing values, converting arrays to strings, error messages rendering). Set to 1, if you do not use MODX templates.
+
+Possible values - 0 or 1.
+
+Default value - 0.
+
+### prerenderErrors
+Allows to process form errors if "skipPrerender" parameter is on. The results are saved to placeholders.
+
+Possible values - 0 or 1.
+
+Default value - 0.
+
+### templatePath, templateExtension
+Sets template files folder and template files extension. These parameters are needed to use with EvoTwig plugin.
+
+Default value - none.
+
+## Redirect after finish
+### redirectTo
+Target page id to redirect if form is processed successfully. There's no redirect in api-mode, but absolute url for target page is saved in form data as "redirectTo" field.
+
+Instead of target page id, you can specify an array with additional options:
+```
+&redirectTo=`{
+ "page":10,
+ "query":{
+ "foo":"bar"
+ },
+ "header":"HTTP/1.1 307 Temporary Redirect"
+}`
+```
+The "page" key is the target page id, the "query" array contains get-parameters to pass, the "header" key can be used to set redirect header.
+
+Possible values - number or array.
+
+Default value - none.
diff --git "a/en/04_Extras/FormLister/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/en/04_Extras/FormLister/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
deleted file mode 100644
index e0046780..00000000
--- "a/en/04_Extras/FormLister/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md"
+++ /dev/null
@@ -1,291 +0,0 @@
-## Общие параметры
-
-Эти параметры обрабатываются базовым классом FormLister. В контроллерах некоторые общие параметры могут иметь другое назначение.
-
-## Настройки
-### controller
-Задает класс для обработки данных.
-
-Возможные значения - имя php-файла с классом без расширения.
-
-Значение по умолчанию - Form.
-
-### dir
-Папка в которой находится класс контроллера.
-
-Значение по умолчанию - assets/snippets/FormLister/core/controller/
-
-### formid
-Имя формы, обязательный параметр.
-
-В шаблоне формы обязательно должно быть скрытое поле с именем formid и значением, указанным в параметре. Форма считается отправленной, если в массиве $_REQUEST присутствует ключ с именем параметра, а его значение соответствует значению параметра.
-
-### formMethod
-Возможные значения - post, get или request.
-
-Значение по умолчанию - post.
-
-### config
-Загрузка параметров в формате json из файла.
-
-Возможные значения - имяфайла:папка, несколько значений разделяются точкой с запятой.
-
-#### Пример
-myparams:core - загрузить параметры из файла assets/snippets/FormLister/config/core/myparams.json; myparams - загрузить параметры из файла assets/snippets/FormLister/config/custom/myparams.json; myparams:/assets/myfolder - загрузить параметры из файла assets/myfolder/myparams.json.
-
-Значение по умолчанию - пусто.
-
-### api
-Определяет, в каком виде будут выводиться данные.
-
-Возможные значения:
-
-- 0: только html;
-- 1: json-массив с данными формы;
-- 2: json-массив с данными формы и html.
-
-### debug
-Режим отладки. Вывод записывается в лог MODX.
-
-Возможные значения - 0, 1.
-
-Значение по умолчанию - 0.
-
-### saveObject
-Сохраняет объект класса FormLister в плейсхолдер, который можно использовать в других сниппетах. Объект сохраняется только при успешной обработке формы.
-
-Возможные значения - имя плейсхолдера.
-
-Значение по умолчанию - пусто.
-
-### removeGpc
-Убирает экранирование данных, которое выполняет MODX для символов {{, [[ и т.д. При этом экранируются тэги MODX при выводе.
-
-Возножные значения - 0, 1 или имена полей через запятую.
-
-Значение по умолчанию - 0.
-
-## Источники данных
-### defaultsSources
-Позволяет загружать дополнительные данные из внешних источников, например, для предварительного заполнения полей формы. По умолчанию внешние данные загружаются только при начальном выводе формы и не загружаются после отправки формы Это поведение может быть изменено с помощью параметра keepDefaults.
-
-Возможные значения: список источников, разделенных точкой с запятой. Загрузка данных производится в том порядке, в котором они указаны в списке.
-
-Источник может задаваться в формате "имя:ключ:префикс". Префикс, если указан, добавляется c точкой к имени поля - например, config.site_name.
-
-Возможные значения:
-
-- array: json или php-массив, значения задаются параметром defaults;
-- param:имя параметра:префикс - значения задаются значением параметра из вызова сниппета (аналогично array, только значение задается не параметром defaults, а произвольным, также можно указать префикс);
-- session:ключ массива:префикс - значения загружаются из массива $_SESSION;
-- plh:ключи через запятую:префикс - загружаются значения из массива $modx->placeholders;
-- aplh:имя плейсхолдера:префикс - загружаются значения из плейсхолдера, содержащего массив;
-- config:префикс - загружаются значения из конфигурации MODX;
-- cookie:ключи через запятую:префикс - загружаются значения из массива $_COOKIE;
-- имя класса MODxAPI:ключ:префикс - ключ является аргументом метода edit(), класс должен быть заранее загружен;
-- document:префикс - загружает данные из модели modResource для документа, в котором вызван сниппет. Ключ не указывается;
-- user:ключ:префикс - загружает данные из модели modUsers для авторизованного пользователя. Тип пользователя уточняется в ключе (web или mgr).
-
-Значение по умолчанию - array.
-
-### defaults
-Данные для источника array.
-
-Возможные значения: массив значений по умолчанию, в формате json или php.
-
-### keepDefaults
-Позволяет повторно загружать данные из внешних источников после отправки формы. Если в параметре указан список полей, то загружены будут только указанные поля.
-
-Возможные значения: 1, 0, имена полей, разделенные запятой.
-
-Значение по умолчанию - 0.
-
-### allowEmptyFields
-Разрешает задавать поля с пустыми значениями.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 1.
-
-## Элементы управления
-### formControls
-Список полей с управляющими элементами формы (списки, чекбоксы, радио-кнопки). Необходимо для отслеживания состояния элементов.
-
-Возможные значения - имена полей, разделенные запятой.
-
-Значение по умолчанию - пусто.
-
-### emptyFormControls
-
-Этот параметр позволяет решить проблему неотмеченных чекбоксов, которые не включаются в массив полей при отправке формы: если в $_REQUEST отсутствует нужный элемент, то он создается согласно данному параметру. Необходимость в таком параметре возникла в связи с тем, что MODxAPI требует явно указывать изменяемые поля в методе fromArray(). Но можно использовать и в обычных формах, чтобы подставить в шаблон значение неотмеченного чекбокса.
-
-Возможные значения - массив:
-```
-&emptyFormControls=`{
- "mycheckbox" : "Нет",
- "published" : 0
-}`
-```
-
-## Обработка данных
-### prepare, prepareProcess, prepareAfterProcess
-Аналогично параметру prepare в DocLister.
-
-Сниппеты из параметра prepare выполняются после загрузки данных в форму, сниппеты из параметра prepareProcess - после прохождения валидации, сниппеты из параметра prepareAfterProcess - после успешного выполнения обработки. В сниппетах через переменную $FormLister доступен объект контроллера, а через массив $data - значения полей формы. Также доступна переменная $name, которая задержит имя параметра из которого взят сниппет (prepare, prepareProcess и т.д.); это позволяет использовать один и тот же сниппет для разных случаев. Для изменения данных следует использовать в prepare-сниппетах методы контроллера (setField, setFields и т.д.)
-
-Возможные значения - имена сниппетов, анонимные функции, статические методы загруженных классов.
-
-Значение по умолчанию - пусто.
-
-## Валидация
-### validator
-Имя класса для валидации данных. Класс должен быть предварительно загружен.
-
-Значение по умолчанию - \FormLister\Validator.
-
-### rules
-Массив с правилами валидации.
-
-Значение по умолчанию - пусто.
-
-## Шаблоны
-### formTpl
-Шаблон формы. В шаблоне формы обязательно должно быть поле с именем formid и значением, указанным в параметре formid.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### arraySplitter
-
-Разделитель для преобразования массивов в строку.
-
-Значение по умолчанию - точка с запятой.
-
-### {field}.arraySplitter
-Разделитель для преобразования массивов в строку, но для отдельного поля {field}. Например: groups.arraySplitter - разделитель для массива из поля groups.
-
-Если не задано, то используется значение параметра arraySplitter.
-
-### errorTpl
-Шаблон для вывода сообщений валидатора.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию:
-```
-@CODE:
[+message+]
-```
-
-### requiredClass, errorClass
-Имена классов для обозначения незаполненных (required) и неверно заполенных (error) полей.
-
-Значение по умолчанию - required и error соответственно.
-
-### {field}.requiredClass, {field}.errorClass
-Позволяет задавать указанные выше классы для конкретных полей.
-
-По умолчанию используются значения параметров requiredClass и errorClass.
-
-### messagesTpl
-Шаблон сообщений обработчика формы. В шаблоне выводятся группы сообщений (messages, required, error).
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию:
-```
-@CODE:
[+messages+]
-```
-
-### messagesOuterTpl
-Шаблон-обертка для группы произвольных сообщений.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию -
-```
-@CODE: [+messages+]
-```
-
-### messagesRequiredOuterTpl
-Шаблон-обертка для группы сообщений о незаполненных полях.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию:
-```
-@CODE: [+messages+]
-```
-
-### messagesErrorOuterTpl
-Шаблон-обертка для группы сообщений о неверно заполненных полях.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию:
-```
-@CODE: [+messages+]
-```
-
-### messagesSplitter, messagesRequiredSplitter, messagesErrorSplitter
-Разделитель сообщений в группе.
-
-Возможные значения - произвольная строка.
-
-Значение по умолчанию:
-```
-
-```
-
-### removeEmptyPlaceholders
-Удаляет из шаблонов незаполненные прейслхолдеры.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 0.
-
-### parseDocumentSource
-Обрабатывает чанки MODX-парсером.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 0.
-
-### rewriteUrls
-Если параметр parseDocumentSource отключен, то парсит ссылки в шаблонах.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 0.
-
-### skipPrerender
-Позволяет отключить предварительную обработку полей формы (экранирование значений, преобразование массивов в строки, установка сообщений об ошибках). Можно включить, если для вывода не используется парсер MODX.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 0.
-
-### templatePath, templateExtension
-Путь к папке с файлами шаблонов и расширение файлов шаблонов. Эти параметры необходимо задавать при использовании плагина EvoTwig.
-
-Значение по умолчанию - пусто.
-
-## Перенаправление после обработки
-### redirectTo
-Id страницы, на которую нужно выполнить перенаправление после успешной обработки формы. В api-режиме перенаправление не выполняется, но в массиве данных формы сохраняется абсолютная ссылка на целевую страницу (поле "redirectTo").
-
-Вместо числа можно указывать массив:
-```
-&redirectTo=`{
- "page":10,
- "query":{
- "foo":"bar"
- },
- "header":"HTTP/1.1 307 Temporary Redirect"
-}`
-```
-Ключ page задает id станицы, в массиве query можно передать дополнительные get-параметры, значением ключа header может быть текст заголовка для перенаправления.
-
-Возможные значения - число или массив.
-
-Значение по умолчанию - пусто.
diff --git a/en/04_Extras/FormLister/025_Data Filtering.md b/en/04_Extras/FormLister/025_Data Filtering.md
new file mode 100644
index 00000000..ada5e641
--- /dev/null
+++ b/en/04_Extras/FormLister/025_Data Filtering.md
@@ -0,0 +1,33 @@
+## Data filtering
+Filtering means form data preprocessing according to given rules.
+Rules list is an array, where the key is field name, and the value is an array of filters. Filter is a method of filterer class, which gets the value and returns it transformed.
+```
+{
+ "field 1": ["trim", "alpha"]
+ "field 2": ["trim", "email"]
+}
+```
+
+The default filterer class (\FormLister\Filters) contains the following filters:
+
+- trim: removes whitespace and other predefined characters from both sides of a string;
+- ltrim: removes whitespace and other predefined characters from the left of a string;
+- rtrim: removes whitespace and other predefined characters from the right of a string;
+- alpha: removes everything but letters;
+- numeric: removes everything but digits;
+- alphaNumeric: removes everything but letters and digits;
+- removeExtraSpaces: removes extra whitespaces and line breaks;
+- compressText: removes extra whitespaces but preserves line breaks;
+- stripTags: removes html tags;
+- lcfirst: converts the first character to the lowercase;
+- ucfirst: converts the first character to the uppercase;
+- ucwords: converts the first character of every word to the uppercase
+- upper: converts all characters to the uppercase;
+- lower: converts all characters to the lowercase;
+- phone: remove all charactes not allowed to be used in phone numbers;
+- url: remove all charactes not allowed to be used in urls;
+- email: remove all charactes not allowed to be used in email addreses;
+- int: remove all charactes not allowed to be used in integer numbers;
+- float: remove all charactes not allowed to be used in floating point numbers;
+- castInt: converts value to the integer number;
+- castFloat: converts value to the floating point number.
diff --git a/en/04_Extras/FormLister/030_Data Validation.md b/en/04_Extras/FormLister/030_Data Validation.md
new file mode 100644
index 00000000..a52edfd6
--- /dev/null
+++ b/en/04_Extras/FormLister/030_Data Validation.md
@@ -0,0 +1,175 @@
+## Data validation
+
+Validator applies validation rules to field values one by one, if error occures then the record is added to form errors array and further form procession is interrupted.
+
+Validation is passed successfully if there are no records in form errors array.
+
+### Validation rules
+Validation rules are described as an array. Field name is the array key, and array value contains the rules array.
+
+Validation rule is the method of validator class. The key of rules array is the rule name (the name of validation method), its value is either error message string, or an array with rule description.
+
+This array contains needed values in the key named "params" and an error message in the key named "message".
+Values can be taken from form fields, you should use "@params" insteadof "@params" and the value should be set as "@field":
+```
+"field":{
+ "equals": {
+ "@params" : "@foobar",
+ "message": "'field' should be equal to 'foobar' field value"
+ }
+}
+```
+
+If several values are needed for the rule, then pass them as an array:
+```
+&rules=`{
+ "field" : {
+ "lengthBetween" : {
+ "params" : [10, 20],
+ "message" : "The length should be from 10 to 20"
+ }
+ }
+}`
+```
+
+If the rule requires an array (the "in" rule and other), then you should specify this array in the following way:
+```
+&rules=`{
+ "field" : {
+ "in" : {
+ "params" : [ [10,20,30] ],
+ "message" : "field value should be equal to 10, 20 or 30"
+ }
+ }
+}`
+```
+
+It needs to pass an array to validator method as single argument.
+
+Use exclamation mark for rule denial: "!numeric" - the field passes validation if its value is not numeric.
+
+If you need to validate only not empty fields, then set exclamation mark before field name to ignore rules if the field is empty.
+
+```
+{
+ "field 1": {
+ "rule 1" : "error message",
+ "rule 2" : "error message"
+ },
+ "field 2": {
+ "rule 1" : "error message",
+ "rule 2" : {
+ "params" : value,
+ "message" : "error message"
+ }
+ },
+ "!field 3":{
+ "rule 1" : "error message"
+ }
+}
+```
+\FormLister\Validator base class has the following rules:
+
+- required: field value is not empty;
+- date: field value is a date in defined format;
+- min: field value length is greater or equal to defined;
+- max: field value length is less or equal to defined;
+- greater: field value is greater than defined;
+- less: field value is less than defined;
+- between: field value is in the range (strict or loose comparison possible, loose is default);
+```
+"field":{
+ "less": {
+ "params" : [10, 20],
+ "message": "'field' value should be greater or equal to 10 and less or equal to 20"
+ }
+},
+"another_field":{
+ "less": {
+ "params" : [10, 20, true],
+ "message": "'another_field' value should be strictly greater than 10 and strictly less than 20"
+ }
+}
+```
+- equals: field value is equals to defined;
+- in: field value is in defined array;
+- alpha: field value contains only letters;
+- numeric: field value contains only digits;
+- alphaNumeric: field value contains only letters and digits;
+- slug: field value is an url slug;
+- decimal: field value is a decimal number;
+- phone: field value is a phone number;
+- matches: field value matches regular expression;
+- url: field value is an url;
+- email: field value is an e-mail address;
+- length: field value length is equal to defined;
+- minLength: field value length is greater than defined (strict or loose comparison possible, loose is default);
+- maxLength: field value length is less than defined (strict or loose comparison possible, loose is default);
+- lengthBetween: field value length is in the range (strict or loose comparison possible, loose is default);
+- minCount: array size is greater than defined (strict or loose comparison possible, loose is default);
+- maxCount: array size is less than defined (strict or loose comparison possible, loose is default);
+- countBetween: array size is in the range (strict or loose comparison possible, loose is default).
+
+Add one more parameter having "true" value to set strict comparison in rules with the choice of strict or loose comparision available (see "between" rule example above).
+
+It's possible to use anonymous functions or static methods of loaded classes:
+```
+&rules=`{
+ "myfield":{
+ "required":"Required field",
+ "custom":{
+ "function":"\\Namespace\\Classname::myCustomRule",
+ "params":[10,20,30],
+ "message":"Custom check failed"
+ }
+ }
+}`
+```
+
+Validation method should accept controller object as the first argument, field value as the second argument, parameters from the "params" key of the rule description as other arguments:
+```
+public static function myCustomRule($fl, $value, $a, $b, $c) {
+ $result = $fl->getField('field1') == $a && $fl->getField('field2') == $b && $value == $c;
+ return $result;
+}
+```
+The rule above will be passed if the field1 value is 10, the field2 value is 20, and the value of the the field which the rule is applied to is equal to 30.
+
+Validator method returns true if the rule is passed, false or error message if not (so it's possible not to use the "message" key for custom rules).
+
+Example contains the "сustom" rule name, but it can be any if it's not in validator class. So you can use several custom rules.
+
+### Files validation
+### fileRules
+Default validator file validator (\FormLister\FileValidator) has the following rules:
+
+- required: files are loaded successfully;
+- allowed: file extension is in defined array;
+- images: file extension is jpg, jpeg, gif, png, bmp;
+- minSize: file size in kilobytes is greater than defined (strict or loose comparison possible, loose is default);
+- maxSize: file size in kilobytes is less than defined (strict or loose comparison possible, loose is default);
+- sizeBetween: file size in kilobytes is in the range (strict or loose comparison possible, loose is default);
+- minCount: files count is greater than defined (strict or loose comparison possible, loose is default);
+- maxCount: files count is less than defined (strict or loose comparison possible, loose is default);
+- countBetween: files count is in the range (strict or loose comparison possible, loose is default);
+
+### Validation results
+Error data are stored as an array and can be obtained with getFormData('errors') method call:
+```
+{
+ "field 1": {
+ "failed rule" : "error message"
+ },
+ "field 2": {
+ "failed rule" : "error message"
+ }
+}
+```
+This array is filled with addError(field name, rule name, error message) method. So, it's possible to affect final result adding records to this array manually. You can also call setValid(false) method to decline failed validation.
+
+Each field validation result can be output in template with [+field name.error+] placeholder. Total results can be output with [+form.messages+] placholder set by messagesTpl parameter. You can use the following placeholders on its part:
+
+- [+required+] - messages about empty required fields;
+- [+errors+] - messages about wrong filled fields.
+
+Use getErrorMessage(field name) method to get validation error messages for any field.
diff --git "a/en/04_Extras/FormLister/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217 \320\264\320\260\320\275\320\275\321\213\321\205.md" "b/en/04_Extras/FormLister/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217 \320\264\320\260\320\275\320\275\321\213\321\205.md"
deleted file mode 100644
index 9efb7da8..00000000
--- "a/en/04_Extras/FormLister/030_\320\222\320\260\320\273\320\270\320\264\320\260\321\206\320\270\321\217 \320\264\320\260\320\275\320\275\321\213\321\205.md"
+++ /dev/null
@@ -1,132 +0,0 @@
-## Валидация данных
-
-При валидации данных валидатор последовательно применяет к значению поля заданные правила, при возникновении ошибки в массив данных об ошибках добавляется запись и дальнейшая обработка формы прекращается.
-
-Валидация считается пройденной, если в массиве данных об ошибках отсутствуют записи.
-
-### Правила валидации
-Список правил задается в виде массива. Ключом является имя поля, а значением - массив правил валидации. Правило валидации является методом класса-валидатора. В массиве правил ключом является имя правила (название метода валидации), значением может быть либо строка с сообщением об ошибке валидации правила, или же массив с описанием. В этом массиве в ключе params задаются необходимые для валидации значения, а в ключе message задается строка с сообщением об ошибке.
-
-Можно также использовать отрицание правил, если добавить перед именем правила восклицательный знак: "!numeric" - поле пройдет валидацию, если его значение не является числом.
-
-Если нужно реализовать проверку только заполненных полей, то перед именем поля в списке правил нужно добавить восклицательный знак. В этом случае если значение поля пустое, правила будут проигнорированы.
-
-```
-{
- "имя поля 1": {
- "правило 1" : "сообщение об ошибке",
- "правило 2" : "сообщение об ошибке"
- },
- "имя поля 2": {
- "правило 1" : "сообщение об ошибке",
- "правило 2" : {
- "params" : значение,
- "message" : "сообщение об ошибке"
- }
- },
- "!имя поля 3":{
- "правило 1" : "сообщение об ошибке"
- }
-}
-```
-Стандартным классом валидации (\FormLister\Validator) предусмотрены правила:
-
-- required: поле заполнено;
-- date: значение поля является датой в заданном формате;
-- min: значение поля больше заданного или равно ему;
-- max: значение поля меньше заданного или равно ему;
-- greater: значение поля строго меньше заданного;
-- less: значение поля строго больше заданного;
-- between: значение поля входит в диапазон;
-- equals: значение поля равно заданному;
-- in: значение поля входит в заданный массив значений;
-- alpha: значение поля содержит только буквы;
-- numeric: значение поля содержит только цифры;
-- alphaNumeric: значение поля содержит только буквы и цифры;
-- slug: значение поля является частью url;
-- decimal: значение поля является десятичным числом;
-- phone: значение поля является номером телефона;
-- matches: значение поля удовлетворяет регулярному выражению;
-- url: значение поля является ссылкой;
-- email: значение поля является email-адресом;
-- length: длина значения поля равна заданному;
-- minLength: длина значения поля больше заданного или равна ему;
-- maxLength: длина значения поля меньше заданного или равна ему;
-- lengthBetween: длина значения поля входит в диапазон;
-- minCount: размер массива больше заданного;
-- maxCount: размер массива меньше заданного;
-- countBetween: размер массива входит в диапазон.
-
-Если требуется задать два значения для правила, то их следует задавать как массив:
-```
-&rules=`{
- "field" : {
- "lengthBetween" : {
- "params" : [10,20],
- "message" : "Длина должна быть от 10 до 20"
- }
- }
-}`
-```
-
-Для правила in (и других правил, использующих массив) массив значений следует задавать следующим образом:
-```
-&rules=`{
- "field" : {
- "in" : {
- "params" : [ [10,20,30] ],
- "message" : "Значение поля field должно быть равно 10, 20 или 30"
- }
- }
-}`
-```
-
-Это нужно, чтобы массив был передан в функцию одним аргументом.
-
-Предусмотрена также возможность использовать для валидации функции или статические методы загруженного класса:
-```
-&rules=`{
- "myfield":{
- "required":"Required field",
- "custom":{
- "function":"\\Namespace\\Classname::myCustomRule",
- "params":[10,20,30],
- "message":"Custom check failed"
- }
- }
-}`
-```
-
-Метод должен принимать первым аргументом экземпляр контроллера из которого вызывается правило, вторым аргументом - значение проверяемого поля, далее - параметры передаваемые в ключе описания params:
-```
-public static function myCustomRule($fl,$value,$a,$b,$c) {
- $result = $fl->getField('field1') == $a && $fl->getField('field2') == $b && $value == $c;
- return $result;
-}
-```
-В примере правило будет пройдено, если значение поля field1 = 10, значение поля field2 = 20, а значение поля, к которму применяется правило, = 30.
-
-Метод должен вернуть true, false или текст сообщения об ошибке (в этом случае можно не указывать message в списке правил).
-
-В примере используется название правила "сustom", но можно использовать любое название правила, которого нет в классе валидации. Таким образом можно использовать несколько правил данного типа.
-
-### Результаты валидации
-Данные об ошибках хранятся в виде массива и могут быть получены вызовом метода getFormData('errors'):
-```
-{
- "имя поля 1": {
- "имя нарушенного правила" : "сообщение об ошибке"
- },
- "имя поля 2": {
- "имя нарушенного правила" : "сообщение об ошибке"
- }
-}
-```
-Для добавления данных в этот массив используется метод addError(имя поля, имя правила, сообщение об ошибке). Таким образом, можно влиять на итоговый результат валидации, вручную добавляя записи в этот массив. Можно также объявить валидацию непройденной по умолчанию, вызвав метод setValid(false).
-
-В шаблонах результаты валидации для каждого поля выводятся с помощью плейсхолдера [+имя поля.error+]. Общий результат может быть выведен в плейсхолдер [+form.messages+], который задается шаблоном messagesTpl. В свою очередь, в этом шаблоне можно использовать плейсхолдеры:
-
-- [+required+] - сообщения о незаполенных полях;
-- [+errors+] - сообщения о неверно заполненных полях.
-
-Получить сообщения об ошибках для определенного поля можно с помощью метода getErrorMessage(имя поля).
diff --git a/en/04_Extras/FormLister/035_Captcha Usage.md b/en/04_Extras/FormLister/035_Captcha Usage.md
new file mode 100644
index 00000000..8286070d
--- /dev/null
+++ b/en/04_Extras/FormLister/035_Captcha Usage.md
@@ -0,0 +1,43 @@
+## Captcha usage
+
+FormLister can use modified MODX captcha and Google Recaptcha by default.
+
+Set the "captcha" parameter value with the name of captcha files folder (located at assets/snippets/FormLister/lib/captcha/) to enable it:
+```
+&captcha=`modxCaptcha`
+```
+
+The parameter named "captchaParams" contains an array of captcha settings. For example:
+```
+&captchaParams=`{
+"width":200,
+"height":120
+}`
+```
+
+The field name to get captcha value from user is defined by the "captchaField" parameter ("vericode" by default). Validation rule for this field is created automatically.
+
+To output captcha in form template use [+captcha+] placeholder.
+
+### modxCaptcha
+
+Settings:
+* width and height - width and height of a captcha image (100 and 60 by default);
+* inline - output format. If it's 1, then [+captcha+] placeholder contains an image in base64-format. If it's 0, then placeholder contains the link to connector.php file, which generates captcha image. Default value - 1;
+* connectorDir - path to the folder containing connector.php file, if "inline" parameter is set to 0. Default value - assets/snippets/FormLister/lib/captcha/modxCaptcha/;
+* errorEmptyCode - error message, if user doesn't enter captcha.
+* errorCodeFailed - error message, if user enters wrong value.
+
+### reCaptcha
+
+Uses Google reCAPTCHA V2. Include the following script in page tempalate to use it:
+```
+
+```
+
+The value of "captchaField" parameter should be set to "g-recaptcha-response" (see [documentation](https://developers.google.com/recaptcha/docs/verify)).
+
+Settings:
+* secretKey, siteKey - keys to access reCAPTCHA api;
+* size, theme, badge, callback, expired_callback, tabIndex, type - see. [documentation](https://developers.google.com/recaptcha/docs/display#render_param);
+* errorCodeFailed - error message if captcha validation failed.
diff --git "a/en/04_Extras/FormLister/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 \320\272\320\260\320\277\321\207\320\270.md" "b/en/04_Extras/FormLister/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 \320\272\320\260\320\277\321\207\320\270.md"
deleted file mode 100644
index 99f61a25..00000000
--- "a/en/04_Extras/FormLister/035_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265 \320\272\320\260\320\277\321\207\320\270.md"
+++ /dev/null
@@ -1,175 +0,0 @@
-## Использование капчи
-
-По умолчанию FormLister может использовать модицифированную капчу MODX и Google Recaptcha. Также в наличии SmsCaptcha - для отправки формы необходимо ввести код, полученный в смс-сообщении (отправку сообщения необходимо реализовывать отдельно).
-
-Для подключения необходимо указать имя папки с файлами капчи (папки находятся в assets/snippets/FormLister/lib/captcha/) в параметре &captcha.
-
-В параметре &captchaParams задаются в виде массива настройки капчи. Например:
-```
-&captchaParams=`{
-"width":200,
-"height":120
-}`
-```
-
-Имя поля, в которое пользователь вводит значение капчи, задается параметром captchaField (по умолчанию - vericode). Правило валидации для этого поля создается автоматически.
-
-Капча выводится в шаблоне формы с помощью плейсхолдера [+captcha+].
-
-### modxCaptcha
-
-Модификация стандартной капчи MODX.
-
-Настройки:
-* width и height - ширина и высота картинки с капчей (значение по умолчанию - 100 и 60);
-* inline - формат вывода. Если значение параметра равно 1, то в плейсхолдер [+captcha+] выводится картинка в base64-формате. Если 0, то выводится ссылка на файл connector.php, генерирующий картинку. Значение по умолчанию - 1;
-* connectorDir - путь к папке с файлом connector.php, если параметр inline равен 0. Значение по умолчанию - assets/snippets/FormLister/lib/captcha/modxCaptcha/;
-* errorEmptyCode - текст сообщения об ошибке, если поле со значением капчи не заполнено. Значение по умолчанию - "Введите проверочный код";
-* errorCodeFailed - текст сообщения об ошибке, если введено неверное значение капчи. Значение по умолчанию - "Неверный проверочный код"
-
-### reCaptcha
-
-Капча Google reCAPTCHA V2. На странице с формой должен быть подключен скрипт:
-```
-
-```
-
-Значение параметра captchaField должно быть "g-recaptcha-response" (см. [документацию](https://developers.google.com/recaptcha/docs/verify)).
-
-Настройки:
-* secretKey, siteKey - ключи для доступа к api reCAPTCHA;
-* size, theme, badge, callback, expired_callback, tabIndex, type - см. [документацию](https://developers.google.com/recaptcha/docs/display#render_param);
-* errorCodeFailed - текст сообщения об ошибке, если пользователь не прошел проверку. Значение по умолчанию - "Вы не прошли проверку"
-
-### smsCaptcha
-
-Настройки:
-* codeLifeTime - срок действия введенного кода, секунд. Если пользователь попытается ввести код до истечения срока, то будет выведено сообщение errorCodeUsed. Значение по умолчанию - 86400 (сутки);
-* errorEmptyCode - сообщение об ошибке, если пользователь получил, но не ввел код. Значение по умолчанию - "Введите код авторизации";
-* errorCodeRequired - сообщение об ошибке, если пользователь не запросил код. Значение по умолчанию - "Получите код авторизации";
-* errorCodeFailed - сообщение об ошибке, если пользователь ввел неверный код авторизации. Значение по умолчанию - "Неверный код авторизации";
-* errorCodeExpired - сообщение об ошибке, если пользователь не ввел полученный код в течение заданного времени. Значение по умолчанию - "Код авторизации истек, получите новый";
-* errorCodeUsed - сообщение об ошибке, если пользователь уже вводил код для текущей формы. Значение по умолчанию - "Код авторизации уже использовался".
-
-Чтобы использовать эту капчу необходимо предварительно создать таблицу в базе данных:
-```
-createTable();
-```
-
-Для отправки кода необходимо создать отдельную форму и указать в параметре prepareProcess сниппет:
- ```
-setValid(false);
- $FormLister->addError('phone','phone','Неверный номер телефона');
-} else {
- //загружаем класс для работы с таблицей
- $sms = $FormLister->loadModel('SmsModel','assets/snippets/FormLister/lib/captcha/smsCaptcha/model.php');
- $flag = false;
- //проверяем, есть ли в таблице запись для заданного номера и идентификатора формы
- $data = $sms->getData('+'.$rawPhone,$formid);
- if ($data->getID()) {
- //если есть и код не истек
- if ($sms->get('expires') > time()) {
- //смотрим, использован ли код
- if ($sms->get('active')) {
- $FormLister->addMessage('Вы уже использовали код.');
- } else {
- $FormLister->addMessage('Код уже был отправлен. Подождите несколько минут прежде чем запросить новый.');
- }
- //если код истек, то удаляем запись и разрешаем выдать новый
- } else {
- $sms->delete($sms->getID());
- $flag = true;
- }
- } else {
- $flag = true;
- }
- //если можно выдать новый код
- if ($flag) {
- $code = mt_rand(1000,9999);
-
- //здесь отправляется смс и результат помещается в переменную $result
- /**
- *
- */
- $result = array('status'=>true);
-
- //проверяем отправлена ли смс
- if (is_array($result) && $result['status']) {
- //создаем запись в таблице, время жизни кода - 3 минуты
- $result = $sms->create()->fromArray(array(
- 'phone'=>('+'.$rawPhone),
- 'formid'=>$formid,
- 'expires'=>(time() + 60*3),
- 'ip'=> \APIhelpers::getUserIP(),
- 'code'=>$code
- ))->save();
- //если получилось записать, то сохраняем в сессию номер телефона
- if ($result) {
- $_SESSION[$session_key] = '+'.$rawPhone;
- } else {
- $FormLister->setValid(false);
- $FormLister->addMessage('Не удалось отправить смс');
- }
- } else {
- //если нельзя выдать код, то запрещаем дальнейшую обработку формы
- $FormLister->setValid(false);
- }
-}
-?>
-```
-
-Полностью вызов FormLister:
-```
-[!FormLister?
-&formid=`code`
-&submitLimit=`0`
-&protectSubmit=`0`
-&rules=`{
-"phone":{
- "required":"Обязательно введите номер телефона",
- "phone":"Введите номер правильно"
-}
-}`
-&prepareProcess=`setSmsCaptcha`
-&captcha=`modxCaptcha`
-&formTpl=`@CODE:
-
-
-
-
-
-
-
`
-&successTpl=`@CODE:Код авторизации отправлен на номер [+phone.value+]. Срок действия кода - 3 минуты.`
-!]
-```
diff --git a/en/04_Extras/FormLister/040_Data Output.md b/en/04_Extras/FormLister/040_Data Output.md
new file mode 100644
index 00000000..fbd4a22a
--- /dev/null
+++ b/en/04_Extras/FormLister/040_Data Output.md
@@ -0,0 +1,75 @@
+## Data output
+
+Data are sanitized, arrays are converted to strings to be output in templates. Special placeholders are set for form controls. "Field name" below is the raw field name, without brackets for array fields.
+
+Raw field value (or placeholder):
+```
+[+field name+]
+[+placeholder.name+]
+```
+
+Sanitized field value (array fields are converted to strings):
+```
+[+field name.value+]
+```
+Example:
+```
+[+comment.value+] //The value of a field named "comment". It may be a scalar value of the real input or textarea or any other form element, but it can be set with PHP as well.
+```
+
+Setting checkbox:
+```
+[+c.field name.field value+]
+```
+Example:
+```
+[+c.agree.Yes+] //It outputs "checked" if a single checkbox named "agree" contains "Yes" value.
+[+c.district.West+] //Same but for one checkbox from an array of two checkboxes named "district[]"
+[+c.district.East+] //Same but for one checkbox from an array of two checkboxes named "district[]"
+```
+
+
+Setting select or radio-button:
+```
+[+s.field name.field value+]
+```
+Example:
+```
+[+s.country.Russia+] //It outputs "selected" if a single option of select named "country" is selected and its value is "Russia". See example for checkboxes if you need to use select with multiple options available to choose.
+```
+
+Class for empty required field:
+```
+[+field name.requiredСlass+]
+```
+
+Class for wrong filled field:
+```
+[+field name.errorClass+]
+```
+
+Alternative classes output:
+```
+[+field name.class+] outputs class="classname"
+[+field name.classname+] outputs "classname"
+```
+
+Validation error message:
+[+field name.error+]
+
+Controller messages output:
+[+form.messages+]
+
+There are 3 possible types of messages in the [+form.messages+] placeholder: failed the "required" rule fields, wrong filled fields, any messages set by addMessage() method. The last ones are output by default, see the "messagesTpl" parameter description.
+
+Lexicon entries:
+[%lexicon keys%]
+
+If any template engine (EvoTwig, EvoBlade) is used then template variables are available:
+* FormLister (controller object);
+* errors (formData['errors'] array);
+* messages (formData['messages'] array;
+* data (formData['fields'] array);
+* plh (placeholders set with setPlaceholder()) method as well as prerendered error messages if "prerenderErrors" parameter is on).
+
+Post procession of MODX parser construction is disabled when template engine is used.
diff --git "a/en/04_Extras/FormLister/040_\320\222\321\213\320\262\320\276\320\264 \320\264\320\260\320\275\320\275\321\213\321\205.md" "b/en/04_Extras/FormLister/040_\320\222\321\213\320\262\320\276\320\264 \320\264\320\260\320\275\320\275\321\213\321\205.md"
deleted file mode 100644
index 8dc1af8c..00000000
--- "a/en/04_Extras/FormLister/040_\320\222\321\213\320\262\320\276\320\264 \320\264\320\260\320\275\320\275\321\213\321\205.md"
+++ /dev/null
@@ -1,40 +0,0 @@
-## Вывод данных
-
-Для вывода в шаблоны данные экранируются, а массивы преобразовываются в строки. Кроме этого, для элементов управления устанавливаются специальные плейсхолдеры.
-
-Вывод неэкранированного значения поля:
-[+имя поля+]
-
-Вывод значения поля:
-```
-[+имя поля.value+]
-```
-
-Установка чекбокса:
-```
-[+c.имя поля.значение поля+]
-```
-
-Установка выпадающего списка или радио-кнопки:
-```
-[+s.имя поля.значение поля+]
-```
-
-Установка класса для незаполненного поля:
-[+имя поля.requiredСlass+]
-
-Установка класса для неверно заполненного поля:
-[+имя поля.errorClass+]
-
-Вывод сообщения об ошибке валидации:
-[+имя поля.error+]
-
-Вывод сообщений обработчика:
-[+form.messages+]
-
-В плейсхолдер [+form.messages+] могут выводиться три типа сообщений: нарушения правила required, нарушения остальных правил, произвольные сообщения, которые задаются методом addMessage. По умолчанию выводятся только последние, см. описание параметра messagesTpl.
-
-Вывод значений из лексиконов:
-[%ключ лексикона%]
-
-При использовании плагина EvoTwig в шаблонах доступны переменные FormLister (объект контроллера), errors (массив formData['errors']), messages (массив formData['messages']).
diff --git a/en/04_Extras/FormLister/050_Mail Sending.md b/en/04_Extras/FormLister/050_Mail Sending.md
new file mode 100644
index 00000000..1f265232
--- /dev/null
+++ b/en/04_Extras/FormLister/050_Mail Sending.md
@@ -0,0 +1,216 @@
+## Sending e-mail
+
+Form controller allows to send form data via e-mail.
+
+## Mailer parameters
+### parseMailerParams
+Allows to use form data in mail sending parameters (&to=\`[+user.email.value+]\` etc.).
+
+Possible values - 1, 0.
+
+Default value - 0.
+
+### isHtml
+Allows to send e-mail in html format.
+
+Possible values - 1, 0.
+
+Default value - 1.
+
+### to
+Receiver's address. If it's not set then the mail is not sent, but form procession is finished successfully.
+
+Possible values - e-mail address.
+
+Default value - none.
+
+### from
+Sender's address.
+
+Possible values - e-mail address.
+
+Default value - the "emailsender" configuration parameter value.
+
+### fromName
+Sender's name.
+
+Possible values - string.
+
+Default value - the "site_name" configuration parameter value.
+
+### replyTo
+ReplyTo header.
+
+Possible values - e-mail address.
+
+Default value - none.
+
+### cc
+Cс header.
+
+Possible values - e-mail address.
+
+Default value - none.
+
+### bcc
+Bcc header.
+
+Possible values - e-mail address.
+
+Default value - none.
+
+### noemail
+If it's set, then the mail isn't sent, but supposed to be sent successfully.
+
+Possible values - 1, 0.
+
+Default value - 0.
+
+### ignoreMailerResult
+If it's set, the mail is sent and supposed to be sent successfully.
+
+Possible values - 1, 0.
+
+Default value - 0.
+
+### subject, ccSubject, autoSubject
+Letter subject.
+
+Possible values - string.
+
+Default value - none.
+
+### subjectTpl, ccSubjectTpl, autoSubjectTpl
+Letter subject template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - the "subject" parameter value ("ccSubject", "autoSubject").
+
+### autosender
+Address to send additional letter.
+
+Possible values - e-mail address.
+
+Default value - none.
+
+### autosenderFromName
+The name of the additional letter sender.
+
+Possible values - string.
+
+Default value - the "site_name" configuration parameter value.
+
+### ccSender
+If it's set then the receiver's address is defined by the value of form field.
+
+Possible values - 1, 0.
+
+Default value - 0.
+
+### ccSenderField
+Field name containing e-mail address.
+
+Possible values - field name.
+
+Default value - email.
+
+### ccSenderFromName
+Sender's name for the mail sent to the form field defined address.
+
+Possible values - string.
+
+Default value - none.
+
+## ccMailConfig
+Allows to redefine mail sending parameters for the letters to the address taken from the form field ((isHtml, from, fromName, subject, replyTo, cc, bcc, noemail)).
+
+Possible values - json or php array.
+
+Default value - none.
+
+## autoMailConfig
+Allows to redefine mail sending parameters for the additional letters (isHtml, from, fromName, subject, replyTo, cc, bcc, noemail).
+
+Possible values - json or php array.
+
+Default value - none.
+
+## Submit protection
+### protectSubmit
+Prevents submission of the form with the same data again.
+
+Possible values - 1, 0 or fields list to check if the form is unique. Required fields are used by default.
+
+Default value - 1.
+
+### submitLimit
+Prevents sending mail too often.
+
+Possible values - number of seconds between form submits.
+
+Default value - 60.
+
+## Templates
+### reportTpl
+The main template of the letter. There's the [+attachments.value+] placeholder available in reportTpl template, it contains the list of attached files. To output particular file field use the [+field name.value+] placeholder. Files are sent only in letters with reportTpl template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - the list of fields and their values.
+
+### automessageTpl
+Template of the additional letter.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - reportTpl parameter value.
+
+### ccSenderTpl
+Template of the letter sent to the user defined address.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - reportTpl parameter value.
+
+### successTpl
+Success message template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with "form.default_successTpl" key.
+
+## Sending files
+### attachments
+Field names to store files. Single file fields (name="field" type="file") and multiple file fields as simple arrays (name="field[]" type="file" multiple) are supported.
+
+Default value - none.
+
+### attachFiles
+Allows to send any files.
+
+Possible values - array:
+```
+&attachFiles=`{
+"field ":{
+ "filepath":"assets/images/logo.png",
+ "filename":"logo.png"
+},
+"field 2":[
+ {
+ "filepath":"assets/images/file1.jpg",
+ "filename":"report.jpg"
+ },
+ {
+ "filepath":"assets/images/file2.jpg",
+ "filename":"report2.jpg"
+ }
+]
+}`
+```
+### deleteAttachments
+Allows to delete attachment files if the mail is sent successfully.
+
+Possible values - 0 or 1.
+
+Default value - 0.
diff --git "a/en/04_Extras/FormLister/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260 \320\277\320\270\321\201\320\265\320\274.md" "b/en/04_Extras/FormLister/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260 \320\277\320\270\321\201\320\265\320\274.md"
deleted file mode 100644
index 49b1b8e7..00000000
--- "a/en/04_Extras/FormLister/050_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260 \320\277\320\270\321\201\320\265\320\274.md"
+++ /dev/null
@@ -1,216 +0,0 @@
-## Отправка писем
-
-Контроллер Form позволяет отправлять данные формы в письме.
-
-## Параметры отправки почты
-### isHtml
-Разрешает отправлять письмо в формате html. Проверка корректности кода письма возлагается на разработчика.
-
-Возможные значения - 1, 0.
-
-Значение по умолчанию - 1.
-
-### to
-Адрес получателя. Если не указан, то письмо не отправляется, но считается успешно отправленным.
-
-Возможные значения - email-адрес.
-
-Значение по умолчанию - пусто.
-
-### from
-Возможные значения - email-адрес.
-
-Значение по умолчанию - параметр конфигурации emailsender.
-
-### fromName
-Имя отправителя.
-
-Возможное значение - строка.
-
-Значение по умолчанию - параметр конфигурации site_name.
-
-### replyTo
-Заголовок replyTo.
-
-Возможные значения - email-адрес.
-
-Значение по умолчанию - пусто.
-
-### cc
-Заголовок сс.
-
-Возможные значения - email-адрес.
-
-Значение по умолчанию - пусто.
-
-### bcc
-Заголовок bcc.
-
-Возможные значения - email-адрес.
-
-Значение по умолчанию - пусто.
-
-### noemail
-Если параметр задан, то письмо не отправляется, но считается успешно отправленным.
-
-Возможные значения - 1, 0.
-
-Значение по умолчанию - 0.
-
-### ignoreMailerResult
-Если параметр задан, то письмо отправляется, но результат отправки игнорируется.
-
-Возможные значения - 1, 0.
-
-Значение по умолчанию - 0.
-
-### subject
-Тема письма.
-
-Возможные значения - строка.
-
-Значение по умолчанию - пусто.
-
-### subjectTpl
-Шаблон темы письма.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - значение параметра subject.
-
-### autosender
-Адрес на который отправляется дополнительное письмо.
-
-Возможные значения - email-адрес.
-
-Значение по умолчанию - пусто.
-
-### autosenderFromName
-Имя отправителя дополнительного письма.
-
-Возможные значения - строка.
-
-Значение по умолчанию - параметр конфигурации site_name.
-
-### ccSender
-Если параметр задан, то на адрес указанный в поле формы отправляется письмо.
-
-Возможные значения - 1, 0.
-
-Значение по умолчанию - 0.
-
-### ccSenderField
-Имя поля, в котором хранится адрес получателя.
-
-Возможные значения - имя поля формы.
-
-Значение по умолчанию - email.
-
-### ccSenderFromName
-Имя отправителя письма на заданный в поле формы адрес.
-
-Возможные значения - строка.
-
-Значение по умолчанию - не указано.
-
-## Защита от повторной отправки
-### protectSubmit
-Защита от повторной отправки письма.
-
-Возможные значения - 1, 0 или список полей, по которым определяется уникальность письма. Если список не задан, то используются поля, обязательные для заполнения.
-
-Значение по умолчанию - 1.
-
-### submitLimit
-Защита от частой отправки писем.
-
-Значение - число секунд между повторной отправкой.
-
-Значение по умолчанию - 60.
-
-## Шаблоны
-### reportTpl
-Основной шаблон письма.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - список полей и их значений.
-
-### automessageTpl
-Шаблон дополнительного письма.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### ccSenderTpl
-Шаблон письма на заданный в поле формы адрес.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### successTpl
-Шаблон сообщения об успешной отправке писем.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-## Отправка файлов
-### attachments
-Имена полей, в которых хранятся файлы. Поддерживаются только поля с одним файлом (name="field" type="file") и поля с одномерным массивом файлов (name="field[]" type="file" multiple).
-
-Значение по умолчанию - пусто.
-
-### attachFiles
-Позволяет отправить произвольные файлы.
-
-Возможные значения - массив:
-```
-&attachFiles=`{
-"имя поля1":{
- "filepath":"assets/images/logo.png",
- "filename":"logo.png"
-},
-"имя поля2":[
- {
- "filepath":"assets/images/file1.jpg",
- "filename":"отчет.jpg"
- },
- {
- "filepath":"assets/images/file2.jpg",
- "filename":"отчет2.jpg"
- }
-]
-}`
-```
-### deleteAttachments
-Позволяет удалить файлы вложений после успешной отправки.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 0.
-
-### fileValidator
-Имя класса для валидации файлов. Если задано, то класс должен быть загружен заранее.
-
-Значение по умолчанию - \FormLister\FileValidator
-
-### fileRules
-Правила валидации (см. раздел "Валидация данных"). Стандартный валидатор поддерживает правила:
-
-- required: файлы успешно отправлены;
-- optional: аналогично required, но выполняется и в том случае, если пользователь не загружал файлы (то есть поле с файлами не является обязательным);
-- allowed: расширение файла входит в заданный массив;
-- images: расширение файла jpg, jpeg, gif, png, bmp;
-- minSize: размер файла в килобайтах больше заданного;
-- maxSize: размер файла в килобайтах меньше заданного;
-- sizeBetween: размер файла в килобайтах входит в диапазон;
-- minCount: количество файлов больше заданного;
-- maxCount: количество файлов меньше заданного;
-- countBetween: количество файлов входит в диапазон.
-
-Использовать конструкцию "!имя поля" в правилах валидации файлов нет смысла, так как значение поля с файлом не будет пустым, даже если файл не загружен. Следует использовать правило optional.
-
-В шаблоне письма reportTpl доступен плейсхолдер [+attachments.value+] со списком всех приложенных к письму файлов. Можно также вывести по отдельности: [+имя поля.value+]. Файлы отправляются только в письме c шаблоном reportTpl.
diff --git a/en/04_Extras/FormLister/060_Authorizing Users.md b/en/04_Extras/FormLister/060_Authorizing Users.md
new file mode 100644
index 00000000..893ab396
--- /dev/null
+++ b/en/04_Extras/FormLister/060_Authorizing Users.md
@@ -0,0 +1,135 @@
+## Authorizing users
+
+Login controller authorizes registered users using special MODxAPI class to manage them.
+
+Users are identified by their names or e-mails (username and email database fields), but it's possible to use alternative ways with "OnWebAuthentication" event.
+
+Plugin named "userHelper" performs some related operations: it counts login attempts, registers last login time, checks auto login cookie, blocks users after some unsuccessful tries, logs users out.
+
+## Controller parameters
+
+### model
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### modelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### loginField
+Field to identify user.
+
+Possible values - field name.
+
+Default value - username.
+
+### passwordField
+Password field.
+
+Possible values - field name.
+
+Default value - password.
+
+### rememberField
+Field to remember user. If the field value is equal to true, then a special auto login cookie will be set after successful authorization. Cookie name and its lifetime is defined by the "cookieName" and "cookieLifetime" parameters.
+
+Possible values - field name.
+
+Default value - rememberme.
+
+### checkActivation
+Enables check for the profile activation (see "Activating user profiles").
+
+Possible values - 0 or 1.
+
+Default value - 1.
+
+### context
+Authorization context.
+
+Possible values - mgr or web.
+
+Default value - web.
+
+### cookieName
+Cookie name to store auto login parameters.
+
+Default value - WebLoginPE.
+
+### cookieLifetime
+Autologin cookie life time.
+
+Possible values - the number of seconds since last login.
+
+Default value - 157680000 (5 years).
+
+### redirectTo
+Redirects user after successful authorization.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### exitTo
+Redirects already authorized user.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### successTpl
+Success message template. User data can be used there.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [%login.default_successTpl%]
+
+### skipTpl
+Outputs message if user is already authorized.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [%login.default_skipTpl%]
+
+## userHelper plugin parameters
+### logoutKey
+GET-parameter name to catch for user logout request. For example, http://sitename.ru/page.html?logout.
+
+Default value - logout.
+
+### cookieName
+Cookie name to store autologin parameters.
+
+Default value - WebLoginPE.
+
+### cookieLifetime
+Autologin cookie life time.
+
+Possible values - number of seconds since last login.
+
+Default value - 157680000 (5 years).
+
+### maxFails
+Number of unsuccessful login attempts before the block.
+
+Possible values - number greater than 0.
+
+Default value - 3.
+
+### blockTime
+Time to block.
+
+Possible values - number of seconds since last login attempt.
+
+Default value - 3600 (1 hour).
+
+### dateFormat
+Date format for the "dob" field.
+
+Possible values - date format according to the "date" function ("d.m.Y" etc.).
diff --git "a/en/04_Extras/FormLister/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" "b/en/04_Extras/FormLister/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md"
deleted file mode 100644
index 23335642..00000000
--- "a/en/04_Extras/FormLister/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md"
+++ /dev/null
@@ -1,129 +0,0 @@
-## Авторизация пользователей
-
-Авторизация пользователей в `FormLister` осуществляется с использованием контроллера `Login`.
-
-Авторизация может проходить по имени, email или другому полю из учетной записи. Поле задается в параметре `loginField`. Поле для авторизации должно быть **уникальным** для каждого веб-пользователя. Обычно для авторизации используются поля `username` или `email`.
-
-Дополнительное использование плагина [userHelper](https://github.com/evolution-cms/evolution/blob/develop/assets/snippets/FormLister/snippet.FormLister.php) позволяет:
-
-* вести учет количества логинов
-* опрееделить время последней авторизации
-* реализовать автологин или выход из учетной записи
-
-Перед использованием плагина `userHelper` убедитесь что он не отключен:
-
-
-
-## Параметры контроллера
-
-### model
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### modelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### loginField
-Поле, содержащее имя пользователя.
-
-Возможные значения - имя поля.
-
-Значение по умолчанию - username.
-
-### passwordField
-Поле, содержащее пароль пользователя.
-
-Возможные значения - имя поля.
-
-Значение по умолчанию - password.
-
-### rememberField
-Поле для запоминания пользователя. Если значение поля приводится к true, то при успешной авторизации будет установлена кука с параметрами автологина. Имя куки и ее время жизни задаются параметрами cookieName и cookieLifetime.
-
-Можно также задать поле rememberme в параметре defaults, чтобы запоминание происходило без участия пользователя:
-```
-&defaults=`{"rememberme":1}`
-```
-
-Возможные значения - имя поля.
-
-Значение по умолчанию - rememberme.
-
-### checkActivation
-Включает проверку активации учетной записи пользователя (см. "Активация учетных записей").
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 1.
-
-### context
-Контекст авторизации.
-
-Возможные значения - mgr или web.
-
-Значение по умолчанию - web.
-
-### cookieName
-Имя куки для хранения параметров автологина.
-
-Значение по умолчанию - WebLoginPE.
-
-### cookieLifetime
-Время жизни вышеуказанной куки.
-
-Возможные значения - число секунд с момента последнего логина.
-
-Значение по умолчанию - 157680000 (5 лет).
-
-### redirectTo
-Перенаправляет пользователя на страницу c указанным id после авторизации.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### exitTo
-Перенаправляет уже авторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### successTpl
-Шаблон сообщения об успешной авторизации. В шаблоне можно использовать данные пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Login с ключом [+login.default_successTpl+]
-
-### skipTpl
-Шаблон сообщения о том, что пользователь уже авторизован.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Login с ключом [+login.default_skipTpl+]
-
-## Параметры плагина userHelper
-### logoutKey
-Имя GET-параметра для запуска выхода из учетной записи. Если в ссылке на страницу сайта указан параметр с соответствующим именем (например, http://sitename.ru/page.html?logout), будет произведен выход из учетной записи.
-
-Значение по умолчанию - logout.
-
-### cookieName
-Имя куки для хранения параметров автологина.
-
-Значение по умолчанию - WebLoginPE.
-
-### cookieLifetime
-Время жизни вышеуказанной куки.
-
-Возможные значения - число секунд с момента последнего логина.
-
-Значение по умолчанию - 157680000 (5 лет).
diff --git a/en/04_Extras/FormLister/070_Registering Users.md b/en/04_Extras/FormLister/070_Registering Users.md
new file mode 100644
index 00000000..b8ab6b18
--- /dev/null
+++ b/en/04_Extras/FormLister/070_Registering Users.md
@@ -0,0 +1,143 @@
+## Регистрация пользователей
+
+Register controller allows to register users, add them to user groups and send notifications. It extends Form controller, so you can use all its parameters to send letters during registration.
+
+Field names should be the same as [modUsers](http://docs.evolution-cms.com/Extras/Snippets/DocLister/MODxAPI) model's ones.
+
+If there's no "username" field in the form, then its value will be the value of the "email" field. So it's possible to register users only by e-mail.
+
+If there's no "password" field, then its value will be created automatically. So, the registration adds up to specify e-mail only.
+
+If there's the "repeatPassword" field in the form and validation rules are set for the "password" and "repeatPassword" fields, then the "equals" rule will be corrected to check if the "password" field matches the "repeatPassword" field:
+:
+```
+"repeatPassword":{
+ "required":"Enter password one more time",
+ "equals":{
+ "params" : "This key is not needed because it will be set by Register controller",
+ "message":"Passwords don't match"
+ }
+}
+```
+
+Registration need to check if the "username" and "email" fields are unique. Controller provides rules needed:
+```
+&rules=`{
+ "username":{
+ "required":"Enter user name",
+ "alphaNumeric":"Only letters and digits are allowed",
+ "custom":{
+ "function":"\\FormLister\\Register::uniqueUsername",
+ "message":"You cannot use this name"
+ }
+ },
+ "email":{
+ "required":"Enter e-mail",
+ "email":"Wrong e-mail",
+ "custom":{
+ "function":"\\FormLister\\Register::uniqueEmail",
+ "message":"You cannot use this e-mail"
+ }
+ }
+}`
+```
+All model fields for the new record are available in templates. Additional field "user.password" with given password is set.
+
+## Parameters
+### model
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### modelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### allowedFields
+Fields allowed to process, other fields are ignored. The "username", "email" and "password" fields are enabled always.
+
+If not set, then all fields are allowed.
+
+Possible value - field names, comma separated.
+
+Default value - none.
+
+### forbiddenFields
+Fields forbidden to process. The "username", "email" and "password" fields will be removed from the list of forbidden fields.
+
+Possible value - field names, comma separated.
+
+Default value - none.
+
+### userGroups
+Adds registered user to user group.
+
+Possible values - group names, comma separated (or an array).
+
+Default value - none.
+
+### checkActivation
+Enables the check for user profile activation (see "Activating user profiles"). The "activate.url" field will be set, which contains link to a page with FormLister call to activate user profile.
+
+Possible values - 1 or 0.
+
+Default value - 0.
+
+### activateTo
+If profile activation check is enabled, then you have to specify the id of the page with FormLister call to activate user profile.
+
+Possible values - page id.
+
+Default value - the value of $modx->config['site_start'].
+
+### preparePostProcess
+Allows to process data after saving new user.
+
+Possible values - snippet names, anonymous functions, static methods of loaded classes.
+
+Default value - none.
+
+### redirectTo
+Redirects user after successful registration.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### exitTo
+Redirects authorized user.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### skipTpl
+Outputs message if user is authorized.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - register lexicon entry with the key [%register.default_skipTpl%].
+
+### successTpl
+Success message template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - register lexicon entry with the key [%register.default_successTpl%]
+
+### passwordLength
+Password length (if the password needs to be created automatically).
+
+Possible values - number of characters greater than 6.
+
+Default value - 6.
+
+### dateFormat
+Date format for the "dob" field.
+
+Possible values - date format according to the "date" function ("d.m.Y" etc.).
diff --git "a/en/04_Extras/FormLister/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md" "b/en/04_Extras/FormLister/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md"
deleted file mode 100644
index 58843c8e..00000000
--- "a/en/04_Extras/FormLister/070_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271.md"
+++ /dev/null
@@ -1,137 +0,0 @@
-## Регистрация пользователей
-
-Контроллер Register позволяет регистрировать пользователей в заданные группы и отправлять уведомления о регистрации. Контроллер является расширением контроллера Form, соответственно можно использовать соответствующие параметры для отправки писем при регистрации.
-
-Имена полей в форме должны соответствовать полям модели [modUsers](http://docs.evolution-cms.com/Extras/Snippets/DocLister/MODxAPI).
-
-Если в форме не задано поле username, то ему присваивается значение поля email. Таким образом можно регистрировать пользователей только по email.
-
-Если в форме не задано поле password, то значение поля генерируется автоматически. То есть регистрацию пользователя можно свести к указанию email.
-
-При регистрации с паролем, в форме может присутствовать поле repeatPassword. Если заданы правила валидации для полей password и repeatPassword, то при наличии для поля repeatPassword правила equals, оно будет автоматически скорректировано для проверки равенства значений полей password и repeatPassword:
-```
-"repeatPassword":{
- "required":"Введите пароль еще раз",
- "equals":{
- "params" : "Этот ключ в описании правила можно не задавать, он будет сформирован контроллером автоматически",
- "message":"Пароли не совпадают"
- }
-}
-```
-
-При регистрации следует проверять уникальность имени пользователя и email. В контроллере предусмотрены соответствующие правила:
-```
-&rules=`{
- "username":{
- "required":"Введите имя пользователя",
- "alphaNumeric":"Только буквы и цифры",
- "custom":{
- "function":"\\FormLister\\Register::uniqueUsername",
- "message":"Имя уже занято"
- }
- },
- "email":{
- "required":"Введите email",
- "email":"Неверный email",
- "custom":{
- "function":"\\FormLister\\Register::uniqueEmail",
- "message":"Этот email уже использует другой пользователь"
- }
- }
-}`
-```
-В шаблонах доступны все поля модели для созданной записи. Дополнительно задается поле user.password с незашифрованным паролем.
-
-## Параметры
-### model
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### modelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### allowedFields
-Разрешенные для обработки поля. Поля, не указанные в списке, игнорируются. Поля username, email и password всегда разрешены.
-
-Если не задано, то разрешены все поля.
-
-Возможные значения - имена полей формы, разделенные запятой.
-
-Значение по умолчанию - пусто.
-
-### forbiddenFields
-Запрещенные для обработки поля. Поля, указанные в списке, игнорируются. Поля username, email и password удаляются из списка запрещенных.
-
-Возможные значения - имена полей формы, разделенные запятой.
-
-Значение по умолчанию - пусто.
-
-### userGroups
-Добавляет зарегистрированного пользователя в указанные группы.
-
-Возможные значения - имена групп, разделенные запятой (если имена содержат запятую в названии, то можно задать значение параметра массивом).
-
-Значение по умолчанию - пусто.
-
-### checkActivation
-Включает проверку активации учетной записи пользователя (см. "Активация учетных записей"). При этом после сохранения записи будет установлено поле activate.url, содержащее ссылку на страницу с вызовом сниппета для активации учетной записи.
-
-Возможные значения - 1 или 0.
-
-Значение по умолчанию - 0.
-
-### activateTo
-Если включена проверка активации, то в этом параметре необходимо указать id страницы, на которой вызывается сниппет для активации.
-
-Возможные значения - id страницы.
-
-Значение по умолчанию - значение $modx->config['site_start'].
-
-### preparePostProcess
-Позволяет выполнить обработку данных после сохранения.
-
-Возможные значения - имена сниппетов, анонимные функции, статические методы загруженных классов.
-
-Значение по умолчанию - пусто.
-
-### redirectTo
-Перенаправляет пользователя на указанную страницу после регистрации.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### exitTo
-Перенаправляет уже авторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы.
-
-Значение по умолчанию - пусто.
-
-### skipTpl
-Шаблон сообщения для уже авторизованного пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Register с ключом [+register.default_skipTpl+]
-
-### successTpl
-Шаблон сообщения об успешной регистрации.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Register с ключом [+register.default_successTpl+]
-
-### passwordLength
-Длина пароля (если создается автоматически).
-
-Возможные значения - число символов больше 6.
-
-Значение по умолчанию - 6.
diff --git a/en/04_Extras/FormLister/075_Activating User Profiles.md b/en/04_Extras/FormLister/075_Activating User Profiles.md
new file mode 100644
index 00000000..ec27636c
--- /dev/null
+++ b/en/04_Extras/FormLister/075_Activating User Profiles.md
@@ -0,0 +1,84 @@
+## Activating user profiles
+
+Activate controller activates user profile, so it's possible to request registration confirmation by following the special link in the letter sent after the registration.
+
+If the user hasn't received this letter, then he can request it once more.
+
+User profile assumes to be inactivated if the "verified" field value is 0.
+
+Snippet calls to register and authorize users should have the "checkActivation" parameter enabled. It's possible to reset activation if user changes some field (email by default).
+
+If user creates password himself during registration, then this password needs to be requested to send a letter with the activation link. Or the new password will be created, because if user hasn't received the letter containing generated password after registration, then he cannot know this password
+
+All model fields are available in templates. Additional field "user.password" with raw password value is set as well as the "activate.url" field with activation link.
+
+## Parameters
+### model
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### modelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### redirectTo
+Redirects user after successful activation.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### exitTo
+Redirects authorized user.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### skipTpl
+Outputs message if user is authorized.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - activate lexicon entry with the key [%activate.default_skipTpl%].
+
+### reportTpl
+Letter template containing profile activation data.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### activateReportTpl
+Successful activation letter template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### successTpl
+Message template if e-mail with activation data is sent successfully.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - activate lexicon entry with the key [%activate.default_successTpl%]
+
+### activateSuccessTpl
+Message template if activation is finished successfully.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - activate lexicon entry with the key [+activate.default_activateSuccessTpl+]
+
+### passwordLength
+Password length.
+
+Possible values - number of characters greater than 6.
+
+Default value - 6.
diff --git "a/en/04_Extras/FormLister/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217 \321\203\321\207\320\265\321\202\320\275\321\213\321\205 \320\267\320\260\320\277\320\270\321\201\320\265\320\271.md" "b/en/04_Extras/FormLister/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217 \321\203\321\207\320\265\321\202\320\275\321\213\321\205 \320\267\320\260\320\277\320\270\321\201\320\265\320\271.md"
deleted file mode 100644
index ce0f3792..00000000
--- "a/en/04_Extras/FormLister/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\320\270\321\217 \321\203\321\207\320\265\321\202\320\275\321\213\321\205 \320\267\320\260\320\277\320\270\321\201\320\265\320\271.md"
+++ /dev/null
@@ -1,84 +0,0 @@
-## Активация учетных записей
-
-Контроллер Activate реализует активацию учетных записей. Таким образом появляется возможность требовать у пользователя подтверждение учетной записи путем перехода по специальной ссылке из письма, отправленного при регистрации.
-
-Если по какой-то причине пользователь не получил письмо, то c помощью контроллера Activate он может запросить его повторную отправку.
-
-Учетная запись пользователя считается неактивированной если в поле logincount записано -1.
-
-В вызовах сниппета для регистрации и авторизации пользователей должен присутствовать параметр &checkActivation=`1`.
-
-Поэтому если при регистрации пользователь указывал пароль самостоятельно, то нужно запрашивать пароль для отправки письма со ссылкой для активации. Иначе будет генерироваться новый пароль, потому что раз пользователь запрашивает письмо для активации вручную, значит письмо после регистрации он не получил и не знает созданный при регистрации пароль.
-
-В шаблонах доступны все поля модели для обрабатываемой записи. В шаблоне reportTpl задается поле user.password с незашифрованным паролем и поле activate.url со ссылкой для активации.
-
-## Параметры
-### model
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### modelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### redirectTo
-Перенаправляет пользователя на указанную страницу после активации.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### exitTo
-Перенаправляет авторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### skipTpl
-Шаблон сообщения для авторизованного пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Register с ключом [+register.default_skipTpl+]
-
-### reportTpl
-Шаблон письма с информацией для активации учетной записи.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### reportTpl
-Шаблон письма с информацией для активации учетной записи.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### successTpl
-Шаблон сообщения об успешной отправке письма с данными для активации.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Activate с ключом [+activate.default_successTpl+]
-
-### activateSuccessTpl
-Шаблон сообщения об успешной активации.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Activate с ключом [+activate.default_activateSuccessTpl+]
-
-### passwordLength
-Длина создаваемого пароля.
-
-Возможные значения - число символов больше 6.
-
-Значение по умолчанию - 6.
diff --git a/en/04_Extras/FormLister/080_Editing User Profiles.md b/en/04_Extras/FormLister/080_Editing User Profiles.md
new file mode 100644
index 00000000..a2b47cd0
--- /dev/null
+++ b/en/04_Extras/FormLister/080_Editing User Profiles.md
@@ -0,0 +1,117 @@
+## Editing user profile
+
+Profile controller allow authorized users to change their profiles, as well as passwords.
+
+E-mail should be checked for uniqueness with controller's special rule:
+```
+&rules=`{
+ "email":{
+ "required":"Enter e-mail",
+ "email":"Wrong e-mail",
+ "custom":{
+ "function":"\\FormLister\\Profile::uniqueEmail",
+ "message":"You cannot use this e-mail"
+ }
+ }
+}`
+```
+The same for the "username" field:
+```
+&rules=`{
+ "username":{
+ "required":"Enter user name",
+ "alphaNumeric":"Only letters and digits are allowed",
+ "custom":{
+ "function":"\\FormLister\\Profile::uniqueUsername",
+ "message":"You cannot use this name"
+ }
+ }
+}`
+```
+
+If the "password" field is empty, then the password will stay unchanged. The new password is stored in the "user.password" field. If the field specified by "verificationField" parameter is changed and "checkActivation" parameter is enabled then user needs to be authorized again.
+
+## Parameters
+### model
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### modelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### allowedFields
+Fields allowed to process, other fields are ignored. If password is changed, then the "password" field will be added to the list. If no value is set to the "username" field then, it this field be set with the "e-mail" field value. The "username" will be allowed in this case.
+
+If not set, then all fields are allowed.
+
+Possible value - field names, comma separated.
+
+Default value - none.
+
+### forbiddenFields
+Fields forbidden to process. The "password" and "username" fields are processed the same way as for the "allowedFields" parameter.
+
+Possible value - field names, comma separated.
+
+Default value - none.
+
+### verificationField
+When this field is changed, then profile activation will be reset.
+
+Possible value - field name.
+
+Default value - email.
+
+### checkActivation
+Logs user out when set if verification field is changed.
+
+Possible values - 0, 1.
+
+Default value - 0.
+
+### preparePostProcess
+Allows to process data after saving user data.
+
+Possible values - snippet names, anonymous functions, static methods of loaded classes.
+
+Default value - none.
+
+### redirectTo
+Redirects user after successful profile update.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### exitTo
+Redirects non authorized user.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### skipTpl
+Outputs message if user is not authorized.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - profile lexicon entry with the key [%profile.default_skipTpl%].
+
+### successTpl
+Success message template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### dateFormat
+Date format for the "dob" field.
+
+Possible values - date format according to the "date" function ("d.m.Y" etc.).
diff --git "a/en/04_Extras/FormLister/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\321\204\320\270\320\273\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" "b/en/04_Extras/FormLister/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\321\204\320\270\320\273\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
deleted file mode 100644
index 1a6d503c..00000000
--- "a/en/04_Extras/FormLister/080_\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\277\321\200\320\276\321\204\320\270\320\273\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
+++ /dev/null
@@ -1,99 +0,0 @@
-## Редактирование профиля пользователя
-
-Контроллер Profile позволяет авторизованным пользователям редактировать свои профили, в том числе менять пароль.
-
-При изменении профиля следует проверять уникальность email. В контроллере предусмотрено соответствующее правило:
-```
-&rules=`{
- "email":{
- "required":"Введите email",
- "email":"Неверный email",
- "custom":{
- "function":"\\FormLister\\Profile::uniqueEmail",
- "message":"Этот email уже использует другой пользователь"
- }
- }
-}`
-```
-Аналогично с полем username:
-```
-&rules=`{
- "username":{
- "required":"Введите имя пользователя",
- "alphaNumeric":"Только буквы и цифры",
- "custom":{
- "function":"\\FormLister\\Profile::uniqueUsername",
- "message":"Имя уже занято"
- }
- }
-}`
-```
-
-Если поле с паролем пустое, то пароль остается прежний. После изменения пароля пользователь должен авторизоваться с новым паролем. Новый пароль сохраняется в поле user.password.
-
-
-## Параметры
-### model
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### modelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### allowedFields
-Разрешенные для обработки поля. Поля, не указанные в списке, игнорируются. Если пользователь меняет пароль, то в разрешенные поля добавляется поле password. Если у пользователей совпадают поля e-mail и username, то при изменении e-mail будет изменено и поле username, если значение этого поля не задано. В этом случае поле username будет добавлено в список разрешенных.
-
-Если не задано, то разрешены все поля.
-
-Возможные значения - имена полей формы, разделенные запятой.
-
-Значение по умолчанию - пусто.
-
-### forbiddenFields
-Запрещенные для обработки поля. Поля, указанные в списке, игнорируются. Поля password и username исключаются из списка по аналогии с allowedFields.
-
-Возможные значения - имена полей формы, разделенные запятой.
-
-Значение по умолчанию - пусто.
-
-### preparePostProcess
-Позволяет выполнить обработку данных после сохранения.
-
-Возможные значения - имена сниппетов, анонимные функции, статические методы загруженных классов.
-
-Значение по умолчанию - пусто.
-
-### redirectTo
-Перенаправляет пользователя на указанную страницу после сохранения профиля.
-
-Возможные значения - id целевой страницы.
-
-Значение по умолчанию - пусто.
-
-### exitTo
-Перенаправляет неавторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### skipTpl
-Шаблон сообщения для неавторизованного пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Profile с ключом [+profile.default_skipTpl+]
-
-### successTpl
-Шаблон сообщения об успешном обновлении профиля. Если не задан, то генерируется сообщение об успешном сохранении формы.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
diff --git a/en/04_Extras/FormLister/085_Deleting Users Profiles.md b/en/04_Extras/FormLister/085_Deleting Users Profiles.md
new file mode 100644
index 00000000..0fc99e14
--- /dev/null
+++ b/en/04_Extras/FormLister/085_Deleting Users Profiles.md
@@ -0,0 +1,50 @@
+## Удаление профиля пользователя
+
+DeleteUser controller allows authorized users to delete their profiles. Password is required to confirm deletion.
+
+Extends Form controller.
+
+All user data is available.
+
+## Параметры
+### model
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### modelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### redirectTo
+Redirects user after successful action.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### exitTo
+Redirects non-authorized user.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### skipTpl
+Template for non-authorized user.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [%deleteUser.default_skipTpl%]
+
+### successTpl
+Success message template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - empty.
diff --git "a/en/04_Extras/FormLister/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\321\204\320\270\320\273\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" "b/en/04_Extras/FormLister/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\321\204\320\270\320\273\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
deleted file mode 100644
index bfe40414..00000000
--- "a/en/04_Extras/FormLister/085_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\277\321\200\320\276\321\204\320\270\320\273\321\217 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
+++ /dev/null
@@ -1,50 +0,0 @@
-## Удаление профиля пользователя
-
-Контроллер DeleteUser позволяет авторизованным пользователям удалять свои профили. Для подтверждения действия пользователю необходимо ввести свой пароль.
-
-Расширяет Form.
-
-В шаблонах доступны поля модели для удаляемой записи.
-
-## Параметры
-### model
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### modelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### redirectTo
-Перенаправляет пользователя на указанную страницу после сохранения профиля.
-
-Возможные значения - id целевой страницы.
-
-Значение по умолчанию - пусто.
-
-### exitTo
-Перенаправляет неавторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### skipTpl
-Шаблон сообщения для неавторизованного пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона deleteUser с ключом [+deleteUser.default_skipTpl+]
-
-### successTpl
-Шаблон сообщения об успешном удалении профиля. Если не задан, то генерируется сообщение об успешном сохранении формы.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
diff --git a/en/04_Extras/FormLister/090_Reminding Passwords.md b/en/04_Extras/FormLister/090_Reminding Passwords.md
new file mode 100644
index 00000000..a351c74a
--- /dev/null
+++ b/en/04_Extras/FormLister/090_Reminding Passwords.md
@@ -0,0 +1,144 @@
+## Reminding passwords
+
+Reminder controller allows users to restore their forgotten passwords. It extends Form controller.
+
+Password restoration process:
+
+- user enters username or email;
+- the message with a special link to restore user password is sent;
+- user follows a link and enters a new password (or it's generated automatically);
+- the message with the new password is sent, success message is shown.
+
+The "to" parameter is replaced with user email. The "resetTo" parameter is required.
+
+## Parameters
+### model
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### modelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### hashField
+The name of a field to store user hash.
+
+Default value - hash.
+
+### userField
+The name of the form field to get username or email.
+
+Default value - email.
+
+### uidField
+The name of the model field to identify user from the password restoration link.
+
+Default value - id.
+
+### exitTo
+Redirects authorized user to the target page.
+
+Possible values - target page id.
+
+Default value - none.
+
+### resetTo
+A page where the password restoration link will be pointed to. It's the required parameter.
+
+Possible values - target page id.
+
+Default value - id of the document, where snippet call is placed.
+
+### redirectTo
+Redirects user after successful password restoring.
+
+Possible values - targe page id.
+
+Default value - none.
+
+### skipTpl
+Template for the authorized user.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [+reminder.default_skipTpl+].
+
+### formTpl
+Template for the form to identify user.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### resetTpl
+Template for the form to set a new password. The password will be created automatically if there's no "resetTpl" template.
+
+The fields to enter passwords must be named as "password" and "repeatPassword". Hidden inputs with the names from the "uidField" and "hashField" parameters are needed. The value for the "hashField" field is set via [+user.hash+] placeholder.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### successTpl
+Template for the message about successful sending of the link to restore the password. User data is available.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [%reminder.default_successTpl%].
+
+### resetSuccessTpl
+Template for the message about successful password change. User data is available, as well as the new password ("newpassword").
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [%reminder.default_resetSuccessTpl%].
+
+### reportTpl
+Template for the message containing the link to restore the password. User data is available. The link to restore password is available via [+reset.url+] placeholder.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - lexicon entry with the key [%reminder.default_reportTpl%].
+
+### resetReportTpl
+Template for the message about successful password change. User data is available, as well as the new password ("newpassword"). The message will not be sent if this template is absent.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - none.
+
+### rules
+Validation rules for the form to identify user.
+
+Possible values - see "Data validation".
+
+Default value - none.
+
+### resetRules
+Validation rules for the form to enter a new password.
+If there are validation rules for the "password" and for the "repeatPassword" fields, then the "equals" rule for the repeatPassword field will be changed to check if these fields are equal:
+```
+"repeatPassword":{
+ "required":"Enter the password again",
+ "equals":{
+ "params" : "This will be corrected automatically",
+ "message":"Passwords do not match"
+ }
+}
+```
+Possible values - see "Data validation".
+
+Default value - none.
+
+### passwordLength
+Password length (если создается автоматически).
+
+Possible values - a number of characters greater than 6.
+
+Default value - 6.
diff --git "a/en/04_Extras/FormLister/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \320\277\320\260\321\200\320\276\320\273\320\265\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" "b/en/04_Extras/FormLister/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \320\277\320\260\321\200\320\276\320\273\320\265\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md"
deleted file mode 100644
index e9b507dd..00000000
--- "a/en/04_Extras/FormLister/090_\320\222\320\276\321\201\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265 \320\277\320\260\321\200\320\276\320\273\320\265\320\271 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md"
+++ /dev/null
@@ -1,143 +0,0 @@
-## Восстановление паролей пользователями
-
-Контроллер Reminder позволяет web-пользователям восстанавливать забытые пароли. Расширяет контроллер Form.
-
-Восстановление паролей происходит по следующей схеме:
-
-- пользователь вводит в форме свой идентификатор (им может быть имя пользователя или email);
-- пользователь получает письмо, в котором содержится ссылка для восстановления;
-- при переходе по ссылке пользователь получает возможность ввести новый пароль либо пароль будет сгенерирован автоматически;
-- пользователю отправляется письмо с новым паролем и показыается сообщение (в сообщении можно также вывести новый пароль).
-
-Параметр to перезаписывается значением email пользователя. Обязательно должен быть задан параметр resetTo.
-
-## Параметры
-### model
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### modelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### hashField
-Имя поля для хранения хэша данных пользователя.
-
-Значение по умолчанию - hash.
-
-### userField
-Имя поля для хранения идентификатора пользователя (имя пользователя или email).
-
-Значение по умолчанию - email.
-
-### uidField
-Имя поля, которое используется для идентификации пользователя при переходе по ссылке.
-
-Значение по умолчанию - id.
-
-### exitTo
-Перенаправляет авторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы.
-
-Значение по умолчанию - пусто.
-
-### resetTo
-Страница, на которую будет указывать ссылка для восстановления паролей. Обязательный параметр.
-
-Возможные значения - id целевой страницы.
-
-Значение по умолчанию - id документа, в котором вызван контроллер.
-
-### redirectTo
-Перенаправляет на указанную страницу после успешного восстановления пароля.
-
-Возможные значения - id целевой страницы.
-
-Значение по умолчанию - пусто.
-
-### skipTpl
-Шаблон сообщения для авторизованного пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_skipTpl+].
-
-### formTpl
-Шаблон формы для ввода идентификатора пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### resetTpl
-Шаблон формы для ввода нового пароля. Если параметр не задан, то пароль будет сгенерирован автоматически.
-
-Поля для ввода паролей должны называться password и repeatPassword. В форме должны также присутствовать скрытые поля с именами из параметров uidField и hashField. Значение для поля hashField задается через плейсхолдер [+user.hash+].
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### successTpl
-Шаблон сообщения об успешной отправке письма со ссылкой для восстановления пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.).
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_successTpl+].
-
-### resetSuccessTpl
-Шаблон сообщения об успешном восстановлении пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword).
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_resetSuccessTpl+].
-
-### reportTpl
-Шаблон письма со ссылкой для восстановления пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). Ссылка для восстановлени пароля в письме задается через плейсхолдер [+reset.url+]
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона Reminder с ключом [+reminder.default_reportTpl+]..
-
-### resetReportTpl
-Шаблон письма об успешном восстановлении пароля. В шаблоне можно выводить плейсхолдеры с данными пользователя (username, email и т.д.), а также новый пароль (newpassword). Если не задан, то письмо пользователю отправляться не будет.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-### rules
-Правила валидации для формы идентификации пользователя.
-
-Возможные значения - см. раздел "Валидация данных".
-
-Значение по умолчанию - пусто.
-
-### resetRules
-Правила валидации для формы установки нового пароля. Если заданы правила валидации для полей password и repeatPassword, то при наличии для поля repeatPassword правила equals, оно будет автоматически скорректировано для проверки равенства значений полей password и repeatPassword:
-```
-"repeatPassword":{
- "required":"Введите пароль еще раз",
- "equals":{
- "params" : "Этот ключ в описании правила можно не задавать, он будет сформирован контроллером автоматически",
- "message":"Пароли не совпадают"
- }
-}
-```
-Возможные значения - см. раздел "Валидация данных".
-
-Значение по умолчанию - пусто.
-
-### passwordLength
-Длина пароля (если создается автоматически).
-
-Возможные значения - число символов больше 6.
-
-Значение по умолчанию - 6.
diff --git "a/en/04_Extras/FormLister/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\270 \321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" b/en/04_Extras/FormLister/100_Creating And Editing User Documents.md
similarity index 99%
rename from "en/04_Extras/FormLister/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\270 \321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md"
rename to en/04_Extras/FormLister/100_Creating And Editing User Documents.md
index d383e93f..f24315d3 100644
--- "a/en/04_Extras/FormLister/100_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265 \320\270 \321\200\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md"
+++ b/en/04_Extras/FormLister/100_Creating And Editing User Documents.md
@@ -63,7 +63,7 @@
### ownerField
Имя поля, определяющего владельца записи. Если работать с документами modResource, то это будет имя tv-параметра (в Evo не предусмотрено создание записей веб-пользователями).
-Возможные значения - имя поля.
+Возможные значения - имя поля. It should be "createdby" in Evo 3.x.
Значение по умолчанию - aid.
diff --git a/en/04_Extras/FormLister/105_Deleting User Documents.md b/en/04_Extras/FormLister/105_Deleting User Documents.md
new file mode 100644
index 00000000..a5655d0a
--- /dev/null
+++ b/en/04_Extras/FormLister/105_Deleting User Documents.md
@@ -0,0 +1,97 @@
+## Deleting user documents
+
+DeleteContent controller allows authorized users to delete documents they created.
+
+It extends Form controller.
+
+Model fields are available in templates with the "user" prefix (user.fullname, user.email etc.).
+
+## Parameters
+### model
+MODxAPI class to manage documents or other type of records.
+
+Possible values - MODxAPI class name.
+
+Default value - \modResource.
+
+### modelPath
+Path to the MODxAPI class.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modResource.php.
+
+### userModel
+Class to manage users.
+
+Possible values - class name. Use Pathologic\EvolutionCMS\MODxAPI\modUsers model from pathologic/modxapi package in Evo 3.0.
+
+Default value - \modUsers
+
+### userModelPath
+Path to the class to manage users.
+
+Possible values - relative file path.
+
+Default value - assets/lib/MODxAPI/modUsers.php
+
+### ownerField
+Field name to get the record owner. For the modResource class it can be the name of a tv-parameter (because web users can not create documents in Evo).
+
+Possible values - field name. It should be "createdby" in Evo 3.x.
+
+Default value - aid.
+
+### idField
+$_REQUEST array key to get the id of the record to be deleted.
+
+Default value - id.
+
+### redirectTo
+Redirects user after successful operation.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### badOwnerTpl
+Outputs message if user is not the record owner.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - deleteContent lexicon entry with the key [%deleteContent.default_badOwnerTpl%].
+
+### badRecordTpl
+Outputs message if user can not delete record (it doesn't exists, for example).
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - deleteContent lexicon entry with the key [%deleteContent.default_badRecordTpl%].
+
+### skipTpl
+Outputs message if user is not authorized.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - deleteContent lexicon entry with the key [%deleteContent.default_skipTpl%].
+
+### successTpl
+Success message template.
+
+Possible values - template name, according to DocLister templating rules.
+
+Default value - deleteContent lexicon entry with the key [%deleteContent.default_successTpl%]
+
+### exitTo
+Redirects non authorized user.
+
+Possible values - target page id or array.
+
+Default value - none.
+
+### badRecordTo
+Redirects if record can not be deleted.
+
+Possible values - target page id or array.
+
+Default value - none.
diff --git "a/en/04_Extras/FormLister/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md" "b/en/04_Extras/FormLister/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md"
deleted file mode 100644
index 7cddeb4a..00000000
--- "a/en/04_Extras/FormLister/105_\320\243\320\264\320\260\320\273\320\265\320\275\320\270\320\265 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262 \320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217\320\274\320\270.md"
+++ /dev/null
@@ -1,97 +0,0 @@
-## Удаление профиля пользователя
-
-Контроллер DeleteContent позволяет авторизованным пользователям удалять созданные ими документы.
-
-Расширяет Form.
-
-В шаблонах доступны поля модели для удаляемой записи. Информация о пользователе доступна в полях с префиксом user (user.fullname, user.email и т.д.)
-
-## Параметры
-### model
-Класс MODxAPI.
-
-Возможные значения - имя класса MODxAPI.
-
-Значение по умолчанию - \modResource.
-
-### modelPath
-Путь к файлу класса, если класс не загружается заранее.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modResource.php.
-
-### userModel
-Класс для работы с пользователями.
-
-Возможные значения - имя класса.
-
-Значение по умолчанию - \modUsers
-
-### userModelPath
-Путь к файлу класса для работы с пользователями.
-
-Возможные значения - относительный путь к файлу.
-
-Значение по умолчанию - assets/lib/MODxAPI/modUsers.php
-
-### ownerField
-Имя поля, определяющего владельца записи. Если работать с документами modResource, то это будет имя tv-параметра (в Evo не предусмотрено создание записей веб-пользователями).
-
-Возможные значения - имя поля.
-
-Значение по умолчанию - aid.
-
-### idField
-Имя ключа массива $_REQUEST, по которому определяется id удаляемой записи.
-
-Значение по умолчанию - id.
-
-### redirectTo
-Перенаправляет пользователя на указанную страницу после удаления записи.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### badOwnerTpl
-Шаблон сообщения о том, что пользователь не является автором документа.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_badOwnerTpl+].
-
-### badRecordTpl
-Шаблон сообщения о том, что пользователь не может удалить запись: например, запись не существует.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_badRecordTpl+].
-
-### skipTpl
-Шаблон сообщения для неавторизованного пользователя.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_skipTpl+].
-
-### successTpl
-Шаблон сообщения об успешном сохранении новой записи.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - запись из лексикона deleteContent с ключом [+deleteContent.default_successTpl+]
-
-### exitTo
-Перенаправляет неавторизованного пользователя на указанную страницу.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
-
-### badRecordTo
-Перенаправление, если невозможно удалить запись.
-
-Возможные значения - id целевой страницы или массив.
-
-Значение по умолчанию - пусто.
diff --git a/en/04_Extras/FormLister/110_Lexicons.md b/en/04_Extras/FormLister/110_Lexicons.md
new file mode 100644
index 00000000..f076b059
--- /dev/null
+++ b/en/04_Extras/FormLister/110_Lexicons.md
@@ -0,0 +1,47 @@
+## Lexicons
+
+To use lexicons you should create a file named "lexicon name.inc.php" in a folder named as full language name (russian-UTF8, english etc.) or ISO 639-1 code (en, ru etc.):
+```
+
+```
+Parameters to load lexicons are:
+
+* langDir - lexicon folder path;
+* lang - lexicon language name (the "manager_language" configuration parameter value by default) or ISO 639-1 code; ISO codes are translated to language names for bundled languages;
+* lexicon - lexicon names, comma separated. Or specify an array of values right here:
+```
+&lexicon=`{
+ "english":{
+ "test":"Test lexicon value",
+ "foo":"Another lexicon value",
+ "bar":"And one more value"
+ },
+ "russian-UTF8":{
+ "test":"Проверка",
+ "foo":"Еще проверка",
+ "bar":"И еще"
+ }
+}`
+```
+Or:
+```
+&lexicon=`{
+ "en":{
+ "test":"Test lexicon value",
+ "foo":"Another lexicon value",
+ "bar":"And one more value"
+ },
+ "ru":{
+ "test":"Проверка",
+ "foo":"Еще проверка",
+ "bar":"И еще"
+ }
+}`
+```
+
+After that you can use the [%key%] placeholders to output lexicon entries. It possible to connect external lexicons with the help of adapter class (see "assets/snippets/FormLister/lib/LexiconHandlers/EvoBabelLexiconHandler.php" file for details; adapter class name should be set in "lexiconHandler" parameter.
diff --git "a/en/04_Extras/FormLister/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md" "b/en/04_Extras/FormLister/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md"
deleted file mode 100644
index dd64c097..00000000
--- "a/en/04_Extras/FormLister/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\321\213.md"
+++ /dev/null
@@ -1,18 +0,0 @@
-## Лексиконы
-
-Для использования лексиконов необходимо создать папку с полным названием языка (russian-UTF8, english и т.д.), в ней создать файл название_лексикона.inc.php:
-```
-
-```
-Для загрузки лексиконов при вызове сниппета следует указать параметры:
-
-* langDir - путь к папке с лексиконами;
-* lang - язык лексикона (если не указано, то используется параметр конфигурации manager_language);
-* lexicon - название лексикона, можно указать несколько названий через запятую.
-
-После этого в шаблонах можно использовать плейсхолдеры [%ключ%] для подстановки значений из загруженных языковых файлов. Кроме того поддерживаются лексиконы компонента EvoBabel.
\ No newline at end of file
diff --git a/en/04_Extras/FormLister/500_examples/001_Simple_Form.md b/en/04_Extras/FormLister/500_examples/001_Simple_Form.md
new file mode 100644
index 00000000..4686023b
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/001_Simple_Form.md
@@ -0,0 +1,91 @@
+## Simple Form
+```
+[!FormLister?
+&formid=`basic`
+&rules=`
+{
+ "name":{
+ "rekired":"Be sure to enter a name",
+ "match":{
+ "params":"/^[pls-']++$/ud",
+ "message":"Enter the name correctly"
+ }
+ },
+ "email":{
+ "rekired":"Be sure to enter an email",
+ "email":"Enter the email correctly"
+ },
+ "phone":{
+ "required":"Be sure to enter your phone number",
+ "phone":"Enter the number correctly"
+ },
+ "message":{
+ "required":"Be sure to enter a message",
+ "minLength":{
+ "params":10,
+ "message":"Message must be at least 10 characters long"
+ }
+ }
+}`
+&formTpl=`@CODE:
+
+
+
+
+
+
+
`
+&then='test@test.com'
+&chisender='1'
+&chanderfield='email'
+&chandertpl='@code:Thank you for contacting us, [+note.value+]'
+&reporter='@code:
+
'
+&arrowthle='@code:[+message+]'
+!]
+```
diff --git a/en/04_Extras/FormLister/500_examples/002_Controls.md b/en/04_Extras/FormLister/500_examples/002_Controls.md
new file mode 100644
index 00000000..580a6d5f
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/002_Controls.md
@@ -0,0 +1,140 @@
+## Form with Controls
+```
+[!FormLister?
+&formid=`advanced`
+&rules=`{
+"name":{
+ "required":"Be sure to enter a name"
+},
+"email":{
+ "required":"Be sure to enter your email"
+},
+"phone":{
+ "required":"Be sure to enter your phone number",
+ "phone":"Enter the number correctly"
+},
+"message":{
+ "required":"The case cannot be empty",
+ "minLength":{
+ "params":100,
+ "message":"Must be at least 100 characters"
+ }
+},
+"agree":{
+ "required":"You cannot send a request if you do not agree with the rules"
+},
+"products":{
+ "minCount":{
+ "params": 2,
+ "message": "Select at least 2 products"
+ }
+}
+}`
+&defaults=`{
+"topic":"Complaint"
+}`
+&formControls=`topic,agree,department,products`
+&formTpl=`@CODE:
+
+
+
+
+
+
+
`
+&to=`test@test.com`
+&subjectTpl=`@CODE: [+topic.value+] в [+department.value+]`
+&reportTpl=`@CODE:
+
`
+&errorTpl=`@CODE:[+message+]`
+!]
+```
diff --git a/en/04_Extras/FormLister/500_examples/004_Form_with_Captcha.md b/en/04_Extras/FormLister/500_examples/004_Form_with_Captcha.md
new file mode 100644
index 00000000..7b492b11
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/004_Form_with_Captcha.md
@@ -0,0 +1,85 @@
+## Form with Captcha
+```
+[!FormLister?
+&formid=`basic`
+&rules=`{
+"name":{
+ "required":"Be sure to enter a name"
+},
+"email":{
+ "required":"Be sure to enter your email",
+ "email":"Enter email correctly"
+},
+"phone":{
+ "required":"Be sure to enter your phone number",
+ "phone":"Enter the number correctly"
+},
+"message":{
+ "required":"Be sure to enter a message",
+ "minLength":{
+ "params":100,
+ "message":"Message must be at least 100 characters"
+ }
+}
+}`
+&captcha=`modxCaptcha`
+&formTpl=`@CODE:
+
`
+&errorTpl=`@CODE:[+message+]`
+!]
+```
diff --git a/en/04_Extras/FormLister/500_examples/005_Message_Output.md b/en/04_Extras/FormLister/500_examples/005_Message_Output.md
new file mode 100644
index 00000000..385d8666
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/005_Message_Output.md
@@ -0,0 +1,74 @@
+## Message Output
+```
+[!FormLister?
+&formid=`basic`
+&rules=`{
+"name":{
+ "required":"Be sure to enter a name"
+},
+"email":{
+ "required":"Be sure to enter your email",
+ "email":"Enter email correctly"
+},
+"phone":{
+ "required":"Be sure to enter your phone number",
+ "phone":"Enter the phone number correctly"
+},
+"message":{
+ "required":"Be sure to enter a message",
+ "minLength":{
+ "params":100,
+ "message":"Message must be at least 100 characters"
+ }
+}
+}`
+&formTpl=`@CODE:
+
+
+
+
+
+
+
`
+&messagesTpl=`@CODE:
[+required+][+errors+][+messages+]
`
+&messagesRequiredOuterTpl=`@CODE:
You have not filled in the required fields
[+messages+]
`
+&messagesErrorOuterTpl=`@CODE:
Some fields are filled in incorrectly
[+messages+]
`
+&messagesOuterTpl=`@CODE:
[+messages+]
`
+&errorClass=` has-error`
+&requiredClass=` has-warning`
+&errorTpl=`@CODE:[+message+]`
+!]
+```
diff --git a/en/04_Extras/FormLister/500_examples/006_Two_Sets_of_Field.md b/en/04_Extras/FormLister/500_examples/006_Two_Sets_of_Field.md
new file mode 100644
index 00000000..cd718975
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/006_Two_Sets_of_Field.md
@@ -0,0 +1,148 @@
+## Two Sets of Fields
+Depending on the value of the type field, different validation rules and email templates can be used.
+
+### FormLister Call
+```
+[!FormLister?
+&formid=`basic`
+&rules=`{
+"name":{
+ "required":"Be sure to enter a name"
+},
+"email":{
+ "required":"Be sure to enter your email",
+ "email":"Enter email correctly"
+},
+"phone":{
+ "required":"Be sure to enter your phone number",
+ "phone":"Enter the number correctly"
+}
+}`
+&entRules=`{
+"entname":{
+ "required":"Be sure to enter a name"
+},
+"entemail":{
+ "required":"Be sure to enter your email",
+ "email":"Enter email correctly"
+},
+"entphone":{
+ "required":"Be sure to enter your phone number",
+ "phone":"Enter the number correctly"
+},
+"entaddress":{
+ "required":"Be sure to enter the address"
+}
+}`
+&formControls=`type`
+&default='{"type":"Natural person"}'
+&formTpl=`@CODE:
+
`
+&errorTpl=`@CODE:[+message+]`
+!]
+```
+### Prepare-snippet typeSelector
+```
+if ($FormLister->getField('type') == 'Юридическое лицо') {
+ $FormLister->config->setConfig(array(
+ 'rules'=>$FormLister->getCFGDef('entRules'),
+ 'reportTpl'=>$FormLister->getCFGDef('reportEntTpl')
+ ));
+} else {
+ $FormLister->setField('type','Natural person');
+}
+```
diff --git a/en/04_Extras/FormLister/500_examples/007_Authorisation.md b/en/04_Extras/FormLister/500_examples/007_Authorisation.md
new file mode 100644
index 00000000..55caca46
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/007_Authorisation.md
@@ -0,0 +1,48 @@
+## Authorisation
+```
+[!FormLister?
+&formid=`login`
+&controller=`Login`
+&loginField=`email`
+&rules=`{
+"email":{
+ "required":"Be sure to enter an email",
+ "email":"Enter the email correctly"
+},
+Password:{
+ "required":"Be sure to enter a password"
+}
+}`
+&formTpl=`@CODE:
+
+
+
+
+
+
+
`
+&messagesOuterTpl=`@CODE:
[+messages+]
`
+&skipTpl=`@CODE:
You are already logged in.
`
+&successTpl=`@CODE:
Hello, [+fullname+]!
`
+&errorTpl=`@CODE:[+message+]`
+&errorClass=` has-error`
+&requiredClass=` has-warning`
+!]
+```
diff --git a/en/04_Extras/FormLister/500_examples/008_Registration.md b/en/04_Extras/FormLister/500_examples/008_Registration.md
new file mode 100644
index 00000000..ac2b4667
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/008_Registration.md
@@ -0,0 +1,98 @@
+## User Registration
+
+When registering, the user is added to the opt group. Two letters are sent - to the manager and the user. The user must confirm the registration by clicking on the link from the letter (see Account Activation).
+
+```
+[!FormLister?
+&formid=`register`
+&controller=`Register`
+&userGroups=`opt`
+&checkActivation=`1`
+&activateTo=`1514`
+&rules=`{
+"fullname":{
+ "required":"Be sure to enter a name"
+},
+"email":{
+ "required":"Be sure to enter your email",
+ "email":"Enter email correctly"
+},
+"password":{
+ "required":"Be sure to enter a password",
+ "minLength":{
+ "params":6,
+ "message":"Password must be longer than 6 characters"
+ }
+},
+"repeatPassword":{
+ "required":"Repeat password",
+ "equals":{
+ "message":"Passwords do not match"
+ }
+},
+"agree":{
+ "required":"To register you must accept the rules"
+}
+}`
+&allowedFields=`fullname`
+&formControls=`agree`
+&formTpl=`@CODE:
+
+
+
+
+
+
+
`
+&to=`info@sitename.ru`
+&reportTpl='@CODE:New user [+fullname.value+] ([+id.value+])'
+&ccSender=`1`
+&ccSenderField=`email`
+&ccSenderTpl='@CODE:Hello [+fullname.value+]. To activate your account, go to [+activate.url+]'
+&subject='Registration on the site [(site_name)]'
+&messagesOuterTpl=`@CODE:
[+messages+]
`
+&successTpl='@CODE:
Congratulations on your successful registration, [+fullname.value+]! After activation, you can authorrect on the site. If you have not received an email to activate your account, requere again.
`
+&errorTpl=`@CODE:[+message+]`
+&errorClass=` has-error`
+&requiredClass=` has-warning`
+!]
+```
diff --git a/en/04_Extras/FormLister/500_examples/009_Account_Activation.md b/en/04_Extras/FormLister/500_examples/009_Account_Activation.md
new file mode 100644
index 00000000..1d7876f8
--- /dev/null
+++ b/en/04_Extras/FormLister/500_examples/009_Account_Activation.md
@@ -0,0 +1,42 @@
+## Account Activation
+```
+[!FormLister?
+&controller=`Activate`
+&formid=`activate`
+&protectSubmit=`0`
+&rules=`{
+"email":{
+ "required":"Be sure to enter an email",
+ "email":"Enter the email correctly"
+}
+}`
+&formTpl=`@CODE:
+
+
+
+
+
+
+
`
+&messagesOuterTpl=`@CODE:
[+messages+]
`
+&successTpl='@CODE:
On the email you specified during registration, an email has been sent with further instructions!
'
+&resetSuccessTpl='@CODE:Done!'
+&resetTo=`12`
+&errorTpl=`@CODE:[+message+]`
+&errorClass=` has-error`
+&requiredClass=` has-warning`
+!]
+```
diff --git a/en/04_Extras/FormLister/index.md b/en/04_Extras/FormLister/index.md
index 4ce033da..6576fb19 100644
--- a/en/04_Extras/FormLister/index.md
+++ b/en/04_Extras/FormLister/index.md
@@ -1,17 +1,11 @@
-Автор: [Pathologic](https://github.com/Pathologic/)
-
-Сниппет для работы с формами. В отличие от eForm сниппет сложнее в настройке, что компенсируется возможностью более гибко решать различные задачи с применением форм.
-
-Отличительные особенности:
-
-* легко дорабатывается с помощью контроллеров и prepare-сниппетов;
-* использует шаблонизатор DocLister;
-* поддерживает лексиконы;
-* не зависит от html-кода формы и не влияет на него;
-* имеет api-режим для работы с шаблонизаторами и ajax;
-* умеет загружать исходные данные из внешних источников (массивы, плейсхолдеры, сессия, куки, MODxAPI);
-* поддерживает хранение параметров в файлах.
-
-Версия PHP - не ниже 5.6.
+Snippet to process forms. Though it seems to be more difficult than eForm, FormLister offers a lot of features to suit any form processing tasks:
+
+* it can be fitted for any custom task using controllers and prepare snippets;
+* DocLister template engine;
+* lexicons;
+* it does not depend on forms html code;
+* different api modes for convenient work with template engines and ajax;
+* external sources of data (arrays, modx placeholders, session, cookies, MODxAPI models);
+* storing parameters in files.
[Github](https://github.com/Pathologic/FormLister)
\ No newline at end of file
diff --git a/en/04_Extras/PageBuilder/01_Templates.md b/en/04_Extras/PageBuilder/01_Templates.md
old mode 100644
new mode 100755
diff --git a/en/04_Extras/PageBuilder/02_Fields.md b/en/04_Extras/PageBuilder/02_Fields.md
old mode 100644
new mode 100755
index a36c24dd..41102982
--- a/en/04_Extras/PageBuilder/02_Fields.md
+++ b/en/04_Extras/PageBuilder/02_Fields.md
@@ -28,12 +28,12 @@ For `richtext` field type this option must be specified in the key `options`
elements
-Possible values for the selection field. Available for the fields `dropdown`, `radio` and `checkbox`. Can be represented as an array of pairs `key => value`, or as a string in an cms format (`@SELECT` and others).
+Possible values for the selection field. Available for the fields `dropdown`, `radio`, `checkbox`, `imageradio` and `imagecheckbox`. Can be represented as an array of pairs `key => value`, or as a string in an cms format (`@SELECT` and others).
layout
-Layout for the fields `radio`, `checkbox` and `group`. Possible values are `vertical` (default) and `horizontal`. Also, for `group` you can use `gallery`.
+Layout for the fields `radio`, `checkbox`, `group`, `imageradio` and `imagecheckbox`. Possible values are `vertical` (default) and `horizontal`. Also, for `group` you can use `gallery`.
default
@@ -55,6 +55,8 @@ Default value. For the field type `checkbox` can be an array of values. Can be i
dropdown
Dropdown list
checkbox
Checkboxes, allows to multiselect
radio
Radio buttons
+
imagecheckbox
As checkbox, but with images. In elements array should be images as values.
+
imageradio
As radio, but with images. In elements array should be images as values.
group
Fields group, it is necessary to specify nested fields in the key `fields`
diff --git a/en/04_Extras/PageBuilder/03_Snippet.md b/en/04_Extras/PageBuilder/03_Snippet.md
old mode 100644
new mode 100755
diff --git a/en/04_Extras/PageBuilder/04_Plugin.md b/en/04_Extras/PageBuilder/04_Plugin.md
old mode 100644
new mode 100755
diff --git a/en/04_Extras/PageBuilder/05_Events.md b/en/04_Extras/PageBuilder/05_Events.md
old mode 100644
new mode 100755
diff --git a/en/04_Extras/PageBuilder/06_Samples.md b/en/04_Extras/PageBuilder/06_Samples.md
old mode 100644
new mode 100755
diff --git a/en/04_Extras/PageBuilder/07_Example_of_creating_containers.md b/en/04_Extras/PageBuilder/07_Example_of_creating_containers.md
old mode 100644
new mode 100755
diff --git a/en/04_Extras/PageBuilder/index.md b/en/04_Extras/PageBuilder/index.md
old mode 100644
new mode 100755
index fa2f168a..b669ee6f
--- a/en/04_Extras/PageBuilder/index.md
+++ b/en/04_Extras/PageBuilder/index.md
@@ -4,6 +4,8 @@ Author: mnoskov
The plug-in allows the developer to define a set of blocks with a certain markup and a list of fields, so that the content manager uses those blocks that it considers necessary, with its content.
+After installation, you must create the configuration files or rename the `*.php.sample` files to `*.php`. In the administration panel, the plugin adds a new tab to the edit-resource page. To show contents of the blocks use the snippet `[[PageBuilder]]`.
+
The configuration for the blocks is taken from the config folder. To create a new block, you need to create a `.php` file in this folder, which should return an associative array. To create a container, you need to create a file `container..php`. The structure of the array is as follows:
-Формат:
-Значение по умолчанию: нет
-Примечание: Используется только в чанке yesChunk
-Пример:
+Format:
+Default value: нет
+Note: Used only in the yesChunk chunk
+Exemple:
diff --git a/en/03_Develop/01_Elements/02_Chunks.md b/en/04_Extras/Shopkeeper/01_Snippet_Shopkeeper.md
similarity index 100%
rename from en/03_Develop/01_Elements/02_Chunks.md
rename to en/04_Extras/Shopkeeper/01_Snippet_Shopkeeper.md
diff --git a/en/03_Develop/01_Elements/03_Snippets.md b/en/04_Extras/Shopkeeper/02_Item_harams_shk_widget.md
similarity index 100%
rename from en/03_Develop/01_Elements/03_Snippets.md
rename to en/04_Extras/Shopkeeper/02_Item_harams_shk_widget.md
diff --git a/en/03_Develop/01_Elements/04_Plugins.md b/en/04_Extras/Shopkeeper/03_Module.md
similarity index 100%
rename from en/03_Develop/01_Elements/04_Plugins.md
rename to en/04_Extras/Shopkeeper/03_Module.md
diff --git a/en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/10_What_are_@_Bindings.md b/en/04_Extras/Shopkeeper/04_Send_order.md
similarity index 100%
rename from en/03_Develop/01_Elements/06_Template_Variables/10_@_Bindings/10_What_are_@_Bindings.md
rename to en/04_Extras/Shopkeeper/04_Send_order.md
diff --git a/en/03_Develop/01_Elements/index.md b/en/04_Extras/Shopkeeper/05_User_profile.md
similarity index 100%
rename from en/03_Develop/01_Elements/index.md
rename to en/04_Extras/Shopkeeper/05_User_profile.md
diff --git a/en/03_Develop/04_SystemVariables/index.md b/en/04_Extras/Shopkeeper/06_Order_payment.md
similarity index 100%
rename from en/03_Develop/04_SystemVariables/index.md
rename to en/04_Extras/Shopkeeper/06_Order_payment.md
diff --git a/en/04_Extras/Shopkeeper/index.md b/en/04_Extras/Shopkeeper/index.md
new file mode 100644
index 00000000..d0de02b4
--- /dev/null
+++ b/en/04_Extras/Shopkeeper/index.md
@@ -0,0 +1,7 @@
+Shopkeeper - Evolution Internet Store
+
+Snippet displays two types of shopping basket (extended or simple). Message with order details can be emailed and sent to the Shopkeeper module (recommended). Additional parameters can be attached to goods for the user to select. The eForm snippet is required for creation of the order form.
+
+## Install ##
+
+... need more
\ No newline at end of file
diff --git a/en/04_Extras/SimpleFile/index.md b/en/04_Extras/SimpleFile/index.md
index a566c866..721f20e5 100644
--- a/en/04_Extras/SimpleFile/index.md
+++ b/en/04_Extras/SimpleFile/index.md
@@ -1,49 +1,51 @@
+## SimpleFiles - attach files to the page
-
-
SimpleFiles - прикрепляем к странице файлы
-SimpleFiles - прикрепляем к странице файлы Evolution CMS.
-
Еще одно дополнение на базе DocLister и EasyUI. На этот раз к странице прикрепляются файлы и редактируются в таблице – как в MultiFiles, но немного удобнее (особенно если речь идет о большом количестве файлов) (:
-
Для работы необходимо наличие DocLister и MODxAPI, а также PHP не меньше 5.6.
При выводе через сниппеты-обертки sfLister и sfController доступны дополнительно виртуальные плейсхолдеры:
-
-
[+icon+] – иконка;
-
[+fSize+] – отформатированное значение размера;
-
[+mime+] – MIME-тип файла;
-
[+ext+] – расширение файла;
-
[+filename+] – имя файла без расширения;
-
[+basename+] – имя файла с расширением;
-
[+e.sf_title+] – название файла с экранированием символов;
-
[+e.sf_description+] – описание файла с экранированием символов.
-
-
-
Поля в таблице sf_files:
-
-
sf_id – id файла (idField);
-
sf_index – позиция в списке;
-
sf_title – название файла;
-
sf_description – описание файла;
-
sf_file – ссылка на файл;
-
sf_size – размер файла;
-
sf_isactive – флажок, чтобы скрыть какие-то файлы из вывода;
-
sf_rid – id ресурса, которому принадлежит файл (parentField);
-
sf_createdon – дата добавления файла.
-
\ No newline at end of file
+### SimpleFiles - attach Evolution CMS files to the page.
+
+Another addition based on DocLister and EasyUI. This time, files are attached to the page and edited in a table - as in MultiFiles, but a little more convenient (especially if we are talking about a large number of files) (:
+
+To work, you need a https://github.com/AgelxNash/DocLister, as well as PHP at least 5.6.
+
+Download here: https://github.com/Pathologic/SimpleFiles
+
+## Plugin settings
+- Tab name – Tab Name;
+- Controller class – controller class other than standard;
+- Templates – the id of the templates with which the plugin works is mandatory;
+- Documents – the same, but for individual resources;
+- Ignore Documents – excluded ID resources;
+- Roles – Allowed Roles;
+- Storage folder – the folder where the files are stored, by default assets/storage/;
+- Icons folder – the folder where the icons of files are stored, by default assets/snippets/simplefiles/icons/;
+- Allowed files – extensions of files allowed for download, separated by commas; if you do not specify, the system setting will be used;
+- Maximum file size – file size limit, in megabytes.
+
+Icons should be named as _file_extension_lowercase.png_
+
+The file.png icon is substituted if there is no suitable one.
+
+## Display records
+According to the output of the entries, we read about https://github.com/BBloke/docs/blob/master/en/04_Extras/SimpleFile/simplegallery/index.html
+
+When withdrawing through snippets-wrappers, sfLister and sfController additional virtual placeholders are available:
+
+- [+icon+] – icon;
+- [+fSize+] – formatted size value;
+- [+mime+] – MIME-type of the file;
+- [+ext+] – file extension;
+- [+filename+] – file name without extension;
+- [+basename+] – file name with extension;
+- [+e.sf_title+] – the name of the file with character shielding;
+- [+e.sf_description+] – description of the file with character escape.
+
+## Fields in the _sf_files_ table
+
+- sf_id – File id (idField);
+- sf_index – position in the list;
+- sf_title – file name;
+- sf_description – file description;
+- sf_file – link to the file;
+- sf_size – file size;
+- sf_isactive – checkbox to hide some files from output;
+- sf_rid – the id of the resource to which the file belongs (parentField);
+- sf_createdon is the date the file was added.
diff --git a/en/04_Extras/SimpleGallery/01_Image_Output.md b/en/04_Extras/SimpleGallery/01_Image_Output.md
new file mode 100644
index 00000000..3b2d0cd6
--- /dev/null
+++ b/en/04_Extras/SimpleGallery/01_Image_Output.md
@@ -0,0 +1,126 @@
+## Image output
+To display the gallery, use a DocLister with a onetable controller. For greater convenience, the DocLister is called through the sgLister snippet wrapper; accordingly, you can use any DocLister parameters when calling. sgLister also performs additional processing of the output data, which is implemented using the prepare parameter when docLister is called.
+
+## sgLister snippet parameters
+#### imageField
+The name of the field with the image.
+
+The default value is sg_image.
+
+#### parents
+To output images from specified resources.
+
+The possible values are resource ids separated by a comma.
+
+The default value is the id of the resource in which the snippet is called.
+
+#### documents
+To display individual images from all galleries.
+
+The possible values are the id of the records in the sg_images table, separated by a comma.
+
+The default value is empty.
+
+#### BeforePrepare, AfterPrepare
+Data processing before it is processed by the sgLister snippet, and after.
+
+The possible values are snippet names, separated by commas.
+
+The default value is empty.
+
+#### thumbSnippet
+The name of the snippet for generating previews at output.
+
+The possible values are the name of the snippet, for example, phpthumb.
+
+The default value is empty.
+
+#### thumbOptions
+Parameters passed to the snippet specified in the thumbSnippet parameter. To generate a single preview, a string with parameters is indicated:
+```
+&thumbSnippet=`phpthumb`
+&thumbOptions = `w=400&h=400&zc=1`
+```
+The path to the picture will be available in the template through the placeholder [+thumb.sg_image+]
+
+To generate multiple previews, parameters can be specified in json-format:
+```
+&thumbSnippet=`phpthumb`
+&thumbOptions = `{
+ "default":"w=400&h=400&zc=1",
+ "small":"w=50&h=50&zc=1",
+ "medium":"w=200&h=200&zc=1"
+}`
+```
+Paths to the pictures will be available in the template through placeholders:
+
+* [+thumb.sg_image+]
+* [+thumb_small.sg_image+]
+* [+thumb_medium.sg_image+]
+The default value is empty.
+
+#### tpl
+The template for the output.
+
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
+
+### Placeholders
+Table data sg_images:
+
+* [+sg_id+] — image id;
+* [+sg_index+] — position in the gallery;
+* [+sg_image+] — link to the picture;
+* [+sg_title+] — the name of the picture;
+* [+sg_description+] — description of the picture;
+* [+sg_properties+] - information about the image in json format;
+* [+sg_add+] — additional field;
+* [+sg_isactive+] — checkbox to hide some pictures from the output;
+* [+sg_rid+] — id of the resource to which the picture belongs (parentField);
+* [+sg_createdon+] — the date the picture was added.
+To output shielded data (parameter e in DocLister):
+
+* [+e.field_name+]
+Image information (when using the sgLister snippet):
+
+* [+properties.width+] - width in pixels;
+* [+properties.height+] - height in pixels;
+* [+properties.size+] - file size.
+Preview (when using the sgLister snippet and the specified parameters thumbSnippet and thumbOptions):
+
+* [+thumb.sg_image+] - link to the main preview file;
+* [+thumb_name.sg_image+] - link to an additional preview file;
+* [+thumb.width.sg_image+], [+thumb_name.width.sg_image+] - preview width;
+* [+thumb.height.sg_image+], [+thumb_name.height.sg_image+] - the height of the preview.
+Placeholders installed by the DocLister snippet are also available.
+
+### Example
+```
+[+pages+]
+[!sgLister?
+&ownerTPL=`@CODE:
`
+!]
+[+pages+]
+```
diff --git "a/en/04_Extras/SimpleGallery/01_\320\222\321\213\320\262\320\276\320\264 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\271.md" "b/en/04_Extras/SimpleGallery/01_\320\222\321\213\320\262\320\276\320\264 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\271.md"
index f94746ab..e69de29b 100644
--- "a/en/04_Extras/SimpleGallery/01_\320\222\321\213\320\262\320\276\320\264 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\271.md"
+++ "b/en/04_Extras/SimpleGallery/01_\320\222\321\213\320\262\320\276\320\264 \320\270\320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\270\320\271.md"
@@ -1,135 +0,0 @@
-##Вывод изображений
-
-Для вывода галереи используется DocLister с контроллером onetable. Для большего удобства вызов DocLister производится через сниппет-обертку sgLister; соответственно при вызове можно использовать любые параметры DocLister. В sgLister также производится дополнительная обработка выводимых данных, которая реализована с помощью параметра prepare при вызове DocLister.
-
-## Параметры сниппета sgLister
-###imageField
-Имя поля с изображением.
-
-Значение по умолчанию - sg_image.
-
-###parents
-Для вывода изображений из указанных ресурсов.
-
-Возможные значения - id ресурсов, разделенные запятой.
-
-Значение по умолчанию - id ресурса в котором вызывается сниппет.
-
-###documents
-Для вывода отдельных изображений из всех галерей.
-
-Возможные значения - id записей в таблице sg_images, разделенные запятой.
-
-Значение по умолчанию - пусто.
-
-###BeforePrepare, AfterPrepare
-Обработка данных до того, как они будут обработаны сниппетом sgLister, и после.
-
-Возможные значения - имена сниппетов, через запятую.
-
-Значени по умолчанию - пусто.
-
-###thumbSnippet
-Имя сниппета для генерации превью при выводе.
-
-Возможные значения: имя сниппета, например, phpthumb.
-
-Значение по умолчанию - пусто.
-
-###thumbOptions
-Параметры, передаваемые сниппету, указанному в параметре thumbSnippet. Для генерации единичного превью указывается строка с параметрами:
-```
-&thumbSnippet=`phpthumb`
-&thumbOptions = `w=400&h=400&zc=1`
-```
-
-Путь к картинке будет доступен в шаблоне через плейсхолдер [+thumb.sg_image+]
-
-Для генерации нескольких превью параметры можно задавать в json-формате:
-```
-&thumbSnippet=`phpthumb`
-&thumbOptions = `{
- "default":"w=400&h=400&zc=1",
- "small":"w=50&h=50&zc=1",
- "medium":"w=200&h=200&zc=1"
-}`
-```
-
-Пути к картинкам будут доступны в шаблоне через плейсхолдеры:
-
-- [+thumb.sg_image+]
-- [+thumb_small.sg_image+]
-- [+thumb_medium.sg_image+]
-
-Значение по умолчанию - пусто.
-
-###tpl
-Шаблон для вывода.
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-##Плейсхолдеры
-
-Данные таблицы sg_images:
-
-* [+sg_id+] — id картинки;
-* [+sg_index+] — позиция в галерее;
-* [+sg_image+] — ссылка на картинку;
-* [+sg_title+] — название картинки;
-* [+sg_description+] — описание картинки;
-* [+sg_properties+] - информация об изображении в формате json;
-* [+sg_add+] — дополнительное поле;
-* [+sg_isactive+] — флажок, чтобы скрыть какие-то картинки из вывода;
-* [+sg_rid+] — id ресурса, которому принадлежит картинка (parentField);
-* [+sg_createdon+] — дата добавления картинки.
-
-Для вывода экранированных данных (параметр e в DocLister):
-
-* [+e.имя_поля+]
-
-Информация об изображении (при использовании сниппета sgLister):
-
-* [+properties.width+] - ширина в пикселях;
-* [+properties.height+] - высота в пикселях;
-* [+properties.size+] - размер файла.
-
-Превью (при использовании сниппета sgLister и заданных параметрах thumbSnippet и thumbOptions):
-
-* [+thumb.sg_image+] - ссылка на основной файл превью;
-* [+thumb_имя.sg_image+] - ссылка на дополнительный файл превью;
-* [+thumb.width.sg_image+], [+thumb_имя.width.sg_image+] - ширина превью;
-* [+thumb.height.sg_image+], [+thumb_имя.height.sg_image+] - высота превью.
-
-Также доступны плейсхолдеры, устанавливаемые сниппетом DocLister.
-
-####Пример
-```
-[+pages+]
-[!sgLister?
-&ownerTPL=`@CODE:
`
-!]
-[+pages+]
-```
\ No newline at end of file
diff --git a/en/04_Extras/SimpleGallery/02_List_of_Galleries.md b/en/04_Extras/SimpleGallery/02_List_of_Galleries.md
new file mode 100644
index 00000000..141180e9
--- /dev/null
+++ b/en/04_Extras/SimpleGallery/02_List_of_Galleries.md
@@ -0,0 +1,64 @@
+### Display a list of galleries
+Implemented using the sg_site_content controller for the DocLister snippet. The controller adds the corresponding records from the sg_images table to the documents selected from the site_content table. For convenience, DocLister is called with the necessary settings from the sgController wrapper snippet.
+
+### SgController snippet parameters
+#### sgOuterTpl
+Image block template. Images in the block are displayed through the placeholder [+wrapper+], and the block itself is displayed in the document template through the placeholder [+images+].
+
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
+
+The default value is empty.
+
+#### sgRowTpl
+The image template in the sgOuterTpl block. See the "Image Output" section.
+
+Possible values are the name of the template specified according to the rules for specifying templates in the DocLister.
+
+The default value is empty.
+
+#### sgOrderBy
+The conditions for sorting pictures in a SQL query to select from the sg_images table.
+
+The default value is the ASC sg_index.
+
+#### sgDisplay
+Specifies the maximum number of images displayed in the sgOuterTpl block.
+
+The possible values are number or all to display all images.
+
+The default value is all.
+
+#### sgAddWhereList
+Additional conditions for the SQL query. Similar to the addWhereList parameter in the DocLister.
+
+The default value is empty.
+
+#### count
+Allows you to display the number of images in the gallery in the document template through the [+count+] placeholder. Makes an additional request, so it is disabled by default.
+
+The possible values are 0 or 1.
+
+The default value is 0.
+
+### Example
+```
+[[sgController?
+&count=`1`
+&depth=`1`
+&ownerTPL=`@CODE:[+dl.wrap+]`
+&tpl=`@CODE:
+`
+&thumbSnippet=`sgThumb`
+&thumbOptions=`400x300`
+&orderBy=`menuindex ASC`
+&sgOrderBy=`sg_index DESC`
+]]
+```
diff --git "a/en/04_Extras/SimpleGallery/02_\320\222\321\213\320\262\320\276\320\264 \321\201\320\277\320\270\321\201\320\272\320\260 \320\263\320\260\320\273\320\265\321\200\320\265\320\271.md" "b/en/04_Extras/SimpleGallery/02_\320\222\321\213\320\262\320\276\320\264 \321\201\320\277\320\270\321\201\320\272\320\260 \320\263\320\260\320\273\320\265\321\200\320\265\320\271.md"
deleted file mode 100644
index f2df70ff..00000000
--- "a/en/04_Extras/SimpleGallery/02_\320\222\321\213\320\262\320\276\320\264 \321\201\320\277\320\270\321\201\320\272\320\260 \320\263\320\260\320\273\320\265\321\200\320\265\320\271.md"
+++ /dev/null
@@ -1,66 +0,0 @@
-##Вывод списка галерей
-
-Реализуется с помощью контроллера sg_site_content для сниппета DocLister. Контроллер добавляет к документам, выбранным из таблицы site_content, соответствующие записи из таблицы sg_images. Для удобства DocLister вызывается с нужными настройками из сниппета-обертки sgController.
-
-##Параметры сниппета sgController
-
-###sgOuterTpl
-Шаблон блока изображений. Изображения в блоке выводятся через плейсхолдер [+wrapper+], а сам блок выводится в шаблоне документа через плейсхолдер [+images+].
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-###sgRowTpl
-Шаблон изображения в блоке sgOuterTpl. Смотрите раздел "Вывод изображений".
-
-Возможные значения - имя шаблона, указанное по правилам задания шаблонов в DocLister.
-
-Значение по умолчанию - пусто.
-
-###sgOrderBy
-Условия сортировки картинок в SQL-запросе на выборку из таблицы sg_images.
-
-Значение по умолчанию - sg_index ASC.
-
-###sgDisplay
-Определяет максимальное количество изображений, выводимых в блоке sgOuterTpl.
-
-Возможные значения - число или all, чтобы вывести все изображения.
-
-Значение по умолчанию - all.
-
-###sgAddWhereList
-Дополнительные условия для SQL-запроса. Аналогично параметру addWhereList в DocLister.
-
-Значение по умолчанию - пусто.
-
-###count
-Позволяет вывести в шаблоне документа количество изображений в галерее через плейсхолдер [+count+]. Производит дополнительный запрос, поэтому по умолчанию отключен.
-
-Возможные значения - 0 или 1.
-
-Значение по умолчанию - 0.
-
-####Пример
-```
-[[sgController?
-&count=`1`
-&depth=`1`
-&ownerTPL=`@CODE:[+dl.wrap+]`
-&tpl=`@CODE:
-`
-&thumbSnippet=`sgThumb`
-&thumbOptions=`400x300`
-&orderBy=`menuindex ASC`
-&sgOrderBy=`sg_index DESC`
-]]
-```
\ No newline at end of file
diff --git a/en/04_Extras/SimpleGallery/03_Generate_Download_Preview.md b/en/04_Extras/SimpleGallery/03_Generate_Download_Preview.md
new file mode 100644
index 00000000..255ea5ca
--- /dev/null
+++ b/en/04_Extras/SimpleGallery/03_Generate_Download_Preview.md
@@ -0,0 +1,27 @@
+## Generate download previews
+It is implemented using a plugin system. In general terms, the plugin should handle the event when loading a picture, when deleting a picture and when updating a picture. This allows you to get rid of the use of the phpthumb snippet when displaying images, which speeds up the output and does not clog the cache.
+
+Included as an example is the sgThumb plugin. For it to work, you need to mark the OnFileBrowserUpload, OnSimpleGalleryDelete and OnSimpleGalleryRefresh events, then create a customization
+```
+&tconfig=Thumbnails Configuration;textarea;
+```
+and add to it a list of preview descriptions in json format:
+```
+[
+{"template":3,"options":"w=320&h=200&zc=1","folder":"thumb"},
+{"template":6,"options":"w=384&h=384&far=C&bg=000000","folder":"384x384"},
+{"rid":9,"options":"w=500&h=500&zc=C&bg=000000","folder":"500x500"},
+{"template":6,"options":"w=500&h=500&zc=C&bg=000000","folder":"500x500"}
+]
+```
+Each rule is described by an array:
+```
+{"template":id_шаблона,"options":"параметры_phpthumb","folder":"имя_папки"}
+```
+or:
+```
+{"rid":id_документа,"options":"параметры_phpthumb","folder":"имя_папки"}
+```
+The example will create a 320x320 picture for template 3, a 500x500 picture for document 9 and two pictures for template 6: 384x384 and 500x500.
+
+When outputting, you need to use a snippet that gets the address of the image in the input parameter and some value to get a link to the preview (for the sgThumb snippet, this is the folder name from the sgThumb plugin settings) - in the options parameter. The snippet should be returned with a link to the preview.
diff --git "a/en/04_Extras/SimpleGallery/03_\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\321\217 \320\277\321\200\320\265\320\262\321\214\321\216 \320\277\321\200\320\270 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\265.md" "b/en/04_Extras/SimpleGallery/03_\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\321\217 \320\277\321\200\320\265\320\262\321\214\321\216 \320\277\321\200\320\270 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\265.md"
deleted file mode 100644
index 4d2e0528..00000000
--- "a/en/04_Extras/SimpleGallery/03_\320\223\320\265\320\275\320\265\321\200\320\260\321\206\320\270\321\217 \320\277\321\200\320\265\320\262\321\214\321\216 \320\277\321\200\320\270 \320\267\320\260\320\263\321\200\321\203\320\267\320\272\320\265.md"
+++ /dev/null
@@ -1,31 +0,0 @@
-##Генерация превью при загрузке
-
-Реализуется с помощью [системы плагинов](http://modx.im/blog/docs/3006.html). В общих чертах, плагин должен обрабатывать событие при загрузке картинки, при удалении картинки и при обновлении картинки. Это позволяет избавиться от использования сниппета phpthumb при выводе изображений, что ускоряет вывод и не засоряет кэш.
-
-В комплекте для примера присутствует плагин sgThumb. Для его работы нужно отметить события OnFileBrowserUpload, OnSimpleGalleryDelete и OnSimpleGalleryRefresh, затем создать настройку
-```
-&tconfig=Thumbnails Configuration;textarea;
-```
-
-и добавить в нее список описаний превью в формате json:
-```
-[
-{"template":3,"options":"w=320&h=200&zc=1","folder":"thumb"},
-{"template":6,"options":"w=384&h=384&far=C&bg=000000","folder":"384x384"},
-{"rid":9,"options":"w=500&h=500&zc=C&bg=000000","folder":"500x500"},
-{"template":6,"options":"w=500&h=500&zc=C&bg=000000","folder":"500x500"}
-]
-```
-
-Каждое правило описывается массивом:
-```
-{"template":id_шаблона,"options":"параметры_phpthumb","folder":"имя_папки"}
-```
-или:
-```
-{"rid":id_документа,"options":"параметры_phpthumb","folder":"имя_папки"}
-```
-
-В примере будет создаваться картинка 320x320 для шаблона 3, картинка 500х500 для документа 9 и две картинки для шаблона 6: 384x384 и 500x500.
-
-При выводе нужно использовать сниппет, который получает адрес картинки в параметре input и какое-то значение для получения ссылки на превью (для сниппета sgThumb это имя папки из настроек плагина sgThumb) - в параметре options. Вернуть сниппет должен ссылку на превью.
\ No newline at end of file
diff --git a/en/04_Extras/SimpleGallery/04_Developer.md b/en/04_Extras/SimpleGallery/04_Developer.md
new file mode 100644
index 00000000..8cb0178d
--- /dev/null
+++ b/en/04_Extras/SimpleGallery/04_Developer.md
@@ -0,0 +1,7 @@
+## Developers
+
+[Creating Plugins](http://modx.im/blog/docs/3006.html)
+
+[Changing the Logic of Work and the Interface](http://modx.im/blog/docs/3277.html)
+
+[Dynamically change parameters](http://modx.im/blog/docs/3321.html)
diff --git "a/en/04_Extras/SimpleGallery/04_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274.md" "b/en/04_Extras/SimpleGallery/04_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274.md"
deleted file mode 100644
index 362624c1..00000000
--- "a/en/04_Extras/SimpleGallery/04_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\260\320\274.md"
+++ /dev/null
@@ -1,5 +0,0 @@
-##Разработчикам
-
-[Создание плагинов](http://modx.im/blog/docs/3006.html)
-[Изменение логики работы и интерфейса](http://modx.im/blog/docs/3277.html)
-[Динамическое изменение параметров](http://modx.im/blog/docs/3321.html)
\ No newline at end of file
diff --git a/en/04_Extras/SimpleGallery/index.md b/en/04_Extras/SimpleGallery/index.md
index 4b18f4ee..e17d3b2e 100644
--- a/en/04_Extras/SimpleGallery/index.md
+++ b/en/04_Extras/SimpleGallery/index.md
@@ -1,27 +1,26 @@
+## SimpleGallery - Display gallery on page
+SimpleGallery - Display the gallery on the Evolution CMS page.
+Since such a question did arise, I will show you how to draw a conclusion. The input, I hope, is intuitive (:
-
-
SimpleGallery - Вывод галереи на странице
-SimpleGallery - Вывод галереи на странице Evolution CMS.
-
Раз такой вопрос все же возник, то покажу, как делать вывод. Ввод, я надеюсь, понятен интуитивно (:
-
Вывод галереи на странице
-
Важное достоинство DocLister заключается в том, что теперь не нужно городить свои велосипеды для вывода данных из любых таблиц: не нужно придумывать названия параметров (чтобы потом в них путаться), пагинации, сортировки и т.п. Всю нудную работу сделал Agel_Nash , за что ему в очередной раз спасибо.
-
Для работы с произвольными таблицами в DocLister есть контроллер onetable. Все что нужно знать – это название таблицы, названия ее полей, название ключевого поля. Все остальное есть в документации.
-
Еще раз приведу названия полей в таблице sg_images:
-
-
sg_id – id картинки, ключевое поле (idField);
-
sg_index – позиция в списке;
-
sg_image – ссылка на картинку;
-
sg_title – название картинки;
-
sg_description – описание картинки;
-
sg_properties – здесь в формате json хранится информация о ширине и высоте картинки, а также размере файла, можно еще что-нибудь хранить в этом поле;
-
sg_add – дополнительное поле, сейчас уже не помню, зачем оно мне было нужно;
-
sg_isactive – флажок, чтобы скрыть какие-то картинки из вывода;
-
sg_rid – id ресурса, которому принадлежит картинка (parentField);
-
sg_createdon – дата добавления картинки.
-
+## Display the gallery on the page
+An important advantage of DocLister is that now you do not need to fence your bicycles to output data from any tables: you do not need to come up with the names of the parameters (so that you can then get confused in them), pagination, sorting, etc. All the tedious work was done by [Agel_Nash](http://modx.im/profile/Agel_Nash/), for which he is once again grateful.
-
Зная это, чтобы вывести картинки из галереи, достаточно сделать такой вызов на странице с галереей:
-
+To work with arbitrary tables, DocLister has a onetable controller. All you need to know is the name of the table, the names of its fields, the name of the key field. Everything else is [in the documentation](doclister/index.html).
+
+Once again, I will give the names of the fields in the table sg_images:
+
+* sg_id – image id, key field (idField);
+* sg_index – position in the list;
+* sg_image – link to the picture;
+* sg_title – the name of the picture;
+* sg_description – description of the picture;
+* sg_properties - here in json format information about the width and height of the image, as well as the size of the file, you can store something else in this field;
+* sg_add is an additional field, now i don't remember why i needed it;
+* sg_isactive – checkbox to hide some pictures from the output;
+* sg_rid – the id of the resource to which the image belongs (parentField);
+* sg_createdon is the date the picture was added.
+Knowing this, in order to display pictures from the gallery, it is enough to make such a call on the page with the gallery:
+```
[[DocLister?
&controller=`onetable`
&table=`sg_images`
@@ -32,107 +31,101 @@ SimpleGallery - Вывод галереи на странице Evolution CMS.
&tpl=`@CODE:[+sg_image+] [+sg_title+]`
&showParent=`-1`
]]
-
Если на страницу добавить [+pages+], а к вызову добавить &paginate=`pages` &display=`10` – получим пагинацию.
-
То есть вывод из своей таблицы не сильно отличается от обычного вывода документов.
-
Чтобы не писать каждый раз &controller=`onetable` &table=`sg_images` &idField=`sg_id`, я сделал сниппет-обертку sgLister. Agel_Nash этот сниппет доработал и теперь при его вызове происходит дополнительная обработка полей, в чанке можно использовать такие плейсхолдеры:
-
-
[+thumb.sg_image+], [+thumb.width.sg_image+], [+thumb.height.sg_image+] – превьюшка и ее размеры;
-
[+e.sg_title+] и [+e.sg_description+]- значения полей sg_title и sg_description, которые преобразованы в html-сущности (чтобы не поломать случайно верстку кавычками или скобками);
-
[+properties.имя_свойства+] – свойства картинки из поля sg_properties.
-
-
Использовать поле [+thumb.sg_image+] можно, если при вызове добавить параметры:
-
-
&thumbSnippet – имя сниппета, который вернет ссылку на превью, например, phpthumb;
-
&thumbOptions – параметры для создания превью, в том виде, в каком их примет указанный сниппет.
-
-
На практике это выглядит так:
-
+```
+If you add [+pages+] to the page, and add &paginate='pages' &display='10' to the call, we get a pagination.
+
+That is, the output from your table is not much different from the usual output of documents.
+
+In order not to write &controller='onetable' &table='sg_images' &idField='sg_id' every time, I made a sgLister snippet wrapper. [Agel_Nash](http://modx.im/profile/Agel_Nash/) this snippet has been improved and now when it is called, additional processing of fields occurs, in chunk you can use such placeholders:
+
+* [+thumb.sg_image+], [+thumb.width.sg_image+], [+thumb.height.sg_image+] – preview and its dimensions;
+* [+e.sg_title+] and [+e.sg_description+]- the values of the fields sg_title and sg_description, which are converted into html-entities (so as not to accidentally break the layout with quotation marks or brackets);
+* [+properties.property_name+] – properties of the picture from the sg_properties field.
+You can use the [+thumb.sg_image+] field if you add parameters when calling:
+
+* &thumbSnippet – the name of the snippet that will return a link to the preview, for example, phpthumb;
+* &thumbOptions – parameters for creating previews, in the form in which they will be accepted by the specified snippet.
+In practice, it looks like this:
+```
[[sgLister?
&thumbSnippet=`phpthumb`
&thumbOptions=`w=150&h=150&zc=1`
&tpl=`@CODE:
-<a href="[+sg_image+]">
- <img src="[+thumb.sg_image+]" class="img-thumbnail" alt="[+e.sg_title+]" title="[+e.sg_description+]">
-</a>`
+
+
+`
]]
-
+```
+### Display a list of galleries
+This task doesn't come up as often, but it does, so [I've expanded the controller](http://modx.im/blog/docs/2759.html) site_content to be able to add pictures from galleries when displaying a list:
-
Вывод списка галерей
-
Такая задача возникает не так часто, но все же возникает, поэтому я расширил контроллер site_content, чтобы получить возможность добавить картинки из галерей при выводе списка:
-
То есть то же самое, что простой вывод документов, но добавлены дополнительные параметры:
-
-
&sgOuterTpl и &sgRowTpl – чанки для вывода картинок;
-
&sgOrderBy – параметры сортировки картинок;
-
&sgDisplay – сколько картинок выводить, all – чтобы вывести все;
-
&sgAddWhereList – здесь можно указать условия для выборки картинок.
-
+```
+That is, the same as a simple output of documents, but additional parameters have been added:
-
Для того, чтобы вывести в чанке документа (&tpl) эти картинки, следует использовать плейсхолдер [+images+]. Однако если просто вписать [+images+], то картинки не выведутся (потому что images – это массив). Нужен prepare-сниппет для дополнительной обработки (назовем его prepareImages):
-
-<?php
+* &sgOuterTpl and &sgRowTpl – chunks for displaying pictures;
+* &sgOrderBy – image sorting options;
+* &sgDisplay – how many pictures to output, all – to output everything;
+* &sgAddWhereList – here you can specify the conditions for selecting images.
+In order to display these pictures in the document chunk (&tpl), you should use the placeholder [+images+]. However, if you just enter [+images+], the images will not be displayed (because images are an array). You need a prepare-snippet for additional processing (let's call it prepareImages):
+```
+runSnippet(
'phpthumb',
array(
- 'input' => $image['sg_image'],
- 'options' => 'w=150&h=150&zc=1'
+ 'input' => $image['sg_image'],
+ 'options' => 'w=150&h=150&zc=1'
)
);
//сделали превьюшку
+ $ph['e.sg_title'] = htmlentities($image['sg_title'], ENT_COMPAT, 'UTF-8', false);
+ $ph['e.sg_description'] = htmlentities($image['sg_description'], ENT_COMPAT, 'UTF-8', false);
+ //добавили поля e.sg_title и e.sg_description
- $ph['e.sg_title'] = htmlentities($image['sg_title'], ENT_COMPAT, 'UTF-8', false);
- $ph['e.sg_description'] = htmlentities($image['sg_description'], ENT_COMPAT, 'UTF-8', false);
- //добавили поля e.sg_title и e.sg_description
+ $wrapper .= $_DocLister->parseChunk($_DocLister->getCFGDef('sgRowTpl'), $ph);
+ //обработали чанк sgRowTpl - для каждой картинки
+}
+$data['images'] = $_DocLister->parseChunk($_DocLister->getCFGDef('sgOuterTpl'),array('wrapper'=>$wrapper));
+//обработали чанк sgOuterTpl
- $wrapper .= $_DocLister->parseChunk($_DocLister->getCFGDef('sgRowTpl'), $ph);
- //обработали чанк sgRowTpl - для каждой картинки
- }
- $data['images'] = $_DocLister->parseChunk($_DocLister->getCFGDef('sgOuterTpl'),array('wrapper'=>$wrapper));
- //обработали чанк sgOuterTpl
}
return $data;
-?>
-
-
-
Prepare-сниппет может пригодиться также для вывода свойств картинки. Это ширина, высота и размер файла – они хранятся в поле sg_properties в виде json. Тут все просто:
-
-<?php
+?>
+```
+Prepare-snippet can also be useful for displaying the properties of the picture. These are the width, height and size of the file – they are stored in the sg_properties field as json. It's simple:
+```
+
-
-
С некоторых пор в комплекте имеется сниппет-обертка sgController, который вызывает DocLister с нужными параметрами и не требует отдельного prepare-сниппета:
-
+?>
+```
+For some time now, the sgController snippet wrapper is included, which calls the DocLister with the necessary parameters and does not require a separate prepare-snippet:
+```
[[sgController?
&sgOrderBy=`sg_id DESC`
&thumbSnippet=`phpthumb`
&thumbOptions=`w=150&h=150&zc=1`
&tpl=`@CODE:
-<div class="page-header">
- <h1><a href="[+url+]">[+pagetitle+]</a></h1>
-</div>
+
В sgRowTpl можно использовать все плейсхолдеры, предусмотренные сниппетом sgLister.
-
Если возникают проблемы, то советую первым делом обновить DocLister с гитхаба.
\ No newline at end of file
+```
+In sgRowTpl you can use all the placeholders provided by the sgLister snippet.
+
+If there are problems, I advise you to first update DocLister [from the github](https://github.com/AgexNash).
diff --git a/en/04_Extras/YAMS/01_Installation.md b/en/04_Extras/YAMS/01_Installation.md
new file mode 100644
index 00000000..ba951d3f
--- /dev/null
+++ b/en/04_Extras/YAMS/01_Installation.md
@@ -0,0 +1,145 @@
+Installation
+============
+
+This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+Pre-requisites
+--------------
+
+YAMS was originally developed for Evo v0.9.6.3+ and with PHP 5.2.6-3+. It will not work on servers running PHP 4.
+
+Current version v1.3.0 has been released for compatibility with Evolution CMS v1.4+, v2+ and PHP 7+
+
+YAMS uses ManagerManager to hide redundant document variables and to obtain a tabbed layout in the document view with one tab per language.
+
+Upgrade / Update Instructions
+-----------------------------
+
+To upgrade / update from a previous version do the following:
+
+To upgrade/update from a previous version do the following:
+
+1. Rename your assets/modules/yams directory, to something else. For example
+ assets/modules/yams_old or assets/modules/yams_v1.1.x
+
+2. Copy the new yams directory to assets/modules/yams
+
+3. Copy your yams.config.inc.php file from your old yams directory into your
+ new yams directory.
+
+4. Make sure that your new yams directory and the yams.config.inc.php file (if
+ it exists) are writeable by your server user/group.
+
+5. Make sure that your YAMS plugin is set-up to be active on all the events
+ described in the installation instructions below.
+
+ Caution :
+ - Unchek the event OnBeforeDocFormSave
+ - Check the event OnDocFormSave
+
+6. Check that YAMS always appears first in your plugin execution order for
+ each event that it is active. In particular, if you have phx installed then
+ YAMS should appear before it in the OnParseDocument execution order.
+
+7. Check that everything is working and that your settings are correctly
+ displayed in the YAMS module. If so, you may remove your old yams directory.
+ If there are any problems, then you can simply roll back be renaming your
+ directories to reinstate your previous yams directory.
+
+
+Installation Instructions
+-------------------------
+
+#### Installation via Extras
+
+You can install YAMS via Extras. If you do so please assure, that YAMS is at the first
+place in the execution order of all plugin-events which it is associated to.
+
+#### Manual Installation
+
+1. Copy the yams directory to assets/modules/yams
+
+2. Make sure that the assets/modules/yams directory is writeable by the
+user/group that your server runs under. YAMS maintains a config file called
+config.inc.php in the directory that is automatically updated via the module
+interface.
+
+3. Within MODx under Elements > Manage Elements > Plugins create a new plugin:
+
+**Plugin name :** YAMS
+**Description :** Yet Another Multilingual Solution Plugin
+**Plugin code :**
+
+`require( MODX_BASE_PATH . 'assets/modules/yams/yams.plugin.inc.php');`
+
+**System Events :**
+ - OnLoadWebDocument
+ - OnParseDocument
+ - OnWebPageInit
+ - OnWebPagePrerender
+ - OnLoadWebPageCache
+ - OnPageNotFound
+ - OnDocFormSave
+ - OnMakeDocUrl
+
+Note that YAMS should be moved to first place in the execution order for all events to which it is associated.
+
+4. Within MODx under Elements > Manage Elements > Snippets create a new snippet:
+
+**Snippet name :** YAMS
+
+**Description :** Gets multi-language content.
+
+**Snippet code :** (The following line needs to be placed between the opening and closing php markers)
+
+`require( MODX_BASE_PATH . 'assets/modules/yams/yams.snippet.inc.php' );`
+
+5. Within MODx under Modules>Manage Modules create a new module:
+
+**Module name :** YAMS
+**Description :** Yet Another Multilingual Solution
+**Module code :**
+
+`require_once( MODX_BASE_PATH . 'assets/modules/yams/yams.module.inc.php' );`
+
+6. Reload the page to update the manager view. If you want to use ManagerManager to obtain a tabbed document interface then follow the instructions below (point 5) to set it up.
+
+7. Browse to
+ http://docs.evo.im/en/04_extras/yams.html
+ for help setting up your multilingual site.
+
+
+ManagerManager Setup
+--------------------
+
+To set up ManagerManager so that it provides a tabbed document interface, please carry out the following:
+
+1. Check that the ManagerManager plugin is installed under Elements => Manage Elements => Plugins.
+
+2. Modify the ManagerManager plugin configuration so that it knows to find custom ManagerManager rules in a chunk called "mm\_rules". In newer versions this can be set using the configuration tab. In older versions this is done by including the line
+
+ `$config_chunk` `=` `'mm_rules'``;`
+
+ in the plugin code.
+
+3. Under Elements => Manage Elements => Chunks, create a chunk called "mm\_rules" and add the following line:
+
+ `require($modx->config['base_path'] . 'assets/modules/yams/yams.mm_rules.inc.php');`
+
+If you are already using custom ManagerManager rules, then it is advisable to place the YAMS require line at the end of the rules.
+
+
+PHx Setup
+---------
+
+If you are using the PHx snippet, please take note of the following:
+
+For some reason, a file specified using "include\_once" is re-included and this causes the "PHxParser" class to be redefined, which generates a PHP parse error. This can be avoided by modifying the PHx snippet to wrap the include in some code that will only include the file if the class has not yet been defined:
+
+
+`if( !class_exists('PHxParser') )
+{
+ include_once $modx->config['rb_base_dir'] ."plugins/phx/phx.parser.class.inc.php";
+}`
+
+Also, please remember that the Plugin Execution Order must be edited to place YAMS in first place - that is before PHx - on all associated events.
diff --git "a/en/04_Extras/YAMS/01_\320\236\321\201\320\276\320\261\320\265\320\275\320\275\320\276\321\201\321\202\320\270.md" "b/en/04_Extras/YAMS/01_\320\236\321\201\320\276\320\261\320\265\320\275\320\275\320\276\321\201\321\202\320\270.md"
deleted file mode 100644
index 45a69d2a..00000000
--- "a/en/04_Extras/YAMS/01_\320\236\321\201\320\276\320\261\320\265\320\275\320\275\320\276\321\201\321\202\320\270.md"
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
Yams: Особенности
-Особенности модуля Yams для создания многоязычных сайтов на MODX Evolution.
-
-
YAMS – Yet Another Multilingual Solution – служит для создания многоязычных сайтов на базе Modx CMS.
-
Поиск по сайтам связанным с настройкой и работой с Modx уcпехом не увенчался. Вообще, никакой поиск успехом не увенчался, когда потребовалась информация на русском языке.
-
Пришлось разбираться с английской документацией и методом проб и ошибок делать проект.
-
Полностью переводить документацию не буду, расскажу в общих чертах, как его запустить и заставить работать.
-
Устанавливался YAMS на версию Modx Evolution, которая уже в дистрибутиве имеет предустановленный ManagerManager последней версии, без него YAMS просто не получится использовать.
\ No newline at end of file
diff --git a/en/04_Extras/YAMS/02_Configuration.md b/en/04_Extras/YAMS/02_Configuration.md
new file mode 100644
index 00000000..996d94d2
--- /dev/null
+++ b/en/04_Extras/YAMS/02_Configuration.md
@@ -0,0 +1,268 @@
+Configuration
+=============
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+YAMS Configuration Options
+--------------------------
+
+The following tables document the options available for configuring YAMS.
+
+### 1. Multilingual Aliases
+
+**Name :** Uniqueness of Multilingual Aliases
+
+**Choices / Example :** Not Unique / Unique
+
+**Description :** Whether or not multilingual aliases (if they activated) will be unique. If you are intending to switch on multilingual alias functionality then this parameter should be set beforehand.
+
+Under normal circumstances aliases are considered to be non-unique. In that case YAMS must be able to identify the language of the current page from the server and root names alone. However, by respecting certain rules it is possible for YAMS to be able to identify the language of a page from the alias alone.
+
+In that case it is possible to use the same server and root name for different (or all) languages. If you wish to take advantage of this then here are the conditions that must be adhered to:
+
+* If using friendly alias paths then, for each document, all language variants of all its children must be given given unique aliases.
+
+* If not using friendly alias paths, then all aliases of all language variants of all documents must be made unique.
+
+ If unique multilingual aliases are used, then the default alias will be set to the document variable alias for the default language variant and `_langId_-_documentAlias_` for the other language variants.
+
+ If unique multilingual aliases are not used, then when switching on multilingual alias mode the default values for multilingual aliases will be the document variable alias.
+
+--------
+
+**Name :** Use Multilingual Aliases?
+
+**Choices / Example :** Yes / No
+
+**Description :**
+Whether or not to manage multilingual aliases. (Each language variant of a multilingual document may have its own alias.)
+
+--------
+
+### 2. URL Redirection Settings
+
+**Name :** Redirection Mode
+
+**Choices / Example :**
+* None
+* Default
+* Current
+* Current else Browser
+* Browser
+
+**Description :**
+Controls redirection when a page request is not associated with a valid multilingual URL. Prior to making a page multilingual page it may have been situated at the site root. For example: http://www.example.com/example.html
+
+However, as a multilingual page it may now be located at
+
+`http://(server_name)/(root_name)/example.html`
+
+where the server name and root name are language dependent. The available options are:
+
+* **None**: Don't redirect. Show the content at the given URL using the current language. (This setting is not advised. It means duplicate content, which search engines don't like.)
+
+* **Default**: Redirect to the correct URL for the default language.
+
+* **Current**: Redirect to the correct URL for the current language, whatever that happens to be. (Will be the language of the last multilingual page if they have previously visited one, or the default language.)
+
+* **Current else Browser**: Redirect to the correct URL for the current language, whatever that happens to be. (Will be the language of the last multilingual page if they have previously visited one, else it will be determined from the browser settings, else the default language.)
+
+* **Browser**: Choose the language based on the Accept-Language request header. If a suitable language doesn't exist then use default language. Redirect to the correct URL for the language.
+
+-----
+
+**Name :** Status Code for Redirection to Pages in the Default Language
+
+**Choices / Example :**
+* multiple choices (300)
+* permanent (301)
+* found (302)
+* see other (303)
+* temporary (307)
+
+**Description :** The HTTP status code to use when performing the redirection described above to pages in the default language. Choose temporary if just experimenting with YAMS. Once certain, this can be switched to permanent.
+
+-----
+
+**Name :** Status Code for Redirection to Pages in Non-Default Languages
+
+**Choices / Example :**
+* multiple choices (300)
+* permanent (301)
+* found (302)
+* see other (303)
+* temporary (307)
+
+**Description :** The HTTP status code to use when performing the redirection described above to pages in non-default languages. I suggest See other (303), since "the new URI is not a substitute reference for the originally requested resource.".
+
+-----
+
+**Name :** Status Code for Change of Language
+
+**Choices / Exmaple :**
+* multiple choices (300)
+* permanent (301)
+* found (302)
+* see other (303)
+* temporary (307)
+
+**Description :** The HTTP status code to use when performing a redirection in response to a request for the same page in a different language.
+
+------
+
+**Name :** Evo URLs
+
+**Choices / Example :** a comma separated list of document ids
+
+**Description :** Under normal circumstances YAMS will redirect Evo friendly URLs and URLs of the form index.php?id=... to the multilingual alias version of the URL for SEO friendliness. However, there may be occasions where it is preferable that YAMS accepts the old Evo form of the URL without redirection. This could occur when dealing with non-YAMS aware snippets and plugins.
+
+A comma separated list of document ids for which the standard Evo form of the URL will be accepted without redirection can be specified here. \* can be used to represent all documents.
+
+Note that when using this option language information is lost from the URL and so a language cookie will be used to keep the document in the same language as the last page visited.
+
+### 3. Document Layout Settings
+
+Most of these settings require that ManagerManager is installed and that the YAMS specific rules are configured first.
+
+**Name :** Hide Redundant Fields
+
+**Choices / Example :**
+* Hide Fields
+* Show Fields
+
+**Description :** Whether or not to show or hide a) the document variables on multilingual documents and b) the multilingual alias fields when not using multilingual aliases. Once YAMS is set up it is not necessary to see the standard document variables because multilingual template variables are used instead. _This feature requires the YAMS ManagerManager rules_.
+
+-----
+
+**Name :** Document Layout
+
+**Choices / Example :**
+* Tabify TVs by Lang
+* List TVs
+
+**Description :** his can be used to place the multilingual template variables for each language on a separate tab. _This feature requires the YAMS ManagerManager rules_
+
+-----
+
+**Name :** Autoupdate Manager Document Title
+
+**Choices / Example :**
+* Yes
+* No
+
+**Description :** This automatically updates the document pagetitle field with the content of the default language pagetitle on multilingual documents when a document is saved.
+
+-----
+
+### 4. URL Formatting
+
+**Name :** Use Evo stripAlias
+
+**Choices / Example :**
+* Yes
+* No
+
+**Description :** Whether or not to use call the OnStripAlias event (or to call the stripAlias function on older versions of Evo) on multilingual aliases. The OnStripAlias event is normally pre-configured to convert the aliases to be lower-case, to include latin-characters only and to be dash-separated with no spaces, which used to be more search engine friendly.
+
+However, YAMS will correctly encode multibyte characters in aliases, so if you want to make use of that functionality then the Evo stripAlias functionality can be switched off here.
+
+-----
+
+**Name :** Use Mime-type dependent suffixes?
+
+**Choices / Example :**
+* Yes
+* No
+
+**Description:** Whether or not to use alias suffixes which are dependent on the document mime/content type. If yes, then friendly URL suffix becomes the default should no matching mime-type be found.
+
+The mapping between mime types and suffixes is defined within the yams.config.inc.php file. If necessary, this can be edited manually, but please take care and take a back up first, since an error here could break your YAMS installation
+
+-----
+
+**Name :** Site start filename
+
+**Choices / Example :**
+* Include filename
+* Don't include filename
+
+**description :** Whether or not to include the filename (alias) of the site\_start document in URLs created using the `yams_doc` and `yams_docr` placeholders.
+
+-----
+
+**Name :** Containers as folders
+
+**Choices / Example :**
+* Rewrite as folders
+* Leave as files
+
+**Description :** The final document in an URL is normally considered to be a file and is formatted as _{`prefix}{alias}{suffix}`_. If this option is switched on then documents which are containers will instead be formatted as {`_alias_}/`
+
+-----
+
+**Name :** Confirm Language Param
+
+**Choices / Example :** eg: yams\_lang
+
+**Description :** The name of the GET param that can be used to confirm to YAMS what the language of the current document should be. The mod\_rewrite rules in the htaccess file normally set this automatically to the language group id based on the request URL.
+
+EasyLingual users don't user server name mode or root name mode. Instead this query parameter should be used to specify the document language. The query param should be tagged on to the end of every document URL using a placeholder.
+
+(The `(yams_doc)` and `(yams_docr)` placeholders can be used to create a full URL that is valid across all configurations.) EasyLingual usually employs `lang` as the name this param.
+
+The name of this GET param can be accessed using the `(yams_confirm)` placeholder.
+
+-----
+
+**Name :** Change Language Param
+
+**Choices / Example :** eg: yams\_new\_lang
+
+**Description :** The name of the GET or POST param that should be submitted when the user wants to stay on the same page but change language. This cannot have the same value as the query parameter used to confirm the current language. The value of the POST/GET should be set to the language group id.
+
+The name of this GET/POST param can be accessed using the `(yams_change)` placeholder.
+
+-----
+
+**Name :** Evo Subdirectory
+
+**Choices / Example :**eg: sub1/sub2
+
+If Evo is installed into/configured as active within a subdirectory, eg: http://www.example.com/sub1/sub2/index.php, then this parameter should be set to the subdirectory path: sub1/sub2 with no trailing or leading slash.
+
+_In future versions of YAMS this parameter will probably be removed and determined automatically._
+
+-----
+
+**Name :** URL Conversion Mode
+
+**Choices / Example :**
+* None
+* Default
+* Resolve
+
+**Description :** Controls automatic conversion of standard Evo internal URLs to valid multilingual URLs. For example, a standard Evo internal URL might be expressed as `[(site_url)][~2~]` which might resolve to http://www.example.com/doc-2-alias.html.
+
+Automatic URL conversion would replace this by a YAMS placeholder of the form `(yams_doc:2)` or `(yams_docr:2)`, which will always resolve to an URL that points to the correct language version of the destination document. For example: http://www.example.com/en/doc-2-alias.html
+
+Currently YAMS will only convert URLs that are enclosed in double quotes (as is always the case with (X)HTML) and which are of the form `[~something~]` or `[(site_url)][~something~]` or `[(base_url)][~something~]`. The available options are:
+
+* **None**: Do not do any automatic URL conversion.
+
+* **Default**: Do standard URL conversion. The URL always resolves to the alias of the output document or weblink for the correct language.
+
+* **Resolve**: As default, but for weblinks the URL resolves to the destination URL rather than the weblink alias.
+
+-----
+
+### 5. Easylingual Compatibility
+
+This was originally included to help people using Easylingual try YAMS, but I don't think anyone is actually using (or has ever used!) this. For that reason, I will probably remove this feature from YAMS in a future version. Please contact me via the YAMS forums if you don't want me to do that.
+
+**Name :** Easylingual Compatibility Mode
+
+**Choices / Example :**
+* Yes
+* No
+
+**Description :** Whether or not to activate EasyLingual compatibility mode. In this mode, EasyLingual placeholders are accepted.
diff --git "a/en/04_Extras/YAMS/02_Ditto_\320\270_YAMS.md" "b/en/04_Extras/YAMS/02_Ditto_\320\270_YAMS.md"
deleted file mode 100644
index ece2b9c9..00000000
--- "a/en/04_Extras/YAMS/02_Ditto_\320\270_YAMS.md"
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
Yams: Ditto и YAMS
-Примеры как подружить Ditto с YAMS
-
-
С Ditto обстоит намного сложней, но без него никуда.
Если вызов некэшируемый [!Ditto!], то в параметрах вызова надо указывать id и язык:
-
&id=`(yams_id)` &language=`(yams_mname)`
-
А в шаблоне плейсхолдеры указываются тогда так:
-
[+(yams_id)_pagetitle+].
-
Если вызов кэшируемый [[Ditto]], то автор предлагает поместить в каждый язык по вызову Ditto, также в вызове прописать &id=`id` &language=`имя языка`.
-
И третий способ по пути наименьшего сопротивления, расширение подключать не нужно, в вызове Ditto чанк с шаблоном имеет окончание соответствующее языку:
-
[[Ditto? &tpl=`news_(yams_id)`]]
-
Существует два чанка news_ru, news_en. В зависимости от того, какой язык текущий, параметр (yams_id) подменяется обозначением языка.
-
А в самих чанках:
-
<h1>[+introtext_ru+]</h1><p>[+content_ru+]</p>
-
Это прямой вызов TV-параметров, заменивших встроенные поля.
-
Неудобен этот способ тем, что нужно создавать большое количество чанков, но работает без осечек, с некоторыми сниппетами, например, eForm-ом иначе и не получится.
-
Это общая информация, не вдаваясь в мелкие детали, чтобы собрать мультиязычный сайт её вполне достаточно.
-
Сначала пришлось набить шишек и довольно много с ним помучиться, тем более, что версии постарше не работали так, как нужно, но после нескольких осечек, уже проще разобраться, как работает YAMS и использовать его совершенно не проблематично.
\ No newline at end of file
diff --git a/en/04_Extras/YAMS/03_Language Modes.md b/en/04_Extras/YAMS/03_Language Modes.md
new file mode 100644
index 00000000..639ec6dc
--- /dev/null
+++ b/en/04_Extras/YAMS/03_Language Modes.md
@@ -0,0 +1,82 @@
+Language Modes
+==============
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+YAMS needs to know which language variant of each document to display. It determines this from the URL used to access the document. These modes are not mutually exclusive. Whatever the active modes, the server settings (htaccess) will also need to be configured appropriately for YAMS to function correctly.
+
+YAMS allows aliases with >7bit (multibyte even) characters to be used. YAMS will automatically encode the URLs for HTML output and decode them when it is analysing requests from the server. The encoding procedure for each part of the URL is as follows: First convert to UTF-8 (if necessary) and then rawurlencode.
+
+Unique Multilingual Aliases mode
+--------------------------------
+
+This mode is activated by first setting the multilingual alias type to "Unique" on the "Other Params" tab, and then activating multilingual alases using the parameter beneath it. If multilingual aliases haven"t been previously activated, then this will create multilingual aliases for all the documents which, assuming the existing document aliases are unique, will also be unique.
+
+From this point onwards it is the user"s responsibility for ensuring the uniqueness of the aliases. When friendly alias paths are not being used, all aliases of all language variants of all documents, including monolingual aliases, must be unique. However, if friendly alias paths are being used the restriction is slightly less strict: For any given document all language variants of all its siblings must be unique.
+
+When this mode is activated it is possible for YAMS to determine the required document and language from the alias path alone. Therefore server and root names can be set freely or left completely unset and needn"t be unique.
+
+It is possible to use multilingual aliases with or without enforcing uniqueness and they can also be used in conjunction with server and root name modes discussed below.
+
+### Example URLS
+
+It is possible to access different language variants of the same document via different URLs. Eg:
+
+* http://sitename.com/my-doc-en.html
+* http://sitename.com/mon-doc-fr.html
+
+Server Name and Root Name modes
+-------------------------------
+
+**Server Name** mode and **Root Name** mode can be used simultaneously or independently. The general format of the URL when using these modes is:
+
+`http://(sitename)/(subfolder/)(root_name/)(path/)(filename)`
+
+Where there is only a "subfolder/" if it has been configured on the "Other Params" tab, and there is only a (path/) if friendly alias paths have been configured.
+
+It must always be possible for YAMS to determine the language of a document from the URL. If unique multilingual aliases are not being used, then the "Site URLs" for each language must be unique. The "Site URLs" are displayed on the "Language Settings" tab.
+
+From YAMS 1.1.5 alpha, the monolingual site URL may be the same as one of the multilingual site URLs. If YAMS is configured in such a way that the Site URLs are not unique then YAMS will drop into query param mode and will expect a query parameter to be used to specify the language. (See below.)
+
+Server name mode is switched ON by specifying a server name for each language group and a server name for monolingual/ordinary pages on the "Language Settings" tab. To use server name mode, it is necessary to configure the various server names as aliases or virtual hosts on the server.
+
+If server name mode is off, then the server name is determined in the usual way by Evo and so is consistent with \[(site\_url)\]. It is possible to specify IP addresses and URLs ending in localhost in order to facilitate development on local servers.
+
+To enable root name mode, it is necessary to specify at least one root name on the Language Settings tab. If server name mode is OFF then one root name will need to be specified for each language group.
+
+With any of unique multilingual alias mode, server name mode and root name mode it is possible to change the language of a page by sending a request back to the current page with the id of the new language group specified with a GET or POST variable.
+
+By default this variable is called yams\_new\_lang, but it can be configured otherwise on the "Other Params" tab. A placeholder that accesses this name and snippet calls that generate a list or drop down boxes to enable changing the language are all available. See the YAMS [Placeholders](extras/yams/yams-placeholders) and [Snippet](extras/yams/yams-snippet) documentation.
+
+### Example URLS
+
+Server name mode only. Eg:
+
+* http://en.sitename.com/mydoc.html
+* http://fr.sitename.com/mydoc.html
+
+Root name mode only. Eg:
+
+* http://sitename.com/en/mydoc.html
+* http://sitename.com/fr/mydoc.html
+
+Root name mode only, with one language at root. Eg:
+
+* http://sitename.com/mydoc.html
+* http://sitename.com/fr/mydoc.html
+
+Server name mode, root name mode, friendly alias paths, multilingual aliases and >7bit URLs. Eg:
+
+* http://en.sitename.com/england/folder/mydoc.html
+* http://fr.sitename.com/la-france/répertoire/mon-doc.html
+
+Query Param mode
+----------------
+
+**Query Param** mode is provided primarily for compatibility with EasyLingual and cannot be used in conjunction with the other modes. To access this mode unique multilingual aliases must not be active, no root names must be specified and the server name must be unspecified or identical for all language groups and for monolingual pages.
+
+So, to distinguish one language from another a query parameter is appended to all URLs:
+
+`http://sitename.com/(subfolder/)(path/)filename?yams_lang=id`
+
+By default this query param is called yams\_lang. However, it is configurable on the "Other Options" tab. It should be changed to lang if compatibility with EasyLingual is required.
diff --git "a/en/04_Extras/YAMS/03_Wayfinder-\320\270-YAMS.md" "b/en/04_Extras/YAMS/03_Wayfinder-\320\270-YAMS.md"
deleted file mode 100644
index c49b59a7..00000000
--- "a/en/04_Extras/YAMS/03_Wayfinder-\320\270-YAMS.md"
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
Yams: Wayfinder и YAMS
-Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS.
-
-
\ No newline at end of file
diff --git a/en/04_Extras/YAMS/04_Language Settings.md b/en/04_Extras/YAMS/04_Language Settings.md
new file mode 100644
index 00000000..b05e6355
--- /dev/null
+++ b/en/04_Extras/YAMS/04_Language Settings.md
@@ -0,0 +1,144 @@
+Language Settings
+=================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+The following is a list of the parameters that can be configured for each language. These parameters are used to define the format of the URLs used for each language, to control access to the each language depending on user roles, and to provide language specific information that can be accessed within content using [YAMS Placeholders](extras/yams/yams-placeholders).
+
+### 1. Monolingual Settings
+
+**Name :** Server Name
+
+**Description :** The server name to use for non-multilingual pages. Leave the field blank to accept the default server name, in which case the current server name will be shown in brackets.
+
+**Corresponding Placeholders :** `(yams_server)`
+
+**Example :** www.example.com
+
+-----
+
+**Name :** Site URL
+
+**Description :** The site URL for monolingual pages. This is output for your information and cannot be modified directly. It can by the same as one or more of the multilingual site URLs
+
+**Corresponding Placeholders :** `(yams_site)`
+
+**Example :** http://www.example.com/
+
+-----
+
+### 2. Multilingual Settings
+
+
+**Name :** Lang ID
+
+**Description :** Used by YAMS to identify the language group. Alphanumeric characters, no spaces. The language code is typically used.
+
+**Corresponding Placeholders :** `(yams_id)`
+
+**Example :** en
+
+-----
+
+**Name :** Tags
+
+**Description :** A comma separated list of language tags, in priority order, to be associated with this language group. eg: en-us,en-gb
+
+**Corresponding Placeholders :** `(yams_tag)`
+
+**Example :** en
+
+-----
+
+**Name :** Server Name
+
+**Description :** The server/host name associated with the language group. Leave this field blank to accept the default server name, in which case the current server name will be shown in brackets.
+
+**Corresponding Placeholders :** `(yams_server)`
+
+**Example :** en.example.com
+
+-----
+
+**Name :** Root Name
+
+**Description :** A root folder name to be used with the language group. Can be left blank. Leave them all blank if language groups do not need to be distinguished by root folder name.
+
+**Corresponding Placeholders :** `(yams_root)
+(yams_/root)
+(yams_root/)`
+
+**Example :** en
+
+-----
+
+**Name :** Site URL
+
+**Description :** The site URL for the language group. This is output for your information and cannot be modified directly. It is formed from the server name and root name. Each language must have a unique site URL.
+
+**Corresponding Placeholders :** `(yams_site)`
+
+**Example :** http://en.mysite.com/en/
+
+-----
+
+**Name :** Language Direction
+
+**Description :** The language direction.
+
+**Corresponding Placeholders :** `(yams_dir)
+(yams_align)`
+
+**Example :** `ltr` or `rtl`
+
+-----
+
+**Name :** Roles
+
+**Description :** A comma separated list of ids of manager roles that have permission to edit the language via the document interface. If a role id is prefixed by an exclamation mark (!) then all roles except the specified role have access. If no roles are specified then all roles have access. The YAMS ManagerManager rules are required for this to function.
+
+**Corresponding Placeholders :** None
+
+**Example :** 1,2
+
+-----
+
+**Name :** Evo Language Name
+
+**Description :** The corresponding Evo manager language. For use with snippets like ditto and eForm which accept a language parameter.
+
+**Corresponding Placeholders :** `(yams_mname)`
+
+**Example :** english
+
+-----
+
+**Name :** Select Language Text
+
+**Description :** Text, written in the current language, to be used when presenting the user with a choice of languages.
+
+**Corresponding Placeholders :** `(yams_choose)`
+
+**Example :** Choisir une langue
+
+-----
+
+**Name :** Name for `_langId_`
+
+**Description :** The name to use for the language group `_langId_` written in each language.
+
+**Corresponding Placeholders :** `(yams_name)
+(yams_name_in__langId_)`
+
+**Example :** anglais
+
+-----
+
+**Name :** Name for new
+
+**Description :** Used when adding a new language. The name to use for the new language group in its own language
+
+**Corresponding Placeholders :** `(yams_name)
+(yams_name_in__langId_)`
+
+**Example :** Deutsch
diff --git "a/en/04_Extras/YAMS/04_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 \320\234anager\320\234anager.md" "b/en/04_Extras/YAMS/04_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 \320\234anager\320\234anager.md"
deleted file mode 100644
index ca3a54ee..00000000
--- "a/en/04_Extras/YAMS/04_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 \320\234anager\320\234anager.md"
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
Yams: Настройка ManagerManager
-Настройка ManagerManager для модуля Yams для создания многоязычных сайтов на MODX Evolution.
-
-
Независимо от того, что используется, в файле с правилами или чанке с правилами в конце надо прописать:
В «Инструментах» > «Конфигурации» включить Дружественные URL, разрешить вложенные URL, также использовать в связке с предыдущим параметром повторяющиеся псевдонимы, тогда путь до документа в адресной строке будет выглядеть:
-
site.com/en/catalogue/home-video
-
site.com/ru/catalogue/home-video
-
Настройка:
-
Во вкладке «Модули» > «YAMS» лежат все настройки.
-
Настройка языков:
-
-
Собственно, исчерпывающая страница, на которой показаны языки и как их добавлять. Теги, названия для отображения в самом же языке, в других языка, выбор письма справа налево или наоборот, теги (нужны для вызовов сниппета YAMS, обозначение, группы), системное название языка, имя сервера система подставляет автоматически. Set Default – поставить язык по умолчанию, чтобы с него открывался сайт.
-
Дальше идёт настройка сервера, после того, как созданы все необходимые языки, YAMS создаёт правила, которые надо вписать в .htaccess, чтобы правильно работали пути и редиректы.
-
Это находится на следующей вкладке:
-
-
Всё содержимое из этой вкладки просто скопировать в .htaccess
-
Другие настройки:
-
-
Эта вкладка содержит множество настроек будущего сайта. Такие, как типы редиректов, находится ли сайт в поддиректории или в корневой папке, разбивать ли языки при редактировании документов на табы, либо пускать списком на одной странице. По умолчанию сейчас стоит разбивка на табы, это и удобней, редиректы выставлены тоже по умолчанию нормально.
-
Последняя вкладка: Multilingual Templates
-
Нужна для того, чтобы YAMS перекраивал панель редактирования под многоязычный сайт.
-
YAMS заменяет стандартные поля Pagetitle, Longtitle, Content итд TV-параметрами с окончанием _ru, _en итд, то бишь, чтобы Pagetitle страницы был привязан именно к языку и полное название TV-параметра тогда выглядит pagetitle_ru.
-
Как только создаётся новый шаблон, во вкладке Multilingual Templates надо ему присвоить статус многоязычного.
-
Также можно создавать новые TV-параметры с нужным окончанием, они автоматически будут переноситься в соответствующий таб языков.
-
Не рекомендуется, даже больше, нельзя убирать поле Internal Name, оно нужно для отображения названия документа в дереве слева.
-
Создание шаблона:
-
Стандартный шаблон без дополнительных вызовов других сниппетов. YAMS автоматически определяет такие поля, как [*pagetitle*], [*longtitle*], [*content*]. То есть, достаточно вставить их в шаблон, сделать во вкладке Multilingual Templates шаблон многоязычным и при редактировании документа заполнить эти поля для каждого языка, при переключении языков на сайте, они будут меняться.
-
Механизм переключения языков:
-
Создаётся, например, чанк Languages, ставится в нужном месте в шаблоне и в чанк записывается:
(yams_docr) – ссылка, сгенерированная до текущей страницы в этом или остальных языках
-
(yams_name) – имя языка, вписанное в табе Модули > Yams > Language Settings
-
¤ttpl – шаблон выбранного языка. Тоже самое, только можно добавить class="selected", ну, или что по вкусу, чтобы язык был виден, как текущий.
-
Точно таким же образом можно подставить и флажки вместо текста.
\ No newline at end of file
diff --git a/en/04_Extras/YAMS/05_Placeholders.md b/en/04_Extras/YAMS/05_Placeholders.md
new file mode 100644
index 00000000..8e34bba7
--- /dev/null
+++ b/en/04_Extras/YAMS/05_Placeholders.md
@@ -0,0 +1,201 @@
+Placeholders
+============
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+Two forms of each placeholder are available. In the first form, `(yams_???)`, the placeholders provide information about the current document. In the second form, `(yams_???:_docId_)`, they provide information about the document with the given document identifier, `_docId_`.
+
+It should be possible to use snippet calls and chunks to specify the document identifier. `(yams_doc:[+id+])` can be used within templates.
+
+It should be possible to use YAMS placeholders almost anywhere, including in chunks, in the names and output of template variables, and in the names, output and parameters of snippet calls.
+
+When the output of a YAMS placeholder is language dependent it needs to know what the current language is. The current language is dependent upon the context. The `(yams-in)` or `(yams-repeat)` blocks allow the inclusion of alternate language content on a page. (See the Constructs tab).
+
+If a placeholder falls within either of these blocks, then the current language is that specified by those blocks. Otherwise the current language is taken to be the language in which the current page is being displayed. There may be occasions when it is necessary to override this behaviour and force the placeholder to treat the current document language as the current language.
+
+This can be achieved by appending a + symbol to the end of the name of the placeholder. For example, the following will generate a `(yams-repeat)` block that will display a list of the names of the available languages, all written in the current document language:
+
+
[[YAMS? &get=`repeat` &repeattpl=`@CODE:
(yams_name_in_(yams_id+))
]]
+
+YAMS placeholders
+-----------------
+
+**Placeholder :** `(yams_id)` / `(yams_id:_docId_)`
+
+**Monolingual Document :** The default language id
+
+**Multilingual Document :** The current language id
+
+-----
+
+**Placeholder :** `(yams_defaultid)` / `(yams_defaultid:_docId_)`
+
+**Monolingual Document :** The default language id
+
+**Multilingual Document :** The default language id
+
+-----
+
+**Placeholder :** `(yams_tag)` / `(yams_tag:_docId_)`**
+
+**Monolingual Document :** The primary language tag for the default language
+
+**Multilingual Document :** The primary language tag for the current language
+
+-----
+
+**Placeholder :** `(yams_root)` / `(yams_root:_docId_)`
+
+**Monolingual Document :** Nothing
+
+**Multilingual Document :** If specified and non-empty, the server root name for the current language, else nothing
+
+-----
+
+**Placeholder :** `(yams_/root)` / `(yams_/root:_docId_)`
+
+**Monolingual Document :** Nothing
+
+**Multilingual Document :** If specified and non-empty, the server root name for the current language preceded by a /, else nothing
+
+-----
+
+**Placeholder :** `(yams_root/)` / `(yams_root/:_docId_)`
+
+**Monolingual Document :** Nothing
+
+**Multilingual Document :** If specified and non-empty, the server root name for the current language followed by a /, else nothing
+
+-----
+
+**Placeholder :** `(yams_site)` / `(yams_site:_docId_)`
+
+**Monolingual Document :** If server name mode is ON, an URL created using the specified monolingual server name. If server name mode is OFF, the same output as \[(site\_url)\].
+
+**Multilingual Document :** The full multilingual site url including server name and server root as required for the current page.
+
+-----
+
+**Placeholder :** `(yams_server)` / `(yams_server:_docId_)`
+
+**Monolingual Document :** Same as for yams\_site.
+
+**Multilingual Document :** Same as for yams\_site, but with no root name.
+
+-----
+
+**Placeholder :** `(yams_doc)` / `(yams_doc:_docId_)`
+
+**Monolingual Document :** A complete URL for the document or weblink. There is an option on the "Other Params" tab that will suppress the filename for the site start document.
+
+**Multilingual Document :** A complete URL for the current language version of the document or weblink. There is an option on the 'Other Params' tab that will suppress the filename for the site start document.
+
+-----
+
+**Placeholder :** `(yams_docr)` / `(yams_docr:_docId_)`
+
+**Monolingual Document :** Same as for yams\_doc, but weblinks are resolved.
+
+**Multilingual Document :** Same as for yams\_doc, but weblinks are resolved.
+
+-----
+
+`(yams_dir)` / `(yams_dir:_docId_)`
+
+**Monolingual Document :** The language direction ('ltr' or 'rtl') for the default language
+
+**Multilingual Document :** The language direction ('ltr' or 'rtl') for the current language
+
+-----
+
+**Placeholder :** `(yams_align)` / `(yams_align:_docId_)`
+
+**Monolingual Document :** The text alignment ('left' or 'right') for the default language
+
+**Multilingual Document :** The text alignment ('left' or 'right') for the current language
+
+-----
+
+**Placeholder :** `(yams_mname)` / `(yams_mname:_docId_)`
+
+**Monolingual Document :** The Evo language name for the default language
+
+**Multilingual Document :** The Evo language name for the current language
+
+-----
+
+**Placeholder :** `(yams_confirm)` / `(yams_confirm:_docId_)`
+
+**Monolingual Document :** The name of the Confirm Language param. (See the Other Params tab.)
+
+**Multilingual Document :** The name of the Confirm Language param. (See the Other Params tab.)
+
+-----
+
+**Placeholder :** `(yams_change)` / `(yams_change:_docId_)`
+
+**Monolingual Document :** The name of the Change Language param. (See the Other Params tab.)
+
+**Multilingual Document :** The name of the Change Language param. (See the Other Params tab.)
+
+-----
+
+**Placeholder :** `(yams_name)` / `(yams_name:_docId_)`
+
+**Monolingual Document :** The name of the default language in the default language
+
+**Multilingual Document :** The name of the current language in the current language
+
+-----
+
+**Placeholder :** `(yams_name_in__langId_)` / `(yams_name_in__langId_:_docId_)`
+
+**Monolingual Document :** The name of the default language, written in the language specified by the `_langId_` language group id.
+
+**Multilingual Document :** The name of the current language, written in the language specified by the `_langId_` language group id.
+
+-----
+
+**Placeholder :** `(yams_choose)` / `(yams_choose:_docId_)`
+
+**Monolingual Document :** The Select Language Text, written in the default language. (See the Language Settings tab.)
+
+**Multilingual Document :** The Select Language Text, written in the current language. (See the Language Settings tab.)
+
+-----
+
+**Placeholder :** `((yams_data:_docId_:_fieldname_))` / `((yams_data:_docId_:_fieldname_:_phx_))`
+
+**Monolingual Document :** This special inline placeholder is different from all the others. It is used by YAMS for efficiently grabbing template variables from documents. Here, `_docId_` is the id of the document to grab the template variable from and `_fieldname_` is the name of the template variable from which to get the data. _In future, this syntax will allow phx to be used, but this is not currently supported._
+
+YAMS will search out all these placeholders in the document, work out what information needs to be grabbed from the database and grab in large chunks so as to minimise the number of database queries required.
+
+The ``[[YAMS? &get=`data` `` snippet call (same as the legacy ``[[YAMS? &get=`content` `` snippet call) which is used in the Wayfinder templates and internally by the YAMS Ditto extension will now output such placeholders meaning improved performance for large Ditto and Wayfinder calls.
+
+_As of YAMS 1.2 this will work with document variables as well as template variables._
+
+**Multilingual Document :** Same as for monolingual documents
+
+-----
+
+**Placeholder :** `(yams_multi)` / `(yams_multi:_docId_)`
+
+**Monolingual Document :** Outputs `0`. _This parameter is due to appear in YAMS 1.2_, and can be used in combination with PHx, for example, to exclude or include content based on type.
+
+**Multilingual Document :** Outputs `1`. _This parameter is due to appear in YAMS 1.2_, and can be used in combination with PHx, for example, to exclude or include content based on type.
+
+-----
+
+**Placeholder :** `(yams_mono)` / `(yams_mono:_docId_)`
+
+**Monolingual Document :** Outputs `1`. _This parameter is due to appear in YAMS 1.2_, and can be used in combination with PHx, for example, to exclude or include content based on type.
+
+**Multilingual Document :** Outputs `0`. _This parameter is due to appear in YAMS 1.2_, and can be used in combination with PHx, for example, to exclude or include content based on type.
+
+-----
+
+**Placeholder :** `(yams_type)` / `(yams_type:_docId_)`
+
+**Monolingual Document :** Outputs `mono`. _This parameter is due to appear in YAMS 1.2_, and can be used in combination with PHx, for example, to exclude or include content based on type.
+
+**Multilingual Document :** Outputs `multi`. _This parameter is due to appear in YAMS 1.2_, and can be used in combination with PHx, for example, to exclude or include content based on type.
diff --git "a/en/04_Extras/YAMS/05_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/en/04_Extras/YAMS/05_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md"
deleted file mode 100644
index 9638118b..00000000
--- "a/en/04_Extras/YAMS/05_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md"
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
Yams: Установка
-Установка модуля Yams для создания многоязычных сайтов на MODX Evolution.
-
-
Надо скачать архив последней версии. Там что-то непонятное с версиями. Последняя версия почему-то не лежит на странице для скачки, а в списке Previous Releases, потому прямая ссылка на версию 1.1.7-alpha RC7, она пока последняя.
-
Распаковать архив и залить в папку assets/modules/yams, выставить права на папку yams 775.
После перезагрузить страницу, чтобы модуль заработал.
\ No newline at end of file
diff --git a/en/04_Extras/YAMS/06_Setup (step by step).md b/en/04_Extras/YAMS/06_Setup (step by step).md
new file mode 100644
index 00000000..231ae434
--- /dev/null
+++ b/en/04_Extras/YAMS/06_Setup (step by step).md
@@ -0,0 +1,174 @@
+Setup (step by step)
+=====
+
+This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+Setting up YAMS.
+----------------
+
+These instructions explain how to set up a new site or convert an existing site to be multilingual in a way that will cause the least disruption. In theory it is possible to convert a site to a multilingual one without having to take it offline except while reloading the server config. If everything goes smoothly, then at no point should the website be broken during the setup process.
+
+These instructions are for people who are starting from scratch and want to develop a multilingual site, or those or have a monolingual site and would like to add additional languages.
+
+Starting from scratch or from a mono-lingual site
+-------------------------------------------------
+
+It will be assumed that the YAMS module, plugin and snippet are already installed according to [the instructions](extras/yams/yams-installation). Installing the ManagerManager plugin and configuring it to use the YAMS rules is highly recommended, since YAMS can use it to organise the multiple language fields into separate tabs and to hide redundant document variable fields on the document view.
+
+YAMS has been designed to work with friendly URLs or friendly alias paths.
+
+The default YAMS install does nothing. Multilingual functionality has to be configured manually by specifying document templates as multilingual.
+
+Step by Step YAMS Setup
+-----------------------
+
+### 1. Backup
+
+It"s always wise to take a backup before modifying a site.
+
+### 2. Decide on URL format
+
+Before starting to configure YAMS it is necessary to decide how the language of the documents will be identified from the URL. YAMS will operate in different modes, depending on how the URLs are configured: **Server Name** mode, **Root Name** mode, **Unique Multilingual Aliases** mode and **Query Param** mode. These modes are described in detail on the [modes page](extras/yams/yams-language-modes). Examples of how different language versions of a single document could be configured are given below:
+
+### Using Unique Multilingual Aliases**
+
+* Each language variant is referred to with a different name.
+* Every language variant of every document has a unique name.
+* Can be used with or without friendly alias paths.
+* Document language determined from the document alias.
+
+**Example:**
+
+* http://sitename/home.html
+* http://sitename/accueil.html
+
+### Using Server Name and Root Name modes
+
+* Can be used with or without unique or non-unique multilingual aliases.
+* Can be used with or without friendly alias paths.
+
+**Example:**
+
+* Server name mode only. Eg:
+ * http://en.sitename.com/mydoc.html
+ * http://fr.sitename.com/mydoc.html
+* Root name mode only. Eg:
+ * http://sitename.com/en/mydoc.html
+ * http://sitename.com/fr/mydoc.html
+* Root name mode only, with one language at root. Eg:
+ * http://sitename.com/mydoc.html
+ * http://sitename.com/fr/mydoc.html
+* Server name mode, root name mode, friendly alias paths, multilingual aliases and >7bit URLs. Eg:
+ * http://en.sitename.com/england/folder/mydoc.html
+ * http://fr.sitename.com/la-france/répertoire/mon-doc.html
+
+### Using Query Param mode
+
+* This is the fallback if it is not possible to determine the language of the doc any other way.
+* Can be used with or without friendly aliases and friendly alias paths.
+* The name of the query parameter is customisable.
+
+**Example:**
+
+* http://sitename.com/mydoc.html?yams\_lang=en
+* http://sitename.com/mydoc.html?yams\_lang=fr
+
+### 3. Configure Language Settings
+
+The second step is to configure the language settings for each language group that will be used on multilingual documents. This is done on the "Language Settings" tab of the module interface.
+
+Each language group has an id. This is used, for example, in the multilingual versions of the template variables for that language. Eg: `description__id_`, where `_id_` = `en`, `fr` or `de`
+
+A language group can be set up to represent a group of languages (en), a specific localised language (en-gb) or a selection of localised languages (en,en-gb,en-us,...) by specifying a comma separated list of language tags.
+
+In addition to the language group id and URL settings for each language group, it is possible to specify a language direction, text associated with each language and a Evo language name.
+
+One language group must be chosen as the default language group. This language will be assumed for monolingual documents.
+
+### 4. Update Friendly URLs config
+
+Next the server needs to be configured to handle the chosen language configuration. This can be done by copying the generated code from the "Server Config" tab into the .htaccess file. It may be necessary to restart/reload the server.
+
+The server config file will have to be updated any time a language group is activated or deactivated, its server or root name is changed, or the query parameter is renamed.
+
+At this stage the website should still be functioning normally. By default all pages are considered monolingual (or non-multilingual), so no change in the website will be observed at this stage.
+
+### 5. Check URLs
+
+YAMS will automatically recognise and convert Evo style internal URLs that are surrounded by quotes to multilingual URLs that point to the correct language variant. The URL formats recognised and automatically handled by YAMS are: "`[(site_url)][~_something_~]`" or "`[(base_url)][~_something_~]`" and "`[~_something_~]`".
+
+The multilingual URLs generated by the YAMS always consist of the complete URL, including server name and full path. As a result they are not affected by the base href setting. The URLs are also configurable using the controls on the "Other Params" tab. For example, it is possible to request that weblink URLs always resolve to their destination URL, or to request that the filename of the site start document of the default language is not output.
+
+URLs of physical resources like images, style and javascript files are not affected by YAMS. Relative URLs to such resources can be affected by the base href setting however, especially when using server name mode. The recommended method is to use the `(yams_server)` placeholder as follows:
+
+
+
+For any internal URLs that are not automatically handled by Evo the recommended method of generating the correct multilingual URL is to use the following YAMS placeholders:
+
+`(yams_doc:_docId_)` or `(yams_docr:_docId_)` within document templates and content; and:
+
+`(yams_doc:[+_docId_+])` or `(yams_docr:[+_docId_+])` within snippet templates.
+
+See the YAMS placeholders tab for full details.
+
+### 6. Update Language Tags and Direction
+
+The next step is to add language and language direction attributes to the opening html tag using YAMS placeholders: `lang="(yams_tag)"` and/or `xml:lang="(yams_tag)"` and `dir="(yams_dir)"`
+
+### 7. Update Snippets
+
+Any snippets which output URLs or directly contain multilingual text that is not embedded in multilingual placeholders will need to be updated. Guidance on how to do this for Wayfinder, Ditto, eForm, jot and other snippets is on the "How To?" tab.
+
+Note that the `(yams_mname)` placeholder can be used to pass the correct manager language to snippet calls. For example, with ditto and eForm snippet calls ``&language=`(yams_mname)` `` can be used.
+
+### 8. Redirection Strategy
+
+It is now possible to specify certain templates as multilingual. When this is done all documents associated with those templates will be given multiple language versions as defined on the "Language Settings" tab, the content for which is controllable via additional language specific template variables. In addition, the URLs of the associated documents will change dependent on the language. YAMS will automatically redirect from the old/monolingual URLs to the correct language variant. Several redirection modes are available and these are controllable via the "URL Redirection Settings" section of the "Other Params" tab.
+
+Initially, before the content has been translated, the redirection mode called "default" can be used. This redirects to a valid page in the default language. Only once content has been written for the other languages the mode can be switched to, for example, "Current else Browser" mode. This will keep the page in the current language, if one has already been set (by a previous visit to a page for example), else it will choose an appropriate language based on the user"s browser settings.
+
+It is also possible to control the HTTP status codes that are sent when the redirection occurs. For existing sites the status code for redirection from the existing pages to the new default language pages can be left as "Temporary" (307) until a site is ready, at which point the status code should be switched to "Permanent" (301). That way search engines will know to correctly re-index existing pages.
+
+The status code to use when redirecting to pages that are in anything other than the default language can be left as "See Other" (303), which will indicate to search engines that the new but not the old page should be cached/indexed.
+
+### 9. ManagerManager Interface
+
+Now is the time to install ManagerManager if it hasn"t been done already. This is highly recommended. Please follow [the instructions on the Installation page](extras/yams/yams-installation).
+
+Once ManagerManager is installed it is possible to control how the fields of multilingual documents are organised when a document is edited. This is done by modifying settings on the "Document Layout Settings" section of the "Other Params" tab.
+
+When a document is converted to be a multilingual document the existing document variables, including the pagetitle, retain their existing values. However, all but the pagetitle become redundant. A setting exists that allows the redundant template variables to be hidden.
+
+With YAMS, the document pagetitle takes on the role of a text identifier for the document and all its language variants within the Evo back-end. This identifier is visible in the Evo document tree, but not on any web output.
+
+For convenience, YAMS provides an option to automatically update this document pagetitle with the contents of the default language multilingual pagetitle template variable on document save.
+
+### 10. Multilingual Templates
+
+It is finally possible to configure certain templates as multilingual. This is done from the "Multilingual Templates" tab.
+
+All that needs to be done is to select yes for those templates that should be multilingual. YAMS will create multilingual template variables for those templates as required. It is possible to experiment first, by first creating a new template, then selecting it as multilingual, then associating it with a new document and then populating it with some default content.
+
+Multiple versions of each template variable for each language will be created automatically. These will be associated with the multilingual templates and default document content will be copied over into the newly created default language template variables.
+
+### 11. Translate
+
+Multiple language versions of the documents can now be viewed by browsing to the appropriate URL. However, initially all but the default language version has content written for it.
+
+Now when a multilingual document is edited there will be one tab per language and the content can be translated. Note that the site will continue to look normal and there wont be any links pointing to the new language versions until the next step.
+
+### 12. Publicise
+
+Once the content is translated it is possible to start publicising it. The snippet calls:
+
+ [[YAMS? &get=`list`]]
+
+**or**
+
+ [[YAMS? &get=`selectform`]]
+
+can be used to include a list based or form based language selection tool into multilingual templates. These commands can now be modified using custom templates. See [the YAMS Snippet page](extras/yams/yams-snippet) for full details.
+
+### 13. All Done
+
+The site is now up and running as a multilingual site. The redirection mode and http status codes can be updated. Make sure that any search engine site maps contain a list of all documents, and not just those of a single language. See the "How To?" tab for more details about how to achieve this.
diff --git a/en/04_Extras/YAMS/07_Snippet use.md b/en/04_Extras/YAMS/07_Snippet use.md
new file mode 100644
index 00000000..b81e7e81
--- /dev/null
+++ b/en/04_Extras/YAMS/07_Snippet use.md
@@ -0,0 +1,139 @@
+Snippet use
+=======
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+YAMS Snippet Call
+-----------------
+
+The YAMS snippet call is used for obtaining and outputting multilingual content stored in document variables, template variables, chunks, snippets or whatever in the correct language. It is also used for repeating content in multiple languages based on templates.
+
+By selecting the list, select or selectform options the same approach is used together with a default (but overridable) set of templates to create a hyperlinked list of language versions or a drop down select box of languages to enable switching the current language.
+
+The YAMS snippet is in fact a macro for creating special hidden language constructs that are embedded in the document template and removed before the document is served. See the YAMS [Technical Details](extras/yams/yams-technical-details) page. These allow all possible language versions of the content to be embedded in a single document.
+
+The blocks are reorganised and optimised as much as possible before a document is cached. This helps to ensure that as little parsing as possible is required to select the correct language content once it has been retrieved from the cache.
+
+Note that language selection occurs after a document is retrieved from the cache, so it is not possible to end up caching the wrong language content. **It is important that the YAMS snippet is run as a cacheable at all times, since this will allow pre-cache optimisation to be undertaken.**
+
+See the [How To](extras/yams/yams-how-to/) ? page tab for examples of its use.
+
+YAMS Snippet Parameters
+-----------------------
+
+#### 1. Parameter : &get
+
+**Values :**
+* chunk
+* csnippet
+* usnippet
+* tv
+* placeholder
+
+**Description :** These parameters choose from multiple language versions of a `chunk`, \[\[cacheable snippet\]\], \[!uncacheable snippet!\], \[\*template variable\*\] or \[+placeholder+\] and display the correct one depending on the current language.
+
+Use the `&from` parameter to specify the names of the resources to choose from. The multiple language versions are assumed to have the name basename\_langId where langId is the language group id unless otherwise specified.
+
+-----
+
+**Values :** text
+
+**Description :** In this case, the `&from parameter` will accept plain text in multiple languages rather than the name of a resource. Example:
+
+ [!YAMS? &get=`text` &from=`de::german stuff||en::english stuff`!]
+
+-----
+
+**Values :** data
+
+**Description :** This parameter is used to extract multilingual content from the document or template variables of specific documents. In this case, the &from parameter specifies the the names of the document or template variables from which the content will be extracted and `&docidspecifies` the document identifier.
+
+This is primarily for use in the templates of snippets which don't understand multilingual variables. See the YAMS "How To" for more information. **This parameter used to be called content**. The content syntax still works, but is depracated and may be removed in a future version. So, please switch to using data.\*
+
+-----
+
+**Values :** repeat
+
+**Description :** Repeats multiple language versions of content on a page. This option works using the templates specified by the "&beforetpl", "&repeattpl", "¤ttpl" and "&aftertpl" parameters.
+
+If a "¤ttpl" template is specified, then it is used in place of "&repeattpl" for the current document language. Otherwise, the "&repeattpl" template is repeated for all languages.
+
+-----
+
+**Values :** list
+
+**Description :** This functions in the same way as ``&get=`repeat` `` except that by default it uses the templates in "assets/modules/yams/tpl/yams/list/" to create a list of hyperlinks to the different language versions of the page.
+
+These default templates can be overridden using the "&beforetpl", "&repeattpl", "¤ttpl" and "&aftertpl" parameters.
+
+-----
+
+**Values :** selectform
+
+**Description :** This functions in the same way as ``&get=`repeat` `` except that by default it uses the templates in "assets/modules/yams/tpl/yams/selectform/" to create a select box and form allowing users to change language.
+
+These default templates can be overridden using the "&beforetpl", "&repeattpl", "¤ttpl" and "&aftertpl" parameters.
+
+-----
+
+**Values :** select
+
+**Description :** This functions in the same way as ``&get=`selectform` `` except that it only outputs the select box, not the form.
+
+### 2. Parameter : &from
+
+**Values :** resource\_name
+
+**Description :** This parameter enables the names of the chunks/snippets etc. in which the information lies to be specified. It has two forms: In the first, simpler form, the basename of a resource, say, resource\_name is specified.
+
+On multilingual pages this will be replaced by a construct that includes one language variant for each active language group.
+
+The language variants are assumed to have the name resource\_name\_id, where id is the language group id. These language variants are subject to normal Evo caching. When a request is made for the document in a given language, all incorrect language variants are stripped out, allowing the user to see only the correct language content.
+
+ id1::resource_name1||id2::resource_name1||...
+
+In the second, more complex form, the languages group ids and full resource names for each language are specified. Here _id1_, _id2_, …, are the language group ids, and _resource\_name1_, … are the full corresponding resource names.
+
+When using ``&get=`text` ``, the resource name can be replaced by text to be output instead, but this text cannot itself contain a double pipe ||.
+
+### 3. Parameter : &docid
+
+**Values :** A document identifier
+
+**Description :** The document identifier of the document from which to obtain the data. This is for use with the ``&get=`data` `` parameter.
+
+### 4. Parameter : &beforetpl
+
+**Values :**
+_a chunk name_
+@CODE:template code
+@FILE:path to template file
+
+**Description :** Specifies a template to be placed before a repeat block.
+
+### 5. &repeattpl
+
+**Values :**
+_a chunk name_
+@CODE:template code
+@FILE:path to template file
+
+**Description :** Specifies a template to be repeated once for each active language. Can be overridden by the "¤ttpl" param.
+
+### 6. Parameter : &ttpl
+
+**Values :**
+_a chunk name_
+@CODE:template code
+@FILE:path to template file
+
+**Description :** Specifies a template to be used if it is in the same language as the current document. Overrides by the "&repeattpl".
+
+### 7. Parameter : &aftertpl
+
+**Values :**
+_a chunk name_
+@CODE:template code
+@FILE:path to template file
+
+**Description :** Specifies a template to be placed after a repeat block.
diff --git a/en/04_Extras/YAMS/08_Technical details.md b/en/04_Extras/YAMS/08_Technical details.md
new file mode 100644
index 00000000..2ffa96c4
--- /dev/null
+++ b/en/04_Extras/YAMS/08_Technical details.md
@@ -0,0 +1,136 @@
+Technical Details
+=================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+> **Warning**: This is an unfinished first draft…
+
+* [YAMS Constructs](extras/yams/yams-technical-details#YAMSConstructs)
+* [YAMS Parser](extras/yams/yams-technical-details#YAMSParser)
+ * [Pre-Parse](extras/yams/yams-technical-details#PreParse)
+ * Post-Parse
+
+YAMS works by embedding the various language versions of each bit of multilingual content in the document using various YAMS Constructs:
+
+* The YAMS snippet call generates such constructs.
+* Standard document variables are replaced by constructs containing the multilingual tv language variants.
+* Most \[YAMS placeholders\] are expanded out into YAMS constructs.
+
+Unless something goes wrong (like PHx truncating some content which breaks an embedded construct for example), these constructs are completely hidden to the user.
+
+Once all multilingual content has been expanded out into constructs, the end result is a single document containing all language information in a complete nested mess. It is the job of the YAMS parser to evaluate and reorder this nested mess into one single construct, containing one version of the document for each language.
+
+It will do as much of this reorganisation as possible before the document is cached, so as to minimise the performance hit from this. Up until the point that the caching occurs all language variants are retained. After that all language variants apart from the requested language are thrown away.
+
+If the document contains uncacheable snippet calls containing YAMS constructs then this can sometimes provoke some additional processing or reorganisation of the document before it is sent out.
+
+For cacheable documents containing only cacheable snippet calls or uncacheable snippet calls that don't contain multilingual content then there is virtually no performance hit due to YAMS processing after first page access.
+
+YAMS Constructs
+---------------
+
+These constructs are used internally by YAMS, which also generates and manages the `_yamsId_` parameter to avoid clashes. The constructs are provided here for reference only. Under normal circumstances these constructs do not need to be used. Instead a YAMS snippet call should be used, which will automatically generate the correct constructs.
+
+**Name :** YAMS In Language Block
+
+**YAMS Constructs Construct :**
+
+ (yams-in:_yamsId_:_langId_)_…content…_(/yams-in:_yamsId_)
+
+**Description :** Forces the content of the `yams-in` block to be displayed as if the current language is that specified by the language group identifier `_langId_`.
+
+Here `_yamsId_` is a positive integer identifier that should be unique to this block. This allows blocks to be nested. _langId_ is a language group id.
+
+-----
+
+**Name :** YAMS Select Language Block
+
+**YAMS Constructs Construct :**
+
+ (yams-select:_yamsId_)(lang:_yamsId_:_langId1_)_…content1…_(lang:_yamsId_:_langId2_)_…content2…_(/yams-select:_yamsId_)
+
+**Description :** This includes multiple language versions of content in the page. Only the current language version is displayed (except if it is within a `yams-repeat` block - see below.)
+
+The `pagetitle`, `longtitle`, `description`, `introtext`, `menutitle` and `content` document variables are automatically expanded into this form for the currently defined active languages.
+
+For any other content (chunks, tvs, etc.) that need to be expanded into multi-language form a YAMS snippet call can be used to generate the relevant construct.
+
+When a Yams Select block is being parsed to select the correct language content the current language is taken to be context dependent. Within Yams In blocks (and branches of Yams Repeat blocks which ultimately resolve to Yams In blocks) the current language switches to the specified language.
+
+Here `_yamsId_` is a positive integer identifier that should be unique to this block. This allows blocks to be nested. `_langId_` is a language group id.
+
+-----
+
+**Name :** YAMS Select Plus Language Block
+
+**YAMS Constructs Construct :**
+
+ (yams-select+:_yamsId_)(lang:_yamsId_:_langId1_)_…content1…_(lang:_yamsId_:_langId2_)_…content2…_(/yams-select+:_yamsId_)
+
+**Description :** This is the same as the Yams Select block, except that the current language is not context sensitive. So, the current language will always be the language in which the page is being viewed.
+
+-----
+
+**Name :** YAMS Repeat Language Block 1
+
+**YAMS Constructs Construct :**
+
+ (yams-repeat:_yamsId_)_…content…_(current:_yamsId_)_…current language content…_(/yams-repeat:_yamsId_)
+
+**Description :** The `yams-repeat` block will repeat any content once for each active language and is similar to specifying one `yams-in` block for each active language.
+
+The current sub-block is optional and is to allow an alternative template to be used with the current language content.
+
+Here `_yamsId_` is a positive integer identifier that should be unique to this block.
+
+-----
+
+**Name :** YAMS Repeat Language Block 2
+
+**YAMS Constructs Construct :**
+
+ (yams-repeat:_yamsId_:_langId1_,_langId2_,_…_)_…content…_(/yams-repeat:_yamsId_)
+
+**Description :** This variation on the YAMS Multi-Language Block will only repeat for the specified language groups. This functionality is not currently accessible via a YAMS Snippet call.
+
+YAMS Parser
+-----------
+
+The YAMS parser has two phases. It does pre-parsing, which does the expansion of constructs, evaluation of placeholders and reorganisation of the document. It does a final post-parse each time the document is requested just before it is send out. Post-parsing selects a single language variant.
+
+### Pre-Parse
+
+The pre-parse step does the following:
+
+1. If the document hasn't changed since the last pre-parse, exit.
+
+2. Evaluate all chunks. The normal YAMS chunk parser removes chunks from the document if it doesn't recognise them. However, at this stage the chunk names could contain YAMS placholders, like {{`myname_(yams_id)`}}.
+
+ Since we don't want Evo to remove this, a custom chunk parser is used that leaves these intact (`YAMS::MergeChunkContent`). If the document has changed as a result of this processing the pre-parse restarts.
+
+3. For multilingual documents, the standard document variables are expanded out into constructs containing `(yams_data)` placeholders that will pull in the multilingual template variable content later in the parse process.
+
+4. The document variables and template variables belonging to the current document are evaluated. Once again, a custom parser is used (`YAMS::MergeDocumentContent`) rather than the standard Evo method.
+
+ The custom method doesn't delete unrecognised document variables or template variables so that names that include YAMS placeholders persist until later in the parse process. If the document has changed as a result of this processing the pre-parse restarts.
+
+5. Next, the document is searched for all `(yams_data)` placeholders in the document (`YAMS::MergeOtherDocumentContent`). These placeholders request data from template variables on different documents.
+
+ Having worked out what data is needed, YAMS will grab the data from the database, `YAMS_DOC_LIMIT` items at a time. `YAMS_DOC_LIMIT` is defined as 50 by default. The `(yams_data)` placeholders are then replaced by their content. If the document has changed as a result of this processing the pre-parse restarts.
+
+6. All Evo URL placeholders enclosed in quotes, like `"[~…~]"`, `"[(site_url)][~…~]"` or `"[(base_url)][~…~]"` are now replaced by YAMS multilingual URL placeholders `(yams_doc)` or `(yams_docr)`, depending on how YAMS has been configured.
+
+7. All YAMS settings placeholders are evaluated using the standard Evo function (`modx::mergeSettingsContent`).
+
+8. All YAMS placeholders are evaluated for each language and expanded out using YAMS constructs.
+
+9. Pre-parse optimisation takes place. This untangles the nested web of YAMS constructs and replaces them by a single YAMS construct with one branch per language, taking into account the fact that some content will be repeated in multiple languages, that some content may appear in a different language to the current document, and that there may still be snippets in the document which will output more multilingual constructs later. If the document has changed as a result of this processing the pre-parse restarts.
+
+10. The evaluation and expansion of YAMS placeholders into constructs and reorganisation of those constructs may have made more chunks and template variables which previously had YAMS placheholders in their name possible to evaluate now. Steps 2, 4 and 7 are repeated.
+
+11. Snippets are evaluated using the standard Evo function (`modx::evalSnippets`). If the document has changed as a result of this processing the pre-parse restarts.
+
+
+Once the parser has arrived here it hands control back to the standard Evo parser, which will first call the other plugins. If PHx has been installed and has been placed after YAMS in the plugin execution order, it will do its evaluation next… but by now all YAMS constructs and placeholders have been evaluated and tidied up, so it should be pretty safe to do so. Evo will then do its standard parsing … but there is very little left for it to do.
+
+Most chunks, document variables, template variables and snippets have already been evaluated during the YAMS preparse step.
diff --git a/en/04_Extras/YAMS/09_How To.md/01_YAMS + Snippets b/en/04_Extras/YAMS/09_How To.md/01_YAMS + Snippets
new file mode 100644
index 00000000..7d4d0b37
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/01_YAMS + Snippets
@@ -0,0 +1,21 @@
+YAMS + Snippets
+===============
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+How can I make other snippets work with YAMS?
+---------------------------------------------
+
+> Wayfinder, Jot, eForm, Ditto, Breadcrumbs are now deprecated with Evolution CMS 2.0. Migration to DocLister and FormLister should be considered from v1.3.6
+
+If the snippet uses templates then it will be necessary to convert the template to display the correct language content.
+
+This should be as simple as replacing the placeholders for the standard document variables: `[+pagetitle+], [+longtitle+], [+description+], [+introtext+], [+menutitle+] and [+content+]` by a YAMS snippet call:
+
+ [[YAMS? &get=`data` &from=`document_variable_name` &docid=`[+id+]`]]
+
+and including language variants for free text using a
+
+ [[YAMS? &get=text`...
+
+snippet call.
diff --git a/en/04_Extras/YAMS/09_How To.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md b/en/04_Extras/YAMS/09_How To.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md
new file mode 100644
index 00000000..c59adc1a
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md
@@ -0,0 +1,16 @@
+YAMS Custom Multilingual TVs, Chunks, Snippets
+==============================================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How do I make custom multilingual template variables, chunks & snippets?
+
+Create one tv, chunk or snippet call for each language, using the following naming convention: "myresource\_langid", where "langId" is the language group id.
+
+Include the tv, chunk or snippet call in a multilingual document like so:
+
+ [[YAMS? &get=`type` &from=`myresource`]]
+
+where type is either tv for a template variable, chunk for a chunk, csnippet for a cacheable snippet call, or usnippet for an uncacheable snippet call. Note that it is currently not possible to pass parameters to multilingual snippet calls.
+
+The correct language resource will be output depending on the language being displayed.
diff --git a/en/04_Extras/YAMS/09_How To.md/03_YAMS Language Dependent Layout.md b/en/04_Extras/YAMS/09_How To.md/03_YAMS Language Dependent Layout.md
new file mode 100644
index 00000000..bb2b6007
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/03_YAMS Language Dependent Layout.md
@@ -0,0 +1,15 @@
+YAMS Language Dependent Layout
+==============================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How can I have a different layout for each language?
+
+The answer is to use a different document template for each language and to get YAMS to choose the correct one based on the language:
+
+1. Place the document template for each language within a separate chunk. Give the chunks the names "mytemplate\_id1", "mytemplate\_id2", etc. where "id1", "id2" are the language group ids for the active languages.
+
+2. In the document template, use the following snippet call:
+
+
+ [[YAMS? &get=`chunk` &from=`mytemplate`]]
diff --git a/en/04_Extras/YAMS/09_How To.md/04_YAMS Language Flag List.md b/en/04_Extras/YAMS/09_How To.md/04_YAMS Language Flag List.md
new file mode 100644
index 00000000..3ab386c0
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/04_YAMS Language Flag List.md
@@ -0,0 +1,32 @@
+YAMS Language Flag List
+=======================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How can I create a linked list of flags pointing to different language versions?
+
+Use a YAMS repeat call to loop over all languages and output the flag list:
+
+ [[YAMS?
+ &get=`repeat`
+ &beforetpl=`@CODE:
+
+
+
+
+
+and "currentFlagItemTpl" is a chunk that contains an unlinked flag image:
+
+
+
+
+
+Flag images with the filename format (yams\_id).png should be placed in the directory "assets/images/flags/".
diff --git a/en/04_Extras/YAMS/09_How To.md/05_YAMS Language Select Landing Page.md b/en/04_Extras/YAMS/09_How To.md/05_YAMS Language Select Landing Page.md
new file mode 100644
index 00000000..335b3ad4
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/05_YAMS Language Select Landing Page.md
@@ -0,0 +1,33 @@
+YAMS Language Select Landing Page
+=================================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How can I make a language selection site start / landing page?
+
+1. Create a new template to use for the landing page.
+
+2. From within the YAMS Module, select that template as monolingual or multilingual as required. (If the landing page is multilingual then YAMS can be set-up to guess the language to display based on the user's browser settings. See the Other Params tab.)
+
+3. Modify the Evo site start document to use the landing page template
+
+4. Create a chunk containing the following template called "LandingPageRepeat", say:
+
+
+
+
+ Replace "docId" by the identifier of the document that the user will to be redirected to from the landing page.
+
+5. Somewhere in the template, use the following code to include a hyperlinked list of all available languages:
+
+
+
diff --git a/en/04_Extras/YAMS/09_How To.md/06_YAMS Mime-type Dependent Alias Suffixes.md b/en/04_Extras/YAMS/09_How To.md/06_YAMS Mime-type Dependent Alias Suffixes.md
new file mode 100644
index 00000000..dc4cbff7
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/06_YAMS Mime-type Dependent Alias Suffixes.md
@@ -0,0 +1,27 @@
+YAMS Mime-type Dependent Alias Suffixes
+=======================================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How can I get YAMS to use the .xml suffix for xml documents, .rss for rss documents, etc.
+
+There is an option to do this: set "Modules => YAMS => Other Params => URL Formatting => Use Mime-type dependent suffixes" to "yes", then clear the cache so that document URLs are regenerated.
+
+The default mime-type => suffix mapping is as follows:
+
+ $this->itsMimeSuffixMap = array(
+ 'application/xhtml+xml' => '.xhtml',
+ 'application/javascript' => '.js',
+ 'text/javascript' => '.js',
+ 'application/rss+xml' => '.rss',
+ 'application/xml' => '.xml',
+ 'text/xml' => '.xml',
+ 'text/css' => '.css',
+ 'text/html' => '.html',
+ 'text/plain' => '.txt'
+ );
+
+This can be changed by editing the "assets/modules/yams/yams.config.inc.php" file directly.
+
+**WARNING:**
+It is not necessary to use the SEO Strict URLs plugin in combination with YAMS since YAMS has SEO friendly behaviour built in. Furthermore, the plugin is not compatible with YAMS.
diff --git a/en/04_Extras/YAMS/09_How To.md/07_YAMS Multilingual Weblinks.md b/en/04_Extras/YAMS/09_How To.md/07_YAMS Multilingual Weblinks.md
new file mode 100644
index 00000000..1730ef9a
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/07_YAMS Multilingual Weblinks.md
@@ -0,0 +1,12 @@
+YAMS Multilingual Weblinks
+==========================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How can I create a multilingual weblink ?
+
+Weblinks can be associated with multilingual templates just like standard documents. When using a multilingual weblink the multilingual content fields should be used to specify the link destination for each language.
+
+Each language can link to a different internal or external resource. URLs or Evo document numbers should be placed in the content fields. Please make sure that the Rich Text Editor is turned off otherwise it may attempt to wrap the URL / document number in an HTML block element.
+
+A multilingual weblink can be used to redirect to its first child document. This can be used as an alternative to the "FirstChildRedirect" snippet, which doesn't work with YAMS (without modifications).
diff --git a/en/04_Extras/YAMS/09_How To.md/08_YAMS XML Sitemap.md b/en/04_Extras/YAMS/09_How To.md/08_YAMS XML Sitemap.md
new file mode 100644
index 00000000..1b0bf065
--- /dev/null
+++ b/en/04_Extras/YAMS/09_How To.md/08_YAMS XML Sitemap.md
@@ -0,0 +1,84 @@
+YAMS XML Sitemap
+================
+
+> This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.
+
+### How to create a single multilingual sitemap with YAMS
+
+This creates a single XML sitemap listing all documents in all languages. It assumes that all web documents are multilingual. If the site will contain mono- and multilingual documents, then the DocLister call will need to be more sophisticated.
+
+Two DocLister calls will be required. One DocLister call will loop over all documents that are associated with multilingual templates and one which loops over all documents associated with monolingual templates.
+
+This can be achieved using DocLister's `&filter` parameter. The multilingual DocLister call will need to be placed in a chunk and repeated using the YAMS snippet call described below.
+
+1. Create a new template called XMLSitemap
+
+2. Include the following in your XMLSitemap template:
+
+
+
+
+ [*content*]
+
+
+3. Go to "Modules => YAMS => Multilingual Templates". Select "no" for XMLSitemap and submit.
+
+4. Create a new template variable.
+
+ **Name:** UrlsetChangeFreq
+ **Caption:** Change Frequency
+ **Description:** Specify how often this page is likely to be updated. Be honest!
+ **Input type:** DropDown List Menu
+ **Input option values:** always||hourly||daily||weekly||monthly||yearly||never
+ **Default value:** yearly (or monthly, or whatever)
+
+ Associate the template variable with all your templates except XMLSitemap.
+
+5. Create another new template variable
+
+ **Name:** UrlsetPriority
+ **Caption:** Priority
+ **Description:** If it is more / less important that google scans this page than other pages, give it a value higher/lower than 0.5. (Range 0…1)
+ **Input type:** Number
+ **Input option values:** (leave blank)
+ **Default value:** 0.5
+
+ Associate the template variable with all your templates except XMLSitemap.
+
+6. The snippet call might look something like this:
+
+
+ [!DocLister?
+ &parents=`0,5`
+ &tpl=`UrlsetURL`
+ &depth=`3`
+ &dateSource=`pub_date`
+ &dateFormat=`%Y-%m-%d`
+ &addWhereList=`hidemenu=0`
+ &addWhereList=`published=1`
+ &orderBy=`menuindex ASC`
+ &tvList=`UrlsetChangeFreq,UrlsetPriority`
+ &filters=`id:isno:5,16,39,73,106`
+ !]
+
+where "UrlsetURL" is another chunk with the following contents
+
+
+ (yams_doc:[+id+])
+ [+date+]
+ [+UrlsetChangeFreq+]
+ [+UrlsetPriority+]
+
+
+ This DocLister call specifies that there are maximum of 3 levels of folders - which can make the DocLister call significantly more efficient in my experience, and excludes weblinks and unsearchable documents from the sitemap.
+
+7. Create a new document with the alias "sitemap.xml" that lives outside your web root folder. Select the XMLSitemap template. Set the content type to text/xml. For the content, use
+
+
+ [[YAMS?
+ &get=`repeat`
+ &repeattpl=`SitemapRepeatTpl`
+ ]]
+
+
+Hey presto - multilingual XML Sitemap. In addition, you can specify the change frequency and priority via the template variables attached to each document.
diff --git a/en/04_Extras/YAMS/index.md b/en/04_Extras/YAMS/index.md
index 3a633879..5f604328 100644
--- a/en/04_Extras/YAMS/index.md
+++ b/en/04_Extras/YAMS/index.md
@@ -1,4 +1,54 @@
+YAMS
+=====
-
-
Yams многоязычность сайта на MODX Evolution YAMS - Yet Another Multilingual Solution
-Модуль для создания многоязычных сайтов на MODX Evolution.
+Author : [PMS](https://github.com/Deesen/)
+
+**Licence:** GPL v3
+
+**YAMS** is a highly configurable Evo addon that is designed to make it easy to develop multilingual websites.
+
+PHP version not below 5.6
+
+[Github](https://github.com/Deesen/YAMS)
+
+The following features are currently implemented:
+
+* All content is managed via a single document tree to enable a consistent site structure across all language variants.
+
+* Standard Evo placeholders can be used within document templates in order to generate multilingual content and URLs.
+
+* A tabbed language layout for multilingual documents (requires ManagerManager)
+
+* Document templates can be configured as multilingual or monolingual.
+
+* Highly configurable multilingual URLs. The following are examples of different ways YAMS could be set-up to refer to language variants of a single document:
+
+**Multilingual aliases:**
+http://sitename/my-doc-en.html
+http://sitename/mon-doc-fr.html
+
+**Server name mode only:**
+http://en.sitename.com/mydoc.html
+http://fr.sitename.com/mydoc.html
+
+**Root name mode only:**
+http://sitename.com/en/mydoc.html
+http://sitename.com/fr/mydoc.html
+
+**Root name mode only, with one language at root:**
+http://sitename.com/mydoc.html
+http://sitename.com/fr/mydoc.html
+
+**Server name mode, root name mode, friendly alias paths, multilingual aliases and multibyte URLs:**
+http://en.sitename.com/england/folder/mydoc.html
+http://fr.sitename.com/la-france/répertoire/mon-doc.html
+
+* Additional URL configurability, including ability to hide alias of site start document, SEO friendly redirection, multibyte URLs and content-type dependent alias suffixes.
+
+* Additional YAMS Placeholders allowing access to language specific settings, such as language name and direction.
+
+* Additional functionality via the YAMS snippet call, including the ability to manage custom multilingual chunks, snippets and template variables to generate list-based or drop-down based language switchers (templatable), the ability to repeat content in multiple languages…
+
+* Extensions for Ditto, Wayfinder, Jot and eForm.
+
+* Possible to create custom multilingual template variables.
diff --git "a/en/04_Extras/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md" "b/en/04_Extras/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
index 68ce2dd7..c04da268 100644
--- "a/en/04_Extras/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
+++ "b/en/04_Extras/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
@@ -13,4 +13,6 @@
not_empty, !empty - проверка на заполненность
null, is_null - проверка, является ли значение переменной равным NULL
in_array, inarray, in - наличие в массиве
-
not_in, !in - отсутствие в массиве
\ No newline at end of file
+
not_in, !in - отсутствие в массиве
+
contains - наличие в строке
+
not_contains, !contains - отсутствие в строке
diff --git a/en/04_Extras/if/index.md b/en/04_Extras/if/index.md
index 86776483..b82b30c3 100644
--- a/en/04_Extras/if/index.md
+++ b/en/04_Extras/if/index.md
@@ -65,6 +65,10 @@
**not_in, !in** - отсутствие в массиве
+**contains** - наличие в строке
+
+**not_contains, !contains** - отсутствие в строке
+
***
### Выполнение математических функций:
diff --git a/en/04_Extras/multiTV/01_Features.md b/en/04_Extras/multiTV/01_Features.md
new file mode 100644
index 00000000..85493f95
--- /dev/null
+++ b/en/04_Extras/multiTV/01_Features.md
@@ -0,0 +1,18 @@
+
+Author: Jako
+
+multiTV is a package for MODX Evolution content management framework.
+
+With this MODX Evolution package a new template variable type is introduced. The template variable could contain a sortable multi item list or a datatable.
+
+The package contains three main parts
+
+- a custom template variable displaying and editing a sortable multi item list or a datatable
+- a snippet to display the value of the template variable
+- a module to edit the content of custom database tables.
+
+and some extras
+
+- a PHx modifier
+- a Ditto filter extender
+- a snippet for old installations to update the template variable content to the new format introduced with version 1.4.11.
diff --git "a/en/04_Extras/multiTV/01_\320\236\321\201\320\276\320\261\320\265\320\275\320\275\320\276\321\201\321\202\320\270.md" "b/en/04_Extras/multiTV/01_\320\236\321\201\320\276\320\261\320\265\320\275\320\275\320\276\321\201\321\202\320\270.md"
deleted file mode 100644
index f52eb68c..00000000
--- "a/en/04_Extras/multiTV/01_\320\236\321\201\320\276\320\261\320\265\320\275\320\275\320\276\321\201\321\202\320\270.md"
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
multiTV: Особенности
-Пакет содержит три основные части Пользовательская переменная Сниппет для отображения значения Модуль редактирования содержимого.
-
-
multiTV представляет собой пакет для MODX Evolution, предназначеный для управления контентом.
-
Этот пакет добавляет новый тип переменной шаблона (TV-параметра), состоящий из мульти-элементов.
-
Пакет содержит три основные части
-
-
Пользовательская переменная для отображения и редактирования мульти-элементов - списоков или datatable
-
Сниппет для отображения значения переменной шаблона
-
Модуль редактирования содержимого пользовательских таблиц базы данных
-
-
а также некоторые дополнения
-
-
Модификатор PHx
-
Экстендер Ditto multiTvFilter
-
Сниппет для старых установок, чтобы обновить содержимое переменных шаблона в новый формат, введенный с версии 1.4.11.
-
\ No newline at end of file
diff --git a/en/04_Extras/multiTV/02_Installation.md b/en/04_Extras/multiTV/02_Installation.md
new file mode 100644
index 00000000..38fbe51c
--- /dev/null
+++ b/en/04_Extras/multiTV/02_Installation.md
@@ -0,0 +1,35 @@
+There are three possibilities to install multiTV in MODX Evolution
+
+- [RECOMMENDED] Use the Evolution CMS Extras module
+- Use the MODX Evolution [Package Manager](https://github.com/Jako/PackageManager) and install the [latest multiTV package](https://github.com/Jako/multiTV/archive/master.zip)
+- Install it on your own:
+ 1. Upload the folder *assets/tvs/multitv* in the corresponding folder in your installation.
+ 2. Create a new template variable with imput type *custom input* (if you name this template variable *multidemo* it will use the already uploaded multidemo config file)
+ 3. Insert the following code into the *input option values*
+```@INCLUDE/assets/tvs/multitv/multitv.customtv.php```
+ 4. Create a new snippet called multiTV with the following snippet code
+``````
+
+## Compatibility patches
+
+4. If you want to modify the multiTV with ManagerManager[^1] *before MODX version 1.0.9* you have to patch the file mm.inc.php and insert
+```case 'custom_tv':``` in line 136 just before the line
+```$t = 'textarea';```
+5. If you want to use multiTV with YAMS you have to patch yams.plugin.inc.php according to the instructions on this [issue comment](https://github.com/Jako/multiTV/issues/9#issuecomment-6992127).
+6. If you are updating from 1.4.10 and below you could install the updateTV snippet and modify the data in your multiTVs to the new format. Since the custom tv and the snippet code supports the old and new format, this is only nessesary, if you want to add/remove columns in your multiTVs or if you want to sort the output by a column.
+7. If you want to use PHx with multiTV you have to modify the PHx plugin code a bit:
+
+```
+if (!class_exists('PHxParser')) {
+ include MODX_BASE_PATH . "assets/plugins/phx/phx.parser.class.inc.php";
+}
+$e = &$modx->Event;
+switch($e->name) {
+ case 'OnParseDocument':
+ $PHx = new PHxParser($phxdebug,$phxmaxpass);
+ $PHx->OnParseDocument();
+ break;
+}
+```
+
+[^1]: ManagerManager expects a custom tv field to be an input tag. Because of single and double quote issues the field containing the multiTV value is a textarea.
diff --git "a/en/04_Extras/multiTV/02_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/en/04_Extras/multiTV/02_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md"
deleted file mode 100644
index 197f4153..00000000
--- "a/en/04_Extras/multiTV/02_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md"
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
multiTV: Установка
-Есть две возможности установить multiTV в MODX Evo Используйте Менеджер Пакетов Или установите вручную.
-
-
Есть две возможности установить multiTV в MODX Evolution
Загрузите папку assets/tvs/multitv в соответствующую папку в вашей установке.
-
Создайте новый шаблон и переменную с типом ввода custom input (если имя этой переменной будет multidemo то будет использоваться файл конфигурации multidemo)
-
Вставьте следующий код в возможные значения @INCLUDE/assets/tvs/multitv/multitv.customtv.php
-
Создайте новый сниппет с названием multiTV и поместите в него следующий код: <?php return include(MODX_BASE_PATH.'assets/tvs/multitv/multitv.snippet.php'); ?>
-
-
-
-
Совместимость
-
-
Если вы хотите использовать multiTV с ManagerManager до версии MODX 1.0.9 вы должны исправить файл mm.inc.php и вставить case 'custom_tv': в 136 строке перед строкой $t = 'textarea';
-
Если вы хотите использовать multiTV с YAMS, вы должны исправить yams.plugin.inc.php согласно этой инструкции.
-
Если вы обновляете 1.4.10 и ниже можно установить сниппет updateTV и изменить данные в вашей переменной multiTV в новый формат. Это необходимо, если вы хотите добавить/удалить столбцы в multiTV или если вы хотите отсортировать результаты по столбцу.
-
Если вы хотите использовать PHx с multiTV необходимо немного изменить код плагина PHx:
-
-
if (!class_exists('PHxParser')) {
- include MODX_BASE_PATH . "assets/plugins/phx/phx.parser.class.inc.php";
-}
-$e = &$modx->Event;
-switch($e->name) {
- case 'OnParseDocument':
- $PHx = new PHxParser($phxdebug,$phxmaxpass);
- $PHx->OnParseDocument();
- break;
-}
\ No newline at end of file
diff --git a/en/04_Extras/multiTV/03_Template_variable.md b/en/04_Extras/multiTV/03_Template_variable.md
new file mode 100644
index 00000000..5083fa37
--- /dev/null
+++ b/en/04_Extras/multiTV/03_Template_variable.md
@@ -0,0 +1,83 @@
+All options for a custom template variable are set in a PHP Array or JSON config file in the folder *configs* with the same name as the template variable (otherwise the default config is used) and *.config.inc.php* or *config.json* as extension (a JSON file is used in priority to PHP Array file).
+
+## Display mode
+
+The display mode of the input fields in the multi field list could be set in the key `display` to *horizontal* (events example), *vertical* (images example), *single*, *datatable* (links or multicontent example) or *dbtable* (dbtabledemo example). A multiTV with single display configuration contains only one list element. With a multiTV in *dbtable* mode a (custom) table in the MODX database could be displayed and edited.
+
+## Fields
+
+The fields of the multitv could be defined in the key `fields`. This key contains an array of fieldnames and each fieldname contains an array of field properties.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | Caption (horizontal) or label (vertical) for the input | -
+type | Type of the input (could be set to almost all MODX input types[^1], `thumb` for thumbnail display of image tvs[^2] or `richtext` for a richtext field with TinyMCE) | text
+elements | Same options as in the *input option values* of a [MODX template variable](http://rtfm.modx.com/evolution/1.0/developers-guide/template-variables/creating-a-template-variable) are possible i.e. for a dropdown with all documents in the MODX root: ``@SELECT `pagetitle`, `id` FROM `modx_site_content` WHERE parent = 0 ORDER BY `menuindex` ASC`` | -
+default | Default value for the input. This value could contain calculated parts. There are two placeholders available: `{i}` contains an autoincremented index `{alias}` contains the alias of the edited document. | -
+thumbof | Name of an image input. A thumbnail of the selected image will be rendered into this area | -
+width | Width of the input | 100
+theme | Theme[^3] for TinyMCE if type is richtext | -
+
+[^1]: Supported input types: text, rawtext, email, number, textareamini, textarea, rawtextarea, htmlarea, richtext, date, dropdown, listbox, listbox-multiple, checkbox, option, image, file, color
+
+[^2]: See [images config](https://github.com/extras-evolution/multiTV/blob/master/assets/tvs/multitv/configs/images.config.inc.php) for thumb
+
+[^3]: Themes in the theme directory: advanced, base, creative, custom, editor, full, inline, introtext, legacy, logic,mini, simple, webuser
+
+In datatable mode a layer will be displayed during adding/editing one row. In this editing layer the MODX input type richtext is possible.
+
+## Columns
+
+In *datatable* and *dbtable* mode the visible columns for the datatable could be defined in the key `columns`. This key contains an array of column settings. Each column setting contains an array of properties. If a property is not set, the field property in key `fields` is used.
+
+Property | Description | Default
+-------- | ----------- | -------
+fieldname | **(required)** Fieldname that is displayed in this column | -
+caption | Caption of the column | Caption for fieldname in `fields`
+width | Width of the column | Width for fieldname in `fields`
+render | Enable rengering of the column content with this PHx capable string | -
+sortable | Enable sorting for this column by clicking on the column header in *datatable* or *dbtable* mode. Only active if sorting is disabled in [other options](#other-options) | true
+
+## Editing Layer
+
+In *datatable* and *dbtable* mode the content of the editing layer could be defined in the key `form`. This key contains an array of form tab settings.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | **(required)** Caption for the form tab | -
+content | **(required)** Associative array of field settings | -
+
+Each form tab setting contains an associative array of field properties (the key contains the fieldname in `fields`). If a field property is not set, the field property in `fields` is used.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | Caption for the input | Caption for fieldname in `fields`
+
+## Default Output Templates
+
+The default output templates for the multiTV snippet could be defined in the key `templates`.
+
+Property | Description | Default
+---- | ----------- | -------
+rowTpl | Default row template chunk for the snippet output. Could be changed in snippet call. See [snippet documentation](snippet.html) for possible placeholders | -
+outerTpl | Default outer template chunk for the snippet output. Could be changed in snippet call. See [snippet documentation](snippet.html) for possible placeholders | -
+
+## Other options
+
+The other options for one multiTV could be defined in the key `configuration`.
+
+Property | Description | Default
+---- | ----------- | -------
+csvseparator | Column separator for csv clipboard table data. The csv clipboard table data should contain a new line for each row. | ,
+displayLength | Number of entries displayed by default in *datatable* and *dbtable* mode. | 10
+displayLengthMenu | Entries in the 'number of entries' selector in *datatable* and *dbtable* mode. | 10,25,50,100
+enablePaste | multiTV could contain *paste table data* link that displays a paste box. In this box you could paste Word/HTML table clipboard data, Google Docs table clipboard data and csv data. | true
+enableClear | multiTV could contain *clear all* link that clears the content of the multiTV | true
+hideHeader | Hide the table header in *datatable* and *dbtable* mode. | false
+radioTabs | Tabs in the datatable editing layer are displayed as radio buttons. The button state is saved in *fieldTab* key of each multiTV row. | false
+sortindex | Field that contains the sort index (to enable draggable sorting in the module or *dbtable* mode) | -
+sorting | Enable sorting by clicking on the column header in *datatable* or *dbtable* mode. Row reordering by drag & drop will be disabled. | false
+prepare | Function to process data before output (called for each list item) | -
+prepareWrap | Function to process outer wrap data before output | -
+
+See the [multidemo config](https://github.com/extras-evolution/multiTV/blob/master/assets/tvs/multitv/configs/multidemo.config.inc.php) for all usable vertical settings and the [multicontent config](https://github.com/extras-evolution/multiTV/blob/master/assets/tvs/multitv/configs/multicontent.config.inc.php) for all usable datatable settings.
diff --git "a/en/04_Extras/multiTV/03_\320\237\320\265\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\265 \321\210\320\260\320\261\320\273\320\276\320\275\320\260.md" "b/en/04_Extras/multiTV/03_\320\237\320\265\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\265 \321\210\320\260\320\261\320\273\320\276\320\275\320\260.md"
deleted file mode 100644
index 8f035472..00000000
--- "a/en/04_Extras/multiTV/03_\320\237\320\265\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\265 \321\210\320\260\320\261\320\273\320\276\320\275\320\260.md"
+++ /dev/null
@@ -1,193 +0,0 @@
-
-
-
multiTV: Переменная шаблона
-Все параметры задаются в конфигурационном файле в папке configs с тем же именем, как и переменная шаблона.
-
-
Все параметры задаются в конфигурационном файле в папке configs с тем же именем, как и переменная шаблона в виде PHP-массива .config.inc.php или JSON файла .config.json (файл JSON имеет приоритет перед PHP-массивом).
-
Параметр display
-
Отображение полей ввода настраивается с помощью параметра display
-
-
horizontal - горизонтальное расположение (пример event.config.inc.php)
-
vertical - вертикальное расположение (пример images.config.inc.php)
-
single - содержит только один элемент
-
datatable - пример links.config.inc.php или multicontent.config.inc.php
-
dbtable - пример dbtabledemo.config.json
-
-
Параметр fields
-
Поля ввода одного элемента списка определяются в параметре fields
-
Эта переменная содержит массив имен полей и каждое имя поля содержит массив свойств поля.
-
-
-
-
Поле
Описание
Значение по умолчанию
-
-
-
-
caption
-
Заголовок (при horizontal) или лейбл (при vertical) для поля ввода
-
-
-
-
-
type
-
Тип поля ввода (используются все типы ввода MODX кроме url и richtext, добавлен thumb для отображения эскизов изображений)
-
text
-
-
-
elements
-
Для ввода возможных значений переменной, например, для выпадающего списка всех дочерних документов корневой папки сайта: @SELECT `pagetitle`, `id` FROM `modx_site_content` WHERE parent = 0 ORDER BY `menuindex` ASC
-
-
-
-
-
default
-
Значение по умолчанию. Это значение может содержать вычисления. Может содержать два плэйсхолдера: [+i+] - автоматически увеличивающийся индекс, [+alias+] - псевдоним редактируемого документа.
-
-
-
-
-
thumbof
-
Имя переменной для миниатюры изоображения. Миниатюра будет отображена в этой области.
-
-
-
-
-
width
-
Ширина поля ввода (только если тип отображения полей horizontal)
В режимах datatable и dbtable могут быть определены в качестве ключа параметры columns. Этот ключ содержит массив параметров столбцов. Каждый столбец содержит массив свойств. Если свойство не задано, в качестве ключа используется fields.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
fieldname
-
(обязательный параметр) Имя свойства
-
-
-
-
-
caption
-
Заголовок столбца
-
caption параметра fields
-
-
-
width
-
Ширина столбца
-
width параметра fields
-
-
-
render
-
Enable rengering of the column content with this PHx capable strin
-
-
-
-
-
sortable
-
Включить сортировку по этой колонке, нажав на Заголовок столбца в datatable или dbtable режиме. Активно только при отключенной сортировке в других опциях
-
true
-
-
-
-
-
Редактирование слоев
-
В режимах datatable и dbtable редактирование содержимого слоя может быть определено в ключе form. Этот ключ содержит массив параметров вкладки form.
Each form tab setting contains an associative array of field properties (the key contains the fieldname in fields). If a field property is not set, the field property in fields is used.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
caption
-
Заголовок для input
-
caption параметра fields
-
-
-
-
-
Шаблоны по умолчанию
-
Шаблоны для сниппета multiTV используемые по умолчанию, могут быть определены в параметре templates
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
rowTpl
-
Шаблон вывода строки. Может быть изменен в вызове сниппета
-
-
-
-
-
outerTpl
-
Шаблон вывода внешнего блока. Может быть изменен в вызове сниппета
-
-
-
-
-
-
-
Другие опции
-
Другие опции могут быть определены в параметре configuration
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
enablePaste
-
multiTV может содержать ссылку для вставки данных. В этом окне вы могли бы вставить Word/HTML таблицы данных из буфера обмена, Google Docs таблицы и данные в формате csv.
-
true
-
-
-
enableClear
-
Ссылка на удаление всех элементов multiTV
-
true
-
-
-
csvseparator
-
Разделитель столбцов при вставке данных csv. Каждая строка должна начинаться с новой строки.
-
,
-
-
-
radioTabs
-
Tabs in the datatable editing layer are displayed as radio buttons. The button state is saved in fieldTab key of each multiTV row.
-
false
-
-
-
sorting
-
Включить сортировку по щелчку на заголовке столбца в datatable или dbtable режиме.
-
false
-
-
-
hideHeader
-
Скрыть заголовок в datatable или dbtable режиме.
-
,
-
-
-
-
-
Смотрите файл конфигурации для TV-параметра multidemo для всех используемых вертикальных настроек и multicontent для всех используемых datatable настроек.
\ No newline at end of file
diff --git a/en/04_Extras/multiTV/04_Snippet.md b/en/04_Extras/multiTV/04_Snippet.md
new file mode 100644
index 00000000..2b315061
--- /dev/null
+++ b/en/04_Extras/multiTV/04_Snippet.md
@@ -0,0 +1,104 @@
+The multiTV snippet has to be called to display the content of a multiTV template variable. Call the snippet like this (most expample parameters are using the default values in this example call and could be removed from the call – parameter tvName is required)
+
+```
+[!multiTV?
+&tvName=`yourMultiTVname`
+&docid=`[*id*]`
+&tplConfig=``
+&outerTpl=`@CODE:
((wrapper))
`
+&rowTpl=`@CODE:
((event)), ((location)), ((price))
`
+&display=`5`
+&offset=`0`
+&rows=`all`
+&where=``
+&randomize=`0`
+&reverse=`0`
+&orderBy=``
+&toPlaceholder=``
+&toJson=`0`
+&published=`1`
+&emptyOutput=`1`
+&noResults=``
+&outputSeparator=``
+&firstClass=`first`
+&lastClass=`last`
+&evenClass=``
+&oddClass=``
+&paginate=`0`
+&offsetKey=`page`
+&prepare=``
+&prepareWrap=``
+!]
+```
+
+##Parameters
+
+Name | Description | Default value
+---- | ----------- | -------------
+tvName | **(required)** Name of the template variable that contains the multiTV (the column names of the mulitTV are received from the config file) | -
+docid | Document id where the custom tv is retreived from (i.e. if the multiTV Snippet is called in a Ditto template) | Current document id
+tplConfig | Array key in the config file that contains the output templates configuration (will be prefixed with `templates`) | ''
+outerTpl | Outer template: chunkname, filename (value starts with `@FILE`) or code (value starts with `@CODE` – placeholders have to be masked by `((` and `))`. Usable [placeholders](#placeholder-in-outertpl). [^1] | `@CODE:` or custom template in template variable config file
+rowTpl | Row template: chunkname, filename (value starts with `@FILE`) or code (value starts with `@CODE` – placeholders have to be masked by `((` and `))`. Usable [placeholders](#placeholder-in-rowtpl). [^1] | `@CODE:` or custom template in template variable config file
+display | Count of rows that are displayed, `all` for all rows | 5
+offset | Count of rows from start that are not displayed | 0
+rows | Comma separated list of row numbers (or all rows) that should be displayed | all
+where | JSON encoded array of where clauses to filter the results. Example [clauses](#placeholder-in-rowtpl). | -
+randomize | Random order of displayed rows (disables `reverse` and `orderBy` parameter) | 0
+reverse | Reverse order of displayed rows (disables `orderBy` parameter) | 0
+orderBy | Column name, column order type and order direction to sort the output (format: `name:type direction` – type could be `text` or `date`, defaults to `text` – direction defaults to `asc`) | -
+toPlaceholder | The snippet output is assigned to a placeholder named as the parameter value (i.e. [+myPlaceholder+]), single items are assigned to placeholders named as the parameter value followed by the row number (i.e. [+myPlaceholder.1+]). Normal snippet output is suppressed.[^2] | -
+toJson | The snippet output contains the json encoded result of the multitv snippet call. Useful to retreive the multiTV results other snippets by runSnippet | 0
+published | Display only multiTVs of published (1), unpublished (0) or both (2) kind of documents | 1
+emptyOutput | Return empty string if the multiTV is empty, otherwise return outer template | 1
+noResults | No results template: chunkname, filename (value starts with `@FILE`) or code (value starts with `@CODE`) | -
+outputSeparator | String inserted between two row templates | empty
+firstClass | Content of row.class placeholder in the first row | first
+lastClass | Content of row.class placeholder in the last row | last
+evenClass | Content of row.class placeholder in an even row | -
+oddClass | Content of row.class placeholder in an odd row | -
+paginate | Show pagination | 0
+offsetKey | Pagination offset parameter key | page
+prepare | Name of the snippet (or multiple divided by commas) for processing the data of each item in the list before it is rendered | -
+prepareWrap | Name of the snippet (or multiple divided by commas) for processing the data of outer wrap before it is rendered | -
+
+The default templates for outer template and row template could be defined in the config file for the custom template variable. These custom definitions could be overwritten by `rowTpl` and `outerTpl` in snippet call. Both template chunks are parsed by PHx (chunkie class).
+
+###Where clause examples
+
+The *where* parameter could be set with an JSON encoded array of where clauses. Each where clause has to use the following format: `{"fieldname:operator":"value"}` *fieldname* is the name of a multiTV field, *operator* is the comparing operator, *value* is the value the fieldname is compared with. Possible operators are `=`, `!=`, `>`, `<`, `>=`, `<=`, `LIKE NOT`, `LIKE`. The default operator is `=`.
+
+``&where=`{"price":"2000"}` `` will filter all rows where the mulitTV field price is not 2000.
+
+``&where=`{"city:LIKE":"London"}` `` will filter all rows where the mulitTV field city does not contain London.
+
+Multiple where clauses are combined with `AND` i.e. ``&where=`{"city:LIKE":"London","price":"2000"}` `` will filter all rows where the mulitTV field city does not contain London and where the mulitTV field price is not 2000.
+
+##Placeholder
+
+###Placeholder in rowTpl
+
+Name | Description
+---- | -----------
+"fieldname" | Each fieldname defined in config file could be used
+"property" | Each snippet property in snippet call could be used
+iteration | Contains the iteration of the current multiTV element
+row.number | Contains the row number of the current multiTV element
+row.class | FirstClass parameter setting for first displayed row, lastClass parameter setting for last displayed row, evenClass/oddClass parameter setting for even/odd rows.
+row.total | Contains the count of all displayable rows
+docid | Value of docid parameter or current document id
+
+###Placeholder in outerTpl
+
+Name | Description
+---- | -----------
+wrapper | Contains the output of all rows
+"property" | Each snippet property in snippet call could be used
+rows.offset | Contains the count of rows from start that are not displayed
+rows.total | Contains the count of all displayable rows
+docid | Value of docid parameter or current document id
+pagination | Contains the pagination (if parameter pagination is enabled)
+
+[^1]: Older MODX versions don’t like =, ? and & in snippet parameters. If the template code has to use those signs, put the template code in a chunk or change the default templates in the config file.
+
+[^2]: If the snippet output is assigned to placeholder and PHx is installed, the page should be set to uncached and the Snippet should be called cached. Otherwise PHx will 'steal' the placeholders before the Snippet could fill them.
diff --git "a/en/04_Extras/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md" "b/en/04_Extras/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md"
deleted file mode 100644
index e70d0827..00000000
--- "a/en/04_Extras/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md"
+++ /dev/null
@@ -1,422 +0,0 @@
-
-
-
multiTV: Сниппет
-Параметры и примеры использования сниппета multiTV.
-
-
Сниппет multiTV отображает содержимое переменной multiTV. Разместите примерно такой вызов сниппета. Параметр &tvName обязателен. Остальные параметры в случае если используются значения по умолчанию, могут быть удалены.
По умолчанию шаблоны для внешнего блока и строки могут быть определены в файле конфигурации. Эти шаблоны могут быть перезаписаны параметрами rowTpl и outerTpl в вызове сниппета.
-Формат: TV-параметр
-Значение по умолчанию: пусто
-Примечание: Обязательный параметр. Имена столбцов multiTV будут получены из конфигурационного файла
-Пример:
-
-Формат: имя чанка | @FILE | @CODE
-Значение по умолчанию: @CODE:
-Примечание: Имя чанка, имя файла (должно начинаться с @FILE) или код (должно начинаться с @CODE - плэйсхолдеры должны быть в двойных скобках (( и )). (Примечание 3)
-Пример:
-
-Формат: имя чанка | @FILE | @CODE
-Значение по умолчанию: @CODE:
-Примечание: Имя чанка, имя файла (должно начинаться с @FILE) или код (должно начинаться с @CODE - плэйсхолдеры должны быть в двойных скобках (( и )). (Примечание 3)
-Пример:
-
-Формат: имя плейсхолдера
-Значение по умолчанию: нет
-Примечание: Будет создан плейсхолдер с именем, указанным в значении параметра [+element+]. Отдельные элементы выводятся плейсхолдерами, где к имени добавляется номер строки [+element.1+]. Нормальный вывод сниппета подавляется.
-Пример:
-
-Формат: 0 | 1 | 2
-Значение по умолчанию: 1
-Примечание: отображать только multiTV из опубликованных (1), неопубликованных (0) или любых (2) документов
-Пример:
-
-Формат:
-Значение по умолчанию: page
-Примечание:
-Пример:
-
&offsetKey=``
-
-
-
-
-
Плейсхолдеры rowTpl
-
-
-
-
Имя
Описание
-
-
-
-
"fieldname"
-
может быть использовано каждое поле, определенное в конфигурации
-
-
-
iteration
-
содержит номер текущего элемента multiTV
-
-
-
row.number
-
содержит номер строки текущего элемента multiTV
-
-
-
row.class
-
'first' - для первой отображенной строки, 'last' - для последней отображенной строки
-
-
-
row.total
-
содержит количество всех отображаемых строк
-
-
-
docid
-
значение параметра docid или id текущего документа
-
-
-
-
-
Плейсхолдеры outerTpl
-
-
-
-
Имя
Описание
-
-
-
-
wrapper
-
место вывода всех строк
-
-
-
rows.offset
-
содержит количество строк от начала, которые не отображаются
-
-
-
rows.total
-
содержит количество всех отображаемых строк
-
-
-
docid
-
значение параметра docid или id текущего документа
-
-
-
pagination
-
содержит постраничное разбиение, если параметр включен
-
-
-
-
-
\ No newline at end of file
diff --git a/en/04_Extras/multiTV/05_Module.md b/en/04_Extras/multiTV/05_Module.md
new file mode 100644
index 00000000..7458aad0
--- /dev/null
+++ b/en/04_Extras/multiTV/05_Module.md
@@ -0,0 +1,135 @@
+The multiTV Database Manager is a MODX Evolution module providing almost the same options as a multiTV Template Variable in datatable mode. The main difference is the direct access of (custom) tables in the MODX Evolution database.
+
+With the Database Manager you could manage (CRUD) your own database tables and use MODX input types for managing table row fields.
+
+##Configuration
+
+Each Database Manager configuration file will create a tab in a Database Manager module if it is referenced in the module configuration. The value of *Configurations* has to be filled by a comma separated list of config names in *assets/tvs/multitv/moduleconfigs* (i.e. event_log for referencing the event_log.moduleconfig.json)
+
+Each configuration file contains a JSON encoded array with the following settings:
+
+### Table
+
+The database table could be set in the key `table`. The table name is prefixed by the MODX table prefix.
+
+### Caption
+
+The Database Manager module tab text and tab caption could be set in the key `caption`.
+
+### Processors
+
+The processors folder could be set in the key `processors`. If it is not set, the default processors in *assets/tvs/multitv/processors* are used. If it is set, the processors are retrieved from a subfolder of *assets/tvs/multitv/processors* named as the key value. If that subfolder does not exist, the value points to a subfolder of the MODX base path.
+
+There are five processors usable at the moment.
+
+Processor | Description
+-------- | -----------
+loadtable | Loads the current table with limit and offset into the datatable
+loadrecord | Loads a table row into the editing layer
+createrecord | Creates a new table row for the editing layer
+deleterecord | Deletes a table row
+saverecord | Saves the values of the editing layer into a table row
+
+### Fields
+
+The fields of the database table could be defined in the key `fields`. This key contains an array of fieldnames and each fieldname contains an array of field properties.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | Caption (horizontal) or label (vertical) for the input | -
+type | Type of the input (could be set to almost all MODX input types[^1], `thumb` for thumbnail display of image tvs[^2]) and `unixtime` to convert the datetime table data to unixtime and vice versa | text
+elements | [Same options](http://rtfm.modx.com/evolution/1.0/developers-guide/template-variables/creating-a-template-variable) as in the *input option values* of a MODX template variable are possible i.e. for a dropdown with all documents in the MODX root: ``@SELECT `pagetitle`, `id` FROM `modx_site_content` WHERE parent = 0 ORDER BY `menuindex` ASC`` | -
+default | Default value for the input. This value could contain calculated parts. There are two placeholders available: `{i}` contains an autoincremented index `{alias}` contains the alias of the edited document. | -
+thumbof | Name of an image input. A thumbnail of the selected image will be rendered into this area | -
+width | Width of the input | 100
+
+[^1]: Supported MODX input types: text, rawtext, email, number, textareamini, textarea, rawtextarea, htmlarea, date, dropdown, listbox, listbox-multiple, checkbox, option, image, file
+[^2]: See [images config](https://github.com/extras-evolution/multiTV/blob/master/assets/tvs/multitv/configs/images.config.inc.php) for thumb
+
+During adding/editing one row a layer is displayed. In this editing layer the MODX input type richtext is not usable at the moment (degrades to textarea).
+
+### Columns
+
+The visible columns for the datatable could be defined in the key `columns`. This key contains an array of column settings. Each column setting contains an array of properties. If a property is not set, the field property in key `fields` is used.
+
+Property | Description | Default
+-------- | ----------- | -------
+fieldname | **(required)** Fieldname that is displayed in this column | -
+caption | Caption of the column | Caption for fieldname in `fields`
+width | Width of the column | Width for fieldname in `fields`
+render | Enable rengering of the column content with this PHx capable string | -
+
+### Editing Layer
+
+The content of the editing layer during adding/editing one row could be defined in the key `form`. This key contains an array of form tab settings.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | **(required)** Caption for the form tab | -
+content | **(required)** Associative array of field settings | -
+
+Each form tab setting contains an associative array of field properties (the key contains the fieldname in `fields`). If a field property is not set, the field property in `fields` is used.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | Caption for the input | Caption for fieldname in `fields`
+
+### Buttons
+
+Own buttons for the Database Manager module tab could be defined in the key `buttons`. This key contains an associative array of button group configs.
+
+Property | Description | Default
+-------- | ----------- | -------
+position | **(required)** Position of the button group (could be `topleft`, `topright`, `bottomleft` or `bottom right`)| -
+buttons | **(required)** Associative array of button configs | -
+
+Each button config contains an associative array of button settings.
+
+Property | Description | Default
+-------- | ----------- | -------
+caption | Caption for the button | -
+icon | Icon for the button located in *assets/tvs/multitv/css/images* | -
+processor | name of the processor file located in *assets/tvs/multitv/processors/[groupkey]* (groupkey contains the group config key)| -
+form | Array of form tab settings (see [Editing layer](#editing-layer)) | -
+
+For every button a javascript file will be included with the following path *assets/tvs/multitv/buttons/[groupkey]/[buttonkey].button.js* (groupkey contains the button group config key, buttonkey contains the button config key)
+
+Example for a generate coupons button with one group config key *coupons* and one button config key *generate*. The button section could contain several group configs and each one several button configs.
+
+ "buttons": {
+ "coupons": {
+ "position": "topright",
+ "buttons": {
+ "generate": {
+ "caption": "Generate",
+ "icon": "wand.png",
+ "processor": "generate",
+ "form": [
+ {
+ "caption": "Coupon",
+ "content": {
+ "count": {},
+ "discount": {},
+ "validuser": {},
+ "validgroup": {},
+ "validuntil": {},
+ "maxuse": {}
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+
+The [event_log module config](https://github.com/extras-evolution/multiTV/blob/master/assets/tvs/multitv/moduleconfigs/event_log.moduleconfig.json)) contains a simpler example for a csvexport button.
+
+### Other options
+
+The other options for one multiTV could be defined in the key `configuration`.
+
+Property | Description | Default
+---- | ----------- | -------
+radioTabs | Tabs in the datatable editing layer are displayed as radio buttons. The button state is saved in *fieldTab* column of each table row (this column has to exist). | false
+sorting | Enable sorting by column header. | false
+sortindex | Column name that ist used as sorting index. The column type has to be integer and it should contain an autoincremented index (see in [Fields](#fields)) as default value. | false
diff --git "a/en/04_Extras/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" "b/en/04_Extras/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md"
deleted file mode 100644
index 6d8845ea..00000000
--- "a/en/04_Extras/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md"
+++ /dev/null
@@ -1,259 +0,0 @@
-
-
-
multiTV: Модуль
-Модуль multiTVDatabase Manager обеспечивает почти те же параметры, как и переменная шаблона multiTV в режиме datatable.
-
-
Модуль multiTV Database Manager обеспечивает почти те же параметры, как и переменная шаблона multiTV в режиме datatable. Главное отличие - это прямой доступ к таблицам базы данных MODX Evolution.
-
С Database Manager можно управлять (CRUD) собственными таблицами базы данных.
-
Конфигурация
-
Каждый файл конфигурации создаст соответствующую вкладку в модуле Database Manager. Файлы конфигурацйии находятся в папке assets/tvs/multitv/moduleconfigs. Смотрите пример файла конфигурации event_log.moduleconfig.json
-
Каждый файл конфигурации содержит JSON массив со следующими параметрами:
-
Таблица
-
таблица базы данных с ключем table. Имя таблицы будет служить префиксом таблицы MODX.
-
Заголовок
-
Название вкладки в модуле Database Manager с ключем caption.
-
Процессоры
-
Путь к папке с процессорами можно установить в ключе processors. Если не задано, то по умолчанию используются процессоры assets/tvs/multitv/processors. Если задано, то процессоры извлекаются из вложенной папки assets/tvs/multitv/processors названой по значению ключа. If that subfolder does not exist, the value points to a subfolder of the MODX base path.
-
Существует пять процессоров, используемых в данный момент.
-
-
-
-
Процессоры
Описание
-
-
-
-
loadtable
-
Загружает в текущую таблицу с limit и offset в datatable
-
-
-
loadrecord
-
Загружает строки таблицы в редактирование слоя
-
-
-
createrecord
-
Создает новую строку таблицы для редактирования слоя
-
-
-
deleterecord
-
Удаляет строку таблицы
-
-
-
saverecord
-
Сохраняет значения редактируемого слоя в строке таблицы
-
-
-
-
-
Поля
-
Поля таблицы базы данных могут быть определены в ключе fields. Этот ключ содержит массив fieldnames и каждый fieldname содержит массив свойств поля.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
caption
-
Заголовок (при horizontal) или лейбл (при vertical) для поля ввода
-
-
-
-
-
type
-
Тип поля ввода (используются все типы ввода MODX кроме url и richtext, добавлен thumb для отображения эскизов изображений) и unixtime для конвертации datetime таблицы данных в unixtime и наоборот
-
text
-
-
-
elements
-
Для ввода возможных значений переменной, например, для выпадающего списка всех дочерних документов корневой папки сайта: @SELECT `pagetitle`, `id` FROM `modx_site_content` WHERE parent = 0 ORDER BY `menuindex` ASC
-
-
-
-
-
default
-
Значение по умолчанию. Это значение может содержать вычисления. Может содержать два плэйсхолдера: {i} - автоматически увеличивающийся индекс, {alias} - псевдоним редактируемого документа.
-
-
-
-
-
thumbof
-
Имя переменной для миниатюры изоображения. Миниатюра будет отображена в этой области.
-
-
-
-
-
width
-
Ширина поля ввода
-
100
-
-
-
-
-
During adding/editing one row a layer is displayed. In this editing layer the MODX input type richtext is not usable at the moment (degrades to textarea).
-
Столбцы
-
Видимые столбцы datatable могут быть определены в ключе columns. Этот ключ содержит массив параметров столбцов. Каждый параметр столбца содержит массив свойств. Если свойство не задано, используется свойство ключа fields.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
fieldname
-
(обязательный параметр) Имя свойства
-
-
-
-
-
caption
-
Заголовок столбца
-
Заголовок для fields
-
-
-
width
-
Ширина столбца
-
Ширина дял fields
-
-
-
render
-
Enable rengering of the column content with this PHx capable string
-
-
-
-
-
-
-
Редактирование слоев
-
Содержимое редактируемого слоя во время добавления/редактирования одной строки может быть определено в ключе form. Этот ключ содержит массив параметров вкладки form.
Each form tab setting contains an associative array of field properties (the key contains the fieldname in fields). If a field property is not set, the field property in fields is used.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
caption
-
Заголовок для ввода
-
Заголовок для fields
-
-
-
-
-
Кнопки
-
Кнопки для модуля Database Manager могут быть определены в ключе buttons. Этот ключ содержит ассоциативный массив конфигурации кнопок.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
position
-
(обязательный параметр) Положение кнопок (может быть topleft, topright, bottomleft or bottom right)
Другие опции могут быть определены в ключе configuration.
-
-
-
-
Свойство
Описание
Значение по умолчанию
-
-
-
-
radioTabs
-
Tabs in the datatable editing layer are displayed as radio buttons. The button state is saved in fieldTab column of each table row (this column has to exist).
-
false
-
-
-
sorting
-
Enable sorting by column header.
-
false
-
-
-
sortindex
-
Column name that ist used as sorting index. The column type has to be integer and it should contain an autoincremented index (see in Fields) as default value.
-
false
-
-
-
-
\ No newline at end of file
diff --git a/en/04_Extras/multiTV/06_Extras.md b/en/04_Extras/multiTV/06_Extras.md
new file mode 100644
index 00000000..2b640340
--- /dev/null
+++ b/en/04_Extras/multiTV/06_Extras.md
@@ -0,0 +1,106 @@
+Since the JSON string in multiTV starts with `[[` and ends with `]]`[^1], you *can't* check if the multiTV is empty by i.e. ```[*multittvname:ne=``:then=`not empty`*]```.
+
+But you could to use the PHx modifier in the folder `phx-modifier` in that case. Move the two files to `assets/plugins/phx/modifiers` and call it like this ``[+phx:multitvisempty=`tvname|docid`:then=`xxx`:else=`yyy`+]`` or like this ``[+phx:multitvisnotempty=`tvname|docid`:then=`xxx`:else=`yyy`+]``. If docid is not set it defaults to current document.
+
+## Ditto filter extender
+
+If you want to filter displayed Ditto rows by the values of multiTV field content, you could use the Ditto multitv filter extender. As all other Ditto filters it filters the row away if the condition is true.
+
+The extender uses the following parameters
+
+Name | Description
+---- | -----------
+multiTvFilterBy | multiTV name to filter by (required)
+multiTvFilterOptions | (Array of) json encoded object(s) of filter options
+
+The following **filter options** could be used
+
+Name | Description
+---- | -----------
+name | mulitTV field name that is used for filtering
+type | Type of the multiTV field content (possible content: date, text)
+value | The value the multiTV field content is filtered with
+mode | Mode for filtering the multiTV field content
+conjunction | Logical conjunction with the previous filter result (AND/OR)
+
+The following modes could be used for **text** type:
+
+Name | Description
+---- | -----------
+contains | filtered if one value contains filterValue
+allcontains | filtered if all values containing filterValue
+containsnot | filtered if one value not contains filterValue
+allcontainsnot | filtered if all values not containing filterValue
+is | filtered if one value is filterValue
+allis | filtered if all values are filterValue
+isnot | filtered if one value is not filterValue
+allisnot | filtered if all values are not filterValue
+
+The following modes could be used for **date** type:
+
+Name | Description
+---- | -----------
+before | filtered if one value is before filterValue
+beforeall | filtered if all values are before filterValue
+equal | filtered if one value is equal filterValue
+equalall | filtered if all values are equal filterValue
+after | filtered if one value is after filterValue
+afterall | filtered if one value is after filterValue
+
+### Examples
+
+The following example displays all documents within containers 3, 4, and 5 where the multiTV `event` values in column `title` not containing `Important` in any multiTV row.
+
+```
+[[Ditto?
+&parents=`3,4,5`
+&display=`all`
+&tpl=`...`
+&extenders=`@FILE assets/tvs/multitv/dittoExtender/multitvfilter.extender.inc.php`
+&multiTvFilterBy=`event`
+&multiTvFilterOptions=`[{"name":"title","type":"text","value":"Important","mode":"contains"}]`]]
+]]
+```
+
+If you want to filter Ditto by several multiTV values, you ave to append an option object to the `multiTvFilterOptions`. The next example will display all documents within containers 3, 4, and 5 where the multiTV `event` values in column `title` not containing `Important` and column `location` is `Outdoor` in any multiTV row.
+
+```
+[[Ditto?
+&parents=`3,4,5`
+&display=`all`
+&tpl=`...`
+&extenders=`@FILE assets/tvs/multitv/dittoExtender/multitvfilter.extender.inc.php`
+&multiTvFilterBy=`event,event`
+&multiTvFilterOptions=`[{"name":"title","type":"text","value":"Important","mode":"contains"},{"name":"location","type":"text","value":"Outdoor","mode":"allisnot","conjunction":"OR"}]`]]
+]]
+```
+
+
+## Update to the new data format
+
+Version 1.4.11 of multiTV uses a new data format (the column names are saved as key with each value). The custom tv and the snippet code supports the old and new format, so you don't have to update your multiTVs. It is only nessesary, if you want to add/remove columns in your multiTVs.
+
+Create a new snippet called updateTV with the following snippet code
+
+```
+
+```
+
+Call the snippet on one (temporary) MODX document like this:
+
+```
+[!updateTV?
+&tvNames=`yourMultiTVname1,yourMultiTVname2`
+!]
+```
+
+## Parameters
+
+Name | Description | Default value
+---- | ----------- | -------------
+tvNames | **(required)** comma separated list of template variable names that contain multiTV data | -
+
+
+[^1]: The JSON string the multitv is converted to starts with `[[` and ends with `]]` so the MODX parser thinks it contains a snippet and you can't place the template variable directly in the template.
diff --git "a/en/04_Extras/multiTV/06_\320\224\320\276\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\275\320\276.md" "b/en/04_Extras/multiTV/06_\320\224\320\276\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\275\320\276.md"
deleted file mode 100644
index 0003f299..00000000
--- "a/en/04_Extras/multiTV/06_\320\224\320\276\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\275\320\276.md"
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
Так как строка JSON в multiTV начинается с [[ и заканчивается ]] (Примечание 1), вы не можете проверить multiTV на пустоту, т.е. [*multittvname:ne=``:then=`not empty`*].
-
Но вы могли бы использовать в этом случае PHx модификаторы из папки phx-modifier. Переместите два файла из этой папки в assets/plugins/phx/modifiers.
Если вы хотите фильтровать по нескольким значениям multiTV, добавьте еще один массив в multiTvFilterOptions. В этом примере отобразятся все дочерние документы контейнеров 3, 4, и 5 у которых переменная шаблона multiTV event в столбце title не содержит Important и все столбцы location соответствуют Outdoor.
Версия 1.4.11 multiTV использует новый формат данных (имена столбцов сохраняются в виде ключ - значение). Переменная и сниппет поддерживают старый и новый форматы, так что вам не придется обновлять multiTVs. Но вам это потребуется, если вы захотите добавить/удалить столбцы в multiTVs. Вызовите сниппет в документе MODX следующим образом:
(обязательно) разделенный запятыми список имен переменных, которые содержат данные multiTV
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/en/04_Extras/multiTV/07_Data_preparation.md b/en/04_Extras/multiTV/07_Data_preparation.md
new file mode 100644
index 00000000..f7caa3cf
--- /dev/null
+++ b/en/04_Extras/multiTV/07_Data_preparation.md
@@ -0,0 +1,83 @@
+Often there is a need for additional data processing before output. For this purpose, `prepare` and `prepareWrap` are available as settings in the configuration file or as snippet parameters.
+
+The value can be a snippet name, a function name (also in the configuration file you can specify the *Closure*), or a comma-separated list, or an array of them.
+
+The parameters of the function/snippet following:
+
+Parameter | Description
+--------- | -----------
+`$data` | Current values
+`$modx` | Instance of the DocumentParser class
+`$_multiTV` | Instance of the multiTV class, to work with storage methods
+
+The function/snippet should always return values, even if they have not changed.
+
+Examples:
+
+```php
+// in configuration file:
+function prepareRowsFunction($data, $modx, $_multiTV) {
+ return $data;
+}
+
+$settings['prepare'] = 'prepareRowsSnippet';
+// or
+$settings['prepare'] = function($data, $modx, $_multiTV) {
+ return $data;
+};
+// or
+$settings['prepare'] = 'prepareRowsSnippet,prepareRowsFunction';
+// or
+$settings['prepare'] = ['prepareRowsSnippet', 'prepareRowsFunction'];
+// or
+$settings['prepare'] = ['prepareRowsSnippet', function($data, $modx, $_multiTV) {
+ return $data;
+}];
+```
+
+```
+// in tempalte
+[[multiTV? &tvName=`test` &prepare=`prepareRowsSnippet,prepareRowsFunction`]]
+```
+
+Values of the `$data` parameter of the prepare function, in addition to the field values specified in the variable configuration, will be as follows:
+
+Key | Description
+--- | -----------
+`docid` | Current document ID
+`iteration` | Current iteration Number (starts with 1)
+`row` | `row.number` - current iteration Number (starts with 1), `row.total` - total number of elements
+
+Values of the `$data` parameter for `prepareWrap`:
+
+Key | Description
+--- | -----------
+`docid` | Current document ID
+`wrapper` | Array of rendered elements
+`rows` | `rows.offset` - number of skipped items, `rows.total` - total number of elements
+
+Examples:
+
+```php
+$settings['prepare'] = function($data, $modx, $_multiTV) {
+ $store = $_multiTV->getStore('storekey');
+
+ if (is_null($store)) {
+ $store = $modx->runSnippet('HeavySnippet');
+ $_multiTV->setStore('storekey', $store);
+ }
+
+ return $data;
+};
+```
+
+```php
+$settings['prepare'] = function($data, $modx, $_multiTV) {
+ if (!empty($data['file'])) {
+ $extension = pathinfo($data['file'], PATHINFO_EXTENSION);
+ $data['icon'] = 'icon-document-' . $extension;
+ }
+
+ return $data;
+};
+```
diff --git a/en/04_Extras/sGallery/index.md b/en/04_Extras/sGallery/index.md
new file mode 100644
index 00000000..611aee71
--- /dev/null
+++ b/en/04_Extras/sGallery/index.md
@@ -0,0 +1,150 @@
+## Repository ##
+https://github.com/Seiger/sGallery
+
+# sGallery for Evolution CMS
+
+[](https://packagist.org/packages/seiger/sgallery)
+[](https://github.com/evolution-cms/evolution)
+
+[](https://packagist.org/packages/seiger/sgallery)
+[](https://github.com/Seiger/sgallery/issues)
+[](https://packagist.org/packages/seiger/sgallery)
+[](https://packagist.org/packages/seiger/sgallery)
+
+**sGallery** emerges as a versatile and indispensable plugin tailor-made for Evolution CMS,
+revolutionizing the way you manage media assets within your website. Specifically
+designed for the Evolution CMS admin panel, this dynamic plugin introduces a host
+of powerful features to elevate your content presentation.
+
+**sGallery** stands as a testament to Evolution CMS's commitment to robust and user-friendly
+content management. Whether you are a content creator or an administrator, this plugin
+empowers you to curate a visually stunning and engaging website with unparalleled ease.
+Elevate your media management experience with **sGallery** today.
+
+## Features
+
+- [x] Image and Video Attachment.
+- [x] Effortless Media Upload.
+- [x] YouTube Integration.
+- [x] Sortable Positions.
+- [x] Text Fields for File Management.
+- [x] Image Resize and AVIF or WEBP Conversion.
+- [x] Integration with Custom Modules.
+- [x] **[sLang](https://github.com/Seiger/sLang)** Integration.
+- [x] More than one tab.
+- [x] Full Image slider in Admin panel.
+
+## Supported formats
+
+The following image formats are tested and supported by the package. If your GD/Imagick installation supports
+a format that is not listed you are probably fine to use it but your mileage may vary.
+
+| Format | GD | Imagick |
+|--------|----| --- |
+| jpeg | ✅ | ✅ |
+| png | ✅ | ✅ |
+| gif | ✅ | ✅ |
+| webp | ✅ | ✅ |
+| avif | ✅ | ✅ |
+| heic | ❌ | ✅ |
+| tiff | ❌ | ✅ |
+
+## Minimum requirements
+
+- Evolution CMS 3.2.0
+- PHP 8.2.0
+- Composer 2.2.0
+- PostgreSQL 10.23.0
+- MySQL 8.0.3
+- MariaDB 10.5.2
+- SQLite 3.25.0
+
+## Install by artisan package installer
+
+Go to You /core/ folder:
+
+```console
+cd core
+```
+
+Run php artisan command
+
+```console
+php artisan package:installrequire seiger/sgallery "*"
+```
+
+Generate the config file in **../core/custom/config/seiger/settings** with
+name **sgallery.php** the file should return a
+comma-separated list of templates.
+
+```console
+php artisan vendor:publish --provider="Seiger\sGallery\sGalleryServiceProvider"
+```
+
+Run make DB structure with command:
+
+```console
+php artisan migrate
+```
+
+## Configure
+
+Templates for displaying gallery tabs are configured in the
+
+```console
+core/custom/config/seiger/settings/sGallery.php
+```
+
+file, where the array contains template IDs for connecting the gallery.
+
+## Usage in blade
+
+Sow all files with Image filter:
+```php
+@foreach(sGallery::collections()->get() as $item)
+ @if(sGallery::hasImage($item->type))
+ link))href="{{$item->link}}"@endif>
+
+@endforeach
+```
+
+## Integration into the products module
+
+Just paste this code in your View:
+```php
+{!!sGallery::initialiseView()->viewType('section')->itemType('product')->idType('i')!!}
+```
+
+[Full docs](https://seiger.github.io/sGallery/)
diff --git a/en/05_Tutorials/01_Lessons/01 Installing and Configuring MODX.md b/en/05_Tutorials/01_Lessons/01 Installing and Configuring MODX.md
new file mode 100644
index 00000000..0481dfe7
--- /dev/null
+++ b/en/05_Tutorials/01_Lessons/01 Installing and Configuring MODX.md
@@ -0,0 +1,28 @@
+Download the latest version of the system (at the time of writing this document it was version 1.4.23 or 3.1.15)
+
+Unzip the files to any folder on your local drive. For example, c:\temp\modx_1.4.23
+
+If you are going to install MODx on a UNIX/Linux system, create an empty file named config.inc.php in the manager/includes/ folder.
+Now you need to upload the files from the specified directory to the root directory of your site.
+
+Note: here we mean the root directory for html documents (often they are called http, htdocs, html, etc.).
+
+If you do not want to install MODx in the root directory, you can install the system in any other directory - the installation process will be the same. For convenience, we will assume that you are installing MODx in the root directory of the site. So, connect to the site via FTP and copy all the files from the local directory (for example, we previously adopted c:\temp\modx_1.4.23) to the server.
+
+If the site is running UNIX operating systems (FreeBSD or Linux), then to start configuring the system directly, you need to fulfill these prerequisites: The following directories on your site must have access rights 0777:
+
+/assets/cache (and all files it contains)
+/assets/export
+/assets/images
+/assets/modules (for installing modules)
+/manager/includes/config.inc.php (must have read-only access later)
+
+(refer to the documentation of your ftp client to learn how to set the necessary access rights for the above directories).
+
+MODx uses the MySQL DBMS. You need to know the username and password to access the database (or create the database and user yourself) in order to install MODx on the site. If your user does not have the rights to create a database, then you need to take care of this in advance. Contact your hosting provider's support team or refer to the MySQL documentation if you are configuring the software yourself.
+
+Now that everything is ready to configure the system on the site, type www.your_site_name/install/ in the line of your browser. Instead of "your_site_name", enter the domain by which the site is accessible on the Internet.
+
+Remember that if you have uploaded the system files not to the root directory of the site, then you need to add the path to this directory to the "name of your_site". For example, if you have uploaded files to the modx folder on your site, then to configure the system you need to type in the browser line www.name_of_your_site/modx/install/index.php Follow the instructions of the installation wizard that appears on the screen. Immediately after the license agreement, make sure that the "Update" option is selected. When you see the "Delete /install folder" option, make sure it is enabled. (Deleting this folder will prevent malicious users from running the update/installation script.) After completing the installation wizard, use ftp to verify that the /install folder does not exist. If it is not, delete it manually. Finally, change the permissions of the config.inc.php file in the /manager/includes folder to read-only.
+
+Recommended installation via CHMOD -0444 (r--r--r--) - this will prevent your site from a possible attack. Note: On servers that are running IIS, you do not need to do this. Source: MODx - Wikibooks
diff --git "a/en/05_Tutorials/01_Lessons/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260_\320\270_\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_MODX.md" "b/en/05_Tutorials/01_Lessons/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260_\320\270_\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_MODX.md"
deleted file mode 100644
index d56ae82d..00000000
--- "a/en/05_Tutorials/01_Lessons/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260_\320\270_\320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260_MODX.md"
+++ /dev/null
@@ -1,21 +0,0 @@
-Загрузите последнюю версию системы (на момент написания данного документа это была версия 0.9.6)
-Разархивируйте файлы в любую папку на вашем локальном диске. Например c:\temp\modx_0.9.6\
-Если вы собираетесь установить MODx на UNIX/Linux систему, создайте в папке manager/includes/ пустой файл с именем config.inc.php.
-Теперь необходимо загрузить файлы из указанной директории в корневую директорию вашего сайта.
-Примечание: здесь мы имеем ввиду корневую директорию для html документов (часто они называются http, htdocs, html и тд.). Если вы не хотите устанавливать MODx в корневую директорию, вы можете установить систему в любую другую директорию - процесс установки будет тот же. Мы же для удобства будем полагать, что вы устанавливаете MODx в корневую директорию сайта.
-Итак, подключитесь к сайту по FTP и скопируйте все файлы из локальной директории (для примера мы ранее приняли c:\temp\modx_0.9.5\) на сервер.
-Если сайт работает под управлением операционных систем UNIX (FreeBSD или Linux), то для начала непосредственной настройки системы вам нужно выполнить эти необходимые условия:
-Следующие директории на вашем сайте должны иметь права доступа 0777:
-/assets/cache (и все содержащиеся в ней файлы);
-/assets/export;
-/assets/images
-/assets/modules (для установки модулей);
-/manager/includes/config.inc.php (позже должен иметь доступ "Только чтение")
-(обратитесь к документации своего ftp-клиента, для того чтобы узнать, как установить нужные права доступа для указанных выше директорий).
-MODx использует СУБД MySQL. Вам необходимо знать имя пользователя и пароль доступа к базе данных (либо создать самим базу и пользователя) для того, чтобы установить MODx на сайт. Если ваш пользователь не имеет прав на создание базы, то вам необходимо позаботиться об этом заранее. Обратитесь к службе поддержки вашего хостинг-провайдера или обратитесь к документации по MySQL, если вы сами настраиваете ПО.
-Теперь, когда все готово к настройке системы на сайте, наберите в строке вашего браузера www.имя_вашего_сайта/install/. Вместо «имя_вашего_сайта» введите домен, по которому сайт доступен в сети Интернет. Помните, что если вы загрузили файлы системы не в корневую директорию сайта, то вам необходимо к «имя_вашего_сайта» добавить путь к этой директории. Например, вы загрузили файлы в папку modx на вашем сайте, то для настройки системы вам нужно набрать в строке браузера www.имя_вашего_сайта/modx/install/index.php
-Следуйте появившемся на экране инструкциям мастера установки. Сразу после лицензионного соглашения, убедитесь, что выбрана опция "Обновить".
-Когда перед вами возникнет опция "Удалить папку /install", убедитесь, что она включена. (Удаление этой папки предотвратит запуск сценария обновления/установки злоумышленниками).
-После завершения работы мастера установки, по ftp убедитесь, что папки /install не существует. Если это не так, удалите ее вручную.
-Наконец, измените права доступа к файлу config.inc.php в папке /manager/includes на "только чтение". Рекомендуемая установка через CHMOD -0444 (r--r--r--) - это предотвратит ваш сайт от возможной атаки. Примечание: на серверах под управлением IIS, этого делать не нужно.
-Источник: MODx - Викиучебник
\ No newline at end of file
diff --git a/en/05_Tutorials/01_Lessons/02_Updating_MODX.md b/en/05_Tutorials/01_Lessons/02_Updating_MODX.md
new file mode 100644
index 00000000..986b809f
--- /dev/null
+++ b/en/05_Tutorials/01_Lessons/02_Updating_MODX.md
@@ -0,0 +1,5 @@
+To upgrade your MODx system, you'll need to follow pretty much the same steps as in the Setup Guide, with one exception. You must not delete or overwrite the config.inc.php file. So, to upgrade the MODx version, do the following:
+
+If you have modified snippets or plugins for your needs, either rename them or do not forget to uncheck the boxes during the installation wizard. The default installation wizard will overwrite all native snippets or plugins (Ditto, etc.) to the latest versions. (In general, it's a good practice to rename a snippet or plugin immediately after making changes to it) Back up everything you can. Use ftp to download all MODx files from your server and use phpMyAdmin (or another database management program) to make a "dump" of your entire database. Check again if everything has a backup! Download and unzip the latest version of MODx. Upload the contents of the unzipped archive to your server. Overwrite any old files. The MODx distribution should not contain the config.inc.php file in the /manager/includes/ folder, so it will not be overwritten. Open a browser and go to your server (where you downloaded the distribution kit) in the /install directory. Then follow the on-screen instructions. Immediately after the license agreement, make sure that the "Update" option is selected. If you deleted all of your old files before upgrading, you'll probably need to set permissions again via CHMOD as described in the Setup Guide. The installation wizard will remind you to do so if necessary. Do not forget to uncheck those add-ons (snippets, plugins) to which you have made changes and have not renamed (see point 1). When you see the "Delete /install folder" option, make sure it is enabled. (Deleting this folder will prevent malicious users from running the update/installation script) After completing the installation wizard, use ftp to verify that the /install folder does not exist. If it is not, delete it manually. Finally, change the permissions of the config.inc.php file in the /manager/includes folder to read-only. Recommended installation via CHMOD -0444 (r--r--r--) - this will prevent your site from a possible attack.
+
+Note: On servers that are running IIS, you do not need to do this. Once you've verified that everything works correctly, rename any snippets or plugins you modified again if necessary. THE MODx update is complete! Source: MODx - Wikibooks
diff --git "a/en/05_Tutorials/01_Lessons/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_MODX.md" "b/en/05_Tutorials/01_Lessons/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_MODX.md"
deleted file mode 100644
index 90601423..00000000
--- "a/en/05_Tutorials/01_Lessons/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_MODX.md"
+++ /dev/null
@@ -1,17 +0,0 @@
-Для обновления системы MODx вам потребуется выполнить практически те же шаги, что и в Руководстве по настройке, с одним исключением. Вы не должны удалять или перезаписывать файл config.inc.php. Итак, для обновления версии MODx выполните следующее:
-
-Если вы изменяли для своих нужд сниппеты или плагины, либо переименуйте их либо не забудьте снять галочки в процессе работы мастера установки. Мастер установки по умолчанию перезапишет все штатные сниппеты или плагины (Ditto и т. д.) до последних версий. (Вообще, хорошей практикой считается переименовывание сниппета или плагина сразу же после внесение в него изменений)
-Сделайте резервные копии всего что можно. По ftp скачайте все файлы MODx с вашего сервера и с помощью phpMyAdmin (или другой программы управления БД) сделайте "дамп" всей вашей базы данных.
-Еще раз проверьте, все ли имеет резервную копию!
-Скачайте и разархивируйте последнюю версию MODx.
-Загрузите содержимое распакованного архива на ваш сервер. Перезапишите все старые файлы. Дистрибутив MODx не должен содержать файла config.inc.php в папке /manager/includes/, так что он перезаписан не будет.
-Откройте браузер и зайдите на ваш сервер (куда вы загрузили дистрибутив) в директорию /install.
-Далее следуйте инструкциям на экране. Сразу после лицензионного соглашения, убедитесь, что выбрана опция "Обновить".
-Если вы удалили все ваши старые файлы перед обновлением, вам, вероятно, потребуется снова выставить права доступа через CHMOD, как описано Руководстве по настройке. Мастер установки напомнит вам сделать это, если будет необходимо.
-Не забудьте снять галочки с тех дополнений (сниппетов, плагинов), в которые вы внесли изменения и не переименовали (см. пункт 1).
-Когда перед вами возникнет опция "Удалить папку /install", убедитесь, что она включена. (Удаление этой папки предотвратит запуск сценария обновления/установки злоумышленниками)
-После завершения работы мастера установки, по ftp убедитесь, что папки /installне существует. Если это не так, удалите ее вручную.
-Наконец, измените права доступа к файлу config.inc.php в папке/manager/includes на "только чтение". Рекомендуемая установка через CHMOD -0444 (r--r--r--) - это предотвратит ваш сайт от возможной атаки. Примечание: на серверах под управлением IIS, этого делать не нужно.
-После того, как вы убедитесь, что все работает корректно, переименуйте все модифицированные вами сниппеты или плагины снова, если это необходимо.
-Обновление MODx завершено!
-Источник: MODx - Викиучебник
\ No newline at end of file
diff --git a/en/05_Tutorials/01_Lessons/03_Transfer of site from local computer to hosting.md.md b/en/05_Tutorials/01_Lessons/03_Transfer of site from local computer to hosting.md.md
new file mode 100644
index 00000000..25bc2249
--- /dev/null
+++ b/en/05_Tutorials/01_Lessons/03_Transfer of site from local computer to hosting.md.md
@@ -0,0 +1,61 @@
+### Packing files
+
+If you have access to the hosting via the SSH protocol and are allowed to use decompression of archives, then transferring files as an archive is easier and fastest. Also, the ability to unpack archives can be accessed from the hosting control panel.
+
+All files from the site folder on the local computer are packed into a ZIP archive. In this case, it is better to make the file name simple and short.
+
+If you do not have SSH access, decompression through the panel or decompression is prohibited by the hoster, then you will have to transfer all files in the usual way.
+
+### Database dump
+
+The easiest way to make a database dump is to use the phpMyAdmin program.
+
+Choose the base of our site. Go to the "Export" section Select all tables to export You can check the box next to Add Delete Table to erase tables with old data. Check the "Send" checkbox to save the dump as a file. Transfer files to the server
+
+Open any FTP-manager and transfer files, including database dump, to the folder of your site.
+
+### Working with SSH
+
+After logging in to the server console, type mc.
+
+### Unzip the files
+
+Go to the folder with our site (if not). Unpack the files from the archive (let's say that our archive is called www.zip):
+
+unzip www.zip
+
+All files will be unpacked into the folder where the archive is located.
+
+Set write permissions
+
+For the CMS to work correctly, you need to set write permissions for the following folders and files:
+
+assets/cache assets/cache/siteCache.idx.php assets/cache/sitePublishing.idx.php assets/images assets/export Заливаем дамп в базу на хостинге
+
+The easiest way is to use phpMyAdmin again.
+
+If you don't have a database, you need to create one. If there is, then select your database and go to the SQL tab to execute the query. After the window for entering the request, it is possible to specify a file. That's what we're going to take advantage of. Click browse and select your file. It is important that the encoding of the dump file matches the specified encoding. Send a file with a request. Verify that the data is migrated correctly
+
+To verify the correctness of the migrated data, open the _site_content table (prefix). This table contains all the documents, so you should see your Russian texts. If the text is crooked, your file may have been in the wrong encoding.
+
+## Configure MODx
+
+### Connection to the database.
+
+Open the file manager/includes/config.inc.php (it is better to make a copy, not to overwrite the local version) and correct the following data:
+
+$database_server = 'localhost'; Sometimes the database server is located separately on the hosting, so you may need to specify the direct address of the server $database_user = 'MyUser'; Specify the login to access the database $database_password = ' MyPassword '; accordingly password for access $database_connection_charset = 'utf8'; encoding of received data from the database We copy the file via FTP to the hosting.
+
+### Configure file paths
+
+Go to the MODx control system. In the menu, select Toolbox -> Configuration. There, select the HTML Settings tab - > of the editor and interface and correct the File Path setting (specify the direct path on the hosting).
+
+Go to the Other tab and also change the path in the Path field for the file manager.
+
+### Additional encoding check
+
+To finally make sure that everything works correctly and the encodings are correct everywhere, open any document (for example, the main one, so as not to go far). There we write such a line and IshSH and save. Go to the site and see the result. If everything is shown correctly, then the transfer is done correctly.
+
+### Site Upgrade
+
+If you also captured the local cache during the migration (and you certainly captured it), it is better to clear the cache. To do this, select the item in the menu Site -> Update Site.
diff --git "a/en/05_Tutorials/01_Lessons/03_\320\237\320\265\321\200\320\265\320\275\320\276\321\201_\321\201\320\260\320\271\321\202\320\260_\321\201_\320\273\320\276\320\272\320\260\320\273\321\214\320\275\320\276\320\263\320\276_\320\272\320\276\320\274\320\277\321\214\321\216\321\202\320\265\321\200\320\260_\320\275\320\260_\321\205\320\276\321\201\321\202\320\270\320\275\320\263.md" "b/en/05_Tutorials/01_Lessons/03_\320\237\320\265\321\200\320\265\320\275\320\276\321\201_\321\201\320\260\320\271\321\202\320\260_\321\201_\320\273\320\276\320\272\320\260\320\273\321\214\320\275\320\276\320\263\320\276_\320\272\320\276\320\274\320\277\321\214\321\216\321\202\320\265\321\200\320\260_\320\275\320\260_\321\205\320\276\321\201\321\202\320\270\320\275\320\263.md"
deleted file mode 100644
index 17680e73..00000000
--- "a/en/05_Tutorials/01_Lessons/03_\320\237\320\265\321\200\320\265\320\275\320\276\321\201_\321\201\320\260\320\271\321\202\320\260_\321\201_\320\273\320\276\320\272\320\260\320\273\321\214\320\275\320\276\320\263\320\276_\320\272\320\276\320\274\320\277\321\214\321\216\321\202\320\265\321\200\320\260_\320\275\320\260_\321\205\320\276\321\201\321\202\320\270\320\275\320\263.md"
+++ /dev/null
@@ -1,78 +0,0 @@
-Упаковка файлов
-
-Если у вас есть доступ на хостинг по протоколу SSH и разрешено использовать распаковку архивов, то перенос файлов в виде архива проще и быстрее всего. Также возможность распаковки архивов может быть доступна из панели управления хостингом.
-
-Все файлы из папки сайта на локальном компьютере запаковываем в архив ZIP. При этом название файла лучше сделать простым и коротким.
-
-Если у вас нет доступа SSH, распаковки через панель или распаковка запрещена хостером, то придется переносить все файлы обычным путем.
-
-Дамп базы данных
-
-Самый простой способ сделать дамп базы - воспользоваться программой phpMyAdmin.
-
-Выбираем базу нашего сайта.
-Заходим в раздел «Экспорт»
-Выделяем все таблицы для экспорта
-Можно установить галочку «Добавить удаление таблицы», чтобы таблицы со старыми данными стирались.
-Отмечаем галочку «Послать», чтобы сохранить дамп в виде файла.
-Переносим файлы на сервер
-
-Открываем FTP-менеджер любой и в папку своего сайта переносим файлы, включая дамп базы данных.
-
-Работаем с SSH
-
-После входа в консоль сервера наберите команду mc.
-
-Распаковываем файлы
-
-Переходим к папке с нашим сайтом (если нет). Распаковываем файлы из архива (допустим, что наш архив называется www.zip):
-
-unzip www.zip
-
-Все файлы будут распакованы в папку, где лежит архив.
-
-Устанавливаем права на запись
-
-Для правильной работы CMS необходимо установить права на запись для следующих папок и файлов:
-
-assets/cache
-assets/cache/siteCache.idx.php
-assets/cache/sitePublishing.idx.php
-assets/images
-assets/export
-Заливаем дамп в базу на хостинге
-
-Проще всего снова воспользоваться phpMyAdmin.
-
-Если у вас нет базы, то нужно ее создать. Если есть, то выбираем свою базу и переходим во вкладку SQL для выполнения запроса.
-После окна для ввода запроса есть возможность указать файл. Этим мы и воспользуемся. Нажимаем обзор и выбираем свой файл. При этом важно, чтобы кодировка файла дампа совпадала с указанной.
-Отправляем файл с запросом.
-Проверка правильности переноса данных
-
-Чтобы проверить правильность перенесенных данных открываем таблицу (prefix) _site_content. Эта таблица содержит все документы, поэтому вы должны увидеть свои русские тексты. Если текст отображается криво, то возможно ваш файл был в неверной кодировке.
-
-Настраиваем конфигурацию MODx
-
-Подключение к базе.
-
-Открываем файл manager/includes/config.inc.php (лучше сделать копию, а не переписывать локальную версию) и корректируем следующие данные:
-
-$database_server = 'localhost'; // Иногда на хостинге сервер базы данных находится отдельно, поэтому может возникнуть необходимость указать прямой адрес сервера
-$database_user = 'MyUser'; // Указываем логин для доступа к базе
-$database_password = ' MyPassword '; // соответственно пароль для доступа
-$database_connection_charset = 'utf8'; // кодировка получаемых данных из базы
-Файл через FTP копируем на хостинг.
-
-Настройка путей к файлам
-
-Заходим в систему управления MODx. В меню выбираем Инструментарий -> Конфигурация. Там выбираем вкладку Настройки HTML -> редактора и интерфейса и исправляем настройку Путь к файлам (указываем прямой путь на хостинге).
-
-Переходим во вкладку Другое и меняем также путь в поле Путь для файлового менеджера.
-
-Дополнительная проверка кодировки
-
-Чтобы окончательно удостовериться, что все работает правильно и кодировки указаны везде верные, открываем любой документ (например главную, чтобы далеко не идти). Там пишем такую строку иИшШ и сохраняем. Идем на сайт и смотрим результат. Если все показывается верно, то перенос сделан верно.
-
-Обновление сайта
-
-Если при переносе вы захватили и локальный кэш (а вы его конечно захватили), то лучше выполнить очистку кэша. Для этого выбираем пункт в меню Сайт -> Обновить сайт.
\ No newline at end of file
diff --git a/en/05_Tutorials/01_Lessons/04_Temporary site shutdown.md b/en/05_Tutorials/01_Lessons/04_Temporary site shutdown.md
new file mode 100644
index 00000000..0823ba99
--- /dev/null
+++ b/en/05_Tutorials/01_Lessons/04_Temporary site shutdown.md
@@ -0,0 +1,9 @@
+There may be a situation where you need to temporarily make your site inaccessible to visitors. MODx invites the owner to disable the site and notify visitors about the reasons and timing of this.
+
+Log on to the site management interface by a user who has rights to change the site configuration. Go to The Administration -> System settings. Site availability settings are located on the first tab of the system control panel.
+
+As long as the system identifies you as the site manager, you see your site in the same state as before. This makes it easy to disable the site for support purposes (for example, updating or adding modules, templates, etc.), but at the same time be able to see and test the changes made before it is seen by ordinary visitors. They will also see a special page, if you have specified it, or a special message.
+
+If you do not specify which page to show to visitors while the site is disabled, then the system will automatically show a message that the site is not available.
+
+Source: MODx - Wikibooks
diff --git "a/en/05_Tutorials/01_Lessons/04_\320\222\321\200\320\265\320\274\320\265\320\275\320\275\320\276\320\265_\320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\260.md" "b/en/05_Tutorials/01_Lessons/04_\320\222\321\200\320\265\320\274\320\265\320\275\320\275\320\276\320\265_\320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\260.md"
deleted file mode 100644
index 0a4c7f35..00000000
--- "a/en/05_Tutorials/01_Lessons/04_\320\222\321\200\320\265\320\274\320\265\320\275\320\275\320\276\320\265_\320\276\321\202\320\272\320\273\321\216\321\207\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\260.md"
+++ /dev/null
@@ -1,9 +0,0 @@
-Может возникнуть такая ситуация, когда вам потребуется на время сделать ваш сайт недоступным для посетителей. MODx предлагает владельцу отключить сайт и оповестить посетителей о причинах и сроках этого.
-
-Войдите в интерфейс управления сайтом пользователем, у которого есть права на изменение конфигурации сайта. Перейдите на панель управления системой (Administration -> System settings). Настойки доступности сайта находятся на первой вкладке панели управления системой.
-
-Пока система идентифицирует вас как управляющего сайта, вы видите свой сайт в том же состоянии, что и раньше. Это позволяет легко отключить сайт для целей поддержки (например, обновление или добавление модулей, шаблонов и т.п.), но при этом иметь возможность видеть и тестировать вносимые изменения, прежде чем это увидят рядовые посетители. Они же увидят специальную страницу, если вы её указали, или специальное сообщение.
-
-Если не указано, какую страницу показывать посетителям пока сайт отключен, тогда система автоматически покажет сообщение о том, что сайт не доступен.
-
-Источник: MODx - Викиучебник
\ No newline at end of file
diff --git a/en/05_Tutorials/01_Lessons/index.md b/en/05_Tutorials/01_Lessons/index.md
index e7c2d68d..ee96637f 100644
--- a/en/05_Tutorials/01_Lessons/index.md
+++ b/en/05_Tutorials/01_Lessons/index.md
@@ -1,84 +1,87 @@
-
Уроки
-
Для тех кто только знакомится с MODX EVO очень рекомендую пройтись по ссылкам ниже, сразу отпадут многие вопросы.
diff --git a/en/05_Tutorials/02_Solutions/01_Creating_DOCUMENTS_MODx_from_form_data_eForm_deprecated_method.md b/en/05_Tutorials/02_Solutions/01_Creating_DOCUMENTS_MODx_from_form_data_eForm_deprecated_method.md
new file mode 100644
index 00000000..95223368
--- /dev/null
+++ b/en/05_Tutorials/02_Solutions/01_Creating_DOCUMENTS_MODx_from_form_data_eForm_deprecated_method.md
@@ -0,0 +1,96 @@
+## Creating MODx Documents from eForm Form Data Deprecated Method
+
+**This is an outdated method. We recommend that you use the FormLister snippet to create documents, or replace the function calls in the snippet with methods of the MODx Api library.**
+
+However, as an example of working with eForm snippets and events, this solution fits very well.
+
+For operations with documents we will use a special library docmanager. Install it in the .assets/libs/docmanager
+
+### Create a form
+The form is created using the standard eForm snippet. It has built-in all the necessary field checks, as well as the ability to send us a letter about adding new material.
+
+For example, let's make this form in an Anketa chunk:
+```html
+
[+validationmessage+]
+
+```
+### To call a form on a site
+You can use the following call to display the form:
+```php
+[!eForm? &formid=`newArticle` &subject=`Посетители прислали новый файл` &tpl=`Anketa` !]
+```
+Importantly! The formid parameter must match the formid field of the same name.
+
+### Processor of received data
+Once we have received all the necessary data from the user, we need to put them in the document. To do this, make a new snippet named NewArticleEvent and in it create your function CreateNewArticle:
+```php
+function CreateNewArticle(&$fields){
+ // the $fields array will contain the data of all the form fields
+ // Create a document with a description.
+ require_once('assets/libs/docmanager/document.class.inc.php');
+ $doc = new Document(); // Create a Document
+ $doc->Set('parent',60); // determine in which folder to put
+ $doc->Set('template','Article'); // choose an existing template
+ $doc->Set('pagetitle',$fields['pagetitle']); // set the pagetitle
+ $doc->Set('introtext',$fields['introtext']); // set the introtext
+ $doc->Set('content',$fields['content']); // set the contents
+ // Set any Tempalte Variables
+ $doc->Set('tvAuthor',$fields['author']); // Set the Author TV
+ $doc->Set('tvEmail',$fields['email']); // Set the Email TV
+ $doc->Set('tvLink',$fields['link']); // Set an URL Link TV
+ $doc->Save(); // Save the Document
+ return true; // Tell eForm it's ok.
+}
+```
+Such a simple code will allow us to save the received data to a document. You can change the snippet names and functions with the handler if you want.
+
+Importantly! To specify TV parameters, you must add the tv prefix before the name, that is, this is not part of the parameter name.
+
+### Connecting the handler to our form
+eForm has several events that we can catch, but in this case we only need eFormOnBeforeMailSent. It is called right before the form is submitted and after all data has been checked for mandatory and format. Change the call of our form a bit and get the following final view:
+```php
+[!NewArticleEvent!]
+[!eForm? &formid=`newArticle` &subject=`Visitors sent a new file` &tpl=`questionnaire` &eFormOnBeforeMailSent=`CreateNewArticle`!]
+```
+Importantly! For the eForm event to access our handler, we need to make a snippet call to the handler immediately before calling eForm. The name of the function to be called is specified in the call parameter of the &eFormOnBeforeMailSent handler.
+
+PS: Thus, you can create forms of any complexity and even organize file uploads.
+
+### Visual Editor
+To make it easier for visitors to create articles, you can use the visual editor tinyMCE. To do this, you must include the following code in the page with the form:
+```html
+
+
+```
+The tinyMCE editor is highly customizable. therefore, you can add the tools that are needed in your case. And in order for eForm to miss HTML tags, you need to add the following parameters:
+```html
+&allowhtml=`1` &sendAsHtml=`1`
+```
diff --git "a/en/05_Tutorials/02_Solutions/01_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_MODx_\320\277\320\276_\320\264\320\260\320\275\320\275\321\213\320\274_\321\204\320\276\321\200\320\274\321\213_eForm_\321\203\321\201\321\202\320\260\321\200\320\265\320\262\321\210\320\270\320\271_\320\274\320\265\321\202\320\276\320\264.md" "b/en/05_Tutorials/02_Solutions/01_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_MODx_\320\277\320\276_\320\264\320\260\320\275\320\275\321\213\320\274_\321\204\320\276\321\200\320\274\321\213_eForm_\321\203\321\201\321\202\320\260\321\200\320\265\320\262\321\210\320\270\320\271_\320\274\320\265\321\202\320\276\320\264.md"
deleted file mode 100644
index 0e1df3c5..00000000
--- "a/en/05_Tutorials/02_Solutions/01_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262_MODx_\320\277\320\276_\320\264\320\260\320\275\320\275\321\213\320\274_\321\204\320\276\321\200\320\274\321\213_eForm_\321\203\321\201\321\202\320\260\321\200\320\265\320\262\321\210\320\270\320\271_\320\274\320\265\321\202\320\276\320\264.md"
+++ /dev/null
@@ -1,90 +0,0 @@
-Docmanager
-
-Для операций с документами будем использовать специальную библиотеку docmanager. Устанавливаем ее в папкуassets/libs/docmanager.
-
-Создаем форму
-
-Форма создается с помощью стандартного сниппета eForm. В него встроены все необходимые проверки полей, а также возможность отправить нам письмо о добавлении нового материала.
-
-Для примера сделаем такую форму в чанке Anketa:
-
-
[+validationmessage+]
-
-Вызов формы на сайте
-
-Для показа формы можно использовать следующий вызов:
-
-[!eForm? &formid=`newArticle` &subject=`Посетители прислали новый файл` &tpl=`Anketa` !]
-Важно! Параметр formid должен совпадать с одноименным скрытым полем формы.
-
-Обработчик полученных данных
-
-После того как мы получили все необходимые от пользователя данные нам необходимо их поместить в документ. Для это делаем новый сниппет с именем NewArticleEvent и в нем создаем свою функцию CreateNewArticle:
-
-function CreateNewArticle(&$fields){
- // Массив $fields будет содержать данные всех полей формы
- // Создания документа с описанием.
- require_once('assets/libs/docmanager/document.class.inc.php');
- $doc = new Document(); // создаем документ
- $doc->Set('parent',60); // определяем в какую папку положить
- $doc->Set('template','Статья'); // задаем шаблон
- $doc->Set('pagetitle',$fields['pagetitle']); // краткое название
- $doc->Set('introtext',$fields['introtext']); // аннотацию
- $doc->Set('content',$fields['content']); // основное содержимое
- // Далее пойдут TV-параметры
- $doc->Set('tvAvtor',$fields['avtor']); // автор
- $doc->Set('tvEmail',$fields['email']); // e-mail
- $doc->Set('tvLink',$fields['link']); // ссылка
- $doc->Save(); // сохраняем
- return true; // Говорим eForm, что все в порядке. }
-Вот такой простой код нам позволит полученные данные сохранить в документ. Названия сниппета и функции с обработчиком можно изменить при желании.
-
-Важно! Для указания TV-параметров перед названием необходимо добавлять приставку tv, то есть это не часть названия параметра.
-
-Подключаем обработчик к нашей форме
-
-eForm имеет несколько событий, которые мы можем перехватывать, но в данном случае нам нужно только eFormOnBeforeMailSent. Оно вызывается прямо перед отправкой формы и после того как все данные проверены на обязательность заполнения и формат. Изменяем немного вызов нашей формы и получаем следующий окончательный вид:
-
-[!NewArticleEvent!]
- [!eForm? &formid=`newArticle` &subject=`Посетители прислали новый файл` &tpl=`Anketa` &eFormOnBeforeMailSent=`CreateNewArticle`!]
-Важно! Чтобы событие eForm имело доступ к нашему обработчику необходимо сделать вызов сниппета с обработчиком сразу перед вызовом eForm. Название вызываемой функции задается в параметре вызова обработчика &eFormOnBeforeMailSent.
-
-PS: Таким образом можно создавать формы любой сложности и даже организовать закачку файлов.
-
-Визуальный редактор
-
-Чтобы посетителям было удобнее создавать статьи, можно использовать визуальный редактор tinyMCE. Для этого в страницу с формой нужно включить следующий код:
-
-
-
-Редактор tinyMCE хорошо настраивается. поэтому вы можете добавить инструменты, которые необходимы в вашем случае. А для того, чтобы eForm пропустил теги HTML необходимо добавить следующие параметры:
-
-&allowhtml=`1` &sendAsHtml=`1`
\ No newline at end of file
diff --git a/en/05_Tutorials/02_Solutions/index.md b/en/05_Tutorials/02_Solutions/index.md
index 4adc34f9..53a1ac8c 100644
--- a/en/05_Tutorials/02_Solutions/index.md
+++ b/en/05_Tutorials/02_Solutions/index.md
@@ -1 +1 @@
-Различные решения конкретных задач, которые можно использовать на своих сайтах.
\ No newline at end of file
+Various solutions to specific tasks that you can use on your sites.
diff --git a/en/05_Tutorials/03_Links/index.md b/en/05_Tutorials/03_Links/index.md
index 09c3b629..eb76597d 100644
--- a/en/05_Tutorials/03_Links/index.md
+++ b/en/05_Tutorials/03_Links/index.md
@@ -1,6 +1,5 @@
-Полезные ссылки
--------------------------
+# External Links
-[MODX.im](http://modx.im) - Сообщество по MODX
+[evo.im)](https://evo.im) - Evolution CMS
-[code.divandesign.ru](http://code.divandesign.ru) - Репозиторий студии «Диван.Дизайн».
\ No newline at end of file
+[code.divandesign.ru](http://code.divandesign.ru) - Repository of the studio "Divan.Design".
diff --git a/en/05_Tutorials/index.md b/en/05_Tutorials/index.md
index 4f8e89c0..0f98923a 100644
--- a/en/05_Tutorials/index.md
+++ b/en/05_Tutorials/index.md
@@ -1 +1 @@
-Здесь пока нет нужной информации
\ No newline at end of file
+Intentionally blank.
diff --git a/en/index.md b/en/index.md
index 897542fa..a1f80ad2 100755
--- a/en/index.md
+++ b/en/index.md
@@ -1,11 +1,11 @@
-#Документация по MODX Evolution
+# Evolution CMS documentation
-*Evolution CMS — это профессиональный инструмент разработки сайтов, позволяющий управлять контентом (да и самим сайтом) абсолютно на все 100%! Эта система с открытым кодом (open source), и поэтому бесплатна. В отличие от большинства бесплатных CMS на Evolution вы можете построить сайт любой сложности, практически с любым набором функций, при этом система не будет никоим образом влиять на ваш html-код.*
+* Evolution CMS is a professional website development tool that allows you to manage content and whole webpage at any capacity! This system is open source, and therefore free. Unlike most free CMS, on Evolution you can build a site of any complexity, with almost any set of functions, while the system will not in any way affect your HTML code. *
-## Как внести свой вклад
-1. Для начала у вас должен быть аккаунт на GitHub, если нет - [то его сделать очень просто](https://github.com/join).
-2. Сделать форк [https://github.com/evolution-cms/docs/](https://github.com/evolution-cms/docs/) к себе, нажав кнопку "Fork" справа вверху.
-3. Клонировать репозиторий к себе на диск и работать с ним локально, как и все (если вы разработчик)
-4. Если вы не разработчик, то можете просто отредактировать файлы *.md прямо на GitHub.
-5. Когда вы все сделали, вам следует [сделать "Pull Request"](https://help.github.com/articles/creating-a-pull-request) и отправить тем самым отправить изменения в этот репозиторий.
+## How to contribute
+1. First of all, you must already have an account on GitHub, if not - [it's very easy to set up](https://github.com/join).
+2. Make a fork of [https://github.com/evolution-cms/docs/](https://github.com/evolution-cms/docs/) by clicking the "Fork" button on the top right corner.
+3. You can clone the repository to your disk to work with it locally
+4. Or you can simply edit the * .md files directly on GitHub.
+5. When you're done, [make a "Pull Request"](https://help.github.com/articles/creating-a-pull-request) to submit and push your changes to our repository.
diff --git "a/ru/01_\320\236\320\261\321\211\320\260\321\217 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217/10_\320\237\320\276\320\264\321\200\320\276\320\261\320\275\320\265\320\265_\320\276_EvolutionCMS/05_\320\242\321\200\320\265\320\261\320\276\320\262\320\260\320\275\320\270\321\217_\320\272_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md" "b/ru/01_\320\236\320\261\321\211\320\260\321\217 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217/10_\320\237\320\276\320\264\321\200\320\276\320\261\320\275\320\265\320\265_\320\276_EvolutionCMS/05_\320\242\321\200\320\265\320\261\320\276\320\262\320\260\320\275\320\270\321\217_\320\272_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md"
index e69de29b..7bc337e9 100644
--- "a/ru/01_\320\236\320\261\321\211\320\260\321\217 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217/10_\320\237\320\276\320\264\321\200\320\276\320\261\320\275\320\265\320\265_\320\276_EvolutionCMS/05_\320\242\321\200\320\265\320\261\320\276\320\262\320\260\320\275\320\270\321\217_\320\272_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md"
+++ "b/ru/01_\320\236\320\261\321\211\320\260\321\217 \320\270\320\275\321\204\320\276\321\200\320\274\320\260\321\206\320\270\321\217/10_\320\237\320\276\320\264\321\200\320\276\320\261\320\275\320\265\320\265_\320\276_EvolutionCMS/05_\320\242\321\200\320\265\320\261\320\276\320\262\320\260\320\275\320\270\321\217_\320\272_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md"
@@ -0,0 +1,60 @@
+## Минимальные требования ##
+### Сервер ###
+* Linux x86, x86-64
+* Windows
+* Mac OS X
+* Web Server
+* Apache 1.3.x or Apache 2.2.x
+* IIS 6.0+
+* Zeus
+* lighthttpd
+* Cherokee
+
+### База данных ###
+* MySQL 4.1.20 или выше
+* Default table encoding of UTF-8
+* SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP
+* InnoDB and MyISAM table types
+
+
+### PHP ###
+* PHP 5.4
+* JSON
+* GD lib
+* Freetype
+* SimpleXML
+* safe_mode off
+* register_globals off
+* magic_quotes_gpc off
+* PHP memory_limit 24MB
+
+## Рекомендуемые требования ##
+### Сервер ###
+* Linux x86, x86-64
+* Windows Server 2008
+* Web Server
+* Apache 2.2.x
+* Nginx
+* IIS 7.0
+
+### База данных ###
+
+* MySQL 4.1.20 (latest stable release)
+* Default table encoding of UTF-8 BOM
+* SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP, CREATE TEMPORARY TABLES
+* InnoDB and MyISAM table types
+
+### PHP ###
+
+* PHP version 5.6 или больше
+* Running as FastCGI
+* zlib
+* JSON
+* cURL
+* Imagemagick
+* GD lib
+* SimpleXML
+* safe_mode off
+* register_globals off
+* magic_quotes_gpc off
+* PHP memory_limit 32MB или более
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\213\320\265_\321\200\320\276\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\213\320\265_\321\200\320\276\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md"
index c92d4d3a..abedafc1 100644
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\213\320\265_\321\200\320\276\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md"
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\213\320\265_\321\200\320\276\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md"
@@ -1,84 +1,79 @@
-
Административные роли и группы
-
Используя роли, группы документов и связь между пользователями и группами документов, вы можете контролировать каждый аспект управления вашим сайтом.
-
-
Прежде чем вы начнете
-
Убедитесь, что в разделе «Конфигурация системы» на вкладке «Пользователи» для параметра «Использовать права доступа» установлено значение «Да»
-
-
Терминология
-
Для дальнейшего понимания давайте договоримся о терминах:
-
-
Документ - основной элемент («страница») в Evolution CMS. Каждый документ может быть в одной или нескольких группах документов.
-
Группа документов - все документы, которые по какой-либо причине помещаются в одну группу. Например, это могут быть разделы сайта (продукты, портфолио или сервисы). Группа документов может быть связана с одной или несколькими группами пользователей.
-
Пользователь - объект, содержащий информацию о конкретном пользователе, такую как имя, пароль и т.д.
- Каждый пользователь может быть в любом количестве групп, но при этом его роль может быть только одна - администратор, редактор и т.д. Разрешения для пользователей определяются его ролью.
-
Роль. Как уже упоминалось, роль определяет разрешения для пользователя, которому назначена эта роль.
-
Группа пользователей - пользователи, которым необходим доступ к тем же группам документов. Группа пользователей может быть связана с одной или несколькими группам документов.
-
-
Как все это работает вместе? Роли определяют, что пользователю разрешено делать, а группы пользователей в сочетании с группами документов определяют, с какими документами может работать пользователь.
-
Предположим, у вас есть сайт для распространения программного обеспечения, которое поддерживает ваша компания. Вы решили, что сайт будет выглядеть так:
-
-
Главная
-
Новости
-
Продукты
-
-
Игры
-
Графические утилиты
-
Управление проектом
-
-
-
Поддержка
-
-
Вопросы-Ответы
-
Форумы
-
Контакты
-
Чат поддержки
-
-
-
О нас
-
-
Наша история
-
Наша философия
-
Наши люди
-
-
-
-
-
Роли
-
Для примера нам понадобятся эти роли:
-
-
Администраторы сайта - будут управлять пользователями и общей конфигурацией сайта.
-
Разработчики - будут писать код и работать с модулями, плагинами, сниппетами чанками и тв-параметрами
-
Дизайнеры - будут отвечать за внешний вид и расположение страниц сайта. Будет работать с шаблонами, чанками и CSS.
-
Редакторы контента - будут отвечать за содержание страниц. Будет работать с документами.
-
Корректоры - смогут редактировать, но не смогут создавать и удалять документы.
-
-
-
Группы документов
-
Рассмотрим, как будут группироваться документы на сайте.
-
-
Корпоративные - страницы, относящиеся к компании в целом, такие как страницы «О нас» и Главная страница.
-
Продукт - страницы, посвященные отдельным продуктам.
-
Поддержка - страницы, содержащие списки часто задаваемых вопросов или контактную информацию компании.
-
-
-
Группы пользователей
-
Группы пользователей, к которым будут принадлежать пользователи:
-
-
Маркетинг - будет обрабатывать корпоративные страницы
-
Продукты - будут работать со страницами, относящимися к продуктам компании.
-
Поддержка - позаботятся о страницах поддержки.
-
Корректоры - будут иметь доступ ко всем документам (но они будут ограничены разрешениями, предоставленными своей ролью).
-
-
-
-
Важная заметка
-
Пользователь может принадлежать любому количеству групп пользователей, но ему может быть присвоена только одна роль. Например, если вы хотите, чтобы один из Корректоров также являлся редактором документа поддержки, вам придется создать другого пользователя для входа в систему и назначить этого пользователя группе пользователей поддержки.
-
Помните, что Роли определяют, что именно ЧТО пользователь может сделать. Пользовательские группы назначают ДОКУМЕНТАМ, с которыми пользователь может работать, но он может выполнять только то, что ему позволит РОЛЬ.
-
-
Связь между группами пользователей и группами документов
-
Теперь нужно связать группы пользователей и группы документов, к которым мы хотим дать им доступ.
-
Например, группа пользователей "Корректоры" будет подключена ко всем группам документов, поскольку их работа будет заключаться в исправлении ошибок в документах. Группа пользователей "Маркетинг" должна иметь доступ к группам "Корпоративные" и "Поддержка". И, конечно, группа пользователей "Продукты" должна быть подключена к группе документов "Продукты".
-
-
-
При создании документа он должен быть привязан к соответствующей "группе" документов. Аналогично поступаем и с пользователями - по мере создания им назначаются определенные роли. Затем пользователи добавляются в соответствующие группы пользователей. Только пользователи из групп, подключенных к соотв. группе документов данного документа, могут иметь доступ к этому документу. И при этом, несмотря на то, что пользователь имеет доступ к документу, он может делать с ним только то, что позволяет его индивидуальная роль.
-
Таким образом, система ролей, пользователей и групп документов позволяет осуществлять достаточно тонкое разделение прав между пользователями и разделами сайта.
+Используя роли, группы документов и связь между пользователями и группами документов, вы можете контролировать каждый аспект управления вашим сайтом.
+
+## Прежде чем вы начнете
+
+Убедитесь, что в разделе «Конфигурация системы» на вкладке «Пользователи» для параметра «Использовать права доступа» установлено значение «Да»
+
+## Терминология
+
+Для дальнейшего понимания давайте договоримся о терминах:
+
+* Документ - основной элемент («страница») в Evolution CMS. Каждый документ может быть в одной или нескольких группах документов.
+* Группа документов - все документы, которые по какой-либо причине помещаются в одну группу. Например, это могут быть разделы сайта (продукты, портфолио или сервисы). Группа документов может быть связана с одной или несколькими группами пользователей.
+* Пользователь - объект, содержащий информацию о конкретном пользователе, такую как имя, пароль и т.д.
+ Каждый пользователь может быть в любом количестве групп, но при этом его роль может быть только одна - администратор, редактор и т.д. Разрешения для пользователей определяются его ролью.
+* Роль. Как уже упоминалось, роль определяет разрешения для пользователя, которому назначена эта роль.
+* Группа пользователей - пользователи, которым необходим доступ к тем же группам документов. Группа пользователей может быть связана с одной или несколькими группам документов.
+
+Как все это работает вместе? Роли определяют, что пользователю разрешено делать, а группы пользователей в сочетании с группами документов определяют, с какими документами может работать пользователь.
+
+Предположим, у вас есть сайт для распространения программного обеспечения, которое поддерживает ваша компания. Вы решили, что сайт будет выглядеть так:
+
+* Главная
+* Новости
+* Продукты
+ * Игры
+ * Графические утилиты
+ * Управление проектом
+* Поддержка
+ * Вопросы-Ответы
+ * Форумы
+ * Контакты
+ * Чат поддержки
+* О нас
+ * Наша история
+ * Наша философия
+ * Наши люди
+
+## Роли
+
+Для примера нам понадобятся эти роли:
+
+* Администраторы сайта - будут управлять пользователями и общей конфигурацией сайта.
+* Разработчики - будут писать код и работать с модулями, плагинами, сниппетами чанками и тв-параметрами
+* Дизайнеры - будут отвечать за внешний вид и расположение страниц сайта. Будет работать с шаблонами, чанками и CSS.
+* Редакторы контента - будут отвечать за содержание страниц. Будет работать с документами.
+* Корректоры - смогут редактировать, но не смогут создавать и удалять документы.
+
+## Группы документов
+
+Рассмотрим, как будут группироваться документы на сайте.
+
+* Корпоративные - страницы, относящиеся к компании в целом, такие как страницы «О нас» и Главная страница.
+* Продукт - страницы, посвященные отдельным продуктам.
+* Поддержка - страницы, содержащие списки часто задаваемых вопросов или контактную информацию компании.
+
+## Группы пользователей
+
+Группы пользователей, к которым будут принадлежать пользователи:
+
+* Маркетинг - будет обрабатывать корпоративные страницы
+* Продукты - будут работать со страницами, относящимися к продуктам компании.
+* Поддержка - позаботятся о страницах поддержки.
+* Корректоры - будут иметь доступ ко всем документам (но они будут ограничены разрешениями, предоставленными своей ролью).
+
+### Важная заметка
+
+Пользователь может принадлежать любому количеству групп пользователей, но ему может быть присвоена только одна роль. Например, если вы хотите, чтобы один из Корректоров также являлся редактором документа поддержки, вам придется создать другого пользователя для входа в систему и назначить этого пользователя группе пользователей поддержки.
+
+Помните, что Роли определяют, что именно ЧТО пользователь может сделать. Пользовательские группы назначают ДОКУМЕНТАМ, с которыми пользователь может работать, но он может выполнять только то, что ему позволит РОЛЬ.
+
+## Связь между группами пользователей и группами документов
+
+Теперь нужно связать группы пользователей и группы документов, к которым мы хотим дать им доступ.
+
+Например, группа пользователей "Корректоры" будет подключена ко всем группам документов, поскольку их работа будет заключаться в исправлении ошибок в документах. Группа пользователей "Маркетинг" должна иметь доступ к группам "Корпоративные" и "Поддержка". И, конечно, группа пользователей "Продукты" должна быть подключена к группе документов "Продукты".
+
+При создании документа он должен быть привязан к соответствующей "группе" документов. Аналогично поступаем и с пользователями - по мере создания им назначаются определенные роли. Затем пользователи добавляются в соответствующие группы пользователей. Только пользователи из групп, подключенных к соотв. группе документов данного документа, могут иметь доступ к этому документу. И при этом, несмотря на то, что пользователь имеет доступ к документу, он может делать с ним только то, что позволяет его индивидуальная роль.
+
+Таким образом, система ролей, пользователей и групп документов позволяет осуществлять достаточно тонкое разделение прав между пользователями и разделами сайта.
\ No newline at end of file
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/20_Reset_your_Password_-_Unblock_your_User.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/20_Reset_your_Password_-_Unblock_your_User.md"
deleted file mode 100644
index 98f07cb1..00000000
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/20_Reset_your_Password_-_Unblock_your_User.md"
+++ /dev/null
@@ -1,56 +0,0 @@
-
We all have it happen at one point in time or another… We forgot our admin interface username/password, and then trying the different options we get blocked!
-
Database Editor to the Rescue
-
The secret to regaining access, your database editor, usually PHPMyAdmin granted other editors will work just fine.
-
The first step is to open your database editor and browse to your Evo database.
-
Forgotten Password
-
-
-
Open the (PREFIX)_manager_users table (where (PREFIX) is your table prefix)
-
-
-
Edit the record for your username
-
-
-
Change the password filed to: e10adc3949ba59abbe56e057f20f883e (Your password will be: 123456)
-
-
-
Save the change
-
-
-
If you aren't blocked attempt to login with the new password
-
-
-
Change the password after you login!
-
Advanced Tip
- You can set any password by changing the drop down field type to MD5. Just enter the desired password instead of the above hash.
-
-
-
Block Too
-
-
Open the (PREFIX)_user_attributes table (where (PREFIX) is your table prefix)
-
Edit the record for your user (The admin user is typically id 1)
-
Change the blocked column value from 1 to 0
-
Save the change
-
Attempt to login using your username and password (or newly set password from above)
-
-
Limited Access
-
In some cases you may not have access to a database editor readily available, in those cases it is still possible to restore admin interface access. You will need to upload your own database editor, such as phmyedit.
-
You only need basic functionality, so a smaller editor will save you some time. Once uploaded you can copy the database information from the Evo config file (manager/includes/config.inc.php).
-
This can be helpful should the client be abandon by their prior developer, their hosting company not provide access to a database editor, or you are in a pinch and only have FTP access.
-
Add a user via MySQL
-
It is possible to add a new admin user without going through the Admin Interface, if possible you should always use the admin interface.
-
You will need to add two records to different tables, your database may not have the default prefix, if this is the case look for the same table name without the default prefix.
-
-
Open the (PREFIX)_manager_users table
-
Create a new record with the desired username and password (see forgot password for a hash to use)
-
If you are able to run SQL commands you may optionally run:
INSERT INTO user_attributes (InternalKey,role) VALUES ('4','1');
-
Once you have created both records you should be able to login to the manager using the username and password set in step 2. Once logged in make sure to change your password!
\ No newline at end of file
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/20_\320\241\320\261\321\200\320\276\321\201_\320\277\320\260\321\200\320\276\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217_\320\270_\321\200\320\260\320\267\320\261\320\273\320\276\320\272\320\270\321\200\320\276\320\262\320\272\320\260.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/20_\320\241\320\261\321\200\320\276\321\201_\320\277\320\260\321\200\320\276\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217_\320\270_\321\200\320\260\320\267\320\261\320\273\320\276\320\272\320\270\321\200\320\276\320\262\320\272\320\260.md"
new file mode 100644
index 00000000..30c558d0
--- /dev/null
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/20_\320\241\320\261\321\200\320\276\321\201_\320\277\320\260\321\200\320\276\320\273\321\217_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217_\320\270_\321\200\320\260\320\267\320\261\320\273\320\276\320\272\320\270\321\200\320\276\320\262\320\272\320\260.md"
@@ -0,0 +1,42 @@
+Для разблокировки и смены пароля в Evolution CMS вам потребуется доступ к базе данных сайта.
+
+## Снять блокировку пользователя через MySQL ##
+
+* Откройте таблицу PREFIX_user_attributes (где PREFIX - префикс таблиц вашего сайта)
+* Найдите запись для своего пользователя (пользователь admin обычно имеет идентификатор 1)
+* Измените значение столбцов blocked и blockeduntil на 0
+
+Попытайтесь войти в систему, используя свое имя пользователя и пароль (или новый пароль)
+
+## Сменить пароль пользователя через MySQL ##
+
+* Откройте таблицу PREFIX_manager_users (где PREFIX префикс таблиц вашего сайта)
+* Найдите запись своего пользователя
+* Измените поле password на: e10adc3949ba59abbe56e057f20f883e (ваш пароль будет: 123456)
+* Сохраните изменения
+
+Если вы не заблокированы (смотрите выше, как снять блок), то сможете войти на сайт.
+
+** Измените пароль после входа в систему! **
+
+## Как добавить пользователя через MySQL ##
+
+Вам нужно будет добавить две записи в разные таблицы
+
+* Откройте таблицу PREFIX_manager_users
+* Создайте новую запись с нужным именем пользователя и хэшем пароля (ваш пароль будет: 123456)
+
+```
+INSERT INTO manager_users (username,password) VALUES ('yourname','e10adc3949ba59abbe56e057f20f883e');
+```
+
+** После добавления записи обратите внимание на id для вашего пользователя, он вам понадобится.**
+
+* Откройте таблицу PREFIX_user_attributes
+* Создайте новую запись с ролью 1, где InternalKey должен быть равен тому номеру, который вы хотели запомнить выше, но уже забыли.
+```
+INSERT INTO user_attributes (InternalKey,role) VALUES ('4','1');
+```
+После того, как созданы обе записи, вы сможете войти в панель администрирования, используя имя пользователя и 123456.
+
+** После входа в систему обязательно смените пароль!**
\ No newline at end of file
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/30_Why_Admin_Users,_Roles_and_Groups.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/30_Why_Admin_Users,_Roles_and_Groups.md"
deleted file mode 100644
index 60a1af23..00000000
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/30_Why_Admin_Users,_Roles_and_Groups.md"
+++ /dev/null
@@ -1,5 +0,0 @@
-
The primary reason for setting up admin users and groups is to be able to control access to the documents in the Document Tree. Admin interface users are stored separately from web (front-end) users for security reasons. A web user cannot log into the back-end nor can an Admin user log into the web site (front-end).
-
Admin Roles are also used to control access to system management functions.
-
Each admin user is assigned a Role that controls what permissions he is granted in areas of system and user administration and document management. An Admin user can only be assigned one Role.
-
Admin users are assigned to one or more admin user groups:
-
Both "Admin User Groups" and "Web User Groups" can be assigned to the same "Document Group."
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/30_\320\227\320\260\321\207\320\265\320\274_\320\275\321\203\320\266\320\275\321\213_\320\263\321\200\321\203\320\277\320\277\321\213_\320\270_\321\200\320\276\320\273\320\270.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/30_\320\227\320\260\321\207\320\265\320\274_\320\275\321\203\320\266\320\275\321\213_\320\263\321\200\321\203\320\277\320\277\321\213_\320\270_\321\200\320\276\320\273\320\270.md"
new file mode 100644
index 00000000..865a07b7
--- /dev/null
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\260\321\202\320\276\321\200\321\213/30_\320\227\320\260\321\207\320\265\320\274_\320\275\321\203\320\266\320\275\321\213_\320\263\321\200\321\203\320\277\320\277\321\213_\320\270_\321\200\320\276\320\273\320\270.md"
@@ -0,0 +1,11 @@
+Основная причина для настройки пользователей и групп администратора - иметь возможность контролировать доступ к документам в дереве документов. Пользователи интерфейса администратора хранятся отдельно от веб-пользователей по соображениям безопасности.
+
+Веб-пользователь не может войти в /manager/, а пользователь Admin не может войти на веб-сайт.
+
+Роли администратора также используются для управления доступом к функциям управления системой.
+
+Каждому пользователю администратора назначается роль, которая контролирует, какие разрешения ему предоставляются в областях администрирования системы, пользователей и управления документами. Пользователю Admin может назначаться только одна роль.
+
+Пользователи-администраторы назначаются одной или нескольким группам пользователей.
+
+При этом «Группы менеджеров», и «Группы веб-пользователей» можно присвоить той же «группе документов».
\ No newline at end of file
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/10_Creating_a_Web_User.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/10_Creating_a_Web_User.md"
deleted file mode 100644
index caf30643..00000000
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/10_Creating_a_Web_User.md"
+++ /dev/null
@@ -1,29 +0,0 @@
-
Before You Begin
-
Make sure that "Use access permissions" is set to Yes in the User tab of Tools -> Configuration.
-
Adding the User
-
To add the web user, follow these steps:
-
-
-
Log in to the Evo Admin Interface.
-
-
-
Next, Click the "New web user" link.
-
-
-
Fill out the necessary information in the fields provided. Username, Password, Full name and E-mail address are required fields.
-
Note: Passwords are not stored in plain text form, so make sure you take note of the password if you do not have it emailed to the new user!
-
-
-
You can also set a login home page in the "User Settings" tab and enter the document ID (the document ID can easily be seen in the Document Tree panel to the right) in the field provided.
-
-
-
Finally, select the user group(s) to which you want the user to be assigned.
-
-
-
Click the Save button to save the user.
-
-
-
Now that we've successfully created our web user account and have assigned the user to a web user group, we can secure documents by assigning them to a corresponding document group.
-
Setting up the login snippet
-
In order for the web users to be able to access your secure pages you must provide them with a login screen. To do this you can use the [[WebLogin]] Snippet. See the WebLogin snippet for more information.
-
Note: Pages with cache enabled will cache new menu items when a web user logs in. It's best to either not cache your restricted pages or use non-cacheable menu snippet tags ([!…!]).
\ No newline at end of file
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/10_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/10_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
new file mode 100644
index 00000000..fbdc87a8
--- /dev/null
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/10_\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
@@ -0,0 +1,20 @@
+## Добавление пользователя из панели администрирования ##
+Чтобы добавить веб-пользователя, выполните следующие действия:
+* Войдите в интерфейс администратора Evolution CMS.
+* Затем нажмите "Пользователи" -"Управление веб-пользователями" - "Новый веб-пользователь".
+* Заполните необходимую информацию в соответствующих полях. Имя пользователя, пароль и адрес электронной почты являются обязательными.
+* Дополнительно вы можете установить домашнюю страницу входа на вкладке "Настройки пользователя" и ввести идентификатор документа (идентификатор документа можно легко увидеть на панели дерева документов слева)
+* Выберите группу пользователей,в которую вы хотите определить пользователя.
+* Нажмите кнопку «Сохранить», чтобы сохранить пользователя.
+
+**Примечание.** Пароли не хранятся в текстовой форме, поэтому обратите внимание на пароль, если он вам необходим в дальнейшем. Пароль нельзя посмотреть, его можно только сменить.
+
+Теперь, когда вы успешно создали учетную запись веб-пользователя и назначили пользователя группе, можно защитить документы, назначив их соответствующей группе документов.
+
+## Настройка входа в систему ##
+Чтобы пользователи могли получать доступ к защищенным страницам, вы должны предоставить им возможность входа в систему. Для этого можно использовать сниппеты [FormLister](http://docs.evo.im/04_extras/formlister/avtorizaciya_polzovateley.html)(рекомендуется) или WebLogin.
+
+**Примечание.** Страницы с включенным кешем будут кэшировать элементы при входе в систему. Лучше не кэшировать критичные для пользователя элементы.
+
+## Добавление пользователя из веб-интерфейса ##
+Для реализации регистрации на сайте воспользуйтесь сниппетом [FormLister](http://docs.evo.im/04_extras/formlister/registraciya_polzovateley.html)(рекомендуется) или WebSignup
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/20_Web_User_Groups_and_Document_Groups.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/20_Web_User_Groups_and_Document_Groups.md"
deleted file mode 100644
index 2868382d..00000000
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/20_Web_User_Groups_and_Document_Groups.md"
+++ /dev/null
@@ -1,22 +0,0 @@
-
Before You Begin
-
Make sure that "Use access permissions" is set to Yes in the User Settings tab of System Configuration.
-
Creating the Groups
-
To create the web user and document groups, follow these steps:
-
-
-
Log in to the Evo Admin Interface.
-
-
-
From the "Security" menu select "Web Permissions".
-
-
-
On "Web User groups" tab, enter the name of the group then click the submit button.
-
-
-
To create a Document Group, click on the "Document groups" tab. Similar to the web group, you must enter the name of the document group then click the submit button. The page will then refresh showing the new document group.
-
-
-
Now that we have created a web user and document group we now need to link the two together. To do this, click on the "User / Document group links" tab. Click on the "Add Group" button to assign the document group to the web user group.
-
-
-
You can use the "Remove button" to later remove the group.
\ No newline at end of file
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/20_\320\223\321\200\321\203\320\277\320\277\321\213_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/20_\320\223\321\200\321\203\320\277\320\277\321\213_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md"
new file mode 100644
index 00000000..8349e872
--- /dev/null
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/20_\320\223\321\200\321\203\320\277\320\277\321\213_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\265\320\271_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\320\276\320\262.md"
@@ -0,0 +1,13 @@
+## Прежде чем вы начнете ##
+Убедитесь, что в разделе "Конфигурация системы" на вкладке "Пользователи" для параметра "Использовать права доступа" установлено значение "Да".
+
+## Создание групп ##
+Чтобы создать веб-пользователя и группы документов, выполните следующие действия:
+* Войдите в интерфейс администратора Evolution CMS.
+* Перейдите из меню "Пользователи" в "Права доступа для веб-пользователей"
+* На вкладке "Группы веб-пользователей" введите имя группы и нажмите кнопку "Выполнить".
+* Чтобы создать группу документов, перейдите на вкладку "Группы ресурсов". Подобно веб-группе, вы должны ввести имя группы документов и нажать кнопку отправки. Затем страница обновится, показывая новую группу документов.
+
+Теперь, когда мы создали веб-пользователя и группу документов, нужно связать их вместе. Для этого перейдите на вкладку «Связи групп пользователей и документов». Нажмите кнопку "Добавить группу", чтобы назначить группу документов группе веб-пользователей
+
+Вы можете использовать кнопку "Удалить", чтобы позже удалить группу.
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/30_Why_Web_Users_and_Groups.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/30_Why_Web_Users_and_Groups.md"
deleted file mode 100644
index 5d370887..00000000
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/30_Why_Web_Users_and_Groups.md"
+++ /dev/null
@@ -1,13 +0,0 @@
-
The primary reason for setting up web users and groups is to be able to secure access to selected pages on the web. Users on the web are stored separately and apart from admin (back-end) users for security reasons. A web user cannot log into the back-end nor can a back-end user log into the web site (front-end). You would have to use separate accounts to do this. Here's how it works:
-
Back-end users are assigned to back-end user groups:
-
-
Web users are assigned to web groups:
-
-
Both "Back-end User Groups" and "Web User Groups" can be assigned to the same "Document Group".
-
-
An Example
-
From the Web (Front-end):
-
-
From the Admin (Back-end):
-
-
Note: A document is flagged as private whenever the document group that it belongs to is assigned or is linked to a user group. In other words if the document is assigned to a document group that is not yet linked to a user group then that document will be made public. Documents that are private to the admin users will not be private to web users if the document group is not assigned to a web user group and vice versa.
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/30_\320\227\320\260\321\207\320\265\320\274_\320\275\321\203\320\266\320\275\321\213_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/30_\320\227\320\260\321\207\320\265\320\274_\320\275\321\203\320\266\320\275\321\213_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md"
new file mode 100644
index 00000000..2c344141
--- /dev/null
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/01_\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270/30_\320\227\320\260\321\207\320\265\320\274_\320\275\321\203\320\266\320\275\321\213_\320\262\320\265\320\261-\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\320\270_\320\270_\320\263\321\200\321\203\320\277\320\277\321\213.md"
@@ -0,0 +1,18 @@
+Настройка веб-пользователей и групп нужна для разделения доступа веб-пользователей к различным разделам сайта
+
+По соображениям безопасности в Evolution CMS пользователи делятся на два типа: веб-пользователи и пользователи панели администрирования (менеджеры).
+
+**Веб-пользователь не может войти в панель администрирования сайта.**
+
+### Правила ###
+* Менеджерам назначаются свои группы пользователей.
+* Веб-пользователям назначаются свои веб-группы.
+* При этом «Группы пользователей» и «Группы веб-пользователей» могут быть добавлены к одной и той же «Группе документов».
+
+**Примечание.**
+
+Документ будет приватным, если группа документов, к которой он принадлежит, связана с группой пользователей.
+
+Если документ присваивается группе документов, которая еще не связана с группой пользователей, этот документ будет опубликован.
+
+Документы, которые являются приватными для менеджеров, не будут закрыты для веб-пользователей, если группа документа не присвоена какой-то другой группе веб-пользователей.
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/02_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/20_\320\242\320\265\320\263\320\270_Evolution/index.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/02_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/20_\320\242\320\265\320\263\320\270_Evolution/index.md"
index e69de29b..272b4ce6 100644
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/02_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/20_\320\242\320\265\320\263\320\270_Evolution/index.md"
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/02_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/20_\320\242\320\265\320\263\320\270_Evolution/index.md"
@@ -0,0 +1,145 @@
+## Введение ##
+
+В шаблонах Evolution CMS используются различные теги, которые служат для формирования контента. Теги дают простой, но эффективный способ включать в контент веб-страницы различные данные.
+
+**Виды используемых тегов**
+
+* [[snippet]] - результат работы кэшируемого сниппета.
+* [!snippet!] - то же, но без кэширования
+* [(setting)] - любое значение из настроек сайта. Чаще всего используется что-то вроде [(site_name)].
+* [\*resourceField\*] - ТВ-параметр или поле ресурса
+* [^timing^] - время выполнения скриптов
+* [ ~ link ~ ] - ссылка на ресурс
+* {{chunk}} - чанк
+* [+placeholder+] - плейсхолдер
+
+
+## Сниппеты ##
+
+Сниппеты - это просто PHP-код, выход которого отображается в месте размещения тега сниппетта.
+
+Чтобы выполнить сниппет, вставьте его в документе, чанке или шаблоне, где нужно отобразить вывод результатов его работы.
+
+
+## Настройки ##
+
+В тегах настроек находятся параметры системы. Например, [(site_name)] вставит имя сайта. Это часто используется в заголовках страниц.
+
+Список настроек можно найти в базе данных Evolution в таблице PREFIX_system_settings, где PREFIX это префикс ваших таблиц.
+
+**Список настроек:**
+
+* [(allow_duplicate_alias)] - разрешены или нет повторяющиеся псевдонимы при использовании дружественных URL
+* [(automatic_alias)] - генерируются ли псевдонимы документов на основе заголовков страниц автоматически
+* [(base_url)] или [(site_url)] - адрес сайта
+* [(cache_default)] - документ 'кэшируемый' по умолчанию
+* [(captcha_words)] - слова, используемые для настройки Captcha
+* [(custom_contenttype)] - разделенный запятыми список типов содержимого, обслуживаемых MODx
+* [(default_template)] - идентификатор шаблона используемого по умолчанию для новых документов
+* [(editor_css_path)] - путь к CSS-файлу используемого визуальным редактором
+* [(emailsender)] - основной адрес электронной почты на сайте
+* [(emailsubject)] - тема письма подтверждения регистрации веб-пользователей
+* [(error_page)] - идентификатор страницы ошибки '404'
+* [(etomite_charset)] или [(modx_charset)] - кодировка сайта
+* [(fck_editor_autolang)] - указывает, установлен ли FCKeditor для автоматического определения языка
+* [(fck_editor_style)] - указывает стиль используемый в FCKeditor
+* [(fck_editor_toolbar)] - указывает на пользовательскую панель инструментов, добавленную в FCKeditor
+* [(filemanager_path)] - корневая папка для доступа файлового менеджера MODx
+* [(friendly_alias_urls)] - используются ли псевдонимы в дружественных URL
+* [(friendly_urls)] - используются ли дружественные URL
+* [(friendly_url_prefix)] - префикс для дружественных URL
+* [(friendly_url_suffix)] - суффикс для дружественных URL
+* [(manager_language)] - язык системы управления
+* [(manager_theme)] - шаблон системы управления
+* [(number_of_logs)] - количество записей протокола на одной странице
+* [(number_of_messages)] - количество сообщений на одной странице
+* [(number_of_results)] - количество элементов, отображаемых в списках и результатах поиска
+* [(publish_default)] - публикация новых ресурсов после создания по умолчанию
+* [(rb_base_dir)] - физический путь к папке файлов
+* [(rb_base_url)] - адрес (URL) папки файлов
+* [(search_default)] - новые ресурсы после создания доступны для поиска по умолчанию
+* [(server_offset_time)] - поправка (количество часов) между временем на месте вашего пребывания и на месте нахождения сервера
+* [(server_protocol)] - HTTP или HTTPS (SSL) соединение
+* [(settings_version)] - версия системы
+* [(signupemail_message)] - сообщение, которое будет отсылаться менеджерам, когда создается учетная запись нового менеджера
+* [(site_name)] - название сайта
+* [(site_start)] - идентификатор стартовой страницы
+* [(site_status)] - статус сайта online (1) или offline (0)
+* [(site_unavailable_message)] - сообщение, выводимое в случае недоступности сайта (когда выбран статус 'Оффлайн') или в случае возникновения ошибки. Это сообщение выводится только в том случае, когда не выбрана страница 'Сайт недоступен'
+* [(site_unavailable_page)] - идентификатор ресурса, который должны будут увидеть посетители, если попытаются зайти на сайт, когда он недоступен
+* [(strip_image_paths)] - используются абсолютные или относительные ссылки для изображений, файлов, анимации и т.д.
+* [(top_howmany)] - количество лучших показателей в отчетах статистики
+* [(track_visitors)] - регистрировать посещения
+* [(udperms_allowroot)] - разрешено ли пользователям создавать ресурсы в корневой папке
+* [(unauthorized_page)] - ID ресурса, который должны будут увидеть посетители, если попытаются зайти на закрытую страницу (403 – доступ запрещен)
+* [(upload_files)] - разделенный запятыми список расширений файлов, которые могут быть загружены через файловый менеджер
+* [(upload_maxsize)] - максимальный размер загружаемых файлов в байтах
+* [(use_alias_path)] - используются вложенные URL
+* [(use_captcha)] - использовать код CAPTCHA при авторизации
+* [(use_editor)] - использовать HTML-редактор
+* [(use_udperms)] - права доступа юзера
+* [(webpwdreminder_message)] - сообщение, которое будет отсылаться веб-пользователям, когда они запрашивают напоминание пароля
+* [(websignupemail_message)] - сообщение, которое будет отсылаться веб-пользователям, когда создается учетная запись нового веб-пользователя
+* [(which_editor)] - используемый HTML-редактор
+
+## Поля ресурсов ##
+
+Теги ресурсов могут отображать основные атрибуты ресурсов, которые находятся в базе данных в таблице PREFIX_site_content.
+
+Это наиболее часто используемые теги ресурса:
+
+* [\*pagetitle\*] - название документа
+* [\*longtitle\*] - длинное название документа
+* [\*introtext\*] - сводка документа
+* [\*content\*] - содержание документа
+
+
+## Переменные шаблона ##
+
+ТВ-параметры - это мощный способ вставки блоков контента, характерных для отображаемой страницы.
+
+ТВ-параметры могут быть настроены для конкретного документа.
+
+## Тайминг ##
+В Evo есть несколько тегов времени:
+
+* [^qt^] - время на запросы к базе данных
+* [^q^] - запросов к базе данных
+* [^p^] - время на работу PHP скриптов
+* [^t^] - общее время на генерацию страницы
+* [^s^] - источник содержимого (база или кэш)
+* [^m^] - размер кэша (опционально)
+
+## Ссылки ##
+
+Чтобы вставить ссылку на другой документ, просто поместите номер идентификатора документа в тег ссылки. Например, [~ 123 ~] создаст ссылку на документ с идентификатором 123.
+
+## Чанки ##
+В чанках содержится простой текст, обычно HTML-код, который будет просто вставлен на страницу.
+
+Они очень удобны для хранения общего содержимого. Например, если футер содержит номер телефона, а номер изменяется, вам нужно внести изменения только в чанк, а не на каждую страницу сайта.
+
+## Плейсхолдеры ##
+
+Наиболее часто плейсхолдеры нужны для темизации вывода сниппета.
+
+```
+
+```
+
+Плейсхолдеры могут использоваться где угодно в любом HTML-коде.
+
+Хорошим примером этого является сниппет Persinalize. Он просто возвращает имя веб-пользователя в плейсхолдер.
+
+Но вы можете поместить сниппет один раз в свой шаблон или документ, а затем поместить плейсхолдер в столько мест, сколько захотите, например, в приветствии в верхней части страницы и в разделе «выход из системы».
+
+## Комбинируйте! ##
+
+Используя комбинации сниппетов, ТВ-параметров и чанков, вы можете сделать свой сайт довольно гибким! Например, у вас может быть сниппет, результаты работы которого будут зависеть от переданных ТВ-параметров, а внешний вид будет темизироваться чанками с плейсхолдерами внутри.
+
+Подробнее обо всех видах тегов и их использовании вы можете прочитать в документации разработчика.
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md"
index 813395f6..bcef3bd8 100644
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md"
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/01_\320\247\321\202\320\276_\321\202\320\260\320\272\320\276\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md"
@@ -1,137 +1,32 @@
-Использование шаблона
+Шаблон в Evolution CMS - основная неизменяемая часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
-Шаблон в Evolution - основная неизменяемая часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
-
-Количество шаблонов чаще всего зависит от числа различных видов оформления. Так как каждый документ в Evolution имеет привязку к конкретному шаблону, что и определяет его конечный вид.
+Количество шаблонов зависит от дизайна и функционала сайта. Каждый документ в Evolution имеет привязку к конкретному шаблону, что и определяет его конечный вид.
Стоит упомянуть также, что существует специальный шаблон blank, который не содержит никакого оформления и не поддается редактированию.
-####Пример шаблона:
-
-
-
-[*pagetitle*]
-
-
-
-
-
-[[Wayfinder? &startId=`5` &level=`1`]]
-
-
-{{Поиск}}
-
-
-
-
[*longtitle*]
- [*content*]
-
-
-
-{{Подвал}}
-
-{{Google}}
-
-
-Как мы видим - это вполне понятная HTML-разметка страницы в которой используются специальные конструкции. Среди них:
-
-Чанки - {{Поиск}}, {{Подвал}}, {{Google}}
-
-Параметры - [*pagetitle*], [*longtitle*], [*content*], [(site_url)]
-
-Сниппет - [[Wayfinder? &startId=`5` &level=`1`]]
-
-Создание и редактирование шаблона
-
-Все шаблоны находятся в следующем месте:
-
-Ресурсы → Управление ресурсами → Шаблон
-Список шаблонов выглядит следующим образом:
-
-Список шаблонов MODX EVO
-
-Для создания необходимо нажать на ссылку Новый шаблон, а для редактирования существующего шаблона достаточно нажать на ссылку с его названием. Появится следующая форма:
-
-Создание шаблона в MODX EVO
-
-Назначение полей
-
-Имя шаблона - используется в списке выбора шаблона. Также может понадобиться для некоторых операций сниппетов. Можно использовать как английский так и русский язык, а также дефис (-), знак подчеркивания (_) и пробел.
-
-Описание - выводится рядом с названием шаблона в общем списке. Используется только для описания назначения шаблона и для заполнения не обязательно.
-
-Создать категорию - позволяет выбрать существующую категорию, в которую будет помещен шаблон. Категория позволяет отделить шаблон от остальных в общем списке. Если ни одна категория не выбрана, то шаблон попадет в общую категория Без категории.
-
-Новая категория - если в списке существующих категорий нет подходящей, то можно создать ее просто написав название в этом поле.
-
-Ограничить доступ к редактированию шаблона - если включить флажок, то никто кроме администраторов не сможет редактировать этот шаблон.
-
-Код шаблона (html) - сюда размещается само содержимое шаблона.
-
-Сохранение
-
-Обратим внимание на возможности при сохранении. Для этого есть следующие управляющие кнопки:
+## Расположение шаблонов: ##
+``
+Элементы - Шаблоны
+``
-Кнопки управления шаблоном в MODX EVO
+## Шаблон по умолчанию ##
-С основными кнопками все понятно:
-
-Сохранить - создаст новый шаблон
-
-Отмена - вернет нас в список шаблонов без сохранения результата.
-
-Сделать копию - появляется только в режиме редактирования. Смотрите пункт Создание копии шаблона.
-
-Удалить - появляется только в режиме редактирования. Смотрите пункт Удаление шаблона.
-
-Но MODx позволяет определить еще действие после сохранения шаблона:
-
-Создать новый - сразу после сохранения шаблона откроется форма для создания нового. Таким образом можно быстро создать серию шаблонов.
-
-Продолжить редактирование - после сохранения шаблон снова откроется для редактирования. В этом режиме удобно вносить небольшие правки и проверять конечный результат.
-
-Закрыть - после сохранения мы вернемся в общий список шаблонов.
-
-Создание копии шаблона
-
-Иногда бывает необходимо создать копию существующего шаблона. Сделать это очень просто. Для этого необходимо зайти в редактирование нужного шаблона и нажать на кнопку Сделать копию.
-
-Кнопки управления шаблоном в MODX EVO
-
-На всякий случай система попросит от вас подтверждение:
-
-Копия шаблона в MODX EVO
-
-После этого откроется для редактирования копия шаблона. Копия отличается тем, что к ее названию добавляется Duplicate of. Вам остается только исправить название на более подходящее и внести другие необходимые правки.
-
-Копия создается сразу после подтверждения, поэтому если вы нажмете отмену, то в списке шаблонов копия все равно останется.
-
-Удаление шаблона
-
-Для удаления необходимо зайти в режим редактирования соответствующего шаблона и нажать кнопку Удалить.
-
-Кнопки управления шаблоном в MODX EVO
-
-После этого система попросит от вас подтверждение:
-
-Удаление шаблона в MODX EVO
-
-Внимание! Шаблоны удаляются полностью и возможности их восстановить нет.
-
-Шаблон по умолчанию
-
-При создании документа автоматически предлагается шаблон по умолчанию (если отключен плагин Inherit Parent Template). Удобнее всего когда предлагается именно тот шаблон, который необходим чаще всего. Для настройки шаблона по умолчанию необходимо выполнить следующие действия:
+При создании документа автоматически предлагается шаблон по умолчанию (если иное поведение не определено плагинами).
+Удобнее всего, когда предлагается именно тот шаблон, который необходим чаще всего. Для этого необходимо настроить шаблон по умолчанию:
Переходим в настройки системы управления:
-Инструменты → Конфигурация → Сайт
-Находим параметр Шаблон по умолчанию и меняем на нужный
+```
+Конфигурация - Сайт
+```
+Находим параметр **Шаблон по умолчанию** и меняем на нужный
Сохраняем настройки.
-FAQ
+
+## FAQ ##
Есть ли какие-то ограничения на шаблоны дизайна для сайта?
-Абсолютно никаких. MODx позволяет реализовать любой дизайн.
+Абсолютно никаких. Evolution позволяет реализовать любой дизайн.
-Где можно взять готовые шаблоны?
+## Где можно взять готовые шаблоны? ##
-MODx позволяет легко использовать любой сверстанный HTML-макет, который можно заказать у специалистов или найти на специализированных сайтах. Готовых шаблонов именно для MODx не так много, но они есть.
\ No newline at end of file
+Evolution CMS позволяет легко использовать **любой** сверстанный HTML-макет, который можно заказать у специалистов или найти на специализированных сайтах.
diff --git "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/30_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\276\320\262.md" "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/30_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\276\320\262.md"
index 481b21c9..94fde5d3 100644
--- "a/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/30_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\276\320\262.md"
+++ "b/ru/02_\320\237\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\216/03_\320\240\320\260\320\261\320\276\321\202\320\260_\321\201_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\320\271/30_\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\320\265_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\276\320\262.md"
@@ -1,6 +1,6 @@
Сниппеты являются одной из самых полезных функций системы Evolution.
-Сниппеты используются вывода динамически меняющегося содержимого - меню, комментариев, новостных лент, блогов или любого другого функционала, который возможен на языке php в связке с API системы Evolution.
+Сниппеты используются для вывода динамически меняющегося содержимого - меню, комментариев, новостных лент, блогов или любого другого функционала, который возможен на языке php в связке с API системы Evolution.
В этом документе обсуждается использование сниппетов. Чтобы узнать больше о том, как создавать сниппеты и как они работают, см. раздел для разработчиков.
@@ -36,7 +36,7 @@
Как вы можете заметить, в сниппет передаются параметры. Как правило, описание этих параметров доступно в документации того сниппета, который вы используете. В данном случае мы указываем DLMenu откуда брать документы для меню (&parents=`3`), как их сортировать (&sortBy=`id`) и каким образом выводить результат работы - outerTpl и rowTpl.
## Настройка вызова сниппетов ##
-Вызов сниппета может быть двух видов: [[SnippetName]] или [! SnippetName!].
+Вызов сниппета может быть двух видов: [[SnippetName]] или [!SnippetName!].
Первая форма - кэшируемый вызов сниппета. Обычно это не проблема. Иногда важно, чтобы вывод сниппета не был кэширован. Например, сниппет Login должен определить, вошел ли пользователь в систему, а если нет, отобразить форму входа. Если страница кэширована, сниппет не запускается, и внешний вид не будет меняться.
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md"
index 5528dcb0..35f4ba1a 100644
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md"
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260/index.md"
@@ -9,8 +9,8 @@
Наберите в строке вашего браузера имя_вашего_сайта/install/. Вместо «имя_вашего_сайта» введите домен, по которому сайт доступен в сети интернет.
-
Следуйте появившемся на экране инструкциям мастера установки.
+
Следуйте появившимся на экране инструкциям мастера установки.
После завершения работы мастера установки, убедитесь, что папки install на сервере больше не существует. Если это не так, удалите ее вручную.
-
Опционально: проверьте и измените права доступа к файлу config.inc.php в папке /manager/includes на -0444 (r--r--r--) - это предотвратит ваш сайт от возможной атаки.
+
Опционально: проверьте и измените права доступа к файлу config.inc.php в папке /manager/includes на -0444 (r--r--r--) - это защитит ваш сайт от возможной атаки.
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/09_\320\223\320\273\320\276\320\261\320\260\320\273\321\214\320\275\321\213\320\265_\320\277\320\265\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\265.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/09_\320\223\320\273\320\276\320\261\320\260\320\273\321\214\320\275\321\213\320\265_\320\277\320\265\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\265.md"
deleted file mode 100644
index 4e4230cb..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/09_\320\223\320\273\320\276\320\261\320\260\320\273\321\214\320\275\321\213\320\265_\320\277\320\265\321\200\320\265\320\274\320\265\320\275\320\275\321\213\320\265.md"
+++ /dev/null
@@ -1,39 +0,0 @@
-PHP предоставляет всем скриптам большое количество предопределённых переменных. Эти переменные содержат всё, от внешних данных до переменных среды окружения, от текста сообщений об ошибках до последних полученных заголовков.
-
-Evolution поддерживает вызов в шаблонах и чанках вызов некоторых из них.
-
-## Примеры ###
-```
-[!$_GET['username'] !]
-[!$_GET['username']:ifempty=!]
-[!$_SERVER['REQUEST_TIME']:dateFormat='d.m.Y'!]
-[!$_SERVER['HTTP_USER_AGENT']:find='Chrome':then='Chrome':else='Other'!]
-
$_SERVER:
-
- [!$_SERVER!]
-
-
-
$_POST:
-
- [!$_POST!]
-
-
-
$_GET:
-
- [!$_GET!]
-
-
$_COOKIE:
-
- [!$_COOKIE!]
-
-
-
$_REQUEST:
-
- [!$_REQUEST!]
-
-
-
$_SESSION:
-
- [!$_SESSION!]
-
-```
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/01_addEventListener.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/01_addEventListener.md"
deleted file mode 100644
index 09e2dac8..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/01_addEventListener.md"
+++ /dev/null
@@ -1,8 +0,0 @@
-###Добавить обработчик события для плагина
-
-Замечание: используется только для текущего цикла выполнения.
-
-string addEventListener(string $evtName, string $pluginName);
-
-$evtName - наименование события
-$pluginName - название плагина
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/02_changeWebUserPassword.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/02_changeWebUserPassword.md"
deleted file mode 100644
index 3867850c..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/02_changeWebUserPassword.md"
+++ /dev/null
@@ -1,20 +0,0 @@
-###Смена пароля для WEB-пользователя
-
-*Замечание: при возникновении ошибок метод возвращает информацию об ошибке на английском языке.*
-
-mixed changeWebUserPassword(string $oldPwd, string $newPwd);
-
-**$oldPwd** - старый пароль
-**$newPwd** - новый пароль
-
-
-
-####Пример:
-
-````php
-$txt = $modx->changeWebUserPassword('oldpassword','newpassword');
-print_r($txt);
-// полученный результат: true
-````
-
-
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/03_clearCache.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/03_clearCache.md"
deleted file mode 100644
index 6750731e..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/03_clearCache.md"
+++ /dev/null
@@ -1,34 +0,0 @@
-###Очистка кэша сайта
-
-boolean clearCache([string $type]);
-
-**$type** - используем с значением *full* если нужно очистить весь кеш с учетом индексных файлов
-
-***
-
-####Пример
-
-````php
-//Очистит кэш сайта.
-$modx->clearCache();
-
-//Очистит кэш сайта с учетом индексных файлов(доступно с версии 1.0.13).
-$modx->clearCache('full');
-````
-*Замечание: Выполнение функции без параметра 'type' очищает не весь кэш. При использовании этой функции удаляются файлы с кэшем всех документов, но индексный файл кэша не изменяется. Из-за этого документы, которые были созданы программным путем, могут на сайте отсутствовать.*
-
-***
-
-####Полная очистка кэша для версий < 1.0.13
-
-````php
-function clearCache() {
- global $modx;
- $modx->clearCache();
- include_once MODX_MANAGER_PATH . 'processors/cache_sync.class.processor.php';
- $sync = new synccache();
- $sync->setCachepath(MODX_BASE_PATH . "assets/cache/");
- $sync->setReport(false);
- $sync->emptyCache();
-}
-````
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/17_getLoginUserID.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/17_getLoginUserID.md"
deleted file mode 100644
index 58adca05..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/17_getLoginUserID.md"
+++ /dev/null
@@ -1,13 +0,0 @@
-###Возвращает идентификатор авторизованного пользователя или NULL, если пользователь неавторизован
-
-*Замечание: метод учитывает соответствие типа пользователя. Поэтому для авторизованного менеджера на самом сайте идентификатор определяться не будет (вернется null).*
-
-mixed getLoginUserID();
-
-***
-
-####Пример
-
- echo 'Идентификатор пользователя: ' . $modx->getLoginUserID();
- // полученный результат:
- // Идентификатор пользователя: 1
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/42_logEvent.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/42_logEvent.md"
deleted file mode 100644
index f9610783..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/42_logEvent.md"
+++ /dev/null
@@ -1,21 +0,0 @@
-###Создает сообщение в системный лог
-
-void logEvent(int $evtid, int $type, string $msg [, $source= 'Parser']);
-
-**$evtid** - идентификатор события
-
-**$type** - тип сообщения:
-1 - информационное
-2 - предупреждение (warning)
-3 - ошибка
-
-**$msg** - записываемое сообщение
-
-**$source** - название сообщения (например: название модуля, сниппета и т.д.)
-
-***
-
-####Пример
-
- $modx->logEvent(123, 1, 'Это текст сообщения!', 'Заголовок сообщения');
- //запишет сообщение в лог.
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/46_parseChunk.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/46_parseChunk.md"
deleted file mode 100644
index dd96f2dc..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/46_parseChunk.md"
+++ /dev/null
@@ -1,56 +0,0 @@
-###Функция для вызова чанка с обработкой для замены плейсхолдеров на значения
-
-*Замечание: при использовании метода обязательно уделяйте внимание параметрам $prefix и $sufix, так как их значения по умолчанию являются нестандартными.*
-
-*Замечание: Этот метод не работает при вызове из подключенного файла (include, include_once, require, require_once).*
-
-string parseChunk(string $chunkName, array $chunkArr[, string $prefix[, string $suffix]]);
-
-**$chunkName** - название чанка (чувствительно к регистру!)
-
-**$chunkArr** - массив со значениями плейсхолдеров
-
-**$prefix** - значение начала плейсхолдера. Обычно используется '[+'
-по умолчанию: {
-
-**$suffix** - значение завершения плейсхолдера. Обычно используется '+]'
-по умолчанию: }
-
-***
-
-####Формат определения значений плейсхолдеров:
-
- Array ( [name] => Spros66.ru
- [type] => site
- [url] => http://spros66.ru )
-Это будет соответствовать плейсхолдерам name, type и url, которые при обработке заменяться соответствующими значениями.
-
-***
-
-####Пример:
-
- $txt = $modx->parseChunk('ditto_blog', array( 'name' => 'Spros66.ru', 'type' => 'site', 'url' => 'http://spros66.ru' ), '[+', '+]' );
- //вернет содержимое чанка ditto_blog, в котором будут заменены плейсхолдеры [+name+], [+type+] и [+url+] на значения.
-
-####Исходный код функции
- /**
- * parseChunk
- * @version 1.1 (2013-10-17)
- *
- * @desc Replaces placeholders in a chunk with required values.
- *
- * @param $chunkName {string} - Name of chunk to parse. @required
- * @param $chunkArr {array} - Array of values. Key — placeholder name, value — value. @required
- * @param $prefix {string} - Placeholders prefix. Default: '{'.
- * @param $suffix {string} - Placeholders suffix. Default: '}'.
- *
- * @return {string; false} - Parsed chunk or false if $chunkArr is not array.
- */
- function parseChunk($chunkName, $chunkArr, $prefix = '{', $suffix = '}'){
- //TODO: Wouldn't it be more practical to return the contents of a chunk instead of false?
- if (!is_array($chunkArr)){
- return false;
- }
-
- return $this->parseText($this->getChunk($chunkName), $chunkArr, $prefix, $suffix);
- }
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/51_regClientScript.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/51_regClientScript.md"
deleted file mode 100644
index 8d80fef9..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/51_regClientScript.md"
+++ /dev/null
@@ -1,17 +0,0 @@
-###Подключение скриптов JavaScript или блока ‹script› в конец документа
-
-string regClientScript(string $src[, bool $plaintext]);
-
-**$src** - путь до файла JavaScript
-
-**$plaintext** - разместить в виде текста переданного в $src
-true - размещение в виде текста
-false - размещение в виде внешнего файла или блока \";
- $modx->regClientScript($src);
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/56_runSnippet.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/56_runSnippet.md"
deleted file mode 100644
index aa082f1e..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/56_runSnippet.md"
+++ /dev/null
@@ -1,24 +0,0 @@
-###Возвращает результат выполнения сниппета с заданными параметрами
-
-string runSnippet(string $snippetName [, array $params]);
-
-**$snippetName** - название сниппета (чувствительно к регистру!)
-
-**$params** - массив со значениями параметров
-
-***
-
-####Пример
-
- $txt = $modx->runSnippet('Ditto', array( 'startID' => 2,
- 'summarize' => 2,
- 'removeChunk' => 'Comments',
- 'tpl' => 'ditto_blog',
- 'paginate' => 1,
- 'extenders' => 'summary,dateFilter',
- 'paginateAlwaysShowLinks' => 1,
- 'tagData' => 'documentTags'
- ));
-
- //вернет результат работы сниппета Ditto, который идентичен вызову:
- [[Ditto? &startID=`2` &summarize=`2` &removeChunk=`Comments` &tpl=`ditto_blog` &paginate=`1` &extenders=`summary,dateFilter` &paginateAlwaysShowLinks=`1` &tagData=`documentTags`]]
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/64_sendmail.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/64_sendmail.md"
deleted file mode 100644
index 0b382745..00000000
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_API/64_sendmail.md"
+++ /dev/null
@@ -1,28 +0,0 @@
-###$modx->sendmail()
-Функция отправки почты через API(доступен с версии 1.0.12), удобен тем что работает в связке с настройками тоесть отправляет почту через mail() или SMTP в зависимости от указанных настроек в панели управления.
-Пример использования:
-
-####простой вариант
-```
- $param = array();
- $param['from'] = "{$site_name}<{$emailsender}>";
- $param['subject'] = $emailsubject;
- $param['body'] = $message;
- $param['to'] = $email;
- $rs = $modx->sendmail($param);
-```
-####вариант с расширенными настройками
-```
- $modx->loadExtension('MODxMailer');
- $modx->mail->IsHTML($isHtml);
- $modx->mail->From = $from;
- $modx->mail->FromName = $fromname;
- $modx->mail->Subject = $subject;
- $modx->mail->Body = $report;
- AddAddressToMailer($modx->mail,"replyto",$replyto);
- AddAddressToMailer($modx->mail,"to",$to);
- AddAddressToMailer($modx->mail,"cc",$cc);
- AddAddressToMailer($modx->mail,"bcc",$bcc);
- AttachFilesToMailer($modx->mail,$attachments);
- if(!$modx->mail->send()) return 'Main mail: ' . $_lang['ef_mail_error'] . $modx->mail->ErrorInfo;
- ```
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/02_Schedule.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/02_Schedule.md"
new file mode 100644
index 00000000..66dd867a
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/02_Schedule.md"
@@ -0,0 +1,66 @@
+> [!IMPORTANT]
+> Команди не виконуються в автоматичному режимі якщо сайт переведено в режим обслуговування (Конфігурація -> Сайт -> Статус сайта -> Оффлайн).
+
+Щоб команди виконувались в автоматичному режимі на стороні сервера без участі розробника використовується Розклад.
+
+Для налаштування розкладу, потрібно в файл команди додати метод `schedule()`.
+```
+/**
+ * Define the command's schedule.
+ *
+ * @param \Illuminate\Console\Scheduling\Schedule $schedule
+ * @return void
+ */
+public function schedule(Schedule $schedule)
+{
+ $schedule->command(static::class)->everyFiveMinutes();
+}
+```
+
+В методі `boot()` сервіс провайдера ініціалізувати розклад.
+```
+if (count($this->commands)) {
+ $this->app->booted(function () {
+ $this->defineConsoleSchedule();
+ });
+}
+```
+
+Додати необхідні методи в файл сервіс провайдера
+```
+/**
+ * Define the application's command schedule.
+ *
+ * @note check timezones list timezone_identifiers_list()
+ *
+ * @return void
+ */
+protected function defineConsoleSchedule()
+{
+ $this->app->singleton(Schedule::class, function ($app) {
+ return tap(new Schedule(now()->timezoneName), function ($schedule) {
+ $this->schedule($schedule->useCache('file'));
+ });
+ });
+}
+
+/**
+ * Define the application's command schedule.
+ *
+ * @param \Illuminate\Console\Scheduling\Schedule $schedule
+ * @return void
+ */
+public function schedule(Schedule $schedule)
+{
+ foreach ($this->commands as $command) {
+ (new $command)->schedule($schedule);
+ }
+}
+```
+
+Налаштувати запуск крон
+```
+* * * * * cd /path-to-your-project/core && php artisan schedule:run >> /dev/null 2>&1
+```
+
+Детальніше тут https://laravel.com/docs/9.x/scheduling
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/index.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/index.md"
new file mode 100644
index 00000000..ddac2abb
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/index.md"
@@ -0,0 +1,6 @@
+Artisan – це інтерфейс командного рядка, включений до Evolutions CMS. Він надає низку корисних команд, які можуть допомогти вам при створенні програми. Детальнішу інформацію ви можете знайти тут: https://laravel.com/docs/9.x/artisan
+
+Щоб скористатись консольними командами, достатньо набрати в терміналі
+`php artisan`. Це покаже перелік всіх команд, що доступні наразі.
+
+Створення консольної команди описано https://github.com/evolution-cms/example-package#console.
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/01_If_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/01_If_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
new file mode 100644
index 00000000..7ac9394f
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/01_If_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
@@ -0,0 +1,31 @@
+Вы можете создавать `if` операторы с помощью директив `@if`, `@elseif`, `@else` и `@endif`. Эти директивы функционируют идентично своим аналогам PHP:
+
+```blade
+@if (count($records) === 1)
+ У меня одна запись!
+@elseif (count($records) > 1)
+ У меня много записей!
+@else
+ У меня нет записей!
+@endif
+```
+
+Для удобства Blade также предоставляет `@unless` директиву:
+
+```blade
+@unless (evo_role())
+ Вы не вошли, поэтому ваша роль на сайте не определена.
+@endunless
+```
+
+В дополнение к уже обсуждаемым условным директивам, директивы `@isset` и `@empty` можно использовать как удобные ярлыки для соответствующих функций PHP:
+
+```blade
+@isset($records)
+ // $records определен и не является null...
+@endisset
+
+@empty($records)
+ // $records является "empty"...
+@endempty
+```
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/02_Switch_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/02_Switch_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
new file mode 100644
index 00000000..120ae596
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/02_Switch_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md"
@@ -0,0 +1,16 @@
+Инструкции Switch можно создавать с помощью директив @`switch`, `@case`, и `@break:`, `@default`, `@endswitch`
+
+```blade
+@switch($i)
+ @case(1)
+ Первый случай...
+ @break
+
+ @case(2)
+ Второй случай...
+ @break
+
+ @default
+ Типичный случай...
+@endswitch
+```
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/03_\320\246\320\270\320\272\320\273\321\213.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/03_\320\246\320\270\320\272\320\273\321\213.md"
new file mode 100644
index 00000000..58fd007d
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/03_\320\246\320\270\320\272\320\273\321\213.md"
@@ -0,0 +1,95 @@
+Помимо условных операторов Blade предоставляет простые директивы для работы со структурами циклов PHP. Опять же, каждая из этих директив функционирует идентично своим аналогам PHP:
+
+```blade
+@for ($i = 0; $i < 10; $i++)
+ Текущее значение составляет {{$i}}
+@endfor
+
+@foreach ($users as $user)
+
Это пользователь {{$user->id}}
+@endforeach
+
+@forelse ($users as $user)
+
{{$user->name}}
+@empty
+
Нет пользователей
+@endforelse
+
+@while (true)
+
Я петляю навсегда.Я петляю навсегда.
+@endwhile
+```
+
+> **Примечание**
+> При итерации цикла foreach вы можете использовать [переменную цикла](#the-loop-variable), чтобы получить ценную информацию о цикле, например, находитесь ли вы на первой или последней итерации цикла.
+
+При использовании циклов вы также можете пропустить текущую итерацию или завершить цикл с помощью директив `@continue` и `@break`:
+
+```blade
+@foreach ($users as $user)
+ @if ($user->type == 1)
+ @continue
+ @endif
+
+
{{$user->name}}
+
+ @if ($user->number == 5)
+ @break
+ @endif
+@endforeach
+```
+
+Вы также можете включить условие продления или перерыва в объявление директивы:
+```blade
+@foreach ($users as $user)
+ @continue($user->type == 1)
+
{{$user->name}}
+ @break($user->number == 5)
+@endforeach
+```
+
+
+### Сменная цикла
+
+При прохождении `foreach` цикла `$loop` переменная будет доступна внутри цикла. Эта переменная предоставляет доступ к некоторой полезной информации, такой как текущий индекс цикла и то, первая или последняя итерация цикла:
+
+```blade
+@foreach ($users as $user)
+ @if ($loop->first)
+ Это первая итерация.
+ @endif
+
+ @if ($loop->last)
+ Это последняя итерация.
+ @endif
+
+
Это пользователь {{$user->id}}
+@endforeach
+```
+
+Если вы находитесь во вложенном цикле, вы можете получить доступ к `$loop` переменной родительского цикла с помощью `parent` свойства:
+
+```blade
+@foreach ($users as $user)
+ @foreach ($user->posts as $post)
+ @if ($loop->parent->first)
+ Это первая итерация родительского цикла.
+ @endif
+ @endforeach
+@endforeach
+```
+
+Переменная `$loop` также содержит ряд других полезных свойств:
+
+| Свойство | Описание |
+|--------------------|-----------------------------------------------------------|
+| `$loop->index` | Индекс текущей итерации цикла (начинается с 0). |
+| `$loop->iteration` | Текущая итерация цикла (начинается с 1). |
+| `$loop->remaining` | Оставшиеся в цикле итерации. |
+| `$loop->count` | Общее количество повторяющихся элементов в массиве. |
+| `$loop->first` | Или это первая итерация цикла. |
+| `$loop->last` | Является ли это последняя итерация цикла. |
+| `$loop->even` | Является ли это четная итерация цикла. |
+| `$loop->odd` | Является ли это нечетная итерация цикла. |
+| `$loop->depth` | Уровень вложенности текущего цикла. |
+| `$loop->parent` | Когда во вложенном цикле, переменная родительского цикла. |
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/04_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260_\321\200\320\276\320\273\320\270_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/04_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260_\321\200\320\276\320\273\320\270_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
new file mode 100644
index 00000000..7d9c1813
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/04_\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\260_\321\200\320\276\320\273\320\270_\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\217.md"
@@ -0,0 +1,46 @@
+
+
+Начиная с версии Evolution CMS >= 3.2.1 появилась возможность отображать контент в зависимости от роли пользователя посредством директивы `@evoRole`. К примеру:
+
+```blade
+@evoRole('Administrator')
+ Этот текст будет показан только пользователю с участием Администратора.
+@evoEndRole
+```
+
+> **Внимание**
+> Будьте очень внимательны, директива `@evoRole` требует директиву `@evoEndRole` для закрытия блока отображения. Если директиву `@evoEndRole` пропустить – это приведет к ошибкам в работе сайта.
+
+Типично, после установки Evolution CMS доступны следующие роли:
+
+* Administrator
+* Editor
+* Publisher
+
+### Вывод данных при проверке роли
+
+Выше указан самый простой случай проверки роли пользователя. Что на счет того, чтобы отразить для каждой роли свой текст, в таком случае будет полезна директива `@evoElseRole`. К примеру:
+
+```blade
+@evoRole('Administrator')
+ Этот текст будет показан только пользователю с участием Администратора.
+@evoElseRole('Editor')
+ Этот текст будет показан только пользователю с ролью Редактор.
+@evoElseRole()
+ Этот текст будет показан всем пользователю авторизованным на сайте.
+@else
+ Этот текст будет показан всем остальным, в том числе не авторизованным пользователям.
+@evoEndRole
+```
+
+### Проверка авторизации пользователя
+
+Если в качестве аргумента для директив `@evoRole` и `@evoElseRole` передана пустая строка, или не передана ничего, то проверка проводится только на авторизацию пользователя.
+
+```blade
+@evoRole()
+ Этот пользователь авторизирован на сайте.
+@else
+ Этот пользователь не авторизован на сайте.
+@evoEndRole
+```
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/index.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/index.md"
new file mode 100644
index 00000000..1248ba61
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/01_Blade_\320\224\320\270\321\200\320\265\320\272\321\202\320\270\320\262\321\213/index.md"
@@ -0,0 +1,87 @@
+Blade – это простой, но мощный механизм создания шаблонов, который входит в состав Evolution CMS. В отличие от некоторых механизмов создания шаблонов PHP, Blade не ограничивает использование простого PHP кода в ваших шаблонах. На самом деле все шаблоны Blade скомпилированы в обычный PHP-код и хранятся в кэш-памяти, пока они не будут изменены, что означает, что Blade практически не добавляет накладных расходов для вашего приложения. Файлы шаблонов Blade используют `.blade.php` для расширения файла и обычно хранятся в `/views/` каталоге.
+
+## Отображение данных
+
+Вы можете отобразить данные, которые передаются в ваши представления Blade, вложив переменную в фигурные скобки. Например Вы можете отобразить содержимое переменной `name` так:
+
+```blade
+Привет, {{$name}}.
+```
+
+> **Примечание**
+> Эхо-выражения Blade `{{}}` автоматически посылаются через `htmlspecialchars` функцию PHP для предотвращения атак XSS.
+
+Вы не ограничены только отображением содержимого переменных, переданных в представление. Вы можете также повторить результаты любой функции PHP. На самом деле, вы можете разместить любой PHP-код, который хотите, в оператор Blade echo:
+
+```blade
+Текущая отметка времени UNIX {{time()}}.
+```
+
+### Отображение неэкранированных данных
+
+По умолчанию `{{}}` операторы Blade автоматически посылаются через `htmlspecialchars` функцию PHP для предотвращения XSS-атак. Если вы не хотите, чтобы ваши данные были экранированы, вы можете использовать такой синтаксис:
+
+```blade
+Здравствуйте, {!! $name !!}.
+```
+
+> **Внимание**
+> Будьте очень осторожны, воспроизводя содержимое, которое предоставляют пользователи вашего приложения. Обычно вы должны использовать экранированный синтаксис двойных фигурных скобок, чтобы предотвратить атаки XSS при отображении предоставленных пользователем данных.
+
+### Blade и JavaScript
+
+Поскольку многие фреймворки JavaScript также используют «фигурные» скобки, чтобы указать, что данное выражение должно отображаться в браузере, вы можете использовать символ `@` чтобы сообщить механизму воспроизведения Blade, что выражение должно остаться нетронутым. К примеру:
+
+```blade
+
Evolution CMS
+
+Привет @{{$name}}.
+```
+
+В этом примере @символ будет удален Blade, однако `{{ name }}` выражение останется нетронутым обработчиком Blade, позволяя его воспроизводить в вашей структуре JavaScript.
+
+Символу `@` также можно использовать для экранирования директив Blade:
+
+```blade
+{{-- Blade шаблон --}}
+@@if()
+
+
+@if()
+```
+
+#### Визуализация JSON
+
+Иногда вы можете передать массив в свое представление с намерением отобразить его как JSON, чтобы инициализировать переменную JavaScript. К примеру:
+
+```blade
+
+```
+
+Однако вместо ручного вызова `json_encode` вы можете использовать `Js::from` метод. Метод `from` принимает те же аргументы, что и функция PHP `json_encode`, однако это обеспечит надлежащее экранирование полученного JSON для включения в кавычки HTML. Метод `from` вернет строчный `JSON.parse` оператор JavaScript, который преобразует заданный объект или массив в действительный объект JavaScript:
+
+```blade
+
+```
+> **Внимание**
+> Вы должны использовать только `Js::from` метод воспроизведения существующих переменных как JSON. Шаблон Blade базируется на регулярных выражениях, и попытки передать сложное выражение директиве могут вызвать неожиданные ошибки.
+
+#### Директива `@verbatim`
+
+Если вы отображаете переменные JavaScript в большой части своего шаблона, вы можете завернуть HTML в директиву, `@verbati` mчтобы вам не приходилось добавлять к каждому оператору Blade echo символ `@`:
+
+```blade
+@verbatim
+
+ Привет, {{$name}}.
+
+@endverbatim
+```
+
+## Blade Директивы
+
+Помимо наследования шаблонов и отображения данных, Blade также предоставляет удобные ярлыки для типовых управляющих структур PHP, таких как условные операторы и циклы. Эти ярлыки обеспечивают очень четкий, сжатый способ работы с управляющими структурами PHP, оставаясь при этом знакомы своим соответствующим PHP.
\ No newline at end of file
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\250\320\260\320\261\320\273\320\276\320\275.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/index.md"
similarity index 85%
rename from "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\250\320\260\320\261\320\273\320\276\320\275.md"
rename to "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/index.md"
index b830957b..2c4aeb12 100644
--- "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/01_\320\250\320\260\320\261\320\273\320\276\320\275.md"
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\250\320\260\320\261\320\273\320\276\320\275/index.md"
@@ -1,6 +1,4 @@
-# Использование шаблона
-
-Шаблон в Evolution - основная часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
+Шаблон в Evolution CMS - основная часть страницы сайта, которая определяет ее оформление. Шаблон не требует особого синтаксиса и представляет собой обычный HTML-код (а возможно XHTML или другой) с вызовом необходимых чанков, параметров и сниппетов.
Количество шаблонов чаще всего зависит от внешнего вида и функционала сайта. Как правило, для различных разделов и страниц сайта создаются свои шаблоны. Например, будет логичным создать разные шаблоны для товара и для новости и прикрепить к ним различные ТВ-параметры. Это позволит контент-менеджеру быстрей и правильней заполнить сайт. Также это существенно облегчит работу программиста, если потребуется сделать какие-то ленты новостей или товаров.
@@ -48,6 +46,14 @@
Для создания нового шаблона необходимо нажать на ссылку "Новый шаблон", а для редактирования существующего достаточно нажать на ссылку с его названием.
При создании шаблона также можно выбрать, какие TV-параметры ему принадлежат и отсортировать их так, как необходимо.
+### Blade
+
+Начиная с версии Evolution CMS 2.0, появилась возможность использовать шаблонизатор Blade для формирования шаблонов сайта.
+
+Чтобы получить возможность использования Blade для выбранного вами шаблона, следует в режиме редактирования шаблона добавить ему псевдоним, а затем поставить чекбокс "Создать файл шаблона при сохранении".
+
+Все созданные шаблоны будут помещены в папку /views/ в корне сайта. После этого Вы можете работать с шаблоном, используя свой любимый редактор кода.
+
### Создание шаблона в Evolution CMS
#### Назначение полей
@@ -101,15 +107,7 @@ Evolution позволяет определить еще несколько де
При создании документа автоматически предлагается шаблон по умолчанию. Для настройки шаблона по умолчанию необходимо выполнить следующие действия:
- Переходим в настройки системы управления:
-- Инструменты → Конфигурация → Сайт
+- Конфигурация → Сайт
- Находим параметр "Шаблон по умолчанию" и меняем на нужный.
- Сохраняем настройки.
-## FAQ
-Есть ли какие-то ограничения на шаблоны дизайна для сайта?
-
-Абсолютно никаких. Evolution позволяет реализовать любой дизайн.
-
-## Где можно взять готовые шаблоны?
-
-Evolution позволяет легко использовать любой сверстанный HTML-макет, который можно заказать у специалистов или найти на специализированных сайтах.
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\247\320\260\320\275\320\272\320\270.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/03_\320\247\320\260\320\275\320\272\320\270.md"
similarity index 100%
rename from "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/02_\320\247\320\260\320\275\320\272\320\270.md"
rename to "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/03_\320\247\320\260\320\275\320\272\320\270.md"
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/03_\320\241\320\275\320\270\320\277\320\277\320\265\321\202\321\213.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202\321\213.md"
similarity index 100%
rename from "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/01_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/03_\320\241\320\275\320\270\320\277\320\277\320\265\321\202\321\213.md"
rename to "ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202\321\213.md"
diff --git "a/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/05_\320\237\320\273\320\260\320\263\320\270\320\275\321\213/02_\320\241\320\276\320\261\321\213\321\202\320\270\321\217_\320\277\320\273\320\260\320\263\320\270\320\275\320\276\320\262.md" "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/05_\320\237\320\273\320\260\320\263\320\270\320\275\321\213/02_\320\241\320\276\320\261\321\213\321\202\320\270\321\217_\320\277\320\273\320\260\320\263\320\270\320\275\320\276\320\262.md"
new file mode 100644
index 00000000..dae068f3
--- /dev/null
+++ "b/ru/03_\320\240\320\260\320\267\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\321\203/02_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213/05_\320\237\320\273\320\260\320\263\320\270\320\275\321\213/02_\320\241\320\276\320\261\321\213\321\202\320\270\321\217_\320\277\320\273\320\260\320\263\320\270\320\275\320\276\320\262.md"
@@ -0,0 +1,913 @@
+## Template Service Events ##
+Все события, связанные с отображением страницы
+
+### OnBeforeLoadDocumentObject ###
+Запускается перед формированием $modx->documentObject.
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+method - метод доступа к документу
+identifier - идентификатор документа
+```
+
+### OnLoadDocumentObject ###
+Запускается при формирования $modx->documentObject
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+method - метод доступа к документу
+identifier - идентификатор документа
+documentObject - объект текущего документа
+```
+
+### OnAfterLoadDocumentObject ###
+Запускается после формирования $modx->documentObject. От **OnLoadDocumentObject** отличается тем, что содержит в себе tv поля текущего документа.
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+method - метод доступа к документу
+identifier - идентификатор документа
+documentObject - объект текущего документа
+```
+
+### OnBeforeLoadExtension ###
+Запускается перед подгрузкой расширения.
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+name - имя подгружаемого расширения
+reload - флаг отображающий, была ли запрошена переподгрузка
+```
+
+### OnBeforeParseParams ###
+Запускается перед парсингом параметров в вызове сниппета.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnDocPublished ###
+Запускается при публикации документа
+```
+manager/processors/publish_content.processor.php
+```
+**Доступные переменные:**
+```
+docid - id документа
+```
+
+### OnDocUnPublished ###
+Запускается при снятии документа с публикации
+```
+manager/processors/unpublish_content.processor.php
+```
+**Доступные переменные:**
+```
+docid - id документа
+```
+
+### OnLoadWebDocument ###
+Запускается, если документ был взят из базы
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnLogPageHit ###
+Запускается, если стоит настройка "Отслеживать посещения". Это событие вызывается перед загрузкой документа.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnMakeDocUrl ###
+Запускается после формировании url через функцию $modx->makeUrl(), либо тэги [~...~].
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+id - id документа
+url - сформированный url
+```
+
+### OnParseDocument ###
+Запускается перед тем, как будут обработаны ТВ, сниппеты и чанки
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnParseProperties ###
+Запускается при парсинге строки параметров ресурса.
+```
+manager/includes/document.parser.class.inc.php
+```
+**Вовзращает:**
+```
+element -имя элемента
+type - тип элемента
+args - массив в формате имя параметра => значение
+```
+
+### OnWebPageComplete ###
+Запускается, когда страница полностью сформирована. После кэширования документа.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnWebPageInit ###
+Событие вызывается при иницилизации страницы. Выполняется одним из первых.
+Если страница была закеширована ранее, то запускается после того, как кэш будет загружен в $modx.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnWebPagePrerender ###
+Запускается перед тем, как страница будет отдана клиенту. Это последнее событие, вызванное до того, как страница будет отправлена в клиентский браузер.
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+documentOutput - содержимое страницы. Начиная с версии 3.1.3 эта переменная предаётся по ссылке и не надо делать event->output
+```
+
+
+## Cache Service Events ##
+События кэширования
+
+### OnBeforeCacheUpdate ###
+Запускается перед обновлением кэша
+```
+manager/processors/cache_sync.class.processor.php
+```
+
+### OnBeforeSaveWebPageCache ###
+Запускается после сохранения страницы в кэше
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnCacheUpdate ###
+Запускается сразу после записи в кэш
+```
+manager/processors/cache_sync.class.processor.php
+```
+
+### OnLoadWebPageCache ###
+Запускается после загрузки кэшируемой страницы
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnMakePageCacheKey ###
+Запускается после формирования ключа для кэша страницы.
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+hash - ключ кэша страницы
+id - id кэшируемого документа
+params - отсортированные GET параметры текущего запроса
+```
+
+
+## Web Access Service Events ##
+События, связанные с авторизацией и редактированим веб-пользователя
+
+### OnBeforeWebLogin ###
+Запускается перед тем, как веб-пользователь авторизируется.
+```
+Может быть вызвано разными сниппетами авторизации. Например WebLogin:
+assets/snippets/weblogin/weblogin.processor.inc.php
+```
+**Доступные переменные:**
+```
+username - имя пользователя
+userpassword - пароль
+rememberme - запомнить или нет пользователя
+```
+
+### OnBeforeWebLogout ###
+```
+Может быть вызвано разными сниппетами авторизации. Например WebLogin:
+assets/snippets/weblogin/weblogin.processor.inc.php
+```
+ **Доступные переменные:**
+```
+userid - id
+username - имя пользователя
+```
+
+### OnWebAuthentication ###
+```
+Может быть вызвано разными сниппетами авторизации. Например WebLogin:
+assets/snippets/weblogin/weblogin.processor.inc.php
+```
+### OnWebChangePassword ###
+```
+manager/includes/document.parser.class.inc.php
+manager/processors/save_web_user.processor.php
+```
+
+### OnWebCreateGroup ###
+```
+manager/processors/web_access_groups.processor.php
+```
+
+### OnWebDeleteUser ###
+```
+manager/processors/delete_web_user.processor.php
+```
+
+### OnWebLogin ###
+Запускается при авторизации веб-пользователя.
+```
+Может быть вызвано разными сниппетами авторизации. Например WebLogin:
+assets/snippets/weblogin/weblogin.processor.php
+```
+ **Доступные переменные:**
+```
+userid - id пользователя
+username - имя пользователя
+userpassword - пароль
+rememberme - запомнить или нет
+```
+
+### OnWebLogout ###
+```
+Может быть вызвано разными сниппетами авторизации. Например WebLogin:
+assets/snippets/weblogin/weblogin.processor.inc.php
+```
+ **Доступные переменные:**
+```
+userid - id пользователя
+username - имя пользователя
+```
+
+### OnWebSaveUser ###
+Запускается при сохранении профиля пользователя
+```
+manager/processors/save_web_user.processor.php
+```
+**Доступные переменные:**
+```
+Если создание пользователя:
+mode - "new"
+userid - id пользователя
+username - имя пользователя
+userpassword - пароль
+useremail - почта
+userfullname - полное имя
+
+Если редактирование пользователя:
+
+mode - "upd"
+userid id пользователя
+username - имя пользователя
+userpassword - пароль
+useremail - почта
+userfullname - полное имя
+oldusername - старое имя пользователя
+olduseremail - старый email
+```
+## Manager Access Events ##
+
+### OnBeforeManagerLogin
+### OnBeforeManagerLogout
+### OnBeforeManagerPageInit
+### OnManagerAuthentication
+### OnManagerChangePassword
+### OnManagerCreateGroup
+### OnManagerDeleteUser
+### OnManagerFrameLoader
+### OnManagerLogin
+
+### OnManagerLoginFormPrerender ###
+Событие запускается перед генерацией формы входа в панель администрирования (формы авторизации).
+Может использоваться для кастомизации страницы входа и самой формы авторизации.
+
+
+### OnManagerLoginFormRender ###
+Событие запускается после генерации формы входа в панель администрирования (формы авторизации).
+Может использоваться для кастомизации страницы входа и формы авторизации.
+
+
+### OnManagerLogout
+### OnManagerMainFrameHeaderHTMLBlock
+### OnManagerMenuPrerender
+### OnManagerNodePrerender
+### OnManagerNodeRender
+### OnManagerPageInit
+### OnManagerPreFrameLoader
+### OnManagerSaveUser
+### OnManagerTopPrerender
+### OnManagerTreeInit
+### OnManagerTreePrerender
+### OnManagerTreeRender
+### OnManagerWelcomeHome
+С помощью данного события возможно вывести кастомные виджеты на домашнюю страницу админки.
+```php
+ Event::listen(
+ 'evolution.OnManagerWelcomeHome',
+ function ($params) {
+ $params['widgets']['tutorial'] = [
+ 'menuindex' => '1',
+ 'id' => 'tutorial',
+ 'cols' => 'col-sm-12',
+ 'icon' => 'fab fa-leanpub',
+ 'title' => 'Відео-туторіал',
+ 'body' => '
+
+
'
+ ];
+ return serialize($params['widgets']);
+ }
+ );
+```
+### OnManagerWelcomePrerender
+### OnManagerWelcomeRender
+
+## Parser Service Events ##
+
+### OnFileManagerUpload ###
+Запускается после загрузки файла через встроенный файл-менеджер
+```
+manager/actions/files.dynamic.php
+```
+
+**Доступные переменные:**
+```
+$filepath - путь к файлу
+$filename - имя файла
+```
+
+### OnPageNotFound ###
+Запускается, если страница не найдена. Зачастую используется для написания своего роутинга.
+```
+manager/includes/document.parser.class.inc.php
+```
+
+
+### OnPageUnauthorized ###
+```
+manager/includes/document.parser.class.inc.php
+```
+
+### OnSiteRefresh ###
+```
+manager/actions/refresh_site.dynamic.php
+```
+
+## Chunks ##
+
+### OnBeforeChunkFormDelete ###
+### OnBeforeChunkFormSave ###
+### OnChunkFormDelete ###
+### OnChunkFormPrerender ###
+### OnChunkFormRender ###
+### OnChunkFormSave ###
+
+## Documents ##
+
+### OnAfterMoveDocument ###
+Событие, отрабатывающее ПОСЛЕ перемещения документа в другой родитель в административной панели
+```
+manager/processors/move_document.processor.php
+```
+**Доступные переменные:**
+```
+$id_document - id переносимого документа
+$old_parent - id родителя ИЗ которого перенесли документ
+$new_parent - id родителя КУДА перенесли документ
+```
+
+### OnBeforeDocDuplicate ###
+Событие, отрабатывающее ДО создания дубликата документа в административной панели
+```
+manager/processors/duplicate_content.processor.php
+```
+**Доступные переменные:**
+```
+$id - id переносимого документа
+```
+
+### OnBeforeDocFormDelete ###
+Событие, отрабатывающее ДО удаления (указание на удаление) документа в административной панели
+```
+manager/processors/delete_content.processor.php
+```
+**Доступные переменные:**
+```
+$id - id удаляемого документа
+$children - массив потомков удаляемого документа
+```
+Можно использовать для переноса дочерних документов, обладающих какими-то специальными свойствами в папку "архив"
+
+### OnBeforeDocFormSave ###
+Событие, отрабатывающее ДО сохранения документа в административной панели
+```
+manager/processors/save_content.processor.php
+```
+**Доступные переменные:**
+```
+$mode - принимает значение new для нового документа, upd при обновлении документа
+$id - id документа
+```
+
+### OnBeforeEmptyTrash ###
+Событие, отрабатывающее ДО очистки корзины в административной панели
+```
+manager/processors/remove_content.processor.php
+```
+**Доступные переменные:**
+```
+$ids - массив, содержащий id документов, помеченных для удаления
+```
+
+### OnBeforeMoveDocument ###
+Событие, отрабатывающее ДО перемещения документа в другой родитель в административной панели
+```
+manager/processors/move_document.processor.php
+```
+**Доступные переменные:**
+```
+$id_document - id переносимого документа
+$old_parent - id родителя ОТКУДА перенесят документ
+$new_parent - id родителя КУДА перенесят документ
+```
+
+### OnCreateDocGroup ###
+Событие отрабатывающее при создании группы документов
+```
+manager/processors/access_groups.processor.php
+manager/processors/web_access_groups.processor.php
+```
+**Доступные переменные**
+$id - id группы
+$newgroup - имя группы
+
+### OnDocDuplicate ###
+Событие, отрабатывающее ПОСЛЕ создания дубликата документа в административной панели
+```
+manager/processors/duplicate_content.processor.php
+```
+**Доступные переменные:**
+```
+$id - id переносимого документа
+$new_id - id нового родителя
+```
+Используется для изменения различных свойств документа после создания дубликата (например можно сделать счетчик количества дублей)
+
+### OnDocFormDelete ###
+Событие, отрабатывающее ПОСЛЕ удаления (указание на удаление) документа в административной панели
+```
+manager/processors/delete_content.processor.php
+```
+**Доступные переменные:**
+```
+$id - id удаленного документа
+$children - массив потомков удаляенног документа
+```
+Можно использовать, например, для автоматического, везвозвратного удаления документов из таблицы (при это не стоит забывать, что нужно удалять и ТВ параметры связанные с документами).
+
+### OnDocFormPrerender ###
+Событие, отрабатывающее после открытия формы редакирования докуменда в административной панели
+```
+manager/actions/mutate_content.dynamic.php
+```
+**Доступные переменные:**
+```
+$id - id документа
+$template - id шаблона, который использует текущий документ
+```
+
+### OnDocFormRender ###
+Событие, отрабатывающее после открытия формы редакирования докуменда в административной панели
+```
+manager/actions/mutate_content.dynamic.php
+```
+**Доступные переменные:**
+```
+$id - id документа
+$template - id шаблона, который использует текущий документ
+```
+
+### OnDocFormSave ###
+Событие, отрабатывающее при сохранении документа в административной панели
+```
+manager/processors/save_content.processor.php
+```
+**Доступные переменные:**
+```
+$mode - принимает значение new для нового документа, upd при обновлении документа
+$id - id документа
+global $tmplvars,$content // массивы, в которых содержатся поля документа и ТВ-параметры
+```
+
+### OnDocFormTemplateRender ###
+Событие возникающие при определении шаблона документа. Может использоваться при смене шаблона документа (например подтягивать специфические свойства)
+```
+manager/actions/mutate_content.dynamic.php
+```
+**Доступные переменные:**
+```
+$id - id шаблона документа
+```
+
+### OnDocFormUnDelete ###
+Событие, отрабатывающее после восстановления документа из удаленных в административной панели
+```
+manager/processors/undelete_content.processor.php
+```
+**Доступные переменные:**
+```
+$id - id востановленного документа
+$children - массив дочерних документов востановленного документа
+```
+
+### OnEmptyTrash ###
+Событие, отрабатывающее ПОСЛЕ очистки корзины в административной панели
+```
+manager/processors/remove_content.processor.php
+```
+**Доступные переменные:**
+```
+$ids - массив, содержащий id документов, помеченных для удаления
+```
+
+### OnStripAlias ###
+Событие запускаемое для очистки алиаса от недопустимых символов
+```
+manager/includes/document.parser.class.inc.php
+```
+**Доступные переменные:**
+```
+$alias - псевдоним
+```
+
+## File Browser Events ##
+События файлового браузера.
+
+### OnFileBrowserInit
+Вызывается после загрузки настроек файлового браузера. Настройки можно изменить непосредственно в переменной $config.
+
+### OnBeforeFileBrowserUpload
+Вызывается после того, как файл был загружен на сервер во временную папку, но до перемещения файла в место назначения. Если из плагина вернуть сообщение, то файл будет удален.
+
+**Доступные переменные:**
+```
+$filepath - путь, по которому будет загружен файл
+$file - ссылка на массив с информацией о файле
+```
+
+### OnFileBrowserUpload
+Вызывается после того, как файл был загружен на сервер и перемещен в место назначения.
+
+**Доступные переменные:**
+```
+$filepath - путь, по которому был загружен файл
+$filename - имя файла
+```
+
+### OnBeforeFileBrowserDelete
+Вызывается перед удалением файла. Если из плагина вернуть сообщение, то удаление будет прервано.
+```
+$element - тип удаляемого элемента (file или dir)
+$filepath - путь к файлу (тип file) или директории (тип dir)
+$filename - (только для file)
+```
+
+### OnFileBrowserDelete
+Вызывается после удаления файла.
+
+**Доступные переменные:**
+```
+$element - тип удаляемого элемента (file или dir)
+$filepath - путь к файлу (тип file) или директории (тип dir)
+$filename - имя файла (только для file)
+```
+
+### OnBeforeFileBrowserMove
+Вызывается перед перемещением файла. Если из плагина вернуть сообщение, то перемещение будет прервано.
+
+**Доступные переменные:**
+```
+$oldpath - исходный путь к файлу, включая имя файла
+$filename - имя файла
+$newpath - конечный путь к файлу
+```
+
+### OnFileBrowserMove
+Вызывается после перемещения файла.
+
+**Доступные переменные:**
+```
+$oldpath - исходный путь к файлу, включая имя файла
+$filename - имя файла
+$newpath - конечный путь к файлу
+```
+
+### OnBeforeFileBrowserCopy
+Вызывается перед копированием файла. Если из плагина вернуть сообщение, то копирование будет прервано.
+
+**Доступные переменные:**
+```
+$oldpath - исходный путь к файлу, включая имя файла
+$filename - имя файла
+$newpath - конечный путь к файлу
+```
+
+### OnFileBrowserCopy
+Вызывается после копирования файла.
+
+**Доступные переменные:**
+```
+$oldpath - исходный путь к файлу, включая имя файла
+$filename - имя файла
+$newpath - конечный путь к файлу
+```
+
+### OnBeforeFileBrowserRename
+Вызывается перед переименованием файла или директории.
+
+**Доступные переменные:**
+```
+$element - тип удаляемого элемента (file или dir)
+$filepath - путь к файлу (тип file) или директории (тип dir)
+$filename - имя файла (только для file)
+$newname - новое имя (если изменить переменную, то изменится и имя)
+```
+
+### OnFileBrowserRename
+Вызывается после переименования файла или директории.
+
+**Доступные переменные:**
+```
+$element - тип удаляемого элемента (file или dir)
+$filepath - путь к файлу (тип file) или директории (тип dir)
+$filename - имя файла (только для file)
+$newname - новое имя
+```
+
+## Modules ##
+
+### OnBeforeModFormDelete ###
+### OnBeforeModFormSave ###
+### OnModFormDelete ###
+### OnModFormPrerender ###
+### OnModFormRender ###
+### OnModFormSave ###
+
+## Plugins ##
+
+### OnBeforePluginFormDelete ###
+### OnBeforePluginFormSave ###
+### OnPluginFormDelete ###
+### OnPluginFormPrerender ###
+### OnPluginFormRender ###
+### OnPluginFormSave ###
+
+## RichText Editor ##
+
+### OnRichTextEditorInit ###
+Запускается при инициализации текстового редактора
+```
+manager/actions/mutate_content.dynamic.php
+manager/actions/mutate_htmlsnippet.dynamic.php
+manager/includes/tmplvars.format.inc.php
+```
+**Доступные переменные:**
+```
+$editor - название активного редактора из OnRichTextEditorRegister
+$elements - Имя