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 @@ - -

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
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]
# Rewrite domain.com -> www.domain.com -- used with SEO Strict URLs plugin
#RewriteCond %{HTTP_HOST} .
#RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
#RewriteRule (.*) http://www.example.com/$1 [R=301,L]
# 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 if supported.
#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
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]
# Rewrite domain.com -> www.domain.com -- used with SEO Strict URLs plugin
#RewriteCond %{HTTP_HOST} .
#RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
#RewriteRule (.*) http://www.example.com/$1 [R=301,L]
# 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 if supported.
#php_flag zlib.output_compression On
#php_value zlib.output_compression_level 5
If Windows IIS serves your pages, you're not left out of the Friendly URLs party, but optimal solutions do require a commercial IIS add on.

Common Edits to the Default .htacces File

Make sure RewriteBase points to the directory where you installed Evo. E.g., "/Evo" if your installation is in a "Evo" subdirectory:

@@ -23,15 +22,15 @@
1
2
3
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

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.

1
2
3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /~myacct/index.php?q=$1 [L,QSA]
-

Admin Protection

+

Admin Protection

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:

1
2
3
4
5
6
7
# Allow admin access to specific IPs only
Options +FollowSymlinks
RewriteEngine On
# Deny by IP. The IP address(es) listed will get through.
RewriteCond %{REMOTE_ADDR} !^(192\.168\.0\.128)$
RewriteCond %{REQUEST_FILENAME} !/includes/veriword\.php$
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
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.
1
2
php_value session.save_path /path/to/your/web/content/sessions/
php_value session.gc_maxlifetime 28800
-

CSS or JS files as Evo documents

+

CSS or JS files as Evo documents

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.

1
RewriteRule ^(manager|assets) - [L]

Would become

@@ -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:
1
RewriteRule ^(manager|assets/images|assets/snippets) - [L]
-

Timezone

+

Timezone

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

1
php_value date.timezone Europe/Moscow

or

1
SetEnv TZ America/Chicago
-

Default Character Sets

+

Default Character Sets

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:

1
AddDefaultCharset utf-8
-

Register Globals

+

Register Globals

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.

1
2
# 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:

1
2
# Fix .htc mime type for Internet Explorer
AddType text/x-component .htc

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.

1
2
3
4
5
6
7
8
9
# Fix screen flicker for images 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*] - - - - - - -{{Поиск}} - -
-
-

[*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*] - - - - -
    -
    -

    [*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)". - -![пример](https://raw.githubusercontent.com/0test/docs/master/ru/02_Разработка/01_TV-параметры/tv_create.png) - -#### Назначение полей - -- **Имя параметра** - используется для вызова 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 @@ - 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 @@ + 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 @@ +Evolution CMS >= 3.2.1 + +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*] + + + + +
    +
    +

    [*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### + +Шаблон обёртки корзины + +``` +
    +
    + + + + + + + + + + + [+subtotals+] + + + + + + + + [[if? &is=`[+count+]:>:0` &then=` + [+dl.wrap+] + ` &else=` + + + `]] + +
    [%cart.item_title%][%cart.count%][%cart.item_price%]
    [%cart.total%]:[[PriceFormat? &price=`[+total+]` &convert=`0`]]
    + [%cart.no_items%] +
    +
    + + [[if? &is=`[+count+]:>:0` &then=` + + `]] +
    +``` +Совет: для вывода различных шаблонов пустой или полной корзины вы можете воспользоваться любым сниппетом, который сможет проверить плейсхолдер `[+count+]`: +``` +[[if? &is=`[+count+]:>:0` &then=`ШАБЛОН ПОЛНОЙ КОРЗИНЫ` +&else=`ШАБЛОН ПУСТОЙ КОРЗИНЫ`]] +``` + +###tpl### + +Шаблон одного товара в корзине +``` + + + [+e.title+] + + [+name+] +
    + [+options+] +
    + + + + + + + + [!PriceFormat? &price=`[+price+]` &convert=`0`!] + + + [!PriceFormat? &price=`[+total+]` &convert=`0`!] + + +``` + +###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", выбрать "Установка из архива:" и далее следовать инструкциям. + +## Что для чего? ## +После установки вы увидите несколько установленных дополнений. Давайте разберёмся, какое из них за что отвечает. + + + +## Принципы работы ## + +--- + +### Покупка ### +На каждой странице, где осуществляется покупка, должен быть вызван сниппет 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

    - -

    Кроме того, в DLBuildMenu работают и другие фишки из арсенала ДокЛистер, описывать которые здесь не стану, для этого нужно изучать сам DL.

    -

    Автор: Agel_Nash

    \ 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 параметра в ДокЛистере.

    -

    &currentDepth

    -

    Исходный уровень вложенности (глубина).

    -

    Возможные значения: целое число от 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, &currentClass, &firstClass, &evenClass, &oddClass и &activeClass.

    -

    [+url+]

    -

    УРЛ ресурса аналогично ДокЛистеру.

    -

    [+e.title+]

    -

    Экранированное значение menutitle или pagetitle (если menutitle пуст) аналогично Доклистеру.

    -

    [+id+]

    -

    ID ресурса аналогично ДокЛистеру.

    - -

    Вы можете использовать и другие плейсхолдеры ДокЛистера, устанавливаемые контроллером 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: +``` +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: +``` +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, из конфига, из глобального плейсхолдера.

    - -

    &TplMainOwner

    -

    Основной шаблон-обертка (для уровня глубины 1).

    -
    Значение по умолчанию:
    -
    @CODE:<ul id="nav" class="menu level-1">[+dl.wrap+]</ul>
    -

    Примечание: у вас должен быть задан шаблон &TplMainOwner или &TplOwner1, иначе будет использовано дефолтное значение шаблона &TplMainOwner.

    -

    &TplSubOwner

    -

    Шаблон-обертка для вложенных уровней (для субменю).

    -
    Значение по умолчанию:
    -
    @CODE:<ul class="sub-menu level-[+dl.currentDepth+]">[+dl.wrap+]</ul>
    -

    Примечание: для вывода N-уровневого меню у вас в дополнение к основной обёртке должен быть задан по крайней мере &TplSubOwner и/или шаблоны &TplOwnerN. Иначе будет использовано дефолтное значение &TplSubOwner.

    -

    &TplOwnerN

    -

    Шаблон-обертка для субменю N-го уровня вложенности, для соответствующих уровней &TplOwnerN имеет приоритет над &TplMainOwner и &TplSubOwner (см. Примечание).

    -

    Значение по умолчанию: нет

    -

    Примечание: Если заданы и &TplOwner1, и &TplMainOwner, то будет использован &TplOwner1. Если заданы и &TplOwner2 и &TplSubOwner, то для уровня 2 будет использован &TplOwner2, а для уровней начиная с 3-го – &TplSubOwner.

    - - -

    &TplOneItem

    -

    Основной шаблон для каждого пункта меню всех уровней.

    -
    Значение по умолчанию:
    -
    -@CODE:<li id="menu-item-[+id+]" class="menu-item [+dl.class+]">
    - <a href="[+url+]" title="[+e.title+]">[+title+]</a>
    - [+dl.submenu+]
    -</li>
    -
    -

    Примечание: у вас должны быть заданы все нужные вам шаблоны пунктов меню, по крайней мере &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 +``` +[+e.pagetitle+][+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:
  • [+e.pagetitle+][+title+] ([+id+]) [+tv.tags+]
  • "; + +$output = ''; + +for($alpha = 65; $alpha <= 90; $alpha++) { + $params['char'] = chr($alpha); + + $filters = explode(",",$params['tvList']); + + $filterOut = 'OR('; + foreach ( $filters as $key => $value ) + { + $filterOut .= 'tv:'.$value.':like-r:'.chr($alpha).';'; + } + $filterOut = rtrim($filterOut, ";"); + $filterOut.= ')'; + + $params['filters'] = $filterOut; + + $output .= "

    ".chr($alpha)."

    "; + $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: последние просмотренные документы

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

    В свойствах сниппета есть два параметра:

    -
      -
    1. Время хранения cookie. Задается в секундах, по умолчанию 30 дней
    2. -
    3. Сколько документов запоминать? По умолчанию: 5
    4. -
    -

    Автор: Максим

    -

    Установка:

    -
      -
    1. Создать новый сниппет и вставить туда код
    2. -
    3. Поставить галочку «Анализировать DocBlock» и сохранить
    4. -
    -
    -<?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=`
      [+dl.wrap+]
    ` - &tpl=`@CODE: <li><a href="[+url+]">[+title+]</a></li>` + &ownerTPL=` +[+dl.wrap+] +` + &tpl=`@CODE:
  • [+title+]
  • ` !] -
    \ 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>
    +
    [!DLRequest? &runSnippet=`DocLister` &parents=`2` - &tpl=`@CODE:

    [+id+]. [+pagetitle+]

    ` + &tpl=`@CODE: +[+id+]. [+pagetitle+] + +` &paginate=`pages` &display=`0` &rqParams=`{ @@ -48,40 +53,41 @@ if ($_REQUEST[$field] == $value) { & paramsForm=`paramsForm` &keepParams=`page` & paramsOwnerTPL=`@CODE: -
    + [+keepParams+] [+params+] - -
    + Отправить + ` & param.ownerTPL=`@CODE: - - + ` & param.tpl=`@CODE: - + ` &sortBy.tpl=`@CODE: - + ` &display.ownerTPL=`@CODE: - - + ` &keepTpl=`@CODE: - + ` !] -</div> +
    [+pages+] -
    -

    После & пробелы стоят, потому что иначе редактор подменяет символы.

    -

    Автор: Pathologic

    \ 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: Вывод соседних ресурсов с шаблонизацией

    -Вывод соседних ресурсов с шаблонизацией (множественная кольцевая перелинковка). -

    Вывод соседних ресурсов с шаблонизацией (множественная кольцевая перелинковка)

    -

    Автор: Aharito

    - -

    &idType, &parents, &documents, &ignoreEmpty

    -

    - как в ДокЛистере.

    -

    &Qty

    -

    (целое), кол-во предыдущих и следующих соседей. Имеет приоритете над &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

    -
    [[DLSiblings?
    -    &idType=`parents`
    -    &parents=`152`
    -    &thumbSnippet=`sgThumb`
    -    &thumbOptions=`{"tv.article_intro_img":{"small":"280x160","medium":"700x400"}}`   //Здесь НЕ надо менять точку на подчеркивание (это не шаблон)
    -    &ownerTPL=`@CODE:<div class="row latest-news inline-showcase">[+wrap+]</div><hr>`                                       
    -    &tpl=`@CODE:
    -    <div class="column col-1-1-2-4-4 margin-bottom-30">   //А здесь везде надо менять (это шаблон)              
    -        <div class="article-announce-img">
    -            <img class="img-responsive" src="[+tv_article_intro_img_medium+]" alt="[+e_title+] | [(cfg_company_brand_name)]">               
    -        </div>
    -        <div class="article-announce-content">
    -            <div class="article-announce-header">
    -                <a href="[+url+]">[+tv_h1+]</a>
    -            </div>
    -        </div>
    -        <a href="[+url+]" class="wrapper-link"></a>
    -    </div>`
    -    &Qty=`2`
    -    &tvList=`article_intro_img,h1`
    -    &prepare=`FastImagePreviews`
    -]]
    -

    Примечание: Это только примеры. Для того, чтобы они заработали на вашем сайте, у вас должны быть такие же TV и такие же prepare-сниппеты.

    -

    Результат работы примера 2

    -

    siblings_demo_1

    -

    Скорость работы

    -

    1) Кол-во запросов и т.д. при кешированном вызове сниппета на кешированном ресурсе на микро-сайте, выборка 4 из 8 статей с сортировкой

    -
    &orderBy=`if(pub_date=0,createdon,pub_date) DESC`
    -

    siblings_requests

    -

    2) Кол-во запросов и т.д. при некешированном вызове сниппета на кешированном ресурсе на микро-сайте, выборка 4 из 8 статей с сортировкой

    -
    &orderBy=`if(pub_date=0,createdon,pub_date) DESC`
    -

    siblings_requests_nocache

    -

    Недостатки

    -
      -
    • Длинная 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) +
    + [+e_title+] | [(cfg_company_brand_name)] +
    +
    +
    + [+tv_h1+] +
    +
    + +
    ` + &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 +![siblings_demo_1](https://cloud.githubusercontent.com/assets/6253807/24569757/ea66affa-1691-11e7-8320-aa726ffd3dbc.png) + +#### 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: ``` [[DocInfo? &docid=`[+parent+]` &field=`pagetitle`]] @@ -116,9 +98,7 @@ $data['longtitle'] = "[[snippet? &text=`".$data['pagetitle']."`]]"; [[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:

    - -

    Класс для вывода информации из таблиц по предопределенным правилам. Если нет правил, то данные отображаются без дополнительной обработки и связи. Т.е. все поля и значения совпадают с базой данных.

    -

    Правила для обработки информации описаны в контроллерах. Главный контроллер - site_content, который определяет связь основных документов site_content с данными в TV-параметрах

    -

    На базе класса DocLister сформировано 12 сниппетов:

    - -

    Компоненты на базе DocLister:

    - -

    Автор: Agel_Nash

    \ 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: -
    -
    -
    -
    - - -
    - -
    - - [+phone.error+] -
    -
    -[+form.messages+] -
    -
    - -
    -
    - - - [+vericode.error+] -
    -
    -
    -
    ` -&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` убедитесь что он не отключен: - -![Не забудьте включить userHelper](https://habrastorage.org/web/dbc/1e2/abd/dbc1e2abd8664a548f4eca254187fb60.png) - -## Параметры контроллера - -### 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: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+background.error+] +
    +
    + +
    + +
    + + [+message.error+] +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&then='test@test.com' +&chisender='1' +&chanderfield='email' +&chandertpl='@code:Thank you for contacting us, [+note.value+]' +&reporter='@code: +

    Name: [+name.value+]

    +

    Telephone: [+von.value+]

    +

    email: [+email.value+]

    +

    Message: [+message:strip_tags:nl2br+]

    +` +&arrowclass=' häs-arrow' +&riveredklass=' häs-warning' +&subject='New Message' +&messenger='@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: +
    +
    +
    +
    + +
    + + + [+name.error+] +
    +
    +
    +
    + + + [+email.error+] +
    +
    +
    +
    + + + [+background.error+] +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + [+products.error+] +
    +
    + + + [+message.error+] +
    +
    + + [+agree.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&subjectTpl=`@CODE: [+topic.value+] в [+department.value+]` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +

    Продукты: [+products.value+]

    +

    Сообщение: [+message:strip_tags:nl2br+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject='New Message' +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git a/en/04_Extras/FormLister/500_examples/003_Upload_Files.md b/en/04_Extras/FormLister/500_examples/003_Upload_Files.md new file mode 100644 index 00000000..e5859bbc --- /dev/null +++ b/en/04_Extras/FormLister/500_examples/003_Upload_Files.md @@ -0,0 +1,118 @@ +## Upload Files +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Be sure to enter a name" +}, +"email":{ + "required":"Be sure to enter your email", + "email":"Enter email correctly" +}, +"message":{ + "required":"Be sure to enter a message" +} +}` +&attachments=`first,second` +&attachFiles=`{"userfile":{"filepath":"assets/images/logo.png","filename":"logo.png"}}` +&fileRules=`{ +"first":{ + "required":"Attach the document", + "allowed":{ + "params": [ ["doc","docx","pdf"] ], + "message": "Only Word and Pdf documents are allowed" + }, + "maxSize" : { + "params": 100, + "message": "File size should not exceed 100 kb" + } +}, +"second":{ + "required":"Attach 2 pictures", + "maxSize" : { + "params": 1024, + "message": "File size should not exceed 1 mb" + }, + "allowed": { + "params": [ ["jpg","jpeg","png","gif"] ], + "message" : "Only images allowed" + }, + "maxCount":{ + "params" : 4, + "message" : "No more than 4 pictures" + }, + "minCount":{ + "params" : 2, + "message" : "At least 2 pictures" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+message.error+] +
    +
    +
    + +
    + + [+first.error+] +
    +
    +
    + +
    + + [+second.error+] +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Email: [+email.value+]

    +

    Сообщение: [+message:strip_tags:nl2br+]

    +

    Документы:[+first.value+]

    +

    Картинки:[+second.value+]

    +

    Доп.:[+userfile.value+] +

    Вложения: [+attachments.value+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`New Message` +&messagesOuterTpl=`@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: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+phone.error+] +
    +
    + +
    + +
    + + [+message.error+] +
    +
    + [+form.messages+] +
    + +
    +
    Enter a number
    + + [+vericode.error+] +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    ` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`New Message` +&messagesOuterTpl=`@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: +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&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: +
    +
    +
    +
    + +
    + + +
    +

    To be filled in only by individuals

    +
    + + + + [+name.error+] + +
    +
    +
    +
    + + + + [+email.error+] + +
    +
    +
    +
    + + + + [+phone.error+] + +
    +
    +
    +

    To be filled in only by legal entities

    +
    + + + [+entname.error+] + +
    +
    +
    +
    + + + [+entemail.error+] +
    +
    +
    +
    + + + [+entphone.error+] +
    +
    +
    +
    + + + [+entaddress.error+] + +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&subjectTpl=`@CODE:[+type.value+]` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +` +&reportEntTpl=`@CODE: +

    Company name: [+entname.value+]

    +

    Phone: [+entphone.value+]

    +

    Email: [+entemail.value+]

    +

    Registered office: [+entaddress.value+]

    +` +&prepare=`typeSelector` +&errorClass=` has-error` +&requiredClass=` has-warning` +&messagesOuterTpl=`@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: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    +
    + + + [+password.error+] +
    + [+form.messages+] +
    + +
    + +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&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: +
    +
    +
    +
    + +
    + + + [+fullname.error+] +
    +
    + + + [+email.error+] +
    +
    +
    +
    + + + [+password.error+] +
    +
    +
    +
    + + + [+repeatPassword.error+] +
    +
    +
    +
    + + [+agree.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&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:` +&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: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&successTpl='@CODE:
    On the email you specified during registration, an email has been sent with further instructions!
    ` +&subject='Account Activation' +&reportTpl='@CODE:

    To activate your account, go to [+activate.url+]

    ' +&activateReportTpl='@CODE:

    Hello, [+fullname.value+]!

    Your account has been successfully activated.

    ` +&activateSuccessTpl='@CODE:
    You account has been successfully activated!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git a/en/04_Extras/FormLister/500_examples/010_Password_Recovery.md b/en/04_Extras/FormLister/500_examples/010_Password_Recovery.md new file mode 100644 index 00000000..5a5067a8 --- /dev/null +++ b/en/04_Extras/FormLister/500_examples/010_Password_Recovery.md @@ -0,0 +1,131 @@ +## Password Recovery +### Option 1 +The Password is generated automatically and sent via email. +``` +[!FormLister? +&controller=`Reminder` +&formid=`remind` +&rules=`{ +"email":{ + "required":"Be sure to enter an email", + "email":"Enter the email correctly" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&successTpl='@CODE:
    On the email you specified during registration, an email has been sent with further instructions!
    ` +&subject='Password Recovery' +&resetTo=`38` +&reportTpl='@CODE:

    To recover your password, go to [+reset.url+]

    ' +&resetReportTpl='@CODE:

    Hello, [+fullname.value+]!

    Your new password: [+newpassword+]

    ' +&resetSuccessTpl='@CODE:
    A letter with a new password has been sent to the email you specified during registration!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` + +### Option 2 +User selected password. +``` +[!FormLister? +&controller=`Reminder` +&formid=`remind` +&rules=`{ +"email":{ + "required":"Be sure to enter an email", + "email":"Enter the email correctly" +} +}` +&resetRules=`{ +"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" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&resetTpl=`@CODE: +
    +
    +
    +
    + + + +
    + + + [+password.error+] +
    +
    + + + [+repeatPassword.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    +` +&uidName=`uid` +&messagesOuterTpl=`@CODE:` +&successTpl='@CODE:
    On the email you specified during registration, an email has been sent with further instructions!
    ` +&subject='Password Recovery' +&reportTpl='@CODE:

    To recover your password, go to [+reset.url+]

    ' +&resetReportTpl='@CODE:

    Hello, [+fullname.value+]!

    Your new password: [+newpassword+]

    ' +&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 dropdownDropdown list checkboxCheckboxes, allows to multiselect radioRadio buttons +imagecheckboxAs checkbox, but with images. In elements array should be images as values. +imageradioAs 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: diff --git "a/en/04_Extras/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/en/04_Extras/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" index be657bdb..51026716 100644 --- "a/en/04_Extras/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" +++ "b/en/04_Extras/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" @@ -1,31 +1,31 @@ -

    Personalize: Параметры

    -Параметры сниппета Personalize для проверки авторизован ли веб-пользователь или менеджер. +

    Personalize: Options

    +Personalize snippet parameters to check if the web user or manager is authorized.
    -Формат: имя чанка
    -Значение по умолчанию: нет
    -Примечание:
    -Пример: +Format: chunk name
    +Default value: No
    +Note:
    +Exemple:
    &yesChunk=`Link`
    -Формат: имя чанка
    -Значение по умолчанию: нет
    +Format: имя чанка
    +Default value: No
    Примечание:
    Пример:
    &noChunk=`Register`
    @@ -34,58 +34,58 @@
    -Формат:
    -Значение по умолчанию: нет
    -Примечание: Используется только в чанке yesChunk
    -Пример: +Format:
    +Default value: нет
    +Note: Used only in the yesChunk chunk
    +Exemple:
    &ph=`name`
    -Формат: web | mgr
    -Значение по умолчанию: web
    -Примечание:
    -Пример: +Format: web | mgr
    +Default value: web
    +Note:
    +Exemple:
    &context=`mgr`
    -Формат:
    -Значение по умолчанию:
    -Примечание:
    -Пример: +Format:
    +Default value:
    +Note:
    +Exemple:
    &yesTV=``
    -Формат:
    -Значение по умолчанию:
    -Примечание:
    -Пример: +Fromat:
    +Default value:
    +Note:
    +Exemple:
    &noTV=``
    -
    \ No newline at end of file +
    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.

    -

    Скачивать здесь: Pathologic

    -

    Настройки плагина

    -
      -
    • Tab name – название вкладки;
    • -
    • Controller class – класс контроллера отличный от стандартного;
    • -
    • Templates – id шаблонов, с которыми работает плагин, обязательно;
    • -
    • Documents – то же самое, но для отдельных ресурсов;
    • -
    • Ignore Documents – id исключаемых ресурсов;
    • -
    • Roles – id разрешенных ролей;
    • -
    • Storage folder – папка, где хранятся файлы, по умолчанию assets/storage/;
    • -
    • Icons folder – папка, в которой хранятся иконки файлов, по умолчанию assets/snippets/simplefiles/icons/;
    • -
    • Allowed files – расширения файлов, разрешенных для загрузки, через запятую; если не указывать, то будет использована системная настройка;
    • -
    -

    Maximum file size – ограничение размера файла, в мегабайтах.

    -

    Иконки должны именоваться как расширение_файла_строчными_буквами.png

    -

    Иконка file.png подставляется, если не нашлось подходящей.

    - -

    Вывод записей

    -

    По выводу записей читаем про SimpleGallery.

    -

    При выводе через сниппеты-обертки 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:
    [+dl.wrap+]
    ` +&thumbSnippet=`sgThumb` +&thumbOptions=`400x300` +&display=`16` +&paginate=`pages` +&PrevNextAlwaysShow=`1` +&tpl=`@CODE: + +` +&TplWrapPaginate=`@CODE:` +&TplCurrentPage=`@CODE:
  • [+num+]
  • ` +&TplPage=`@CODE:
  • [+num+]
  • ` +&TplNextP=`@CODE:
  • ` +&TplLastP=`@CODE:
  • ` +&TplFirstP=`@CODE:
  • ` +&TplPrevP=`@CODE:
  • ` +&TplNextI=`@CODE:
  • ` +&TplLastI=`@CODE:
  • ` +&TplFirstI=`@CODE:
  • ` +&TplPrevI=`@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:
    [+dl.wrap+]
    ` -&thumbSnippet=`sgThumb` -&thumbOptions=`400x300` -&display=`16` -&paginate=`pages` -&PrevNextAlwaysShow=`1` -&tpl=`@CODE: - -` -&TplWrapPaginate=`@CODE:` -&TplCurrentPage=`@CODE:
  • [+num+]
  • ` -&TplPage=`@CODE:
  • [+num+]
  • ` -&TplNextP=`@CODE:
  • ` -&TplLastP=`@CODE:
  • ` -&TplFirstP=`@CODE:
  • ` -&TplPrevP=`@CODE:
  • ` -&TplNextI=`@CODE:
  • ` -&TplLastI=`@CODE:
  • ` -&TplFirstI=`@CODE:
  • ` -&TplPrevI=`@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:

    [+pagetitle+] [+count+]

    [+images+]` +&sgDisplay=`4` +&sgOuterTpl=`@CODE:
    [+wrapper+]
    ` +&sgRowTpl=`@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:

    [+pagetitle+] [+count+]

    [+images+]` -&sgDisplay=`4` -&sgOuterTpl=`@CODE:
    [+wrapper+]
    ` -&sgRowTpl=`@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`
     ]]
    -
    - -

    Результат:

    -
    +```
    +Result:
    +```
     assets/galleries/2/kitty099h.jpg kitty099h
     assets/galleries/2/kitty098p.jpg kitty098p
     assets/galleries/2/kitty096j.jpg kitty096j
     assets/galleries/2/kitty095s.jpg kitty095s
     assets/galleries/2/kitty094c.jpg kitty094c
     assets/galleries/2/kitty093p.jpg kitty093p
    -
    -

    Если на страницу добавить [+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>`
    +
    +	[+e.sg_title+]
    +`
     ]]
    -
    +``` +### 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, чтобы получить возможность добавить картинки из галерей при выводе списка: -

    -

    Вызов DocLister выглядит так:

    -
    +The DocLister call looks like this:
    +```
     [[DocLister? 
     &controller=`sg_site_content`
     &prepare=`prepareImages`
     &sgOrderBy=`sg_id DESC`
     &tpl=`@CODE:
    -<div class="page-header">
    -	<h1><a href="[+url+]">[+pagetitle+]</a></h1>
    -</div>
    +
     [+images+]
    -<div class="clearfix"></div>` 
    +
    ` &sgOuterTpl=`@CODE:[+wrapper+]` &sgRowTpl=`@CODE: -<a href="[+sg_image+]"> - <img src="[+thumb.sg_image+]" class="img-thumbnail" alt="[+e.sg_title+]" title="[+e.sg_description+]"> -</a>` + + [+e.sg_title+] +` &sgDisplay=`5` ]] -
    - -

    То есть то же самое, что простой вывод документов, но добавлены дополнительные параметры:

    -
      -
    • &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>
    +
     [+images+]
    -<div class="clearfix"></div>` 
    +
    ` &sgOuterTpl=`@CODE:[+wrapper+]` &sgRowTpl=`@CODE: -<a href="[+sg_image+]"> - <img src="[+thumb.sg_image+]" class="img-thumbnail" alt="[+e.sg_title+]" title="[+e.sg_description+]"> -</a>` + + [+e.sg_title+] +` &sgDisplay=`5` ]] -
    -

    В 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 нужно подключать расширение:

    -
    &extenders=`@FILE assets/modules/yams/yams.extender.inc.php`
    -

    Если вызов некэшируемый [!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. -
    -

    Вызов Wayfinder– a:

    -
    [[Wayfinder? &startId=`0`  &useWeblinkUrl=`true` &rowTpl=`menu_tpl`]]
    -

    YAMS-у требуется, чтобы параметр &useWeblinkUrl был включён.

    -

    Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS.

    -

    Шаблон одной кнопки – menu_tpl:

    -
    -<li [+wf.id+][+wf.classes+]>
    -	[[YAMS? &get=`content` &docid=`[+wf.docid+]` &from=`pagetitle`]]
    -	[+wf.wrapper+]
    -</li>
    -
    \ 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. -
    -

    Независимо от того, что используется, в файле с правилами или чанке с правилами в конце надо прописать:

    -
    require ($modx->config['base_path'] . 'assets/modules/yams/yams.mm_rules.inc.php' );
    -

    Собственно, YAMS готов к работе.

    -

    В «Инструментах» > «Конфигурации» включить Дружественные 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? &get=`repeat` &repeattpl=`lang_tpl` &currenttpl=`current_lang_tpl`]]

    -
    &repeattpl=`lang_tpl` – шаблон кнопки языка
    -
    &currenttpl=`current_lang_tpl` – шаблон кнопки текущего языка
    -

    Шаблон lang_tpl выглядит, например, вот так:

    -
    (yams_name)
    -

    (yams_docr) – ссылка, сгенерированная до текущей страницы в этом или остальных языках

    -

    (yams_name) – имя языка, вписанное в табе Модули > Yams > Language Settings

    -

    &currenttpl – шаблон выбранного языка. Тоже самое, только можно добавить 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.

    -

    Подключение модуля, плагина и сниппета:

    -

    Код модуля:

    -
    require_once ( $modx->config['base_path'] . 'assets/modules/yams/yams.module.inc.php' );
    -

    – Создать в администрационной части в разделе «Модули» новый модуль YAMS.

    -

    Описание: Yet Another Multilingual Solution Module

    -

    – Создать в администрационной части в разделе «Плагины» новый плагин YAMS.

    -

    Описание: Yet Another Multilingual Solution Plugin

    -

    Код плагина:

    -
    require ( $modx->config['base_path'] . 'assets/modules/yams/yams.plugin.inc.php');
    -

    В системных событиях плагина поставить галочки на:

    -
      -
    • OnLoadWebDocument
    • -
    • OnParseDocument
    • -
    • OnWebPageInit
    • -
    • OnWebPagePrerender
    • -
    • OnLoadWebPageCache
    • -
    • OnPageNotFound
    • -
    • OnBeforeDocFormSave
    • -
    -

    – Создать в администрационной части в разделе «Сниппеты» новый сниппет YAMS.

    -

    Описание: Yet Another Multilingual Solution Snippet

    -

    Код сниппета:

    -
    <?php
    -	require ( $modx->config['base_path'] . 'assets/modules/yams/yams.snippet.inc.php' );
    -?>
    -

    После перезагрузить страницу, чтобы модуль заработал.

    \ 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:
      ` + &repeattpl=`otherFlagItemTpl` + ¤ttpl=`currentFlagItemTpl` + &aftertpl=`@CODE:
    + + (yams_name) + + + +and "currentFlagItemTpl" is a chunk that contains an unlinked flag image: + +
  • + (yams_name) +
  • + +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: + + +
  • + + (yams_name) + +
  • + + 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: + + +
      + [[YAMS? + &get=`repeat` + &repeattpl=`LandingPageRepeat` + ]] +
    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

    -
      -
    • Используйте Менеджер Пакетов и установите последний пакет multiTV
    • -
    • Или установите вручную: -
        -
      1. Загрузите папку assets/tvs/multitv в соответствующую папку в вашей установке.
      2. -
      3. Создайте новый шаблон и переменную с типом ввода custom input (если имя этой переменной будет multidemo то будет использоваться файл конфигурации multidemo)
      4. -
      5. Вставьте следующий код в возможные значения @INCLUDE/assets/tvs/multitv/multitv.customtv.php
      6. -
      7. Создайте новый сниппет с названием multiTV и поместите в него следующий код:
        <?php return include(MODX_BASE_PATH.'assets/tvs/multitv/multitv.snippet.php'); ?>
      8. -
      -
    • -
    -

    Совместимость

    -
      -
    1. Если вы хотите использовать multiTV с ManagerManager до версии MODX 1.0.9 вы должны исправить файл mm.inc.php и вставить case 'custom_tv': в 136 строке перед строкой $t = 'textarea';
    2. -
    3. Если вы хотите использовать multiTV с YAMS, вы должны исправить yams.plugin.inc.php согласно этой инструкции.
    4. -
    5. Если вы обновляете 1.4.10 и ниже можно установить сниппет updateTV и изменить данные в вашей переменной multiTV в новый формат. Это необходимо, если вы хотите добавить/удалить столбцы в multiTV или если вы хотите отсортировать результаты по столбцу.
    6. -
    7. Если вы хотите использовать PHx с multiTV необходимо немного изменить код плагина PHx:
    8. -
    -
    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)100
    -
    -

    Поддерживаемые типы полей: text, rawtext, email, number, textareamini, textarea, rawtextarea, htmlarea, date, dropdown, listbox, listbox-multiple, checkbox, option, image, file

    -

    Параметр columns

    -

    В режимах datatable и dbtable могут быть определены в качестве ключа параметры columns. Этот ключ содержит массив параметров столбцов. Каждый столбец содержит массив свойств. Если свойство не задано, в качестве ключа используется fields.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    СвойствоОписаниеЗначение по умолчанию
    fieldname(обязательный параметр) Имя свойства-
    captionЗаголовок столбцаcaption параметра fields
    widthШирина столбцаwidth параметра fields
    renderEnable rengering of the column content with this PHx capable strin-
    sortableВключить сортировку по этой колонке, нажав на Заголовок столбца в datatable или dbtable режиме. Активно только при отключенной сортировке в других опцияхtrue
    -
    -

    Редактирование слоев

    -

    В режимах datatable и dbtable редактирование содержимого слоя может быть определено в ключе form. Этот ключ содержит массив параметров вкладки form.

    -
    - - - - - - - - - - - - - - - - -
    СвойствоОписаниеЗначение по умолчанию
    caption(обязательный параметр) Заголовок вкладки form-
    content(обязательный параметр) Ассоциативный массив параметров полейcaption параметра fields
    -
    -

    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Заголовок для inputcaption параметра fields
    -
    -

    Шаблоны по умолчанию

    -

    Шаблоны для сниппета multiTV используемые по умолчанию, могут быть определены в параметре templates

    -
    - - - - - - - - - - - - - - - - -
    СвойствоОписаниеЗначение по умолчанию
    rowTplШаблон вывода строки. Может быть изменен в вызове сниппета-
    outerTplШаблон вывода внешнего блока. Может быть изменен в вызове сниппета-
    -
    -

    Другие опции

    -

    Другие опции могут быть определены в параметре configuration

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    СвойствоОписаниеЗначение по умолчанию
    enablePastemultiTV может содержать ссылку для вставки данных. В этом окне вы могли бы вставить Word/HTML таблицы данных из буфера обмена, Google Docs таблицы и данные в формате csv.true
    enableClearСсылка на удаление всех элементов multiTVtrue
    csvseparatorРазделитель столбцов при вставке данных csv. Каждая строка должна начинаться с новой строки.,
    radioTabsTabs 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:` +&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 обязателен. Остальные параметры в случае если используются значения по умолчанию, могут быть удалены.

    -
    [!multiTV?
    -&tvName=`yourMultiTVname`
    -&docid=`[*id*]`
    -&tplConfig=``
    -&outerTpl=`@CODE:<ul>((wrapper))</ul>`
    -&rowTpl=`@CODE:<li>((event)), ((location)), ((price))</li>`
    -&display=`5`
    -&offset=`0`
    -&rows=`all`
    -&randomize=`0`
    -&reverse=`0`
    -&orderBy=``
    -&toPlaceholder=``
    -&toJson=`0`
    -&published=`1`
    -&emptyOutput=`1`
    -&noResults=``
    -&outputSeparator=``
    -&firstClass=`first`
    -&lastClass=`last`
    -&evenClass=``
    -&oddClass=``
    -&paginate=`0`
    -&offsetKey=`page`
    -!]
    -

    Параметры

    -

    По умолчанию шаблоны для внешнего блока и строки могут быть определены в файле конфигурации. Эти шаблоны могут быть перезаписаны параметрами rowTpl и outerTpl в вызове сниппета.

    -
    -
    - -
    -
    -Формат: TV-параметр
    -Значение по умолчанию: пусто
    -Примечание: Обязательный параметр. Имена столбцов multiTV будут получены из конфигурационного файла
    -Пример: -
    &tvName=`yourMultiTVname`
    -
    -
    -
    -
    - -
    -
    -Формат: id документа
    -Значение по умолчанию: Id текущего документа
    -Примечание: Необходим при вызове в шаблоне Ditto.
    -Пример: -
    &docid=``
    -
    -
    -
    -
    - -
    -
    -Формат:
    -Значение по умолчанию: нет
    -Примечание: Будет с префиксом templates
    -Пример: -
    &tplConfig=``
    -
    -
    -
    -
    - -
    -
    -Формат: имя чанка | @FILE | @CODE
    -Значение по умолчанию: @CODE:
    -Примечание: Имя чанка, имя файла (должно начинаться с @FILE) или код (должно начинаться с @CODE - плэйсхолдеры должны быть в двойных скобках (( и )). (Примечание 3)
    -Пример: -
    &outerTpl=``
    -
    -
    -
    -
    - -
    -
    -Формат: имя чанка | @FILE | @CODE
    -Значение по умолчанию: @CODE:
    -Примечание: Имя чанка, имя файла (должно начинаться с @FILE) или код (должно начинаться с @CODE - плэйсхолдеры должны быть в двойных скобках (( и )). (Примечание 3)
    -Пример: -
    &rowTpl=``
    -
    -
    -
    -
    - -
    -
    -Формат: число | all
    -Значение по умолчанию: 5
    -Примечание: all - показать все
    -Пример: -
    &display=`all`
    -
    -
    -
    -
    - -
    -
    -Формат: число
    -Значение по умолчанию: 0
    -Примечание:
    -Пример: -
    &offset=`5`
    -
    -
    -
    -
    - -
    -
    -Формат: число | all
    -Значение по умолчанию: all
    -Примечание:
    -Пример: -
    &rows=`1,2`
    -
    -
    -
    -
    - -
    -
    -Формат: 0 | 1
    -Значение по умолчанию: 0
    -Примечание: Отключает параметры reverse и orderBy
    -Пример: -
    &randomize=`1`
    -
    -
    -
    -
    - -
    -
    -Формат: 0 | 1
    -Значение по умолчанию: 0
    -Примечание: Отключает orderBy параметр
    -Пример: -
    &reverse=`1`
    -
    -
    -
    -
    - -
    -
    -Формат: name:type direction
    -Значение по умолчанию: name:text asc
    -Примечание: Тип может быть text или date
    -Пример: -
    &orderBy=``
    -
    -
    -
    -
    - -
    -
    -Формат: имя плейсхолдера
    -Значение по умолчанию: нет
    -Примечание: Будет создан плейсхолдер с именем, указанным в значении параметра [+element+]. Отдельные элементы выводятся плейсхолдерами, где к имени добавляется номер строки [+element.1+]. Нормальный вывод сниппета подавляется.
    -Пример: -
    &toPlaceholder=`myPlaceholder`
    -
    -
    -
    -
    - -
    -
    -Формат: 0 | 1
    -Значение по умолчанию: 0
    -Примечание:
    -Пример: -
    &toJson=`1`
    -
    -
    -
    -
    - -
    -
    -Формат: 0 | 1 | 2
    -Значение по умолчанию: 1
    -Примечание: отображать только multiTV из опубликованных (1), неопубликованных (0) или любых (2) документов
    -Пример: -
    &published=`2`
    -
    -
    -
    -
    - -
    -
    -Формат: 0 | 1
    -Значение по умолчанию: 1
    -Примечание:
    -Пример: -
    &emptyOutput=`0`
    -
    -
    -
    -
    - -
    -
    -Формат: имя чанка | @FILE | @CODE
    -Значение по умолчанию: нет
    -Примечание:
    -Пример: -
    &noResults=`noResults`
    -
    -
    -
    -
    - -
    -
    -Формат: строка
    -Значение по умолчанию: пусто
    -Примечание:
    -Пример: -
    &outputSeparator=``
    -
    -
    -
    -
    - -
    -
    -Формат: имя класса
    -Значение по умолчанию: first
    -Примечание: Содержимое плейсхолдера row.class для первого элемента
    -Пример: -
    &firstClass=``
    -
    -
    -
    -
    - -
    -
    -Формат: имя класса
    -Значение по умолчанию: last
    -Примечание: Содержимое плейсхолдера row.class у последнего элемента
    -Пример: -
    &lastClass=``
    -
    -
    -
    -
    - -
    -
    -Формат: имя класса
    -Значение по умолчанию: нет
    -Примечание: Содержимое плейсхолдера row.class для четных элементов
    -Пример: -
    &evenClass=`even`
    -
    -
    -
    -
    - -
    -
    -Формат: имя класса
    -Значение по умолчанию: нет
    -Примечание: Содержимое плейсхолдера row.class для нечетных элементов
    -Пример: -
    &oddClass=`odd`
    -
    -
    -
    -
    - -
    -
    -Формат: 0 | 1
    -Значение по умолчанию: 0
    -Примечание:
    -Пример: -
    &paginate=`1`
    -
    -
    -
    -
    - -
    -
    -Формат:
    -Значение по умолчанию: 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
    renderEnable rengering of the column content with this PHx capable string-
    -
    -

    Редактирование слоев

    -

    Содержимое редактируемого слоя во время добавления/редактирования одной строки может быть определено в ключе form. Этот ключ содержит массив параметров вкладки form.

    -
    - - - - - - - - - - - - - - - - -
    СвойствоОписаниеЗначение по умолчанию
    caption(обязательный параметр) Заголовок вкладки form-
    content(обязательный параметр) Ассоциативный массив параметров полей-
    -
    -

    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)-
    buttons(обязательный параметр) Ассоциативный массив конфигурации кнопок-
    -
    -

    Каждая конфигурация конопок содержит ассоциативный массив параметров кнопок.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyDescriptionDefault
    captionтекст на кнопке-
    iconиконка для кнопки, расположенная в assets/tvs/multitv/css/images-
    processorимя обработчика файла assets/tvs/multitv/processors/[key] (key contains the group config key)-
    formМассив параметров вкладки form (см. редактирование слоев)-
    -
    -

    Пример генерации кнопки.

    -
    -"buttons": {
    -	"coupons": {
    -		"position": "topright",
    -		"buttons": {
    -			"generate": {
    -				"caption": "Generate",
    -				"icon": "wand.png",
    -				"processor": "generate",
    -				"form": [{
    -						"caption": "Coupon",
    -						"content": {
    -							"count": {},
    -							"discount": {},
    -							"validuser": {},
    -							"validgroup": {},
    -							"validuntil": {},
    -							"maxuse": {}
    -						}
    -					}
    -				]
    -			}
    -		}
    -	}
    -},
    -
    -

    Другие опции

    -

    Другие опции могут быть определены в ключе configuration.

    -
    - - - - - - - - - - - - - - - - - - - - - -
    СвойствоОписаниеЗначение по умолчанию
    radioTabsTabs 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
    sortingEnable sorting by column header.false
    sortindexColumn 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 @@ - - -

    multiTV: Дополнительно

    -Применения multiTV в Ditto multiTvFilter экстендер Ditto PHx модификаторы. -
    -

    PHx модификатор

    -

    Так как строка JSON в multiTV начинается с [[ и заканчивается ]] (Примечание 1), вы не можете проверить multiTV на пустоту, т.е. [*multittvname:ne=``:then=`not empty`*].

    -

    Но вы могли бы использовать в этом случае PHx модификаторы из папки phx-modifier. Переместите два файла из этой папки в assets/plugins/phx/modifiers.

    -

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

    -
    [+phx:multitvisempty=`tvname|docid`:then=`xxx`:else=`yyy`+]
    -
    [+phx:multitvisnotempty=`tvname|docid`:then=`xxx`:else=`yyy`+]
    -

    Если docid не установлен, по умолчанию используется текущий документ.

    -

    multiTvFilter экстендер Ditto

    -

    Для фильтрации строк, отображаемых Ditto воспользуйтесь экстендером multiTvFilter.

    -
    - - - - - - - - - - - - - - -
    ПараметрОписание
    multiTvFilterBy(обязательный параметр) имя переменной multiTV
    multiTvFilterOptionsjson-массив параметров фильтра
    -
    -

    Могут быть использованы следующие параметры фильтра

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ПараметрОписание
    nameимя поля mulitTV, которое используется для фильтрации
    typeтип содержимого поля multiTV (возможные варианты: date, text)
    valueЗначение поля multiTV для фильтрации
    modeрежим фильтрации содержимого поля multiTV
    conjunctionЛогическая связь с предыдущим фильтром (AND/OR)
    -
    -

    Следующие режимы могут быть использованы для поля типа text:

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Тип сравненияОписание
    containsфильтровать, если хотя бо одно поле содержит текст критерия
    allcontainsфильтровать, если все поля содержат текст критерия
    containsnotфильтровать, если одно из полей не содержит текст критерия
    allcontainsnotфильтровать, если все поля не содержат текст критерия
    isфильтровать если одно поле соответствует критерию
    allisфильтровать если все поля соответствуют критерию
    isnotфильтровать, если одно из полей не соответствует критерию
    allisnotфильтровать, если все поля не соответствуют критерию
    -
    -

    Следующие режимы могут быть использованы для поля типа date:

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Тип сравненияОписание
    beforeфильтровать, если одно поле меньше критерия
    beforeallфильтровать, если все поля меньше критерия
    equalфильтровать, если одно поле равно критерию
    equalallфильтровать, если все поля равны критерию
    afterфильтровать, если одно поле больше критерия
    afterallфильтровать, если все поля больше критерия
    -
    -

    Примеры

    -

    Показать все дочерние документы контейнеров 3, 4 и 5, у которых переменная шаблона multiTV event в столбце title не содержит Important

    -
    [[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"}]`
    -]]
    -

    Если вы хотите фильтровать по нескольким значениям multiTV, добавьте еще один массив в multiTvFilterOptions. В этом примере отобразятся все дочерние документы контейнеров 3, 4, и 5 у которых переменная шаблона multiTV event в столбце title не содержит Important и все столбцы location соответствуют Outdoor.

    -
    [[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"}]`
    -]]
    -
    -

    Обновление на новый формат данных

    -

    Версия 1.4.11 multiTV использует новый формат данных (имена столбцов сохраняются в виде ключ - значение). Переменная и сниппет поддерживают старый и новый форматы, так что вам не придется обновлять multiTVs. Но вам это потребуется, если вы захотите добавить/удалить столбцы в multiTVs. Вызовите сниппет в документе MODX следующим образом:

    -
    [!updateTV? &tvNames=`yourMultiTVname1,yourMultiTVname2`!]
    -

    Параметры

    -
    - - - - - - - - - - - -
    ПараметрОписаниеЗначение по умолчанию
    tvNames(обязательно) разделенный запятыми список имен переменных, которые содержат данные 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 +![sGallery](https://user-images.githubusercontent.com/12029039/169609394-08ea36d6-2393-4261-aff2-348f73a6103c.png) +[![Latest Stable Version](https://img.shields.io/packagist/v/seiger/sgallery?label=version)](https://packagist.org/packages/seiger/sgallery) +[![CMS Evolution](https://img.shields.io/badge/CMS-Evolution-brightgreen.svg)](https://github.com/evolution-cms/evolution) +![PHP version](https://img.shields.io/packagist/php-v/seiger/sgallery) +[![License](https://img.shields.io/packagist/l/seiger/sgallery)](https://packagist.org/packages/seiger/sgallery) +[![Issues](https://img.shields.io/github/issues/Seiger/sgallery)](https://github.com/Seiger/sgallery/issues) +[![Stars](https://img.shields.io/packagist/stars/Seiger/sgallery)](https://packagist.org/packages/seiger/sgallery) +[![Total Downloads](https://img.shields.io/packagist/dt/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> +
    + {{$item->alt}} +
    +
    {{$item->title}}
    +

    {{$item->description}}

    + @if(trim($item->link_text))
    {{$item->link_text}}
    @endif +
    +
    +
    + @endif +@endforeach +``` +or YouTube filter +```php +@foreach(sGallery::collections()->get() as $item) + @if(sGallery::hasYoutube($item->type)) +
    +
    + +
    +

    {{$item->title}}

    +
    + @endif +@endforeach +``` +or +```php +@foreach(sGallery::collections()->documentId($product->id)->itemType('product')->get() as $item) +
    + + + +
    +@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 очень рекомендую пройтись по ссылкам ниже, сразу отпадут многие вопросы.

    -

    Видео уроки по созданию сайта на MODX EVO

    - 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 - размещение в виде внешнего файла или блока \ -По умолчанию: false - -*** - -####Пример - - $src = ""; - $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 + +Начиная с версии 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 - Имя + [+message.error+] + + + [+form.messages+] +
    +
    + +
    +
    + + + +` +&to=`test@test.com` +&ccSender=`1` +&ccSenderField=`email` +&ccSenderTpl=`@CODE:Спасибо за обращение, [+name.value+]` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +

    Сообщение: [+message:strip_tags:nl2br+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Новое сообщение` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" new file mode 100644 index 00000000..5c8eb883 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/002_\320\255\320\273\320\265\320\274\320\265\320\275\321\202\321\213_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217.md" @@ -0,0 +1,139 @@ +``` +[!FormLister? +&formid=`advanced` +&rules=`{ +"name":{ + "required":"Обязательно введите имя" +}, +"email":{ + "required":"Обязательно введите email" +}, +"phone":{ + "required":"Обязательно введите номер телефона", + "phone":"Введите номер правильно" +}, +"message":{ + "required":"Обращение не может быть пустым", + "minLength":{ + "params":100, + "message":"Должно быть не менее 100 символов" + } +}, +"agree":{ + "required":"Вы не можете отправить обращение, если не согласны с правилами" +}, +"products":{ + "minCount":{ + "params": 2, + "message": "Выберите минимум 2 продукта" + } +} +}` +&defaults=`{ +"topic":"Жалоба" +}` +&formControls=`topic,agree,department,products` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+name.error+] +
    +
    +
    +
    + + + [+email.error+] +
    +
    +
    +
    + + + [+phone.error+] +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + [+products.error+] +
    +
    + + + [+message.error+] +
    +
    + + [+agree.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&subjectTpl=`@CODE: [+topic.value+] в [+department.value+]` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +

    Продукты: [+products.value+]

    +

    Сообщение: [+message:strip_tags:nl2br+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Новое сообщение` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" new file mode 100644 index 00000000..538d99a8 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/003_\320\236\321\202\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\320\276\320\262.md" @@ -0,0 +1,118 @@ + +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обязательно введите имя" +}, +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"message":{ + "required":"Обязательно введите сообщение" +} +}` +&attachments=`first,second` +&attachFiles=`{"userfile":{"filepath":"assets/images/logo.png","filename":"logo.png"}}` +&fileRules=`{ +"first":{ + "required":"Приложите документ", + "allowed":{ + "params": [ ["doc","docx","pdf"] ], + "message": "Разрешены только документы Word и Pdf" + }, + "maxSize" : { + "params": 100, + "message": "Размер файла не должен превышать 100 кб" + } +}, +"second":{ + "required":"Приложите 2 картинки", + "maxSize" : { + "params": 1024, + "message": "Размер файла не должен превышать 1 мб" + }, + "allowed": { + "params": [ ["jpg","jpeg","png","gif"] ], + "message" : "Разрешены только картинки" + }, + "maxCount":{ + "params" : 4, + "message" : "Не больше 4 картинок" + }, + "minCount":{ + "params" : 2, + "message" : "Не меньше 2 картинок" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+message.error+] +
    +
    +
    + +
    + + [+first.error+] +
    +
    +
    + +
    + + [+second.error+] +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Email: [+email.value+]

    +

    Сообщение: [+message:strip_tags:nl2br+]

    +

    Документы:[+first.value+]

    +

    Картинки:[+second.value+]

    +

    Доп.:[+userfile.value+] +

    Вложения: [+attachments.value+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Новое сообщение` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" new file mode 100644 index 00000000..f1c4654b --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/004_\320\244\320\276\321\200\320\274\320\260_\321\201_\320\272\320\260\320\277\321\207\320\265\320\271.md" @@ -0,0 +1,84 @@ +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обязательно введите имя" +}, +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"phone":{ + "required":"Обязательно введите номер телефона", + "phone":"Введите номер правильно" +}, +"message":{ + "required":"Обязательно введите сообщение", + "minLength":{ + "params":100, + "message":"Сообщение должно быть не менее 100 символов" + } +} +}` +&captcha=`modxCaptcha` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+phone.error+] +
    +
    + +
    + +
    + + [+message.error+] +
    +
    + [+form.messages+] +
    + +
    +
    Введите число
    + + [+vericode.error+] +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    ` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Новое сообщение` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" new file mode 100644 index 00000000..2add25fe --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/005_\320\222\321\213\320\262\320\276\320\264_\321\201\320\276\320\276\320\261\321\211\320\265\320\275\320\270\320\271.md" @@ -0,0 +1,74 @@ + +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обязательно введите имя" +}, +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"phone":{ + "required":"Обязательно введите номер телефона", + "phone":"Введите номер телефона правильно" +}, +"message":{ + "required":"Обязательно введите сообщение", + "minLength":{ + "params":100, + "message":"Сообщение должно быть не менее 100 символов" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&messagesTpl=`@CODE:
    [+required+][+errors+][+messages+]
    ` +&messagesRequiredOuterTpl=`@CODE:
    Вы не заполнили обязательные поля
    [+messages+]
    ` +&messagesErrorOuterTpl=`@CODE:
    Некоторые поля заполнены неверно
    [+messages+]
    ` +&messagesOuterTpl=`@CODE:
    [+messages+]
    ` +&errorClass=` has-error` +&requiredClass=` has-warning` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" new file mode 100644 index 00000000..29a084cb --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\260_\320\277\320\276\320\273\320\265\320\271.md" @@ -0,0 +1,147 @@ +В зависимости от значения поля type используются разные правила валидации и шаблоны письма. + +### Вызов FormLister +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обязательно введите имя" +}, +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"phone":{ + "required":"Обязательно введите номер телефона", + "phone":"Введите номер правильно" +} +}` +&entRules=`{ +"entname":{ + "required":"Обязательно введите имя" +}, +"entemail":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"entphone":{ + "required":"Обязательно введите номер телефона", + "phone":"Введите номер правильно" +}, +"entaddress":{ + "required":"Обязательно введите адрес" +} +}` +&formControls=`type` +&defaults=`{"type":"Физическое лицо"}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + +
    +

    Заполняется только физлицами

    +
    + + + + [+name.error+] + +
    +
    +
    +
    + + + + [+email.error+] + +
    +
    +
    +
    + + + + [+phone.error+] + +
    +
    +
    +

    Заполняется только юрлицами

    +
    + + + [+entname.error+] + +
    +
    +
    +
    + + + [+entemail.error+] +
    +
    +
    +
    + + + [+entphone.error+] +
    +
    +
    +
    + + + [+entaddress.error+] + +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&subjectTpl=`@CODE:[+type.value+]` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +` +&reportEntTpl=`@CODE: +

    Название предприятия: [+entname.value+]

    +

    Телефон: [+entphone.value+]

    +

    Email: [+entemail.value+]

    +

    Юридический адрес: [+entaddress.value+]

    +` +&prepare=`typeSelector` +&errorClass=` has-error` +&requiredClass=` has-warning` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` +### Prepare-сниппет typeSelector +``` +if ($FormLister->getField('type') == 'Юридическое лицо') { + $FormLister->config->setConfig(array( + 'rules'=>$FormLister->getCFGDef('entRules'), + 'reportTpl'=>$FormLister->getCFGDef('reportEntTpl') + )); +} else { + $FormLister->setField('type','Физическое лицо'); +} +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" new file mode 100644 index 00000000..8469ce10 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\320\270\321\217.md" @@ -0,0 +1,47 @@ +``` +[!FormLister? +&formid=`login` +&controller=`Login` +&loginField=`email` +&rules=`{ +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"password":{ + "required":"Обязательно введите пароль" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    +
    + + + [+password.error+] +
    + [+form.messages+] +
    + +
    + +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&skipTpl=`@CODE:
    Вы уже авторизованы.
    ` +&successTpl=`@CODE:
    Привет, [+fullname+]!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" new file mode 100644 index 00000000..176fe508 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/008_\320\240\320\265\320\263\320\270\321\201\321\202\321\200\320\260\321\206\320\270\321\217.md" @@ -0,0 +1,97 @@ + +При регистрации пользователь добавляется в группу opt. Отправляется два письма - менеджеру и пользователю. Пользователь должен подтвердить регистрацию, перейдя по ссылке из письма (см. Активация учетных записей). + +``` +[!FormLister? +&formid=`register` +&controller=`Register` +&userGroups=`opt` +&checkActivation=`1` +&activateTo=`1514` +&rules=`{ +"fullname":{ + "required":"Обязательно введите имя" +}, +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +}, +"password":{ + "required":"Обязательно введите пароль", + "minLength":{ + "params":6, + "message":"В пароле должно быть больше 6 символов" + } +}, +"repeatPassword":{ + "required":"Повторите пароль", + "equals":{ + "message":"Пароли не совпадают" + } +}, +"agree":{ + "required":"Для регистрации вы должны принять правила" +} +}` +&allowedFields=`fullname` +&formControls=`agree` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+fullname.error+] +
    +
    + + + [+email.error+] +
    +
    +
    +
    + + + [+password.error+] +
    +
    +
    +
    + + + [+repeatPassword.error+] +
    +
    +
    +
    + + [+agree.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`info@sitename.ru` +&reportTpl=`@CODE:Новый пользователь [+fullname.value+] ([+id.value+])` +&ccSender=`1` +&ccSenderField=`email` +&ccSenderTpl=`@CODE:Привет [+fullname.value+]. Для активации учетной записи нужно перейти по ссылке [+activate.url+]` +&subject=`Регистрация на сайте [(site_name)]` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    Поздравляем с успешной регистрацией, [+fullname.value+]! После активации вы можете авторизоваться на сайте. Если вы не получили письмо для активации учетной записи, запросите его еще раз.
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/009_\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\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/009_\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\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" new file mode 100644 index 00000000..c3f27926 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/009_\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\320\276\320\271_\320\267\320\260\320\277\320\270\321\201\320\270.md" @@ -0,0 +1,42 @@ + +``` +[!FormLister? +&controller=`Activate` +&formid=`activate` +&protectSubmit=`0` +&rules=`{ +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!
    ` +&subject=`Активация учетной записи` +&reportTpl=`@CODE:

    Для активации учетной записи перейдите по ссылке [+activate.url+]

    ` +&activateReportTpl=`@CODE:

    Здравствуйте, [+fullname.value+]!

    Ваша учетная запись успешно активирована.

    ` +&activateSuccessTpl=`@CODE:
    Ваша учетная запись успешно активирована!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/010_\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.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/010_\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.md" new file mode 100644 index 00000000..6b37fe67 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/010_\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.md" @@ -0,0 +1,130 @@ +## Вариант 1 +Пароль генерируется автоматически и отправляется в письме. +``` +[!FormLister? +&controller=`Reminder` +&formid=`remind` +&rules=`{ +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!
    ` +&subject=`Восстановление пароля` +&resetTo=`38` +&reportTpl=`@CODE:

    Для восстановления пароля перейдите по ссылке [+reset.url+]

    ` +&resetReportTpl=`@CODE:

    Здравствуйте, [+fullname.value+]!

    Ваш новый пароль: [+newpassword+]

    ` +&resetSuccessTpl=`@CODE:
    На указанный вами при регистрации email отправлено письмо с новым паролем!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` + +## Вариант 2 +Пользователь вводит новый пароль. +``` +[!FormLister? +&controller=`Reminder` +&formid=`remind` +&rules=`{ +"email":{ + "required":"Обязательно введите email", + "email":"Введите email правильно" +} +}` +&resetRules=`{ +"password":{ + "required":"Обязательно введите пароль", + "minLength":{ + "params":6, + "message":"В пароле должно быть больше 6 символов" + } +}, +"repeatPassword":{ + "required":"Повторите пароль", + "equals":{ + "message":"Пароли не совпадают" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&resetTpl=`@CODE: +
    +
    +
    +
    + + + +
    + + + [+password.error+] +
    +
    + + + [+repeatPassword.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    +` +&uidName=`uid` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    На указанный вами при регистрации email отправлено письмо с дальнейшими инструкциями!
    ` +&subject=`Восстановление пароля` +&reportTpl=`@CODE:

    Для восстановления пароля перейдите по ссылке [+reset.url+]

    ` +&resetReportTpl=`@CODE:

    Здравствуйте, [+fullname.value+]!

    Ваш новый пароль: [+newpassword+]

    ` +&resetSuccessTpl=`@CODE:Готово!` +&resetTo=`12` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/011_\320\241\320\262\320\276\320\270_\320\277\321\200\320\260\320\262\320\270\320\273\320\260_\320\262\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270_\320\270\320\267_\321\204\321\203\320\275\320\272\321\206\320\270\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/011_\320\241\320\262\320\276\320\270_\320\277\321\200\320\260\320\262\320\270\320\273\320\260_\320\262\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270_\320\270\320\267_\321\204\321\203\320\275\320\272\321\206\320\270\320\270.md" new file mode 100644 index 00000000..2711b794 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/500_\320\237\321\200\320\270\320\274\320\265\321\200\321\213/011_\320\241\320\262\320\276\320\270_\320\277\321\200\320\260\320\262\320\270\320\273\320\260_\320\262\320\260\320\273\320\270\320\264\320\260\321\206\320\270\320\270_\320\270\320\267_\321\204\321\203\320\275\320\272\321\206\320\270\320\270.md" @@ -0,0 +1,67 @@ +### Как сделать свои правила валидации из функции (сниппета). + +Код снипета **checkUrls** с функцией *checkUrls* которая проверяет наличие ссылок в поле, и если они есть, то возвращает ошибку проверки (валидации): +``` + 0) { + // Ошибка, ссылки есть + return false; + } + + // Всё хорошо, ссылок нет + return true; +} +``` + +Перед вызовом формы FormLister-а необходимо вызвать сам сниппет: +``` +[!checkUrls!] +[!FormLister?... +``` + +Затем в FormLister, в правилах валидации для поля **message** задать правила валидации: +``` +... +"message":{ + "required":"Обязательно введите сообщение", + "custom":{ + "function":"checkUrls", + "message":"Ссылки в тексте запрещены" + } +}, +... +``` + +Начиная с версии 1.18.0 можно использовать сниппеты в правилах валидации: +``` +... +"message":{ + "required":"Обязательно введите сообщение", + "custom":{ + "snippet":"checkUrls", + "message":"Ссылки в тексте запрещены" + } +}, +... +``` + +Соответственно сниппет будет выглядеть: +``` +$pattern = '~[a-z]+://\S+~'; +if($num_found = preg_match_all($pattern, $value, $out) > 0) { + // Ошибка, ссылки есть + return false; + /* + Можно не задавать в описании правила ключ "message": + return "Ссылки в тексте запрещены"; + */ +} + +// Всё хорошо, ссылок нет +return true; +``` +В сниппеты для валидации передаются параметры: +* FormLister - объект контроллера; +* value - проверяемое значение. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/index.md" index 4ce033da..f88ccd6b 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/FormLister/index.md" @@ -8,7 +8,7 @@ * использует шаблонизатор DocLister; * поддерживает лексиконы; * не зависит от html-кода формы и не влияет на него; -* имеет api-режим для работы с шаблонизаторами и ajax; +* имеет api-режимы для работы с шаблонизаторами и ajax; * умеет загружать исходные данные из внешних источников (массивы, плейсхолдеры, сессия, куки, MODxAPI); * поддерживает хранение параметров в файлах. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/HybridAuth/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/HybridAuth/index.md" new file mode 100644 index 00000000..63641e8c --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/HybridAuth/index.md" @@ -0,0 +1,81 @@ +# HybridAuth + +### Особенности: + ++ используется библиотека `HybridAuth`, которая реализует авторизацию через множество соцсетей (провайдеров) без посредников; ++ регистрация (в том числе с добавлением в группы) и авторизация пользователей; ++ привязка нескольких соцсетей к одному пользователю; ++ управление привязанными соцсетями из админки. + +#### Установка + +Скачивать здесь: [github.com/Pathologic/EvoHybridAuth](https://github.com/Pathologic/EvoHybridAuth) + +После установки нужно зайти на страницу веб-пользователя в админке, чтобы создалась таблица. Затем переименовать файл `config.sample` в `config.php` в папке `assets/plugins/hybridauth/config` и настроить в нем необходимые соцсети. По настройке придется гуглить, но что-то можно найти здесь: `docs.modx.pro/components/hybridauth/providers/` +Также должен быть включен плагин `userHelper`. + +Классы для основных провайдеров находятся в папке `assets/plugins/hybridauth/vendor/hybridauth/hybridauth/hybridauth/Hybrid/Providers/` и не требуют дополнительных действий. В случае дополнительных провайдеров из папки `assets/plugins/hybridauth/vendor/hybridauth/hybridauth/additional-providers/` необходимо добавить в конфигурацию провайдера ключ wrapper. На примере Vkontakte: + +``` +"Vkontakte" => array( + "enabled" => true, + "keys" => array("id" => "", "secret" => ""), + "wrapper" => array( + 'class'=>'Hybrid_Providers_Vkontakte', + 'path' => MODX_BASE_PATH.'assets/plugins/hybridauth/vendor/hybridauth/hybridauth/additional-providers/hybridauth-vkontakte/Providers/Vkontakte.php' + ) + ), +``` + +Компонент состоит из плагина и сниппета. Cниппет выводит список доступных для использования соцсетей, а плагин обеспечивает взаимодействие с ними. + +## Параметры плагина + +### registerUsers +разрешает регистрацию новых пользователей. Если запрещено, то авторизованный пользователей должен привязать в своем профиле соцсети и входить потом через них + +### debug +включает режим отладки, сообщения пишутся как в лог MODX, так и в файл `assets/cache/ha/error.log` + +### rememberme, cookieName, cookieLifetime +параметры для запоминания пользователя после авторизации, описаны в документации `FormLister` + +### redirectUri +адрес страницы, на которую пользователя возвращают из соцсетей, если не заполнять, то будет использоваться главная страница сайта; этот адрес должен совпадать с тем, что указывается в настройках приложений соцсетей + +### loginPage +id страницы, на которую пользователь должен быть перенаправлен после авторизации; если не заполнено, то текущая страница + +### logoutPage +id страницы, на которую пользователь должен быть перенаправлен после выхода; если не заполнено, то текущая страница + +### groups +список групп, в которые нужно добавить пользователя после регистрации, в виде json-массива + +### userModel +класс для работы с пользователями, по умолчанию — `modUsers` + +### tabName +заголовок вкладки на странице веб-пользователя в админке + + + +## Параметры сниппета + +### langDir, lang, lexicon +настройка лексиконов, см. документацию `FormLister` + +### tpl +шаблон списка провайдеров, доступны плейсхолдеры `[+providers+]` и `[+error+]`; если значение пустое, то вернется массив с ключами providers и error + +### providerTpl +шаблон провайдера, доступны плейсхолдеры `[+url+]` (ссылка для выполнения действия), `[+classNames+]` (имена классов), [+title+] (название провайдера) + +### activeProviderTpl +шаблон подключенного провайдера, если не указывать, то используется значение providerTpl + +### errorTpl +шаблон сообщения об ошибке, доступен плейсхолдер `[+error+]` + +### registerCss +подключает файл `assets/snippets/hybridauth/css/default.css` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md" old mode 100644 new mode 100755 index f7b4658f..dc931229 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\321\213.md" @@ -23,7 +23,7 @@ В шаблонах для полей выбора `dropdown`, `checkbox`, `radio` доступны плейсхолдеры `[+value+]` и `[+title+]`. -Также в шаблоне 'owner' доступны плейсхолдеры `[+index+]` и `[+iteration+]`, а в груповых полях и полях выбора - `[+{имя_поля}_index+]` и `[+{имя_поля}_iteration+]`. +Также в шаблоне 'owner' доступны плейсхолдеры `[+index+]` и `[+iteration+]`, а в груповых полях и полях выбора - `[+{имя_группы_поля}_index+]` и `[+{имя_группы_поля}_iteration+]`. #### Источники шаблонов diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/02_\320\242\320\270\320\277\321\213_\320\277\320\276\320\273\320\265\320\271.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/02_\320\242\320\270\320\277\321\213_\320\277\320\276\320\273\320\265\320\271.md" old mode 100644 new mode 100755 index ec35e8e5..e09ffd7f --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/02_\320\242\320\270\320\277\321\213_\320\277\320\276\320\273\320\265\320\271.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/02_\320\242\320\270\320\277\321\213_\320\277\320\276\320\273\320\265\320\271.md" @@ -28,12 +28,12 @@ elements -Возможные значения для поля выбора. Доступны для полей `dropdown`, `radio`, `checkbox`. Могут быть представлены в виде массива `ключ => значение`, или в виде строки в доступном формате Evolution CMS (`@SELECT` и пр. работают). +Возможные значения для поля выбора. Доступны для полей `dropdown`, `radio`, `checkbox`, `imageradio`, `imagecheckbox`. Могут быть представлены в виде массива `ключ => значение`, или в виде строки в доступном формате Evolution CMS (`@SELECT` и пр. работают). layout -Вид расположения вариантов для полей `radio` и `checkbox`, либо вид расположения полей для типа `group`. Возможные значения - `vertical` (по умолчанию) и `horizontal`. Для типа `group` также доступно значение `gallery`. +Вид расположения вариантов для полей `radio`, `checkbox`, `imageradio` и `imagecheckbox`, либо вид расположения полей для типа `group`. Возможные значения - `vertical` (по умолчанию) и `horizontal`. Для типа `group` также доступно значение `gallery`. default @@ -57,6 +57,8 @@ dropdownВыпадающий список checkboxФлажки, позволяет выбрать несколько вариантов из представленных radioПереключатели, позволяют выбрать только один вариант +imagecheckboxТо же, что и checkbox, но вместо текста - изображения. В массиве elements в качестве значений должны быть адреса изображений. +imageradioТо же, что и radio, но вместо текста - изображения. В массиве elements в качестве значений должны быть адреса изображений. group Группа полей, обязательно должны быть определены вложенные поля в ключе `fields` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260.md" old mode 100644 new mode 100755 index 1388e903..e7bd1a4f --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260.md" @@ -14,7 +14,11 @@ limit0Число блоков для вывода, либо 0 - для вывода всех renderTotemplates -Вид вывода: `templates` - вывод шаблонов, `array` - вывод массива, `json` - вывод в виде json. +Вид вывода:
    +`templates` - вывод шаблонов,
    +`structure` - вывод в виде структуры с ключами `name` (имя конфига), `index`, `iteration`, `config` (конфигурация блока), `data` - значения,
    +`array` - вывод простого массива со значениями блоков,
    +`json` - вывод в виде json. giveToЕсли параметр задан, то результат работы будет передан в указанный в этом параметре сниппет, и затем будет выведен результат работы этого сниппета diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\277\320\273\320\260\320\263\320\270\320\275\320\260.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\320\277\320\273\320\260\320\263\320\270\320\275\320\260.md" old mode 100644 new mode 100755 diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/05_\320\241\320\276\320\261\321\213\321\202\320\270\321\217.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/05_\320\241\320\276\320\261\321\213\321\202\320\270\321\217.md" old mode 100644 new mode 100755 diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/06_\320\237\321\200\320\270\320\274\320\265\321\200\321\213_\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/06_\320\237\321\200\320\270\320\274\320\265\321\200\321\213_\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.md" old mode 100644 new mode 100755 diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/07_\320\237\321\200\320\270\320\274\320\265\321\200_\321\201\320\276\320\267\320\264\320\260\320\275\320\270\321\217_\320\272\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\320\276\320\262.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/07_\320\237\321\200\320\270\320\274\320\265\321\200_\321\201\320\276\320\267\320\264\320\260\320\275\320\270\321\217_\320\272\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\320\276\320\262.md" old mode 100644 new mode 100755 diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/index.md" old mode 100644 new mode 100755 index 4f0cc665..fe7870f3 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/PageBuilder/index.md" @@ -4,6 +4,8 @@ Плагин позволяет разработчику определить набор блоков с определенной разметкой и списком полей, чтобы контент-менеджер использовал те блоки, которые считает нужным, со своим наполнением. +После установки нужно создать файлы конфигурации, либо переименовать файлы `*.php.sample` в `*.php`. В панели администрирования плагин добавляет новую вкладку на странице редактирования ресурса. Для вывода результатов используется сниппет `[[PageBuilder]]`. + Конфигурация для блоков берется из папки `config`. Для создания нового блока нужно создать в этой папке файл `<имя конфига>.php`, который должен вернуть ассоциативный массив. Для создания контейнера нужно создать файл `container.<имя контейнера>.php`. Структура массива следующая: diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Selector/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Selector/index.md" index db32d939..a5e49b12 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Selector/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Selector/index.md" @@ -1,40 +1,40 @@ +## Selector - custom TV для составления списка документов в Evolution CMS. ## +Selector является заменой для mm_ddSelectDocuments. - -

    Selector - custom TV для составления списка документов

    -Selector - custom TV для составления списка документов в Evolution CMS. -

    Скачивать здесь: Pathologic

    -

    Selector является заменой для mm_ddSelectDocuments.

    -

    В отличие от mm_ddSelectDocuments:

    - -

    Код получился простой, разобраться при желании не сложно.

    -

    Для работы требуется DocLister.

    -

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

    -

    Допустим, есть tv-параметр c названием related, для хранения списка похожих товаров. Чтобы его поведение отличалось от базового, нужно создать в файле assets/tvs/selector/lib/related.controller.class.php класс:

    -
    -<?php namespace Selector;
    +В отличие от mm_ddSelectDocuments:
    +- уживается с SimpleGallery;
    +- благодаря DocLister позволяет выбирать данные для списка как угодно и откуда угодно;
    +- список результатов поиска можно оформлять по-всякому (реализовано с помощью prepare в DocLister);
    +- код полностью открыт.
    +
    +Для работы требуется DocLister.
    +
    +После установки дополнения из магазина приложений необходимо у нужного TV параметра авбрать тип ввода "selector".
    +Компонент требует некой настройки под себя.
    +
    +Допустим, есть tv-параметр c названием `related`, для хранения списка похожих товаров. Чтобы его поведение отличалось от базового, нужно создать в файле `assets/tvs/selector/lib/related.controller.class.php` класс:
    +
    +```
    +
    -
    -

    В большинстве случаев, думаю, будет достаточно изменить свойство dlParams, в котором хранятся параметры по умолчанию для запуска DocLister:

    -
    -<?php namespace Selector;
    +```
    +В большинстве случаев  будет достаточно изменить свойство dlParams, в котором хранятся параметры по умолчанию для запуска DocLister:
    +```
    +dlParams['parents'] = 5;
    +        $this->dlParams['addWhereList'] = 'c.published = 1';
         }
     }
    -
    -

    Если эта часть не понятна, то могу посоветовать обратиться сюда: bezumkin

    -

    Следует обратить внимание, что параметр – related, название файла – related.controller.class.php, а название класса – RelatedController (с большой буквы).

    -

    Можно также подгружать нужный класс вручную с помощью плагина на OnManagerPageInit. В этом случае значение имеет только правильное название класса. Также есть ограничение на название tv-параметра: допускаются только латинские буквы и символ подчеркивания.

    \ No newline at end of file +``` + +Следует обратить внимание, что параметр – `related`, название файла – `related.controller.class.php`, а название класса – `RelatedController` (с большой буквы). + +Можно подгружать нужный класс вручную с помощью плагина на OnManagerPageInit. В этом случае значение имеет только правильное название класса. +**Важно:** есть ограничение на название tv-параметра: допускаются только латинские буквы и символ подчеркивания. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_Shopkeeper.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_Shopkeeper.md" new file mode 100644 index 00000000..a9cedfaf --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_Shopkeeper.md" @@ -0,0 +1,434 @@ +## Описание ## + +Сниппет выводит корзину заказов двух типов (расширенный и простой). + +Сниппет можно вызывать на странице несколько раз, но корзина выводится только в месте первого вызова. Второй и последующие вызовы игнорируются. + +**Пример:** +*Если корзина на страницах каталога товаров находится в правой колонке шаблона, а на странице оформления заказа вызов сниппета вставлен в контент страницы, то на этой странице корзина будет выведена только в ценральной колонке (в правой вызов сниппета можно не убирать).* + +## Параметры сниппета ## +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОписание и значенияЗначение по умолчаниюПримечание
    &langязыкЯзык системы управленияВ настоящее время доступны языки:
    `russian`, `english`, `german`, `francais`
    &styleстиль корзиныdefault
    (assets/snippets/shopkeeper/style/default/)
    &style=`0` - если не нужен отдельный стилевой файл для корзины
    &cartType + тип корзины
    + full - расширенный,
    + small - простой,
    + empty - только очистка корзины без вывода на странице +
    full 
    ¤cyвалютаруб. 
    &priceTVимя TV-параметра, который используется для цены.priceЕсли ваш TV для цены имеет название не "price", обязательно укажите это имя в данном параметре.
    &orderFormPageID страницы с формой заказа1обязательный параметр
    &noJQuery=`1`если на сайте уже используется библиотека JQuery0 
    &noConflict=`1`если на сайте используется другая JS-библиотека (не JQuery), например Mootools, Prototype.0 
    &noCounterскрывать (значение `1`) или нет (значение `0`) счетчик товаров при добавлении в корзину0 
    &linkAllow=`0`Выводить названия товаров в корзине без ссылок.1Если этот параметр указан (=`0`) на странице оформления заказа, письмо с составом заказа и список товаров в модуле будут без ссылок.
    &stuffContCSS-селектор элемента, внутри которого находится информация о товаре.div.shk-itemПример чанка: chunk_shopStuff.tpl
    &debug=`1`запустить отладку JavaScript-функций (вывод информации)0 
    &tplPathпуть до папки с чанками`assets/snippets/shopkeeper/chunks/ru/`
    &cartTplчанк с шаблоном корзины@FILE:chunk_shopCart.tplЧанк содержит сразу 3 шаблона - для пустой, заполненной расширенной и простой корзины.
    Если чанки хранятся в файлах, можно указать путь с командой "@FILE:". Если чанки созданы в системе управления, то указывается только имя чанка (например &cartTpl=`shopCart`)
    &cartRowTplчанк шаблона строки с информацией товара в расширенной корзине@FILE:chunk_shopCartRow.tpl 
    &cartHelperTplчанк шаблона "хелпера" - блока, который появляется для подтверждения действий- 
    &additDataTplчанк для доп. параметров товаров в корзине ([+addit_data+])- 
    &orderDataTplчанк списка товаров в отчете о заказе ([+orderData+])-Используется в письме с отчетом о заказе (eForm &report) и в модуле.
    &flyToCartдействие при добавлении товара в корзину.
    + helper - появляется блок со счетчиком кол-ва товаров и летит в корзину,
    + image - в корзину летит картинка товара
    + nofly - в корзину ничего не летит; +
    `helper`При &flyToCart=`image` тег <img> должен иметь CSS-класс "shk-image"
    &noLoader=`1`не паказывать прелоадер (анимационная картинка)0 
    &excepDigitGroup=`1`разделять числа цен в корзине на разряды1 
    &changePrice=`1`при изменении параметров с ценой - изменяется цена товара, а индекс с плюсом не появляется0 
    &counterField=`1`добавить ко всем полям <input name="shk-count"> (кол-во товара) стрелки больше/меньше0 
    &noJavaScript=`1`Работа без JavaScript.0Обратите внимание, что в чанке "shopCart" кнопка "Пересчитать" находится внутри тега "noscript". Если используется режим &noJavaScript=`1`, рекомендуется тег "noscript" удалить.
    &hideOnОтключить корзину на странице0Обычно используется в вызове сниппета краткого вида корзины. Указывается ID страницы с подробным видом корзины (оформление заказа). На этой странице краткий вид корзины будет отключен.
    + +## Примеры ## + +Простой вызов: +``` +[!Shopkeeper? &priceTV=`price` &orderFormPage=`10`!] +``` + +Расширенный вызов: +``` +[!Shopkeeper? +&cartType=`small` +&priceTV=`price` +&orderFormPage=`10` +&changePrice=`1` +&counterField=`1` +&flyToCart=`nofly` +!] +``` + + +## Шаблоны (чанки) и плейсхолдеры ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Параметр сниппетаОписаниеПлейсхолдеры в шаблонеПримечание
    &cartTpl (&cartType=`full`)шаблон расширенной корзины + [+inner+] - строка с информацией о товаре (cartRowTpl);
    + [+price_total+] - Общая сумма;
    + [+this_page_url+] - URL текущей страницы;
    + [+empty_url+] - URL для очистки корзины;
    + [+order_page_url+] - URL страницы оформления заказа;
    + [+currency+] - валюта; +
    + Пример: chunk_shopCart.tpl +
    (содержит 3 шаблона корзины)

    + <!--tpl_separator--> - разделитель шаблонов (удалять нельзя) +
    &cartTpl (&cartType=`small`)шаблон упрощенной корзины + [+price_total+] - Общая сумма;
    + [+total_items+] - Число выбранных товаров;
    + [+plural+] - слово "товар" во множественном числе в зависимости от числа выбранных товаров;
    + [+this_page_url+] - URL текущей страницы;
    + [+empty_url+] - URL для очистки корзины;
    + [+order_page_url+] - URL страницы оформления заказа;
    + [+currency+] - валюта +
    &cartRowTplшаблон строки с информацией товара в расширенной корзине + [+id+] - ID товара (документа);
    + [+name+] - название товара;
    + [+link+] - ссылка на страницу товара;
    + [+addit_data+] - строка с информацией о доп. параметрах товара;
    + [+price+] - цена;
    + [+price_total+] - цена товара + доп. параметры;
    + [+price_count+] - цена товара * кол-во;
    + [+currency+] - валюта;
    + [+count+] - количество;
    + [+this_page_url+] - URL текущей страницы;
    + [+index+] - номер товара в корзине (от нуля);
    + [+любой TV+] - любой TV-параметр, например [+image+];
    + [+shk_любой TV+] - любой доп. параметр, выбранный при добавлении товара в корзину (из [+addit_data+]), например [+shk_param1+]. +
    Пример: chunk_shopCartRow.tpl и chunk_shopCartRow2.tpl
    &additDataTplшаблон для доп. параметров товаров в корзине ([+addit_data+]) + [+param+] - имя и цена параметра. Цена указывается в скобках. Если цена = 0, то пишется только название параметра (без скобок);
    + [+name+] - имя параметра;
    + [+price+] - цена параметра; +
    Пример: chunk_additDataTpl.tpl
    &orderDataTplшаблон списка товаров в отчете о заказе ([+orderData+]) + Все плейсхолдеры чанка &cartRowTpl

    + [+loop+], [+end_loop+] - начало и конец строки данных товаров (цикл). +
    Пример: chunk_orderDataTpl.tpl
    &report (eForm)шаблон текста письма с составом заказа + [+orderData+] - состав заказа (список покупок);
    + [+orderID+] - номер заказа; +
    Пример: chunk_shopOrderReport.tpl и chunk_shopOrderReportWebUser.tpl
    Страница, на которой вызывается сниппет Shopkeeper + [+totalItems+] - кол-во товара в корзине;
    + [+totalPrice+] - общая цена товара в корзине; +
    + + + +## Необходимые CSS-классы, Id и имена полей ## +Для полноценной работы Shopkeeper необходимы следующие css-классы, id и имена полей: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ШаблонCSS-классыid HTML-элементовИмена полей и кнопокПримечание
    Шаблон вывода информации товара + shk-item - класс "обертывающего" элемента блока с информацией о товаре;
    + shk-image - картинка товара (если используется &flyToCart=`image`);
    + shk-price -класс элемента с ценой товара.
    +
    + shk-id - имя скрытого поля с id товара;
    + shk-count - имя скрытого поля с кол-вом товара. +
    Пример chunk_shopStuff.tpl
    Шаблон корзины + — + + shopCart - id "обертывающего" элемента блока корзины;
    + butEmptyCart - id кнопки-ссылки очистки корзины;
    + butOrder - id ссылки на страницу оформление товара. +
    + shk_recount - кнопка "Пересчитать".
    + +
    Пример chunk_shopCart.tpl
    Шаблон строки информации о товаре в корзине + shk-del - кнопка-ссылка удаления товара.
    + +
    + — + + count[] - name полей с кол-вом товара.
    +
    Пример chunk_shopCartRow.tpl
    Шаблон формы заказа + — + + — + + email - поле "E-mail";
    + phone - поле "Телефон" +
    Пример chunk_shopOrderForm.tpl и chunk_shopOrderFormWebUser.tpl
    + +CSS-классы (и id) используются в JS-функциях Shopkeeper'а. + + +## Советы ## +### Две и более цены для одного товара ## +Для этого нужно создать две или более формы (form) и в поле name="shk-id" после ID написать имя TV с ценой. + +**Пример:** +``` + +``` + +При submit формы в корзину добавится цена из TV-параметра с именем "price2". + +### Добавление в корзину данных, не создавая TV-параметры ### + +**Пример:** +``` + +``` +В корзину добавится параметр, который можно выводить в месте вставки плейсхолдера `[+test+]` (выведется "дополнительные данные"). + + +## События для плагинов ## + +* OnSHKFrontendInit - инициализация сниппета Shopkeeper во внешней части. +* OnSHKChangeStatus - изменение статуса заказа. +* OnSHKOrderDescRender - вывод подробной информации о заказе в модуле. +* OnSHKMailApprovedForPayment - отправление письма при статусе "Принят к оплате". Плагин может добавлять в письмо доп. информацию `([+plugin+])`. +* OnSHKcartLoad - загрузка корзины (вывод информации в чанке `&cartTpl - [+plugin+]`). +* OnSHKstatusSendMail - отправка письма о смене статуса. +* OnSHKmodRenderTopLinks - вывод ссылок вверху в модуле Shopkeeper. +* OnSHKmodPagePrint - вывод страницы модуля. Можно использовать для создания своей страницы (см. пример OnSHKmodPagePrint_plugin_example.txt). +* OnSHKbeforeSendOrder - перед отправкой заказа. Можно использовать для изменения полей ($fields). +* OnSHKsaveOrder - сохранение заказа. +* OnSHKcalcTotalPrice - расчет общей стоимости. + +В папке shopkeeper/docs/ есть примеры плагинов. + + +## "Сallback-функции" на JavaScript ## +* setCartActionsCallback - перезагрузка корзины, +* fillCartCallback - добавление товара в корзину, +* emptyCartCallback - очищение корзины. + +Просто создайте функции с такими именами и они будут вызываться при соответствующих действиях. + + +## Примеры чанков в папке install/examples/ ## + +* chunk_shopCart.tpl - чанк корзины. Может быть использован как значение параметра &cartTpl при вызове Shopkeeper. Чанк содержит сразу 3 шаблона - для пустой, заполненной расширенной и заполненной простой корзины. +* chunk_shopCartRow.tpl - чанк шаблона строки с информацией товара в расширенной корзине. +* chunk_shopCartRow2.tpl - пример с картинкой (TV - image) и условием PHx. +* chunk_shopStuff.tpl - чанк краткой информации о товаре. Может быть использован как значение параметра &tpl при вызове Ditto. +* chunk_shopStuff_2.tpl - пример с двумя ценами для одного товара (продажа и прокат). +* chunk_shopToCart.tpl - может быть использован в шаблоне страницы подробного описания товара или можно вставлять вызов чанка `{{shopToCart}}` в визуальный редактор. +* chunk_shopCartHelper.tpl - чанк шаблона "хелпера" - блока, который появляется для подтверждения действий. +* chunk_additDataTpl.tpl - шаблон для доп. параметров товаров в корзине. +* chunk_shopOrderForm.tpl - чанк форма оформление заказа. Может быть использован как значение параметра &tpl при вызове eForm. +* chunk_shopOrderFormWebUser.tpl - чанк форма оформление заказа для зарегистрированных пользователей. +* chunk_shopOrderReport.tpl - чанк письма с информацией о заказе. Может быть использован как значение параметра &report при вызове eForm. +* chunk_shopOrderReportWebUser.tpl - чанк письма с информацией о заказе для зарегистрированных пользователей. +* chunk_FormSignup.tpl - пример чанка с шаблоном формы регистрации для сниппета WebSignup. +* chunk_weblogin.tpl - пример чанка с шаблоном формы авторизации сниппета WebLogin. +* chunk_orderDataTpl.tpl - шаблон списка товаров в отчете о заказе `([+orderData+])` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\202\320\276\320\262\320\260\321\200\320\260_shk_widget.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\202\320\276\320\262\320\260\321\200\320\260_shk_widget.md" new file mode 100644 index 00000000..9543c52c --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213_\321\202\320\276\320\262\320\260\321\200\320\260_shk_widget.md" @@ -0,0 +1,51 @@ +Модификатор shk_widget для плагина PHx. + +## Описание ## +Модификатор служит для создания виджетов (выпадающий список, радиокнопка, чекбокс) параметров товаров в интернет-магазине. Работает совместно со сниппетом Shopkeeper. Можно использовать на странице подробного описания товара или в чанке сниппетов типа catalogView, DocLister или Ditto. + +## Установка ## +- Проверить чтобы файл модификатора `install/_upload/assets/plugins/phx/modifiers/shk_widget.phx.php` был загружен в папку `assets/plugins/phx/modifiers` вашего сайта. +- Установить плагин PHx + +### Пример использования ### +``` +[+param1:shk_widget=`radio:param1:wraptag:first_selected`+] +``` + +## Параметры модификатора ## +- первый параметр - тип создаваемого элемента. Возможные значения: select, radio, checkbox, radioimage; +- второй параметр - имя параметра TV; + +Далее параметры можно вводить в произвольном порядке + +- first_selected - отметить первое значение элемента; +- wraptag - обернуть тегом DIV. Может использоваться для radio и checkbox; +- desc_page - указать, если параметр выводится на странице товара-документа MODx. + +### Пример: создание списка доступных цветов, материалов и т.п. ### + +Тип (format) виджета radioimage служит для визуального представления списка доступных цветов или материалов для товара. Картинки цветов, материалов и т.п. загружаются с помощью TV-image, при редактировании товара можно выбрать их из списка. + +- Создайте в дереве документов раздел, например "Материалы". ID этого раздела позже понадобится. +- В этом разделе создайте для каждого материала (цвета или т.п.) отдельную страницу. Для всех материалов нужно ввести свое название. +- Если для этого раздела нет TV с типом ввода "Image", создайте его. Загрузите для каждого материала картинку. +- Создайте новый TV-параметр. +- Имя параметра: например "material". Заголовок: например "Материал". Тип ввода: Listbox (Multi-Select) или Check Box. + +В поле Возможные значения введите такой запрос: +``` +@SELECT cnt.pagetitle, tvc.id FROM modx_site_content cnt, modx_site_tmplvar_contentvalues tvc WHERE cnt.id = tvc.contentid AND tvc.tmplvarid = 4 AND cnt.parent = 48 +``` +где 4 - ID TV-картинки, 48 - ID раздела со страницами материалов, modx_ - префикс таблиц в БД, заданный при установке Evolution. +- Визуальный компонент: Delimited List +- Delimiter - "," (запятая без кавычек). + + +- В блоке "Доступ шаблонов" выберите шаблон товаров (чтобы TV был доступен при редактировании товаров). +- Нажмите "Сохранить". + +Теперь для каждого товара можно выбрать материал (цвет или т.п.) из списка. Для выделения нескольких пунктов используйте клавишу CTRL или SHIFT. +Пример использования в шаблоне товара-документа: +``` +
    [*material:shk_widget=`radioimage:material:first_selected`*]
    +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/03_\320\234\320\276\320\264\321\203\320\273\321\214_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217_\320\267\320\260\320\272\320\260\320\267\320\260\320\274\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/03_\320\234\320\276\320\264\321\203\320\273\321\214_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217_\320\267\320\260\320\272\320\260\320\267\320\260\320\274\320\270.md" new file mode 100644 index 00000000..9b3ff20f --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/03_\320\234\320\276\320\264\321\203\320\273\321\214_\321\203\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\321\217_\320\267\320\260\320\272\320\260\320\267\320\260\320\274\320\270.md" @@ -0,0 +1,113 @@ +Управление заказами интернет-магазина +## Функции ## +- Редактирование и удаление поступивших заказов; +- Возможность установить заказу статус (новый, в процессе выполнения, отправлен, выполнен, возникли проблемы); +- Возможность писать заметки к каждому заказу; +- Сортировка заказов. +- Управление товарами в каталоге (создание, редактирование). + +## Конфигурация ## +- **Заказов на странице** - число заказов в списке на одной странице. +- **Валюта** - влияет на отображения в таблице заказов и подробной информации о заказе. +- **Цвета статусов** - цвета строк в таблице заказов, соответствующие статусам заказов. Названия статусов можно менять в языковом файле `shopkeeper/lang/lang_ru.php` +- **Учет товара на складе** - имя TV-параметра, который используется для учета кол-ва товаров на складе. Подробнее ниже. +- **Категория каталога по умолчанию** - Укажите ID документа, который будет использоваться для каталога по умолчанию. В модуле появится кнопка для перехода в каталог. Необходимо также настроить плагин SaveToSHK. +- **Отменять заказ через, дн(я/ей)** - если заказ находится в статусе "Принят к оплате" больше дней, он отменяется. +- **ID TV-параметра цены** - нужно для каталога Shopkeeper. +- **Отправлять покупателю эл. письма при изменении статуса заказа** - письма отправляются при переводе заказа в статусы "Принят к оплате" и "Отправлен". Шаблоны для писем находятсяв папке shopkeeper/module/templates/. +- **Шаблон для контактной информации** - шаблон подробного вида контактной информации заказа. Можно указывать плейсхолдеры только те, которые используются в шаблоне письма заказа сниппета eForm (параметр `&report`), а также `[+orderData+] (состав заказа)` и `[+orderID+] (номер заказа)`. +- **Шаблон для контактной информации в списке товаров** - шаблон для контактной информации, которая отображается в таблице заказов. +Можно указывать плейсхолдеры только те, которые используются в шаблоне письма заказа сниппета eForm (параметр &report), а также [+orderData+] (состав заказа) и [+orderID+] (номер заказа). +По умолчанию: `[+name+], [+address+], [+email+], [+phone+], [+delivery+], [+payment+]` +- **Кнопка "Удалить все записи"** удаляет таблицы модуля из базы данных (деинсталляция). + +## Шаблоны, чанки и плейсхолдеры ## + + + + + + + + + + + + + + + + + + + + +
    Наименование шаблонаПлейсхолдеры в шаблонеПримечание
    Шаблон для письма покупателю об изменении статуса заказа + [+date+] - дата заказа;
    + [+site_name+] - имя сайта;
    + [+orderID+] - номер заказа;
    + [+status+] - статус заказа;
    + [+loop+]/[+end_loop+] - начало и конец строки данных товаров (цикл);
    + [+name+] - название товара;
    + [+link+] - ссылка на товар;
    + [+price+] - цена товара
    + [+addit_data+] - список доп. параметров (используется шаблон additData.tpl);
    + [+count+] - кол-во единиц товара;
    + [+totalPrice+] - общая цена;
    + [+currency+] - валюта;
    + [+order_changed_txt+] - текст (берется из языкового файла) выводится, если состав заказа был изменен менеджером магазина и один или более товаров можно купить;
    + [+order_notpossible_txt+] - текст (берется из языкового файла) выводится, если ни один из выбранных товаров нельзя купить;
    + + [+contact+] - Контактная информация (адрес, способ доставки и т.п.). Шаблон редактируется в конфигурации модуля. +
    shopkeeper/module/templates/mail_changeStatus.tpl
    Шаблон для письма покупателю об отправке заказаshopkeeper/module/templates/mail_shipped.tpl
    Шаблон для списка доп. параметров товара в письме + [+param+] - имя и цена параметра. Цена указывается в скобках. Если цена = 0, то пишется только название параметра (без скобок).
    + [+name+] - имя параметра.
    + [+price+] - цена параметра. +
    shopkeeper/module/templates/additData.tpl
    + +## Каталог ## +Есть возможность хранить товары в каталоге Shopkeeper, а не в дереве документов. + +Чтобы в модуле Shopkeeper (в админке) появилась ссылка "Каталог", нужно в конфигурации указать ID категории каталога (ID документа) по умолчанию. +Также необходимо настроить конфигурацию плагина SaveToSHK — указать ID шаблона товаров и ID TV-параметра цены. + +В каталоге для перехода в другую категорию нужно нажать на иконку рядом с названием текущей категории и выбрать в дереве документов новую. Потом нажать на появившуюся ссылку категории. + +Для нормальной работы каталога Shopkeeper нужно настроить плагин SaveToSHK. Укажите ID шаблона товаров и ID TV-параметра цены. + +## Учет количества товаров на складе ## +Для того чтобы покупатель и владелец магазина знали какое кол-во товара есть на складе, можно создать дополнительный TV-параметр (например inventory) с типом ввода "Text". Далее в конфигурации модуля нужно ввести имя TV в поле "Учет товара на складе (имя TV)". + +После перевода заказа в статус "Отправлен" число этого параметра для каждого выбранного товара будет автоматически пересчитано. Если поле "Учет товара на складе" пусто, кол-во товаров на складе не учитывается. + +## Важно ## +Для того чтобы заказы отправлялись в модуль, в вызов сниппета eForm добавить параметры: +``` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +``` + + +В чанке шаблона формы оформления заказа должно быть скрытое поле с названием чанка текста письма (reportTpl) + +`````` + +### Пример вызова eForm ### + +``` +[!eForm? +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&vericode=`1` +&gotoid=`11` +&subject=`Заказ в интернет-магазине` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +!] +``` + +## Экспорт заказов ## +В модуле есть возможность экспортировать список заказов в CSV-файл. + +Если для открытия вы используете OpenOffice, открыв файл, укажите параметр разделителя - "Точка с запятой", кодировка - "Кирилица (Windows-1251)". diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/04_\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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/04_\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..097b2ed7 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/04_\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,200 @@ +В данный момент форма заказа делается при помощи сниппета eForm. Возможно также сделать всё на основе FormLister, используя prepare-конструкции. + +* Оформление заказа на eForm +* Оформление заказа на FormLister + + +

    Оформление заказа на eForm

    + +**Важно:** на странице формирования заказа сниппет Shopkeeper должен вызываться раньше eForm! + +В чанке формы заказа обязательно добавить скрытое поле: +``` + +``` +где shopOrderReport - это название чанка с шаблоном отчета (параметр &report сниппета eForm). + +``` +&eFormOnBeforeMailSent=`populateOrderData` - функция для заполнения данных о выбранных товарах. +``` + +Для того чтобы заказы отправлялись в модуль Shopkeeper, в вызов сниппета eForm добавить параметр +``` +&eFormOnMailSent=`sendOrderToManager` +``` + +### Пример вызова eForm: ### +``` +[!eForm? +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&ccsender=`1` +&gotoid=`11` +&subject=`Новый заказ` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +!] +``` + +## Товары в каталоге Shopkeeper ## +Можно сохранять товары в отдельльную таблицу БД (не документы).При этом остается возможность использовать стандартные TV-параметры для товаров и плагины. Для создания и редактирования товаров используется стандартный интерфейс (можно настраивать с помощью плагина ManagerManager). Для вывода товаров на сайте используется сниппет catalogView. + +Товары можно "вложить" в любой документ (категорию), выбрав в дереве документов. Т.е. категории каталога (структура) создается как и раньше, документами, но сами товары будут храниться в отдельной таблице БД. + +Если товар из каталога Shopkeeeper, в чанк товара (сниппет catalogView) нужно вставить скрытое поле: + +``` + +``` +Чтобы в модуле Shopkeeper (в админке) появилась ссылка "Каталог", нужно в конфигурации указать ID категории каталога (документ MODx) по умолчанию. + +Также необходимо настроить конфигурацию плагина SaveToSHK — указать ID шаблона товаров и ID TV-параметра цены. + + +## Важно! ## + +Рекомендуется использовать ЧПУ. В шаблонах сайта рекомендуется использовать `` внутри и относительные пути. +Если чанки хранятся в файлах (используется команда @FILE:), проверьте кодировку этих файлов. Она должна быть такая же, как у вашего сайта. + +Рекомендуется установить плагин PHx. В чанке chunk_shopOrderFormWebUser.tpl он используется для заполнения скрытых полей данными авторизованного пользователя. + +Для вывода корзины (сниппета) в разных местах рекомендуется создавать разные шаблоны для страниц или использовать плагин PHx. +Если используется умножение цены товара на цену доп.параметра, в шаблоне информации о товаре (chunk_shopStuff.tpl и chunk_shopToCart.tpl) поле с ID товара (``) должно быть выше доп. параметров по HTML-коду. + + +

    Оформление заказа на FormLister

    +В файле assets/snippets/shopkeeper/shopkeeper.inc.php ищем строчки + +``` +require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php"; +$shopCart = new Shopkeeper($modx, $shkconf); +``` +заменяем их на + +``` +require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php"; +$shopCart = new Shopkeeper($modx, $shkconf); +if (!empty($saveObject)) { + $modx->setPlaceholder($saveObject, $shopCart); +} +``` + +В вызов Shopkeeper на странице заказа теперь нужно добавить параметр: + +``` +&saveObject=`shk` +``` +Далее следует создать сниппет ShkForm, через который будем вызывать FormLister: + +``` +getPlaceholder($shkObject)) && ($shk instanceof Shopkeeper) && !empty($purchases)) { + $params['ignoreMailerResult'] = 1; + $params['protectSubmit'] = 0; + $params['submitLimit'] = 0; + $params['prepareProcess'] = [function ($modx, $data, $FormLister) use ($shk) { + $shk->populateOrderData($data); + $shk->sendOrderToManager($data); + return $data; + }]; + + $out = $modx->runSnippet('FormLister', $params); +} + +return $out; +``` + +**Пример** + +Вызов Shopkeeper: + +``` +[!Shopkeeper? +&cartType=`full` +&priceTV=`price` +&changePrice=`1` +&counterField=`1` +&style=`0` +&noJavaScript=`0` +&noJQuery=`1` +&flyToCart=`nofly` +&orderFormPage=`5067` +&cartTpl=`shopCart` +&cartHelperTpl=`cart_action_helper_tpl` +&cartRowTpl=`shopCartRow` +&orderDataTpl=`shopOrderData` +&saveObject=`shk` +!] +``` + +Вызов ShkForm: + +``` +[!ShkForm? +&formid=`shopOrderForm` +&shkObject=`shk` +&formTpl=`shopOrderForm` +&reportTpl=`shopOrderReport` +&captcha=`modxCaptcha` +&parseDocumentSource=`1` +&rewriteUrls=`1` +&filters=`{ + "name":["trim", "stripTags", "removeExtraSpaces"], + "email":["trim", "email"], + "phone":["trim", "phone", "removeExtraSpaces"], + "address":["trim", "stripTags", "removeExtraSpaces"], + "message":["trim", "stripTags", "compressText"] +}` +&rules=`{ + "name":{ + "required":"Введите имя" + }, + "email":{ + "required":"Введите электронный ящик", + "email":"Введите электронный ящик правильно" + }, + "phone":{ + "required":"Введите номер телефона", + "phone":"Введите номер телефона правильно" + }, + "address": { + "required":"Введите адрес" + }, + "payment":{ + "required":"Выберите способ оплаты", + "!equals": { + "params":["0"], + "message":"Выберите способ оплаты" + } + } +}` +&formControls=`payment,delivery` +&subject=`Новый заказ на сайте` +&to=`test@test.ru` +&successTpl=`shopThankYou` +!] +``` + +Чанк shopOrderReport: + +``` +

    В интернет-магазине сделан заказ.

    +

    Номер заказа: [+orderID+]

    +Состав заказа: +[+orderData+] +

    +Данные покупателя:
    + + + + + + + + +
    Адрес: [+address.value+]
    Способ доставки: [+delivery.value+]
    Способ оплаты: [+payment.value+]
    Ф.И.О.: [+name.value+]
    E-mail: [+email.value+]
    Телефон: [+phone.value+]
    Сообщение: [+message:nl2br+]
    +``` +Обсуждение на сайте [сообщества](http://modx.im/blog/fast-solution/5917.html) diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/05_\320\237\321\200\320\276\321\204\320\270\320\273\321\214_\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/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/05_\320\237\321\200\320\276\321\204\320\270\320\273\321\214_\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..81b7bacb --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/05_\320\237\321\200\320\276\321\204\320\270\320\273\321\214_\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,77 @@ + +### Сниппет SHKUserProfile - личный кабинет покупателя ### + +Сниппет выводит списох текущих и архив заказов пользователя. Пользователь может редактировать свои данные, указанные при регистрации. Работает совместно со сниппетом Paykeeper. Если статус заказа "Принят к оплате", то можно оплатить заказ через Robokassa или WebMoney. + +Также у пользователя есть возможность до оплаты отказаться от заказа или после оплаты повторить предыдущий заказ. +Поддерживается плагин addWebUserFields, с помощью которого можно добавлять доп. поля для пользователя при регистрации. + +В шаблонах сниппета поддерживается PHx. + +## Парамеры: ## +- &id - ID сниппета. Полезно при вызове несколько раз на одной странице. +- &lang - язык. По умолчанию язык системы управления. +- &profileTpl - Имя чанка или файл (@FILE:) с шаблоном для страницы редактирования профиля. +
    По умолчанию: `@FILE:assets/snippets/shk_userprofile/tpl/profile.tpl.` + +- &ordersListTpl - Шаблон (чанк) со списком заказов. +
    По умолчанию: `@FILE:assets/snippets/shk_userprofile/tpl/ordersList.tpl`. + +- &orderDescTpl - Шаблон просмотра состава заказа. +
    По умолчанию: `@FILE:assets/snippets/shk_userprofile/tpl/orderDesc.tpl`. + +- &purchasesListTpl - Шаблон для списка товаров в заказе на странице со списком заказов (по умолчанию отключено - `false`). +
    Пример: `@FILE:assets/snippets/shk_userprofile/tpl/purchasesList.tpl` + +- &menuTpl - Шаблон первого уровня меню. +
    По умолчанию: `@FILE:assets/snippets/shk_userprofile/tpl/menu.tpl`. + +- &subMenuTpl - Шаблон второго уровня меню. +
    По умолчанию: `@FILE:assets/snippets/shk_userprofile/tpl/subMenu.tpl`. + +- &excepDigitGroup - разделять числа цен в корзине на разряды. + +- &oneLevelMenu=`true` - строить меню в один уровень. + +- &additFieldsTpl - Шаблон для дополнительных полей. +
    По умолчанию: `@FILE:assets/snippets/shk_userprofile/tpl/addit_fields.tpl`. + +- &additFieldsHide - Не давать редактировать (и не показывать) пользователю доп. поля (чарез запятую). +
    По умолчанию: count_purchase. +Пример: `&additFieldsHide=count_purchase,distribution`. + +- &showOrder=`true` - показать информацию о заказе и оплатить (если установлен сниппет Paykeeper). +
    Используется на странице оплаты для незарегистрированного покупателя. + +- &display - число заказов на странице при выводе архива заказов. + +- &action - страница по умолчаню. +
    Возможные значения: profile (профиль), curorders (текущие заказы), archorders (архив заказов). + +Можно передавать любые параметры сниппету Paykeeper (c префиксом "pay_"). + +Пример: `&pay_payment_method=robokassa`. + +В шаблоне orderDescTpl этот сниппет выводится в месте плейсхолдера [+payment_snippet+]. + + +## Примеры вызова: ## + +Шаблоны по умолчанию: +``` +[!SHKUserProfile!] +``` + +Вызов с параметрами: +``` +[!SHKUserProfile? +&purchaseTpl=`@FILE:assets/snippets/shk_userprofile/tpl/purchase.tpl`&oneLevelMenu=`true` +!] +``` +На странице оплаты для незарегистрированного пользователя (вывод информации о заказе): +``` +[!SHKUserProfile? +&showOrder=`true` +&orderDescTpl=`@FILE:assets/snippets/shk_userprofile/tpl/orderDescNotRegd.tpl` +!] +``` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/06_\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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/06_\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..d0c6da38 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/06_\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,480 @@ +Оплата заказов в магазине на Shopkeeper. + +* Paykeeper +* Yandex.Money + + +Рассмотрим 2 самых популярных решения для оплаты. + +

    Paykeeper

    +По-умолчанию с магазином устанавливается сниппет Paykeeper. +Поддерживается система Webmoney (без посредников) и Robokassa. Paykeeper достаточно тесно интегрируется с Shopkeeper: после совершения оплаты заказ в модуле переводится в статус "Оплата получена", а также Paykeeper интегрируется со сниппетом личного кабинета покупателя - SHKUserProfile. + +Из дополнительных опций можно отметить, что производить оплату возможно как сразу после отправки заказа, так и после подтверждения заказа менеджером. Есть опция "повторить заказ". + +## Настойки Paykeeper ## + +## Установка ### +По-умолчанию Paykeeper будет установлен из репозитория вместе с магазином. Если этого не произошло, то нужно скачать и установить дистрибутив отдельно. + +### Установка Paykeeper вручную: ### + +* В системе управления создать новый сниппет +* Название сниппета: `Paykeeper` +* Описание: Онлайн-оплата покупок +* Открыть [файл сниппета](https://github.com/extras-evolution/Shopkeeper/blob/master/install/assets/snippets/Paykeeper.tpl) из репозитория, скопировать содержимое и вставить в поле "Код сниппета", сохранить. +* Скопировать [все файлы сниппета](https://github.com/extras-evolution/Shopkeeper/tree/master/assets/snippets/paykeeper) в папку `assets/snippets/paykeeper/`. + +## Настойки Paykeeper ## + +### Оплата сразу после отправки заказа ### +В системе управления открыть для редактирования страницу, которая открывается после оформления заказа (`&gotoid` в eForm). + + Вставить в поле "Содержимое ресурса" или в шаблон страницы вызов сниппета: + +``` +[!Paykeeper!] +``` +Проверьте чтобы на странице оформления заказа в вызове сниппета eForm был указан параметр &gotoid. + +**Пример:** +``` +[!eForm? +&gotoid=`15` +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&subject=`Новый заказ` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +!] +``` +где 15 - это ID страницы, которая будет открываться после отправки заказа. + +В шаблоне формы должен быть выпадающий список (select) для выбора метода оплаты. + +**Пример:** +``` + +``` +Теперь после отправки заказа на следующей странице будет появляться кнопка "Оплатить сейчас". + +## Настройка платежных систем ## + +### Настройка ROBOKASSA ### +* В личном кабинете в поле "Result URL" введите URL, по которой доступен файл `result.php` - `http://[ваш домен]/assets/snippets/paykeeper/result.php` +* Метод отсылки данных по Result URL - POST. +* Success URL - страница, которая будет открываться после успешного прохождения платежа. +* Метод отсылки данных по Success URL - POST +* Fail URL - страница, которая будет открываться после незавершенного платежа. +* Метод отсылки данных по Fail URL - POST +* Введите Пароль #1 и Пароль #2. +* Откройте файл `paykeeper/robokassa/config.php` и введите свои данные (логин, пароль 1, пароль 2.). + + +### Настройка WEBMONEY ### +* У вас должен быть Аттестат продавца. Откройте сайт http://merchant.webmoney.ru/ и авторизуйтесь +* Перейдите "Настройки" -> "Web Merchant Interface" -> "R-кошелек" -> "Настроить". +* Настройки анологичные Robokassa. +* Откройте файл `paykeeper/webmoney/config.php` и введите номер R-кошелька (`$purse['rub']`) и Secret Key. + + +## Шаблоны, чанки и плейсхолдеры ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Параметр сниппетаОписаниеПлейсхолдеры в шаблонеПримечание
    &WMstartPayTplШаблон первой страницы при оплате Webmoney. + [+action+] - action для формы;
    + [+email+] - адрес электронной почты пользователя;
    + [+payment_button+] - название кнопки;
    + [+disabled+] - блокировка кнопки, если пользователь незарегистрирован и e-mail не указан (disabled="disabled"). +
    + + Пример: paykeeper/tpl/WMstartPayTpl.tpl + +
    &RKstartPayTplШаблон первой страницы при оплате через Robokassa. + + Пример: paykeeper/tpl/RKstartPayTpl.tpl + +
    &WMpayTplШаблон страницы второго шага оплаты Webmoney (перед переходом на страницу системы оплаты). + [+action+] - action для формы;
    + [+email_string+] - строка с предупреждением, если указан некорректный e-mail;
    + [+pay_summ+] - сумма платежа;
    + [+pay_purse_type+] - тип WM-кошелька для оплаты;
    + [+h_inputs+] - скрытые текстовые, необходимые для системы оптаты. +
    + + Пример: paykeeper/tpl/WMkpayTpl.tpl + +
    &RKpayTplШаблон страницы второго шага оплаты Robokassa (перед переходом на страницу системы оплаты). + [+action+] - см. выше.
    + [+email_string+] - см. выше.
    + [+pay_summ+] - см. выше.
    + [+pay_currency+] - валюта (руб.)
    + [+h_inputs+] - см. выше. + +
    + + Пример: paykeeper/tpl/RKpayTpl.tpl + +
    + + +## Параметры сниппета ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОписание и значенияЗначение по умолчаниюПримечание
    &langязыкЯзык системы управленияВ настоящее время доступны языки:
    `russian` (папка paykeeper/lang/)
    &paymentDescОписание платежа`Оплата покупки в интернет-магазине` 
    &paymentButtonНазвание кнопки на первой странице`Оплатить сейчас` 
    &resultURLURL страницы "Result URL"`http://[ваш сайт]/assets/snippets/paykeeper/result.php`Не обязательный параметр. Можно применять для Webmoney.
    &payment_methodМетод оплаты
    `webmoney`, `robokassa`
    $_SESSION['shk_payment_method'] 
    &payment_orderidID заказа$_SESSION['shk_order_id'] 
    &payment_useridID пользователя$_SESSION['shk_order_user_id'] 
    &payment_useremailE-mail пользователя$_SESSION['shk_order_user_email'] 
    &payment_valueСумма оплаты$_SESSION['shk_order_price'] 
    &payment_currencyВалюта оплаты$_SESSION['shk_currency'] 
    &payment_reserveЗарезервировать товар для оплаты
    `true`, `false`
    `false`Оплата производится после того как статус заказа переводится в "Принят к оплате". Новый параметр в версии 1.5.
    &WMstartPayTplИмя чанка с шаблоном первой страницы при оплате Webmoney`@FILE:assets/snippets/paykeeper/tpl/WMstartPayTpl.tpl`Если чанки хранятся в файлах, можно указать путь с командой "@FILE:". Если чанки созданы в системе управления, то указывается только имя чанка (например &WMstartPayTpl=`WMstartPay`)
    &WMpayTplИмя чанка с шаблоном страницы второго шага оплаты Webmoney (перед переходом на страницу системы оплаты)`@FILE:assets/snippets/paykeeper/tpl/WMkpayTpl.tpl`
    &RKstartPayTplИмя чанка с шаблоном первой страницы при оплате через Robokassa`@FILE:assets/snippets/paykeeper/tpl/RKstartPayTpl.tpl`
    &RKpayTplИмя чанка с шаблоном страницы второго шага оплаты Robokassa (перед переходом на страницу системы оплаты)`@FILE:assets/snippets/paykeeper/tpl/RKpayTpl.tpl`
    &payTestТестовый режим оплаты. Возможные значения: `true`, `false`.`false` 
    + +## Особенности и дополнительные возможности ## +Если сниппет вызывается без параметров, значения суммы оплаты, ID заказа и т.д. берется из сессий, которые создаются сниппетом Shopkeeper после сохранения заказа. + +Сниппет можно вызывать из других сниппетов через функцию $modx->runSnippet(). + +В данной версии (1.x) для WebMoney поддерживается оплата только WMR (рубли). +Сниппет тесторовался только с кодировкой сайта UTF-8, т.к. она является рекомендуемой для Evolution CMS. C другой кодировкой корректная работа не гарантируется. + + +**Примеры вызова Paykeeper:** + +Оплата после отправки заказа +``` +[!Paykeeper!] +``` +Резервирование (оплата после подтверждения менеджером) +``` +[!Paykeeper? &payment_reserve=`true`!] +``` +Оплата отдельного заказа +``` +[!Paykeeper? +&payment_method=`webmoney` +&payment_orderid=`2` +&payment_value=`100` +&payment_currency=`WMR`!] +``` + +

    Yandex.Money

    +Решение для оплаты при помощи сервиса Яндекс.Деньги. + +**Доступные платежные методы, если вы работаете как юридическое лицо:** + +* Банковские карты - Visa (включая Electron), MasterCard и Maestro любого банка мира +* Электронные деньги - Яндекс.Деньги, WebMoney и QIWI Wallet +* Наличные - Более 170 тысяч пунктов оплаты по России +* Баланс телефона - Билайн, МегаФон и МТС +* Интернет банкинг - Альфа-Клик, Сбербанк Онлайн, MasterPass и Промсвязьбанк +* Кредитование + +## Установка модуля + +### Установка модуля +Для установки данного модуля необходимо: +* Распаковать [архив](https://github.com/yandex-money/yandex-money-cms-modx-evo/archive/master.zip) и переместить папку `assets` в папку `assets` Вашего сайта +* Перейти в административную панель Evolution CMS +* Перейти в меню `Модули` - `Управление модулями` - `Новый модуль` и создать новый модуль с названием `YandexMoney` +* Вставить в код модуля `YandexMoney` следующий код: +``` +include '../assets/snippets/yandexmoney/yandexmoney.class.php'; + +$dbname = $modx->db->config['dbase']; //имя базы данных +$dbprefix = $modx->db->config['table_prefix']; //префикс таблиц +$mod_table = $dbprefix."yandexmoney"; //таблица модуля +$theme = $modx->config['manager_theme']; //тема админки +$basePath = $modx->config['base_path']; //путь до сайта на сервере + +$action = isset($_POST['action']) ? $_POST['action']:''; + +switch($action) { + +//Установка модуля (создание таблицы в БД) +case 'install': + $sql = "CREATE TABLE $mod_table (id INT(11) NOT NULL AUTO_INCREMENT, config LONGTEXT, PRIMARY KEY (id))"; + $modx->db->query($sql); + + $sql = "INSERT INTO $mod_table (id, config) VALUES (1, '')"; + $modx->db->query($sql); + + header("Location: $_SERVER[REQUEST_URI]"); +break; + +//Удаление таблицы модуля +case "uninstall": + $sql = "DROP TABLE $mod_table"; + $modx->db->query($sql); + header("Location: $_SERVER[REQUEST_URI]"); +break; + +//Обновление записи в БД +case 'save': + $fields = array( + 'config' => serialize($_POST['config']) + ); + $ym_stat = new yamoney_statistics($_POST['config']); + $query = $modx->db->update($fields, $mod_table, 'id = 1'); + header("Location: $_SERVER[REQUEST_URI]"); +break; + + +//Перезагрузка страницы (сброс $_POST) +case 'reload': + header("Location: $_SERVER[REQUEST_URI]"); +break; + +//Страница модуля +default: + echo Yandexmoney::adminHeadHtml($theme);; + if (!Yandexmoney::isInstalled($dbname, $mod_table)){ + //если таблицы не существует, выводим кнопку "Установить модуль" + echo Yandexmoney::adminInstallHtml(); + }else{ + $data_query = $modx->db->select("*", $mod_table, "", "id ASC", ""); + $row = $modx->db->getRow($data_query); + $config = unserialize($row['config']); + + $ym = new Yandexmoney($config); + echo $ym->adminModuleHtml(); + } + break; +} +``` + +Перейти в меню `Элементы` - `Сниппеты` и создать новый сниппет с названием `YandexMoney`. + +Вставить следующий код: + +``` +db->config['dbase']; //имя базы данных +$dbprefix = $modx->db->config['table_prefix']; //префикс таблиц +$mod_table = $dbprefix."yandexmoney"; //таблица модуля +$theme = $modx->config['manager_theme']; //тема админки +$basePath = $modx->config['base_path']; //путь до сайта на сервере +if(!defined('YANDEXMONEY_PATH')) { + define('YANDEXMONEY_PATH', MODX_BASE_PATH."assets/snippets/yandexmoney/"); +} +require_once YANDEXMONEY_PATH.'yandexmoney.class.php'; + +$data_query = $modx->db->select("*", $mod_table, "", "id ASC", ""); +$row = $modx->db->getRow($data_query); +$config = unserialize($row['config']); +$ym = new Yandexmoney($config); +if ($_POST['payment']){ + $ym->pay_method = $_POST['payment']; +} +if ($action == 'showMethods') { + return $ym->getSelectHtml(); +} +?> +``` + +Перейти в меню `Элементы - Управление файлами` и в файл `assests/snippets/shopkeeper/shopkeeper.inc.php` вставить следующий код: + +``` +if(!function_exists('sendOrderToManager')){ + function sendOrderToManager(&$fields){ + global $modx, $shkconf; + + if(!class_exists('Shopkeeper')) require_once MODX_BASE_PATH."assets/snippets/shopkeeper/class.shopkeeper.php"; + if(!defined('YANDEXMONEY_PATH')) define('YANDEXMONEY_PATH', MODX_BASE_PATH."assets/snippets/yandexmoney/"); + if(!function_exists('YandexMoneyForm')) require_once YANDEXMONEY_PATH.'yandexmoney.class.php'; + $shopCart = new Shopkeeper($modx, $shkconf); + + $shopCart->sendOrderToManager($fields); + + YandexMoneyForm($fields); + + return true; + } +} +``` + +Перейти в меню `Элементы - Чанки` и создать новый чанк с названием `YandexMoney` + +Вставить в код чанка `YandexMoney` следующий код: + +``` +[[YandexMoney?&action=`showMethods`]] +``` + +Пример с вставленной строкой `[[YandexMoney?&action=`showMethods`]]`: + +``` + +``` + +В коде страницы с формой заказа необходимо вставить следующий код: + +``` +[[YandexMoney? &action=`beforeCart`]] +``` + +Пример с вставленной строкой `[[YandexMoney? &action=`beforeCart`]]`: + + +``` +[[YandexMoney? +&action=`beforeCart` +]] + +[!Shopkeeper? +&cartType=`full` +&priceTV=`price` +&orderFormPage=`34` +¤cy=`руб.` +&noJQuery=`1` +!] + +[!eForm? +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&vericode=`1` +&ccsender=`1` +&gotoid=`35` +&subject=`Новый заказ` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` !] +``` + +Перейти в `Модули` и щелкнуть по значку рядом с `YandexMoney`, а затем выбрать пункт "Установить YandexMoney" diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/index.md" new file mode 100644 index 00000000..99bfbdd9 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Shopkeeper/index.md" @@ -0,0 +1,35 @@ +Программный комплекс для создания интернет-магазина на базе Evolution CMS. + +## Установка ## +Установить Shopkeeper можно в 1 клик из магазина дополнений Evolution CMS. + +## Что для чего? ## +После установки вы увидите несколько установленных дополнений. Давайте разберёмся, какое из них за что отвечает. + +- Cниппет Shopkeeper - это сниппет для формирования корзины на страницах сайта. +- Модуль управления заказами - модуль внутри админ-панели (Модули -> Shopkeeper). Нужен для отслеживания заказов, их статусов и просмотра подробностей о каждом конкретном заказе. +- Модификатор shk_widget и плагин paramEdit позволяют сделать различную стоимость у товаров, зависящую от выбранных опций. +- Плагин PHx - плагин нужен для части функционала магазина, в том числе для shk_widget. +- Сниппет shk_userprofile - профиль пользователя, история заказов. +- Сниппет paykeeper - сниппет для оплаты заказа + + +## Принципы работы ## + +### Покупка ### +На каждой странице, где осуществляется покупка, должен быть вызван сниппет Shopkeeper. Именно он будет отображать корзину и он же отвечает за добавление в неё товаров. + +Вёрстка каждого товара должна быть соответствующим образом модифицирована. Товарам присваиваются определённые классы, внутри размещаются кнопки и поля цен и количества. +После чего скрипт Shopkeeper'а сможет понять, что перед ним -- товар, обработать нажатие кнопки "Купить" и добавить товар в корзину. + +Подробнее о разметке товаров смотрите в материале "Сниппет Shopkeeper". + +### Оформление заказа ### +Для оформления заказа используется также вызов сниппета Shopkeeper и вызов любого дополнения, умеющего обрабатывать формы. По-умолчанию Shopkeeper оптимизирован для использования со сниппетом eForm. Но ничто не мешает использовать и более современный FormLister. +Подробнее смотрите на странице "Оформление заказа". + +### Оплата заказа ### +Для оплаты используется как правило сниппет paykeeper. Известны также решения на основе Яндекс.Деньги. + +### Профиль пользователя и история заказов ### +Для отслеживания заказов со стороны пользователя используется сниппет shk_userprofile. Его описание доступно на соответствующей странице. \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/TagSaver/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/TagSaver/index.md" index dd0f4e18..c2b6e609 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/TagSaver/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/TagSaver/index.md" @@ -70,7 +70,7 @@ $id = isset($id) ? (int)$id : 0; $out = array(); if($id>0 && $tag!=''){ $sql=$modx->db->query("SELECT doc_id FROM ".$modx->getFullTableName("tags")." as t - LEFT JOIN ".$modx->getFullTableName("site_content_tags")." s ct ON ct.tag_id = id + LEFT JOIN ".$modx->getFullTableName("site_content_tags")." as ct ON ct.tag_id = id WHERE t.`name`='".$modx->db->escape($tag)."' AND ct.tv_id={$id}"); $sql=$modx->db->makeArray($sql); foreach($sql as $item){ @@ -125,4 +125,4 @@ return isset($input) ? urlencode($input) : '';

    Для чего он нужен найдете в гугле

    В силу того, что мне довольно часто приходится работать с сайтами сделаными другими программистами, то могу сказать вам одно – таких решений еще нигде небыло. Все фильтруют по старинке средствамми Ditto и изобретают свои велосипеды в виде экстендеров для него. Мое решение повзоляет вам работать с видимой частью так же, как и раньше. Зато существенно снимает нагрузку на сервер при фильтрациях. И облегчает выборку даже если вы используете знаменитый сниппет DropDownDocs для привязки статей к нескольким разделам (ведь по сути это тоже теги, только вид с боку). Соответственно, если вам нужны теги и фильтрации по TV параметрам в значении которых может быть несколько данных – используйте TagSaver.

    -

    Автор: Agel_Nash

    \ No newline at end of file +

    Автор: Agel_Nash

    diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/WebloginPE/02_\320\237\321\200\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\321\213.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/WebloginPE/02_\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" similarity index 99% rename from "ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/WebloginPE/02_\320\237\321\200\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\321\213.md" rename to "ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/WebloginPE/02_\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" index ac8700e2..52c2ef8d 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/WebloginPE/02_\320\237\321\200\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\321\213.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/WebloginPE/02_\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" @@ -35,4 +35,4 @@ [+request.userid+] The user ID for the Activation form.
    [+request.activationkey+] The activation key for the Activation form.
    [+form.captcha+] The captcha image for use with your registration form. - \ No newline at end of file + diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" new file mode 100644 index 00000000..5469fa54 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" @@ -0,0 +1,145 @@ +Установка +============ + +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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/02_Ditto_\320\270_YAMS.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/02_Ditto_\320\270_YAMS.md" deleted file mode 100644 index ece2b9c9..00000000 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/02_Ditto_\320\270_YAMS.md" +++ /dev/null @@ -1,22 +0,0 @@ - - -

    Yams: Ditto и YAMS

    -Примеры как подружить Ditto с YAMS -
    -

    С Ditto обстоит намного сложней, но без него никуда.

    -

    К вызову Ditto нужно подключать расширение:

    -
    &extenders=`@FILE assets/modules/yams/yams.extender.inc.php`
    -

    Если вызов некэшируемый [!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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/02_\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/02_\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217.md" new file mode 100644 index 00000000..212dcbe6 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/02_\320\272\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\321\217.md" @@ -0,0 +1,268 @@ +конфигурация +============= + +> 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/03_Wayfinder-\320\270-YAMS.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/03_Wayfinder-\320\270-YAMS.md" deleted file mode 100644 index c49b59a7..00000000 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/03_Wayfinder-\320\270-YAMS.md" +++ /dev/null @@ -1,16 +0,0 @@ - - -

    Yams: Wayfinder и YAMS

    -Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS. -
    -

    Вызов Wayfinder– a:

    -
    [[Wayfinder? &startId=`0`  &useWeblinkUrl=`true` &rowTpl=`menu_tpl`]]
    -

    YAMS-у требуется, чтобы параметр &useWeblinkUrl был включён.

    -

    Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS.

    -

    Шаблон одной кнопки – menu_tpl:

    -
    -<li [+wf.id+][+wf.classes+]>
    -	[[YAMS? &get=`content` &docid=`[+wf.docid+]` &from=`pagetitle`]]
    -	[+wf.wrapper+]
    -</li>
    -
    \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/03_\320\257\320\267\321\213\320\272\320\276\320\262\321\213\320\265 \321\200\320\265\320\266\320\270\320\274\321\213.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/03_\320\257\320\267\321\213\320\272\320\276\320\262\321\213\320\265 \321\200\320\265\320\266\320\270\320\274\321\213.md" new file mode 100644 index 00000000..4447687d --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/03_\320\257\320\267\321\213\320\272\320\276\320\262\321\213\320\265 \321\200\320\265\320\266\320\270\320\274\321\213.md" @@ -0,0 +1,82 @@ +Языковые режимы +============== + +> 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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. -
    -

    Независимо от того, что используется, в файле с правилами или чанке с правилами в конце надо прописать:

    -
    require ($modx->config['base_path'] . 'assets/modules/yams/yams.mm_rules.inc.php' );
    -

    Собственно, YAMS готов к работе.

    -

    В «Инструментах» > «Конфигурации» включить Дружественные 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? &get=`repeat` &repeattpl=`lang_tpl` &currenttpl=`current_lang_tpl`]]

    -
    &repeattpl=`lang_tpl` – шаблон кнопки языка
    -
    &currenttpl=`current_lang_tpl` – шаблон кнопки текущего языка
    -

    Шаблон lang_tpl выглядит, например, вот так:

    -
    (yams_name)
    -

    (yams_docr) – ссылка, сгенерированная до текущей страницы в этом или остальных языках

    -

    (yams_name) – имя языка, вписанное в табе Модули > Yams > Language Settings

    -

    &currenttpl – шаблон выбранного языка. Тоже самое, только можно добавить class="selected", ну, или что по вкусу, чтобы язык был виден, как текущий.

    -

    Точно таким же образом можно подставить и флажки вместо текста.

    \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/04_\320\257\320\267\321\213\320\272\320\276\320\262\321\213\320\265 \320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/04_\320\257\320\267\321\213\320\272\320\276\320\262\321\213\320\265 \320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.md" new file mode 100644 index 00000000..58edad18 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/04_\320\257\320\267\321\213\320\272\320\276\320\262\321\213\320\265 \320\275\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270.md" @@ -0,0 +1,144 @@ +Языковые настройки +================= + +> 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/05_\320\227\320\260\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/05_\320\227\320\260\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\320\270.md" new file mode 100644 index 00000000..850c27b5 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/05_\320\227\320\260\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\320\270.md" @@ -0,0 +1,201 @@ +Заполнители +============ + +> 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 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/05_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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.

    -

    Подключение модуля, плагина и сниппета:

    -

    Код модуля:

    -
    require_once ( $modx->config['base_path'] . 'assets/modules/yams/yams.module.inc.php' );
    -

    – Создать в администрационной части в разделе «Модули» новый модуль YAMS.

    -

    Описание: Yet Another Multilingual Solution Module

    -

    – Создать в администрационной части в разделе «Плагины» новый плагин YAMS.

    -

    Описание: Yet Another Multilingual Solution Plugin

    -

    Код плагина:

    -
    require ( $modx->config['base_path'] . 'assets/modules/yams/yams.plugin.inc.php');
    -

    В системных событиях плагина поставить галочки на:

    - -

    – Создать в администрационной части в разделе «Сниппеты» новый сниппет YAMS.

    -

    Описание: Yet Another Multilingual Solution Snippet

    -

    Код сниппета:

    -
    <?php
    -	require ( $modx->config['base_path'] . 'assets/modules/yams/yams.snippet.inc.php' );
    -?>
    -

    После перезагрузить страницу, чтобы модуль заработал.

    \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/06_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 (\321\210\320\260\320\263 \320\267\320\260 \321\210\320\260\320\263\320\276\320\274).md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/06_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 (\321\210\320\260\320\263 \320\267\320\260 \321\210\320\260\320\263\320\276\320\274).md" new file mode 100644 index 00000000..1916beae --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/06_\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\260 (\321\210\320\260\320\263 \320\267\320\260 \321\210\320\260\320\263\320\276\320\274).md" @@ -0,0 +1,174 @@ +Настройка (шаг за шагом) +===== + +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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/07_\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\204\321\200\320\260\320\263\320\274\320\265\320\275\321\202\320\260.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/07_\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\204\321\200\320\260\320\263\320\274\320\265\320\275\321\202\320\260.md" new file mode 100644 index 00000000..c5f8ec4f --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/07_\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\204\321\200\320\260\320\263\320\274\320\265\320\275\321\202\320\260.md" @@ -0,0 +1,139 @@ +Использование фрагмента +======= + +> 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/08_\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\264\320\265\321\202\320\260\320\273\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/08_\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\264\320\265\321\202\320\260\320\273\320\270.md" new file mode 100644 index 00000000..3dd9d757 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/08_\320\242\320\265\321\205\320\275\320\270\321\207\320\265\321\201\320\272\320\270\320\265 \320\264\320\265\321\202\320\260\320\273\320\270.md" @@ -0,0 +1,136 @@ +Технические детали +================= + +> 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/01_YAMS + Snippets" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/01_YAMS + Snippets" new file mode 100644 index 00000000..7d4d0b37 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md" new file mode 100644 index 00000000..c59adc1a --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/03_YAMS Language Dependent Layout.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/03_YAMS Language Dependent Layout.md" new file mode 100644 index 00000000..bb2b6007 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/04_YAMS Language Flag List.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/04_YAMS Language Flag List.md" new file mode 100644 index 00000000..3ab386c0 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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: + + (yams_name) + + + +and "currentFlagItemTpl" is a chunk that contains an unlinked flag image: + +
  • + (yams_name) +
  • + +Flag images with the filename format (yams\_id).png should be placed in the directory "assets/images/flags/". diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/05_YAMS Language Select Landing Page.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/05_YAMS Language Select Landing Page.md" new file mode 100644 index 00000000..335b3ad4 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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: + + +
  • + + (yams_name) + +
  • + + 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/06_YAMS Mime-type Dependent Alias Suffixes.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/06_YAMS Mime-type Dependent Alias Suffixes.md" new file mode 100644 index 00000000..dc4cbff7 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/07_YAMS Multilingual Weblinks.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/07_YAMS Multilingual Weblinks.md" new file mode 100644 index 00000000..1730ef9a --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/08_YAMS XML Sitemap.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.md/08_YAMS XML Sitemap.md" new file mode 100644 index 00000000..1b0bf065 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/09_\320\232\320\260\320\272.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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/index.md" index 3a633879..b50df140 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/YAMS/index.md" @@ -1,4 +1,65 @@ +YAMS +===== +> Полная документация на английском языке для Evolution CMS v1.4 + и v2 + - -

    Yams многоязычность сайта на MODX Evolution YAMS - Yet Another Multilingual Solution

    -Модуль для создания многоязычных сайтов на MODX Evolution. +Автор: [PMS](https://github.com/Deesen/) + +**Лицензия:** GPL v3 + +**YAMS** - это настраиваемый аддон для Evo, который позволяет легко создавать многоязычные веб-сайты. + +Версия PHP не ниже 5.6 + +[Github] (https://github.com/Deesen/YAMS) + +В настоящее время реализованы следующие функции: + +* Весь контент управляется через одно дерево документов, чтобы обеспечить согласованную структуру сайта для всех языковых вариантов. + +* Стандартные заполнители Evo могут использоваться в шаблонах документов для создания многоязычного контента и URL-адресов. + +* Языковая раскладка с вкладками для многоязычных документов (требуется ManagerManager) + +* Шаблоны документов могут быть настроены как многоязычные или одноязычные. + +* Настраиваемые многоязычные URL-адреса. Ниже приведены примеры различных способов настройки YAMS для ссылки на языковые варианты одного документа: + +**Многоязычные псевдонимы:** + +Http: //sitename/my-doc-en.html + +Http: //sitename/mon-doc-fr.html + +**Только режим имени сервера:** + +http://en.sitename.com/mydoc.html + +http://fr.sitename.com/mydoc.html + +**Только режим имени корня:** + +http://sitename.com/en/mydoc.html + +http://sitename.com/fr/mydoc.html + +**Только режим имени корня, с одним языком в корне:** + +http://sitename.com/mydoc.html + +http://sitename.com/fr/mydoc.html + +**Режим имени сервера, режим корневого имени, понятные пути псевдонимов, многоязычные псевдонимы и многобайтовые URL:** + +http://en.sitename.com/england/folder/mydoc.html + +http://fr.sitename.com/la-france/répertoire/mon-doc.html + +* Дополнительная конфигурация URL, в том числе возможность скрывать псевдоним стартового документа сайта, SEO-дружественное перенаправление, многобайтовые URL и суффиксы, зависящие от типа содержимого. + +* Дополнительные метки-заполнители YAMS, обеспечивающие доступ к конкретным настройкам языка, таким как имя и направление языка. + +* Дополнительные функции с помощью вызова фрагмента YAMS, в том числе возможность управления пользовательскими многоязычными фрагментами, фрагментами и переменными шаблонов для создания переключателей языка на основе списка или раскрывающегося списка (временно), возможность повторять контент на нескольких языках… + +* Расширения для Ditto, Wayfinder, Jot и eForm. + +* Возможность создания пользовательских многоязычных шаблонных переменных. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" new file mode 100644 index 00000000..f651ea91 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/01_\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260.md" @@ -0,0 +1,84 @@ +## Начало использования bLang ## + +#### 1. Установка +bLang можна установить как из репозитория (версия 1.0.1b), так и скачать архив из гитхаба. + +#### 2. Настройка .htaccess +После установки необходимо в htaccess перед # For Friendly URLs добавить код +```apacheconfig +RewriteRule ^([a-z]{2})$ $1/ [R=301,L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^([a-z]{2})/(.*)$ index.php?q=$2&lang=$1 [L,QSA] +``` + +#### 3. Конфигурация bLang +После заходим в модуль bLang на вкладку конфигурация и подгоняем конфиг под себя. + +* Указываем языки. +* Указываем суфиксы полей для каждого языка. +* Указываем главный язык + +Остальные настройки менее важные. + + +#### 4. Создание тв полей +Переходим на вкладку Паметры. +Сдесь можна создавать мультиязычние TV. +Логика простая, вы создаете один параметр в модуле, а bLang сам автоматичиски делает дубль под каждый язык из учетом суфикса. + +Для удобства есть кнопка "Добавить стандартние параметры", она автоматом в модуле создаст основные поля такие как (titl,desc,pagetitle,description). После необходимо только привязать к шаблонам. + +#### 5. Создание вкладок. + +bLang может автоматичиски определить, на какую вкладку необходимо закинуть тв поле, на основании значения из инпута "Нзавание вкладки". +Если там записано seo.[lang] - это значит, что поле titl_en добавит на вкладку seo в секцию en. +Если записано [lang], тв поле pagetitle_en будет на вкладке en. +Если записа main, тв поле независимо от языка будет на вкладке main. + + +Если вы используете managermanager, достаточно в чанк добавить код +``` +$bLangModuleObj = new \bLang\bLangModule($modx,'',''); +$bLangModuleObj->getMMRules(); +``` + +Если используете templateedit3, и вам нужно добавить вкладки после General +```php +$bLangModuleObj = new \bLang\bLangModule($modx,$modulePath,$moduleurl); +$config = $bLangModuleObj->te3AddAfter('General',$config); +``` +Если используете templateedit3, и вам нужно просто получить список вкладок, которые bLang сгенерировал +```php +$bLangModuleObj = new \bLang\bLangModule($modx,$modulePath,$moduleurl); +$bLangModuleObj->getTE3Rules(); +``` + +#### 6. Словарь +Все надписи которые есть в шаблоне, и их нужно переводить необходимо добавлять в словарь. Он находитсяс в модуле bLang на вкладке Словарь. +В колонку название пишите ключ, по которому будете получать значение в шаблоне. +В шаблоне можна получить через +``` +[(__name)] +``` +В сниппете +```php +$modx->getConfig('__name'); +``` + +#### 7. Спец. переменные +После инициализаци bLang в $modx->config записывает кроме словаря, несколько спец. полей + +[(_lang)] - ключе текущего языка +[(_root)] - префикс урла для текущего языка +[(_suffix)] - суфикс полей для текущего языка +[(_en_url)] - урл текущей страницы для en языка + + +#### 8. Поля текущего ресурса и урл. +Если включено "Автоматичиски подставлять поля в $modx->documentObject" и "Автоматичиски подставлять префикс (_root) для урлов", то в шаблоне, +как и обычно можна писать +```php +[*pagetitle*] +[~[*id*]~] +``` \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_bLang.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_bLang.md" new file mode 100644 index 00000000..93dfc841 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_bLang.md" @@ -0,0 +1,66 @@ +## Спиппет bLang ## + +Сниппет предназначен для: +* Вывода списка языков +* Замена сниппета switch для мелких действий +* Для получения суфикса +* Обертка для DocInfo +* Замена multiParams из action = getParamsFromTree + +Режим работы сниппета определяется параметром `type`, по умолчанию там switch. + +### switch + +Вывод опредеьнного значения в зависимости от языка. +``` +[!bLang? +&en=`english` +&ru=`russian` +&ua=`ukrainian` +!] +``` + +Выводим поле с учетом суфикса +``` +[!bLang? &f=`pagetitle`!] +``` + +выводим плейсхолдер с учетом суфикса +``` +[!bLang? &pl=`title`!] +``` +Выводим настройку с учетом суфикса. +``` +[!bLang? &s=`title`!] +``` + +С учетом суфикса значить, что если суфикс для полей текущего языка _en +```[!bLang? &f=`pagetitle`!] ``` - вернет поле pagetitle_en + + +### DocInfo + +В этом режиме сниппет вызвет сниппет DocInfo и передаст эму $docid и $field, но $field с учетом суфикса. + +### list +Данный режим выведет блок из списком языков. +``` +[!bLang? &type=`list`!] +``` + +Параметры +* outerTpl - обертка блока, плейсхолдеры [+list+] [+active+] +* activeTpl - Шаблон строки из активным языком, плейсхолдеры [+url+] [+title+] +* listTpl - обертка списка языков, плейсхолдеры [+wrapper+] +* listRow - Шаблон строки языка, плейсхолдеры [+classes+] [+url+] [+title+] + +По умолчанию названия языка соответствует ключу из модуля, если нужно переопределить то, необходимо в модуле создать +под каждый язык запись. +Название в формате ```langKey_title``` + + ### getTreeParams + Возвращает строку вида ||Да==yes||Нет==no для возможных значений тв поля. + Пример: + ``` +// @EVAL return $modx->runSnippet("bLang", [ 'type'=>'getTreeParams', "parent"=>"6", 'firstEmpty'=>'1']); +``` \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/03_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217_\320\270\320\267_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260\320\274\320\270.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/03_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217_\320\270\320\267_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260\320\274\320\270.md" new file mode 100644 index 00000000..93eb5376 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/03_\320\230\320\275\321\202\320\265\320\263\321\200\320\260\321\206\320\270\321\217_\320\270\320\267_\321\201\320\275\320\270\320\277\320\277\320\265\321\202\320\260\320\274\320\270.md" @@ -0,0 +1,116 @@ +## Интеграция bLang из другими сниппетами ## + +### DocLister, DLcrums и другие сниппеты которые юзают контроллер site_content +Для DocLister достаточно просто, указать контроллер lang_content, и все поля и урл, будут подменятся в зависимости от языка. +``` +[[DocLister? &tpl=`@CODE:[+title+]` &controller=`lang_content`]] +``` +### DLMenu +``` +[[DLMenu? &controller=`lang_menu`]] +``` + +### multiTV +Создаем конфигурацию по примеру: +```php + array( + 'caption' => 'Title RU', + 'type' => 'text' + ), + 'title_en' => array( + 'caption' => 'Title EN', + 'type' => 'text' + ), + 'title_ua' => array( + 'caption' => 'Title UA', + 'type' => 'text' + ), +); +$settings['templates'] = array( + 'outerTpl' => '
    [+wrapper+]
    ', + 'rowTpl' => '

    [+title[(_suffix)]+]

    ' +); +``` +Здесь под каждый язык, мы создаем поле, а при выводе используем суффикс. + +```php + array( + 'caption' => 'Title RU', + 'type' => 'text' + ), + +); +$settings['templates'] = array( + 'outerTpl' => '
    [+wrapper+]
    ', + 'rowTpl' => '

    [+title+]

    ' +); + +$bLang = \bLang\bLang::GetInstance($this->modx); +$settings = $bLang->bLangChangeMultitvFields($settings,['title'],'#caption# (#lang#)',['templates']); +``` +В этом варианте, мы автоматичиски дублируем поля под каждый язык, и автоматичиски подменяем плейсхолдеры в шаблонах. +Первый параметр - это как раз масив настроек. +Второй масив из полями, для который нужно делать дубли. +Третий - формат назнаний. +Четвертный масив груп шаблонов, в который нужно подменять плейсхолдеры. + + +### clientSettings + +```php + 'All fields', + 'settings' => [ + 'field' => [ + 'caption' => 'Text field', + 'type' => 'text', + ], + ], +]; +$bLang = \bLang\bLang::GetInstance($modx); +return $bLang->changeClientSettingsFields($settings,['field']); + +``` +Логика как и в multitv, метод сам сделает дубли в конфигурации. +В шаблоне используем [(g_field)], значение само изменится в зависимости от языка. + +### FormLister +1. В словаре создаем запись FL_lexicon, и для каждого языка пишем названия лексикона (соответствует названию папоп /assets/snippets/FormLister/core/lang) +Для ru russian-UTF8, для en english. + +2. В вызов добавляем два параметра: + &lang=`[(__FL_lexicon)]` + &lexiconHandler=`\bLang\bLangLexiconHandler` + +3. Внутри формы получить значение записи из словаря можем +* [(__name)] +* [%name%] +* $FormLister->translate('name'); + +4. В action нужно в начале написать [(_root)], чтоб форма отправлялась на нужную языковую версию + +### eFilter + +Тут все достаточно просто, названия фильтров выносим в словарь. +И либо в кониге пишет в инпету для названия [(__name)] либо в конфиге +[(__filter_[+tv_id+])] и в словаре создаем запись filter_41, где 41 - это id tv параметра. + +Все параметры которые нужно менять, в зависимости от языка, необходимо вынести в дерево, +каждому прописать значение для каждого языка. В возможных значений такой тв прописать +``` +@EVAL return $modx->runSnippet("bLang", [ 'type'=>'getTreeParams', "parent"=>"6", 'firstEmpty'=>'1']); +``` +bLang будет возвращать в зависимости от языка значение из нужного поля. + + +### PageBuilder + +Для каждого языка создаем свой контейнер, и PageBuilder вызываем из нужным контейнером. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/04_\320\220\320\262\321\202\320\276\320\277\320\265\321\200\320\265\320\262\320\276\320\264.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/04_\320\220\320\262\321\202\320\276\320\277\320\265\321\200\320\265\320\262\320\276\320\264.md" new file mode 100644 index 00000000..9394834c --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/bLang/04_\320\220\320\262\321\202\320\276\320\277\320\265\321\200\320\265\320\262\320\276\320\264.md" @@ -0,0 +1,3 @@ +## Интеграция bLang из другими сниппетами ## + +bLang умеет переводить значения в словаре, поля документа, clientSettings, multiTV и PageBuilder. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilter.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilter.md" index ac1c02b3..f69c2812 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilter.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/01_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilter.md" @@ -1,10 +1,10 @@ -## Параметри +## Параметры ### js Подключение js скриптов фильтра. Значения 0/1. По умолчанию 1. ### css Подключение css стилей фильтра. Значения 0/1. По умолчанию 1. -### sliderCssJs +### sliderCssJs Подключение js скриптов и css стилей слайдер (цена). Значения 0/1. По умолчанию 1. ### ajax Использовать фильтрацию без перезагрузки страницы. Значения 0/1. По умолчанию 0; @@ -12,7 +12,7 @@ Автосабмит формы при изменении ее параметров ### filters -Параметр для фильтация отбора товаров. Формат DoCLister/ +Параметр для фильтация отбора товаров. Формат DoсLister/ # tv_config JSON масив из конфигурацией формы фильтрации. По умолчанию поле tovarparams ресурса текущего или его родителей. @@ -26,7 +26,7 @@ JSON масив из конфигурацией формы фильтрации. форма вывода фильтра - вставить плейсхолдер в нужное место шаблона ### eFilter_form_delete форма удаленые установленных фильтров -### docid +### docid Ид Категории для получения товаров. По умолчанию id текущего документа. ### cfg Название файла с конфигурацие html шаблона елементов формы фильтрации. По умолчанию default. @@ -36,24 +36,24 @@ JSON масив из конфигурацией формы фильтрации. Название файла с конфигурацие html шаблона елементов формы для удаление выбраних параметров фильтрации. По умолчанию default. Имя файла должно быть в формате config.delete.название_конфигурации.php -### remove_disabled +### removeDisabled Скрывать неактивные варианты параметров из формы. Значения 1/0. По умолчанию 0. -### nosort_tv_id +### nosortTvId Список тв параметров варианты которых не нужно сортировать. ## Конфигурация шаблона формы -Шаблоны хранятся в файле с расширением php в переменнын. -Основние плейсхолдеры: +Шаблоны хранятся в файле с расширением php в переменных. +Основные плейсхолдеры: ### Для обертки формы: * [+url+] - удрес страницы * [+wrapper+] - елементы формы. Для работы ajax у формы должен быть id eFiltr - + ### Для обертки параметра: - * [+tv_id+] id тв параметра + * [+tv_id+] id тв параметра * [+name+] Название тв параметра * [+wrapper+] список вариантов. @@ -64,7 +64,7 @@ JSON масив из конфигурацией формы фильтрации. * [+selected+] - если выбран вариант параметра вернет checked или selected. * [+disabled+] - если выбрать нельзя вернет disabled * [+count+] - доступное количество товаров из вариантом параметра. - + ### Для елементов формы диапазон или слайдер: * [+tv_id+] - id тв параметра. * [+name+] если используем checkbox, radio или dropDown List Menu вернет текстовое значение варианта параметра. @@ -76,20 +76,20 @@ JSON масив из конфигурацией формы фильтрации. * [+maxval+] - Максимальное значение выбраное пользователем * [+minvalcurr+] - Минимальное значение * [+maxvalcurr+] - Максимальное значение - -Если нужно для определьонного тв параметра указать свой шаблон необходимо создать переменную в фомате -ТипШабнона_ИмяПеременной. -Пример тв параметр frameSize, обертка tplRowCheckbox_frameSize и ссылка tplOuterCheckbox_frameSize. + +Если нужно для определьонного тв параметра указать свой шаблон необходимо создать переменную в фомате +ТипШабнона_ИмяПеременной. +Пример тв параметр frameSize, обертка tplRowCheckbox_frameSize и ссылка tplOuterCheckbox_frameSize. ## Конфигурация шаблона формы сброса фильтров ### tplDeleteFilterForm -Обертка формы. -Плейсхолдеры: - * [+wrapper+] -### tplSliderOwner -Обертка блока для сброса вариантов фильтрации для диапазона или слайдера. +Обертка формы. +Плейсхолдеры: +* [+wrapper+] +### tplSliderOwner +Обертка блока для сброса вариантов фильтрации для диапазона или слайдера. Плейсхолдеры: * [+wrapper+] * [+delete_group+] - ссылка для сброса всех вариантов фильрации тв параметра @@ -114,10 +114,10 @@ JSON масив из конфигурацией формы фильтрации. Если нужно для определьонного тв параметра указать свой шаблон необходимо создать переменную в фомате -ТипШабнона_ИмяПеременной. +ТипШабнона_ИмяПеременной. Пример тв параметр frameSize, обертка tplDeleteFilterOwner_frameSize и ссылка tplDeleteFilterInner_frameSize. Для работы ajax при сбросе фильтров необходимо: -* Для общей обертки формы сброса задать клас .fltr_delete_wrap -* Для всех ссылок сброса задать клас .fltr_delete_item_link \ No newline at end of file +* Для общей обертки формы сброса задать класс .fltr_delete_wrap +* Для всех ссылок сброса задать класс .fltr_delete_item_link diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilterResult.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilterResult.md" index 17da8384..9443799c 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilterResult.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/02_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_eFilterResult.md" @@ -1,43 +1,45 @@ ## eFilterResult - Снипеет является оберткой Doclister. Если нет выбраных тв параметров ведет себя как обычный doclister - и получает товары в режыме idType = parents, если форма фильтрации не пустая то в режыме documents получая плейсхолдер - из списокм ids от eFilter - + Снипет является оберткой Doclister. Если нет выбранных тв параметров ведет себя как обычный DocLister + и получает товары в режыме idType = parents, если форма фильтрации не пустая то в режиме documents получает плейсхолдер + из списка ids от eFilter + ## Параметры ### lang - Язык необходимо для склонения. по умолчанию ru. - - ### pid - аналог parents - - Для работы ajax необходима следующая структура обертки + Язык необходимо для склонения. По умолчанию ru. + + ### pid + аналог parents + + Для работы ajax необходима следующая структура обертки: ````
    [+dl.wrap+][+pages+]
    ```` - - Если для eFilter задан параметр ajax = 1 то стандартная пагинация переопределяеться - TplNextP ``>`` - TplPrevP ``<`` - TplPage ``[+num+]`` - - Можна задать свои шаблоны главное вместо href использовать data-page="[+num+]" - и если задан параметр id для eFilterResult в data-prefix необходимо записать id + '_' - - Обертка пагинации должна иметь клас .pagination - + + Если для eFilter задан параметр ajax = 1 то стандартная пагинация переопределяется. + Обертка пагинации должна иметь класс .pagination! + ``` +&TplNextP = `@CODE: >` +&TplPrevP = `@CODE: <` +&TplPage = `@CODE: [+num+]` +&TplWrapPaginate=`@CODE:
    [+wrap+]
    ` +``` + Можно задать свои шаблоны, главное вместо href использовать data-page="[+num+]" + и если задан параметр id для eFilterResult в data-prefix необходимо записать id + '_' + + ### Склонение слова Товар к количеству [+параметр_id.pluarl+] Склонение слова Товар к количеству Для переопределения склоняемого слова необходимо прописать параметры. phrase1 Товар phrase2 Товара phrase3 Товаров - - + + ### Подгрузка товаров через ajax - Пример html шаблона для блока показать ищо + Пример html шаблона для блока "Показать ещё"" ``` [!if? &is=`[+параметр_id.isstop+]:!=:1` &then=`
    @@ -45,15 +47,14 @@
    `]] ``` - eFilter_more_wrap Клас для обертки - eFilter_more Клас для ссылки + eFilter_more_wrap Класс для обертки + eFilter_more Класс для ссылки Если id для eFilter не задан data-prefix пустой - При использование Показать еще в блоке из класом eFiltr_results должны быть только товары - + При использовании "Показать еще" в блоке из классом eFiltr_results должны быть только товары + ### Количество товаров и склонение - Для замены количество товаров на странице и склоняемого слова товар нужно задать класы - - filter_display количество товаров - filter_plural склоняемое слово + Для замены количество товаров на странице и склоняемого слова товар нужно задать класы + + filter_display количество товаров + filter_plural склоняемое слово ```[+параметр_id.pages_next+]``` номер следующей страницы - \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/03_js_api.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/03_js_api.md" index 5714c847..7fa628d4 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/03_js_api.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/03_js_api.md" @@ -1,11 +1,29 @@ -## calback +## Calback-функции JS при работе `eFilter` + +Функции находятся в глобальной области видимости. +Например, вывод сообщения о завершении работы фильтра может в шаблоне сайта выглядеть так: +``` + +``` ### afterFilterSend(msg) +... ### afterFilterComplete(_form) -beforeFilterSend(_form) +Срабатыает по завершению работы `eFilter` и обновлению результатов. +Можно использовать данное событие для стилизации элементов формы или результатов. + +### beforeFilterSend(_form) +... + +## Важно! для работы `ajax` +Для работы `ajax` форма и блок товаров не должны быть в самом корне документа, то есть непосредственно в ``. +Нельзя:`[!eFilter!][+eFilter_form+][!eFilteResult!]` -## Внимание -Для работы ajax форма и блок товаров не должны быть в самом корне документа тоесть body. +Можно: `
    [!eFilter!][+eFilter_form+][!eFilteResult!]
    ` diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_evoSortBlock.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_evoSortBlock.md" index 2e0bb49b..653434a6 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_evoSortBlock.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202_evoSortBlock.md" @@ -2,47 +2,47 @@ ## evoSortBlock Сниппет для формирования блока сортировки. Из приятных вещей. - + ## Параметры -1. displayConfig настройка селекта или ссылок для указания количества товаров на странице. -Пример: 20||30||40||все==all. -2. sortConfig настройка ссылок для указания поля по которому товары сортируються. +1. displayConfig настройка сэлекта или ссылок для указания количества товаров на странице. +Пример: 20||30||40||все==all. +2. sortConfig настройка ссылок для указания поля по которому товары сортируються. Пример: По название==pagetitle||По индексу==menuindex||Цена от маленькой==price:asc||Цена от большой==price:desc 3. ajax - использовать ли ajax по умолчанию ноль. -4. changeSortByClickField - изменять направление сортировки при повторном клике по параметру сортировки. 1/0. По умолчанию 0. +4. changeSortByClickField - изменять направление сортировки при повторном клике по параметру сортировки. 1/0. По умолчанию 0. Параметр необходим если у нас нет блока для выбора направление, а надо изменять направление при клике второй раз по параметру поля. ### Шаблоны #### Обертка -1. ownerTpl - Основная обертка блока. - Плейсхолдеры ```[+class+] [+display.block+] [+sort.block+] [+sort.direction+]```. +1. ownerTpl - Основная обертка блока. + Плейсхолдеры ```[+class+] [+display.block+] [+sort.block+] [+sort.direction+]```. Пример: ```
    [+display.block+][+sort.block+]
    ``` - - * class Плейсхолдер из класами для обертки которые необходимы для работы js, а именно sort-wrap и ajax + + * class Плейсхолдер из класcами для обертки которые необходимы для работы js, а именно sort-wrap и ajax * display.block блок выбора количества товаров * sort.block Блок выбора поля для сортировки * sort.direction Блок выбора направления сортировки #### Выбор количества товаров -1. displayOwnerTpl - обертка блока для выбора количества елементов на странице. - Плейсхолдеры: ```[+class+]">[+wrapper+]``` - Пример: `````` +1. displayOwnerTpl - обертка блока для выбора количества элементов на странице. + Плейсхолдеры: ```[+class+]">[+wrapper+]``` + Пример: `````` Пример: ```
    [+wrapper+]
    ``` - -2. displayRowTpl - Шаблон вывода строки. ( option для селекта или тег a для блока). - Плейсхолдеры: ```[+value+],[+selected+],[+data+],[+class+],[+caption+] ``` - Пример: ``` ``` - Пример: ``` [+caption+] ``` -#### Выбор поля для сортировки -1. sortOwnerTpl - обертка блока для выбора поля по которому елементы сортируються на странице. - Плейсхолдеры: ```[+wrapper+]``` - Пример: `````` - + +2. displayRowTpl - Шаблон вывода строки. ( option для сэлекта или тег a для блока). + Плейсхолдеры: ```[+value+],[+selected+],[+data+],[+class+],[+caption+] ``` + Пример: ``` ``` + Пример: ``` [+caption+] ``` +#### Выбор поля для сортировки +1. sortOwnerTpl - обертка блока для выбора поля по которому элементы сортируются на странице. + Плейсхолдеры: ```[+wrapper+]``` + Пример: `````` + 2. sortRowTpl - Шаблон вывода ссылки для выбора поля. - Плейсхолдеры: ```[+class+],[+data+] [+caption+]``` - Пример: ```[+caption+]``` - + Плейсхолдеры: ```[+class+],[+data+] [+caption+]``` + Пример: ```[+caption+]``` + #### Выбор направления сортировки 1. sortDirectionTpl - обертка блока выбора направления. Плейсхолдеры: ```[+up+][+down+]``` @@ -56,21 +56,21 @@ Плейсхолдеры: ```[+class+][+data+]``` class - css клас data - Дата атрибут data-value в котором хранится текущее поле а направление сортировки asc. Пример price:desc - - -##### Классы -1. displayActiveClass - Клас для активного пунка в выборе количеста елементов на странице. По умолчанию active. -2. sortActiveClass - Клас для активного пунка в выборе поля для сортировки елементов на странице. + + +##### Классы +1. displayActiveClass - Класс для активного пунка в выборе количества элементов на странице. По умолчанию active. +2. sortActiveClass - Класс для активного пункта в выборе поля для сортировки элементов на странице. 3. sortUpClass - Класс для ссылки выбора поля когда сортировка от маленького к большому. По умолчанию up 4. sortDownClass - Класс для ссылки выбора поля когда сортировка от большого к маленькому. По умолчанию down 5. sortFieldClass - Класс для ссылок выбора поля и направления сортировки. По умолчанию set-sort-field. -6. sortDirectionActiveClass - Клас для активной ссылки выбраного направления сортировки. По умолчанию active. +6. sortDirectionActiveClass - Класс для активной ссылки выбранного направления сортировки. По умолчанию active. -##### Значения по умолчаеию -1. displayDefault - количество елементов на странице по умолчанию +##### Значения по умолчанию +1. displayDefault - количество элементов на странице по умолчанию 2. sortFieldDefault - поле сортировки по умолчанию -3. sortOrderDefault - направление сортировки по умолчанию +3. sortOrderDefault - напрвление сортировки по умолчанию ## Устанавливаемые плейсхолдеры для работы без eFilterResult @@ -90,14 +90,14 @@ ## Логика работы js. ### Для выбора количества товаров. -Обрабатывается клик по елементу из класом set-display-field. -Если это тег a ( ссылка ) и событие click то информация про количество берется из дата атрибута. -Если это событие change информация берется из атрибута value елмента option. +Обрабатывается клик по элементу из класом set-display-field. +Если это тег a ( ссылка ) и событие click, то информация про количество берётся из дата атрибута. +Если это событие change информация берется из атрибута value элемента option. Дале ajax запрос из параметром sortDisplay и значением. -Если ajax отклчен то обновление страницы. +Если ajax отключен, то обновление страницы. ### Для выбора поля и направления сортировки. -Обрабатывается клик по елементу из класом set-sort-field. +Обрабатывается клик по элементу из класом set-sort-field. Если это тег a ( ссылка ) и событие click то информация про поле и направление берется из дата атрибута. Если это событие change информация берется из атрибута value елмента option. Дале ajax запрос из параметром sortBy и значением. @@ -116,5 +116,5 @@ &sortConfig=`Название==pagetitle||Дата поступления==menuindex||Цена==price` &ajax=`1` !] - - + + diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/06_\320\234\320\276\320\264\321\203\320\273\321\214_eLists.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/06_\320\234\320\276\320\264\321\203\320\273\321\214_eLists.md" new file mode 100644 index 00000000..333789a6 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/06_\320\234\320\276\320\264\321\203\320\273\321\214_eLists.md" @@ -0,0 +1,21 @@ +Для удобного формирования списков значений ТВ (чтобы не захламлять дерево и визуально понятно их редактировать) + +##Параметры модуля: + +1. ID TV параметров товара (tovarparams) - Укажите здесь идентификатор TV с именем tovarparams, который создался при установке eFilter; +2. ID шаблонов товара - Укажите идентификаторый шаблонов товара; +3. ID категории параметров - Здесь нужно указать идентификатор именно категории TV-параметров, а не какого-либо отдельного TV. Например, вы можете создать категорию "Для фильтра" и помещать туда все параметры, которые будут участвовать в фильтрации. После создания категории ID можно посмотреть на странице просмотров TV. Он будет указан в скобках у нужной категории. +4. ID категории общих параметров - то же самое, что и "ID категории параметров", только TV относящиеся к этой категории будут прикрепляться к любому товару. Это может быть параметр, который есть у всех видов товаров, например "Цена" или страна происхождения. +5. Не включать ТВ в параметры при выводе - Идентификаторы TV указаннае в этом пункте не будут выводится сниппетом tovarparams; +6. Имя чанка вывода товара - Чанк который будет использован при выводе сниппетом eFilterResult. Если при вызове указан параметр tovarChunkName, то игнорируется; +7. Папка паттернов - Папка в катором храняться паттерны для визуального представления в вариантах фильтра. По умолчанию assets/images/pattern/ +8. ID TV, используемого для связки товар-категории через tagSaver + +##Использование: +Для создания нового фильтра проделайте следующее: +1. Создайте новый TV параметр, дайте ему имя и выбирете тип ввода; +2. Откройте модуль eLists и в строке "Новый параметр" напишите имя параметра (Для простоты используйте тоже самое имя, что и у созданного TV). Нажмите "Добавить параметр"; +3. В таблице "Список параметров" нажмите "Список значений"; +4. В появившийся таблице "Список значений параметра" в поле "Добавление нового значения" можно добавлять необходимые значения фильтра; +5. Нажмите на кнопку "Обновить" или "К списку параметров"; +6. В таблице "Список параметров" в колонке "Описание (вставить в поле "возможные значения" нужного TV)" появится строка (напр. @EVAL return $modx->runSnippet("multiParams", array("parent"=>"1"))), которую необходимо скопировать и вставить в созданный в первом пункте TV-параметр. \ No newline at end of file diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/index.md" index d2db0a57..c285f4f5 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eFilter/index.md" @@ -1,16 +1,18 @@ Автор: [webber12](https://github.com/webber12) Пакет для генерации фильтра и блока сортировки товаров - + Пакет состоит из компонентов: +* eLists (модуль) - Для удобного формирования списков значений ТВ (чтобы не захламлять дерево и визуально понятно их редактировать) * eFilter (сниппет) - вывод формы для фитрация * eFilterResult (сниппет) - вывод списка товаров (упаковка для DocLister) * evoSortBlock (сниппет) - вывод блока с формой сортировки, а также выбора количества товаров на странице * eFilter (модуль) - удобная настройка формы для фильтрации + ## Установка После установки необходимо: -1. зайти в настройки модуля eList и настроить следующие параметры: +1. зайти в настройки модуля eLists и настроить следующие параметры: * ID шаблонов товара * ID категории параметров * Список шаблонов категорий @@ -29,13 +31,13 @@ ### Пример 1. -Если нужно вывести форму фильтра на главной а товары находятся в каталоге: +Если нужно вывести форму фильтра на главной а товары находятся в каталоге: ```[!eFilter? &docid=`32`!]``` //32 id каталога ### Пример 2. -Если для главной нужно задать свою конфигурацию необходимо создать в модуле eFilter конфигурацию, а затем добавить +Если для главной нужно задать свою конфигурацию необходимо создать в модуле eFilter конфигурацию, а затем добавить параметр tv_config ```` -[!eFilter? +[!eFilter? &docid=`32` &tv_config=`[*tovarparams*]` !] diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eForm/09_recaptcha.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eForm/09_recaptcha.md" index 0e56108b..eb5cd98d 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eForm/09_recaptcha.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/eForm/09_recaptcha.md" @@ -43,7 +43,7 @@ if(isset($_REQUEST['g-recaptcha-response'])){ if(!function_exists('setReCaptcha')){ function setReCaptcha(&$fields){ - $fields['ReCaptcha']= '
    '; + $fields['ReCaptcha']= '<div class="g-recaptcha" data-sitekey="'.siteKey.'"></div>'; return true; } } @@ -64,4 +64,4 @@ if(!function_exists('verifyReCaptcha')){ &vericode=`1` &eFormOnBeforeFormMerge=`setReCaptcha` &eFormOnValidate=`verifyReCaptcha` - \ No newline at end of file + diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/editDocs/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/editDocs/index.md" new file mode 100644 index 00000000..93dde606 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/editDocs/index.md" @@ -0,0 +1,10 @@ + + +

    модуль editDocs

    +Данный модуль предназначен для:
    +- быстрого редактирования основных полей документа (pagetitle, longtitle и тд.) и своих TV
    +- импорта данных из таблицы Excel (Calc) или csv
    +- экспорта данных по основным полям и ТВ в .xlsx и csv
    +- массового переноса документов от одного родителя (папки) к другому
    +
    + Ссылка на полную документацию diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/evoSearch/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/evoSearch/index.md" new file mode 100644 index 00000000..9b2b97e2 --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/evoSearch/index.md" @@ -0,0 +1,127 @@ +### Установка +Самый просто способ установки - использовать модуль `Extras` в админке. + +### Необходимые компоненты для работы: +* `DocLister` + +## Важно + * До первого запуска сниппета на фронтэнде сайта необходимо провести индексацию. + * Cоздание необходимых полей `content_with_tv` и `content_with_tv_index`, а также нужных индексов производится **автоматически** при первом запуске индексации. + +## Первый запуск и переиндексация + +1. При первом запуске или переиндексации выставить параметры в плагине: +* Переиндексировать все = 1 +* Первая строка переиндексации = 0 * +* Строк за сеанс индексировать = 10 000 * +2. открыть и пересохранить любой документ - необходимо для вызова события `onDocFormSave`. +3. Установить *Переиндексировать все = 0*, *Строк за сеанс индексировать = 1* + +\* Первая строка и количество строк за сеанс устанавливать в зависимости от возможностей хостинга. +Например, **первая строка 0** и **строк за сеанс 10 000** проиндексирует в БД строки с 0 в количестве 10 000 штук. + + +### Пример вызова + +Вывод результатов +[!evoSearch? &tpl=`evoSearch`!] + +Чанк `evoSearch` создается при установке дополнения. + +### Расширенный пример + +Форма +``` +
    +``` + +Обработка результатов на странице id=2 + +``` + [!evoSearch? + &display=`16` + &paginate=`pages` + &statTpl= `
    По запросу [+stat_request+] найдено [+stat_total+] документов.
    ` + &noResult=`
    По запросу [+stat_request+] ничего не найдено. Смягчите условия поиска
    ` + &ownerTPL=`@CODE:
    [+dl.wrap+]
    ` + &tpl=`@CODE: +
    + [+title+] +
    [+extract+]
    +
    + ` + &TplNextP=`` &TplPrevP=`` &TplPage=`@CODE:
  • [+num+]
  • ` &TplCurrentPage=`@CODE:
  • [+num+]
  • `&TplWrapPaginate=`@CODE: ` + !] + [+pages+] + +``` + + +### Состав пакета: +- **плагин `evoSearch`** - используется для индексирования результатов поиска. Индексируются поля `pagetitle`, `longtitle` ,`description`, `introtext`, `content` и указанные `TV-параметры`. Требуемые `TV` указываются в конфигруации плагина через админку в поле **Имена TV для поиска** через запятую. При использовании для построения списка возможных значений `TV` сниппета `multiParams` (из комплекта `eFilter`) индексируются не `id` ресурсов, а их заголовки. +- **сниппет `evoSearch`** - используется для вывода результатов поиска. Может работать в двух режимах: использовать для вывода результатов `DocLister` или возвращать список `id` ресурсов (режим выбирается параметром `&action='ids'`). В последнем случае генерируется и возвращается список `id` ресурсов, подходящих под условия поиска. Эти данные могут использоваться в любом другом сниппете через плейсхолдер `evoSearchIDs`, который содержим массив `id` из результатов поиска. + + +### ПАРАМЕТРЫ ПЛАГИНА + +Для плагина требуется событие `onDocFormSave`. + +Параметры: +* `&offset=Первая строка переиндексации;text;0` +* `&rowsperonce=Строк за сеанс индексировать;text;1` +* `&reindex=Переиндексировать все;text;0` +* `&excludeTmpls=Исключить шаблоны;text;` +* `&excludeIDs=Исключить ID ресурсов;text;` +* `&TvNames=Имена TV для поиска;text;` +* `&unpublished=Индексировать неопубликованные;text;0` +* `&deleted=Индексировать удаленные;text;0` +* `&dicts=Использовать словари;text;rus,eng` + + + + +### ПАРАМЕТРЫ СНИППЕТА +Сниппет `evoSearch`является оберткой для `DocLister`, поэтому то он принимает все параметры `DocLister`. + + **&action = ids** - возвращает список найденных `ids`, которые можно подставить в другой сниппет. По-умолчанию - отрабатывает полностью с выводом результатов + + **&noResult** - шаблон строки, которая выводится при отсутствии результата поиска. Значение по-умолчанию: + ``` + &noResult = "По запросу [+stat_request+] ничего не найдено. Смягчите условия поиска") + ``` + + **&extract** - отключить экстрактор. Формирует нужную часть текста с подсветкой из результатов поиска. Плейсхолдер `[+extract+]` в чанке вывода результатов `DocLister`. Значение по-умолчанию: + ``` + &extract = 1 + ``` + + **&maxlength** - максимальная длина извлекаемой части текста в результатах поиска. Значение по-умолчанию: + ``` + &maxlength = 350 + ``` + + **&show_stat** - показ статистики. Значение по-умолчанию: + ``` + &show_stat = 1 + ``` + + **&statTpl** - шаблон показа статистики. Значение по-умолчанию: + ```html +
    По запросу [+stat_request+] найдено всего [+stat_total+]. Показано [+stat_display+], c [+stat_from+] по [+stat_to+]
    +``` +где +* `[+stat_request+]` - запрос из строки `$_GET['search']` +* `[+stat_total+]` - количество найденных документов +* `[+stat_display+]` - показано на текущей странице с `[+stat_from+]` по `[+stat_to+]` + + + **&rel** - релевантность поиска.по умолчанию 0.01, Чем выше цифра - тем более релевантные результаты и тем их меньше. Значение по-умолчанию: + ``` + &rel = 0.01 + ``` + + **&search_field** - поле `$_GET` для запроса. По-умолчанию запрос ищется в `$_GET['search']`. + + **&minlength** - минимальная длина слова, которое будет участвовать в полнотекстовом поиске. Значение по-умолчанию: + ``` + &minlength = 2 + ``` + +подсветка найденных слов в pagetitle и extract в результатах поиска осуществляется тегом - т.е. возможна ее стилизация через css-файлы + +### Дополнительная информация. +* Подсветка найденных слов в `pagetitle` и `extract` в результатах поиска осуществляется тегом ``. Возможна ее стилизация через css-файлы. +* Т.к. при полнотекстовом поиске *MySQL* без дополнительных настроект обрабатываются только слова не короче 4 символов. Для улучшения результатов поиска используется дополнительный поиск средствами фильтров `DocLister`, что улучшает результаты. Особенно при их отстутствии в результате обычного поиска. +* Совместим с `DocLister` версии **1.4.1 и ниже, 1.4.8 и выше**. +* В версиях **1.4.5, 1.4.6, 1.4.7** встречается некорректный сброс строки `$_GET`, из-за чего некорректно срабатывает обработка пустых результатов. diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\321\213.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/if/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/if/index.md" index 86776483..b82b30c3 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/if/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/if/index.md" @@ -65,6 +65,10 @@ **not_in, !in** - отсутствие в массиве +**contains** - наличие в строке + +**not_contains, !contains** - отсутствие в строке + *** ### Выполнение математических функций: diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/imageCaptor/index.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/imageCaptor/index.md" index e26c6da0..441db3e9 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/imageCaptor/index.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/imageCaptor/index.md" @@ -3,7 +3,7 @@

    Плагин для Modx Evo который копирует фотографии со сторонних сайтов

    Небольшой плагин для Modx Evo который позволяет автоматически при сохранении ресурса копировать фотографии со сторонних сайтов.

    Каждому веб-мастеру приходилось когда-либо забирать контент с чужих сайтов обычным копипастом. И если с текстом проблем нет, то, вот, когда там присутствуют фотографии приходится тратить наше бесценное время на ненужные действия. Сначала мы по каждой фотографии кликаем правой кнопочкой, сохраняем в отдельную папочку картинку, потом заливаем на сервер, а потом для каждой картинки прописываем новый путь. Это может и не так сложно если мы копируем 1-2 фотографии. А если мы имеем дело с сотней страниц где на каждой по десяток фотографий? Можно конечно не заморачиваться, и оставить ссылки на сторонние сайты, но это уж совсем дурной тон.

    -

    Алексей Либер написал небольшой плагин для Modx Evo который позволяет автоматически при сохранении ресурса копировать фотографии со сторонних сайтов к себе на сервер и соответственно перезаписывать к нм пути.

    +

    Алексей Либер написал небольшой плагин для Modx Evo который позволяет автоматически при сохранении ресурса копировать фотографии со сторонних сайтов к себе на сервер и соответственно перезаписывать к ним пути.

    Создаем плагин с названием например: imageCaptor.

    Системные события: OnDocFormSave

    @@ -92,4 +92,4 @@ $content = captor($content,$folder);
     foreach($tmplvars as $key => $val){
     	if ($val[1]) $tmplvars[$key][1] = captor($val[1],$folder);
     }
    -
    \ No newline at end of file + diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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" index 8f035472..637a522a 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/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" @@ -1,8 +1,6 @@

    multiTV: Переменная шаблона

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

    Все параметры задаются в конфигурационном файле в папке configs с тем же именем, как и переменная шаблона в виде PHP-массива .config.inc.php или JSON файла .config.json (файл JSON имеет приоритет перед PHP-массивом).

    Параметр display

    Отображение полей ввода настраивается с помощью параметра display

    @@ -29,7 +27,7 @@ type -Тип поля ввода (используются все типы ввода MODX кроме url и richtext, добавлен thumb для отображения эскизов изображений) +Тип поля ввода (используются все типы ввода MODX кроме url, добавлен thumb для отображения эскизов изображений) text @@ -55,7 +53,7 @@ -

    Поддерживаемые типы полей: text, rawtext, email, number, textareamini, textarea, rawtextarea, htmlarea, date, dropdown, listbox, listbox-multiple, checkbox, option, image, file

    +

    Поддерживаемые типы полей: text, rawtext, email, number, textareamini, textarea, rawtextarea, htmlarea, richtext(срабатывает только при display vertical), date, dropdown, listbox, listbox-multiple, checkbox, option, image, file, color

    Параметр columns

    В режимах datatable и dbtable могут быть определены в качестве ключа параметры columns. Этот ключ содержит массив параметров столбцов. Каждый столбец содержит массив свойств. Если свойство не задано, в качестве ключа используется fields.

    @@ -187,7 +185,17 @@ Скрыть заголовок в datatable или dbtable режиме. , + +prepare +Функция для обработки данных перед выводом (вызывается для каждого элемента списка) +- + + +prepareWrap +Функция для обработки данных перед выводом обертки +- +
    -

    Смотрите файл конфигурации для TV-параметра multidemo для всех используемых вертикальных настроек и multicontent для всех используемых datatable настроек.

    \ No newline at end of file +

    Смотрите файл конфигурации для TV-параметра multidemo для всех используемых вертикальных настроек и multicontent для всех используемых datatable настроек.

    diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md" index c04c38ef..724834fc 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/04_\320\241\320\275\320\270\320\277\320\277\320\265\321\202.md" @@ -28,6 +28,8 @@ &oddClass=`` &paginate=`0` &offsetKey=`page` +&prepare=`` +&prepareWrap=`` !]

    Параметры

    По умолчанию шаблоны для внешнего блока и строки могут быть определены в файле конфигурации. Эти шаблоны могут быть перезаписаны параметрами rowTpl и outerTpl в вызове сниппета.

    @@ -60,6 +62,20 @@ + + + +

    @@ -359,7 +375,7 @@ -
    +
    Формат: &where=``
    Значение по умолчанию:
    @@ -370,9 +386,39 @@
    +
    + +
    +
    +Формат: &prepare=``
    +Значение по умолчанию:
    +Примечание:
    +Пример: +
    &prepare=`prepareRow,prepareRowAgain`
    +
    +
    +
    + +
    + +
    +
    +Формат: &prepareWrap=``
    +Значение по умолчанию:
    +Примечание:
    +Пример: +
    &prepareWrap=`prepareRow,prepareRowAgain`
    +
    +
    +
    +
    -

    Плейсхолдеры rowTpl

    +

    Плейсхолдеры rowTpl

    diff --git "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" index 6d8845ea..e326f959 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" @@ -44,7 +44,7 @@
    -

    Поля

    +

    Поля

    Поля таблицы базы данных могут быть определены в ключе fields. Этот ключ содержит массив fieldnames и каждый fieldname содержит массив свойств поля.

    @@ -111,7 +111,7 @@ - + @@ -138,7 +138,7 @@
    renderEnable rengering of the column content with this PHx capable stringRender содержимого столбца с поддержкой PHx -
    -

    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.

    +

    Каждый параметр вкладки формы содержит ассоциативный массив свойств поля (ключ содержит имя поля в fields ). Если свойство поля не установлено, используется свойство поля в fields .

    @@ -241,19 +241,19 @@ - + - + - +
    radioTabsTabs 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).Вкладки в виде radio buttons. Состояние кнопки сохраняется в столбце fieldTab каждой строки таблицы (этот столбец должен существовать). false
    sortingEnable sorting by column header.Сортировка по колонкам таблицы false
    sortindexColumn 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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/07_\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260_\320\264\320\260\320\275\320\275\321\213\321\205_\320\277\320\265\321\200\320\265\320\264_\320\262\321\213\320\262\320\276\320\264\320\276\320\274.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/07_\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260_\320\264\320\260\320\275\320\275\321\213\321\205_\320\277\320\265\321\200\320\265\320\264_\320\262\321\213\320\262\320\276\320\264\320\276\320\274.md" new file mode 100644 index 00000000..c634edcf --- /dev/null +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/multiTV/07_\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260_\320\264\320\260\320\275\320\275\321\213\321\205_\320\277\320\265\321\200\320\265\320\264_\320\262\321\213\320\262\320\276\320\264\320\276\320\274.md" @@ -0,0 +1,88 @@ +Часто возникает необходимость дополнительной обработки данных перед выводом. Для этого доступны prepare и prepareWrap - как настройки в файле конфигурации либо как параметры сниппета. + +В качестве значения можно указать имя сниппета, имя функции (в файле конфигурации также доступна возможность указать функцию-замыкание), либо их список, разделенный запятыми, либо их массив. + +Параметры функции/сниппета следующие: + + + + + + +
    ПараметрОписание
    $dataТекущие значения
    $modxЭкземпляр класса DocumentParser
    $_multiTVЭкземпляр класса multiTV, для работы с методами хранилища
    + +Функция/сниппет всегда должны возвращать значения, даже если они не менялись. + +Примеры: + +```php +// в файле конфигурации: +function prepareRowsFunction($data, $modx, $_multiTV) { + return $data; +} + +$settings['prepare'] = 'prepareRowsSnippet'; +// или +$settings['prepare'] = function($data, $modx, $_multiTV) { + return $data; +}; +// или +$settings['prepare'] = 'prepareRowsSnippet,prepareRowsFunction'; +// или +$settings['prepare'] = ['prepareRowsSnippet', 'prepareRowsFunction']; +// или +$settings['prepare'] = ['prepareRowsSnippet', function($data, $modx, $_multiTV) { + return $data; +}]; +``` + +``` +// в шаблоне +[[multiTV? &tvName=`test` &prepare=`prepareRowsSnippet,prepareRowsFunction`]] +``` + +Значения параметра `$data` функции prepare, помимо значений полей, указанных в конигурации переменной, будут следующими: + + + + + +
    КлючОписание
    docidИдентификатор текущего документа
    iterationНомер текущей итерации (начинается с 1)
    rowrow.number: Номер текущей итерации (начинается с 1) + +row.total: Общее количество элементов
    + +Значения параметра `$data` для prepareWrap: + + + + + +
    КлючОписание
    docidИдентификатор текущего документа
    wrapperМассив выведенных элементов
    rowsrows.offset: Количество пропущенных элементов + +rows.total: Общее количество элементов
    + +Примеры: + +```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/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" index 86df7e8b..8fbab55c 100644 --- "a/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" +++ "b/ru/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213.md" @@ -1,4 +1,5 @@ +

    phpthumb: Параметры

    Параметры сниппета phpthumb. @@ -33,4 +34,54 @@
    - \ No newline at end of file + + +
    + +
    +
    +Формат: путь к изображению
    +Значение по умолчанию: assets/snippets/phpthumb/noimage.png
    +Примечание: Можно данную опцию прописать в настройках сниппета, чтобы не указывать данный параметр во всех вызовах сниппета.
    Для этого достаточно добавить следующий код во вкладке «СВОЙСТВА» сниппета phpthumb и нажать кнопку «Обновить параметры»:
    +
    +{
    +	"noImage": [
    +		{
    +			"label": "noImage",
    +			"type": "text",
    +			"value": "assets/templates/my_template/images/noimage.png",
    +			"default": "assets/templates/my_template/images/noimage.png",
    +			"desc": "Подставляемое изображение если запрашиваемое не существует"
    +		}
    +	]
    +}
    +
    +assets/templates/my_template/images/noimage.png - изображение должно быть по данному пути! +Пример: +
    &noImage=`assets/templates/my_template/images/noimage.png`
    +
    +
    +
    + + +
    + +
    +
    + Формат: 0|1
    + Значение по умолчанию: 0
    + Примечание: необходима Evolution CMS 1.4.9+ или
    + Пример: +
    &webp=`1`
    +
    +
    +
    + + + diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_Evolution_CMS.md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_Evolution_CMS.md" new file mode 100644 index 00000000..9b715bb1 --- /dev/null +++ "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_Evolution_CMS.md" @@ -0,0 +1,28 @@ +Для обновления системы Evolution CMS вам потребуется выполнить практически те же шаги, что и в руководстве по установке, с одним исключением: вы не должны удалять или перезаписывать файл config.inc.php. + + +Для обновления версии Evolution CMS выполните следующее: + +* Если вы изменяли для своих нужд изменённые сниппеты, модули или плагины, переименуйте их, либо не забудьте снять галочки в процессе работы мастера установки. Мастер установки по умолчанию перезапишет все штатные сниппеты или плагины (Ditto и т. д.) до последних версий. (Вообще, хорошей практикой считается переименовывание сниппета или плагина сразу же после внесение в него изменений) + + +* Сделайте резервные копии всего что можно. По ftp скачайте все файлы Evolution с вашего сервера и с помощью phpMyAdmin (или другой программы управления БД) сделайте дамп всей базы данных. +* Скачайте и разархивируйте последнюю версию Evolution CMS. +* Загрузите содержимое распакованного архива на ваш сервер. Перезапишите все старые файлы. Дистрибутив Evolution CMS не должен содержать файла config.inc.php в папке /manager/includes/, так что он перезаписан не будет. +* Откройте браузер и зайдите на ваш сайт в директорию /install. +* Далее следуйте инструкциям на экране. +* Сразу после лицензионного соглашения, убедитесь, что выбрана опция "Обновить". + +* Если вы удалили все ваши старые файлы перед обновлением, вам, вероятно, потребуется снова выставить права доступа через CHMOD. Мастер установки напомнит вам сделать это, если будет необходимо. + +* Не забудьте снять галочки с тех дополнений (сниппетов, плагинов), в которые вы внесли изменения и не переименовали (см. пункт 1). + +* Когда перед вами возникнет опция "Удалить папку /install", убедитесь, что она включена. + +*После завершения работы мастера установки убедитесь, что папки /install не существует. Если это не так, удалите ее вручную. + +* Наконец, измените права доступа к файлу config.inc.php в папке/manager/includes на "только чтение". Рекомендуемая установка через CHMOD -0444 (r--r--r--) предотвратит ваш сайт от возможной атаки. + +Примечание: на серверах под управлением IIS этого делать не нужно. + +После того, как вы убедитесь, что все работает корректно, переименуйте все модифицированные вами сниппеты или плагины снова, если это необходимо. \ No newline at end of file diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\261\320\275\320\276\320\262\320\273\320\265\320\275\320\270\320\265_MODX.md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/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" index 17680e73..cd89c67e 100644 --- "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/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" @@ -1,78 +1,68 @@ -Упаковка файлов +## Подготовка +* Очистите кэш +* В "Конфигурации" зайдите во вкладку "Безопасность" и очистите поле "Допустимые имена хостов". -Если у вас есть доступ на хостинг по протоколу SSH и разрешено использовать распаковку архивов, то перенос файлов в виде архива проще и быстрее всего. Также возможность распаковки архивов может быть доступна из панели управления хостингом. +## Создание дистрибутива ## +### Дамп файлов ### Все файлы из папки сайта на локальном компьютере запаковываем в архив ZIP. При этом название файла лучше сделать простым и коротким. -Если у вас нет доступа SSH, распаковки через панель или распаковка запрещена хостером, то придется переносить все файлы обычным путем. - -Дамп базы данных +### Дамп базы данных ### Самый простой способ сделать дамп базы - воспользоваться программой phpMyAdmin. -Выбираем базу нашего сайта. -Заходим в раздел «Экспорт» -Выделяем все таблицы для экспорта -Можно установить галочку «Добавить удаление таблицы», чтобы таблицы со старыми данными стирались. -Отмечаем галочку «Послать», чтобы сохранить дамп в виде файла. -Переносим файлы на сервер - -Открываем FTP-менеджер любой и в папку своего сайта переносим файлы, включая дамп базы данных. - -Работаем с SSH - -После входа в консоль сервера наберите команду mc. +* Выбираем базу нашего сайта. +* Заходим в раздел «Экспорт» +* Выделяем все таблицы для экспорта +* Можно установить галочку «Добавить удаление таблицы», чтобы таблицы со старыми данными стирались. +* Отмечаем галочку «Послать», чтобы сохранить дамп в виде файла. -Распаковываем файлы +## Распаковываем файлы ## -Переходим к папке с нашим сайтом (если нет). Распаковываем файлы из архива (допустим, что наш архив называется www.zip): +* Переходим к папке с нашим сайтом. +* Распаковываем файлы из архива -unzip www.zip +## Устанавливаем права на запись ## -Все файлы будут распакованы в папку, где лежит архив. +Для правильной работы Evolution необходимо установить права на запись для следующих папок и файлов: -Устанавливаем права на запись +* assets/cache +* assets/cache/siteCache.idx.php +* assets/cache/sitePublishing.idx.php +* assets/images +* assets/export -Для правильной работы CMS необходимо установить права на запись для следующих папок и файлов: - -assets/cache -assets/cache/siteCache.idx.php -assets/cache/sitePublishing.idx.php -assets/images -assets/export -Заливаем дамп в базу на хостинге +## Заливаем дамп в базу на хостинге ## Проще всего снова воспользоваться phpMyAdmin. Если у вас нет базы, то нужно ее создать. Если есть, то выбираем свою базу и переходим во вкладку SQL для выполнения запроса. После окна для ввода запроса есть возможность указать файл. Этим мы и воспользуемся. Нажимаем обзор и выбираем свой файл. При этом важно, чтобы кодировка файла дампа совпадала с указанной. -Отправляем файл с запросом. -Проверка правильности переноса данных -Чтобы проверить правильность перенесенных данных открываем таблицу (prefix) _site_content. Эта таблица содержит все документы, поэтому вы должны увидеть свои русские тексты. Если текст отображается криво, то возможно ваш файл был в неверной кодировке. +## Проверка правильности переноса данных ## -Настраиваем конфигурацию MODx +Чтобы проверить правильность перенесенных данных открываем таблицу (prefix) site_content. Эта таблица содержит все документы, поэтому вы должны увидеть свои тексты. Если текст отображается криво, то возможно ваш файл был в неверной кодировке. -Подключение к базе. +## Настраиваем конфигурацию ## -Открываем файл manager/includes/config.inc.php (лучше сделать копию, а не переписывать локальную версию) и корректируем следующие данные: +### Подключение к базе ### +Открываем файл 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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\276\320\261\321\201\321\202\320\262\320\265\320\275\320\275\321\213\321\205 \321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271 \320\262 Extras.md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\276\320\261\321\201\321\202\320\262\320\265\320\275\320\275\321\213\321\205 \321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271 \320\262 Extras.md" deleted file mode 100644 index 0bf1b129..00000000 --- "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265 \321\201\320\276\320\261\321\201\321\202\320\262\320\265\320\275\320\275\321\213\321\205 \321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271 \320\262 Extras.md" +++ /dev/null @@ -1,25 +0,0 @@ -Для удобной установки своих собственных расширений в пару кликов, можно добавить расширение в Экстрас и в дальнейшем устанавливать оттуда: - -Допустим, вы хотите свой сниппет под названием myFavoriteSnippet. - -1. Взять код сниппета, скопировать его в файл Snippet.myFavoriteSnippet.tpl -1.1 Добавить вверху слегка описания в формате -```php -/** -* myFavoriteSnippet - -* -* Описание -* -* @author me -* @category snippet -* @version 1 -*/ -``` -2. Создать папку, в ней папки install/assets/snippets/ -3. Положить туда этот файл. -4. Сделать архив папки. Имя произвольное. -5. Залить архив в инет. В любое мсто. -6. Зайти сюда, добавить этот архив в свой личный репозиторий http://extras.evolution-cms.com/my-repo/add-package.html кнопкой "Add package". -7. При авторизации в Store внутри админки вы сможете устанавливать этот сниппет в один клик до конца времён на любом сайте. -Так можно делать и с другими расширениями типа плагин, модуль, тв diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\201\321\202\320\262\320\265\320\275\320\275\321\213\321\205_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271_\320\262_\321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271.md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\201\321\202\320\262\320\265\320\275\320\275\321\213\321\205_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271_\320\262_\321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271.md" new file mode 100644 index 00000000..bc8ce876 --- /dev/null +++ "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\261\320\260\320\262\320\273\320\265\320\275\320\270\320\265_\321\201\320\276\320\261\321\201\321\202\320\262\320\265\320\275\320\275\321\213\321\205_\321\200\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\320\271_\320\262_\321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\320\270\320\271.md" @@ -0,0 +1,85 @@ +Существует возможность добавить в репозиторий свои собственные компоненты для быстрой установки. +** Добавленные компоненты будут доступны только вам. Добавление в офицальный репозиторий производится вручную разработчиками cms** + +## Зачем мне добавлять свои компоненты? ## +- Экономия времени - сделав один раз дистрибутив для установки, вы сможете ставить его в 1 клик на любом сайте +- Порядок - вы всегда будете иметь доступ к дистрибутиву, где бы ни находились и какой бы сайт не разрабатывали + +## Пример: добавление своего сниппета ## + +Допустим, вы хотите свой добавить сниппет под названием myFavoriteSnippet. + +1. Создайте файл Snippet.myFavoriteSnippet.tpl +2. Модифицируйте код файла следующим образом: +```php +/** +* myFavoriteSnippet +* +* Описание моего сниппета +* +* @author Автор +* @category Мои сниппеты +* @version 1 +*/ +``` +3. Теперь нужно создать папку. Имя произвольное, но желательно избегать пробелов, спецсимволов и русских букв. + +Внутри папки создайте структуру install/assets/snippets/ + +3. Скопируйте Snippet.myFavoriteSnippet.tpl в папку snippets. + +4. Создайте zip-архив папки. + +Вы можете не делать архив, а просто поместить дистрибутив на github. В этом случае пункт 5 вам не требуется - Гитхаб сам сформирует ссылку на архив. + +5. Архив нужно поместить в интернет. + +6. Зайдите в [репозиторий](http://extras.evolution-cms.com/my-repo/add-package.html), добавьте этот архив в свой личный репозиторий кнопкой "Add package". + +7. При авторизации в репозитории внутри панели администрирования вы сможете устанавливать этот сниппет в один клик на любом сайте. + +## TВ, Плагины, Модули, Чанки ## +Точно таким же образом вы можете создавать компоненты для быстрой установки чанков, модулей, плагинов и создания ТВ-параметров. + +### Создание ТВ-параметра ### +Создайте файл sitemap_priority.tpl где sitemap_priority - название будущего параметра + +Поместите его в папку install/assets/tvs/ +Для модулей это будет папка modules, плагинов - plugins, чанков - chunks. + +Код: +``` + /** + * sitemap_priority + * + * Для карты сайта + * + * @category Категория + * @name sitemap_priority + * @internal @caption Приоритет страницы + * @internal @input_type dropdown + * @internal @input_options 0.1||0.2||0.3||0.4||0.5||0.6||0.7||0.8||0.9||1 + * @internal @input_default 0.5 + * @internal @output_widget + * @internal @output_widget_params + * @internal @lock_tv 0 + * @internal @template_assignments * + * @internal @modx_category SEO + * @internal @installset sample + */ +``` + +## Создание документов ## + +В отличие от элементов, создание документов выглядит несколько иначе. +В корне папки install нужно создать файл +```setup.data.sql``` + +Приблизительный код создания нового ресурса с именем sitemap.xml, тип text/xml, содержимое - вызов сниппета sitemap. + +``` +INSERT INTO `{PREFIX}site_content` (`type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`) VALUES +('document','text/xml','sitemap.xml','','','sitemap.xml','','1','0','0','0','0','','[[sitemap]]','0','0','7','1','1','1','1376384158','1','1377167369','0','0','0','1376384158','1','','0','0','0','0','1'); +``` + +Поля в этом запросе соответствуют полям в таблице site_content. diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/index.md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/index.md" index 96114a13..f7854378 100644 --- "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/index.md" +++ "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/01_\320\243\321\200\320\276\320\272\320\270/index.md" @@ -1,99 +1,90 @@ -

    Уроки

    -

    Для тех кто только знакомится с MODX EVO очень рекомендую пройтись по ссылкам ниже, сразу отпадут многие вопросы.

    -

    Видеоуроки по созданию сайта на MODX EVO

    - -

    Видео уроки с канала Андрея Казунина

    - +* [Уроки Evolution CMS от Dmi3yy](https://www.youtube.com/watch?v=3YNPqkBUjO0&list=PLKTHZGrYLdtpuzPA14WaSt5krBaG72UlK) +* [Создание сайта](http://vimeo.com/29422796) +* [Шаблонизация](http://www.youtube.com/watch?v=WDBsCL9Xfx8) -

    Уроки с сайта Я--гу.ру

    - +### Видео уроки с канала Андрея Казунина -

    Уроки по созданию сайта от Виктора Ефимова

    - -

    Уроки по созданию блога от Виктора Ефимова

    - +* [001\. Установка Modx Evolution на хостинг «Джино»](https://www.youtube.com/watch?v=28zlVnBOg5o "001\. Установка Evolution на хостинг «Джино»") +* [002\. Первоначальная настройка Modx Evolution](https://www.youtube.com/watch?v=FilCWYsiol8 "002\. Первоначальная настройка Modx Evolution") +* [003\. Ставим шаблон сайта на систему управления Modx Evolution. Немного DocLister'а](https://www.youtube.com/watch?v=WMzhayH_LMo "003\. Ставим шаблон сайта на систему управления Modx Evolution. Немного DocLister'а") +* [004\. Шаблонизация сайта. Сниппеты, плагины и модули в Modx Evolution](https://www.youtube.com/watch?v=UU9p3LjVvGQ "004\. Шаблонизация сайта. Сниппеты, плагины и модули в Modx Evolution") +* [005\. Шаблон сайта.Галерея Fancybox и Modx Evolution](https://www.youtube.com/watch?v=Q4K_FGuNAhI "005\. Шаблон сайта.Галерея Fancybox и Modx Evolution") +* [006\. Шаблон сайта. Делаем FAQ и текстовую страницу на Modx Evolution](https://www.youtube.com/watch?v=DlTqvgjehQk "006\. Шаблон сайта. Делаем FAQ и текстовую страницу на Modx Evolution") +* [007\. Шаблон сайта. Делаем блог на Modx Evolution](https://www.youtube.com/watch?v=_fSxCXCG2SE "007\. Шаблон сайта. Делаем блог на Modx Evolution") +* [008\. Аякс-комментарии. Делаем блог на Modx Evolution](https://www.youtube.com/watch?v=yr7i-NlHnKc "008\. Аякс-комментарии. Делаем блог на Modx Evolution") +* [009\. Теги в блоге на Modx Evolution](https://www.youtube.com/watch?v=uoKdcGPrChI "009\. Теги в блоге на Modx Evolution") +* [010\. МАГАЗИН на Evolution. Shopkeeper, покупка товаров и корзина](https://www.youtube.com/watch?v=I1cdHKM9cRA "010\. МАГАЗИН на Evolution. Shopkeeper, покупка товаров и корзина") +* [011\. МАГАЗИН на Evolution. Форма отправки сообщений на eForm. Болтаем про FormLister](https://www.youtube.com/watch?v=-MdV0XNsJhU "011\. МАГАЗИН на Evolution. Форма отправки сообщений на eForm. Болтаем про FormLister") +* [012\. МАГАЗИН на Evolution. Shopkeeper - отправка заказа](https://www.youtube.com/watch?v=xjIRHf6RAV0 "012\. МАГАЗИН на Evolution. Shopkeeper - отправка заказа") +* [013\. Обновление Modx Evolution. Прощай Modx, привет Evo](https://www.youtube.com/watch?v=jp6-SsMD9kE "013\. Обновление Modx Evolution. Прощай Modx, привет Evo") +* [014\. Создаём свой тип ТВ-параметра в EvolutionCMS(modx)](https://www.youtube.com/watch?v=JCmRU0r_Ago "014\. Создаём свой тип ТВ-параметра в EvolutionCMS(modx)") +* [015\. Как в DocLister работать со своей таблицей mysql](https://www.youtube.com/watch?v=pH2MnVJE2do "015\. Как в DocLister работать со своей таблицей mysql") +* [016\. Дополнение eFilter (часть 1). Как сделать фасетный фильтр товаров в Evolution CMS](https://www.youtube.com/watch?v=vPiA4KqxuH4 "016\. Дополнение eFilter (часть 1). Как сделать фасетный фильтр товаров в Evolution CMS") +* [017\. Дополнение eFilter (часть 2). Правим внешний вид фильтров.](https://www.youtube.com/watch?v=F3moUvS0Bgk "017\. Дополнение eFilter (часть 2). Правим внешний вид фильтров.") + +### Уроки с сайта Я--гу.ру + +* [Вступление - Сайт за один день? Это реально!](http://i--gu.ru/vstuplenie "Сайт за один день? Это реально!") +* [Урок 1 - Установка локального сервера XAMPP](http://i--gu.ru/urok-1 "Установка локального сервера XAMPP") +* [Урок 2 - Установка MODx Evolution](http://i--gu.ru/urok-2 "Установка MODx Evolution") +* [Урок 3 - Знакомство с MODx Evolution](http://i--gu.ru/urok-3 "Знакомство с MODx Evolution") +* [Урок 4 - Интеграция шаблона в MODx. Разбиение на чанки](http://i--gu.ru/urok-4 "Интеграция шаблона в MODx. Разбиение на чанки") +* [Урок 5 - Создание динамического меню в MODx](http://i--gu.ru/urok-5 "Создание динамического меню в MODx") +* [Урок 6 - Изменяем шапку сайта, чанк HEADER](http://i--gu.ru/urok-6 "Изменяем шапку сайта, чанк HEADER") +* [Урок 7 - Редактируем чанк COLUMN](http://i--gu.ru/urok-7 "Редактируем чанк COLUMN") +* [Урок 8 - Редактируем чанк WRAPPER и FOOTER](http://i--gu.ru/urok-8 "Редактируем чанк WRAPPER и FOOTER") +* [Урок 9 - Выводим галерею с помощью сниппета Ditto](http://i--gu.ru/urok-9 "Выводим галерею с помощью сниппета Ditto") +* [Урок 10 - Делаем новостную ленту](http://i--gu.ru/urok-10 "Делаем новостную ленту") +* [Урок 11 - Настраиваем блог. Система комментариев DISQUS](http://i--gu.ru/urok-11 "Настраиваем блог. Система комментариев DISQUS") +* [Урок 12 - Форма обратной связи. Сниппет eForm](http://i--gu.ru/urok-12 "Форма обратной связи. Сниппет eForm") +* [Урок 13 - Перенос сайта на хостинг](http://i--gu.ru/urok-13 "Перенос сайта на хостинг") +* [Заключение - Общие итоги курса. Дальнейшие рекомендации.](http://i--gu.ru/zaklyuchenie "Общие итоги курса. Дальнейшие рекомендации.") +* [Shopkeeper - Интернет-магазин на MODx](http://i--gu.ru/shopkeeper "Интернет-магазин на MODx") +* [phpBB и MODxBB - Устанавливаем форум на MODx Evolution](http://i--gu.ru/phpbb-i-modxbb "Устанавливаем форум на MODx Evolution") +* [ManagerWelcome - Изменяем внешний вид административной панели](http://i--gu.ru/managerwelcome "Изменяем внешний вид административной панели") +* [Сортировка документов - Ditto и экстендер request](http://i--gu.ru/sortirovka-ditto "Ditto и экстендер request") +* [Полезные ссылки - Модули, плагины, сниппеты](http://i--gu.ru/poleznyie-ssyilki "Модули, плагины, сниппеты") +* [Спрашивали? Отвечаем - Ответы на популярные вопросы по MODx Evolution](http://i--gu.ru/sprashivali-otvechaem "Ответы на популярные вопросы по MODx Evolution") + +### Уроки по созданию сайта от Виктора Ефимова + +* [Урок 1 — Вступительный](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-urok1.html "Инструкция по созданию сайта на MODx. Урок 1 — Вступительный") +* [Урок 2 — Установка MODx CMS](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-urok-2.html "Инструкция по созданию сайта на MODx. Урок 2 — Установка MODx CMS") +* [Урок 3 — Первоначальная настройка системы](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-na-modx-3.html "Инструкция по созданию сайта на MODx. Урок 3 — Первоначальная настройка системы") +* [Урок 4 — Интеграция дизайна в систему управления](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-na-modx-urok-4.html "Интеграция дизайна в систему управления") +* [Урок 5 — Настройка шаблона, разбиение на чанки](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-na-modx-urok-5.html "Настройка шаблона, разбиение на чанки") +* [Урок 6 — Дерево документов и создание страниц](http://efimov.ws/main/develop/modx/sajt-na-modxsozdanie-stranicz.html "Дерево документов и создание страниц") +* [Урок 7 — Реализация динамического меню](http://efimov.ws/main/develop/modx/menu-wayfinder-MODx.html "Реализация динамического меню") +* [Урок 8 — Создание шаблонов и вывод содержимого страниц](http://efimov.ws/main/develop/modx/instrukcziya-MODx-urok-8.html "Создание шаблонов и вывод содержимого страниц") +* [Урок 9 — Работа со специальными тегами MODx](http://efimov.ws/main/develop/modx/tags-MODx.html "абота со специальными тегами MODx") +* [Урок 10 — Работа с визуальным редактором в MODx](http://efimov.ws/main/develop/modx/tinymce-set-modx.html "Работа с визуальным редактором в MODx") +* [Урок 11 — Реализация цепочки навигации «Хлебные крошки»](http://efimov.ws/main/develop/modx/breadcrumbs-MODx.html "Реализация цепочки навигации «Хлебные крошки». Сниппет Breadcrumbs") +* [Урок 12 — Создание ленты новостей. Сниппет Ditto](http://efimov.ws/main/develop/modx/ditto-modx-newsline.html "Создание ленты новостей. Сниппет Ditto") +* [Урок 13 — Постраничное разбиение новостной ленты](http://efimov.ws/main/develop/modx/MODx-pagination-Ditto.html "Урок 13 — Постраничное разбиение новостной ленты") +* [Урок 14 — TV параметры MODx. Добавление изображений ресурсам](http://efimov.ws/main/develop/modx/MODx-TV-parametrs.html "Урок 14 — TV параметры MODx. Добавление изображений ресурсам") +* [Урок 15 — Форма обратной связи в MODx. Сниппет eForm](http://efimov.ws/main/develop/modx/eForm-MODx.html "Урок 15 — Форма обратной связи в MODx. Сниппет eForm") +* [Урок 16 — Реализация вспомогательного меню на странице](http://efimov.ws/main/develop/modx/modx-wayfinder.html "Урок 16 — Реализация вспомогательного меню на странице") +* [Урок 17 — Вывод слайд-шоу на главной странице с помощью сниппета Ditto](http://efimov.ws/main/develop/modx/jQuery-gallery-with-MODx.html "Урок 17 — Вывод слайд-шоу на главной странице с помощью сниппета Ditto") +* [Урок 18 — Вывод ключевых слов в MODx](http://efimov.ws/main/develop/modx/meta-tags-keywords-modx.html "Урок 18 — Вывод ключевых слов в MODx") +* [Урок 19 — Организация поиска по сайту. Сниппет AjaxSearch](http://efimov.ws/main/develop/modx/snippet-ajaxsearch-modx-poisk.html "Урок 19 — Организация поиска по сайту. Сниппет AjaxSearch") +* [Урок 19.1 — Вывод изображения, прикрепленного с помощью TV параметра, в результатах поиска AjaxSearch](http://efimov.ws/main/develop/modx/img-tv-parametrs-ajaxsearch.html "Урок 19.1 — Вывод изображения, прикрепленного с помощью TV параметра, в результатах поиска AjaxSearch") +* [Урок 20 — Карта сайта для посетителей и поисковых машин](http://efimov.ws/main/develop/modx/sitemap-for-modx-xml.html "Урок 20 — Карта сайта для посетителей и поисковых машин") +* [Урок 21 — Реализация галереи изображений](http://efimov.ws/main/develop/modx/gallery-modx.html " Урок 21 — Реализация галереи изображений") +* [Урок 22 — Перенос готового MODx сайта на хостинг](http://efimov.ws/main/develop/modx/hosting-modx.html " Урок 22 — Перенос готового MODx сайта на хостинг") +* [Урок 23 — Скачать готовый MODx сайт, соответствующий веб-стандартам](http://efimov.ws/main/develop/modx/skachat-gotovyij-modx-sajt.html " Урок 23 — Скачать готовый MODx сайт, соответствующий веб-стандартам") + +### Уроки по созданию блога от Виктора Ефимова + +* [Вступительный урок](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-vstuplenie.html "Вступительный урок по созданию блога на MODx") +* [Урок 1\. Установка и первоначальная настройка системы управления](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-ustanovka.html "Установка и первоначальная настройка системы управления") +* [Урок 2\. Интеграция дизайна в систему управления](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-iintegracziya-dizajna-v-modx.html "Урок 2\. Интеграция дизайна в систему управления") +* [Урок 3\. Реализация навигации и работа со специальными тегами MODx](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-menu-i-tegi-modx.html "Урок 3\. Реализация навигации и работа со специальными тегами MODx") +* [Урок 4\. Вывод анонсов заметок на страницах категорий](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-urok-4.html "Вывод анонсов заметок на страницах категорий") +* [Урок 5\. Оформление правой колонки: облако тегов, случайные заметки](http://efimov.ws/main/develop/modx/modx-urok-oblako-tegov-sluchajnie-zametki.html "Урок 5\. Оформление правой колонки: облако тегов, случайные заметки") +* [Урок 6\. Поиск по сайту, контактная форма, XML и HTML карты, RSS рассылка](http://efimov.ws/main/develop/modx/modx-blog-sitemap-forma-poisk.html "Создание блога на MODx. Урок 6 — Поиск по сайту, контактная форма, XML и HTML карты, RSS рассылка") +* [Урок 7\. Оформление внутренних страниц блога и подключение комментариев](http://efimov.ws/main/develop/modx/modx-blog-comments-page-inside.html " Создание блога на MODx. Урок 7 — Оформление внутренних страниц блога и подключение комментариев") +* [Урок 8\. Устранение дублирования контента, оформление футера и другие настройки](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-urok-8.html " Создание блога на MODx. Урок 8 — Устранение дублирования контента, оформление футера и другие настройки") diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/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" index 0e1df3c5..50f498f3 100644 --- "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/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/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/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" @@ -1,13 +1,15 @@ -Docmanager +**Это устаревший метод. Рекомендуем для создания документов использовать сниппет FormLister, либо заменить в сниппете вызовы функций на методы библиотеки MODx Api. ** -Для операций с документами будем использовать специальную библиотеку docmanager. Устанавливаем ее в папкуassets/libs/docmanager. +Однако, как пример работы со сниппетами и событиями eForm, это решение очень хорошо подходит. -Создаем форму +Для операций с документами будем использовать специальную библиотеку docmanager. Устанавливаем ее в папку `assets/libs/docmanager`. + +### Создаем форму Форма создается с помощью стандартного сниппета eForm. В него встроены все необходимые проверки полей, а также возможность отправить нам письмо о добавлении нового материала. Для примера сделаем такую форму в чанке Anketa: - +```

    [+validationmessage+]

    @@ -21,17 +23,20 @@ Docmanager

    -Вызов формы на сайте + ``` -Для показа формы можно использовать следующий вызов: +### Вызов формы на сайте +Для показа формы можно использовать следующий вызов: +``` [!eForm? &formid=`newArticle` &subject=`Посетители прислали новый файл` &tpl=`Anketa` !] +``` Важно! Параметр formid должен совпадать с одноименным скрытым полем формы. -Обработчик полученных данных +### Обработчик полученных данных После того как мы получили все необходимые от пользователя данные нам необходимо их поместить в документ. Для это делаем новый сниппет с именем NewArticleEvent и в нем создаем свою функцию CreateNewArticle: - +``` function CreateNewArticle(&$fields){ // Массив $fields будет содержать данные всех полей формы // Создания документа с описанием. @@ -48,24 +53,27 @@ function CreateNewArticle(&$fields){ $doc->Set('tvLink',$fields['link']); // ссылка $doc->Save(); // сохраняем return true; // Говорим eForm, что все в порядке. } +``` + Вот такой простой код нам позволит полученные данные сохранить в документ. Названия сниппета и функции с обработчиком можно изменить при желании. Важно! Для указания TV-параметров перед названием необходимо добавлять приставку tv, то есть это не часть названия параметра. -Подключаем обработчик к нашей форме +### Подключаем обработчик к нашей форме eForm имеет несколько событий, которые мы можем перехватывать, но в данном случае нам нужно только eFormOnBeforeMailSent. Оно вызывается прямо перед отправкой формы и после того как все данные проверены на обязательность заполнения и формат. Изменяем немного вызов нашей формы и получаем следующий окончательный вид: - +``` [!NewArticleEvent!] - [!eForm? &formid=`newArticle` &subject=`Посетители прислали новый файл` &tpl=`Anketa` &eFormOnBeforeMailSent=`CreateNewArticle`!] +[!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 +``` +&allowhtml=`1` &sendAsHtml=`1` +``` diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\320\276\320\262_\320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\214_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\320\265 (\320\260\320\262\321\202\320\276\321\200 Alexey LIber).md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\320\276\320\262_\320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\214_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\320\265.md" similarity index 98% rename from "ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\320\276\320\262_\320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\214_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\320\265 (\320\260\320\262\321\202\320\276\321\200 Alexey LIber).md" rename to "ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\320\276\320\262_\320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\214_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\320\265.md" index e697eb17..333d3935 100644 --- "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\320\276\320\262_\320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\214_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\320\265 (\320\260\320\262\321\202\320\276\321\200 Alexey LIber).md" +++ "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/02_\320\240\320\265\321\210\320\265\320\275\320\270\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\320\276\320\262_\320\277\320\276\320\273\321\203\321\207\320\270\321\202\321\214_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\320\265.md" @@ -1,3 +1,4 @@ +``` $out=''; //С помощью DBAPI $id = $modx->event->params['id']; @@ -37,5 +38,5 @@ $out.='Images from DocLister - '.$dl_images; echo $out; exit(); - -![Вывод](https://github.com/mediakot/docs/blob/master/ru/images/gettv.jpg) \ No newline at end of file +``` +![Вывод](https://github.com/mediakot/docs/blob/master/ru/images/gettv.jpg) diff --git "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/03_\320\241\321\201\321\213\320\273\320\272\320\270/index.md" "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/03_\320\241\321\201\321\213\320\273\320\272\320\270/index.md" index 09c3b629..315d34f3 100644 --- "a/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/03_\320\241\321\201\321\213\320\273\320\272\320\270/index.md" +++ "b/ru/05_\320\236\320\261\321\203\321\207\320\265\320\275\320\270\320\265/03_\320\241\321\201\321\213\320\273\320\272\320\270/index.md" @@ -3,4 +3,6 @@ [MODX.im](http://modx.im) - Сообщество по MODX -[code.divandesign.ru](http://code.divandesign.ru) - Репозиторий студии «Диван.Дизайн». \ No newline at end of file +[code.divandesign.ru](http://code.divandesign.ru) - Репозиторий студии «Диван.Дизайн». + +[Telegram](https://t.me/evolutioncms) - канал Evolution CMS в Телеграм diff --git a/ru/README.md b/ru/README.md index 9fa5016d..9d6c9905 100755 --- a/ru/README.md +++ b/ru/README.md @@ -1,7 +1,7 @@ -MODX Evolution Docs +Evolution CMS Docs ========= -Документация по MODX Evolution +Документация по Evolution CMS Разработка мануала сообща через pull-requests + issues. diff --git a/ru/index.md b/ru/index.md index 897542fa..7fd03bb9 100755 --- a/ru/index.md +++ b/ru/index.md @@ -1,6 +1,6 @@ -#Документация по MODX Evolution +# Документация по Evolution CMS -*Evolution CMS — это профессиональный инструмент разработки сайтов, позволяющий управлять контентом (да и самим сайтом) абсолютно на все 100%! Эта система с открытым кодом (open source), и поэтому бесплатна. В отличие от большинства бесплатных CMS на Evolution вы можете построить сайт любой сложности, практически с любым набором функций, при этом система не будет никоим образом влиять на ваш html-код.* +*Evolution CMS — это профессиональный инструмент разработки сайтов, позволяющий управлять контентом (да и самим сайтом) абсолютно на все 100%! Эта система с открытым кодом (open source), и поэтому бесплатна. В отличие от большинства бесплатных CMS, на Evolution вы можете построить сайт любой сложности, практически с любым набором функций, при этом система не будет никоим образом влиять на ваш html-код.* ## Как внести свой вклад diff --git "a/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274_\320\275\320\260_Evolution.md" "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274_\320\275\320\260_Evolution.md" new file mode 100644 index 00000000..15120982 --- /dev/null +++ "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274_\320\275\320\260_Evolution.md" @@ -0,0 +1,24 @@ +Більшості користувачів вистачає 2 годин для навчання, після чого вони впевнено починають працювати і самостійно освоювати можливості системи. +Постійного консультування, як це часто відбувається з іншими CMS, як правило не потрібно. + +## Що ж дозволяє Evolution CMS залишатися такою простою? ## + +**Потрібна інформація завжди під рукою** + +В Evolution простий список всіх документів, які присутні на сайті. Він організований у вигляді дерева і дуже схожий на звичну концепцію папок і файлів. За допомогою правої кнопки викликається меню, яке дозволяє здійснювати необхідні дії над документами: + +- створювати +- публікувати або знімати з публікації +- видаляти +- переносити +- робити копію + +## Документи під контролем ## + +Документи в дереві відрізняються своїм виглядом в залежності від їх налаштування, і це дозволяє відразу визначити, які дії потрібно зробити для отримання результату. Навіть видалені документи не викидаються із загального списку, а акуратно закреслюються і виділяються червоним кольором. Також відрізняються опубліковані, неопубліковані і розташовані в меню документи. + +Не менш цікава можливість копіювати документи, включаючи всю вкладену в них структуру. Таким чином легко можна створити однотипні розділи за короткий проміжок часу. + +## Управління TV-параметрами ## + +Залежно від налаштувань TV-параметр пропонує той чи інший варіант управління. Він може виглядати як звичайне текстове поле, випадаючий список, набір прапорців (checkbox), перемикачів (radio), поля для вибору зображення або додаткового поля з візуальним редактором. diff --git "a/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/02_\320\237\321\200\320\276\321\201\321\203\320\262\320\260\320\275\320\275\321\217_\320\275\320\260_Evolution.md" "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/02_\320\237\321\200\320\276\321\201\321\203\320\262\320\260\320\275\320\275\321\217_\320\275\320\260_Evolution.md" new file mode 100644 index 00000000..c56c3a08 --- /dev/null +++ "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/02_\320\237\321\200\320\276\321\201\321\203\320\262\320\260\320\275\320\275\321\217_\320\275\320\260_Evolution.md" @@ -0,0 +1,5 @@ +## Повний контроль над версткою ## +Вже завдяки лише тому, що весь код знаходиться під повним контролем розробника, Evolution дозволяє спочатку робити сайти з урахуванням внутрішньої оптимізації. Повна підтримка семантичного URL дуже подобається пошуковим системам. Крім того, є інструменти для управління мета-тегами і ключовими словами. + +## Високі позиції ## +Виходячи з досвіду, можна з упевненістю сказати, що багато сайтів на Evolution CMS дуже часто самостійно займають хороші позиції в пошукових системах! diff --git "a/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/04_\320\237\320\265\321\200\320\265\320\272\320\273\320\260\320\264_GNU_GPLv3.md" "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/04_\320\237\320\265\321\200\320\265\320\272\320\273\320\260\320\264_GNU_GPLv3.md" new file mode 100644 index 00000000..bde71316 --- /dev/null +++ "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/04_\320\237\320\265\321\200\320\265\320\272\320\273\320\260\320\264_GNU_GPLv3.md" @@ -0,0 +1,243 @@ +Неофіціальний переклад GNU GPLv3 + +http://gpl3rus.googlecode.com + +(C) 2021 Солтис-Шолудько Наталія + +(C) 2021 Зубенко Ігор (ihor.zubenko@oa.edu.ua) + +Unofficial Translation of GNU GPLv3 + +This is an unofficial translation of the GNU General Public License into Russian. It was not published by the Free Software Foundation, and does not legally state the distribution terms for software that uses the GNU GPL - only the original English text of the GNU GPL does that. However, we hope that this translation will help Ukrainian-speakers understand the GNU GPL better. + +Справжній переклад Стандартної публічної ліцензії GNU на українську мову не є офіційним. Він не був опублікований Фундацією Вільного Програмного Забезпечення і не встановлює юридичну силу умов для поширення програмного забезпечення, яке розповсюджується на умовах Загальної публічної ліцензії GNU. Умови, що мають юридичну силу, закріплені виключно в автентичному тексті Стандартної публічної ліцензії GNU англійською мовою. Ми сподіваємося, що справжній переклад допоможе україномовним користувачам краще зрозуміти зміст Загальної публічної ліцензії GNU. + +СТАНДАРТНА ГРОМАДСЬКА ЛІЦЕНЗІЯ GNU +Версія 3, від 29 червеня 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Кожен має право поширювати точні копії цієї ліцензії, але без внесення змін. + +ПРЕАМБУЛА + +Загальна громадська ліцензія GNU (GNU General Public License, GNU GPL) - це вільна copyleft ліцензія для програмного забезпечення (ПЗ) і інших видів творів. + +Більшість ліцензій на програмне забезпечення та інші витвори спроектовані так, щоб позбавити вас можливостями ділитися ними і змінювати їх. Загальна громадська ліцензія GNU, навпаки, розроблена з метою гарантувати Ваше право поширювати і вносити зміни в усі версії програмного забезпечення - для впевненості, що ПЗ залишиться вільним для всіх користувачів. Ми, Фонд вільної платформи Java (Free Software Foundation), використовуємо GNU GPL для більшої частини нашого програмного забезпечення; ця ліцензія застосовується також до будь-яких інших творів, чиї автори використовують її. Ви можете використовувати цю ліцензію і для свого ПЗ. + +Коли ми говоримо про вільне програмне забезпечення, ми говоримо про свободу, а не ціну. Наші ліцензії спроектовані так, щоб упевнитися в Вашому праві поширювати його копії (і стягувати за це плату за своїм бажанням), щоб Ви отримували вихідний код або могли отримати його при бажанні, щоб Ви могли змінювати чи використовувати його частини в нових вільних програмах , і щоб Ви знали що Ви можете це зробити. + +Для захисту Ваших прав, нам необхідно обмежувати інших в можливості відмовити Вам у Ваших правах або просити Вас відмовитися від них. Тому якщо Ви поширюєте копії вільного ПЗ або змінюєте його, то на Вас лягають деякі обов'язки: обов'язки поважати свободу інших. + +Наприклад, якщо Ви поширюєте копії ПЗ, безкоштовно або за певною ціною, Ви повинні надавати одержувачам ті ж свободи, які отримали самі. Ви повинні бути впевнені, що вони, так само як і ви, отримали або можуть отримати вихідний код. І Ви повинні донести до них ці умови, щоб вони знали свої права. + +Розробники, що використовують GNU GPL, захищають Ваші права за допомогою наступних двох кроків: (1) заявляють авторські права на ПЗ, і (2) надають Вам цю ліцензію, що дає Вам законне право копіювати, поширювати і / або змінювати його. + +Для захисту розробників та авторів GPL чітко пояснює, що немає ніякої гарантії, що розповсюджується на вільне ПЗ. Для зручності користувачів і авторів, GPL вимагає щоб модифіковані версії позначалися як "змінені", таким чином проблеми і помилки змінених версій не будуть помилково приписані авторам оригіналу. + +Деякі пристрої спроектовані так, щоб заборонити йому установку або запуск змінених версії ПЗ, хоча виробник може це робити. Це абсолютно несумісно з нашою метою - захистом прав користувача вносити зміни в ПЗ. Подібні зловживання систематично відбуваються в сфері продуктів індивідуального використання, в якій це особливо неприйнятно. Саме тому ми розробили дану версію GPL щоб заборонити подібну практику на цьому ринку. Якщо подібні проблеми виникнуть в інших областях, ми, заради захисту свободи користувачів, які бажають розширити дію ліцензії на ці нові області в майбутніх версіях GPL. + +Нарешті, кожній програмі постійно загрожують софтверні патенти. Держави не повинні допускати обмеження патентами розробки і використання ПЗ на комп'ютерах загального призначення, але тому що вони це роблять, ми хочемо уникнути небезпеки накладення патентів на вільні програми, що зробить їх, фактично, приватною власністю. Для запобігання цьому GPL гарантує, що патенти не можуть бути використані з метою зробити програму невільною. + +Знизу наведені чіткі умови копіювання, поширення і зміни. + +УМОВИ + +0. Визначення + +"Дана Ліцензія" має на увазі третю версію Загальної публічної ліцензії GNU. + +"Авторське право" також позначає закони, подібні до законів про авторське право, що застосовуються до інших видів витворів, наприклад, топологіям інтегральних мікросхем. + +"Програма" має на увазі будь-який охороняємий витвір, ліцензований Даною Ліцензією. До кожного власника ліцензї (ліцензіату) звертаються на "Ви". "Власники ліцензії" і "одержувачі" можуть бути як фізичними, так і юридичними особами. + +"Зміна" витвору означає копіювання або адаптація всього або частини витвору у формі, що вимагає згоди власника авторських прав і відрізняється від точного копіювання. Результат називається "зміненої версією" попереднього витвору або витвором, "заснованим" на попередньому витворі. + +"Ліцензований витвір" має на увазі не модифіковану Програму, або роботу, яка базується на Програмі. + +"Тиражувати" витвір означає робити що-небудь з ним, що, без дозволу, зробить вас безпосередньо або побічно відповідальним за порушення авторського права відповідно до чинного законодавства, за винятком запуску на комп'ютері або зміни особистої копії. Тиражування включає в себе копіювання, розповсюдження (з або без змін), публікацію, і, в деяких країнах, деякі інші дії. + +"Передача" витвору означає будь-який вид тиражування, який дозволяє третім особам створювати або отримувати копії. Просте взаємодія з користувачем через комп'ютерну мережу, без отримання копії, передачею не є. + +Інтерфейс відображає "Відповідні правові повідомлення", які включають, принаймні, легко доступні і помітні функції, які (1) відображають відповідне повідомлення про авторське право і (2) пояснюють користувачеві, що немає ніякої гарантії на цей твір (крім тих випадків незастосування гарантій явно надані), що власники ліцензій можуть передавати витвір відповідно до Даною Ліцензії, і як подивитися копію Даною Ліцензії. Якщо інтерфейс надає набір призначених для користувача команд або меню, то відповідний помітний пункт задовольняє даним умовам. + +1.Вихідний код + +"Вихідний код" витвору означає бажану форму витвору для створення його модифікацій. "Об'єктний код" має на увазі будь-яку іншу форму витвору. + +"Стандартний інтерфейс" означає інтерфейс, який або є офіційним стандартом, встановленим визнаним органом по стандартизації, або, в разі інтерфейсів, специфічних для конкретної мови програмування, той, що широко поширений серед розробників цією мовою. + +"Системні бібліотеки" здійсненних витворів включають в себе все відмінне від твору як цілого, (а) включається в стандартну поставку Головного компонента, але не є його частиною, і (б) служить тільки для використання інших витворів з Головним Компонентом, або для надання Стандартного інтерфейсу, який доступний громадськості в формі вихідного коду. "Головний Компонент" в цьому контексті означає головний і невід'ємний компонент (ядро, віконна система тощо) конкретної операційної системи (якщо є) на якій виконується витвір, або компілятор, використаний для створення витвору, або інтерпретатор об'єктного коду, використаний для запуску витвору. + +"Відповідний Вихідний Код" витвору в формі об'єктного коду має на увазі весь вихідний код, необхідний для генерації, установки, виконання (для здійсненних витворів) об'єктного коду та модифікації витвору, включаючи скрипти, які контролюють ці дії. Однак, він не містить Системні Бібліотеки, утиліти загального призначення або вільно доступні програми, які використовувалися в немодифіковані вигляді для здійснення діяльності, але не є частиною витвору. Наприклад, Відповідний Вихідний Код включає файли визначення інтерфейсу, пов'язані з файлами вихідного коду витвору, і вихідний код загальних бібліотек і динамічно пов'язаних підпрограм, які необхідні по ідеї автора витвору, таких як пряма передача даних або контрольний потік між цими підпрограмами та іншими частинами витвору. + +Відповідний Вихідний Код не зобов'язаний включати в себе що-небудь, що користувач може автоматично згенерувати з інших частин Відповідного Вихідного Коду. + +Відповідний Вихідний Код витвору в формі вихідного коду - той самий витвір. + +2. Основні свободи + +Всі права, надані Даною Ліцензією надаються на термін авторських прав на Програму і не можуть бути відкликані за умови, що встановлені умови дотримані. Дана Ліцензія однозначно підтверджує Ваші необмежені права на запуск немодифікованої Програми. Дія Даною Ліцензії на висновок витвору, захищеного Даною Ліцензією, поширюється тільки в тому випадку, якщо висновок є ліцензований витвір. Дана Ліцензія визнає Ваші права на вільне використання або його еквівалент відповідно до закону про авторське право. + +Ви можете створювати, запускати і тиражувати ліцензовані витвори, які Ви не передаєте, без умов, до тих пір, поки ліцензія залишається в силі. Ви можете передати ліцензовані витвори третім особам з єдиною метою - модифікація витвору виключно для Вас, або для надання Вам можливості запуску цих витворів, за умови що ви виконуєте умови Даною Ліцензії в переданні матеріалів, на які не володієте авторським правом. Треті особи, які створюють або запускають ліцензовані витвори повинні робити це виключно від Вашого імені, під Вашим контролем, на умовах заборони створення копій матеріалів, захищених авторським правом, без Вашого дозволу. + +Передача при будь-яких інших обставин дозволена виключно за умов, встановлених нижче. Субліцензування заборонено; секція 10 виключає необхідність в цьому. + +3. Захист Законних прав користувача від Противотехнічних Законів + +Жодне з ліцензованих витворів не повинно вважатися частиною технічного засобу захисту згідно придатного закону, що реалізує зобов'язання, накладені статтею 11 Угоди про авторські права Світової Організації Інтелектуальної Власності (WIPO), прийнятої 20 грудня 1996 року, або схожим законам, що забороняють або обмежують обхід таких засобів . + +При передачі Вами ліцензованого витвору, Ви відмовляєтеся від будь-яких юридичних повноважень забороняти обхід технічних засобів, поки такий обхід знаходиться в рамках здійснення прав, виданих Даною Ліцензією, в знак поваги до ліцензованого витвору, і Ви відмовляєтеся від будь-яких намірів обмежити роботу чи внесення змін до витвору, як засобів тиску, спрямованих на користувачів витвору, Ваші законні права та права третіх осіб для запобігання обходу технологічних засобів захисту. + +4. Передача Точних Копій + +Ви можете передавати точні копії вихідних кодів Програми так само, як і отримали, на будь-якому носії, за умови що в помітній і відповідній формі публікуєте повідомлення про авторське право на кожній копії; зберігаєте недоторканими всі повідомлення, що встановлюють, що Дана Ліцензія і будь-які необмежувальні умови, додані у відповідності до розділу 7, застосовні до тексту програми; зберігаєте недоторканими всі повідомлення про відсутність гарантій; надати всім одержувачам копії Даною Ліцензії разом з Програмою. + +Ви можете встановити будь-яку ціну, або не встановлювати ціну, за кожну копію, яку Ви передаєте, також Ви можете пропонувати підтримку або гарантію за плату. + +5. Передача Версій Модифікованого вихідного коду + +Ви можете передавати витвори, засновані на Програмі, або модифікації програми в формі вихідного коду на умовах глави 4, також виконуючи такі умови: + +a) Витвір має містити явно видимі повідомлення, які стверджують що Ви змінили код, і містять дійсну дату змін. +б) Витвір має містити явно видимі повідомлення, які стверджують що його випущено відповідно до Даної Ліцензії та будь-якими додатковими умовами, встановленими відповідно до розділу 7. Ця вимога змінює вимогу секції 4 "залишати недоторканими всі повідомлення". +в) Ви повинні видати ліцензії на витвір, як єдине ціле, відповідно до Даної Ліцензії, всім, хто захоче отримати копію. Дана Ліцензія поширюватися з усіма відповідними умовами глави 7, на весь витвір, і кожну його частину, безвідносно того, як вони поставляються. Дана Ліцензія не допускає видачі ліцензій на витвір іншими способами, але не забороняє цього, якщо Ви отримали дозвіл на видачу ліцензій окремо. +г) Якщо в витворі присутні інтерфейси, кожен повинен відображати "Відповідні Правові Повідомлення"; якщо ж Програма має інтерфейси, що не відображають "Відповідні Правові Повідомлення", Ваш витвір має це виправити. +Компіляція ліцензованого витвору з іншими окремими і незалежними витворами, які за своєю природою не є розширеннями ліцензованого витвору і не з'єднані з ним з метою формування більшої програми, на носії зберігання або розповсюдження, називається "агрегацією", якщо компіляція і її сумарні авторські права не обмежують доступ і юридичні права користувача компіляції щодо початкового витвору. Включення ліцензованого витвору в агрегацію не поширюється дія Даної Ліцензії на інші частини агрегації. + +6. Передача не-вихідних форм + +Ви можете передавати ліцензовані витвори в формі об'єктного коду на умовах глав 4 та 5, в тому випадку якщо ви також передаєте Відповідний Вихідний Код на умовах Даної Ліцензії, одним з таких шляхів: + +а) Передаєте об'єктний код в (або вбудованим в) фізичний продукт (включно фізичний дистрибутивний носій) разом з Відповідним Вихідним Кодом, розташованим на фізичному носії, широко використовується для обміну ПЗ. +б) Передаєте об'єктний код в (або вбудованим в) фізичний продукт (включно фізичний дистрибутивний носій) разом з письмовою обіцянкою, дійсною щонайменше протягом трьох років і до тих пір, поки Ви надаєте запасні частини або підтримку для даної моделі продукту, надати будь-якому власникові об'єктного коду або (1) копію Відповідного вихідного коду для всього ПЗ продукту, ліцензованого Даною Ліцензією, на фізичному носії, широко використовується для обміну ПЗ, за ціною, що не перевищує фізичні витрати на передачу вихідного коду, або (2) можливість скопіювати Відповідний Вихідний Код з мережевого сервера без справляння плати. +в) Передавати персональні копії об'єктного коду з копією письмової обіцянки надати Відповідний Вихідний Код. Даний спосіб дозволений тільки в рідкісних випадках і на некомерційній основі, тільки якщо Ви отримали об'єктний код в такій формі, відповідно до пункту 6б. +г) Передавати об'єктний код, надаючи доступ з виділеного місця (безкоштовно, або за певну плату) і надаєте аналогічний доступ до відповідних вихідних Коду тим же шляхом, з того ж місця, без подальшої оплати. Немає необхідності надавати Відповідний Вихідний Код в комплекті з об'єктним кодом. Якщо місцем доступу є мережевий сервер, Відповідний Вихідний Код може перебувати на іншому сервері (обслуговується Вами, або третіми особами), що надає аналогічні можливості копіювання; об'єктний код повинен супроводжуватися ясними вказівками розташування Відповідного Вихідного Коду. Незалежно від того, на якому сервері розташований Відповідний Вихідний Код, Ви зобов'язані переконатися в тому, що він доступний стільки, скільки необхідно для відповідності цим вимогам. +д) Передавати об'єктний код, використовуючи передачу від користувача до користувача (peer-to-peer), повідомляючи користувачам де об'єктний код і Відповідний Вихідний Код загальнодоступний без справляння плати згідно з пунктом 6г. +Немає необхідності включати в передачу твору в формі об'єктного коду віддільні частини об'єктного коду, чий вихідний код виключений з Відповідного Вихідного Коду як Системна Бібліотека. + +"Призначений для користувача Продукт" це або (1) "споживчий товар", що має на увазі будь-які форми матеріального особистого майна, які використовуються для особистих, сімейних або домогосподарських цілей, або (2) що-небудь спроектоване або продається для установки будинку. При визначенні чи є продукт споживчим товаром, випадки, що викликають сумніви, будуть вирішені на користь ліцензування. Для конкретного продукту, отриманого конкретним користувачем, "звичайне використання" має на увазі типове або поширене використання такого типу продуктів, безвідносно статусу конкретного користувача або того, як конкретний користувач використовує, або розраховує, або буде використовувати продукт. Продукт є споживчим товаром безвідносно того, чи має він істотні комерційні, промислові або неспоживацькі застосування до тих пір, поки такі застосування не є єдиними істотними застосуваннями продукту. + +"Інструкція по встановленню" Продукту має на увазі методи, процедури, ключі доступу та іншу інформацію, необхідну для установки і запуску модифікованих версій ліцензованого витвору в Продукті з модифікованою версій Відповідного Вихідного Коду. Інструкція має бути достатньою для гарантування того, що стандартний функціонал зміненого об'єктного коду ні в якому разі не обмежується або спотворюється через різні модифікації. + +Якщо Ви передаєте об'єктний код згідно цьому розділі б, або в, або виключно для використання в Користувача, і передача відбувається як частина угоди, в якій права володіння та використання Продукту переходять одержувачу довічно або на певний термін (безвідносно того, як характеризована угода ), Відповідний Вихідний Код, що передається згідно цьому розділі повинен бути супроводжений по встановленню. Дана вимога не діє якщо ні Ви, ні треті особи не маєте можливості встановити модифікований об'єктний код на користувача Продукт (наприклад, витвір встановлено в ROM). + +Вимога надання Установчої Інформації не включає вимогу надання підтримки, гарантії або оновлень на витвори, яке було модифіковано або встановлено одержувачем, або для Продукту, в якому витвір модифіковано або встановлено. Доступ до мережі може бути заборонений, якщо сама модифікація суттєво і негативно діє на роботу мережі, або порушують правила та протоколи передачі даних в мережі. + +Надані Відповідний Вихідний Код і по встановленню відповідно до даної главою повинні бути в відкрито-документованому форматі (що має реалізацію, доступну у формі вихідного коду), і не повинні запитувати пароля або ключа для розпакування, читання або копіювання. + +7. Додаткові свободи + +"Додаткові свободи" - це умови, які доповнюють Дану Ліцензію шляхом створення виключень з одного або декількох умов. Додаткові свободи, застосовні до всієї Програми, повинні бути розцінені так, як якби вони були включені в Дану Ліцензію, в разі якщо вони дійсні відповідності до придатного закону. Якщо додаткові свободи застосовуються тільки до частини Програми, ця частина може бути використана окремо на цих умовах, але вся Програма залишається під дією Даної ліцензії без урахування додаткових умов. + +Коли ви передаєте копію ліцензованого витвору, Ви маєте право забрати будь-які додаткові свободи з цієї копії, або з будь-якої її частини. (Додаткові свободи можуть вимагати їх видалення в конкретних випадках коли Ви вносите витвір.) Ви можете додати додаткові свободи до матеріалів, доданим Вами в ліцензований витвір і на які Ви маєте або можете надати дозвіл правовласника. + +Незважаючи на будь-які інші положення Даної Ліцензії, на матеріал, доданий Вами до ліцензованого витвору, Ви можете (якщо ви уповноважені власниками авторських прав на матеріал) доповнити умови Даної Ліцензії наступними умовами: + +а) Відмова від гарантій або обмеження відповідальності інакше, ніж встановлено в главах 15 і 16 даної ліцензії; або +б) Вимога збереження певних дійсних юридичних сповіщень або подяки авторам в матеріалі, або в Відповідних Юридичних примітках, що відображаються витвором, їх містить; або +в) Заборона на спотворення оригінального матеріалу, або вимога до модифікованих версій такого матеріалу містити позначку в належній формі про те, що матеріал відрізняється від оригінальної версії; або +г) Обмеження на використання, з метою публікації, імен ліцензорів або авторів матеріалу; або +д) Відмова надати права за законом про торгові марки на використання деяких торгових назв, торгових марок, сервісних марок; або +е) Вимога компенсації ліцензора і автора матеріалу ким або, хто передає матеріал (або модифіковані версії матеріалу) з договірними прийняттям відповідальності одержувачем, для будь-якої відповідальності, яку дане договірне прийняття безпосередньо накладає на правовласників і авторів. +Всі інші не-які дозволяють додаткові умови вважаються "додатковими заборонами", що потрапляє під дію глави 10. Якщо Програма в тому вигляді, в якому Ви її отримали, або її частина, містить повідомлення, яке встановлює, що вона захищена Даною Ліцензією та при цьому містить додаткові заборони, Ви можете видалити дані заборони. Якщо документ ліцензії містить додаткові заборони, але допускає реліцензування або передачу на умовах Даної Ліцензії, Ви можете додати до ліцензованого витвору матеріал, захищений умовами того ліцензійного документа, за умови що додаткова заборона не зберігається при такому реліцензуванні або передачі. + +Якщо Ви додаєте умови в ліцензований витвір відповідно до даної глави, Ви повинні додати в порушені вихідні файли, твердження про те, що додаткові умови застосовуються до цих файлів, а також повідомлення про те де шукати дані умови. + +Додаткові умови, які дозволяють або не обмежують, можуть бути встановлені в формі окремої ліцензії, або встановлені як виключення; вимоги, перераховані Вище застосовуються в будь-якому випадку. + +8. Закінчення дії + +Ви не можете тиражувати або змінювати ліцензований витвір, за винятком тих випадків коли це в прямій формі викладено в умовах Даної Ліцензії. Будь-яка спроба тиражування або модифікації витвору на інших умовах недійсна і автоматично знімає з Вас всі права видані Даною Ліцензією (включаючи будь-які патенти, надані ліцензією відповідно до третього параграфу глави 11). + +Однак, в тому випадку, коли Ви припиняєте порушення Даної Ліцензії, ліцензія від конкретного правовласника відновлюється (а) тимчасово, до тих пір поки правовласник явно і остаточно не закінчить дію Вашої ліцензії, і (б) на постійній основі, якщо правовласнику не вдасться повідомити вас про порушення за допомогою належних засобів в термін 60 днів з моменту припинення порушень. + +Крім того, Ваша ліцензія від конкретного правовласника відновлюється на постійній основі в разі якщо правовласник повідомляє Вас про порушення за допомогою належних засобів, але Ви вперше отримуєте повідомлення про порушення Даної Ліцензії (для будь-якого витвору) від цього правовласника і виправили порушення протягом 30 днів після отримання повідомлення. + +Позбавлення Вас прав відповідно до даної секції не позбавляє прав людей, які отримали від Вас копії або права згідно Даною Ліцензією. Якщо Ваші права припинені і не відновлені безстроково, Ви не можете отримати нову ліцензію на той же матеріал відповідно до глави 10. + +9. Угода не потрібна для копіювання + +Ви не зобов'язані приймати Дану Ліцензію щоб отримати або запустити копію Програми. У доповненні, тиражування ліцензованого витвору, що відбувається виключно як сукупність передач від користувача до користувача, необхідних для отримання копії також не вимагає угоди. Однак, тільки Дана Ліцензія дає Вам права тиражування або зміни будь-яких ліцензованих витворів. Такі дії порушують авторське право, якщо Ви не прийняли Дану Ліцензію. Тому змінюючи або тиражуючи ліцензований витвір, Ви підтверджуєте свою згоду з Даною Ліцензією. + +10. Автоматичне ліцензування Подальших Одержувачів + +Кожен раз, коли ви передаєте ліцензований витвір, одержувач автоматично отримує ліцензію на запуск, зміну і тиражування витвору, підлеглого Даній Ліцензії. Ви не відповідальні за дотримання Даної Ліцензії третіми особами. + +"Юридична угода" - угода передає контроль організації, або практично всі активи такої, або поділ організації, або злиття організацій. Якщо тиражування ліцензованого витвору є результатом юридичної угоди, кожна сторона угоди, яка отримує копію твору також отримує всі ліцензії на витвір, які попередник збоку мав або міг видати згідно з попереднім параграфом, плюс право володіння Відповідним Вихідним Кодом витвору від попередника, якщо він володів Відповідним Вихідним Кодом , або міг отримати його при відповідному запиті. + +Ви не можете накладати ніякі додаткові заборони на здійснення прав виданих або підтверджених згідно Даною Ліцензією. Наприклад, Ви не можете накладати ліцензійні збори, авторський гонорар, або інші види виплат за здійснення прав, виданих відповідно до Даної Ліцензії, і Ви не можете ініціювати судовий процес (включаючи зустрічний позов), заявляючи що будь-яка патентна вимога порушена шляхом створення, використання, продажу , пропозиції продажу або імпортування Програми або будь-який її частини. + +11. Патенти + +"Вкладник" - правовласник, який дозволяє використання згідно Даної Ліцензії Програми або витвору, на якому заснована Програма. Витвір, ліцензований таким чином, називається "версія учасника". + +"Основні патентні вимоги" вкладника - всі патентні вимоги, які має або контролює вкладник, або вже придбані, або намічені для придбання, які будуть порушені тим чи іншим чином, допускається Даною Ліцензією, включаючи створення, використання або продаж її версії учасника, але виключаючи вимоги, які будуть порушені тільки в формі сукупності майбутніх змін версії учасника. В рамках даного визначення, "контроль" включає в себе право видавати патентні субліцензії в формі, наступної вимогам Даної Ліцензії. + +Кожен вкладник видає Вам неексклюзивні, міжнародні, вільні від відрахувань патентні ліцензії, відповідно до основних патентним вимогам вкладника, на використання, продаж, пропозиція продажу, імпортування та запуск, зміна і тиражування вмісту версії учасника. + +У наступних трьох параграфах, "патентна ліцензія" - будь-який вираз угоди або зобов'язання не застосовувати патент (наприклад, видача прав на використання патентованого витвору або зобов'язання не подавати позовів за порушення патенту). "Видати" таку патентну ліцензію однієї зі сторін означає укласти таку угоду або зобов'язання не застосовувати патент проти цієї сторони. + +Якщо Ви передаєте ліцензований витвір, свідомо грунтуючись на патентнії ліцензії та при цьому Відповідний Вихідний Код витвору не доступний нікому для копіювання безкоштовно і відповідно до умов Даної Ліцензії через загальнодоступний сервер або іншими легкодоступними методами, Ви повинні або (1) зробити так щоб Відповідний Вихідний код був доступний, або (2) позбавити себе патентної ліцензії на даний конкретний витвір, або (3) домовитися про те, відповідним Даної Ліцензії чином, розширення патентної ліцензії для подальших одержувачів. "Свідомо грунтуючись" означає, що Ви знаєте умови патентної ліцензії, але передача ліцензованого витвору в країні, або використання ліцензованого витвору одержувачами в країні, порушить один або більше патент, який можна ідентифікувати, в цій країні і який Ви маєте підстави вважати дійсним. + +Якщо відповідно до або у зв'язку з конкретною операцією або угодою Ви передаєте, тиражуєте, шляхом налагодження передачі, ліцензованого витвору і надаєте однієї зі сторін патентну ліцензію після отримання ліцензованого витвору, даючи їм право використовувати, тиражувати, модифікувати або передавати конкретну копію ліцензійного витвору, в цьому випадку патентна ліцензія, яку Ви надаєте автоматично розширює свою дію на всіх одержувачів ліцензованого витвору заснованого на ній. + +Патентна ліцензія є "дискримінаційною", якщо вона не описує свою сферу застосування, не допускає здійснення або обумовлена ​​нездійсненням одного або більше прав, які явно видаються відповідно до Даної Ліцензії. Ви не можете передавати ліцензований витвір якщо Ви - одна зі сторін угоди з третьою стороною, яка займається дистрибуцією ПЗ, згідно з якою Ви робите виплату третій особі в залежності від обсягу здійснюваних передач, і згідно з якою третя особа видає, будь-якій стороні, яка отримує ліцензований витвір від вас, дискримінаційну патентну ліцензію (а) разом з копіями ліцензованого витвору, переданими Вами (або копіями, зробленими з тих копій), або (б) разом з конкретними продуктами або збірками, що містять ліцензований витвір, в разі якщо Ви не вступили в угоду або патентна ліцензія не надано до 28 березня 2007р. + +Ніщо в Даній Ліцензії не повинно бути розглянуто як виняток або обмеження будь-яких можливих ліцензії або інших способів протидії порушенню, які в інших випадках можуть бути доступні для Вас у відповідності до придатного патентному закону. + +12. Чи не відмовляти свободу інших + +Умови, накладені на Вас (судовим наказом, угодою або як-небудь ще), які суперечать умовам Даної ліцензії, не звільняють Вас від умов, накладених Даною Ліцензією. Якщо Ви не можете передавати ліцензований витвір так, щоб задовольняти одночасно Вашим зобов'язанням згідно Даної Ліцензії та будь-яким іншим релевантним зобов'язаннями, то Ви можете не поширювати її зовсім. Наприклад, якщо Ви згодні з умовами, що зобов'язують Вас збирати авторські відрахування з тих, кому ви передаєте Програму, за право подальшої передачі, єдиний спосіб задовольнити цим умовам і Даною Ліцензією буде повне утримання від передачі Програми. + +13. Використання спільно з Стандартною Громадською Ліцензією редакції Афферо + +Незважаючи на будь-які інші положення цієї Ліцензії, Ви маєте дозвіл підключати або поєднувати будь-який ліцензований витвір, ліцензований відповідно до версії 3 Загальної публічної ліцензії редакції Афферо (Affero) в єдиний комбінований витвір і передавати його. Умови даної Ліцензії не втрачають застосовуватися до тієї частини витвору, яка спочатку знаходилася під нею, але спеціальні вимоги глави 13 редакції Афферо, що стосуються взаємодії через комп'ютерну мережу, будуть застосовуватися до всього об'єднаного витвору. + +14. Виправлені версії Даною Ліцензією + +Фонд вільної платформи Java може публікувати поновлені та / або нові версії Загальної Громадської Ліцензії GNU час від часу. Такі переглянуті версії будуть схожі за духом нинішньої версії, але можуть відрізнятися в деталях, щоб відповідати новим проблемам. + +Кожна версія має інший номер. Якщо Програма встановлює, що конкретний номер версії GNU GPL "або будь-яка пізніша версія" застосовується до неї, Ви можете дотримуватися умов або версії зазначеного номера, або більш пізніх версій, опублікованих Фондом вільної платформи Java. Якщо програма не вказує номер версії GNU GPL, Ви можете вибрати будь-яку версію, коли-небудь опубліковану Фондом. + +Якщо програма уточнює, що уповноважений представник може вирішувати яка з майбутніх версій GNU GPL може бути використана, публічна заява цього представника про прийняття версії на постійній основі дає Вам право вибрати цю версію для Програми. + +Наступні версії ліцензії можуть давати Вам додаткові або інші дозволи. Незважаючи на це, додаткові зобов'язання не покладаються на автора або правовласника як результат Вашого вибору наступних версій. + +15. Відмова від гарантій + +НА УЧАСТЬ У ПРОГРАМІ НЕ ПОШИРЮЮТЬСЯ НІЯКІ ГАРАНТІЇ ДО РАМОК, ПЕРЕДБАЧЕНИХ ЗАКОНОДАВСТВОМ, ЯКЩО ІНШЕ НЕ ВСТАНОВЛЕНО ПИСЬМОВО. ПРАВОВЛАСНИК І / АБО ІНШІ СТОРОНИ НАДАЮТЬ ПРОГРАМУ «ЯК Є», БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ (ЗАЗНАЧЕНІ АБО НА УВАЗІ), В ТОМУ ЧИСЛІ, АЛЕ НЕ ОБМЕЖУЮЧИСЬ, УЯВНОЮ ҐАРАНТІЄЮ ТОВАРНОГО СТАНУ ПРИ ПРОДАЖУ І ПРИДАТНОСТІ ДЛЯ ПЕВНОГО ЗАСТОСУВАННЯ. ВЕСЬ РИЗИК ЯК ЩОДО ЯКОСТІ, ТАК І ПРОДУКТИВНОСТІ ПРОГРАМИ ВИ НЕСЕТЕ. ЯКЩО У ПРОГРАМІ ВИЯВЛЕНО ДЕФЕКТ, ВИ НЕСЕТЕ ВАРТІСТЬ ОБСЛУГОВУВАННЯМ, ЛАГОДЖЕННЯ АБО ВИПРАВЛЕННЯ. + +16. Обмеження відповідальності + +НІ В ЯКОМУ РАЗІ, ЯКЩО НЕ ПОТРІБНО ВІДПОВІДНИМ ЗАКОНОМ АБО ПИСЬМОВИМИ УГОДИ, ЖОДЕН З ПРАВОВЛАСНИКІВ АБО СТОРІН, ЗМІНЮВАТИ І ТАКОЖ ПЕРЕДАВАТИ ПРОГРАМУ, ЯК БУЛО ДОЗВОЛЕНО ВИЩЕ, НЕ НЕСТИ ВІДПОВІДАЛЬНІСТЬ ЗА ШКОДУ, У ТОМУ ЧИСЛІ ЗАГАЛЬНИЙ, КОНКРЕТНИЙ, НЕПЕРЕДБАЧЕНІ АБО ЗБИТКИ, ЩО ВИПЛИВАЮТЬ ІЗ ВИКОРИСТАННЯ АБО НЕМОЖЛИВОСТІ ВИКОРИСТАННЯ ПРОГРАМИ (В ТОМУ ЧИСЛІ, АЛЕ НЕ ОБМЕЖУЮЧИСЬ ВТРАТОЮ ДАНИХ АБО НЕВІРНО ОБРОБКОЮ ДАНИХ, АБО ВТРАТИ, ВСТАНОВЛЕНІ ВАМИ АБО ТРЕТІМИ ОСОБАМИ, АБО НЕМОЖЛИВІСТЬ ВИКОРИСТАННЯ ПРОГРАМИ З ІНШИМИ ПРОГРАМАМИ), НАВІТЬ У ВИПАДКУ ЯКЩО ПРАВОВЛАСНИК АБО ІНША СТОРОНА БУЛА ПОВІДОМЛЕНА ПРО МОЖЛИВІСТЬ ТАКОГО ЗБИТКУ . + +17. Інтерпретація глав 15 и 16 + +Якщо відмова від гарантії або обмеження відповідальності представлені вище не можуть бути виконані згідно їх умов, які розглядають суди повинні застосувати місцевий закон, який найбільш наближений до абсолютного відмови від будь-якої громадянської відповідальності у зв'язку з Програмою, крім випадків коли гарантія або прийняття відповідальності супроводжує копію Програми за плату. + +КІНЕЦЬ УМОВ + +Як застосувати ці умови до Ваших Новим Програмами + +Якщо Ви розробляєте нову програму і хочете щоб вона була максимально корисна громадськості, кращий спосіб домогтися бажаного - зробити програму вільним ПЗ, яке кожен зможе поширювати і вносити зміни на умовах. + +Для цього укомплектуйте програму нижченаведеними повідомленнями. Найбезпечніше приєднати їх до початку кожного файлу вихідних кодів для найбільш ефективного вказівки відсутності гарантій; кожен файл повинен, принаймні, мати лінію авторських прав і покажчик на знаходження повного списку повідомлень. + +<назва програми і короткий опис того, що вона робить> +Copyright (C) <рік> <ім'я автора> +Це програма є вільним програмним забезпеченням. Ви можете розповсюджувати та / або модифікувати її відповідно до умов Загальної публічної ліцензії GNU, опублікованої Фондом Вільного Програмного Забезпечення, версії 3 або, за Вашим бажанням, будь-якої наступної версії. +Ця програма розповсюджується із сподіванням, що вона буде корисною, але БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, в тому числі гарантій ТОВАРНОГО СТАНУ ПРИ ПРОДАЖУ і ПРИДАТНОСТІ ДЛЯ певного ЗАСТОСУВАННЯ. Дивіться Загальної Публічної Ліцензії GNU для отримання додаткової інформації. +Ви повинні були отримати копію Загальної публічної ліцензії GNU разом з програмою. У разі її відсутності, подивіться . +Так само додайте інформацію про те, як можна зв'язатися з вами по електронній і звичайній пошті. + +Якщо програма взаємодіє з користувачем за допомогою терміналу, зробіть так, щоб вона виводила коротке повідомлення на зразок нижченаведеного при запуску в інтерактивному режимі: + +<назва програми> Copyright (C) <рік> <ім'я автора> +Це програма поширюється БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ; для отримання додаткової інформації наберіть show w. Це вільне програмне забезпечення, і Ви можете розповсюджувати її у відповідності з конкретними умовами; для отримання +додаткової інформації наберіть show c. +Гіпотетичні команди show w і show c повинні показувати відповідні частини Загальної публічної ліцензії. Звичайно, команди Вашої програми можуть бути іншими; в разі графічного інтерфейсу користувача, Ви можете використовувати діалогове вікно "Про програму>. + +Так само, в разі необхідності, Вам слід отримати від приймаючої (якщо Ви працюєте програмістом) чи навчального закладу (якщо навчаєтесь) письмову відмову від авторських прав на програму. Для додаткової інформації про це, а також про застосування та виконання умов GNU GPL, дивіться . + +Загальна громадська ліцензія GNU не дозволяє включення Вашої програми в власницьке ПЗ. Якщо Ви хочете цього, використовуйте Малу Загальної Публічної Ліцензії GNU (GNU Lesser General Public License, GNU LGPL) замість цієї ліцензії, але, будь ласка, прочитайте спочатку . diff --git "a/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/05_\320\222\320\270\320\274\320\276\320\263\320\270_\320\264\320\276_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md" "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/05_\320\222\320\270\320\274\320\276\320\263\320\270_\320\264\320\276_\321\205\320\276\321\201\321\202\320\270\320\275\320\263\321\203.md" new file mode 100644 index 00000000..3c799d2d --- /dev/null +++ "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/05_\320\222\320\270\320\274\320\276\320\263\320\270_\320\264\320\276_\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/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/index.md" "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/index.md" new file mode 100644 index 00000000..85b9b3d7 --- /dev/null +++ "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/10_\320\224\320\265\321\202\320\260\320\273\321\214\320\275\320\276_\320\277\321\200\320\276_EvolutionCMS/index.md" @@ -0,0 +1,44 @@ +Evolution - функціональна, розширина і зручна система розробки сайту (cmf), а також зручна система управління (cms). Це рушій нового покоління, який спочатку був розрахований на створення проектів покоління Веб 2.0 + +## Основні особливості ## +- інтуїтивно зрозумілий інтерфейс системи управління +- проста мова шаблонів +- повний контроль HTML-коду, який дозволяє реалізувати будь-який дизайн +- зручне дерево документів +- інтегрований механізм роботи з ajax +- вбудована підтримка семантичних URL (SEF) +- управління користувачами +- поділ менеджерів і веб-користувачів +- створення груп користувачів +- створення груп документів з обмеженим доступом як для відвідувачів, так і менеджерів +- ефективна робота з документами +- публікація та скасування публікації документа, в тому числі в зазначений час +- підтримка документів різних типів (MIME) +- створення додаткових параметрів різних типів (текстове поле, чекбокси, випадає і т.д.) +- вбудований механізм SEO (управління ключовими словами і мета-тегами) +- відмінна розширюваність (за допомогою фрагментів, плагінів і модулів) + +## Стандартні розширення: ## + +**DocLister** -ідеальне рішення для виведення новинних стрічок, списків товарів. Є можливість працювати з довільними таблицями. +З коробки доступні фільтри, розширення, різні типи сортування за стандартними полями системи і TV-параметрами. + +**DLMenu**, **Wayfinder** - інструмент організації меню. Дає можливість організації як простого, так багаторівневого меню, що випадає. Легко змінюється і налаштовується. + +**FormLister**, **eForm** - керує роботою форм в CMS. Дозволяє організувати будь-яку форму і її обробку. Може просто відправити на пошту введену інформацію або обробити для отримання якогось результату -- допустимо, створити новий документ із заповненою інформацією. + +**Jot** - механізм комментування між користувачами. + +**DLCrumbs**, **Breadcrumbs** - створення на сайті ланцюгових посилань («хлібні крихти»). + +**AjaxSearch** - пошук по сайту з використанням Ajax. + +Велика кількість готових доповнень на нашому сайті і офіційному репозиторії. + +## Ліцензія ## + +Evolution CMS поширюється під ліцензією GNU / GPL, що дозволяє використовувати цю CMS безкоштовно без обмежень і дає можливість працювати з відкритим кодом (opensource). + +## Вимоги ## + +PHP 5.6 або старше. MySQL 4.1.x або старше. diff --git "a/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/index.md" "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/index.md" new file mode 100644 index 00000000..79c1e1fb --- /dev/null +++ "b/ua/01_\320\227\320\260\320\263\320\260\320\273\321\214\320\275\320\260 \321\226\320\275\321\204\320\276\321\200\320\274\320\260\321\206\321\226\321\217/index.md" @@ -0,0 +1,3 @@ +У цьому розділі міститься загальна інформація про Evolution CMS. В основному вона буде корисна тим, хто тільки починає своє знайомство з цією CMS. Хоча і для фахівців тут знайдеться багато цікавого. + +Якщо ви хочете розібратися в тому, що вам може запропонувати EVO, то рекомендуємо вам читати все в тому порядку, який існує. Якщо виникли якісь питання чи матеріал здався вам недостатньо розкритим, то краще за все звернутися до спільноти. На основі ваших запитань ми постійно покращуємо наші матеріали, а значить їх якість залежить від вас. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\226_\321\200\320\276\320\273\321\226_\321\226_\320\263\321\200\321\203\320\277\320\270.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\226_\321\200\320\276\320\273\321\226_\321\226_\320\263\321\200\321\203\320\277\320\270.md" new file mode 100644 index 00000000..4fd467f0 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\270\320\262\320\275\321\226_\321\200\320\276\320\273\321\226_\321\226_\320\263\321\200\321\203\320\277\320\270.md" @@ -0,0 +1,79 @@ +Використовуючи ролі, групи документів і зв'язок між користувачами і групами документів, ви можете контролювати кожен аспект управління вашим сайтом. + +## Перед тим як розпочнете + +Переконайтеся, що в розділі «Конфігурація системи» на вкладці «Користувачі» для параметра «Використовувати права доступу» встановлено значення «Так» + +## Термінологія + +Для подальшого розуміння давайте домовимося про терміни: + +* Документ - основний елемент ( «сторінка») в Evolution CMS. Кожен документ може бути в одній або декількох групах документів. +* Група документів - всі документи, які з якої-небудь причини поміщаються в одну групу. Наприклад, це можуть бути розділи сайту (продукти, портфоліо або сервіси). Група документів може бути пов'язана з однією або декількома групами користувачів. +* Користувач - об'єкт, що містить інформацію про конкретного користувача, таку як ім'я, пароль і т.д. + Кожен користувач може бути в будь-якій кількості груп, але при цьому його роль може бути тільки одна - адміністратор, редактор і т.д. Дозволи для користувачів визначаються його роллю. +* Роль. Як уже згадувалося, роль визначає дозвіли для користувача, якому призначена ця роль. +* Група користувачів - користувачі, яким необхідний доступ до тих же груп документів. Група користувачів може бути пов'язана з однією або декількома групами документів. + +Як все це працює разом? Ролі визначають, що користувачеві дозволено робити, а групи користувачів в поєднанні з групами документів визначають, з якими документами може працювати користувач. + +Припустимо, у вас є сайт для поширення програмного забезпечення, яке підтримує ваша компанія. Ви вирішили, що сайт буде виглядати так: + +* Головна +* Новини +* Продукти + * Ігри + * Графічні утиліти + * Управління проектом +* Підтримка + * Запитання-Відповіді + * Форуми + * Контакти + * Чат підтримки +* О нас + * Наша історія + * Наша філософія + * Наші люди + +## Ролі + +Для прикладу нам знадобляться ці ролі: + +* Адміністратори сайту - будуть керувати користувачами і загальної конфігурацією сайту. +* Розробники - писатимуть код і працювати з модулями, плагінами, сніппетами чанками і тв-параметрами +* Дизайнери - будуть відповідати за зовнішній вигляд і разположення сторінок сайту. Будуть працювати з шаблонами, чанками і CSS. +* Редактори контенту - будуть відповідати за зміст сторінок. Працюватимуть з документами. +* Коректори - зможуть редагувати, але не зможуть створювати і видаляти документи. + +## Групи документів + +Розглянемо, як будуть групуватися документи на сайті. + +* Корпоративні - сторінки, які стосуються компанії в цілому, такі як сторінки «Про нас» і Головна сторінка. +* Продукт - сторінки, посвячені окремим продуктам. +* Підтримка - сторінки, що містять списки поширених запитань або контактну інформацію компанії. + +## Группи користувачів + +Групи користувачів, до яких будуть належати користувачі: + +* Маркетинг - буде обробляти корпоративні сторінки +* Продукти - працюватимуть зі сторінками, які належать до продуктів компанії. +* Підтримка - подбають про сторінки підтримки. +* Коректори - матимуть доступ до всіх документів (але вони будуть обмежені дозволами, наданими своєю роллю). + +### Важлива примітка + +Користувач може належати будь-якій кількості груп користувачів, але йому може бути присвоєна тільки одна роль. Наприклад, якщо ви хочете, щоб один з коректорів також був редактором документа підтримки, вам доведеться створити іншого користувача для входу в систему і призначити цього користувача групі користувачів підтримки. + +Пам'ятайте, що Ролі визначають, що саме ЩО користувач може зробити. Призначені для користувача групи призначають ДОКУМЕНТАМ, із якими користувач може працювати, але він може виконувати тільки те, що йому дозволить РОЛЬ. + +## Зв'язок між групами користувачів і групами документів + +Тепер потрібно зв'язати групи користувачів і групи документів, до яких ми хочемо дати їм доступ. + +Наприклад, група користувачів "Коректори" буде підключена до всіх груп документів, оскільки їх робота буде полягати у виправленні помилок в документах. Група користувачів "Маркетинг" повинна мати доступ до груп "Корпоративні" і "Підтримка". І, звичайно, група користувачів "Продукти" повинна бути підключена до групи документів "Продукти". + +При створенні документа він повинен бути прив'язаний до відповідної "групи" документів. Аналогічно робимо і з користувачами - у міру створення їм призначаються певні ролі. Потім користувачі додаються до відповідних груп користувачів. Тільки користувачі з груп, підключених до відповідної групи документів даного документа, можуть мати доступ до цього документа. І при цьому, не дивлячись на те, що користувач має доступ до документа, він може робити з ним тільки те, що дозволяє його індивідуальна роль. + +Таким чином, система ролей, користувачів і груп документів дозволяє здійснювати досить тонке поділ прав між користувачами і розділами сайту. \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/20_\320\241\320\272\320\270\320\264\320\260\320\275\320\275\321\217_\320\277\320\260\321\200\320\276\320\273\321\216_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260_\321\226_\321\200\320\276\320\267\320\261\320\273\320\276\320\272\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/20_\320\241\320\272\320\270\320\264\320\260\320\275\320\275\321\217_\320\277\320\260\321\200\320\276\320\273\321\216_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260_\321\226_\321\200\320\276\320\267\320\261\320\273\320\276\320\272\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..a9a332c4 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/20_\320\241\320\272\320\270\320\264\320\260\320\275\320\275\321\217_\320\277\320\260\321\200\320\276\320\273\321\216_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260_\321\226_\321\200\320\276\320\267\320\261\320\273\320\276\320\272\321\203\320\262\320\260\320\275\320\275\321\217.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/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/30_\320\235\320\260\320\262\321\226\321\211\320\276_\320\277\320\276\321\202\321\200\321\226\320\261\320\275\321\226_\320\263\321\200\321\203\320\277\320\270_\321\226_\321\200\320\276\320\273\321\226.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/30_\320\235\320\260\320\262\321\226\321\211\320\276_\320\277\320\276\321\202\321\200\321\226\320\261\320\275\321\226_\320\263\321\200\321\203\320\277\320\270_\321\226_\321\200\320\276\320\273\321\226.md" new file mode 100644 index 00000000..9cc5f8d4 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/30_\320\235\320\260\320\262\321\226\321\211\320\276_\320\277\320\276\321\202\321\200\321\226\320\261\320\275\321\226_\320\263\321\200\321\203\320\277\320\270_\321\226_\321\200\320\276\320\273\321\226.md" @@ -0,0 +1,11 @@ +Основна причина для налаштування користувачів і груп адміністратора - мати можливість контролювати доступ до документів в дереві документів. Користувачі інтерфейсу адміністратора зберігаються окремо від веб-користувачів з міркувань безпеки. + +Веб-користувач не може увійти в / manager /, а користувач Admin не може увійти на веб-сайт. + +Ролі адміністратора також використовуються для управління доступом до функцій управління системою. + +Кожному користувачеві адміністратору призначається роль, яка контролює, які дозволи йому надаються в областях адміністрування системи, користувачів і управління документами. Користувачеві Admin може призначатися тільки одна роль. + +Користувачі-адміністратори призначаються одній або декільком группам користувачів. + +При цьому «Групи менеджерів», і «Групи веб-користувачів» можна привласнити для тієї ж «групи документів». \ 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/08_\320\234\320\276\320\264\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\321\213/index.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/index.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/08_\320\234\320\276\320\264\320\270\321\204\320\270\320\272\320\260\321\202\320\276\321\200\321\213/index.md" rename to "ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/10_\320\220\320\264\320\274\321\226\320\275\321\226\321\201\321\202\321\200\320\260\321\202\320\276\321\200\320\270/index.md" diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/20_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\320\264\321\200\321\203\320\266\320\275\321\226\321\205_URL.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/20_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\320\264\321\200\321\203\320\266\320\275\321\226\321\205_URL.md" new file mode 100644 index 00000000..956827a5 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/20_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\320\264\321\200\321\203\320\266\320\275\321\226\321\205_URL.md" @@ -0,0 +1,66 @@ + +

    Налаштування файлу .htaccess для Evo для задіяння можливостей модуля Apache mod_rewrite

    +

    Evo підтримує дружні URL завдяки файлу .htaccess з певними налаштуваннями. Щоб використовувати цей функціонал, ваш сайт повинен працювати на сервері Apache з включеним модулем mod_rewrite, також, звичайно, ім'я файлу треба змінити з ht.access на .htaccess. Нижче наведено рекомендований шаблон для додаткових налаштувань:

    +
    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
    RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
    RewriteRule .* - [F,L]
    # Rewrite domain.com -> www.domain.com -- used with SEO Strict URLs plugin
    #RewriteCond %{HTTP_HOST} .
    #RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
    #RewriteRule (.*) http://www.example.com/$1 [R=301,L]
    # 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 if supported.
    #php_flag zlib.output_compression On
    #php_value zlib.output_compression_level 5
    +
    Якщо ви використовуєте сервер IIS, дружні URL вам все одно будуть доступні, однак оптимальні рішення вимагають використання платних додаткових модулів для IIS.
    +

    Загальні налаштування для файлу .htaccess

    +

    Перш за все, директива RewriteBase повинна вказувати на папку, в яку встановлена ​​Evo. Наприклад, якщо ви встановили Evo в підпапку "evo", для цієї директиви потрібно вказати значення "/evo":

    +
    1
    RewriteBase /evo
    +

    Зверніть увагу, що в останньому блоці директив директиви стиснення gzip закоментовані, так як в деяких середовищах вони потенційно можуть викликати проблеми. Проте, для того, щоб веб-сервер працював швидше, останні два рядки слід розкоментувати, як показано нижче:

    +
    1
    2
    3
    # Reduce server overhead by enabling output compression if supported.
    php_flag zlib.output_compression On
    php_value zlib.output_compression_level 5
    +

    Вам також може знадобитися зробити ваші URL нечутливими до регістру, для цього слід додати до директиви, що знаходиться в секції "For Friendly URLs" (це директиви для управління дружніми URL), директиву NC:

    +
    1
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA,NC]
    +

    Якщо ви віддаєте перевагу, щоб на вашому сайті до введених URL-адресами завжди додавався префікс "www.", Тобто щоб ваші URL завжди показувалися у вигляді "www.example.com", тоді нижченаведений розділ повинен бути змінений таким чином:

    +
    1
    2
    3
    RewriteCond %{HTTP_HOST} .
    RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
    RewriteRule (.*) http://www.example.com/$1 [R=301,L]
    +

    Якщо ви не використовуєте віртуальні домени і працюєте на локальному комп'ютері, або ви чекаєте оновлення DNS, тобто якщо для доступу до вашого сайту ви використовуєте URL виду "http://10.0.0.1/~myacct", правило перезапису URL слід переписати, як показано нижче. При цьому, коли ви перейдете на віддалений сервер, не забудьте відновити все, як було.

    +
    1
    2
    3
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /~myacct/index.php?q=$1 [L,QSA]
    +

    Захист адмінки

    +

    Якщо ви хочете обмежити доступ до адмінки тільки конкретним IP-адресам, але при цьому вам потрібно дозволити доступ до компонентів, що належать до відкритої частини сайту, наприклад, до капчі, використовуйте наступні директиви. Ці директиви повинні бути поміщені в файл .htaccess, що знаходиться в папці адмінки:

    +
    1
    2
    3
    4
    5
    6
    7
    # Дозволяємо доступ до адмінки тільки конкретним IP-адресам
    Options +FollowSymlinks
    RewriteEngine On
    # Блокування по IP. Для IP-адрес, вказаних в списку, доступ буде відкритий.
    RewriteCond %{REMOTE_ADDR} !^(192\.168\.0\.128)$
    RewriteCond %{REQUEST_FILENAME} !/includes/veriword\.php$
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    +
    Перший рядок ("Options +FollowSymlinks") може знадобитися закомментування в деяких ситуаціях, де подібний рядок вже присутній в кореневій папці сайту, щоб уникнути помилок сервера.
    +

    Керування сеансами

    +

    Якщо ваш сайт працює в середовищі, в якій мають місце проблеми, пов'язані з агресивним збиранням сміття, про що можуть свідчити несподівані і часті виходи з адмінки, то можна налаштувати місцезнаходження для файлів сеансів, щоб прибрати їх з глобальної та розділяється папки tmp/session, де вони знаходяться за замовчуванням:

    +
    Якщо ви додали ці директиви до вашого файлу .htaccess, їх також треба додати в файл .htaccess, що знаходиться в папці адмінки.
    +
    1
    2
    php_value session.save_path /path/to/your/web/content/sessions/
    php_value session.gc_maxlifetime 28800
    +

    и

    і

    За замовчуванням .htaccess для Evo налаштований так, що він виключає зі сфери дії правил перезапису URL папку /assets і папку адмінки. Якщо у вас є документ Evo, який використовується як файл CSS, вам треба буде змінити один рядок, щоб дозволити перезапис URL в папці /assets, якщо ваш файл CSS знаходиться саме там.

    +
    1
    RewriteRule ^(manager|assets) - [L]
    +

    Це слід змінити так

    +
    1
    RewriteRule ^manager - [L]
    +
    Підказки
    +

    Якщо вам все-таки потрібно зберегти деякі папки як виключення, то правила перезапису можна відключити, наприклад, в папках /assets/images і /assets/snippets за допомогою наступної директиви:

    +
    1
    RewriteRule ^(manager|assets/images|assets/snippets) - [L]
    +
    +

    Часовий пояс

    +

    На деяких серверах можуть бути не налаштовані часові пояси, що може викликати проблеми. Можна спробувати налаштувати часовий пояс наступним чином (повний список підтримуваних часових поясів знаходиться тут).

    +
    1
    php_value date.timezone Europe/Moscow
    +

    або

    +
    1
    SetEnv TZ America/Chicago
    +

    Кодування символів за замовчуванням

    +

    В принципі, щоб коректно обробляти символьні кодування, вам потрібно відповідним чином виправити ваш код і базу даних. Однак якщо вам дуже хочеться, то ви можете прочитати довідку про директиву AddDefaultCharset і подумати про використання цієї директиви в наступному вигляді:

    +
    1
    AddDefaultCharset utf-8
    +

    Директива register_globals

    +
    Попередження
    +

    Якщо у вашого сервера включена директива register_globals (і відключити її неможливо), біжіть звідси на новий хостинг якомога швидше. Так-так, серйозно.

    +

    Починаючи з Evo версії 1.2.1, директива register_globals на вашому сервері повинна бути відключена, інакше Evo не працюватиме.

    +
    +

    Якщо директива register_globals включена, то ваш сайт практично зі стовідсотковою ймовірністю рано чи пізно буде зламаний, а якщо він перебуває на розділеному хостингу, так тим більше. Це все одно, що дати маленькій дитині погратися з зарядженим пістолетом і сподіватися, що він не натисне на курок. Якщо ви платите за хостинг менше 15 доларів на місяць, значить, ваш хостинг розділяється. Детальніше про директиву register_globals див. тут.

    +

    Щоб перевірити, що ця директива відключена, відкрийте адмінку, потім увійдіть в меню "Система" і виберіть пункт "Системна інформація", потім на сторінці яка відкрилася, виберіть посилання phpinfo (). На сторінці, що відкрилася за цим посиланням, знайдіть інформацію про директиву register_globals. Її локальне значення має бути OFF. Якщо ж її основне значення дорівнює OFF, то турбуватися з приводу цієї директиви вам не потрібно.

    +

    Якщо директива register_globals викликає помилку сервера 500:

    +

    Це означає, що ваш сервер забороняє встановлювати директиви PHP в файлі .htaccess. У цьому випадку відповідні зміни треба внести безпосередньо в файл php.ini. Якщо ви використовуєте платний хостинг, зв'яжіться з його техпідтримкою, щоб вони це зробили. Треба сказати, що не всі сервери дозволяють використовувати локальні файли php.ini, до того ж, вони повинні містити всі налаштування PHP (а не тільки цю), інакше всі не вказані директиви PHP будуть встановлені в значеннях за замовчуванням. Детальніше про встановлення директив PHP див. На сайті www.php.net.

    +
    1
    2
    # Отключаем register_globals, так як у нас корявий хостинг, що не піклується про безпеку
    php_flag register_globals Off
    +

    Розбираємося з примхами Internet Explorer

    +

    Якщо на вашому сайті використовуються файли .htc, то деякі сервери можуть їх віддавати з неправильним MIME-типом. Щоб вирішити цю проблему, можна додати наступний рядок. Це критично важливо для користувачів MS Windows XP SP2:

    +
    1
    2
    # Налаштовуємо MIME-тип для файлів .htcдля Internet Explorer
    AddType text/x-component .htc
    +

    Наступні директиви дозволяють ліквідувати мерехтіння екрану при використанні IE в разі накладення різних файлів CSS. Після того, як ви їх введете, вам може знадобитися примусове перезавантаження сторінки, щоб побачити зміни.

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # Виправляємо мерехтіння екранудля 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 дають можливість налаштовувати конфігурацію сервера на рівні окремої папки, якщо у вас немає доступу до головного конфігураційного файлу сервера Apache httpd.conf. Взагалі-то, при кожній можливості для директив сервера слід використовувати головний конфігураційний файл, так як використання файлів .htaccess призводить до збільшення часу обробки сторінок сайту.
    diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/30_\320\237\320\265\321\200\320\265\320\275\320\265\321\201\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/30_\320\237\320\265\321\200\320\265\320\275\320\265\321\201\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203.md" new file mode 100644 index 00000000..aad0926b --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/30_\320\237\320\265\321\200\320\265\320\275\320\265\321\201\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203.md" @@ -0,0 +1,70 @@ +

    Даний посібник базується на типовому сценарії, коли розробка сайту ведеться локально (наприклад, з використанням пакета XAMPP), а потім сайт розгортається на типовому віддаленому сервері (обычно LAMP - Linux, Apache, MySQL, PHP).

    +

    Нижчеописані дії будуть працювати на будь-якому сервері з незначними змінами, а то і взагалі без них, за винятком файлу .htaccess і реквізитів для доступу до вашої базі даних.

    +
      +
    1. +

      Встановіть сайт локально, після чого перейменуйте файл ht.access в .htaccess і внесіть необхідні зміни так, щоб він вказував на підпапку, в яку ви встановили ваш сайт, як показано в наступному прикладі:

      +
      +
      + + + + + + + +
      +
      1
      +
      2
      +
      3
      +
      4
      +
      5
      +
      6
      +
      +
      +
      RewriteEngine On
      +
      RewriteCond %{REQUEST_FILENAME} !-f
      +
      RewriteCond %{REQUEST_FILENAME} !-d
      +
      # Якщо ви встановили Evo в підпапку, наступний рядок треба змінити
      +
      # щоб вона відповідала фактичному шляху до кореня сайту
      +
      RewriteRule ^(.*)$ /path/to/subdirectory/index.php?q=$1 [L,QSA]
      +
      +
      +
      +
      +

      Потім перейменуйте файл ht.access в папці /manager в .htaccess. Це відключить двигун RewriteEngine для цієї папки.

      +
    2. +
    3. +

      Після того, як ви виконали розробку сайту локально (при цьому всі використовувані шляху рекомендується зробити відносними від кореня сайту, щоб зберегти переносимість), зробіть копію файлу .htaccess і назвіть її .htaccess.local. Після цього в файлі .htaccess слід змінити шлях до кореня сайту, щоб він відповідав шляху на віддаленому сервері (зазвичай для цього достатньо видалити шлях до папки). Файл .htaccess в папці /manager слід залишити як є.

      +
    4. +
    5. +

      Потім зробіть копію файлу manager /includes/config.inc.php і назвіть її config.local.inc.php, після чого відредагуйте файл config.inc.php, щоб занести в нього налаштування з'єднання з базою даних на віддаленому сервері (база даних на віддаленому сервері повинна бути створена заздалегідь).

      +
    6. +
    7. +

      Скопіюйте на віддалений сервер папки /mnager і /assets і файли index.php і .htaccess (створені вами файли, що містять в назві .local., Копіювати не потрібно). Якщо це оновлення, а не нова установка, то перед цією дією рекомендується зберегти начальну папку / assets віддаленого сайту, щоб потім можна було перезалити туди весь наявний у вас контент (наприклад, зображення і шаблони), якщо при копіюванні щось виявиться перезаписано.

      +
    8. +
    9. +

      Якщо віддалений веб-сервер працює не під тим користувачем, який є власником створених вами файлів, то для наступних папок і файлів вам потрібно буде змінити права доступу на 777:

      +
        +
      • /assets/cache (а також для всіх файлів в цій папці, що мають розширення .php)
      • +
      • /assets/images
      • +
      • /assets/files
      • +
      • /assets/flash
      • +
      • /assets/media
      • +
      +
    10. +
    11. +

      Створіть дамп вмісту вашої локальної бази даних (використовуючи менеджер резервних копій або будь-який клієнт MySQL, наприклад, phpMyAdmin). У phpMyAdmin при цьому слід вибрати тип файлу SQL. Створений вами дамп бази даних збережіть у файлі на вашому локальному комп'ютері. Перед створенням дампа бази даних рекомендується видалити весь вміст таблиць логів, тому що на вашому новому сервері вони все одно будуть непотрібні, зате місця вони займають багато. Потім імпортуйте створений вами файл дампа в базу даних на віддаленому сервері. У phpMyAdmin для цього слід вибрати використовувану вами базу даних і імпортувати в неї ваш файл дампу.

      +
    12. +
    13. +

      У вашому браузері зайдіть за адресою http://доменне_імя_вашого_сайту/ manager. Увійдіть в адмінку, потім зайдіть в розділ "Конфігурація" і обновіть шляхи для браузера файлів (налаштування "Шлях до файлів" і "URL до файлів" у вкладці "Файл-браузер") і для менеджера файлів (налаштування "Шлях для файл-менеджера "у вкладці" Файл-менеджер ").

      +
    14. +
    15. +

      Якщо ви не можете увійти в адмінку, то, швидше за все, у вас вказані неправильні настройки з'єднання з базою даних в файлі manager/includes/config.inc.php. Спробуйте виправити їх на локальному комп'ютері і перезавантажити цей файл знову. Якщо це не допомагає, спробуйте зайти за адресою http://доменне_імя_вашого_сайту/install і виконати призначене для користувача встановлення. В цьому випадку можна буде перевірити різні налаштування з'єднання з базою даних, поки з'єднання не буде встановлено. Якщо код вашого сайту на локальному комп'ютері не пошкоджено, ви після цього зможете завершити встановлення. В якості альтернативи можна занести правильні настройки (якщо ви їх знаєте) в файл manager/includes/config.inc.php і завантажити його на віддалений сервер.

      +
    16. +
    17. +

      Перевірте працездатність вашого сайту на віддаленому сервері. Він повинен працювати точно так само, як і локальна копія вашого сайту.

      +
    18. +
    19. +

      Якщо все одно залишилися якісь проблеми, спробуйте на новому сайті запустити інсталятор(установник), вибравши опцію оновлення.

      +
    20. +
    diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/40_\320\222\321\226\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\260_\320\275\320\260_\321\202\320\265\321\205\320\276\320\261\321\201\320\273\321\203\320\263\320\276\320\262\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/40_\320\222\321\226\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\260_\320\275\320\260_\321\202\320\265\321\205\320\276\320\261\321\201\320\273\321\203\320\263\320\276\320\262\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..5c0b6cf3 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/40_\320\222\321\226\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\260_\320\275\320\260_\321\202\320\265\321\205\320\276\320\261\321\201\320\273\321\203\320\263\320\276\320\262\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,20 @@ +

    Іноді вам може знадобитися відключити ваш сайт на техобслуговування, щоб оновити програмне забезпечення сервера або оновити якісь частини вашого сайту, наприклад, шаблони, сторонні компоненти тощо. В Evo процедура відключення вашого сайту на техобслуговування (або його переведення в режим технічного обслуговування) досить проста.

    +

    Щоб відключити ваш сайт на техобслуговування, зробіть ось що:

    +
      +
    1. Увійдіть в адмінку Evo.
    2. +
    3. Увійдіть в меню "Система" і виберіть опцію "Конфігурація".
    4. +
    5. Після того, як завантажиться розділ конфігурації сайту, виберіть у ньому вкладку "Сайт".
    6. +
    7. Знайдіть налаштування під назвою "Статус сайту" і виберіть опцію "Оффлайн".
    8. +
    9. Натисніть на кнопку "Зберегти".
    10. +
    +

    Починаючи з цього моменту, ваш сайт відключений на техобслуговування, і відвідувачі побачать сторінку, що повідомляє про відключення сайту (про те, як налаштувати цю сторінку, див. нижче). Якщо вам потрібно зробити сайт знову доступним, це теж можна легко зробити. Для цього слід повторити вищенаведені дії, але на кроці 4 треба буде вибрати опцію "Онлайн".

    +

    Налаштування сторінки, що повідомляє про недоступність сайту

    +

    Щоб налаштувати сторінку, що повідомляє про недоступність сайту, зробіть ось що:

    +
      +
    1. Якщо ви цього ще не зробили, створіть окремий документ, що містить інформацію, яку ви хочете показати відвідувачам, коли ваш сайт відключений на техобслуговування. При створенні цієї сторінки слід вимкнути прапорець "Показувати в меню", а також переконатися, що сторінка опублікована.
    2. +
    3. Потім увійдіть в меню "Система" і виберіть опцію "Конфігурація".
    4. +
    5. Після того, як завантажиться розділ конфігурації сайту, виберіть у ньому вкладку "Сайт".
    6. +
    7. Знайдіть налаштування під назвою "Сторінка 'Сайт недоступний'" і введіть туди ID створеної вами сторінки.
    8. +
    9. Натисніть на кнопку "Зберегти".
    10. +
    +

    Тепер ваша сторінка, що повідомляє про недоступність сайту, налаштована і готова для застосування!

    diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/50_\320\236\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217 Evo.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/50_\320\236\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217 Evo.md" new file mode 100644 index 00000000..c90180c2 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/50_\320\236\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217 Evo.md" @@ -0,0 +1,102 @@ +

    Процес оновлення Evo складається з майже тих же самих кроків, що і процес установки. Але з одним серйозним винятком. А саме, при оновленні вине видаляєте і не перезаписуєте конфігураційний файл config.inc.php на вашому сервері. Ці кроки такі:

    +
      +
    1. +

      Якщо ви змінили будь-які сніпети або плагіни, що поставляються за замовчуванням, то або заздалегідь їх перейменуйте, або, коли в процесі роботи майстра установки ви доберетеся до кроку, на якому вас запитають, які сніпети і плагіни встановити, вимкніть відповідні їм прапорці. Справа в тому, що в процесі оновлення всі сніппети, що поставляються за замовчуванням, перезаписуються, щоб гарантувати наявність у вас їх останніх версій. Тому, якщо ви внесли якісь зміни в будь-який з фрагментів, що поставляються разом з ядром Evo, і не хочете, щоб в процесі оновлення стався його перезапис, то рекомендується зберегти цей сніпет під іншим ім'ям.

      +
    2. +
    3. +

      Зробіть резервну копію вашого сайту. Для цього скачайте всі файли з сервера на ваш комп'ютер за допомогою FTP-клієнта, а потім за допомогою утиліти phpMyAdmin (або будь-якої іншої утиліти для роботи з базами даних) створіть дамп всієї бази даних, використовуваної вашим сайтом, і теж збережіть його на вашому комп'ютері.

      +
    4. +
    5. +

      Переконайтеся, що ви все зберегли в резервнії копії! Так-так, серйозно!

      +
    6. +
    7. +

      Скачайте і розпакуйте zip-архів з новою версією Evo.

      +
    8. +
    9. +

      Завантажте вміст папки, яку ви розпакували з архіву, на сервер. При цьому всі старі файли слід просто перезаписати. Архів з дистрибутивом Evo не повинен містити конфігураційний файл config.inc.php в папці /manager/includes/, тому він не повинен перезаписати. Однак все-таки не буде зайвим перед завантаженням файлів на сервер перевірити, що конфігураційного файлу в дистрибутиві немає, а також переконатися, що ви зберегли ваш поточний конфігураційний файл config.inc.php в резервній копії (ви ж не забули створити резервну копію, так?).

      +
    10. +
    11. +

      Тепер запустіть ваш веб-браузер і відкрийте index.php, що знаходиться в папці /install/.

      +
    12. +
    13. +

      Дотримуйтесь кроків майстра установки. На цей раз, відразу ж після прийняття ліцензійної угоди слід вибрати опціюОновити.

      +
      Зауваження: Якщо ваша версія MySQL старіша, ніж 4.1, виберіть опцію Розширене Оновлення та встановіть кодування, яке використовується при з'єднанні, як cp1251_koi8, так як в версіях MySQL до 4.1 єдине дозволене значення настройки charset_name – це cp1251_koi8. Додати нове кодування можна за допомогою редагування файлу sql/convert.cc в вихідному коді MySQL, так що використання інших кодувань теж можливе.
      +
    14. +
    15. +

      Якщо ви видалили ваші старі файли замість того, щоб їх перезаписати, вам може знадобитися змінити права доступу до файлів і папок, зазначеним в інструкції з установки, щоб дозволити до них доступ для запису, проте, якщо в цьому виникне необхідність, майстер установки вам про це повідомить.

      +
    16. +
    17. +

      На відповідному кроці майстра установки не забудьте відключити прапорці для тих ресурсів, які ви змінили, якщо ви їх не перейменували заздалегідь.

      +
    18. +
    19. +

      Як тільки ви доберетеся до кроку майстра установки, де знаходиться прапорець, що пропонує видалити папку /install/, переконайтеся, що цей прапорець включений (це виключить повторний запуск процесу установки або оновлення ким-небудь іншим, хто може завдати шкоди вашому сайту).

      +
    20. +
    21. +

      Після того, як ви завершили роботу майстра установки, знову зайдіть на ваш сервер через FTP і перевірте, що папка /install/ видалена. Якщо це не так, видаліть її вручну.

      +
    22. +
    23. +

      Ну і нарешті, відновіть доступ тільки для читання у вашого конфігураційного файлу config.inc.php в папці /manager/includes/. Якщо ви заздалегідь записали значення прав доступу, встановіть його, або ж спробуйте встановити значення 444. Цереально важливо, так як це допоможе захистити ваш сайт від злому.

      +
    24. +
    25. +

      Завершіть роботу майстра оновлення.

      +
    26. +
    27. +

      Як тільки у вас все знову буде працювати, зайдіть в адмінку Evo і підправте імена ваших плагінів і сніпетів, якщо ви там щось міняли на кроці 1.

      +
    28. +
    29. +

      Тепер все зроблено. Ви тільки що оновили Evo.

      +
    30. +
    +

    Альтернативный спосіб

    +

    При завантаженні нової версії Evo поверх старої у вас можуть залишитися старі файли, які більше не використовуються. Кожен з членів команди розробки Evo віддає перевагу своєму способу оновлення, який йому подобається, але тут буде наведений спосіб з мінімальним часом недоступності сайту:

    +
      +
    1. +

      Скачайте всі файли з вашого сайта.

      +
    2. +
    3. +

      Створіть резервну копію вашої бази даних.

      +
    4. +
    5. +

      Взагалі, створіть резервну копію старої версії вашого сайту, щоб потім у разі потреби її можна було відновити.

      +
    6. +
    7. +

      Створіть нову локальну папку і назвіть її, припустимо, EvoNew (або як вам більше подобається).

      +
    8. +
    9. +

      Розпакуйте файли нової версії Evo в цю папку.

      +
    10. +
    11. +

      З створеної вами резервної копії скопіюйте конфігураційний файл config.inc.php в папку /manager/includes/.

      +
    12. +
    13. +

      Скопіюйте всі сніпети, модулі, плагіни та інші подібні компоненти, які вам потрібні або які ви змінили, в відповідні частини папки EvoNew.

      +
    14. +
    15. +

      Скопіюйте всі зображення, файли css, файли шаблонів, документи тощо у відповідні частини папки EvoNew.

      +
    16. +
    17. +

      Перейменуйте нові папки і файли в index.php-new, /manager-new/ і /assets-new/. Папку /install/ НЕ перейменовуйте. Завантажте на сервер ці папки (в тому числі папку /install/) і файл index.php-new. Це займе певний час.

      +
    18. +
    19. +

      Тепер перейменуйте вже існуючі на вашому сайті файли і папки в index.php-old, /manager-old/ і /assets-old/.

      +
    20. +
    21. +

      Починаючи з цього моменту, ваш сайт не працює.

      +
    22. +
    23. +

      Перейменуйте нові папки і файли в index.php, /manager/ і /assets/.

      +
    24. +
    25. +

      Запустіть з вашого браузера скрипт yoursite.com/install, після чого виберіть опцію Відновити. Подробиці дивіться в інструкції з установки.

      +
      Зауваження: Якщо ваша версія MySQL старіша, ніж 4.1, виберіть опцію Розширене Оновлення та встановіть кодування, яке використовується при з'єднанні, як cp1251_koi8, так як в версіях MySQL до 4.1 єдине дозволене значення настройки charset_name – это cp1251_koi8. Додати нове кодування можна за допомогою редагування файлу sql/convert.cc в вихідному коді MySQL, так що використання інших кодувань теж можливо.
      +
    26. +
    27. +

      Починаючи з цього моменту, ваш сайт повинен знову працювати. Якщо ж він не працює, перейменуйте папки назад!

      +
    28. +
    29. +

      Якщо ви все зробили правильно, тепер можна видалити всі папки з -old.

      +
    30. +
    31. +

      Вам також слід зробити локальну резервну копію старої версії сайту і локальну резервну копію нової версії сайту.

      +
    32. +
    diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/10_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/10_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" new file mode 100644 index 00000000..279d119f --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/10_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" @@ -0,0 +1,20 @@ +## Додавання користувача з панелі адміністрування ## +Щоб додати веб-користувача, виконайте наступні дії: +* Увійдіть в інтерфейс адміністратора Evolution CMS. +* Потім натисніть "Користувачі" - "Управління веб-користувачами" - "Новий веб-користувач". +* Заповніть необхідну інформацію у відповідних полях. Ім'я користувача, пароль і адрес електронної пошти є обов'язковими. +* Додатково ви можете встановити домашню сторінку входу на вкладці "Налаштування користувача" і ввести ідентифікатор документа (ідентифікатор документа можна легко побачити на панелі дерева документів зліва) +* Виберіть групу користувачів, в яку ви хочете визначити користувача. +* Натисніть кнопку «Зберегти», щоб зберегти користувача. + +**Примітка.** Паролі не зберігаються в текстовій формі, тому зверніть увагу на пароль, якщо він вам необхідний в подальшому. Пароль не можна подивитися, його можна тільки змінити. + +Тепер, коли ви успішно створили обліковий запис веб-користувача і призначили користувача групі, можна захистити документи, призначивши їх відповідній групі документів. + +## Налаштування входу в систему ## +Щоб користувачі могли отримувати доступ до захищених сторінок, ви повинні надати їм можливість входу в систему. Для цього можна використовувати сніпети [FormLister](https://docs.evo.im/04_extras/formlister/060_avtorizaciya-polzovatelej.html)(рекомендовано) або WebLogin. + +**Примітка.** Сторінки з включеним кешем будуть кешувати елементи при вході в систему. Краще не кешувати критичні для користувача елементи. + +## Додавання користувача з веб-інтерфейсу ## +Для реалізації реєстрації на сайті скористайтеся сніпетом [FormLister](https://docs.evo.im/04_extras/formlister/070_registraciya-polzovatelej.html)(рекомендовано) або WebSignup diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/20_\320\223\321\200\321\203\320\277\320\270_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262_\321\226_\320\263\321\200\321\203\320\277\320\270_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/20_\320\223\321\200\321\203\320\277\320\270_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262_\321\226_\320\263\321\200\321\203\320\277\320\270_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262.md" new file mode 100644 index 00000000..95534d68 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/20_\320\223\321\200\321\203\320\277\320\270_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262_\321\226_\320\263\321\200\321\203\320\277\320\270_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262.md" @@ -0,0 +1,13 @@ +## Перш ніж ви почнете ## +Переконайтеся, що в розділі "Конфігурація системи" на вкладці "Користувачі" для параметра "Використовувати права доступу" встановлено значення "Так". + +## Створення груп ## +Щоб створити веб-користувача і групи документів, виконайте наступні дії: +* Увійдіть в інтерфейс адміністратора Evolution CMS. +* Перейдіть з меню "Користувачі" в "Права доступу для веб-користувачів" +* На вкладці "Групи веб-користувачів" введіть ім'я групи і натисніть кнопку "Виконати". +* Щоб створити групу документів, перейдіть на вкладку "Групи ресурсів". Подібно веб-групі, ви повинні ввести ім'я групи документів і натиснути кнопку відправки. Потім сторінка оновиться, показуючи нову групу документів. + +Тепер, коли ми створили веб-користувача і групу документів, потрібно зв'язати їх разом. Для цього перейдіть на вкладку «Зв'язки груп користувачів і документів». Натисніть кнопку "Додати групу", щоб призначити групу документів групі веб-користувачів + +Ви можете використовувати кнопку "Видалити", щоб пізніше видалити групу. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/30_\320\235\320\260\320\262\321\226\321\211\320\276_\320\277\320\276\321\202\321\200\321\226\320\261\320\275\321\226_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226_\321\226_\320\263\321\200\321\203\320\277\320\270.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/30_\320\235\320\260\320\262\321\226\321\211\320\276_\320\277\320\276\321\202\321\200\321\226\320\261\320\275\321\226_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226_\321\226_\320\263\321\200\321\203\320\277\320\270.md" new file mode 100644 index 00000000..f3b7d901 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/30_\320\235\320\260\320\262\321\226\321\211\320\276_\320\277\320\276\321\202\321\200\321\226\320\261\320\275\321\226_\320\262\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226_\321\226_\320\263\321\200\321\203\320\277\320\270.md" @@ -0,0 +1,18 @@ +Налаштування веб-користувачів і груп потрібна для поділу доступу веб-користувачів до різних розділів сайту + +З міркувань безпеки в Evolution CMS користувачі діляться на два типи: веб-користувачі і користувачі панелі адміністрування (менеджери). + +**Веб-користувач не може увійти в панель адміністрування сайту.** + +### Правила ### +* Менеджерам призначаються свої групи користувачів. +* Веб-пользователям назначаются свои веб-группы. +* При цьому «Групи користувачів» і «Групи веб-користувачів» можуть бути додані до однієї і тієї ж «Групи документів». + +**Примітки.** + +Документ буде приватним, якщо група документів, до якої він належить, пов'язана з групою користувачів. + +Якщо документ присвоюється групі документів, яка ще не пов'язана з групою користувачів, цей документ буде опублікований. + +Документи, які є приватними для менеджерів, не будуть закриті для веб-користувачів, якщо група документу не привласнена якійсь іншій групі веб-користувачів. 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/index.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/index.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/index.md" rename to "ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/60_\320\222\320\265\320\261-\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226/index.md" diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/index.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/index.md" new file mode 100644 index 00000000..da3952dd --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\232\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\320\276\320\274/index.md" @@ -0,0 +1,65 @@ +## Інтерфейс адміністратора ## + +Інтерфейс адміністратора можна знайти в каталозі "manager". Цей каталог можна перейменувати в будь-який зручний для вас час після установки Evolution. + +### Щоб увійти в інтерфейс адміністратора вашого сайту: ### +- Перейдіть на свій веб-сайт, ввівши своє доменне ім'я, потім додайте до адреси "/manager/, наприклад www.yourdomain.com/manager/ +- Введіть своє ім'я користувача та пароль + +### Щоб змінити пароль: ### +Після того, як ви успішно увійшли в інтерфейс адміністратора, ви можете змінити свій пароль, натиснувши на ім'я користувача у верхньому меню. + +### Щоб вийти з системи: ### +У меню користувача в правому верхньому кутку сторінки натисніть «Вихід». + +### Змінити ім'я папки manager: ### +Через FTP / SFTP тощо. Перейдіть на сервер веб-сайту і змініть папку "manager" на обране ім'я. +Наприклад: OLD = www.yourdomain.com/manager/, NEW = www.yourdomain.com/xyz124*25/ +Зверніть увагу: після зміни імені папки не переглядайте зовнішній інтерфейс (наприклад, www.yourdomain.com), так як ви отримаєте повідомлення про помилку - спочатку вам потрібно увійти в систему. + +## Введення в інтерфейс адміністратора ## +Інтерфейс адміністратора розділений на 3 області + +- Вгорі: головне меню і меню адміністратора +- Зліва: Дерево ресурсів +- Справа: головна область адміністратора + +Крім того, є плаваюча панель з кнопками дій. Кнопки змінюються відповідно до режиму, в якому знаходиться інтерфейс адміністратора (редагування контенту, управління користувачами тощо). Плаваюча панель завжди розташовується у верхній частині основної області адміністрування. + +Ви можете змінити розмір лівої області, перетягнувши середню панель вліво або вправо. Уточнимо - шаблон системи управління може бути налаштований адміністратором сайту по-різному. + +### Що таке дерево ресурсів? ### +Це список усіх ресурсів (наприклад, сторінок, веб-посилань) на сайті, розташованих в ієрархічному порядку. Тут ви вибираєте ресурси, які хочете редагувати, переміщати або видаляти. + +Бувають випадки, коли вам потрібно знати ідентифікатор ресурсу. Число в круглих дужках праворуч від назви кожного ресурсу - це ідентифікатор документа. + + +### Контекстне меню ### +Ви можете натиснути правою кнопкою миші ім'я ресурсу в дереві ресурсів, щоб отримати доступ до контекстного меню. Контекстне меню надає швидкий доступ до додаткових дій. Якщо ви віддаєте перевагу лівому кліку, ви можете відкрити контекстне меню, клацнувши лівою кнопкою миші значок ресурсу, який завжди відображається зліва від імені ресурсу. + +Ви можете створювати ресурси і веб-посилання в існуючому ресурсі / контейнері (ресурс з дочірніми елементами називається «контейнер» в Evo), клацнувши правою кнопкою миші на ресурсі / контейнері і вибравши один з елементів «Створити ...» в списку. Якщо ресурс не мав раніше дочірніх ресур, він автоматично буде змінений на контейнер. + +### Завантаження вмісту ### +Ви можете завантажувати контент (наприклад, файли PDF і файли зображень) за допомогою FTP або вбудованого диспетчера файлів Evo. Зображення також можна завантажити за допомогою значка «Зображення» на панелі інструментів редактора документів. + + +Якщо ви використовуєте FTP, бажано копіювати файли в відповідну папку в папці /assets. Наприклад: + +- Для зображень це /assets/images +- Для файлів /assets/files + +### Завантаження файлів і зображень за допомогою File Manager ### +Щоб завантажити файли і зображення: +Натисніть «Управління файлами» в верхньому меню. Відкриється диспетчер файлів. +Виберіть потрібну папку, натисніть «Огляд», щоб знайти файл на локальному ПК, потім натисніть «Завантажити файл». + +### Редагування сторінок ### +Щоб оновити існуючий контент на сайті, вам необхідно: + +- Знайдіть веб-сторінку (названу документом) в дереві документів. +- Натисніть на ім'я документа або клацніть правою кнопкою миші і виберіть «Редагувати». +- Відкрийте сторінку для редагування. +- Відредагуйте сторінку. +- Збережіть сторінку. + +Потім ви можете просто оновити сторінку, щоб переглянути будь-які зміни. В Internet Explorer використовуйте CTRL + F5, якщо меню не відображаються належним чином або новий контент не відображається. Якщо у вас як і раніше виникають проблеми з переглядом нового вмісту, очистіть кеш сервера, натиснувши кнопку "Очистити кеш" в головному меню сайту. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\242\320\265\321\200\320\274\321\226\320\275\320\276\320\273\320\276\320\263\321\226\321\217.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\242\320\265\321\200\320\274\321\226\320\275\320\276\320\273\320\276\320\263\321\226\321\217.md" new file mode 100644 index 00000000..3949eac8 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/01_\320\242\320\265\321\200\320\274\321\226\320\275\320\276\320\273\320\276\320\263\321\226\321\217.md" @@ -0,0 +1,20 @@ +## Шаблон ## +Шаблон - основна частина сторінки сайту, яка визначає її оформлення. Шаблон не вимагає особливого синтаксису і являє собою звичайний HTML-код (а можливо XHTML або інший) з викликом необхідних чанків, параметрів і сніпетів. + +Кількість шаблонів найчастіше залежить від зовнішнього вигляду і функціоналу сайту. Як правило, для різних розділів і сторінок сайту створюються свої шаблони. + +Наприклад, буде логічним створити різні шаблони для товару і для новини і прикріпити до них різні ТB-параметри. Це дозволить контент-менеджеру швидше і правильніше заповнити сайт. Також це істотно полегшить роботу програміста, якщо буде потрібно зробити якісь стрічки новин або товарів. + + +## Чанк ## +Чанк це невеликий шматок HTML-коду або іншої інформації, який можна багаторазово використовувати в шаблоні, іншому чанкові або сніпеті. + +## ТB-параметр ## + +ТB-параметр - елемент, який містить певну інформацію для поточної сторінки. Параметри можна безпосередньо вивести на сторінку або передати сніпету як параметр. + +## Сніпет ### +Сніпет - це код на мові PHP, який виводить результат своєї роботи в тому місці шаблону / чанка, де розміщений виклик цього сніпета. + +Як правило, сніпети використовуються при виведені динамічно мінливого вмісту. +Вони можуть використовуватися для створення меню, коментарів, новинних стрічок, блогів чи будь-якого іншого функціоналу, який можливий на мові php в зв'язці з API системи Evolution. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/01_\320\242\320\265\321\200\320\274\321\226\320\275\320\270.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/01_\320\242\320\265\321\200\320\274\321\226\320\275\320\270.md" new file mode 100644 index 00000000..80396810 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/01_\320\242\320\265\321\200\320\274\321\226\320\275\320\270.md" @@ -0,0 +1,19 @@ +## Введення в термінологію Evolution CMS ## +Evo - дуже гнучка система управління контентом. Її можна налаштувати різними способами. + +Для нових користувачів Evo може здатися незвичним, але є два способи публікації контенту: + +- в основній області вмісту +- в інших областях, званих змінними шаблону (TV-параметри) + +Є ще дві важливі особливості Evo, про які вам потрібно знати: + +- Чанки - це повторно використовувані фрагменти статичного контенту (зазвичай HTML). +Ви можете розмістити чанк в основній області вмісту або в змінній шаблону. +Наприклад, ви можете написати свої контактні дані в чанк, а потім вставити його в різних місцях на сайті. Коли змінюється ваша контактна інформація, потрібно тільки оновити чанк, і все входження автоматично оновляться. + +- Сніпети - це PHP-скрипти, які зазвичай повертають свій висновок назад в браузер, наприклад, для створення меню або пошуку. Сніпети можна викликати і виконувати в шаблоні, основній області вмісту документа, чанку або в змінній шаблону. + +Як правило, чанки або сніпети поміщають безпосередньо в шаблон розробники сайту. + +Користувачі зазвичай вставляють чанки в область вмісту або змінну шаблону. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/10_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/10_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" new file mode 100644 index 00000000..785c1683 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/10_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" @@ -0,0 +1,27 @@ +Створення нового документа / ресурсу +Щоб додати нові сторони / сторінки на веб-сайт, потрібно виконати наступне: + +У меню Адміністратор натисніть Новий ресурс + + +Ви також можете клацнути правою кнопкою миші на пункт меню та вибрати "Створити тут ресурс". + + +З’явиться новий «порожній» документ + + +Змініть поля на вкладці "Налаштування" в документах, де це можливо, і додайте вміст до області вмісту ресурсу за допомогою редактора. + + +На вкладці "Загальні" виберіть місце, куди слід зберегти новий документ, натиснувши піктограму батьківської папки "Ресурс" + + +Піктограма папки змінить свій вигляд при натисканні, вона «відкриється», тепер клацніть на будь-який документ в основному дереві документів. + +Після натискання в батьківському полі ресурсу відображатиметься батьківський (ідентифікатор + ім'я). + + +Примітка: +Якщо ви клацнули правою кнопкою миші в "Дереві документів", щоб створити документ, у документі вже буде інформація про батьківський ресурс + +Завершивши редагування документа / ресурсу, натисніть «Зберегти», щоб зберегти новий ресурс \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/20_\320\240\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/20_\320\240\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" new file mode 100644 index 00000000..35207020 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/20_\320\240\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" @@ -0,0 +1,22 @@ +Редагування ресурсу +Редагування існуючого документа +Клацніть на документі в дереві документів. Підсумок сторінки з’явиться на правій панелі. + + + +Якщо ваш сайт налаштовано на це, ви також побачите попередній перегляд сторінки, щоб ви могли перевірити, чи знайшли ви правильну сторінку. + +Редагування вмісту документа +Клацніть на документ, який ви хочете відредагувати, а потім натисніть "Редагувати" в піктограмах Дія. + + + +Після натискання кнопки редагована сторінка оновиться, і ви отримаєте щось подібне. + + + +Тепер ви можете використовувати редактор WYSIWYG для редагування вмісту сторінки. + + + +Після завершення натисніть Зберегти. \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/30_\320\237\321\203\320\261\320\273\321\226\320\272\320\260\321\206\321\226\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/30_\320\237\321\203\320\261\320\273\321\226\320\272\320\260\321\206\321\226\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" new file mode 100644 index 00000000..29799e07 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/30_\320\237\321\203\320\261\320\273\321\226\320\272\320\260\321\206\321\226\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" @@ -0,0 +1,32 @@ +Публікація ресурсу +Публікація сторінки / документа / ресурсу +Коли ви створюєте новий ресурс, він може бути неопублікованим (тобто його не можна переглянути на передній частині веб-сайту) за замовчуванням. + +Причинами цього можуть бути: + +Ваш тип облікового запису користувача може не мати дозволу на публікацію документів - зверніться до адміністратора +Сторінки не налаштовані на публікацію за замовчуванням, це налаштування в конфігурації системи + + +Якщо документ не опубліковано, він відображатиметься у дереві документів "курсивом червоного кольору", що означає, що він ще не опублікований. + + + +Щоб опублікувати ресурс +Клацніть на документ, який ви хочете відредагувати, а потім натисніть "Редагувати" в піктограмах Дія. + + + +Клацніть на вкладку Параметри сторінки. + + + +Позначте кнопку «Опубліковано» або встановіть дату в полі «Дата публікації» + + + +Після завершення натисніть Зберегти. + + + +Тепер документ відображатиметься в дереві документів темним кольором. \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/40_\320\237\320\265\321\200\320\265\320\274\321\226\321\211\320\265\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/40_\320\237\320\265\321\200\320\265\320\274\321\226\321\211\320\265\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" new file mode 100644 index 00000000..647bafa1 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/40_\320\237\320\265\321\200\320\265\320\274\321\226\321\211\320\265\320\275\320\275\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" @@ -0,0 +1,64 @@ +Перемістіть ресурс +Спосіб 1: +У "Дереві документів" натисніть на ресурс, який потрібно перемістити, а потім натисніть "Перемістити" в піктограмах Дія. + + + +Завантажиться сторінка "Перемістити ресурс". + + + +У дереві документів виберіть документ, який буде батьківським. Після вибору огляд покаже новий батьківський ресурс. + + + +Якщо ви задоволені своїм вибором, натисніть "Зберегти". + + + + + +Спосіб 2: +На вкладці "Загальні" виберіть місце, куди потрібно зберегти документ, натиснувши піктограму батьківської папки "Ресурс" + + + +Піктограма папки змінить свій вигляд при натисканні, вона "відкриється", тепер клацніть на документі в основному дереві документів, де потрібно зберегти сторінку. + +Після натискання в батьківському полі ресурсу відображатиметься батьківський (ідентифікатор + ім'я). + + + +Завершивши редагування документа / ресурсу, натисніть «Зберегти», щоб зберегти новий ресурс + + + + + +Спосіб 3: +Клацніть правою кнопкою миші на документі, який потрібно перемістити, та виберіть у контекстному меню пункт «Перемістити ресурс». + + + +Завантажиться сторінка "Перемістити ресурс". + + + +У дереві документів виберіть документ, який буде батьківським. Після вибору огляд покаже новий батьківський ресурс. + + + +Вибравши нового батька, натисніть "Зберегти". + + + + + +Як перемістити сторінку на верхній рівень? +Переміщення ресурсу на верхній рівень (корінь) в основному те саме, що переміщення будь-якого іншого ресурсу. + +У цьому випадку ви просто вибираєте "Назва сайту" у верхній частині "Дерева документів" як батьківський ресурс. + + + +Вибравши "Назва сайту", натисніть "Зберегти". \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/50_\320\222\320\270\320\261\321\226\321\200_\321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/50_\320\222\320\270\320\261\321\226\321\200_\321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" new file mode 100644 index 00000000..24ae2b97 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/50_\320\222\320\270\320\261\321\226\321\200_\321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" @@ -0,0 +1,10 @@ +Після створення веб-сторінок переконайтеся, що використовується правильний шаблон. + +- Виберіть документ у дереві меню, яке ви хочете змінити. +- Натисніть кнопку «Змінити» та перейдіть на вкладку «Загальні». + +Шаблон вже буде вибраний - це налаштування за замовчуванням, яке встановлене в системній конфігурації. + +Виберіть потрібний вам шаблон у розкриваючому меню "Шаблон". Сторінка оновиться, щоб включити ТВ-параметри, призначені новому шаблону. + +Після вибору правильного шаблону натисніть кнопку "Зберегти". \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/60_\320\232\320\265\321\210\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/60_\320\232\320\265\321\210\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..09aeba67 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/10_\320\240\320\265\321\201\321\203\321\200\321\201\320\270/60_\320\232\320\265\321\210\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,24 @@ +Кешування для документа можна включити за допомогою опції "Кешований" на вкладці "Налаштування сторінки". + +Якщо ви включите кешування документа, це означає, що документ і його вміст будуть виконуватися тільки при першому запиті документа. +Потім результати роботи «зберігаються» в кеші і витягуються звідти по будь-яким подальшим запитам. + +** Це може прискорити завантаження сторінок, оскільки сніпети не виконуватимуться при кожному запиті. ** + +Якщо ви очистите кеш сайту, натиснувши "Очистити кеш" в інтерфейсі адміністратора, ви побачите новий контент, тому що сторінка буде розібрана знову. + +## Кешування сніпетів ## +Сніпети, якщо ви викликаєте їх за допомогою конструкції [[Snippet]] будуть кешуватися. + +Ви можете змусити сніпет працювати кожен раз при завантаженні сторінки, навіть якщо сам документ кешується, за допомогою виклику: +```[!Snippet!]``` +(Зверніть увагу, дужки замінені на знаки оклику) +Такий сніпет буде виконуватися при кожному відвідуванні сторінки. + + +Як правило на сайтах з низьким трафіком всі сніпети запускаються некешувальними. Але якщо ви хочете оптимізувати свій сайт, ви можете викликати сніппети, чиї дані рідко змінюються в режимі кешування. Це прискорить сайт. + +## Кешування і розробка ## +Коли ви розробляєте сайт, найкраще відключити кешування в конфігурації системи. Це може допомогти вам, так як в процесі розробки дані часто змінюються і необхідно завжди бачити актуальну версію роботи сніпетів і документів. + +Потім, після того, як ваш сайт почне працювати, ви можете встановити для деяких фрагментів режим кешування. \ 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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/10_What_are_@_Bindings.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\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/10_Document_Variables.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/10_What_are_@_Bindings.md" rename to "ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\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/10_Document_Variables.md" diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\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/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\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" new file mode 100644 index 00000000..999d3ff4 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\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-код, який буде просто вставлений на сторінку. + +Вони дуже зручні для зберігання загального вмісту. Наприклад, якщо футер містить номер телефону, а номер змінюється, вам потрібно внести зміни тільки в чанк, а не на кожну сторінку сайту. + +## Плейсхолдери ## + +Найбільш часто плейсхолдери потрібні для темізаціі виведення сніпета. + +``` +
    +

    [+title+]

    +
    [+summary+]
    +

    [+link+]

    +
    by [+author+] on [+date+]
    +
    +``` + +Плейсхолдери можуть використовуватися де завгодно в будь-якому HTML-коді. + +Хорошим прикладом цього є сніпет Persinalize. Він просто повертає ім'я веб-користувача в плейсхолдер. + +Але ви можете помістити сніпет один раз в свій шаблон або документ, а потім помістити плейсхолдер в стільки місць, скільки захочете, наприклад, в привітанні у верхній частині сторінки і в розділі «вихід із системи». + +## Комбінуйте! ## + +Використовуючи комбінації фрагментів, ТВ-параметрів і чанків, ви можете зробити свій сайт досить гнучким! Наприклад, у вас може бути сніпет, результати роботи якого будуть залежати від переданих ТВ-параметрів, а зовнішній вигляд буде темізуватись чанками з плейсхолдерамі всередині. + +Детальніше про всі види тегів і їх використання ви можете прочитати в документації розробника. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/index.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/index.md" new file mode 100644 index 00000000..3d00bc19 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/02_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\320\272\320\276\320\275\321\202\320\265\320\275\321\202\320\276\320\274/index.md" @@ -0,0 +1,11 @@ +## Керівництво для допомоги редакторам веб-сайту Evolution CMS ## + +Це керівництво слід використовувати в поєднанні з Керівництвом адміністратора Evo, яке охоплює більш складні теми, такі як + +- Резервне копіювання +- Створення користувачів +- Створення безпечних зон + +При підготовці цього керівництва ми припустили, що ваш веб-розробник вже зробив базову настройку для вашого веб-сайту. + +Відповідно, ми розповімо про основні проблеми адміністрування, з якими ви, ймовірно, зіткнетеся. \ No newline at end of file diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/01_\320\251\320\276_\321\202\320\260\320\272\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/01_\320\251\320\276_\321\202\320\260\320\272\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md" new file mode 100644 index 00000000..fd251a59 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/01_\320\251\320\276_\321\202\320\260\320\272\320\265_\321\210\320\260\320\261\320\273\320\276\320\275.md" @@ -0,0 +1,32 @@ +Шаблон у Evolution CMS - це незмінна частина сторінки сайта, яка визначає її оформлення. Шаблон не потребує особливого синтаксису і являє собою звичайний HTML-код (а можливо XHTML або інший) з викликом необхідних чанків, параметрів і сніпетів. + +Кількість шаблонів залежить від дизайну і функціоналу сайту. Кожен документ в Evolution має прив'язку до конкретного шаблону, що і визначає його кінцевий вигляд. + +Варто згадати також, що існує спеціальний шаблон blank, який не містить ніякого оформлення і не піддається редагуванню. + +## Розташування шаблонів: ## +`` +Елементи - Шаблони +`` + +## Шаблон за замовчуванням ## + +При створенні документа автоматично пропонується шаблон за замовчуванням (якщо інша поведінка не визначена плагінами). +Найзручніше, коли пропонується саме той шаблон, який необхідний найчастіше. Для цього необхідно налаштувати шаблон за замовчуванням: + +Переходимо в налаштування системи управління: +``` +Конфигурація - Сайт +``` +Знаходимо параметр **Шаблон за замовчуванням** і змінюємо на потрібний +Зберігаємо налаштуання. + +## FAQ ## + +Чи є якісь обмеження на шаблони дизайну для сайту? + +Абсолютно ніяких. Evolution дозволяє реалізувати будь-який дизайн. + +## Де можна взяти готові шаблони? ## + +Evolution CMS дозволяє легко використовувати **будь-який** зверстаний HTML-макет, який можна замовити у фахівців або знайти на спеціалізованих сайтах. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/02_\320\251\320\276_\321\202\320\260\320\272\320\265_\321\207\320\260\320\275\320\272.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/02_\320\251\320\276_\321\202\320\260\320\272\320\265_\321\207\320\260\320\275\320\272.md" new file mode 100644 index 00000000..a861b9e4 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/02_\320\251\320\276_\321\202\320\260\320\272\320\265_\321\207\320\260\320\275\320\272.md" @@ -0,0 +1,12 @@ +Чанк в Evolution - це невеликий шматок HTML-коду або іншої інформації, який можна багаторазово використовувати в шаблоні, іншого чанка або сніпета. + +## Створення чанків ## + +Щоб створити чанк, перейдіть в розділ «Елементи» і виберіть «Чанки». Дайте для чанка ім'я та короткий опис, а потім напишіть код HTML, який ви хочете включити в документ. +## Використання чанків ## + +Щоб використовувати чанк, помістіть в потрібному місці конструкцію у вигляді назви чанка, оточеного фігурними дужками +``` +{{MyChunk}} +``` +Більш докладне використання чанків дивіться в Посібнику розробника. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/03_\320\251\320\276_\321\202\320\260\320\272\320\265_\320\242B-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/03_\320\251\320\276_\321\202\320\260\320\272\320\265_\320\242B-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200.md" new file mode 100644 index 00000000..9b908db4 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/03_\320\251\320\276_\321\202\320\260\320\272\320\265_\320\242B-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200.md" @@ -0,0 +1,13 @@ +Що таке ТB-параметри + +ТB-параметр в Evolution CMS - елемент, який містить певну інформацію для поточної сторінки. Їх можна як вивести на сторінку, так і передати для сніпета як параметр. + +Обробка ТB в шаблоні може бути абсолютно різна - віджети, слайдери, таблиці даних, все, що завгодно. +Також у панелі адміністрування - зовшіній вигляд ТB-параметра може бути як просто текстовим полем, так і чекбоксом, списком, таблицею, мульти-полем. + +### Приклад параметра: +``` +[*myParam*] +``` + +Для додаткової інформації про ТB-параметрах радимо відвідати розділ для розробників. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/10_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\321\207\320\260\320\275\320\272\321\226\320\262.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/10_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\321\207\320\260\320\275\320\272\321\226\320\262.md" new file mode 100644 index 00000000..db4ab4a8 --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/10_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\321\207\320\260\320\275\320\272\321\226\320\262.md" @@ -0,0 +1,17 @@ +Чанки - це блоки простого тексту або HTML-розмітки, які вставляються безпосередньо на сторінку. + +Щоб створити чанк, перейдіть в розділ «Управління ресурсами» і виберіть вкладку «Чанки». Дайте чанкові ім'я та короткий опис, а потім напишіть код HTML, який ви хочете включити в документ. + +Щоб використовувати чанк, напишіть ім'я чанка в оточенні фігурних дужок в тому місці шаблону, де ви хочете: +``` +{{MyChunk}} +``` +Чанки корисні для будь-якого вмісту або розмітки HTML, які ви, можливо, захочете повторити на різних сторінках або в різних шаблонах. Це хороший спосіб зберегти код шаблону чистим і незахаращених. + +Загальноприйняте використання для чанків - для утримання нижнього колонтитула. Якщо ви помістите вміст в чанк, потім помістіть теги чанків у колонтитул вашого шаблону, навіть якщо у вас є кілька шаблонів, вам потрібно буде тільки відредагувати вміст колонтитула в одному місці. + +ще одне корисне використання для чанків - шаблонізація виведення фрагментів. Сніпет WebLogin використовує необов'язковий чанк, що містить HTML для форми входу, якщо вам не подобається вид за замовчуванням. Сніпети [[Ditto]] та [[Wayfinder]] також використовують чанки для управління зовнішнім виглядом виведення результатів. + +Хоча чанк не може містити PHP-код, він може містити сніпет і ТB-параметри з PHP-кодом. + +Більш докладне використання чанків дивіться в Посібнику розробника. diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/30_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\321\201\320\275\321\226\320\277\320\265\321\202\321\226\320\262.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/30_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\321\201\320\275\321\226\320\277\320\265\321\202\321\226\320\262.md" new file mode 100644 index 00000000..4f5bdedb --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/30_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217_\321\201\320\275\321\226\320\277\320\265\321\202\321\226\320\262.md" @@ -0,0 +1,45 @@ +Сніпети є однією з найбільш корисних функцій системи Evolution. + +Сніпети використовуються для виведення динамічно мінливого вмісту - меню, коментарів, новинних стрічок, блогів чи будь-якого іншого функціоналу, який можливий на мові php у зв'язці з API системи Evolution. + +У цьому документі обговорюється використання фрагментів. Щоб дізнатися більше про те, як створювати сніпети і як вони працюють, див. Для розробників. + +## Коротко про сніпети ## + +Код сніпета, як правило, зберігається в базі даних. Іноді у сніпета є допоміжні файли. В такому випадку, сніпет діє як інтерфейс між Evo і допоміжними файлами. + +Сніпет, у якого таких файлів немає, взагалі не завантажується в файлову систему сайту. + +Під час встановлення Evolution ви можете побачити список часто використовуваних фрагментів, які будуть встановлені на сайт. Радимо вивчити їх уважніше - це базові сніпети, які покривають масу можливостей вашого сайту. + +## Встановлення сніпетів ## + +- Встановлення з репозиторія. +Зайдіть в "Модулі" - "Управління пакетами", виберіть потрібний вам сніпет і натисніть на кнопку "Встановити". +- Встановлення вручну. +Щоб встановити новий сніпет, увійдіть в інтерфейс адміністратора, перейдіть в розділ "Елементи", виберіть пункт "Сніпети". Натисніть посилання «Новий Сніпет», щоб відкрити форму. Вставте код вашого сніпета, вкажіть йому ім'я і короткий опис. + +Ви можете назвати сніпет так, як вам подобається, просто пам'ятайте, що ім'я, яке ви йому даєте,- це те, як вам потрібно буде називати його пізніше в вашому шаблоні. + +При завантаженні будь-яких допоміжних файлів, які можуть мати сніпети, їх зазвичай поміщають в папку з вихідним ім'ям сніпета в нижньому регістрі, наприклад /assets/snippets/DocLister. + +## Використання сніпетів ## +Припустимо, ми хочемо в шаблоні вивести динамічно створюване меню. Використовуємо для цього сніпет під назвою DLMenu. +``` + [!DLMenu? + &parents=`3` + &sortBy=`id` + &outerTpl=`@CODE: ` + &rowTpl=`@CODE:
  • [+title+]
  • ` + !] +``` +Як ви можете помітити, в сніпет передаються параметри. Як правило, опис цих параметрів є в документації того сніпета, який ви використовуєте. В даному випадку ми вказуємо DLMenu звідки брати документи для меню (&parents=`3`), як їх сортувати (&sortBy=`id`) і яким чином виводити результат роботи - outerTpl и rowTpl. + +## Налаштування виклику сніпетів ## +Виклик сніпета може бути двох видів: [[SnippetName]] або [! SnippetName!]. + +Перша форма - Кешований виклик сніпета. Зазвичай це не проблема. Іноді важливо, щоб висновок сніпета не був кешований. Наприклад, сніпет Login повинен визначити,чи увійшов користувач в систему, а якщо ні, тоді відобразити форму входу. Якщо сторінка буде кешуватися, то сніпет не запускається, і зовнішній вигляд не буде змінюватися. + +Друга форма, яка використовує знаки оклику, викликає запуск сніпета, навіть якщо сторінка була кешована. +###Доповнення### +Є сотні фрагментів, які вже створені і готові для вас. У міру зростання спільноти Evo кількість і різноманітність сніпетів будуть рости і далі. 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/04_\320\241\320\270\321\201\321\202\320\265\320\274\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/index.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/index.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/04_\320\241\320\270\321\201\321\202\320\265\320\274\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/index.md" rename to "ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/03_\320\240\320\276\320\261\320\276\321\202\320\260_\320\267_\321\201\320\270\321\201\321\202\320\265\320\274\320\276\321\216/index.md" diff --git "a/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/index.md" "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/index.md" new file mode 100644 index 00000000..1a4311dd --- /dev/null +++ "b/ua/02_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\203/index.md" @@ -0,0 +1,11 @@ +Ця інструкція призначена для допомоги редакторам у використанні веб-сайта на Evolution CMS. + +Бажано використовувати цей посібник в поєднанні з керівництвом адміністратора, яке охоплює більш складні теми, такі як + +- Резервне копіювання +- Створення користувачів +- Створення шаблонів +- І багато іншого + +При підготовці цього керівництва передбачається, що розробник вже зробив базові налаштування вашого сайту. + diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217/index.md" new file mode 100644 index 00000000..eecdf0c9 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217/index.md" @@ -0,0 +1,18 @@ +
      +
    • Завантажте останню версію системи.

      + +
    • Розархівуйте файли в будь-яку папку на вашому локальному диску.

      + +
    • Подключіться до сайту по FTP і скопіюйте всі файли із локальної директорії на сервер.

      + +
    • Evolution використовує СУБД MySQL. Вам необхідно знати ім'я користувача і код доступу до бази даних, або самостійно створити базу і користувача.

    • + +
    • Наберіть у стрічці вашого браузера ім'я_вашого_сайту/install/. Замість «ім'я_вашого_сайту» введіть домен, за яким сайт доступний у мережі інтернет.

    • + +
    • Дотримуйтеся інструкції майстера установки який появився на екрані.
      +Після завершення работи майстера установки, переконайтеся, що папки install на сервері більше не існує. Якщо це не так, видаліть її вручну.

    • + +
    • Опціонально: перевірте і змініть права доступу до файла config.inc.php в папці /manager/includes на -0444 (r--r--r--) - це дасть захист вашому сайту від можливої атаки.

    • +
    +

    Швидке встановлення

    +

    Використайте installer

    diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/02_Schedule.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/01_\320\232\320\276\320\275\321\201\320\276\320\273\321\214/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/01_If_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/01_If_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" new file mode 100644 index 00000000..9a80e439 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/01_If_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/02_Switch_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/02_Switch_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" new file mode 100644 index 00000000..567ae53c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/02_Switch_\320\276\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/03_\320\246\320\270\320\272\320\273\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/03_\320\246\320\270\320\272\320\273\320\270.md" new file mode 100644 index 00000000..e62e1562 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/03_\320\246\320\270\320\272\320\273\320\270.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` | Коли у вкладеному циклі, змінна батьківського циклу. | diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/04_\320\237\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\321\200\320\276\320\273\321\226_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/04_\320\237\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\321\200\320\276\320\273\321\226_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" new file mode 100644 index 00000000..2b813fd2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/04_\320\237\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\321\200\320\276\320\273\321\226_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" @@ -0,0 +1,46 @@ +Evolution CMS >= 3.2.1 + +Починаючи з версії 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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/index.md" new file mode 100644 index 00000000..aaae705c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/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\320\270/index.md" @@ -0,0 +1,88 @@ +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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/02_\320\250\320\260\320\261\320\273\320\276\320\275/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/02_\320\250\320\260\320\261\320\273\320\276\320\275/index.md" new file mode 100644 index 00000000..eb86dd99 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/02_\320\250\320\260\320\261\320\273\320\276\320\275/index.md" @@ -0,0 +1,113 @@ +Шаблон у Evolution CMS – основна частина сторінки сайту, яка визначає її оформлення. Шаблон не вимагає особливого синтаксису і є звичайним HTML-кодом (а можливо XHTML або іншим) з викликом необхідних чанків, параметрів і сніппетів. + +Кількість шаблонів найчастіше залежить від зовнішнього вигляду та функціоналу сайту. Як правило, для різних розділів та сторінок сайту створюються свої шаблони. Наприклад, буде логічним створити різні шаблони для товару та для новини та прикріпити до них різні ТВ-параметри. Це дозволить контент-менеджеру швидше та правильніше заповнити сайт. Також це суттєво полегшить роботу програміста, якщо потрібно зробити якісь стрічки новин чи товарів. + +Варто згадати також, що існує спеціальний шаблон blank, який не містить жодного оформлення та не піддається редагуванню. + +#### Приклад шаблону: +```` + + + [*pagetitle*] + + + + +
    +
    +

    [*longtitle*]

    + [*content*] +
    +
    + {{footer}} + {{Google}} + + +```` + +Як ми бачимо - це цілком зрозуміла HTML-размітка сторінки в якій використовують спеціальні конструкції. Серед них: + +Чанки - ```` {{footer}}, {{Google}}```` + +Параметри - ````[*pagetitle*], [*content*]```` + +Плейсхолдер - ```` [(site_url)] ```` + +Виклик сніппета - ````[[Wayfinder? &startId=`5` &level=`1`]]```` + +## Створення та редагування шаблону + +Всі шаблони знаходяться в наступному місці: + +Елементи → Шаблони + +Для створення нового шаблону необхідно натиснути на ссилку "новий шаблон", а для редагування існуючого достатньо натиснути на посилання з його назвою. +При створенні шаблону також можна обрати, які TV-параметри йому належать та відсортувати їх так, як необхідно. + +### Blade + +Починаючи з версії Evolution CMS 2.0 з'явилась можливість використовувати шаблонізатор Blade для формування шаблонів сайту. + +Щоб отримати можливість використання Blade для обраного вами шаблону, варто в режимі редагування шаблона додати йому псевдонім, а після цього поставити чекбокс "Створити файл шаблону при збереженні". + +Всі створені шаблони буде поміщено в теку /views/ в корні сайту. Після цього Ви можете працювати з шаблоном використовуючи свій улюблений редактор кода. + +### Створення шаблону в Evolution CMS + +#### Назначення полів + +**Ім'я шаблону** - використовується в списку вибору шаблону. Також може знадобитися для деяких операцій сніппетів, планів, та модулей. Можно використовувати як англійську так і російські мови, а також дефіс, знак підкреслення та пробіл. + +**Опис** - виводиться поруч із назвою шаблону у загальному списку. Використовується лише для опису призначення шаблону та для заповнення не обов'язково. + +**Створити категорію** - дозволяє вибрати існуючу категорію, до якої буде розміщено шаблон. Категорія дає змогу відокремити шаблон від інших у загальному списку. Якщо жодна категорія не вибрана, шаблон потрапить у загальну категорію "Без категорії". + +**Нова категорія** - якщо у списку існуючих категорій немає відповідної, то можна створити її, просто написавши назву в цьому полі. + +**Обмежити доступ до редагування шаблону** - якщо увімкнути прапорець, ніхто, крім адміністраторів, не зможе редагувати цей шаблон. + +**Код шаблону (html)** - сюди розміщується сам вміст шаблону. + + +### Зберігання + +**Зберегти** - створить новий шаблон + +**Відміна** - поверне до списку шаблонів не зберігаючи результати. + +**Створити копію** - з'являється лише в режимі редагування + +**Удалить** - з'являється лише в режимі редагування. + +Evolution дозволяє визначити скільки ще кілька дій після збереження шаблону: + +**Створити новий** - одразу після збереження шаблону відкриється форма для створення нового. Таким чином можна швидко створити серію шаблонів. + +**Продовжити редагування** - після збереження шаблон знову відкриється для редагування. В цьому режимі зручно вносити невеликі правки та перевіряти кінцевий результат. + +**Закрити** - після збереження ми повернемося до загального списку шаблонів. + +## Створення копії шаблону + +Інколи необхідно створити копію існуючого шаблону. Це дуже легко зробити. Для цього необхідно зайти в редагування потрібного шаблону і натиснути кнопку зробити копію. + +Після цього відкриється копія шаблону для редагування. Копія відрізняється тим, що її назвою додається Duplicate of. Вам залишається лише виправити назву на більш відповідну та внести інші необхідні редагування. + +Копія створюється відразу після підтвердження, тому якщо ви натиснете скасування, то у списку шаблонів копія все одно залишиться. + +## Видалення шаблону + +Для видалення необхідно зайти в режим редагування відповідного шаблону та натиснути кнопку "Видалити". + +**Увага!** Шаблони видаляються повністю та можливості їх відновити немає. + +## Шаблон за замовчуванням + +При створенні документа автоматично пропонується шаблон за промовчанням. Для налаштування шаблону за замовчуванням необхідно виконати такі дії: + +- Переходимо в налаштування системи управління : +- Конфігурація → Сайт +- Знаходимо параметр "шаблон за замовчуванням" та обираємо потрібний: +- Зберігаємо налаштування. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/03_\320\247\320\260\320\275\320\272\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/03_\320\247\320\260\320\275\320\272\320\270.md" new file mode 100644 index 00000000..8ba3479e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/03_\320\247\320\260\320\275\320\272\320\270.md" @@ -0,0 +1,129 @@ +Чанк у Evolution - це невелика частина HTML-коду або іншої інформації, який може бути неодноразово використаний в шаблоні, іншому чанку або сніпеті. + +## Використання чанків + +### Варіант 1 +Чанк створюється для будь-яких частин коду, який буде використовуватися кілька разів. +Наприклад, ви можете винести заголовок, підвал, головне меню, крихти. Завдяки цьому, зміни можуть бути зроблені в одному чанку, а не в декількох шаблонах. Це простіше і не має ризику залишити певний шаблон без важливої ​​зміни. +### Варіант 2 +Друге найчастіше використання чанка - шаблони для сніпетів. +Завдяки цьому, контрольний код та дизайн відділяються. Залежно від складності сніпета, кількість шаблонів може відрізнятися. +Наприклад, щоб створити форму зворотного зв'язку, вам може знадобитися 3 основних шаблонів - форма, текст про успішний прийом, текс листа до адміністратора з отриманою інформацією. Для того, щоб чанк бути не тільки частиною HTML-коду, але працював як шаблон, в ньому необхідно зазначити відповідні місця, куди сніпет буде записувати свою інформацію. Роль таких місць виконують плейсхолдери. + +**Приклад вмісту чанка з плейсхолдерами:** +``` +
  • [+wf.linktext+]
  • +``` +Це шаблон, який використовується для пунктів меню. Відповідно [+wf.classes+] и [+wf.linktext+] - плейсхолдери, які будуть замінені сніпетом Wayfinder на використовуваний CSS-клас і назву пункта меню. + +На додаток до цих двох варіантів, чанк може бути використаний для зберігання деякої спеціальної інформації. Наприклад, ви можете зберігати набір параметрів для сніпета (напр. список файлів), який може бути сформований вручну або іншими засоби. + +### Створення та редагування чанка ### + +Всі чанки знаходятся в наступному місці: +``` +Елементи → Чанки +``` +Щоб створити вам потрібно натиснути "Новий чанк", а щоб відредагувати існуючий чанк, достатньо натиснути посилання з його ім'ям. + +## Призначення полів: ## + +**Назва чанка** - використовується для виклику чанка. Ви можете використовувати як англійську, так і російську, а також дефіс і підкреслення. Ви не можете використовувати пробіл! + +**Опис** - виводиться поруч із назвою чанка у загальному списку. Використовується лише для опису призначення чанка і не обов'язкове для заповнення. + +**Створити категорію** - дозволяє вибрати існуючу категорію, в якій буде розміщено чанк. Категорія дозволяє відокремити чанк від інших у загальному списку. Якщо жодна категорія не обрана, чанк потрапляє в загальну категорію "Без категорії". + +**Нова категорія** - якщо у списку існуючих категорій немає необхідної, ви можете створити її, просто написавши ім'я в цьому полі. + +**Обмежити доступ до редагування чанка** - якщо увімкнути прапорець, то ніхто, крім адміністраторів, не зможе редагувати цей чанк. + +**Код чанка (html)** - сюди розміщуємо код чанка. + +**Редактор** - дозволяє увімкнути візуальний редактор. За замовчуванням він вимкнений, але при необхідності ви можете включити. Є також редактори, які дозволяють підсвітити синтаксис. + +### Збереження ### + +З основними кнопками все зрозуміло: + +**Зберегти** - створить новий чанк + +**Відміна** - поверне нас в список чанків без збереження результату. + +**Зробити копію** - з'являється лише в режимі редагування. + +**Вилучити** - з'являється лише в режимі редагування. + +Evolution дозволяє визначити більше дій після збереження чанка: + +**Створити новий** - одразу після збереження чанка відкриється форма для створення нового. Таким чином, ви можете швидко створити серію чанків. + +**Продовжити редагування** - після збереження чанк знову відкриється для редагування. У цьому режимі зручно зробити невеликі зміни і перевіряти остаточний результат. + +**Закрити** - після збереження ми повернемося до загального списку чанків. + +### Створення копії чанка ### +Іноді є необхідним створити копію існуючого чанка. Зробити це дуже просто. Для цього необхідно зайти в редагування потрібного чанка та натиснути кнопку "Зробити копію". + +Після цього відкриється для редагування копія чанка. Копія відрізняється тим, що до її назви додається рядок "Duplicate of...". Вам залишається лише виправити назву на більш відповідну та внести інші необхідні правки. + +Копія створюється відразу після підтвердження, тому якщо ви натиснете скасування, то у списку чанків копія все одно залишиться. + +### Видалення чанка +Для видалення необхідно зайти в режим редагування відповідного чанка та натиснути кнопку Видалити. +Увага! Чанки видаляються повністю та можливості їх відновити немає. + +### Виклик чанка +Існуючий чанк у шаблоні (або іншому чанку) викликається дуже просто. Для цього використовується конструкція у вигляді назви чанка оточеного фігурними дужками: + +``` +{{НазваЧанка}} +``` +### Виклик чанка з параметрами + +Починая з Evolution 1.4.0 в чанки можна передавати параметри. +``` +{{mychank? &firstparam=`value` &secondparam=`value2`}} +``` +Всередині чанка передані параметри можна отримати викликом однойменного плейсхолдера. +``` +[+firstparam+] и [+secondparam+] +``` + +Варто пам'ятати, що назва чутлива до регістру (Mychank і myChank – різні чанки з погляду системи). + +## Приклад шаблону із викликом чанка: ## +``` + + + {{Head}} + + + {{menu}} +
    +
    + {{content}} +
    +
    + {{footer}} + + +``` +Цей приклад шаблону містить лише чанки, але на практиці в ньому також зустрічаються TV-параметри та сніпети. Тому не варто припускати, що чанки необхідно використовувати обов'язково і у великій кількості. + +## API ## +Для отримання вмісту чанка через API використовується метод getChunk. + +### Приклад виклику: +``` +$chunk = $modx->getChunk('НазваЧанка'); +``` + +## FAQ +Я зробив чанк, але він не працює. Чому це може бути? + +Перевірте назву чанка. Воно не повинно містити пробіли, а регістр літер при виклику в точності повинен збігатися з назвою чанка. + +Чи можна викликати чанк у чанку? + +Так. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/04_\320\241\320\275\321\226\320\277\320\265\321\202\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/04_\320\241\320\275\321\226\320\277\320\265\321\202\320\270.md" new file mode 100644 index 00000000..1207e1d8 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/04_\320\241\320\275\321\226\320\277\320\265\321\202\320\270.md" @@ -0,0 +1,71 @@ +### Що таке сніпети ### + +Сніпет — це код на мові PHP, який виводить результат своєї роботи в тому місці шаблону/чанку, де можна викликати цей сніпет. У сніпетах можна передавати будь-які параметри, в тому числі інші сніпети, тв-параметри чи чанки. + +### Для чого потрібні сніпети ### +Як правило, сніпети використовуються для виведення динамічно-змінного вмісту. +Вони можуть використовуватись для створення меню, коментарів, стрічок новин, блогів або будь-якого іншого функціоналу, який можливий мовою php у зв'язці з API системи Evolution. + +### Виклик сніпета ### + +Викликати сніпет можна в будь-якому місці ресурсу. Як правило, зазвичай це відбувається у шаблоні чи чанках. +Вкрай не рекомендується викликати сніпети в полі content, особливо якщо це поле доступне для редагування менеджерам сайту. + +``` +[!mySnippet? ¶m=`Value`!] - виклик, що не кешується +[[mySnippet? ¶m=`Value`]] - кешований виклик +``` + +### Виклик через API ### +``` +$params => array('param' => 'Value'); +$modx->runSnippet('mySnippet', $params); +``` + +### Приклад сніпета ### + +Наприклад зробимо сніпет, що показує дату створення документа в читаному людиною форматі. +Дата створення документа перебуває у системному ТВ-параметрі [\*createdon\*]. +Параметр зберігає дату створення документа у форматі unixtime і виглядає його значення приблизно так: 1144904400. + +``` + 'січня', + '2' => 'лютого', + '3' => 'березня', + '4' => 'квітня', + '5' => 'травня', + '6' => 'червня', + '7' => 'липня', + '8' => 'серпня', + '9' => 'вересня', + '10' => 'жовтня', + '11' => 'листопада', + '12' => 'грудня'); +$output = strftime('%d.%m.%Y',$date); +$date = explode(".", $output); +$month = (int)$date[1]; +$m = $fullMonth[$month]; +$out = $date[0] . ' ' . $m . ' ' . $date[2]; +return $out; +``` + +**Використання.** + +Передамо сніпету ТВ-параметр [\*createdon\*]: +``` +[[ruDate? &date=`[*createdon*]`]] +``` +В результаті ми отримаємо щось подібне: +``` +21 травня 2018 +``` + +### Популярні сніпети ### + +- **DocLister** - дозволяє виводити дані з будь-яких таблиць. Ідеальний для створення стрічок новин, блогів, каталогів товарів або послуг. +- **FormLister** - сніпет для роботи з формами. Прекрасно підходить для форм надсилання повідомлень із сайту, авторизації-реєстрації та будь-якого можливого функціоналу, пов'язаного з особистим кабінетом. +- **phpthumb** - сніпет для створення ескізів зображень, накладання водяних знаків та іншої роботи із зображеннями. +- **JotX** - сніпет для створення коментарів. +- **Sitemap** - генератор sitemap.xml. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/05_\320\237\320\273\320\260\320\263\321\226\320\275\320\270/02_\320\237\320\276\320\264\321\226\321\227_\320\277\320\273\320\260\320\263\321\226\320\275\321\226\320\262.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/05_\320\237\320\273\320\260\320\263\321\226\320\275\320\270/02_\320\237\320\276\320\264\321\226\321\227_\320\277\320\273\320\260\320\263\321\226\320\275\321\226\320\262.md" new file mode 100644 index 00000000..7543e049 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/05_\320\237\320\273\320\260\320\263\321\226\320\275\320\270/02_\320\237\320\276\320\264\321\226\321\227_\320\277\320\273\320\260\320\263\321\226\320\275\321\226\320\262.md" @@ -0,0 +1,894 @@ +## 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 - вміст сторінки +``` + + +## 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 +### 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 - Ім'я '; + $Template->lang['phpwork'] .=''; + } + } + } + $tpl = Template::parseTemplate($Template->getTpl(dirname( __FILE__ ).'/templates/edit.html'),$modx->config); + $tpl = Template::parseTemplate($tpl ,$Template->lang); + echo $tpl; + break; +} +``` +Отже, ми маємо поділ на 2 дії в case. На самому початку ловимо переданий нам $ \ _ REQUEST [ 'action'] + +Дія default відбувається за замовчуванням при завантаженні модуля, коли ніякої action нам не переданий. +Тут виникає питання, що за $params['sectionId'] така. Якщо ви лазили в конфігурації модулів, то могли побачити там схожу картину: +![config](https://raw.githubusercontent.com/0test/docs/master/ru/02_Разработка/07_Elements/20_Modules/7.png) + +Це параметри модуля, особливість Ево. Скрипт модуля завжди їх отримує в масиві $params. Як задати параметр? Для початку треба створити новий модуль. Перейти у вкладку «Властивості» і там задати параметри в форматі json. Нам потрібен тільки 1 параметр, sectionId. У нього будемо писати, з якого розділу брати документи. Заповнюємо властивості + +```php +{ "sectionId": [{"label": "ID родителя", "type": "integer","value": "2","default": "2","desc": "" }]} +``` +Все. Я вказав разділ з id=2. Тепер в тіло модуля пишіть підключення скрипта ядра +```php +include_once('../assets/modules/contentEditor/core.php'); +``` +Заповнюйте назву і опис. Можна сміливо оновлювати сторінку адмінки, модуль буде встановлено. А ми продовжимо розбиратися зі скриптом. + +Як бачите, в дії за замовчуванням ми робимо запит до бази, розбираємо його і в циклі присвоюємо змінної lang [ 'phpwork'] результат роботи, рядок за рядком. А phpwork - нічого не нагадує? Це наш плейсхолдер, заданий в шаблоні. Тобто ми будемо виводити на його місці результати роботи скрипта. + +А як будемо це робити, скажуть ці 2 рядки виклику класу. +```php +$tpl = Template::parseTemplate($Template->getTpl(dirname( __FILE__ ).'/templates/main.html'),$modx->config); +$tpl = Template::parseTemplate($tpl ,$Template->lang); +``` +Принцип роботи: беремо файл main.html і замінюємо в ньому все плейсхолдери на їх значення з відповідних змінних. + +У дії edit ми перевіряємо, чи прийшов пост-запит. Якщо так, то оновлюємо вміст полів в базі і виводимо звіт про роботу, або позитивний, або негативний. Якщо запит не прийшов, малюємо форму. Ловимо переданий нам параметр editDoc, робимо запит, відображаємо поля для редагування і в них поточні значення pagetitle і introtext. + +Пора зробити мовний файл. Якщо ви звернули увагу на код класу, то могли помітити, що підключення мови відбувається по ось такою схемою: +`` `Php +include_once (dirname (__ FILE__). '/lang/'.$lang.'.php') +`` ` +де $ lang це поточна мова системи, взятий з конфіга Ево. + +Керуючись цим, створюємо 2 файли в папці lang: russian-UTF8.php і english.php + +Наведу для прикладу російський файл. Будь-який файл будь-якого іншої мови абсолютно такий же, за винятком, зрозуміло, перекладу. +```php +$_field['store_name'] = "Редактор товаров"; +$_field['module_description'] = "

    Модуль редактирования товаров.

    "; +$_field['close'] = "Закрыть"; +$_field['edit'] = "Редактировать"; +$_field['refresh'] = "Обновить"; +$_field['header'] = "Заголовок"; +$_field['save'] = "Сохранить"; +$_field['table_id'] = "id"; +$_field['table_header'] = "Заголовок"; +$_field['table_header2'] = "Аннотация"; +$_field['table_action'] = "Действия:"; +$_field['tab1_header']='Товары'; +$_field['tab1_description']='Раздел для управления вы можете указать в конфигурации модуля ("Модули" - "Управление модулями")'; +$_field['tab2_header']='О модуле'; +$_field['tab1_text']='Тестовый модуль для просмотра и редактирования товаров'; +$_field['save_success']='Сохранили'; +$_field['save_error']='Ошибка сохранения'; +?> +``` + +Як бачите, всередині масиву $ \ _ field ми створили елементи масиву, ключі яких повністю збігаються з тими плейсхолдерами, які задані в шаблоні main.html. + +Спробуйте запустити модуль. У вас повинні працювати таби, відображатися товари. Але поки що не працює редагування. Давайте це виправимо. + +Подивіться уважно на виклик парсеру при дії edit. Ми викликаємо практично все точно також, за винятком шаблону. Для редагування застосуємо новий шаблон, edit.html. Створіть такий файл в папці templates + +Ось його повний лістинг: +```html + + + + + [+store_name+] + + + + + + + + +

    [+store_name+]

    +
    + +
    +
    +
    + +
    +

    [+tab1_header+]

    + +
    +
    + + + [+phpwork+] + +
    +
    +
    +
    +
    +
    + + +``` + +Шаблон дуже схожий на main.html. Але є нюанси. По-перше ми задали функцію postForm, яка при виклику відправить вміст форми з id = frm. По-друге, ми задали нові кнопки в панелі actionButtons. Кнопка «Зберегти» якраз і буде викликати функцію і відправляти форму, а кнопка «Закрити» просто переадресує нас на головну сторінку модуля, що рівносильно закриття сторінки редагування. + +Далі ніяких змін немає, і в phpwork підставляється вміст змінних з секції case 'edit': файлу core.php. + +Звичайно, в цей модуль можна було додати ТВ-параметри, ajax-редагування і багато інших цікавих речей, проте, стаття вийшла і без того об'ємна. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/2.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/2.png" new file mode 100644 index 00000000..4183a22b Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/2.png" differ 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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/20_@_CHUNK.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/20_Managing_module_dependencies.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/20_@_CHUNK.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/20_Managing_module_dependencies.md" diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/3.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/3.png" new file mode 100644 index 00000000..4d872114 Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/3.png" differ 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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/30_@_DIRECTORY.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/30_Setting_up_configuration_parameters.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/30_@_DIRECTORY.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/30_Setting_up_configuration_parameters.md" diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/4.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/4.png" new file mode 100644 index 00000000..8bfc3877 Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/4.png" differ 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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/40_@_DOCUMENT.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/40_Writing_the_module_code.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/40_@_DOCUMENT.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/40_Writing_the_module_code.md" diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/5.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/5.png" new file mode 100644 index 00000000..a15294e8 Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/5.png" differ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/6.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/6.png" new file mode 100644 index 00000000..d13bd7cf Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/6.png" differ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/7.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/7.png" new file mode 100644 index 00000000..40ec28be Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/7.png" differ 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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/50_@_EVAL.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/index.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/50_@_EVAL.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/06_\320\234\320\276\320\264\321\203\320\273\321\226/index.md" diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/01_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/01_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..522f9b17 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/01_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,74 @@ +### Список основних параметрів заздалегідь визначений і містить основну інформацію про документ. + + +*[\*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) diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/02_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/02_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..b34203d4 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/02_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,27 @@ +## Параметри які відображають системні дані + +*[^qt^]* - час на запити до бази даних + +*[^q^]* - запити до бази даних + +*[^p^]* - час на роботу PHP скриптів + +*[^t^]* - спільний час на генерацію сторінки + +*[^s^]* - джерело вмісту (база або кеш) + +*[^m^]* - кількість споживаної пам'яті + +*** + +###Приклад: + +````html + +```` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/20_@_CHUNK.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/20_@_CHUNK.md" new file mode 100644 index 00000000..de24a71f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/20_@_CHUNK.md" @@ -0,0 +1,11 @@ +**Синтаксис** +``` +@CHUNK chunk_name +``` +Де chunk_name - це ім'я чанка. Значення, яке повертається - рядок з його вмістом. +Ця прив'язка дуже схожа на прив'язку @DOCUMENT, за винятком того, що вона прив'яже ТВ до чанку. + +**Приклад:** +``` +@CHUNK contactForm +```` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/30_@_DIRECTORY.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/30_@_DIRECTORY.md" new file mode 100644 index 00000000..73b57544 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/30_@_DIRECTORY.md" @@ -0,0 +1,5 @@ +**Синтаксис** +``` +@DIRECTORY path_to_folder +``` +Де path_to_folder - шлях до папки. Повертає список файлів. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/40_@_DOCUMENT.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/40_@_DOCUMENT.md" new file mode 100644 index 00000000..8ce066f2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/40_@_DOCUMENT.md" @@ -0,0 +1,11 @@ +**Синтаксис** +``` +@DOCUMENT 18 +``` +Прив'язує змінну до документа, де 18 - це числовий ідентифікатор документу. Значення, що повертається - рядок з вмістом документа. + +**Використовуючи цю прив'язку, ми можемо під'єднати інші документи в якості частин шаблону.** + +Наприклад: ми можемо створити документ під назвою SideBarInfo (id: 18), який буде зберігати інформацію, яка буде відображатися на бічній панелі нашого шаблону. Потім ми можемо створити простий ТВ під назвою `SideBar` і прив'язати його вміст через @DOCUMENT до документа 18. + +Після чого, додаючи `[*SideBar*]` всередині шаблона, ми зможемо відображати вміст документу 18 кожного разу, коли сторінка завантажується. Це дає вам змогу емулювати концепцію «блоків» багатьох інших систем керування контентом. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/50_@_EVAL.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/50_@_EVAL.md" new file mode 100644 index 00000000..acf03739 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/50_@_EVAL.md" @@ -0,0 +1,31 @@ +**Синтаксис** +``` +@EVAL php_code +``` +Виконує стрічку php-кода й оброблює значення, яке повертається. + +Де php_code - це фактичний PHP-код, який повинен бути виконаний. Значення, яке повертається може бути стрічкою рядка, масивом або набором записів. +Виконуючи команду @EVAL, ви можете писати php-коди, щоб створити все, що можливо, за допомогою php-скриптів сьогодні. + +Це найуніверсальніша і найпотужніша з всіх команда, яка відкриває шлях до необмежених можливостей. + +``` +@EVAL return «Время:» . time (); +``` + +## Приклад ## +Необхідно зробити у ТВ, щоб була можливість обирати ресурс з дерева документів (документ під номером 3). +* Створюємо ТВ-параметр, обираємо йому тип вводу "DropDown List Menu". +* В поле "Можливі значення" викликаємо DocLister, даємо йому id і шаблон стрічки рядка для DropDown. + +**Виклик сніпета** +``` +@EVAL return $modx->runSnippet('DocLister', array( 'parents' => 3, 'tpl'=>'@CODE: [+pagetitle+]==[+id+]||') ); +``` + + + +### Вкладені прив'язки ### +Як ви бачите з попереднього прикладу, можна вкладати одну @-прив'язку в іншу. + +Наприклад, прив'язка @EVAL може бути розміщена всередині ТВ, а в ній використана прив'язка @CODE для шаблону стрічки рядка. Так ви не будете робити зайві чанки, зазвичай вміст з одним-двома рядками. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/60_@_FILE.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/60_@_FILE.md" new file mode 100644 index 00000000..29fe4239 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/60_@_FILE.md" @@ -0,0 +1,38 @@ +**Синтаксис** +``` +@FILE file_path +``` +Прив'язує змінну до файлу, де file_path - шлях і ім'я файлу. + +Значення, яке повертається - стрічка рядка, що має вміст файлу. Шлях до файлу - це абсолютний шлях до кореня серверу або від кореня вашої встановленої Evolution. +``` +@FILE: assets/files/file.txt +``` + +Команда @FILE підходить в тих випадках, коли нам може знадобитися генерування даних, доступні в зовнішньому файлі. + +## Наприклад: ## + +Уявіть, що у нас є текстовий файл news.txt. + +Цей файл постійно обновляється останніми новинами якоїсь зовнішньої системи. Новини вже розміщені в html форматі. + +Ми хочемо відображати ці новини на нашому сайті для перегляду відвідувачами. + +Створіть новий ТВ-параметр, наприклад `[*external_news*]`. +Додайте в значення за замовчуванням команду @FILE: + +``` +@FILE: assets/files/news.txt +``` + +Тепер ви можете використовувати дані з цього файлу як для безпосередньої видачі в шаблоні, наприклад: + +``` +
    [*external_news*]
    +``` + +Так і для обробки їх вашим сніпетом, наприклад: +``` +[!myCustomSnippet? &news=`[*external_news*]`!] +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/70_@_INHERIT.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/70_@_INHERIT.md" new file mode 100644 index 00000000..2bca5a59 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/70_@_INHERIT.md" @@ -0,0 +1,27 @@ +Синтаксис +``` +@INHERIT default +``` +Зв'язка @INHERIT використовує структуру дерева документів, дозволяючи вмісту ТВ успадковуватися по дереву документів. + +Якщо значення ТВ встановлено в @INHERIT, воно буде мати те ж значення, що й у батьківського. + +Це означає, що ви можете застосовувати контент для всіх розділів вашого сайту, редагуючи тільки один ТВ. + +Справді зручно це тільки при використанні для значення за замовчуванням: + +Коли ця зв'язка використовується як значення за замовчуванням для ТВ, якщо для цього ТВ в поточному документі не вказаний контент, зв'язка буде на його батьківському документі, поки не досягне верхньої частини дерева документів. Якщо контент не знайдено, буде використовуватися контент за замовчуванням. + + + +##Приклад## + +Батьківський ТВ: +``` +@CHUNK +``` +Дочірній ТВ: +``` +@INHERIT +``` +Результатом буде те, що дочірній ТВ покаже вміст батьківського чанку. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/80_@_SELECT.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/80_@_SELECT.md" new file mode 100644 index 00000000..a3acd80c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/80_@_SELECT.md" @@ -0,0 +1,26 @@ +Синтаксис: +``` +@SELECT sql_query +``` +Зв'язує ТВ з запитом до бази даних. Повертає набір записів. + +Приклад: +``` +@SELECT id,pagetitle FROM [+PREFIX+]site_content LIMIT 10 +``` + +В результаті ви отримаєте список з 10 перших документів вашого сайту. + +*Не забудьте додати префікс до імені таблиці. Наприклад, `evo_site_content`, де `evo_` - префікс таблиці.* + +Також ви можете використовувати конструкцію `[+PREFIX+]`, щоб автоматично підставляти префікс до вашого запиту. + + +## Приклад: ## +Ви можете використовувати команду `@SELECT` і тип відображення ТВ `DropDownListMenu`, щоб надати редакторам сайту динамічний список параметрів з будь-якої таблиці (або з дерева документів). +``` +@SELECT pagetitle,id FROM [+PREFIX+]site_content WHERE parent= 3 LIMIT 10 +``` +Запит виведе випадаючий список із заголовків всіх документів, батьківським яких є документ з id=3. При виборі значення ТВ-параметр, id буде збережений обраного пункту. + +Це можна використовувати, наприклад, для створення блоку "Схожі товари". diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/index.md" new file mode 100644 index 00000000..11c28866 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/10_@_\320\227\320\262'\321\217\320\267\320\272\320\270/index.md" @@ -0,0 +1,40 @@ +Зв'язки необхідні для заповнювання значення ТВ-параметра деякими раніше зумовленими даними. + +`Типовий приклад: вам необхідно у ТВ-параметрі передбачити вибір id ресурсу з дерева документів.` + +Джерело даних для ТВ може бути з будь-якого із наступних джерел: + +* зовнішній файл, який відправляється через FTP на сервер +* таблиця бази даних, доступна Evolution +* документ в дереві документів +* чанк +* результат виконуючого скрипту PHP + +Ці джерела даних можуть бути прив'язані до ТВ для форматування і відображення в документі. + +Крім того, отримані таким способом дані легко відформатувати за допомогою налаштування "Тип вводу". Наприклад, для списку підійде тип вводу "DropDown List Menu" або ж будь-який з типів "Listbox" - в залежності від ваших потреб. + +Формат використовування наступний: +``` +@FILE file_path +@DOCUMENT document_id +@CHUNK chunk_name +@SELECT sql_query +@EVAL php_code +@DIRECTORY _path_to_folder +``` +**@-прив'язки будуть працювати при використовуванні всередині полів «Можливі значення» або «Значення за замовчуванням» в налаштуваннях ТВ-параметра.** + +Значення, яке повертається із джерела даних, може бути або рядковим (включаючи числа, дати й т.д.), або масивом або набором записів. + +Значення, яке повертається залежить від типу прив'язки, що використовується. Деякі елементи керування відображення будуть намагатися перетворити значення, яке повертається в стрічку рядка або масив. + +Наприклад, елементи керування, які приймають рядкові значення, такі як група перемикачів або список вибору, спробують перетворити набір записів (рядки й стовпці) в наступний формат: +``` +col1row1Value==col2row1Value||col1row2Value==col2row2Value,… +``` + +При розміщенні @-прив'язок всередині поля «Можливі значення» вони використовуються для форматування тільки при редагуванні документа в інтерфейсі адміністратора, наприклад, для створення розкриваного списку міст або країн. + +При розміщенні @-прив'язок всередині поля «Значення за замовчуванням» значення, яке повертається використовується для рендеринга на вебсторінці. +Це дозволяє швидко створювати складні форми для вводу даних. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/20_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\262\320\273\320\260\321\201\320\275\320\276\320\263\320\276_\321\202\320\270\320\277\321\203_\320\242\320\222-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/20_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\262\320\273\320\260\321\201\320\275\320\276\320\263\320\276_\321\202\320\270\320\277\321\203_\320\242\320\222-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.md" new file mode 100644 index 00000000..dce042fd --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/20_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\262\320\273\320\260\321\201\320\275\320\276\320\263\320\276_\321\202\320\270\320\277\321\203_\320\242\320\222-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260.md" @@ -0,0 +1,6 @@ +Для цієї статті потрібна текстова інформація. +На даний момент є тільки відео + + + +І ось це https://github.com/0test/custom_tv_example 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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/60_@_FILE.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/30_What_are_Template_Variables.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/60_@_FILE.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/30_What_are_Template_Variables.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/70_@_INHERIT.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/10_What_are_Widgets.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/70_@_INHERIT.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/10_What_are_Widgets.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/80_@_SELECT.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/20_DataGrid_Widget.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/06_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213/10_@_Bindings/80_@_SELECT.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/20_DataGrid_Widget.md" diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/30_Hyperlink_Widget.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/30_Hyperlink_Widget.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/40_Misc._Widget.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/40_Misc._Widget.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/50_RichTextBox_Widget.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/50_RichTextBox_Widget.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/60_Viewport_Widget.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/60_Viewport_Widget.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/40_Widgets/index.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/index.md" new file mode 100644 index 00000000..1ef1d592 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/index.md" @@ -0,0 +1,190 @@ +TV-параметр в Evolution CMS - елемент (поле), яке має певну інформацію для поточної сторінки. + +TV-параметри дозволяють додати до документа додаткову інформацію, яку потім можна використовувати нарівні з основними параметрами. Вони мають різні типи й в залежності від цього змінюються їх поведінка і зовнішній вигляд. Значення параметра можна вивести на сторінку або передати сніпету для подальшої обробки. + +## Для чого потрібен TV-параметр? + +TV-параметр потрібен для упорядкування і логічного зберігання інформації на сайті. + +Уявіть, що на сайті є 2 типи матеріалів - товари й новини. Для товару можна створювати параметри, в одному з яких буде зберігатися ціна, а в другому фото. А для новин створити інші параметри - теги та сюжет. + +Часто TV-параметри використовуються для створення SEO-полів подібні meta description, keywords і т.д. + +## Гнучкість і простота ## +Параметри прив'язуються до шаблонів, і це дозволяє в залежності від типу матеріалу ставити абсолютно різні поля для контенту. + +### Приклад параметру: + +[\*pagetitle\*] - виклик параметру в шаблоні, який поверне заголовок сторінки. Частіше всього він використовується для виводу title: +``` + +[*pagetitle*] + +``` + +Всі параметри можна розділити на основні, системні та користувацькі. + +## Основні параметри: ## + +Список основних параметрів заздалегідь визначений в Evolution 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)". + +![приклад](https://raw.githubusercontent.com/0test/docs/master/ru/02_Разработка/01_TV-параметры/tv_create.png) + +### Назначення полів + +- **Ім'я параметра** - використовується для виклику 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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/tv_create.png" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/tv_create.png" new file mode 100644 index 00000000..dd5303c5 Binary files /dev/null and "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/07_TV-\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270/tv_create.png" differ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/08_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270/10_@_Modifiers.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/08_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270/10_@_Modifiers.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/08_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/08_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270/index.md" new file mode 100644 index 00000000..b99fd835 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/08_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270/index.md" @@ -0,0 +1,64 @@ +# Вбудовані модифікатори + +Є вбудованою заміною плагіна PHx. +Вмикаються параметром `enable_filter` в загальних налаштуваннях сайта. + +## Переваги + ++ Легкі в порівнянні з PHx ++ Можна використовувати в чанках і сніпетах ++ Гнучкість ++ Легко читатити ++ Не залежать від розділювачів: ( ' " ` ++ Багато варіантів модификаторів ++ Сумісні з плагіном PHx ++ Можут використовуватись одночасно з плагіном PHx + +## Приклади: + +Приклад 1: варіанти оформлення + +``` +[*longtitle:ifempty=[*pagetitle*]*] +[*longtitle:ifempty='[*pagetitle*]'*] +[*longtitle:ifempty="[*pagetitle*]"*] +[*longtitle:ifempty([*pagetitle*])*] +[*longtitle:ifempty('[*pagetitle*]')*] +``` + +Приклад 2: регістронезалежність + +``` +[*template:is(1):then(Top page):else(Sub page)*] +[*template:IS(1):THEN('Top page'):ELSE('Sub page')*] +``` + +Приклад 3: оформлення в декількох рядках + +``` +[*id +:is(1) +:then(Top) +:else(Other) +*] +``` + +Ще приклади: + +``` +[*email:spam_protect*] +[*price:number_format*] +[*content:addBreak*] +[*pagetitle:strip_tags*] +[(site_name:escape)] +{{Chunk:escape}} +[+placeholder:escape+] +[[Snippet:escape?param=1¶m2]] +[!$_SERVER['REQUEST_TIME']:dateFormat('Y-m-d H:i:s')!] +[*pict:is_image:tpl('')*] +[+image:isNotEmpty + :then('') + :else('[+wf.linktext:substr(0,1)+]') + +] +[*pub_date:ifEmpty('[*publishedon*]'):dateformat=`%d.%m.%Y`*] +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/09_\320\242\320\265\320\263\320\270/10_\320\237\320\276\320\273\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/09_\320\242\320\265\320\263\320\270/10_\320\237\320\276\320\273\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" new file mode 100644 index 00000000..7c25a15e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/09_\320\242\320\265\320\263\320\270/10_\320\237\320\276\320\273\321\217_\321\200\320\265\321\201\321\203\321\200\321\201\321\203.md" @@ -0,0 +1,74 @@ +Це список всіх доступних полів ресурсів для документів. Будь яке з них ви можете викликати в шаблоні, чанку або ж, використовуючи АПІ, в сніпеті + +**[\*pagetitle\*]** - заголовок документа + +**[\*longtitle\*]** - розширений заголовок документа + +**[\*description\*]** - опис документа + +**[\*introtext\*]** - анотація документа + +**[\*content\*]** - вміст документа + +**[\*id\*]** - ідентифікатор (номер) документа + +**[\*parent\*]** - номер (ID) батьківського документа + +**[\*pub_date\*]** - дата публікації документа + +**[\*unpub_date\*]** - дата завершення публікації + +**[\*createdby\*]** - Ідентифікатор користувача що створив документ + +**[\*createdon\*]** - Дата створення документа + +**[\*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) + + +Кожне поле є полем в таблиці site_content. Ці значення також можуть бути отримані з масива + +``` +$modx->documentObject['resource-field-name'] +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/09_\320\242\320\265\320\263\320\270/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/09_\320\242\320\265\320\263\320\270/index.md" new file mode 100644 index 00000000..ee22e0e5 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/09_\320\242\320\265\320\263\320\270/index.md" @@ -0,0 +1,37 @@ +Теги Evo - це унікальні елементи, які будуть додавати контент і функціональність на сторінки. Ви можете вставляти Evo-теги в будь якому місці шаблону або вмісту документа. + +Повний список тегів наведено в статті "Поля ресурса". + +В головній статті шаблону ми побачили дуже простий шаблон, який мало що виконував. Давайте додамо до нього декілька тегів. + +## Внутрішні теги Evo ## +В цьому документі головна увага буде приділена використанню внутрішніх тегів Evo. + +По перше, ми можемо персоналізувати заголовок сторінки з ім'ям нашого сайту і назвою сторінки: + +``` + [(site_name)] - [*pagetitle*] </ title> +``` + +Ці теги в заголовку вашого шаблону відобразять щось типу «Evo Content Management System - Додавання Evo Tags» в строці заголовку браузера. + +Значення "site_name" обирається з поля "Заголовок сайта" в "Конфігурація системи". Pagetitle - це назва, яке ви дали документу при його створенні. + +Наступне, що ми хочемо зробити, - це вміст документу, який відображено в головній частині нашої сторінки. +``` +<div id="content"> +<h1>[*longtitle*]</h1> +[*content*] +</div> +``` +"Longtitle" обирається з поля "Расширений заголовок". А [\*content\*] - це текст, який ви ввели в редакторі вмісту документа, коли створили документ. + + +``` +<div id="footer">Copyright © <a href="mailto:[(emailsender)]">[(site_name)]</a> 2018</div> +``` +Імя сайту: Конфігурація -> Сайт -> Назва сайту +Електронна пошта: Конфігурація -> Сайт -> Адреса електронної пошти + +Обидва цих значення взято з бази даних і були встановлені в меню «Конфігурація системи». + diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/10_\320\223\320\273\320\276\320\261\320\260\320\273\321\214\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/10_\320\223\320\273\320\276\320\261\320\260\320\273\321\214\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226.md" new file mode 100644 index 00000000..e5f83643 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/10_\320\223\320\273\320\276\320\261\320\260\320\273\321\214\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226.md" @@ -0,0 +1,39 @@ +PHP надає всім скриптам велику кількість визначених змінних. Ці змінні містять все, від зовнішніх даних до змінних середовища оточення, від тексту повідомлень про помилки до останніх отриманих заголовків. + +Evolution підтримує виклик у шаблонах та чанках виклик деяких із них. + +## Приклади ### +``` +[!$_GET['username'] !] +[!$_GET['username']:ifempty=<form><input name="username"></form>!] +[!$_SERVER['REQUEST_TIME']:dateFormat='d.m.Y'!] +[!$_SERVER['HTTP_USER_AGENT']:find='Chrome':then='Chrome':else='Other'!] +<h2>$_SERVER:</h2> +<pre> + [!$_SERVER!] +</pre> +<hr> +<h2>$_POST:</h2> +<pre> + [!$_POST!] +</pre> +<hr> +<h2>$_GET:</h2> +<pre> + [!$_GET!] +</pre> +<h2>$_COOKIE:</h2> +<pre> + [!$_COOKIE!] +</pre> +<hr> +<h2>$_REQUEST:</h2> +<pre> + [!$_REQUEST!] +</pre> + +<h2>$_SESSION:</h2> +<pre> + [!$_SESSION!] +</pre> +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/index.md" new file mode 100644 index 00000000..c93cc8aa --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/02_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270/index.md" @@ -0,0 +1,128 @@ +Той, хто почне розбиратися з Evolution, зіткнеться з новими термінами. + +Тут ми відзначимо невеликі моменти, які періодично можна підглядати. + +## Термінологія ## + +**Шаблон** - містить загальну верстку сторінки зі структурою і дизайном. Також, в ньому визначаються місця для виведення динамічного вмісту. Для кожного документа можна вибрати свій шаблон. + +**Параметри (TV)** - додаткові параметри, які підключаються до шаблону. Параметри можуть бути різних типів (текст, посилання, файл, дата, число тощо). Більш докладно про типи чекайте в наступних статтях. + +**Чанк** - маленький шаблон, який може використовуватися як просто для виведення якогось вмісту (телефону на всіх сторінках), так і для обробки (шаблон листа eForm, шаблон каталогу Ditto тощо). Таким чином, вид (подання) інформації відділяється від місця обробки і легко управляється. + +**Сніпет** - код для обробки інформації. Аналізує отриману інформацію (наприклад, повідомлення користувача) і надають результат (наприклад, відправляють повідомлення поштою, а користувачеві показують повідомлення про результат). Сніпети формують меню (Wayfinder), виводять списки статей з розбивкою на сторінки (Ditto), будують форми (eForm). Для виведення використовують Чанки. + +**Плагін** - код, який запускається при настанні якоїсь події. Наприклад, підсвічує шукані слова (Search Highlighting) при переході зі сторінки пошуку. Подій багато і їх розгляд вартий окремої статті. + +**Пакет** - доповнення для Evolution, що має формат доповнень Laravel, яке крім стандартного для Laravel функціоналу (міграції, роути тощо) може містити в собі шаблони, параметри, чанки або Blade шаблони, сніпети, плагіни Evolution та викликати як їх так і інші, які вже існують на момент інсталяції. Див. приклад: https://github.com/evolution-cms/example-package + +## Спеціальні теги ## + +Для виведення динамічних даних використовуються спеціальні теги. + +### Системні ### + +- [(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 +<!DOCTYPE html> +<html lang="[(lang_code)]"> +{{head_tags}} +<body> + [*content*] +</body> +</html> +``` +де head_tags це чанк з натупним вмістом: + +```html +<head> + <base href="[(site_url)]" /> + <meta charset="[(modx_charset)]" /> + <title>[*pagetitle*] / [(site_name)] + +``` +А в полі [\*content\*] буде виведено вміст сторінки, заданий з адмінки. + diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/01_addEventListener.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/01_addEventListener.md" new file mode 100644 index 00000000..2bf06de4 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/01_addEventListener.md" @@ -0,0 +1,34 @@ +### Додати обробник події для плагіна ### + +**Примітка:** використовується тільки для поточного циклу виконання. +``` +string addEventListener(string $evtName, string $pluginName); +``` +**$evtName** - ім'я події + +**$pluginName** - назва плагіну + + +### Початковий код функції ### + +`Файл: /manager/includes/document.parser.class.inc.php` + +``` +/** + * Add an event listener to a plugin - only for use within the current execution cycle + * + * @param string $evtName + * @param string $pluginName + * @return boolean|int + */ +public function addEventListener($evtName, $pluginName) +{ + if (!$evtName || !$pluginName) { + return false; + } + if (!array_key_exists($evtName, $this->pluginEvent)) { + $this->pluginEvent[$evtName] = array(); + } + return array_push($this->pluginEvent[$evtName], $pluginName); // return array count +} +``` \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/02_changeWebUserPassword.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/02_changeWebUserPassword.md" new file mode 100644 index 00000000..7624195f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/02_changeWebUserPassword.md" @@ -0,0 +1,65 @@ +### Зміна пароля для WEB-користувача ### + +*Примітка: при виникненні помилок метод повертає інформацію про помилку англійською мовою.* +``` +mixed changeWebUserPassword(string $oldPwd, string $newPwd); +``` +**$oldPwd** - старий пароль + +**$newPwd** - новий пароль + + + +### Приклад:### + +```php +$txt = $modx->changeWebUserPassword('oldpassword','newpassword'); +print_r($txt); +// отриманий результат: true +```` + + +### Початковий код функції ### +`Файл: /manager/includes/document.parser.class.inc.php` +``` +/** + * Change current web user's password + * + * @todo Make password length configurable, allow rules for passwords and translation of messages + * @param string $oldPwd + * @param string $newPwd + * @return string|boolean Returns true if successful, oterhwise return error + * message + */ +public function changeWebUserPassword($oldPwd, $newPwd) +{ + $rt = false; + if ($_SESSION["webValidated"] == 1) { + $tbl = $this->getFullTableName("web_users"); + $ds = $this->db->select('id, username, password', $tbl, "id='" . $this->getLoginUserID() . "'"); + if ($row = $this->db->getRow($ds)) { + if ($row["password"] == md5($oldPwd)) { + if (strlen($newPwd) < 6) { + return "Password is too short!"; + } elseif ($newPwd == "") { + return "You didn't specify a password for this user!"; + } else { + $this->db->update(array( + 'password' => $this->db->escape($newPwd), + ), $tbl, "id='" . $this->getLoginUserID() . "'"); + // invoke OnWebChangePassword event + $this->invokeEvent("OnWebChangePassword", array( + "userid" => $row["id"], + "username" => $row["username"], + "userpassword" => $newPwd + )); + return true; + } + } else { + return "Incorrect password."; + } + } + } + return $rt; +} +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/03_clearCache.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/03_clearCache.md" new file mode 100644 index 00000000..f51f4c1f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/03_clearCache.md" @@ -0,0 +1,71 @@ +### Очистка кешу сайту ### + +boolean clearCache(string $type, boolean $report); + +**$type** - використовуємо зі значенням *full* якщо потрібно очистити весь кеш з врахуванням індексних файлів + +*** + +### Приклад ### + +````php +//Очистить кеш сайту. +$modx->clearCache(); + +//Очистить кеш сайту з врахуванням індексних файлів(доступно з версії 1.0.13). +$modx->clearCache('full'); +```` +**Важливо:** виконання функції без параметру 'type' очищає не весь кеш. При використанні цієї функції видаляються файли з кешем всіх документів, але індексний файл кешу не змінюється. + +Через це документи, які були створені програмним шляхом, можуть бути відсутні на сайті. + +### Початковий код функції ### +`Файл: /manager/includes/document.parser.class.inc.php` +``` +/** + * Clear the cache of MODX. + * + * @param string $type + * @param bool $report + * @return bool + */ +public function clearCache($type = '', $report = false) +{ + $cache_dir = MODX_BASE_PATH . $this->getCacheFolder(); + if (is_array($type)) { + foreach ($type as $_) { + $this->clearCache($_, $report); + } + } elseif ($type == 'full') { + include_once(MODX_MANAGER_PATH . 'processors/cache_sync.class.processor.php'); + $sync = new synccache(); + $sync->setCachepath($cache_dir); + $sync->setReport($report); + $sync->emptyCache(); + } elseif (preg_match('@^[1-9][0-9]*$@', $type)) { + $key = ($this->config['cache_type'] == 2) ? $this->makePageCacheKey($type) : $type; + $file_name = "docid_" . $key . "_*.pageCache.php"; + $cache_path = $cache_dir . $file_name; + $files = glob($cache_path); + $files[] = $cache_dir . "docid_" . $key . ".pageCache.php"; + foreach ($files as $file) { + if (!is_file($file)) { + continue; + } + unlink($file); + } + } else { + $files = glob($cache_dir . '*'); + foreach ($files as $file) { + $name = basename($file); + if (strpos($name, '.pageCache.php') === false) { + continue; + } + if (!is_file($file)) { + continue; + } + unlink($file); + } + } +} +``` \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/04_getActiveChildren.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/04_getActiveChildren.md" new file mode 100644 index 00000000..a4564644 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/04_getActiveChildren.md" @@ -0,0 +1,62 @@ +###Повертає інформацію про всі дочірні документи, которі є опублікованими та не видаленими + +*Примітка: getActiveChildren() повертає інформацію про дочірні документи тідьки першого рівня.* + +array getActiveChildren (mixed $id[, string $sort[, string $dir[, string $fields]]]); + +**$id** - ідентифікатор батьківського документу + +**$sort** - поле, по якому буде здійснюватись сортування +- за замовчуванням: menuindex + +**$dir** - варіант сортування: +- ASC - за зростанням, DESC - за спаданням +- за замовчуванням: ASC + +**$fields** - список необхідних полів +за замовчуванням: id, pagetitle, description, parent, alias, menutitle + +*** + +####Формат даних результату: +````php +Array ( + [0] => Array ( + [id] => 50 + [pagetitle] => Документ 1 + [description] => + [parent] => 16 + [alias] => + [menutitle] => + ) + [1] => Array ( + [id] => 48 + [pagetitle] => Документ 2 + [description] => + [parent] => 16 + [alias] => + [menutitle] => + ) +) +```` + +*** + +####Приклад + +````php +/**Структура документів: + +-Статті (1) +--Нерухомість (11) +---Економ(111) +---Елітна(112) +--Авто (12) + +**/ + +$modx->getActiveChildren(1); //поверне информацію про документи 11 и 12 + +```` + +*Дивіться також: getAllChildren* \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/05_getAllChildren.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/05_getAllChildren.md" new file mode 100644 index 00000000..1f383b29 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/05_getAllChildren.md" @@ -0,0 +1,62 @@ +###Повертає інформацію про всі дочірні документи, включаючи також неопубліковані та видалені + +*Примітка: getAllChildren() повертає інформацію про дочірні документи тільки першого рівня.* + +array getAllChildren(mixed $id[, string $sort[, string $dir[, string $fields]]]); + +**$id** - індентифікатор батьківського документа + +**$sort** - поле, по якому буде здійснюватись сортування +- за замовчуванням: menuindex + +**$dir** - варіант сортування: +- ASC - за зростанням, DESC - за спаданням +- за змовчуванням: ASC + +**$fields** - список необхідних полів +за змовчуванням: id, pagetitle, description, parent, alias, menutitle + +*** + +####Формат даних результату: +````php +Array ( + [0] => Array ( + [id] => 50 + [pagetitle] => Документ 1 + [description] => + [parent] => 16 + [alias] => + [menutitle] => + ) + [1] => Array ( + [id] => 48 + [pagetitle] => Документ 2 + [description] => + [parent] => 16 + [alias] => + [menutitle] => + ) +) +```` + +*** + +####Приклад + +````php +/**Структура документів: + +-Статті (1) +--Нерухомість (11) +---Економ(111) +---Елітна(112) +--Авто (12) + +**/ + +$modx->getActiveChildren(1); //поверне інформацію про документи 11 и 12 + +```` + +*Дивіться також: getActiveChildren* \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/06_getCachePath.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/06_getCachePath.md" new file mode 100644 index 00000000..8f60c0ff --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/06_getCachePath.md" @@ -0,0 +1,12 @@ +###Повертає відносний шлях до папки для кешування + +string getCachePath(); + +*** + +####Приклад + +````php +echo $modx->getCachePath(); +// отриманий результат: /assets/cache/ +```` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/07_getChildIds.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/07_getChildIds.md" new file mode 100644 index 00000000..f6c2783c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/07_getChildIds.md" @@ -0,0 +1,48 @@ +###Повертає масив дочірніх документів, враховуючи глибину + +*Примітка: getAllChildren() повертає інформацію про дочірні документи тільки першого рівня.* + +Array getChildIds(mixed $id[, int $depth[, array $children]]); + +**$id** - стартовий ідентифікатор документу + +**$depth** - кількість рівнів вкладення що переглядаються + +**$children** - масив з кінцевими значеннями + +*** + +####Формат даних результату: +````php +Array ( + [псевдоним1] => id1 + [псевдоним2] => id2 +) +```` + +Сортування йде за положенням в меню (menuindex). При цьому документи додаються за рівнями. Тобто спочатку йдуть документи першого рівня, потім другого. + +*** + +####Приклад + +````php +/**Структура документів: + +-Статті (1) +--Нерухомість (11) +---Економ(111) +---Елітна(112) +--Авто (12) + +**/ + +$modx-> getChildIds (1); //поверне інформацію про документи 11,12,111,112 + +$modx-> getChildIds (111); //поверне пустий масив + + + +```` + +*Дивіться також: getActiveChildren* \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/08_getChunk.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/08_getChunk.md" new file mode 100644 index 00000000..a6bb8e37 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/08_getChunk.md" @@ -0,0 +1,15 @@ +###Отримає вміст чанка за назвою + +*Примітка: цей метод тільки повертає вміст чанка. При цьому ниякої обробки не відбувається.* + +string getChunk(string $chunkName); + +**$chunkName** - назва чанка (чуттєво до регістра!) + +*** + +####Приклад: + +````php +$txt = $modx->getChunk('ditto_blog'); //поверне вміст чанка ditto_blog. +```` \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/09_getConfig.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/09_getConfig.md" new file mode 100644 index 00000000..12246f99 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/09_getConfig.md" @@ -0,0 +1,15 @@ +###Повертає системні параметри та відповідає виклику в шаблоні конструкції [(param)] + +*Примітка: Ця функція не працює при виклику з підключеного файла (include, include_once, require, require_once).* + +string getConfig(string $name); + +**$name** - назва системного параметра + +*** + +####Приклад: + +````php +$txt = $modx->getConfig('site_start'); //поверне документ, який в конфігурації сайту вказано першою (головною) сторінкою. +```` \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/10_getDocument.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/10_getDocument.md" new file mode 100644 index 00000000..d58b1f20 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/10_getDocument.md" @@ -0,0 +1,82 @@ +###Отримання інформації про документ, з врахуванням додаткових налаштувань + +array getDocument(int $id[, string $fields[, int $published[, int $deleted]]]); + +**$id** -идентифікатор документу + +**$fields** - список необхідних полів +за замовчуванням: всі поля + +**$published** - чи опубліковано документ +0 - документ не опубліковано +1 - документ опубліковано +За замовчуванням: 1 + +**$deleted** - значення видалення документа +0 - документи не видалені +1 - документи видалені (в кошику) +За замовчуванням: 0 + +*** + +####Формат даних результату: + +````php +Array ( + [id] => 16 + [type] => document + [contentType] => text/html + [pagetitle] => Ajax1 + [longtitle] => Ajax and Web 2.0 ready + [description] => + [alias] => + [link_attributes] => + [published] => 1 + [pub_date] => 1159264800 + [unpub_date] => 0 + [parent] => 15 + [isfolder] => 1 + [introtext] => + [content] => Содержимое документа + [richtext] => 1 + [template] => 4 + [menuindex] => 1 + [searchable] => 1 + [cacheable] => 1 + [createdby] => 1 + [createdon] => 1144904400 + [editedby] => 1 + [editedon] => 1219426098 + [deleted] => 0 + [deletedon] => 0 + [deletedby] => 0 + [publishedon] => 0 + [publishedby] => 0 + [menutitle] => + [donthit] => 0 + [haskeywords] => 0 + [hasmetatags] => 0 + [privateweb] => 0 + [privatemgr] => 0 + [content_dispo] => 0 + [hidemenu] => 0 + [alias_visible] => 1 +) +```` + +*** + +####Приклад: + +````php +/**Структура документів: + +-Статті (1) +--Нерухомість (11) +---Економ(111) +---Елітна(112) +--Авто (12) + +**/ +$txt = $modx->getDocument(11); //поверне інформацію про документ 11 +```` \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/11_getDocumentChildren.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/11_getDocumentChildren.md" new file mode 100644 index 00000000..9ad1698d --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/11_getDocumentChildren.md" @@ -0,0 +1,74 @@ +###Повертає список дочірніх документів вказаного документу, з врахуванням додаткових налаштувань + +*Примітка: getActiveChildren() повертає інформацію про дочірні документи тільки першого рівня.* + +array getDocumentChildren (mixed $id[, int $active[, int $deleted[, string $fields[, string $where[, string $sort[, string $dir[, int $limit]]]]]]]); + +**$id** - ідентифікатор батьківського документу + +**$active** - значення активності документів +0 - активні документи +1 - неактивні документи +За замовчуванням: 1 + +**$deleted** - значення видалення документу +0 - документи не видалені +1 - документи видалені (в кошику) +За замовчуванням: 0 + +**$fields** - список необхідних полів +за замовчуванням: всі поля + +**$where** - додаткові умови запиту в БД (відповідає where в MySQL) + +**$sort** - поле, по которому будет производиться сортировка +по умолчанию: menuindex + +**$dir** - варіант сортування: +ASC - за зростанням +DESC - за спаданням +за замовчуванням: ASC + +**$limit** - максимальна кількість документів (відповідає like в MySQL) +за замовчуванням: без обмежень + +*** + +####Формат даних результату: + + Array ( + [0] => Array ( + [id] => 50 + [pagetitle] => Документ 1 + [description] => + [parent] => 16 + [alias] => + [menutitle] => + ) + [1] => Array ( + [id] => 48 + [pagetitle] => Документ 2 + [description] => + [parent] => 16 + [alias] => + [menutitle] => + ) + ) + + +*** + +####Пример + + + /**Структура документів: + + -Статті (1) + --Нерухомість (11) + ---Економ(111) + ---Елітна(112) + --Авто (12) + + **/ + + $modx->getDocumentChildren(1); //поверне информацію про документи 11 та 12 diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/12_getDocumentChildrenTVarOutput.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/12_getDocumentChildrenTVarOutput.md" new file mode 100644 index 00000000..8477d430 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/12_getDocumentChildrenTVarOutput.md" @@ -0,0 +1,52 @@ +###Отримання списку дочірніх документів, для вказаного документа зі значеннями головних і додаткових параметрів, які вказані, ця функція отримує ТВ з врахуванням застосованих віджетів. + +*Примітка: якщо не задано список необхідних параметрів, то метод поверне пустий масив.* + +string getDocumentChildrenTVars(int $parentid, array $tvidnames[, int $published[, string $docsort[, string $docsortdir]]]); + +**$parentid** - ідентифікатор батьківського документа + +**$tvidnames** - масив з необхідними TV-параметрами + +**$published** - чи опубліковані документи +0 - документи не опубліковані +1 - документи опубліковані +За замовчуванням: 1 + +**$docsort** - поле по якому сортуються документи +За замовчуванням: menuindex + +**$docsortdir** - правило сортування документів +ASC - за зростанням +DESC - за спаданням +за замовчуванням: ASC + +*** + +####Формат даних результата: + + Array ( + [16] => Array ( + [МойПараметр] => Это мой текст + [id] => 16 + [type] => document + ) ... + ) + +*** + +####Приклад + + /**Структура документів: + -Статті (1) + --Нерухомість (11) + ---Економ(111) + ---Елітна(112) + --Авто (12) + **/ + + $txt = $modx->getDocumentChildrenTVarOutput(11,array('id','type','МойПараметр')); + + //поверне інформацію за основними параметрами id, type + //та додатковому параметру МійПараметр + //для документів 111 і 112. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/13_getDocumentChildrenTVars.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/13_getDocumentChildrenTVars.md" new file mode 100644 index 00000000..b8b16384 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/13_getDocumentChildrenTVars.md" @@ -0,0 +1,84 @@ +####Отримання списку дочірніх документів, для зазначеного документа зі значеннями основних і додаткових параметрів, які вказані + +*Зауваження: якщо не заданий список необхідних параметрів, то метод поверне порожній масив.* + +string getDocumentChildrenTVars(int $parentid, array $tvidnames[, int $published[, string $docsort[, string $docsortdir[,string $tvfields[, string $tvsort[, string $tvsortdir]]]]]]); + +**$parentid** - ідентифікатор батьківського документа + +**$tvidnames** - масив з необхідними TV-параметрами + +**$published** - чи опубліковані документи +0 - документи не опубліковані +1 - документи опубліковані +За замовчуванням: 1 + +**$docsort** - поле по якому сортуються документи +За замовчуванням: menuindex + +**$docsortdir** - правило сортування документів +ASC - в порядку збільшення +DESC - в порядку зменшення +За замовчуванням: ASC + +**$tvfields** - список параметрів, до яких потрібно повертатися для додаткових TV- параметрів. +Список параметрів через кому +* - повертає всі параметри +За замовчуванням: * + +**$tvsort** - поле по якому сортуються додаткові параметри +За замовчуванням: rank + +**$tvsortdir** - правило сортування додаткових TV-параметрів +ASC - в порядку збільшення +DESC - в порядку зменшення +За замовчуванням: ASC + +*** + +####Формат даних результату: + + Array ( + [0] => Array ( + [0] => Array ( + [id] => 4 + [type] => text + [name] => МійПараметр + [caption] => Заголовок + [description] => Опис + [editor_type] => 0 + [category] => 0 + [locked] => 0 + [elements] => Текст + [rank] => 0 + [display] => + [display_params] => + [default_text] => + [value] => Це мій текст + ) + [1] => Array ( + [name] => id + [value] => 16 + ) + [2] => Array ( + [name] => type + [value] => document + ) + ) ... + ) + +*** + +####Приклад + + /**Структура документів: + -Статті (1) + --Нерухомість (11) + ---Економ(111) + ---Елітна(112) + --Авто (12) + **/ + + $txt = $modx->getDocumentChildrenTVars(11,array('id','type','МійПараметр')); + //поверне інформацію за основними параметрами id, type та додаткового параметру + //МійПараметр для документів 111 та 112. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/14_getDocuments.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/14_getDocuments.md" new file mode 100644 index 00000000..a3e42504 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/14_getDocuments.md" @@ -0,0 +1,93 @@ +###Повертає інформацію для зазначених документів, з урахуванням додаткових налаштувань. За замовчуванням повертаються опубліковані документи, що не видалені + +array getDocument(array $ids[, int $published[, int $deleted[, string $fields[, string $where[, string $sort[, string $dir[, string $limit]]]); + +**$ids** - масив ідентифікаторів документів + +**$published** - чи опублікований документ +0 - документ не опублікований +1 - документ опублікований +За замовчуванням: 1 + +**$deleted** - значення видалення документа +0 - документи не видалені +1 - документи вилучені (в кошику) +За замовчуванням: 0 + +**$fields** - список необхідних полів +за замовчуванням: всі поля + +**$where** - додаткові умови запиту в БД (відповідає where в MySQL) + +**$sort** - поле, по якому буде проводитися сортування +за замовчуванням: menuindex + +**$dir** - варіант сортування: +ASC - по зростанню +DESC - по спадаючій +за замовчуванням: ASC + +**$limit** - максимальна кількість документів (відповідає like в MySQL) +за замовчуванням: без обмеження + +*** + +####Формат даних результату: + + Array ( + [0] => Array ( + [id] => 16 + [type] => document + [contentType] => text/html + [pagetitle] => Ajax1 + [longtitle] => Ajax and Web 2.0 ready + [description] => + [alias] => + [link_attributes] => + [published] => 1 + [pub_date] => 1159264800 + [unpub_date] => 0 + [parent] => 15 + [isfolder] => 1 + [introtext] => + [content] => Вміст документу + [richtext] => 1 + [template] => 4 + [menuindex] => 1 + [searchable] => 1 + [cacheable] => 1 + [createdby] => 1 + [createdon] => 1144904400 + [editedby] => 1 + [editedon] => 1219426098 + [deleted] => 0 + [deletedon] => 0 + [deletedby] => 0 + [publishedon] => 0 + [publishedby] => 0 + [menutitle] => + [donthit] => 0 + [haskeywords] => 0 + [hasmetatags] => 0 + [privateweb] => 0 + [privatemgr] => 0 + [content_dispo] => 0 + [hidemenu] => 0 + [alias_visible] => 1 + ) + ) + +*** + +####Приклад + + + / ** Структура документів: + -Статті (1) + --Нерухомість (11) + --- Економ (111) + --- Елітна (112) + --Авто (12) + **/ + + $txt = $modx->getDocuments(array(11,111)); //поверне інформацію про документи 11 та 111 diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/15_getFullTableName.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/15_getFullTableName.md" new file mode 100644 index 00000000..edea73a4 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/15_getFullTableName.md" @@ -0,0 +1,15 @@ +###Повертає повну назву таблиці з урахуванням префікса зазначеного в системних настройках + +string getFullTableName(string $tbl); + +**$tbl** - назва таблиці + +*** + +####Приклад + + $txt = $modx->getFullTableName('web_users'); + + //поверне повну назву таблиці. + //Наприклад, якщо було вказано префікс в настройках "modx", + //то результат буде `modx`.`modx_web_users` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/16_getKeywords.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/16_getKeywords.md" new file mode 100644 index 00000000..acc27c7f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/16_getKeywords.md" @@ -0,0 +1,22 @@ +###Повертає масив ключових слів заданих для зазначеного документа + +array getKeywords(int $id); + +**$id** - ідентифікатор документу + +*** + +####Формат даних результату: + + Array ( + [0] => Front End Editing + [1] => login + [2] => MODx + ) + +*** + +####Приклад + + $txt = $modx->getKeywords(10); + //поверне інформацію про ключові слова документа 10. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/17_getLoginUserID.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/17_getLoginUserID.md" new file mode 100644 index 00000000..f0abc293 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/17_getLoginUserID.md" @@ -0,0 +1,13 @@ +###Повертає ідентифікатор авторизованого користувача або NULL, якщо користувач не авторизований + +*Зауваження: метод враховує відповідність типу користувача. Тому для авторизованого менеджера на самому сайті ідентифікатор визначатися не буде (повернеться null).* + +mixed getLoginUserID(); + +*** + +####Приклад + + echo 'Ідентифікатор користувача: ' . $modx->getLoginUserID(); + // Отриманий результат: + // Ідентифікатор користувача: 1 diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/18_getLoginUserName.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/18_getLoginUserName.md" new file mode 100644 index 00000000..18d98155 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/18_getLoginUserName.md" @@ -0,0 +1,14 @@ +###Повертає ім'я авторизованого користувача або NULL, якщо користувач не авторизований + +*Зауваження: метод враховує відповідність типу користувача. Тому для авторизованого менеджера на самому сайті ім'я визначатися не буде (повернеться null).* + +mixed getLoginUserName(); + +*** + +####Приклад + + echo 'Логін користувача: ' . $modx->getLoginUserName(); + + // Отриманий результат: + // Логін користувача: siteadmin diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/19_getLoginUserType.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/19_getLoginUserType.md" new file mode 100644 index 00000000..d9ad03d6 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/19_getLoginUserType.md" @@ -0,0 +1,14 @@ +###Повертає поточний тип користувача. Для менеджера повертається manager, а для користувача на сайті web + +*Зауваження: метод враховує відповідність типу користувача. Тому для авторизованого менеджера на самому сайті тип визначатися не буде (повернеться пусте значення).* + +mixed getLoginUserType(); + +*** + +####Приклад + + echo 'Тип користувача: ' . $modx->getLoginUserType(); + + // Отриманий результат: + // Тип користувача: web diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/20_getManagerPath.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/20_getManagerPath.md" new file mode 100644 index 00000000..749097ba --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/20_getManagerPath.md" @@ -0,0 +1,10 @@ +###Повертає відносний шлях до директорії менеджера + +string getManagerPath(); + +*** + +####Приклад + + echo $modx->getManagerPath(); + // Отриманий результат: /manager/ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/21_getMETATags.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/21_getMETATags.md" new file mode 100644 index 00000000..fb4e0965 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/21_getMETATags.md" @@ -0,0 +1,24 @@ +###Повертає масив мета-тегів заданих для зазначеного документа +array getMETATags(int $id); + +**$id** - ідентифікатор документу + +*** + +####Формат даних результату: + + Array ( + [Автор] => Array ( + [tag] => author + [tagvalue] => modx-cms.ru + [http_equiv] => 0 + ) + ) + +*** + +####Приклад + + $txt = $modx->getMETATags(10); + + //поверне інформацію про мета-теги документу 10. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/22_getPageInfo.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/22_getPageInfo.md" new file mode 100644 index 00000000..1922a415 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/22_getPageInfo.md" @@ -0,0 +1,42 @@ +###Повертає спеціальні дані по зазначених полях + +*Зауваження: метод getPageInfo() сильно схожий на getDocuments(11), але в ньому немає можливості отримати інформацію про видалених документів (в кошику), а також визначено перелік найбільш важливих полів за замовчуванням. Рекомендується використовувати getPageInfo().* + +array getPageInfo (int $id[, int $published[, string $fields]]); + +**$id** -ідентифікатор документу + +**$published** - чи опублікований документ +0 - документ не опублікований +1 - документ опублікований +За замовчуванням: 1 + +**$fields** - список необхідних полів +За замовчуванням: id, pagetitle, description, alias + +*** + +####Формат даних результату: + + Array ( + [id] => 16 + [pagetitle] => Ajax1 + [description] => + [alias] => + ) + +*** + +####Приклад + + /**Структура документів: + -Статті (1) + --Нерухомість (11) + ---Економ(111) + ---Елітна(112) + --Авто (12) + **/ + + $txt = $modx->getDocuments(11); + + //поверне інформацію про документ 11 diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/23_getParent.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/23_getParent.md" new file mode 100644 index 00000000..bd9a9387 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/23_getParent.md" @@ -0,0 +1,40 @@ +###Отримання інформації про батьківський документі для зазначеного документа + +array getParent (int $id[, int $published[, string $fields]]); + +**$id** -ідентифікатор документу + +**$published** - чи опублікований документ +0 - документ не опублікований +1 - документ опублікований +За замовчуванням: 1 + +**$fields** - список необхідних полів +За замовчуванням: id, pagetitle, description, alias, parent + +*** + +####Формат даних результату: + + Array ( + [id] => 15 + [pagetitle] => MODx Features + [description] => + [alias] => + [parent] => 0 + ) + +*** + +####Приклад: + + /**Структура документів: + -Статті (1) + --Нерухомість (11) + ---Економ(111) + ---Елітна(112) + --Авто (12) + + $txt = $modx-> getParent (11); + + //поверне інформацію про документ 1 diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/24_getParentIds.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/24_getParentIds.md" new file mode 100644 index 00000000..fc7dc9a3 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/24_getParentIds.md" @@ -0,0 +1,37 @@ +###Повертає масив батьківських документів, з огляду на задану кількість рівнів + +Array getParentIds(mixed $id[, int $height= 10[, array $parents= array ()]]); + +**$id** - стартовий ідентифікатор документа +**$height** - кількість рівнів, що переглядаються +**$parents** - масив з кінцевими значеннями + +*** + +####Формат даних результату: + + Array ( + [псевдонім1] => id1 + [псевдонім2] => id2 + ) +Сортування йде від поточного пункту, тобто останнє значення відображає документ, який найближче до кореня сайту. + +*** + +####Приклад: + + /** Структура документів: + -Статті (1) + --Нерухомість (11) + --- Економ (111) + --- Елітна (112) + --Авто (12) + **/ + + $modx->getParentIds(111); + //поверне значення 11 та 1 + + modx->getParentIds(1); + //поверне пустий масив + +Дивіться також: getChildIds() diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/25_getPlaceholder.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/25_getPlaceholder.md" new file mode 100644 index 00000000..b785c611 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/25_getPlaceholder.md" @@ -0,0 +1,29 @@ +### Отримання плейсхолдера + +*Зауваження: багато сніпетів мають власні плейсхолдери, які вони обробляють самостійно. Метод getPlaceholder може про них нічого не знати.* + +string getPlaceholder(string $name); + +**$name** - назва плейсхолдера. Задається без синтаксичної конструкції. + +*** + +####Приклад +```php +$txt = $modx->getPlaceholder('MyPlaceholder'); +//поверне значення плейсхолдера MyPlaceholder. +``` +*** + +####Вихідний код +```php +/** +* Повертає значення плейсхолдера +* +* @param string $name Placeholder name +* @return string Placeholder value +*/ +function getPlaceholder($name) { + return isset($this->placeholders[$name]) ? $this->placeholders[$name] : null; +} +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/26_getSnippetId.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/26_getSnippetId.md" new file mode 100644 index 00000000..212811bc --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/26_getSnippetId.md" @@ -0,0 +1,12 @@ +###Повертає ідентифікатор поточного сніпета, в якому відбувається виклик + +*Зауваження: Ця функція не працює при виклику з підключеного файлу (include, include_once, require, require_once).* + +int getSnippetId(); + +*** + +####Приклад + + $txt = $modx-> getSnippetId(); + //Поверне ідентифікатор поточного сніпета. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/27_getSnippetName.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/27_getSnippetName.md" new file mode 100644 index 00000000..4462148d --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/27_getSnippetName.md" @@ -0,0 +1,12 @@ +###Повертає назву поточного сніпета, в якому відбувається виклик + +*Зауваження: Ця функція не працює при виклику з підключеного файлу (include, include_once, require, require_once).* + +string getSnippetName(); + +*** + +####Приклад + + $txt = $modx->getSnippetName(); + //Поверне назву поточного сніпета. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/28_getTemplateVar.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/28_getTemplateVar.md" new file mode 100644 index 00000000..591a9271 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/28_getTemplateVar.md" @@ -0,0 +1,48 @@ +###Отримання певного додаткового TV-параметра для документа + +*Зауваження: Цей метод не працює при виклику з підключеного файлу (include, include_once, require, require_once).* + +array getTemplateVar(string $idname[, string $fields[, int $docid[, int $published]]]); + +**$idname** -TV-параметр +- назва або ідентифікатор + +**$fields** - список параметрів, які потрібно повертати для додаткових TV- параметрів. +Список параметрів через кому **\*** - повертати всі параметри +За замовчуванням: * + +**$docid** - документ, для якого потрібно отримати TV-параметр +Ідентифікатор документа +За замовчуванням: поточний дкоумент + +**$published** - чи опубліковані документи +0 - документи не опубліковані +1 - документи опубліковані +За замовчуванням: 1 + +*** + +####Формат даних результату: + + Array ( [id] => 4 + [type] => text + [name] => МійПараметр + [caption] => Заголовок + [description] => Опис + [editor_type] => 0 + [category] => 0 + [locked] => 0 + [elements] => Текст + [rank] => 0 + [display] => + [display_params] => + [default_text] => + [value] => Це наша поточна сторінка + ) + +*** + +####Приклад + + $txt = $modx->getTemplateVar('МійПараметр'); + //поверне інформацію щодо додаткового параметру МійПараметр для поточного документа. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/29_getTemplateVarOutput.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/29_getTemplateVarOutput.md" new file mode 100644 index 00000000..91039499 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/29_getTemplateVarOutput.md" @@ -0,0 +1,30 @@ +###Отримання додаткових TV-параметрів для документа, ця функція отримує TV з урахуванням застосованих віджетів. + +*Зауваження: Цей метод використовує в роботі метод getTemplateVars.* + +array getTemplateVarOutput(array $idnames[, int $docid[, int $published]]); + +**$idnames** - масив TV-параметрів +масив назв +масив ідентифікаторів + +**$docid** - документ, для якого потрібно отримати TV-параметр +ідентифікатор документа +За замовчуванням: поточний документ + +**$published** - чи опубліковані документи +0 - документи не опубліковані +1 - документи опубліковані +За замовчуванням: 1 +*** + +####Формат даних результату: + + Array ( [МійПараметр] => Це наша поточна сторінка [ЩеПараметр] => Просто текст ) + +*** + +####Приклад + + $txt = $modx->getTemplateVarOutput(array('МійПараметр','ЩеПараметр')); + //поверне інформацію за додатковими параметрами МійПараметр і ЩеПараметр для поточного документа. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/30_getTemplateVars.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/30_getTemplateVars.md" new file mode 100644 index 00000000..1eedb8a4 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/30_getTemplateVars.md" @@ -0,0 +1,61 @@ +###Отримання додаткових TV-параметрів для документа + +*Зауваження: Цей метод не працює при виклику з підключеного файлу (include, include_once, require, require_once).* + +*Зауваження: рекомендується завжди вказувати номер документа, так як при його впущенні метод працює з помилками.* + +array getTemplateVars(array $idnames[, string $fields[, int $docid[, int $published[, string $sort[, string $dir]]]]]); + +**$idnames** - масив TV-параметрів +масив назв +масив ідентифікаторів + +**$fields** - список параметрів, які потрібно повертати для додаткових TV- параметрів. +Список параметрів через кому +* - повертати всі параметри +За замовчуванням: * + +**$docid** - документ, для якого потрібно отримати TV-параметр +ідентифікатор документа +За замовчуванням: поточний документ + +**$published** - чи опубліковані документи +0 - документи не опубліковані +1 - документи опубліковані +За замовчуванням: 1 + +**$sort** - поле по якому упорядковано TV-параметри +За замовчуванням: rank + +**$dir** - правило сортування TV-параметрів +ASC - в порядку зростання +DESC - в порядку спадання +за замовчуванням: ASC + +*** + +####Формат даних результату: + + Array ( [0] => Array ( + [id] => 4 + [type] => text + [name] => МійПараметр + [caption] => Заголовок + [description] => Опис + [editor_type] => 0 + [category] => 0 + [locked] => 0 + [elements] => Текст + [rank] => 0 + [display] => + [display_params] => + [default_text] => + [value] => Це наша поточна сторінка + ) + ... + ) + +####Приклад + + $txt = $modx->getTemplateVars(array('МійПараметр','ЩеПараметр'), '*', 11); + //поверне інформацію за додатковими параметрами МійПараметр і ЩеПараметр для поточного документа. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/31_getUserData.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/31_getUserData.md" new file mode 100644 index 00000000..1931aa3d --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/31_getUserData.md" @@ -0,0 +1,49 @@ +###Повертає інформацію про клієнтське системне оточення (браузер, операційна система і т.д.) + +array getUserData(); + +*** + +####Формат даних результату: + + Array ( [ip] => 127.0.0.1 + [ua] => mozilla/5.0 (windows; u; windows nt 5.1; ru; rv:1.9.0.3) gecko/2008092417 firefox/3.0.3 + [browser] => mz + [long_name] => mozilla + [version] => 1.9.0.3 + [maj_ver] => 1 + [min_ver] => .9.0.3 + [letter_ver] => + [javascript] => 1.5 + [platform] => win + [os] => xp + [language] => ru,en-us,en + [gecko] => 2008092417 + [gecko_ver] => 1.9.0.3 + [html] => true + [images] => true + [frames] => true + [tables] => true + [java] => true + [plugins] => true + [css2] => true + [css1] => true + [iframes] => true + [xml] => true + [dom] => true + [hdml] => false + [wml] => false + [must_cache_forms] => true + [avoid_popup_windows] => false + [cache_ssl_downloads] => false + [break_disposition_header] => false + [empty_file_input_value] => false + [scrollbar_in_way] => false + ) + +*** + +####Приклад + + $txt = $modx->getUserData(); + //дасть інформацію про системне оточення користувача. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/32_getUserDocGroups.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/32_getUserDocGroups.md" new file mode 100644 index 00000000..0a12ae5b --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/32_getUserDocGroups.md" @@ -0,0 +1,18 @@ +###Повертає масив призначених для користувача груп, в яких поточний користувач бере участь + +*Зауваження: Функція враховує тип користувача і повертає для менеджера групи при знаходженні в системі управління, а для користувача на сайті.* + +mixed getUserDocGroups([bool $resolveIds]); + +**$resolveIds** - повертати назви груп замість ідентифікаторів. + +*** + +####Приклад + + $txt = $modx->getUserDocGroups(true); + print_r($txt); + + /* отриманий результат: + Array ( [0] => Site Admin Pages ) + */ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/33_getUserInfo.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/33_getUserInfo.md" new file mode 100644 index 00000000..12552434 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/33_getUserInfo.md" @@ -0,0 +1,42 @@ +###Отримання інформації про менеджера по заданому ідентифікатору + +mixed getUserInfo (int $uid); + +**$uid** - ідентифікатор менеджера + +*** + +####Приклад + + $txt = $modx->getUserInfo(1); + print_r($txt); + + /* отриманий результат: + Array ( [username] => admin + [password] => 21232f297a57a5a743894a0e4a801fc3 + [id] => 1 + [internalKey] => 1 + [fullname] => Default admin account + [role] => 1 + [email] => admin@modxvanilla + [phone] => + [mobilephone] => + [blocked] => 0 + [blockeduntil] => 0 + [blockedafter] => 0 + [logincount] => 11 + [lastlogin] => 1226838879 + [thislogin] => 1229864673 + [failedlogincount] => 0 + [sessionid] => e1bbad97732fbfe42c22bb6d8bc4de9d + [dob] => 0 + [gender] => 0 + [country] => + [state] => + [zip] => + [fax] => + [photo] => + [comment] => + [usertype] => manager + ) + */ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/34_getVersionData.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/34_getVersionData.md" new file mode 100644 index 00000000..89ff15f2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/34_getVersionData.md" @@ -0,0 +1,10 @@ +###Повертає інформацію про версію MODx + +array getVersionData(); + +*** + +####Приклад + + $txt = $modx->getVersionData(); + //поверне інформацію про версію MODX. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/35_getWebUserInfo.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/35_getWebUserInfo.md" new file mode 100644 index 00000000..8d7b7154 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/35_getWebUserInfo.md" @@ -0,0 +1,43 @@ +###Отримання інформації про користувача сайту по заданому ідентифікатору + +mixed getWebUserInfo (int $uid); + +**$uid** - ідентифікатор користувача сайту + +*** + +####Приклад + + $txt = $modx->getWebUserInfo(1); + print_r($txt); + + /* отриманий результат: + + Array ( [username] => siteadmin + [password] => 6f3cac6213ffceee27cc85414f458caa + [id] => 1 + [internalKey] => 1 + [fullname] => Site Admin + [role] => 0 + [email] => you@yourdomain.com + [phone] => + [mobilephone] => + [blocked] => 0 + [blockeduntil] => 0 + [blockedafter] => 0 + [logincount] => 29 + [lastlogin] => 1229874475 + [thislogin] => 1229874526 + [failedlogincount] => 0 + [sessionid] => e1bbad97732fbfe42c22bb6d8bc4de9d + [dob] => 0 + [gender] => 0 + [country] => + [state] => + [zip] => + [fax] => + [photo] => + [comment] => + [usertype] => web + ) + */ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/36_hasPermission.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/36_hasPermission.md" new file mode 100644 index 00000000..463d3394 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/36_hasPermission.md" @@ -0,0 +1,77 @@ +###Перевірка прав менеджера + +bool hasPermission(string $pm); + +**$pm** - назва перевіряючого права. Може приймати наступні значення: + +- view_document +- new_document +- save_document +- publish_document +- delete_document +- action_ok +- logout +- help +- messages +- new_user +- edit_user +- logs +- edit_parser +- save_parser +- edit_template +- settings +- credits +- new_template +- save_template +- delete_template +- edit_snippet +- new_snippet +- save_snippet +- delete_snippet +- edit_chunk +- new_chunk +- save_chunk +- delete_chunk +- empty_cache +- edit_document +- change_password +- error_dialog +- about +- file_manager +- save_user +- delete_user +- save_password +- edit_role +- save_role +- delete_role +- new_role +- access_permissions +- bk_manager +- new_plugin +- edit_plugin +- save_plugin +- delete_plugin +- new_module +- edit_module +- save_module +- delete_module +- exec_module +- view_eventlog +- delete_eventlog +- manage_metatags +- edit_doc_metatags +- new_web_user +- edit_web_user +- save_web_user +- delete_web_user +- web_access_permissions +- view_unpublished +- import_static +- export_static + +*** + +####Приклад + + $modx->hasPermission('delete_document'); + //поверне true, якщо є право на видалення документа, або false, якщо права немає. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/37_insideManager.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/37_insideManager.md" new file mode 100644 index 00000000..49641d50 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/37_insideManager.md" @@ -0,0 +1,11 @@ +###Повертає значення install (для функцій встановлення модуля), interact (для основних функцій управління) і true(для всіх остальних функцій) при знаходжені в системі управління + +*Зауваження: метод є застарілим і не рекомендується до використання. Для отримання відповідних значень необхідно використовувати константи:* + +IN_MANAGER_MODE + +SNIPPET_INTERACTIVE_MODE + +SNIPPET_INSTALL_MODE + +mixed insideManager(); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/38_invokeEvent.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/38_invokeEvent.md" new file mode 100644 index 00000000..aded7dc2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/38_invokeEvent.md" @@ -0,0 +1,12 @@ +###Викликати задану подію + +array invokeEvent(string $evtName, array $extParams); + +**$evtName** - найменування події +**$extParams** - параметри події у вигляді набору значень name => value + +*** + +####Приклад + + $modx->invokeEvent("OnWebChangePassword", array( "userid" => $id, "username" => $username, "userpassword" => $newpwd )); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/39_isBackend.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/39_isBackend.md" new file mode 100644 index 00000000..2e9d9114 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/39_isBackend.md" @@ -0,0 +1,5 @@ +###Якщо сторінка формується в системі управління (backend), то функція повертає true, інакше false + +bool isBackend(); + +Дивіться також: isFrontend(), insideManager() diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/40_isFrontend.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/40_isFrontend.md" new file mode 100644 index 00000000..bdcbf604 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/40_isFrontend.md" @@ -0,0 +1,5 @@ +###Якщо сторінка формується в призначеній для користувача частині (frontend), то функція повертає true, інакше false + +bool isFrontend(); + +Дивіться також: isBackend(), insideManager() diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/41_isMemberOfWebGroup.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/41_isMemberOfWebGroup.md" new file mode 100644 index 00000000..84097b5a --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/41_isMemberOfWebGroup.md" @@ -0,0 +1,14 @@ +###Перевірка приналежності користувача до вказаних веб-груп. Якщо користувач належить хоча б до однієї з груп, то повертається true, інакше false + +*Зауваження: якщо $ groupNames не є масивом, то метод поверне false* + +*Зауваження: для перевірки членства користувача в тій чи іншій групі краще використовувати метод getUserDocGroups.* + +bool isMemberOfWebGroup(array $groupNames); + +**$groupNames**- масив користувацьких груп +*** + +####Приклад + + $test = $modx->isMemberOfWebGroup( array('Editors')); // true diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/42_logEvent.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/42_logEvent.md" new file mode 100644 index 00000000..2bd62167 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/42_logEvent.md" @@ -0,0 +1,21 @@ +###Створює повідомлення в системний лог + +void logEvent(int $evtid, int $type, string $msg [, $source= 'Parser']); + +**$evtid** - ідентифікатор події + +**$type** - тип повідомлення: +1 - інформаційне +2 - попередження (warning) +3 - помилка + +**$msg** - записуюче повідомлення + +**$source** - назва повідомлення (наприклад: назва модуля, сніпета і т.д.) + +*** + +####Приклад + + $modx->logEvent(123, 1, 'це текст повідомлення!', 'Заголовок повідомлення'); + //запише повідомлення в лог. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/43_makeList.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/43_makeList.md" new file mode 100644 index 00000000..d792688a --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/43_makeList.md" @@ -0,0 +1,39 @@ +###Створює список по переданому масиву з урахуванням вкладеності + +string makeList(int $array[, string $ulroot[, string $ulprefix[, string $type[, bool $ordered[, int $tablevel]]]]]); + +**$array** - масив значень для списку + +**$ulroot** - назва класу для основного контейнера списку +за замовчуванням: root + +**$ulprefix** - префікс для вкладених контейнерів списку +за замовчуванням: sub_ + +**$type** - тип списку по CSS (буде додано параметр: style = 'list-style-type: $ type') +за замовчуванням: не вказано + +**$ordered** - список є нумерованим +true - нумерований список +false - ненумерований список +за замовчуванням: false + +**$tablevel** - визначає кількість табів для відступу в HTML-документі. + +*** + +####Приклад + + $txt = $modx->makeList(array(0 => 15,16, 15 => array(12,17))); + + //Поверне: +
      +
    • 15
    • +
    • 16
    • +
    • 15 +
        +
      • 12
      • +
      • 17
      • +
      +
    • +
    diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/44_makeUrl.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/44_makeUrl.md" new file mode 100644 index 00000000..a854e549 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/44_makeUrl.md" @@ -0,0 +1,28 @@ +###Створює абсолютний або відносний шлях для зазначеного документа. При цьому не перевіряється існування або статус документа + +string makeUrl(int $id[, mixed $alias[, mixed $args[, mixed $scheme]]]); + +**$id** - ідентифікатор документа +**$alias** - псевдонім документа +За замовчуванням: порожньо + +**$args** - рядок параметрів в адресі +за замовчуванням: порожньо + +**$scheme** - визначає тип посилання +full - абсолютний шлях +пусто - відносний шлях +За замовчуванням: порожньо + +*** + +####Приклад + + $url = $modx->makeUrl(4); + //відносний шлях до документа з ідентифікатором 4 + + $url = $modx->makeUrl(15, '', '', 'full'); + //абсолютний шлях до документа з ідентифікатором 4 + + $url = $modx->makeUrl(21,'','&page=2&cat=dog'); + //поверне відносний шлях до документа 21 з додатковими параметрами diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/45_mapPath.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/45_mapPath.md" new file mode 100644 index 00000000..48f1a199 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/45_mapPath.md" @@ -0,0 +1,15 @@ +###Отримання фізичного шляху по вказаному віртуальному + +*Зауваження: цей метод застарів і був виключений у версії MODx 0.9.6.2* + +Для визначення шляху необхідно використовувати константи: + +MODX_BASE_PATH + +MODX_BASE_URL + +MODX_SITE_URL + +MODX_MANAGER_PATH + +MODX_MANAGER_URL diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/46_parseText.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/46_parseText.md" new file mode 100644 index 00000000..bbedd24c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/46_parseText.md" @@ -0,0 +1,57 @@ +###Функція для заміни плейсхолдерів на значення + +string parseText(string $chunkName, array $chunkArr[, string $prefix[, string $suffix]]); + +**$chunkName** - рядок містить текст з плейсхолдерами + +**$chunkArr** - масив зі значеннями плейсхолдерів + +**$prefix** - значення початку плейсхолдера. Зазвичай використовується '[+' +за замовчуванням: [+ + +**$suffix** - значення завершення плейсхолдера. Зазвичай використовується '+]' +за замовчуванням: +] + +*** + +####Формат визначення значень плейсхолдерів: + + Array ( [name] => modx.im + [type] => site + [url] => http://modx.im ) +Це буде відповідати плейсхолдерам name, type та url, які при обробці замінюватися відповідними значеннями. + +*** + +####Приклад: + $text = 'Приклад текста з тегами, [+name+] , [+type+], [+url+]'; + $txt = $modx->parseText($text, array( 'name' => 'modx.im', 'type' => 'site', 'url' => 'http://modx.im' ), '[+', '+]' ); + //поверне: + Приклад текста з тегами, modx.im , site, http://modx.im + + +####Вихідний код функції + /** + * parseText + * @version 1.0 (2013-10-17) + * + * @desc Replaces placeholders in text with required values. + * + * @param $chunk {string} - String 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} - Parsed text. + */ + function parseText($chunk, $chunkArr, $prefix = '[+', $suffix = '+]'){ + if (!is_array($chunkArr)){ + return $chunk; + } + + foreach ($chunkArr as $key => $value){ + $chunk = str_replace($prefix.$key.$suffix, $value, $chunk); + } + + return $chunk; + } diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/47_parseProperties.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/47_parseProperties.md" new file mode 100644 index 00000000..bd329b04 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/47_parseProperties.md" @@ -0,0 +1,17 @@ +###Розбирає рядок конфігурації плагіна або сніппета і повертає поточні значення в вигляді масиву + +array parseProperties(string $propertyString); + +**$propertyString** - рядок конфігурації + +*** + +####Приклад + + $propertys = "&tinyFormats=Block Formats;text;p,h1,h2,h3,h4,h5,h6,div,blockquote,code,pre,address &entity_encoding=Entity Encoding;list;named,numeric,raw;named"; + + $txt = $modx->parseProperties($propertys); + print_r($txt); // отриманий результат: + /* Array ( [tinyFormats] => p,h1,h2,h3,h4,h5,h6,div,blockquote,code,pre,address [entity_encoding] => named + ) + */ diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/48_putChunk.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/48_putChunk.md" new file mode 100644 index 00000000..7dfbddd6 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/48_putChunk.md" @@ -0,0 +1 @@ +###Застарілий метод ідентичний getChunk (). Не рекомендується використовувати diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/49_regClientCSS.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/49_regClientCSS.md" new file mode 100644 index 00000000..8e4a6911 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/49_regClientCSS.md" @@ -0,0 +1,19 @@ +###Підключення файлу стилів CSS до документа або блоку '; + $modx->regClientCSS( $myCSS ); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/50_regClientHTMLBlock.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/50_regClientHTMLBlock.md" new file mode 100644 index 00000000..7996f59e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/50_regClientHTMLBlock.md" @@ -0,0 +1,5 @@ +###Розміщення заданого HTML-кода в кінець документа + +string regClientHTMLBlock(string $html); + +**$html** - HTML-код для розміщення. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/51_regClientScript.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/51_regClientScript.md" new file mode 100644 index 00000000..fd8e714d --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/51_regClientScript.md" @@ -0,0 +1,38 @@ +# regClientScript +### Підключення JavaScript до документу + +string regClientScript(string $src[, bool $plaintext]); + +**$src** - шлях до файлу JavaScript або код JavaScript. + +**$plaintext** - потрібно розмістити у наступному вигляді: ++ true: в $src переданий інлайн-код між `"; +$modx->regClientScript($src, true); +``` + +Отримаємо: +``` +... + + +``` + +#### Приклад 2: $plaintext = false +``` +$src = "/assets/js/file.js"; +$modx->regClientScript($src); +``` + +Отримаємо: +``` +... + + +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/52_regClientStartupHTMLBlock.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/52_regClientStartupHTMLBlock.md" new file mode 100644 index 00000000..460f5d6e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/52_regClientStartupHTMLBlock.md" @@ -0,0 +1,5 @@ +### Розміщення заданого коду HTML в область ‹head› + +string regClientStartupHTMLBlock(string $html); + +**$html** - HTML-код для розміщення. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/53_regClientStartupScript.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/53_regClientStartupScript.md" new file mode 100644 index 00000000..9295de90 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/53_regClientStartupScript.md" @@ -0,0 +1,33 @@ +### Підключення JavaScript до документу або блоку ‹script› в область ‹head› + +string regClientStartupScript(string $src[, bool $plaintext]); + +**$src** - шлях до файла JavaScript. + +**$plaintext** - потрібно розмістити в вигляді тексту, переданого в $src. +true - розміщення в вигляді тексту. +false - розміщення в вигляді зовнішнього файлу або блоку **script** +За замовчуванням: false. + +*** + +#### Приклад 1. + + $src = "assets/js/prototype.js"; $modx->regClientStartupScript($src); + Це додасть в документ наступний запис: + + + +#### Приклад 2. +Так само можна розмістити блок із готовим скриптом: + + $src2 = ""; + + $modx->regClientStartupScript($src2); + //Буде виведений ідентичний блок. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/54_removeAllEventListener.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/54_removeAllEventListener.md" new file mode 100644 index 00000000..defdec10 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/54_removeAllEventListener.md" @@ -0,0 +1,5 @@ +### Видалення всіх обробників подій + +*Примітка: використовується тільки для поточного циклу виконання.* + +string removeAllEventListener(); \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/55_removeEventListener.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/55_removeEventListener.md" new file mode 100644 index 00000000..e73877bb --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/55_removeEventListener.md" @@ -0,0 +1,7 @@ +### Видалення обробника події для плагіна + +*Примітка: використовується тільки для поточного циклу виконання.* + +string removeEventListener(string $evtName); + +**$evtName** - назва події. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/56_runSnippet.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/56_runSnippet.md" new file mode 100644 index 00000000..54da95f2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/56_runSnippet.md" @@ -0,0 +1,28 @@ +### Повернення результату виконання сніпета з заданими параметрами + +string runSnippet(string $snippetName [, array $params, int $cacheTime, string $cacheKey]); + +**$snippetName** - назва сніпета (чутливість до регістру). + +**$params** - масив зі значеннями параметрів. + +**$cacheTime** - час кешування в секундах. Збереження до повного очищення кеша при вказаному 0. **Доступно тільки в 2.0** + +**$cacheKey** - ключ кешування. Якщо не вказати час кешування, ключ буде сформованим з використанням $_GET та $params масивів. **Доступно тільки в 2.0** + +*** + +#### Приклад + + $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`]] diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/57_sendAlert.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/57_sendAlert.md" new file mode 100644 index 00000000..e835312a --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/57_sendAlert.md" @@ -0,0 +1,26 @@ +###Надсилання повідомлення на скриньку користувача + +*Примітка: скриньки в системі мають лише менеджери, тому надсилати повідомлення можна тільки для них.* + +void sendAlert(string $type, mixed $to, mixed $from, string $subject, string $msg[, int $private]); + +**$type** - тип повідомлення. + +**$to** - менеджер, якому прийде повідомлення, ідентифікатор або логін менеджера. + +**$from** - менеджер, від якого прийде повідомлення, ідентифікатор або логін менеджера. + +**$subject** - тема повідомлення. + +**$msg** - вміст повідомлення. + +**$private** - особисте повідомлення. + +*** + +#### Приклад. + + $modx->sendAlert('alert','admin','admin','Заголовок','Admin, Вам нове повідомлення. ;-)',1); + + // Результат: + // В системі керування admin отримає нове повідомлення. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/58_setPlaceholder.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/58_setPlaceholder.md" new file mode 100644 index 00000000..44413353 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/58_setPlaceholder.md" @@ -0,0 +1,14 @@ +### Встановлення значення глобального плейсхолдера. Самостійна заміна заданих плейсхолдерів у вмісті за допомогою MODx + +void setPlaceholder(string $name, string $value); + +**$name** - назва плейсхолдера, що задається без синтаксичної конструкції. +**$value** - значення плейсхолдера. + +*** + +#### Приклад. + + echo '[+MyPlaceholder+] за його потужність та гнучкість'; + $modx->setPlaceholder('MyPlaceholder','Я люблю MODX'); + //Встановить значення плейсхолдера MyPlaceholder. У вмісті сторінки MODx замінить заданий плейсхолдер [+MyPlaceholder+] на нове значення. Отримана фраза: "Я люблю MODX за його потужність та гнучкість". \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/59_stripTags.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/59_stripTags.md" new file mode 100644 index 00000000..f1c5a39f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/59_stripTags.md" @@ -0,0 +1,7 @@ +### Відміна викликів сніпетів, плейсхолдерів, чанків, TV-параметрів та налаштувань, а також HTML-тегів із фрагмента HTML-коду (без включення дозволених тегів) + +string stripTags(string $html[, string $allowed]); + +**$html** - фрагмент HTML-коду. + +**$allowed** - дозволені теги. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/60_toPlaceholder.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/60_toPlaceholder.md" new file mode 100644 index 00000000..e5242b8b --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/60_toPlaceholder.md" @@ -0,0 +1,23 @@ +## Задання значення плейсхолдера з урахуванням префіксу + +*Примітка: якщо в якості значення був переданий об'єкт чи масив, то робота виконуватиметься за допомою методу toPlaceholders.* + +void toPlaceholders(string $key, string $value[, string $prefix]); + +**$key** - назва плейсхолдера. +**$value** - значення плейсхолдера. +**$prefix** - префікс, що буде доданий перед назвою плейсхолдера. +За замовчуванням: порожньо. + +*** + +#### Приклад. + + // Встановимо плейсхолдер: + MyPlaceholder $modx->toPlaceholder('MyPlaceholder', 'Я люблю MODX','test.'); + + // Виведемо деякий текст для перевірки плейсхолдерів: + echo '[+test.MyPlaceholder+] за його потужність та гнучкість'; + + // Отримаємо результат: + // Я люблю MODx за його потужність та гнучкість. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/61_toPlaceholders.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/61_toPlaceholders.md" new file mode 100644 index 00000000..778fa1c5 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/61_toPlaceholders.md" @@ -0,0 +1,29 @@ +### Включення масиву чи об'єкта до набору плейсхолдерів + +*Примітка: використовує метод toPlaceholder.* + +void toPlaceholders(mixed $subject[, string $prefix]); + +**$subject** - масив чи об'єкт зі значеннями. +**$prefix** - префікс, що буде доданий перед назвою плейсхолдера. +За замовчуванням: порожньо. + +*** + +#### Приклад. + + // Задамо деякий масив, який може видати наш сніпет: + + $a = array( 'name' => 'Спільнота MODX', + 'type' => 'site', + 'url' => 'http://modx.im' + ); + // Додамо в набір плейсхолдерів: + $modx->toPlaceholders($a,'test.'); + + // Виведемо текст для перевірки плейсхолдерів: + echo ' Назва сайту: [+test.name+]
    Посилання на сайт: [+test.url+] '; + + // Отримаємо результат: + // Назва сайту: Спільнота MODX + // Посилання на сайт: http://modx.im diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/62_userLoggedIn.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/62_userLoggedIn.md" new file mode 100644 index 00000000..eb5a5734 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/62_userLoggedIn.md" @@ -0,0 +1,20 @@ +### Виведення та повернення інформації про користувача, що авторизований (як менеджер чи веб-користувач) або ні +string userLoggedIn(); + +*** + +#### Формат даних результату: + + Array ( + [loggedIn] => 1 + [id] => 1 + [username] => siteadmin + [usertype] => web + ) + +*** + +#### Приклад: + + $info = $modx->userLoggedIn(); + //Поверне інформацію про користувача. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/63_webAlert.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/63_webAlert.md" new file mode 100644 index 00000000..ac517bed --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/63_webAlert.md" @@ -0,0 +1,21 @@ +### Відображення повідомлення alert за допомогою JavaScript + +void webAlert(string $msg[, $url]); + +**$msg** - повідомлення, показане в alert. +**$url** - залежно від значення визначає дію, яка йде після alert. + +Значення починається з 'javascript:'. +Якщо далі вказати код, він виконається, а якщо далі вказати адресу, відбудеться редирект, а якщо далі порожньо - нічого. + +*** + +#### Приклад. + + $modx->webAlert('Hello!'); + //Виведе alert с повідомленням «Hello!». + + $modx->webAlert('Hello!','http://modx.im'); + //Виведе alert с повідомленням «Hello!», далі відбудеться редирект на http://modx.im. + +Також зверніть увагу на regClientScript(), sendAlert(). diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/64_sendmail.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/64_sendmail.md" new file mode 100644 index 00000000..c0a2acdb --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/64_sendmail.md" @@ -0,0 +1,36 @@ +### Функція надсилання пошти через API Evolution CMS + +Відправляє пошту за допомогою способа, що вказаний на панелі керування сайтом. +``` +$modx->sendmail() +``` + +## Приклади використання ## + +### Простий варіант: +``` + $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 підставляються з конфігурації сайту. При необхідності їх можна скоротити. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/65_getIdFromAlias.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/65_getIdFromAlias.md" new file mode 100644 index 00000000..30f150b5 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/65_getIdFromAlias.md" @@ -0,0 +1,11 @@ +### Повернення ідентифікатору документа через його URL +``` +string getIdFromAlias(string $alias); +``` +**$alias** - псевдонім документа. + +### Приклад. +``` + $id = $modx->getIdFromAlias('folder/folder/doc.html') + //id документа doc.html +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/66_parseChunk.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/66_parseChunk.md" new file mode 100644 index 00000000..f549e40d --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/66_parseChunk.md" @@ -0,0 +1,70 @@ +### Функція виклику чанка із заміною плейсхолдерів на значення + +**Важливо:** при використанні методу необхідно приділити увагу параметрам $prefix и $sufix, оскільки за замовчуванням їхні значення вважаються нестандартними. + +**Важливо:** метод не працює при виклику з підключеного файла (include, include_once, require, require_once) + +``` +string parseChunk(string $chunkName, array $chunkArr[, string $prefix[, string $suffix]]); +``` + +**$chunkName** - назва чанка (чутливість до регістру). + +**$chunkArr** - масив зі значеннями плейсхолдерів. + +**$prefix** - значення початку плейсхолдера. Зазвичай використовується '[+', за замовчуванням: { + +**$suffix** - значення завершення плейсхолдера. Зазвичай використовується '+]', за замовчуванням: } + +## Приклад: + +**Виклик** +``` +echo $modx->parseChunk( + 'test_chunk', + array( + 'uname'=>'Евеліно', + 'balance'=>'1000000' + ), + $prefix = '[+', + $suffix = '+]' +); +``` +**Чанк test_chunk:** +``` +Привіт, [+uname+]!
    +На Вашому рахунку [+balance+] грн. +``` +**Результат:** +``` +Привіт, Евеліно! +На Вашому рахунку 1000000 грн. +``` + +## Початковий код функції: +``` + /** + * 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 string $prefix {string} + * - Placeholders prefix. Default: '{'. + * @param string $suffix {string} + * - Placeholders suffix. Default: '}'. + * @return bool|mixed|string {string; false} - Parsed chunk or false if $chunkArr is not array. + * - Parsed chunk or false if $chunkArr is not array. + */ + public 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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/67_sendRedirect.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/67_sendRedirect.md" new file mode 100644 index 00000000..63e36693 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/68_sendForward.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/68_sendForward.md" new file mode 100644 index 00000000..a6104702 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/index.md" new file mode 100644 index 00000000..29a42eb9 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/03_API/index.md" @@ -0,0 +1 @@ +Документація по різним інтерфейсам, які можна використовувати для розробки сайтів на Evolution CMS. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/01_connect.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/01_connect.md" new file mode 100644 index 00000000..eabec108 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/01_connect.md" @@ -0,0 +1,30 @@ +###Встановлення зв'язку з базою + +void connect(string $host, string $dbase, string $uid, string $pwd, boolean $persist) + +**$host** - сервер для з'єднання +**$dbase** - вибір робочої бази +**$uid** - логін +**$pwd** - пароль +**$persist** - зберігати з'єднання активним +Ця функція також відстежує час, витрачений на з'єднання, і додає його до загального часу запитів. + +При невдалому з'єднанні повідомляє про помилку і завершує роботу. + +*** + +####Приклад + + //З'єднання зі сторонньою базою + $modx->db->connect('123.45.6.7', 'mydb', 'user', 'password', true); + $res = $modx->db->select('*', 'this_table'); + while($tmp = $modx->db->getRow($res, 'assoc')) { + // обробка отриманих даних + } + // Відключенння + $modx->db->disconnect() + + // Повторне підключення + $modx->db->connect(); + +При необхідності, можна створити окремий екземпляр об'єкта і організувати підключення до окремої бази без прив'язки до $modx. \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/02_delete.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/02_delete.md" new file mode 100644 index 00000000..1da1b48f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/02_delete.md" @@ -0,0 +1,16 @@ +###Видалення данних з бази + +bool delete(string $from [, string $where [, string $fields]]) + +**$from** - таблиця, в якій необхідно видалити дані +**$where** - умова, за якою необхідно видалити дані +**$fields** - список полей, які потрібно видалити. Якщо не вказано, то виддаляється весь ряд + +*** + +####Приклад + + //Видалення користувача з бази за ідентифікатором + global $modx, $table_prefix; + $id = $modx->db->escape($id); + $modx->db->delete($table_prefix.".modx_web_users", "id = $id"); \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/03_disconnect.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/03_disconnect.md" new file mode 100644 index 00000000..62f7f8d5 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/03_disconnect.md" @@ -0,0 +1,20 @@ +###Закриває поточне з'єднання з базою + +void disconnect() + +*** + +####Приклад + + //Створення з'єднання + $modx->db->connect('123.45.6.7', 'mydb', 'user', 'password', true); + $res = $modx->db->select('*', 'this_table'); + while($tmp = $modx->db->getRow($res, 'assoc')) { + // обробка отриманих даних + } + + // Відключення + $modx->db->disconnect() + + // Повторне підключення + $modx->db->connect(); \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/04_escape.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/04_escape.md" new file mode 100644 index 00000000..fa6c55b0 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/04_escape.md" @@ -0,0 +1,30 @@ +###Екранування потенційно-небезпечних символів + +string escape(string $s) + +**$s** - рядок для обробки + +При роботі цієї використовується стандартна функція **mysql_real_escape_string**, а при її відсутності **mysql_escape_string**. + +Рекомендується завжди використовувати цей метод для даних, перед тим як робити запит до бази. Це дозволить захистити базу від SQL-ін'єкцій. + +*** + +####Приклад + + function login($username, $password) { + global $modx, $table_prefix; + + $username = $modx->db->escape($username); + $password = $modx->db->escape($password); + + $res = $modx->db->select("id", $table_prefix.".modx_web_users", "username='$username' AND password='".md5($password)."'"); + + if($modx->db->getRecordCount($res)) { + $_SESSION['userid'] = $id; + + // інші дії ... + } else { + // відповідного запису не знайшлося + } + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/05_getAffectedRows.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/05_getAffectedRows.md" new file mode 100644 index 00000000..1eae35bd --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/05_getAffectedRows.md" @@ -0,0 +1,23 @@ +###Кількість рядів оброблених останнім запитом + +integer getAffectedRows ([$conn]) + +**$conn** - з'єднання з базою + +Повертає кількість рядів, які були оброблені останнім запитом INSERT, UPDATE, REPLACE або DELETE. Якщо останній запит був невдалим, то буде повернуто значення -1. + +При використанні запиту UPDATE, MySQL не зачіпає колонки з тими значеннями, які не були оновлені. В результаті використовувана PHP-функція mysql_affected_rows () може повернути тільки кількість записів, які були змінені. + +Запит REPLACE спочатку видаляє старі записи, а потім вставляє нові, в результаті чого метод повертає суму видалених і доданих записів. + +*** + +####Приклад + + function deleteid($id) { + $modx->db->query("DELETE FROM my_table WHERE userid=".$id); + if($modx->db->getAffectedRows()) { + return true; + } + return false; + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/06_getColumn.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/06_getColumn.md" new file mode 100644 index 00000000..f7f4f87e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/06_getColumn.md" @@ -0,0 +1,27 @@ +###Масив значень із заданої колонки + +mixed getColumn (string $name, $dsq) + +**$name** - назва колонки + +**$dsq** - результат виконання запиту або SQL-запит + +Цей метод повертає нумерований масив значень із заданої колонки в отриманих з бази даних. Набір даних може бути отриманий за допомогою запиту SELECT і містити кілька колонок, одну з яких можна отримати методом getColumn. + +*** + +####Приклад + + 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/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/07_getColumnNames.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/07_getColumnNames.md" new file mode 100644 index 00000000..bf31c238 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/07_getColumnNames.md" @@ -0,0 +1,27 @@ +###Масив назв колонок + +array getColumnNames($dsq) + +**$dsq** - результат виконання запиту або SQL-запит + +Цей метод повертає нумерований масив назв колонок в отриманих з бази даних. Набір даних може бути отриманий за допомогою запиту SELECT і містити кілька колонок, список назв яких можна отримати методом getColumnNames. + +*** + +####Приклад + + $result = $modx->db->select( 'id, name, age', 'people_table' ); + + // Отримати список назв колонок + $cols = $modx->db->getColumnNames( $result ); + + for( $i = 0; $i < count( $cols ); $i++ ) { + // Список назв колонок для простого заголовка + $output .= $cols[$i] . ' | '; + } + + while( $row = $modx->db->getRow( $result ) ) { // Отримати дані з результату запиту + $output .= '
    ' . $row['ItemID'] . ' | ' . $row['Name'] . ' | ' . $row['Image']; + } + + return $output; \ 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/03_DBAPI/08_getHTMLGrid.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/08_getHTMLGrid.md" similarity index 61% 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/03_DBAPI/08_getHTMLGrid.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/08_getHTMLGrid.md" index 9239f418..97bda5f4 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/03_DBAPI/08_getHTMLGrid.md" +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/08_getHTMLGrid.md" @@ -1,10 +1,10 @@ -###Формирует HTML-таблицу с данными запроса +###Формує HTML-таблицю з даними запиту string getHTMLGrid($dsq, $params) -**$dsq** - результат выполнения запроса или SQL-запрос +**$dsq** - результат виконання запиту або SQL-запит -**$params** - массив настроек вывода HTML-таблицы +**$params** - масив налаштувань виведення HTML-таблиці + columnHeaderClass + cssClass @@ -29,11 +29,11 @@ string getHTMLGrid($dsq, $params) + pagerClass + pagerStyle -Метод формирует HTML-таблицу на основе данных запроса с учетом обширного списка возможных настроек вывода. +Метод формує HTML-таблицю на основі даних запиту з урахуванням великого списку можливих налаштувань виведення. *** -####Пример +####Приклад $resource = $modx->db->query('SELECT id,name FROM modx_site_tmplvars order by name'); $result = $modx->db->getHTMLGrid( diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/09_getInsertId.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/09_getInsertId.md" new file mode 100644 index 00000000..a8c3814c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/09_getInsertId.md" @@ -0,0 +1,23 @@ +###Ідентифікатор доданої записи + +integer getInsertId([$conn]) + +**$conn** - з'єднання з базою + +Повертає AUTO_INCREMENT-ідентифікатор для останнього запису, яка була додана за допомогою запиту INSERT. Повертає 0, якщо поля AUTO_INCREMENT не створено. + +*** + +####Приклад + + 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; + } + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/10_getRecordCount.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/10_getRecordCount.md" new file mode 100644 index 00000000..73103e9f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/10_getRecordCount.md" @@ -0,0 +1,24 @@ +###Кількість записів в результаті запиту + +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; \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/11_getRow.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/11_getRow.md" new file mode 100644 index 00000000..8817f2aa --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/11_getRow.md" @@ -0,0 +1,34 @@ +###Отримання запису з результату запиту + +array getRow($ds, $mode) + +**$ds** - результат виконання запиту +**$mode** - режим роботи + ++ assoc - отримання асоціативного масиву ++ num - отримання нумерованного масиву ++ both - отримання масиву поєднуючого асоціативний і нумерований + +*** + +####Приклад + + 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 .= '
      '; + while( $row = $modx->db->getRow( $result ) ) { + $output .= '
    • Ідентифікатор: ' . $row['id'] . ' | Альбом: ' . $row['album_name'] . ' | Виконавець: ' . $row['artist'] . '
    • '; + } + $output .= '
    '; + }else{ + $output = 'Немає відповідних записів.'; + } + + return $output; + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/12_getTableMetaData.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/12_getTableMetaData.md" new file mode 100644 index 00000000..965ddf8b --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/12_getTableMetaData.md" @@ -0,0 +1,45 @@ +###Інформація про структуру таблиці + +array getTableMetaData($table) + +**$table** - назва таблиці + +Ця функція повертає багатовимірний масив з докладною інформацією про структуру заданої таблиці MySQL. + +Масив має вигляд *TableField => Array( Info => Value )*, де + ++ TableField - назва колонки, ++ Info - одне з 6 інформаційних параметрів, ++ Value - значення конкретного параметра. + +*** + +####Інформаційні параметри: + +**Field** - назва поля таблиці +**Type** - тип поля і розмір (наприклад int(5), varchar(40) або text) +**Null** - може містити значення NULL +**Key** - містить ключ для значення типу "UNI" (UNIQUE) або "PRI" (PRIMARY) +**Default** - значення за замовчуванням +**Extra** - додаткова інформація, така як використання auto_increment + +*** + +####Приклад + + $table = 'my_table'; + $data = $modx->db->getTableMetaData( $table ); + $output = ''; + + // Цикл по всіх колонках + foreach( $data as $field => $arr ) { + + // Назва колонки + $output .= '' . $field . '
    '; + + // Цикл по всіх інформаційних параметрах + foreach( $arr as $info => $value ) + $output .= $info . ': ' . $value . '
    '; // Виведення значення + } + } + return $output; \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/13_getValue.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/13_getValue.md" new file mode 100644 index 00000000..73e6ff52 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/13_getValue.md" @@ -0,0 +1,23 @@ +### Значення першої комірки з першого рядка результату запиту + +mixed getValue($dsq) + +**$dsq** - результат виконання запиту або SQL-запит + +Ця функція повертає перше значення з першої колонки в результаті запиту. +Завдяки цьому можна швидко отримати єдине передбачуване значення (наприклад, результат запиту SELECT COUNT(*)). + +*** + +#### Приклад +``` +function display_rows() { + $modx = evolutionCMS(); + $count = $modx->db->getValue( $modx->db->select( 'count(*)', 'people' ) ); + if( $count < 1 ) { + return 'No records found'; + } else { + return 'Знайдено ' . $count . ' записів в базі.'; + } +} +``` 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/03_DBAPI/14_getXML.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/14_getXML.md" similarity index 51% 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/03_DBAPI/14_getXML.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/14_getXML.md" index 1ffa2e09..6bb31402 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/03_DBAPI/14_getXML.md" +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/14_getXML.md" @@ -1,10 +1,10 @@ -###Результат запроса в формате XML +###Результат запиту в форматі XML string getXML($dsq) -**$dsq** - результат выполнения запроса или SQL-запрос +**$dsq** - результат виконання запиту або SQL-запит -####Данные полученных результатов запроса выводятся в следующем формате: +####Дані отриманих результатів запиту виводяться в наступному форматі: @@ -21,11 +21,11 @@ string getXML($dsq) -Каждая запись заключается в тег . "Field#" соответствуют названиям колонок, а "Value#" значениям. +Кожен запис огортається в тег . "Field#" співпадають з назвами колонок, а "Value#" значенням. *** -####Пример +####Приклад $result = $modx->db->select( 'id, name, location', 'places', '' ); $xml = $modx->db->getXML( $result ); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/15_insert.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/15_insert.md" new file mode 100644 index 00000000..c471fcbc --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/15_insert.md" @@ -0,0 +1,36 @@ +###Додавання запису + +mixed insert($fields, $intotable [, $fromfields [, $fromtable [, $where [, $limit ]]]]) + +**$fields** - асоціативний масив доданих значень, з назвою поля у вигляді ключа + +**$intotable**- таблиця для додавання + +**$fromfields** - список полів використовуваних для імпорту з іншої таблиці + +**$fromtable** - таблиця використовується для імпорту + +**$where** - умова для запиту даних з таблиці для імпорту + +**$limit** - обмеження кількості записів для імпорту + +Метод INSERT дозволяє додавати нові записи в базу даних. Значення передаються у вигляді асоціативного масиву $fields, формат якого field => value. Ключ "field" вказує на назву колонки, а "value" - додане значення. + +Параметри $fromfields, $fromtable, $where и $limit використовуються для копіювання даних з однієї таблиці в іншу. + +Цей метод повертає AUTO_INCREMENT-ідентифікатор для доданого запису. + +*** + +####Приклад + + 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); + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/16_makeArray.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/16_makeArray.md" new file mode 100644 index 00000000..01875362 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/16_makeArray.md" @@ -0,0 +1,29 @@ +### Результат запиту у вигляді масиву + +mixed makeArray($rs, $index = false) + +**$rs** - результат виконання запиту + +**$index** - ім'я поля для використання його значення як ключ в масиві, якщо рівне false - ключі в масиві будуть числові. + +Цей метод повертає багатовимірний асоціативний масив з даними результату запиту в форматі Key => Array(FieldName => Value). + +*** + +#### Приклад +``` +function show_members(){ + $modx = evolutionCMS(); + $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 . '
    '; + } + } +} +``` \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/17_prepareDate.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/17_prepareDate.md" new file mode 100644 index 00000000..d9b59ee6 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/17_prepareDate.md" @@ -0,0 +1,27 @@ +###Форматування виведення дати + +string prepareDate($timestamp, $fieldType) + +**$timestamp** - дата в форматі Unix timestamp + +**$fieldType** - варіант форматування + ++ DATE - формат виду Y-m-d. Приклад: "2007-04-30" ++ TIME - формат виду H:i:s. Приклад: "13:43:27" ++ YEAR - формат виду Y. Приклад: "2007" ++ DATETIME (за замовчуванням) - формат виду Y-m-d H:i:s. Приклад: "2007-04-30 13:43:27" + +*** + +####Приклад + + function getEvents( $date ) { + global $modx; + $output = ''; + $fulldate = $modx->db->prepareDate( $date, 'DATE' ); + //Перетворює дату в зручний для читання вигляд + $result = $modx->db->select( 'event_name', 'events', 'timestamp = ' . intval( $date ) ); + while( $row = $modx->db->getRow( $result ) ) { + $output .= $row['event_name'] . ' відбудеться ' . $fulldate . '.'; + } + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/18_query.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/18_query.md" new file mode 100644 index 00000000..3d92a1cb --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/18_query.md" @@ -0,0 +1,21 @@ +###Прямий запит до бази даних +mixed query($sql) + +**$sql** - рядок з SQL-запитом + +Різні методи DBAPI роблять в кінцевому підсумку запит до бази за допомогою методу "query". Якщо не вистачає стандартних можливостей спеціальних методів, то можна зробити будь-який SQL-запит на пряму. +*** + +####Приклад + + $output = ''; + $result = $modx->db->query( 'SELECT id, name, joined FROM `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; \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/19_select.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/19_select.md" new file mode 100644 index 00000000..57f816d3 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/19_select.md" @@ -0,0 +1,38 @@ +###Отримання даних + +resource select($fields , $from [, $where [, $orderby [, $limit]]]) + +**$fields** - список необхідних полей із запиту +**$from** - таблиця для вибірки +**$where** - умова вибірки +**$orderby** - поле за яким потрібно зробити сортування +**$limit** - обмеження кількості записів в результаті запиту + +Метод "select" дозволяє зробити звичайний запит в базу для отримання даних, які відповідають заданим параметрам. + +*** + +####Приклад + +```php +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{ + + // відповідного запису не знайшлося + } + } +``` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/20_update.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/20_update.md" new file mode 100644 index 00000000..9c2555c2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/20_update.md" @@ -0,0 +1,29 @@ +###Оновлення даних + +boolean update($fields, $table, $where) + +**$fields** - масив оновлюваних значень +**$table** - таблиця для оновлення +**$where** - умова для пошуку оновлюваних записів + +Метод "update" дозволяє оновити дані в базі, передавши нові значення в масиві $fields. Формат масиву оновлюваних значень - field => new_value, де "field" - назва оновлюваного поля, а "new_value" - нове значення. + +*** + +####Приклад + + $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 'Інформація оновлена!'; + } else { + echo 'Виникла проблема під час запиту...'; + } \ No newline at end of file diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/index.md" new file mode 100644 index 00000000..fc4dd6ff --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/04_DBAPI/index.md" @@ -0,0 +1 @@ +Документація по різних інтерфейсах, які можна використовувати для розробки сайтів на MODx. \ 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/04_\320\241\320\270\321\201\321\202\320\265\320\274\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/01_config.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/01_config.md" similarity index 75% 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/04_\320\241\320\270\321\201\321\202\320\265\320\274\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/01_config.md" rename to "ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/01_config.md" index ab9db35c..f119ff86 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/04_\320\241\320\270\321\201\321\202\320\265\320\274\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/01_config.md" +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/01_config.md" @@ -1,20 +1,20 @@ -###Системные настройки +###Системні налаштування array config -Содержит информацию о системных настройках в виде ассоциативного массива. Использовать напрямую его не рекомендуется и для получения информации существует метод API - getConfig +Містить інформацію про системні налаштування у вигляді асоціативного масива. Використовувати напряму його не рекомендується і для отримання інформації існує метод API - getConfig -####Пример +####Приклад ```` echo $modx->config['modx_charset']; ```` -Можно посмотреть все возможные элементы настроек +Можна переглянути всі можливі елементи налаштувань ```` var_dump($modx->config); ```` -Вернёт: +Поверне: ```` array(162) { @@ -135,73 +135,73 @@ manager/includes/config.inc.php" ["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) "Данные для авторизации" + ["emailsubject_default"]=> string(42) "Дані для авторизації" ["reload_signupemail_message"]=> string(0) "" - ["signupemail_message"]=> string(450) "Здравствуйте, ! + ["signupemail_message"]=> string(450) "Добрий день, ! -Ваши данные для авторизации в системе управления сайтом : +Ваші дані для авторизації у системі керування сайтом : -Имя пользователя: +Ім'я користувача: Пароль: -После успешной авторизации в системе управления сайтом (), вы сможете изменить свой пароль. +Після успішної авторизації у системі керування сайтом (), ви зможете змінити свій пароль. -С уважением, Администрация" +З повагою, Адміністрація" ["system_email_signup_default"]=> - string(450) "Здравствуйте, ! + string(450) "Добрий день, ! -Ваши данные для авторизации в системе управления сайтом : +Ваші дані для авторизації у системі керування сайтом : -Имя пользователя: +Ім'я користувача: Пароль: -После успешной авторизации в системе управления сайтом (), вы сможете изменить свой пароль. +Після успішної авторизації у системі керування сайтом (), ви зможете змінити свій пароль. -С уважением, Администрация" +З повагою, Адміністрація" ["reload_websignupemail_message"]=> string(0) "" - ["websignupemail_message"]=> string(366) "Здравствуйте, ! + ["websignupemail_message"]=> string(366) "Добрий день,, ! -Ваши данные для авторизации на : +Ваші дані для авторизації на : -Имя пользователя: +Ім'я користувача: Пароль: -После успешной авторизации на (), вы сможете изменить свой пароль. +Після успішної авторизації у системі керування сайтом (), ви зможете змінити свій пароль. -С уважением, Администрация" - ["system_email_websignup_default"]=> string(366) "Здравствуйте, ! +З повагою, Адміністрація" + ["system_email_websignup_default"]=> string(366) "Добрий день, ! -Ваши данные для авторизации на : +Ваші дані для авторизації на : -Имя пользователя: +Ім'я користувача: Пароль: -После успешной авторизации на (), вы сможете изменить свой пароль. +Після успішної авторизації у системі керування сайтом (), ви зможете змінити свій пароль. -С уважением, Администрация" +З повагою, Адміністрація" ["reload_system_email_webreminder_message"]=> string(0) "" - ["webpwdreminder_message"]=> string(490) "Здравствуйте, ! + ["webpwdreminder_message"]=> string(490) "Добрий день, ! -Чтобы активировать ваш новый пароль, перейдите по следующей ссылке: +Щоб активувати ваш новий пароль, перейдіть за наступним посиланням : -Позже вы сможете использовать следующий пароль для авторизации: +Пізніше ви зможете викоритовувати наступинй пароль для авторизації: -Если это письмо пришло к вам по ошибке, пожалуйста, проигнорируйте его. +Якщо цей лист прийшов до вас по помилці, будь ласка, проігноруйте його. -С уважением, Администрация" - ["system_email_webreminder_default"]=> 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) "" @@ -244,4 +244,4 @@ manager/includes/config.inc.php" ["site_manager_url"]=> string(24) "http://site.ru/dostup/" ["site_manager_path"]=> string(46) "/home/site/web/site.ru/public_html/dostup/" } -```` \ No newline at end of file +```` diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/02_documentIdentifier.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/02_documentIdentifier.md" new file mode 100644 index 00000000..6c224444 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/02_documentIdentifier.md" @@ -0,0 +1,9 @@ +###Ідентифікатор поточного ресурсу + +int documentIdentifier + +Містить ID документа на якому був викликаний код. + +####Приклад + + documentIdentifier; ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/03_documentMethod.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/03_documentMethod.md" new file mode 100644 index 00000000..356a151f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/03_documentMethod.md" @@ -0,0 +1,16 @@ +###Метод отримання ресурсу + +string documentMethod + +Можливі значення: + +**alias** - отримано за допомогою переданого псевдоніма + +**id** - отримано за допомогою переданого ідентифікатора +none - метод не визначений + +Містить інформацію про метод,ияким була отримана сторінка. Навіть якщо був використаний псевдонім, то після визначення ідентіфкатора ресурсу, метод автоматично змінюється на id.і + +####Приклад + + documentMethod; ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/04_documentGenerated.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/04_documentGenerated.md" new file mode 100644 index 00000000..1579474f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/04_documentGenerated.md" @@ -0,0 +1,15 @@ +###Сторінка була згенерована + +bool documentGenerated + +Можливі значення: + +**1** - сторінка була згенерована + +**0** - сторінка була отрмана з кешу + +Містить інформацію про те, чи був документ згенерований, або взятий з cache. + +####Приклад + + documentGenerated; ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/05_documentContent.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/05_documentContent.md" new file mode 100644 index 00000000..f4a49010 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/05_documentContent.md" @@ -0,0 +1,9 @@ +###Зміст сторінки + +string documentContent + +Містить повний зміст сторінки. У процесі генерації вміст поетапно змінюється та записується в цю змінну. + +####Приклад + + documentContent; ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/06_tstart.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/06_tstart.md" new file mode 100644 index 00000000..2d74dd30 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/06_tstart.md" @@ -0,0 +1,13 @@ +###Час початку роботи MODX + +float tstart + +Містить час початку роботи MODX у форматі "unix time", це дозволяє оцінити час генерування сторінки . + +####Приклад + + tstart; + echo strftime("%H:%M:%S", $time); + // введіть щось типу такого "17:56:10" + ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/07_minParserPasses.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/07_minParserPasses.md" new file mode 100644 index 00000000..3ce2e128 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/07_minParserPasses.md" @@ -0,0 +1,9 @@ +###Мінімальна кількість проходів парсеру + +int minParserPasses + +Містить мінімальне число проходів парсером. + +####Приклад + + minParserPasses; ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/08_maxParserPasses.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/08_maxParserPasses.md" new file mode 100644 index 00000000..24dde61b --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/08_maxParserPasses.md" @@ -0,0 +1,9 @@ +###Максимальна кількість проходів парсера + +int maxParserPasses + +Містить максимальне число обробки парсером вмісту. + +####Приклад + + maxParserPasses; ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/09_documentObject.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/09_documentObject.md" new file mode 100644 index 00000000..d9e84600 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/09_documentObject.md" @@ -0,0 +1,14 @@ +###Дані поточного ресурсу + +array documentObject + +Містить повний набір даних для поточної сторінки у вигляді ассоціативного масиву. В тому числі у цей масив попадає інформація про TV-параметри. Всі дані можуть бути доступні за допомогою тегів виду . + +Відповідний метод API для отримання даних з documentObject немає. + +####Приклад + + documentObject['pagetitle']; + // Введіть заголовок сторінки + ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/10_documentListing.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/10_documentListing.md" new file mode 100644 index 00000000..986485b6 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/10_documentListing.md" @@ -0,0 +1,12 @@ +###Масив відповідності псевдоніма і ідентифікатора ресурсу + +array documentListing + +Містить соціативний масив з інформацією про відповідність псевдонімів і ідентифікаторів для усіх ресурсів сайту. У якості ключа використовується псевдонім з урахування настройки вкладеності, а у якості значення ідентифікатор ресурсу. Якщо псевдонім у ресурсі не визначений, то в якості ключа так само використовується ідентифікатор. + +####Приклад + + documentListing['index']; + // Введіть ідентифікатор сторінки з псевдонімом "index" + ?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/05_\320\241\320\270\321\201\321\202\320\265\320\274\320\275\321\226_\320\267\320\274\321\226\320\275\320\275\321\226/index.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/11_Restriction_ddMaxLenght.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/11_Restriction_ddMaxLenght.md" new file mode 100644 index 00000000..bec37aba --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/11_Restriction_ddMaxLenght.md" @@ -0,0 +1,17 @@ +###Віджет для плагіна ManagerManager, дозволяє обмежити кількість символів, що вводять в TV. + +mm_ddMaxLength(string $fields, string $roles, string $templates, int $length); + +####Опис параметрів + +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), для яких необхідно застосувати віджет.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення - всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +length|Максимальна кількість символів, які можна ввести.|{integer}|150|false + +####Приклади +Підключення віджету для TV «Slogan», обмеживши кількість символів, що вводять до 140 + + mm_ddMaxLength('Slogan', '', '', 140); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/12_Restriction_ddNumericField.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/12_Restriction_ddNumericField.md" new file mode 100644 index 00000000..8d87296c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/12_Restriction_ddNumericField.md" @@ -0,0 +1,22 @@ +###Віджет для плагіна ManagerManager, дозволяє зробити можливе введення в TV тільки цифр. + +mm_ddNumericFields(string $tvs, string $roles, string $templates, bool $allowFloat, int $decimals); + +####Опис параметрів + +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tvs|Імена TV, для яких необхідно застосувати віджет.|{comma separated string}|-|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +allowFloat|Чи можна вводити числа з плаваючою комою?|{0; 1}|1|false +decimals|Кількість цифр після коми (0 — будь-яке).|{integer}|0|false + +####Приклади +Зробити можливим введення тільки цілих чисел в TV «price» для всіх шаблонів і всіх ролей + + mm_ddNumericFields('price', '', '', 0); + +Зробити можливим введення тільки цифр з точністю в 2 знаки після коми в TV «price» для шаблонів з id, рівним 15 або 16 і всіх ролей + + mm_ddNumericFields('price', '', '15,16', 1, 2); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/13_Restriction_hideTemplates.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/13_Restriction_hideTemplates.md" new file mode 100644 index 00000000..8a1b8d82 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/13_Restriction_hideTemplates.md" @@ -0,0 +1,20 @@ +###Віджет для плагіна ManagerManager, дозволяє приховати необхідні шаблони зі списку на сторінці редагування документа. + +mm_hideTemplates(string $tplIds, string $roles, string $templates); + +####Опис параметрів + +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tplIds|Id шаблонів, які необхідно приховати зі списку.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|-|false + +####Приклади +Приховати шаблон з id = 0 (blank) зі списку у всіх документах для всіх користувачів + + mm_hideTemplates('0'); + +Приховати шаблони з id = 0 и 4 зі списку у всіх документах для всіх користувачів з id ролі = 1 + + mm_hideTemplates('0,4', '1'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/14_Restriction_requireFields.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/14_Restriction_requireFields.md" new file mode 100644 index 00000000..dea839fb --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/14_Restriction_requireFields.md" @@ -0,0 +1,21 @@ +###Віджет для плагіна ManagerManager, дозволяє зробити поля документу або TV обов'язковими для заповнення. + +*Добавляє зірочку червоного кольору поруч з ім'ям обов'язкового для заповнення поля, видає повідомлення при спробі зберегти не заповнивши обов'язкові поля, запобігаючи збереження.* + +mm_requireFields(string $fields, string $roles, string $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), які повинні бути обов'язковими.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Зробити обов'язковим для заповнення заголовки і дати публікації всіх документів + + mm_requireFields('pagetitle,pub_date'); + + + + diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/15_Restriction_hideFields.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/15_Restriction_hideFields.md" new file mode 100644 index 00000000..ae6d865f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/15_Restriction_hideFields.md" @@ -0,0 +1,24 @@ +###Віджет для плагіна ManagerManager, дозволяє приховувати поля документа або TV. + +mm_hideFields(string $fields, string $roles, string $templates); + + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), які необхідно приховати.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Приховати поле «атрибуты ссылки» для всіх користувачів + + mm_hideFields('link_attributes'); + +Приховати поле «псевдоним» у документів з id шаблону = 3 для користувачів з id ролі = 1 + + mm_hideFields('alias', '1', '3'); + +Приховати TV «myVar» для користувачів з id ролі = 2 + + mm_hideFields('myVar', '2'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/16_Restriction_ddReadonly.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/16_Restriction_ddReadonly.md" new file mode 100644 index 00000000..3392a9a6 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/16_Restriction_ddReadonly.md" @@ -0,0 +1,21 @@ +###Віджет для плагіна ManagerManager, дозволяє зробити поля документа та TV доступними тільки для читання + +*значення відображаються при редагуванні, але їх неможливо змінити.* + +mm_ddReadonly(string $fields, string $roles, string $templates); + +####Опис параметрів + +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|-------------------|---------------------|----------- +fields|Поля документа (або TV), які необхідно зробити доступними лише для читання.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + + +####Пояснення +Доволі рідко, але іноді бувають випадки, коли ми зберігаємо якусь інформацію про документ в його TV (наприклад, кількість переглядів або завантажень, рейтинг і т.д.). Така інформація оновлюється автоматично (який-небудь сніппет / плагін просто зберігає значення в TV відповідного документу). І ось Петя раптом вирішив відредагувати текст документу: відкрив, почав писати, його відволікли по роботі, потім подзвонили, потім терміново довелося виїхати, дві години їздив, повернувся, продовжив редагувати. Весь цей час документ у нього був відкритий, дані про кількість завантажень вже 100 раз встигли помінятися (було 3, а стало 33), але у Петі до сих пір відображається 3. Петя закінчив свою роботу, натискає «Сохранить» і… кількість завантажень перезаписується на 3! Неприємна ситуація. Що можна зробити? Варіант 1: можна зробити якусь супер-системну групу та виставити її для тих TV, значення яких не повинні редагуватися користувачами. Непоганий варіант, але не надійний (може знайтися хтось, хто поставить собі цю групу і обов'язково щось зіпсує) і не підходить, якщо хочеться бачити ці дані при редагуванні документу. Саме для таких випадків і призначений цей віджет. +Робота віджета ділиться на 3 частини: +Перед збереженням документа (OnBeforeDocFormSave) виходять і запам'ятовуються актуальні значення необхідних полів (з бази). +Після збереження (OnDocFormSave) записуються назад. +JS робить поля візуально не редагованими. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/21_Values_inherit.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/21_Values_inherit.md" new file mode 100644 index 00000000..fe3f0abe --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/21_Values_inherit.md" @@ -0,0 +1,19 @@ +###Віджет для плагіна ManagerManager, дозволяє успадковувати значення полів або TV від батьків для нових документів/папок. + +mm_inherit($fields,$roles,$templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), які необхідно наслідувати.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Виставляти всім новим документам заголовок як у батька для користувачів з id роллю = 0 або 1 + + mm_inherit('pagetitle', '0,1'); + +Виставляти всім новим документам заголовок і розширений заголовок як у батьків + + mm_inherit('pagetitle,longtitle'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/22_Values_default.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/22_Values_default.md" new file mode 100644 index 00000000..58d63f94 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/22_Values_default.md" @@ -0,0 +1,20 @@ +###Віджет для плагіна ManagerManager, дозволяє задати значення за замовчуванням для полів/TV нових документів/папок. Зараз TV задаються як «tvN», де N — id TV. + +mm_default($field,$value,$roles,$templates,$eval); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +field|Поле документа (або TV), для якого необхідно встановити значення за замовчуванням.|{string}|—|true +value|Значення за замовчуванням. Якщо в якості поля вказано «pub_date» або «unpup_date», а значення порожнє, то виставиться поточна дата. Також значення може бути рядком PHP-коду, який буде виконаний при параметрі «eval» = true.|{string}|—|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|-|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +eval|Чи необхідно обробляти значення параметра «value» як PHP-код?|{bollean}|false|false + +####Приклади +Завжди виставляти як дати публікації документів поточну дату і час + + mm_default('pub_date'); +Автоматично виставляти дату скасування публікації через 4 тижні від поточної для документів з id шаблону = 4 + + mm_default('unpub_date', 'return date("d-m-Y H:i:s", now()+(60*60*24*28));', '', '4', true); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/23_Values_ddSetFieldValue.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/23_Values_ddSetFieldValue.md" new file mode 100644 index 00000000..51bd958c --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/23_Values_ddSetFieldValue.md" @@ -0,0 +1,19 @@ +###Віджет для плагіна ManagerManager, дозволяє жорстко встановлювати необхідні значення полів документа або TV (схожий на mm_default, але виставляє завжди). + +mm_ddSetFieldValue($field, $value, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +field|Ім'я поля або TV, для якого необхідно встановити значення.|{string}|—|true +value|Значення, яке необхідно встановити.|{string}|—|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Зробити документи з шаблоном id = 25 завжди неопублікованими + + mm_ddSetFieldValue('published', '0', '', '25'); +У документів з шаблонами id = 1 і 3 виставити значення TV «someTv» в 'this is some' для редакторів (роль з id = 2) + + mm_ddSetFieldValue('someTv', 'this is some', '2', '1,3'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/24_Values_synch_fields.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/24_Values_synch_fields.md" new file mode 100644 index 00000000..194ddab1 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/24_Values_synch_fields.md" @@ -0,0 +1,16 @@ +###Віджет для плагіна ManagerManager, дозволяє синхронізувати значення полів документа (або TV) при редагуванні. +*наприклад: щоб заголовок і пункт меню документа були однаковими, — особливо зручно, коли одне з полів приховано. Працює тільки з текстовими полями (input, textarea).* + +mm_synch_fields($fields, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), які необхідно синхронізувати. Необхідно задати мінімум 2 поля.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Зробити значення цих полів завжди однаковими (для всіх користувачів і документів) + + mm_synch_fields('pagetitle,menutitle,longtitle'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/31_Changing_renameField.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/31_Changing_renameField.md" new file mode 100644 index 00000000..4531944f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/31_Changing_renameField.md" @@ -0,0 +1,20 @@ +###Віджет для плагіна ManagerManager, дозволяє перейменувати одне зі стандартних полів документа або TV. + +mm_renameField($field, $newlabel, $roles, $templates, $newhelp); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +field| Поле документа або TV, які необхідно перейменувати. |{comma separated string} |—| true +newlabel| Новий текст для відображення. |{string} |—| true +roles| Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі. |{comma separated string} |—| false +templates| Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони. |{comma separated string} |—| false +newhelp| Новий текст підказки, спливаючий при наведенні на іконку поруч з полем, або опису для TV. |{string} |—| false + +####Приклади +Перейменувати поле «расширенный заголовок» у всіх документах для всіх користувачів + + mm_renameField('longtitle', 'Расширенный заголовок (meta «title»)'); +Перейменувати поле «заголовок» у документах з id шаблону = 3 для всіх користувачів + + mm_renameField('longtitle', 'ФИО', '', '3'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/32_Changing_changeFieldHelp.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/32_Changing_changeFieldHelp.md" new file mode 100644 index 00000000..b665d1cd --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/32_Changing_changeFieldHelp.md" @@ -0,0 +1,19 @@ +###Віджет для плагіна ManagerManager, дозволяє змінити текст підказки, що з'являється при наведенні на іконку поруч з полем документа, або опису під TV. + +mm_changeFieldHelp($field, $helptext, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +field| Поле документа (або TV), у якого необхідно змінити підказку. |{string} |—| true +helptext| Новий текст підказки. |{string}| — |true +roles| Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі. |{comma separated string}|—| false +templates| Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони. |{comma separated string} |—| false + +####Приклади +Змінити підказку для поля «расширенный заголовок» у всіх документах для всіх користувачів + + mm_changeFieldHelp('longtitle', 'Цей текст буде відображатися в заголовку браузера і закладках'); +Змінити підказку для поля «псевдоним» у всіх документах для користувачів з id ролі = 3 + + mm_changeFieldHelp('alias', 'Це останній фрагмент адреси сторінки', '3'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/41_Enhance_ddMultipleFields.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/41_Enhance_ddMultipleFields.md" new file mode 100644 index 00000000..0a08fe3b --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/41_Enhance_ddMultipleFields.md" @@ -0,0 +1,60 @@ + +###Віджет для плагіна ManagerManager, дозволяє додавати довільну кількість значень полів (TV) до одного документу (значення записуються в одне через необхідні роздільники), наприклад: кілька зображень. + +mm_ddMultipleFields($tvs, $roles, $templates, $columns, $columnsTitle, $colWidth, $splY, $splX, $imgW, $imgH, $minRow, $maxRow, $columnsData, $options); + +####Можливості: +- Додавання до одного документу довільної кількості зображень, текстових полів, списків (з можливістю вибору значень). +- Завдання декількох колонок різних типів (або однакових), наприклад: зображення і підписи до них (параметр «coloumns»). +- Вивід заголовків колонок (параметр «coloumnsTitle»). +- Кількість значень (рядків) може бути як фіксованим, динамічним, так і в певних діапазонах (параметри «minRow» і «maxRow»). +- Сортування (перетягування) рядків між собою. +- Генерація унікального ідентифікатора кожного рядка (параметр «coloumns»). +- Вивід зумовлених списків значень (параметри «coloumns» і «coloumnsData»). Увага, це поки в беті! +- Пакетне заповнення зображень (тільки одна колонка) + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|--------|--------|-------- +tvs|Імена TV, для яких необхідно застосувати віджет. | {comma separated string} | — | true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення - всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +columns|Типи колонок: field — колонка типу поля; text — текстова колонка; textarea — колонка з багаторядковим полем; richtext — колонка з HTML-редактором (TinyMCE); date — колонка з датою; id — прихована колонка з унікальним ідентифікатором; select — список з вибором значень (см. параметр «coloumnsData»).|{comma separated string}|'field'|false +columnsTitle|Заголовки колонок. Після подвійної двокрапки можна вказати підказку колонки|{comma separated string}|—|false +colWidth|Ширини колонок, через кому. Можна вказати auto. Якщо для колонки не буде вказано, прийме значення останньої зазначеної|{comma separated string}|180|false +splY|Роздільник між рядками. {string}|'\|\|'|false +splX|Роздільник між колонками.|{string}|'::'|false +imgW|Максимальна ширина превьюшки (для зображень).|{integer}|300|false +imgH|Максимальна висота превьюшки (для зображень).|{integer}|100|false +minRow|Мінімальна кількість рядків.|{integer}|0|false +maxRow|Максимальна кількість рядків (0 — без ліміту).|{integer}|0|false +columnsData|Список можливих значень для полів в форматі json, через \|\|. Для кожного пункту масив: Значення, опис і прапор за замовчуванням|{separated string}|—|false +options|Додаткові параметри: sortable:false - дозволяє відключити можливість сортування,showIndex - відобразити порядкові номери рядків,btnToggleRaw - кнопка включення/виключення оригінального поля, що дає можливість скопіювати і вставити все значення|{php Array or JSON string}|\{sortable:true, showIndex:true, btnToggleRaw:false\}|false + +####Приклади +Зробити можливість додавання довільних зображень для tv «someImage» (у tv повинен бути виставлений тип «image») + + mm_ddMultipleFields('someImage'); +Можливість додавання зображень і підписів до них, вивід відповідних заголовків тільки для шаблонів з id = 5 + + mm_ddMultipleFields('someImage', '', '5', 'field,text', 'Изображение,Подпись'); +Можливість додавати контакти співробітників, але не більше 5 і не менше 2, з різними розмірами колонок (для текстової tv «employees») + + mm_ddMultipleFields('employees', '', '', 'text,text,text', 'Имя,Телефон,Должность', '250,100,100', '||', '::', 300, 100, 2, 5); +Підказки для заголовків, Списки можливих значень (в даному прикладі для обох селектів однаковий вибір), із зазначенням значення за замовчуванням + + mm_ddMultipleFields("socialwidgets",'','','select,select', + 'Поделиться::Используется чанк {{share}},Комментарии::Используется чанк {{comments}}', + 'auto','||','::','','',1,1, + '[["",""],[0,"Нет"],[1,"Да"],[2,"Да, кроме контейнеров",1]]' + ); + +Зображення, пакетне заповнення + + mm_ddMultipleFields('gallery', '', '', 'image,text,text', 'Изображение,Название,Описание'); + +Додаткові опції: +Відображення кнопки RAW + + mm_ddMultipleFields('gallery', '', '', 'image,text,text', 'Изображение,Название,Описание','180','||','::','','',0,0,'',"{btnToggleRaw:true}"); + diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/42_Enhance_ddSelectDocuments.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/42_Enhance_ddSelectDocuments.md" new file mode 100644 index 00000000..6be7bbee --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/42_Enhance_ddSelectDocuments.md" @@ -0,0 +1,15 @@ +###Віджет для плагіна ManagerManager, призначений для вибору id певних документів в зручному вигляді + +mm_ddSelectDocuments($tvs, $roles, $templates, $parentIds, $depth, $filter, $max, $labelMask); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tvs|Імена TV, для яких необхідно застосувати віджет.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +parentIds|Id батьківських документів, дочірні документи яких необхідно вибирати.|{comma separated string}|—|true +depth|Глибина пошуку дочірніх документів.|{integer}|1|false +filter|Умови фільтрації документів (чимось схожий на фільтр Ditto), розділені через '&' між парами і через '=' між ключем і значенням. Наприклад: 'template=15&published=1', — отримаємо тільки опубліковані документи з id шаблону 15.|{separated string}|—|false +max|Максимальна кількість документів, яку користувач може вибрати (при == 0 — без обмежень).|{integer}|0|false +labelMask|Шаблон відображення елемента в списку вибору документів. Задається як рядок, що містить плейсхолдери з полями документа (та TV). Також доступний додатковий плейсхолдер '[+title+]', в який буде підставлено значення поля «menutitle», а якщо воно не заповнено, то «pagetitle».|{string}|'[+title+] \([+id+]\)'| false diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/43_Enhance_widget_tags.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/43_Enhance_widget_tags.md" new file mode 100644 index 00000000..594b55a1 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/43_Enhance_widget_tags.md" @@ -0,0 +1,27 @@ +###Віджет для плагіна ManagerManager, дозволяє в зручній формі додавати теги до документів (для потрібної TV автоматично формується «список» вибору з усіма тегами, при цьому, нові теги просто вписуються через роздільник тут же) на сторінці редагування документа. + +*TV повинна бути текстового типу.* + +mm_widget_tags($fields, $delimiter, $source, $display_count, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|TV, для яких необхідно відобразити теги.|{comma separated string}|—|true +delimiter|Роздільник між тегами в полі|{string}|','|false +source|TV, з яких повинні братися теги для списку вибору. Це дозволяє використовувати різні поля для введення тегів і формування списку вибору. За замовчуванням значення береться з параметра «fields». Не використовуйте цей параметр, якщо не впевнені.|{comma separated string}|fields|false +display_count|Чи відображати в списку вибору кількість документів, в яких використовується тег (в скобочках после самого тега)?|{boolean}|false|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Зробити для TV «docTags» віджет тегів у всіх документів (де вона використовуєте) для всіх ролей + + mm_widget_tags('docTags'); +Зробити для TV «docTags» і «blogTags» віджет тегів у всіх документів (де вони використовуються) для всіх ролей. +При цьому, списки вибору тегів і кількість документів, які використовують кожен тег будуть однаковими для обох TV. + + mm_widget_tags('docTags,blogTags'); +Зробити для TV «docTags» віджет тегів з відображенням кількості документів, що використовують кожен тег поруч з ним у документів з id шаблону = 2 для всіх ролей + + mm_widget_tags('docTags', ',', '', '1', '', '2'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/44_Enhance_widget_colors.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/44_Enhance_widget_colors.md" new file mode 100644 index 00000000..1c9a6194 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/44_Enhance_widget_colors.md" @@ -0,0 +1,21 @@ +###Віджет для плагіна ManagerManager, дозволяє додати інструмент вибору кольору з палітри для необхідної TV на сторінці редагування документа. Обраний колір зберігається в TV в hex форматі. +*TV повинна бути текстового типу.* + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|TV, для яких необхідно відобразити палітру кольорів.|{comma separated string}|—|true +default|Колір за замовчуванням, який буде вставлятися при порожньому значенні в TV (в разі, якщо значення за замовчуванням у TV не задано стандартними засобами MODX).|{string}|'#ffffff'|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Додати палітру вибору кольорів для TV «bgcolor» у всіх документів для всіх користувачів + + mm_widget_colors('bgcolor'); +Додати палітру вибору кольорів для TV «bgcolor» і «foreground» у всіх документів для всіх користувачів + + mm_widget_colors('bgcolor,foreground'); +Додати палітру вибору кольорів для TV «bgcolor» у документів з id шаблону = 2 для користувачів з id ролі = 1 і виставити чорний колір за замовчуванням + + mm_widget_colors('bgcolor', '#000000', '1', '2'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/51_Sections_ddCreateSection.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/51_Sections_ddCreateSection.md" new file mode 100644 index 00000000..57950820 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/51_Sections_ddCreateSection.md" @@ -0,0 +1,15 @@ +###Віджет для плагіна ManagerManager, дозволяє створити нову довільну секцію на сторінці редагування документа. + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +title|Текст заголовка нової секції.|{string}|—|true +id|Унікальний id нової секції.|{string}|—|true +tabId|Id вкладки, в яку буде вставлена секція. Можна вказати як id однієї зі стандартних вкладок, так і id вкладки, створеної за допомогою mm_createTab.|{string}|'general'|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Створити секцію з заголовком «Категорії» в основній вкладці у всіх документів для всіх користувачів + + mm_ddCreateSection('Категорії', 'mycats'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/52_Sections_ddMoveFieldsToSection.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/52_Sections_ddMoveFieldsToSection.md" new file mode 100644 index 00000000..19677d7f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/52_Sections_ddMoveFieldsToSection.md" @@ -0,0 +1,15 @@ +###Віджет для плагіна ManagerManager, дозволяє перемістити поля документа і TV в іншу секцію. +*На жаль, неможливо перемістити наступні поля: keywords, metatags, which_editor, show_in_menu, menuindex.* + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), які необхідно перемістити.|{string}|—|true +sectionId|Id секції, в яку необхідно перемістити поля. Можна вказати як id однієї зі стандартних секцій, так і id секції, створеної за допомогою mm_ddCreateSection.|{string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Перемістити TV «profilePhoto» в секцію «images» для всіх користувачів і шаблонів + + mm_ddMoveFieldsToSection('profilePhoto', 'images'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/53_Sections_hideSections.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/53_Sections_hideSections.md" new file mode 100644 index 00000000..68e442ca --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/53_Sections_hideSections.md" @@ -0,0 +1,19 @@ +###Віджет для плагіна ManagerManager, дозволяє приховати одну із секцій на сторінці редагування документа. +*«Секции» — це такі області на сторінці редагування документа, наприклад: «Содержимое ресурса» або «Параметры (TV)».* + +mm_hideSections($sections, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +sections|Секції, які необхідно приховати.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Приховати секцію «Параметры (TV)» для всіх користувачів + + mm_hideSections('tvs'); +Приховати секції «Содержимое ресурса» і «Параметры (TV)» у документів з id шаблону = 3 для користувачів з id ролі = 1 + + mm_hideSections('content,tvs', '1', '3'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/54_Sections_renameSection.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/54_Sections_renameSection.md" new file mode 100644 index 00000000..ea17c4f8 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/54_Sections_renameSection.md" @@ -0,0 +1,18 @@ +###Віджет для плагіна ManagerManager, дозволяє перейменувати одну із секцій на сторінці редагування документа. +*«Секции» — це такі області на сторінці редагування документа, наприклад: «Содержимое ресурса» або «Параметры (TV)».* + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +section|Секція, яку необхідно перейменувати.|{'content'; 'tvs'}|—|true +newlabel|Новий текст заголовка секції.|{string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Перейменувати секцію контенту документа для користувачів з id ролі = 2 + + mm_renameSection('content', 'Текстик (отображается на страничке)', '2'); +Перейменувати секцію «Параметры (TV)» для всіх користувачів + + mm_renameSection('tvs', 'Дополнительные параметры'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/55_Sections_minimizablesections.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/55_Sections_minimizablesections.md" new file mode 100644 index 00000000..f22de470 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/55_Sections_minimizablesections.md" @@ -0,0 +1,22 @@ +###Віджет для плагіна ManagerManager, дозволяє згортати секції на сторінці редагування документа. +*«Секции» — це такі області на сторінці редагування документа, наприклад: «Содержимое ресурса» або «Параметры (TV)».* + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +section|Секції, через кому, які необхідно перейменувати. \* - для всіх|{'\*'; 'content'; 'tvs'}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +minimized|Секції, які за замовчуванням згорнуті|{'\*';'content'; 'tvs'}|—|false + +####Приклади +Застосувати до всіх секцій для всіх ролей і шаблонів + + mm_minimizablesections ('*'); + +Застосувати до секцій контенту і параметрів TV для користувачів з роллю «1» і шаблону ID «3» + + mm_minimizablesections('content,tvs', '1', '3'); +Застосувати до всіх секцій і встановити згорнутими за замовчуванням параметри TV і фотографії + + mm_minimizablesections('*','','','tvs,photos'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/61_Tabs_createTab.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/61_Tabs_createTab.md" new file mode 100644 index 00000000..35108c58 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/61_Tabs_createTab.md" @@ -0,0 +1,21 @@ +###Віджет для плагіна ManagerManager, дозволяє створити нову довільну вкладку на сторінці редагування документа. + +mm_createTab($name, $id, $roles, $templates, $intro, $width); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +name|Текст заголовка нової вкладки.|{string}|—|true +id|Унікальний id нової вкладки.|{string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +intro|Опис нової вкладки, відображається в самому верху (можна використовувати HTML).|{string}|—|false +width|Ширина вмісту нової вкладки, можна використовувати css значення (наприклад: '100%', '450px', 'auto').|{string}|680|false + +####Приклади +Створити вкладку з заголовком «Категории» у всіх документів для всіх користувачів + + mm_createTab('Категории', 'mycats'); +Створити нову вкладку шириною 450px з описом у документів з id шаблону = 3 або 4 + + mm_createTab('SEO', 'seoTab', '', '3,4', 'Здесь вы можете отредактировать всё, что касается поисковой оптимизации.', '450'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/62_Tabs_moveFieldsToTab.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/62_Tabs_moveFieldsToTab.md" new file mode 100644 index 00000000..3ff44a62 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/62_Tabs_moveFieldsToTab.md" @@ -0,0 +1,23 @@ +###Віджет для плагіна ManagerManager, дозволяє перемістити поля документа і TV в іншу вкладку. +*На жаль, неможливо перемістити наступні поля: keywords, metatags, which_editor, show_in_menu, menuindex.* + +mm_moveFieldsToTab($fields, $tabId, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), які необхідно перемістити.|{comma separated string}|—|true +tabId|Id вкладки, в яку необхідно перемістити поля. Можна вказати як id однієї зі стандартних вкладок, так і id вкладки, створеної за допомогою mm_createTab.|{string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Перемістити дату публікації та заголовок документа у вкладку «mycats» (попередньо створену за допомогою mm_createTab) + + mm_moveFieldsToTab('pub_date,pagetitle', 'mycats'); +Перемістити дату публікації документа в основну вкладку для користувачів з id ролі = 2 + + mm_moveFieldsToTab('pub_date', 'general', '2'); +Перемістити TV «tags» у вкладку «mycats» + + mm_moveFieldsToTab('tags', 'mycats'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/63_Tabs_hideTabs.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/63_Tabs_hideTabs.md" new file mode 100644 index 00000000..5c9562eb --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/63_Tabs_hideTabs.md" @@ -0,0 +1,18 @@ +###Віджет для плагіна ManagerManager, дозволяє приховати одну зі стандартних вкладок на сторінці редагування документа. + +mm_hideTabs($tabs, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tabs|Id вкладок, які необхідно приховати.|{'general'; 'settings'; 'access'}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Приховати вкладки «Настройка страницы» і «Права доступа» для всіх користувачів і документів + + mm_hideTabs('settings, access'); +Приховати вкладку «Права доступа» у документів з id шаблону = 3 для користувачів з id ролі = 1 + + mm_hideTabs('access', '1', '3'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/64_Tabs_renameTab.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/64_Tabs_renameTab.md" new file mode 100644 index 00000000..73edb8d5 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/64_Tabs_renameTab.md" @@ -0,0 +1,19 @@ +###Віджет для плагіна ManagerManager, дозволяє перейменувати одну зі стандартних вкладок на сторінці редагування документа. + +mm_renameTab($tabId, $newlabel, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tabId|Id вкладки, яку необхідно перейменувати.|{'general'; 'settings'; 'access'}|—|true +newlabel|Новий текст заголовка вкладки.|{string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Перейменувати вкладку «Общие» для користувачів з id ролі = 2 + + mm_renameTab('general', 'Основное', '2'); +Перейменувати вкладку «Настройки страницы» для всіх користувачів + + mm_renameTab('settings', 'Настроечки'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/71_Maps_ddGMap.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/71_Maps_ddGMap.md" new file mode 100644 index 00000000..0ab0d6f2 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/71_Maps_ddGMap.md" @@ -0,0 +1,18 @@ +###Віджет для плагіна ManagerManager, дозволяє інтегрувати карту Google Maps для отримання координат. + +mm_ddGMap($tvs, $roles, $templates, $w, $h, $hideField); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tvs|Імена TV, для яких необхідно застосувати віджет.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +w|Ширина контейнера з картою.|{'auto'; integer}|'auto'|false +h|Висота контейнера з картою. |{integer}|400|false +hideField|Чи необхідно приховувати оригінальне текстове поле з координатами.|{0; 1}|1|false + +####Приклади +Підключення віджета Google Maps для TV «LatLng» + + mm_ddGMap('LatLng'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/72_Maps_ddYMap.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/72_Maps_ddYMap.md" new file mode 100644 index 00000000..fefe9c64 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/72_Maps_ddYMap.md" @@ -0,0 +1,19 @@ +###Віджет для плагіна ManagerManager, дозволяє інтегрувати карту Yandex Maps для отримання координат. +*Для простого виведення карти на сторінку використовуйте сніппет ddYMap.* + +mm_ddYMap($tvs, $roles, $templates, $w, $h, $hideField); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tvs|Імена TV, для яких необхідно застосувати віджет.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +w|Ширина контейнера з картою.| {'auto'; integer}|'auto'|false +h|Висота контейнера з картою. |{integer}|400|false +hideField|Чи необхідно приховувати оригінальне текстове поле з координатами.|{0; 1}|1|false + +####Приклади +Підключення віджета Yandex Maps для TV «LngLat» + + mm_ddYMap('LngLat'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/81_Misc_widget_showimagetvs.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/81_Misc_widget_showimagetvs.md" new file mode 100644 index 00000000..7488e08b --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/81_Misc_widget_showimagetvs.md" @@ -0,0 +1,25 @@ +###Віджет для плагіна ManagerManager, дозволяє показати прев'юшки зображень, обраних в TV на сторінці редагування документа. +*Аналогічний плагіну ShowImageTVs, який не сумісний з ManagerManager.* + +mm_widget_showimagetvs($fields, $w, '$h, $thumbnailerUrl, $roles, $templates); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|TV, для яких необхідно відобразити прев'юшки.|{comma separated string}|—|false +w|Максимальна ширина прев'юшки в px.|{integer}|300|false +h|Максимальна висота прев'юшки в px.|{integer}|100|false +thumbnailerUrl|Якщо у вас встановлений PHPThumb, ви можете вказати url, де він знаходиться, адреса прев'ю буде звернений до нього з передачею url вихідної картинки, ширини і висоти.|{string}|—|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false + +####Приклади +Показати прев'ю для всіх TV-зображень + + mm_widget_showimagetvs(); +Показати прев'ю для всіх TV-зображень, максимальним розміром 150×150 px + + mm_widget_showimagetvs('', 150, 150); +Показати прев'ю для TV «mypic» у документів з id шаблону = 2 і відправити заодно на генерацію в phpThumb для отримання прев'юшок розміром 300×200 px + + mm_widget_showimagetvs('mypic', '300', '200', '/assets/snippets/phpthumb/phpThumb.php', '', '2'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/82_Misc_ddResizeImage.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/82_Misc_ddResizeImage.md" new file mode 100644 index 00000000..11277e0a --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/82_Misc_ddResizeImage.md" @@ -0,0 +1,39 @@ +###Віджет для плагіна ManagerManager, дозволяє змінювати розміри зображень (TV), наприклад: робити маленькі прев'юшки (thumbs). +*Віджет спрацьовує тільки в момент збереження документів (подія «OnBeforeDocFormSave») і не створює зображень повторно, що забезпечує мінімальні витрати ресурсів сервера.* + +mm_ddResizeImage($tvs, $roles, $templates, $width, $height, $cropping, $suffix, $background, $multipleField, $colNum, $splY, $splX, $num); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +tvs|Імена TV з зображеннями, для яких необхідно застосувати віджет.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +width|Ширина створюваного зображення в px. Порожнє значення - автоматичний розрахунок виходячи з висоти. Обов'язковий хоча б один розмір.|{integer}|—|true +height|Ширина створюваного зображення в px. Порожнє значення - автоматичний розрахунок виходячи з ширини. Обов'язковий хоча б один розмір.|{integer}|—|true +cropping|Чи обрізати зображення, намагаючись домогтися жорсткої відповідності розмірам. 0 — не обрізати; 1 — просто обрізати (не змінюючи масштаб); 'crop_resized' — спочатку зменшити, потім обрізати; 'fill_resized' — пропорційно зменшити, заповнивши поля кольором («background»). 0; 1;|'crop_resized'; 'fill_resized'|'crop_resized'|false +suffix|Суфікс для імен створюваних зображень. При порожньому значенні замінюються вихідні зображення!|{string}|'_ddthumb'|false +replaceFieldVal|Чи потрібно переписувати значення в TV на імена створених зображень (те, що з урахуванням «suffix»). Не працює при multipleField = 1!|0; 1|0|false +background|Колір фону (використовується при cropping = 'fill_resized').|{string}|'#FFFFFF'|false +multipleField|Чи є поле множинним (для mm_ddMultipleFields).|0; 1|0|false +colNum|Номер колонки, в якій знаходиться зображення (для mm_ddMultipleFields).|{integer}|0|false +splY|Роздільник рядків (для mm_ddMultipleFields).|{string}|'\|\|'|false +splX|Роздільник колонок (для mm_ddMultipleFields).|{string}|'::'|false +num|Номер рядка, який треба обробляти (для mm_ddMultipleFields).|{integer};'all'|'all'|false + +####Приклади +Створити для зображень, виставлених в TV «imageTV», зменшені копії шириною 200 px (висота нехай розраховується автоматично) + + mm_ddResizeImage('imageTV', '', '', 200); +Створити для зображень, виставлених в TV «imageTV», зменшені копії розміром 200 × 100 px, а що не влізе - нехай буде обрізане + + mm_ddResizeImage('imageTV', '', '', 200, 100); +Створити для зображень, виставлених в TV «imageTV», зменшені копії, перезаписуючи значення в TV + + mm_ddResizeImage('imageTV', '', '', 200, 100, 'crop_resized', '_ddthumb', 1); + +Користувач завантажив і вставив в TV 'assets/images/some.jpg', а після збереження документа зробилася прев'юшка і значення TV стало 'assets/images/some_ddthumb.jpg'. +Забезпечити, щоб користувачі завантажували зображення в TV «logo» строго розміром 125 × 68 px +Все, що завантажується, має бути пропорційно зменшено до заданого розміру, а якщо пропорції не вірні, то вільний простір повинен бути залитий кольором '#686868'. + + mm_ddResizeImage('imageTV', '', '', 125, 68, 'fill_resized', '', 0, '#686868'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/83_Misc_ddAutoFolders.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/83_Misc_ddAutoFolders.md" new file mode 100644 index 00000000..819dc150 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/83_Misc_ddAutoFolders.md" @@ -0,0 +1,15 @@ +###Віджет для плагіна ManagerManager, дозволяє при збереженні документа (подія OnBeforeDocFormSave) автоматично переміщати його, грунтуючись на його даті (даті публікації, або будь-яку дату в tv) в папку року і місяця. + +mm_ddAutoFolders($ddRoles, $ddTemplates, $ddParent, $ddDateSource, $ddYearTpl, $ddMonthTpl, $ddYearPub, $ddMonthPub); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +ddRoles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +ddTemplates|Id шаблонів, для яких необхідно застосувати віджет.|{comma separated string}|—|true +ddParent|ID кореневого батька. |{integer}|—|true +ddDateSource|Поле, з якого необхідно брати дату.|{string}|'pub_date'|false +ddYearTpl|ID шаблону, який необхідно виставляти документам-рокам.|{integer}|0|false +ddMonthTpl|ID шаблону, який необхідно виставляти документам-місяцям.|{integer}|0|false +ddYearPub|Чи треба публікувати документи-роки?|{0; 1}|0|false +ddMonthPub|Чи треба публікувати документи-місяці?|{0; 1}|0|false diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/84_Misc_ddFillMenuindex.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/84_Misc_ddFillMenuindex.md" new file mode 100644 index 00000000..72b6f966 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/84_Misc_ddFillMenuindex.md" @@ -0,0 +1,12 @@ +###Віджет для плагіна ManagerManager, виставляє мінімальне вільне значення позиції меню (menuindex) для нових документів. +*За замовчуванням позиція меню в MODX для нових документів просто дорівнює кількості дочірніх документів на одному рівні, що не завжди зручно.* + +mm_ddFillMenuindex($parent); + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +parent|ID документа, для дочірніх документів якого повинен застосовуватися віджет. Якщо залишити порожнім (не вказувати), то віджет буде застосований абсолютно до всіх документів.|{integer; ''}|—|false + +####Приклад + mm_ddFillMenuindex('21'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/85_Misc_widget_accessdenied.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/85_Misc_widget_accessdenied.md" new file mode 100644 index 00000000..c4f47306 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/85_Misc_widget_accessdenied.md" @@ -0,0 +1,18 @@ +###Віджет для плагіна ManagerManager, дозволяє заборонити доступ до певних документів по їх ID (доступ до дочірніх документів не забороняється). +*Наприклад, в батьківському документі викликається сніппет «Ditto», і ви не хочете, щоб користувачі редагували цей документ, але хочете, щоб користувачі могли створювати і редагувати дочірні документи. +Використовуйте цей віджет з обережністю, так як він не забезпечує такого захисту, як вбудована система прав MODx. Користувач, що володіє технічними знаннями може обійти цей захист через інструменти для розробки в браузері.* + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +ids|Список документів, до яких необхідно заборонити доступ.|{comma separated string}|—|true +default|Повідомлення про заборону доступу (дозволений HTML).|{string}|'Access denied - Access to current document closed for security reasons.'|false +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false + +####Приклади +Заборонити всім користувачам доступ до документів з id = 1 і 15 (буде відображено повідомлення про заборону доступу за замовчуванням) + + mm_widget_accessdenied('1,15'); +Заборонити доступ до документів з id = 1 і 15 користувачам з id ролі = 2 і відобразити довільне повідомлення про заборону доступу + + mm_widget_accessdenied('1,15', 'Этот документ запрещено редактировать. Давай, до свидания!' '2'); diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/86_Misc_ddHTMLCleaner.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/86_Misc_ddHTMLCleaner.md" new file mode 100644 index 00000000..fb98cd17 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/86_Misc_ddHTMLCleaner.md" @@ -0,0 +1,11 @@ +###Віджет для плагіна ManagerManager. Очищає зайві атрибути і стилі в HTML для необхідних полів документа (і TV). + +####Опис параметрів +Назва|Опис|Допустимі значення|Значення за замовчуванням|Обов'язковий? +--------|--------|---------|--------|-------- +fields|Поля документа (або TV), для яких необхідно застосувати віджет.|{comma separated string}|—|true +roles|Ролі, для яких необхідно застосувати віджет, порожнє значення — всі ролі.|{comma separated string}|—|false +templates|Id шаблонів, для яких необхідно застосувати віджет, порожнє значення — всі шаблони.|{comma separated string}|—|false +validAttrsForAllTags|Дозволені атрибути для всіх тегів (атрибути, які не потрібно видаляти, інші видаляться).|{comma separated string}|'title,class'|false +validStyles|Дозволені стилі для всіх тегів (стилі, які не потрібно видаляти з атрибута «style»).|{comma separated string}|'word-spacing'|false +validAttrs|Дозволені атрибути для тегів (вони не будуть видалятися). В якості ключа використовується і'мя тега, в якості значення — дозволені атрибути (рядок, розділена через кому).|{string: JSON}|'{"img":"src,alt,width,height","a":"href,target"}'|false diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/91_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 php \320\262 mm_rules.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/91_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 php \320\262 mm_rules.md" new file mode 100644 index 00000000..0062772e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/91_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 php \320\262 mm_rules.md" @@ -0,0 +1,24 @@ +###Використання PHP в налаштуваннях ManagerManager + +####Приклад 1 +Створення і виведення доп вкладки в залежності від id документа + + if($content['id'] == 4 or $content['id'] == 5){ + + mm_createTab('Доп. описание', 'dop-params', '', '4', '', '850'); + + mm_moveFieldsToTab('dop-params', 'dop-params', '', ''); + }else{ + + mm_hideFields('dop-params', '', '4'); + + } + +####Приклад 2 +Перевіряємо чи існує ТВ, і тільки якщо є, то запускаємо віджет + + if($modx->db->getValue("SELECT COUNT(id) FROM " . $modx->getFullTableName('site_tmplvars') . " WHERE name='documentTags'")) { + + mm_widget_tags('documentTags',' '); + + } diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/99_Module_ddMMEditor.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/99_Module_ddMMEditor.md" new file mode 100644 index 00000000..ee54469f --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/99_Module_ddMMEditor.md" @@ -0,0 +1,20 @@ +###Модуль для зручного редагування файлу конфігурації плагіна ManagerManager. +####Можливості: +- візуальне створення правил для MM; +- застосування правил до необхідних шаблонів і ролей в два кліка; +- autocomplete з усіма іменами полів і TV; +- об'єднання правил у групи за змістом (групи можна називати довільними іменами); +- згортання-розгортання груп для зручного перегляду в загальному вигляді; +- drag'n'drop правил і груп між собою; +- можливість «ручної» вставки довільного коду в початок і кінець конфігураційного файлу. + +#### Скачати: +[http://code.divandesign.ru/ajax/download?id=326](http://code.divandesign.ru/api/download?id=326) - Пряме посилання на скачування + +[http://code.divandesign.ru/modx/ddmmeditor](http://code.divandesign.ru/modx/ddmmeditor) - Посилання на сторінку модуля + +####Встановлення +Вміст файлу module.php має бути скопійовано в поле «Код модуля» в меню створення нового модуля. +Інші файли повинні знаходитися в assets/modules/ddmmeditor/... (в архіві вже створена необхідна структура папок). +Модуль змінює файл assets/plugins/managermanager/mm_rules.inc.php плагіна ManagerManager. +*Увага! Щоб ManagerManager використовував правила, створені модулем, параметр «Configuration Chunk» в конфігурації плагіна (вкладка «Конфигурация») повинен бути порожнім.* diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/index.md" new file mode 100644 index 00000000..6bae839e --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/10_MMrules/index.md" @@ -0,0 +1,70 @@ +### ManagerManager + +*Плагін дозволяє налаштовувати інтерфейс панелі управління MODX. Він дозволяє перейменовувати, приховувати, переміщати поля, вкладки, секції, інтегрувати карти Google, Яндекс і багато іншого. І все це налаштовується для документів з необхідними шаблонами і необхідних ролей користувачів. Абсолютна влада! ;-)* + +*** + +####Віджети +Всі віджети вже містяться в архіві, нічого додатково встановлювати не потрібно, все добре ;-) +За посиланнями нижче ви знайдете документацію і приклади використання. + + +#####Обмеження введення даних +- **mm_ddMaxLength** - дозволяє обмежити кількість символів, що вводять в TV. +- **mm_ddNumericFields** - дозволяє зробити можливим введення в TV тільки цифр. +- **mm_hideTemplates** - дозволяє приховати необхідні шаблони зі списку на сторінці редагування документа. +- **mm_requireFields** - дозволяє зробити поля документа або TV обов'язковими для заповнення. +- **mm_hideFields** - дозволяє приховувати поля документа або TV. +- **mm_ddReadonly** - дозволяє зробити поля документа і TV доступними тільки для читання + + +#####Установка необхідних значень +- **mm_inherit** - дозволяє успадковувати значення полів або TV від батьків для нових документів/папок. +- **mm_default** - дозволяє задати значення за замовчуванням для полів/TV нових документів/папок. +- **mm_ddSetFieldValue** - дозволяє жорстко встановлювати необхідні значення полів документа або TV +- **mm_synch_fields** - дозволяє синхронізувати значення полів документа (або TV) при редагуванні. + + +#####Зміна назв і підказок +- **mm_renameField** - дозволяє перейменувати одну зі стандартних полів документа або TV. +- **mm_changeFieldHelp** - дозволяє змінити текст підказки, що з'являється при наведенні на іконку поруч з полем документа. + + +#####Розширення функціоналу введення даних +- **mm_ddMultipleFields** - дозволяє додавати довільну кількість значень полів (TV) до одного документу +- **mm_ddSelectDocuments** - призначений для вибору id певних документів в зручному вигляді. +- **mm_widget_tags** - дозволяє в зручній формі додавати теги до документів +- **mm_widget_colors** - дозволяє додати інструмент вибору кольору з палітри для зазначеного TV + + +#####Робота з секціями +- **mm_ddCreateSection** - дозволяє створити нову довільну секцію на сторінці редагування документа. +- **mm_ddMoveFieldsToSection** - дозволяє перемістити поля документа і TV в іншу секцію. +- **mm_hideSections** - дозволяє приховати одну із секцій на сторінці редагування документа. +- **mm_renameSection** - дозволяє перейменувати одну із секцій на сторінці редагування документа. +- **mm_minimizablesections** - дозволяє згортати секції + + +#####Робота з вкладками +- **mm_createTab** - дозволяє створити нову довільну вкладку на сторінці редагування документа. +- **mm_moveFieldsToTab** - дозволяє перемістити поля документа і TV в іншу вкладку. +- **mm_hideTabs** - дозволяє приховати одну зі стандартних вкладок на сторінці редагування документа. +- **mm_renameTab** - дозволяє перейменувати одну зі стандартних вкладок на сторінці редагування документа. + + +#####Карти +- **mm_ddGMap** - дозволяє інтегрувати карту Google Maps для отримання координат. +- **mm_ddYMap** - дозволяє інтегрувати карту Yandex Maps для отримання координат. + + +#####Інше +- **mm_widget_showimagetvs** - дозволяє показати прев'юшки зображень, обраних в TV на сторінці редагування документа. +- **mm_ddResizeImage** - дозволяє змінювати розміри зображень (TV), наприклад: робити маленькі прев'юшки (thumbs). +- **mm_ddAutoFolders** - дозволяє при збереженні документа автоматично переміщати його, грунтуючись на його даті (даті публікації, або будь-якій даті в tv) в папку року і місяця. +- **mm_ddFillMenuindex** - виставляє мінімальне вільне значення позиції меню (menuindex) для нових документів. +- **mm_widget_accessdenied** - дозволяє заборонити доступ до певних документів по їх ID (доступ до дочірніх документів не забороняється). +- **mm_ddHTMLCleaner** - очищає зайві атрибути і стилі в HTML для необхідних полів документа (і TV). +- **mm_hideempty** - дозволяє приховати порожні секції і вкладки + +####Дивіться також +Модуль для зручного редагування правил: **ddMMEditor**. diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/11_PhpStorm_\320\262\320\267\320\260\321\224\320\274\320\276\320\264\321\226\321\217.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/11_PhpStorm_\320\262\320\267\320\260\321\224\320\274\320\276\320\264\321\226\321\217.md" new file mode 100644 index 00000000..ef5e4cb1 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/11_PhpStorm_\320\262\320\267\320\260\321\224\320\274\320\276\320\264\321\226\321\217.md" @@ -0,0 +1,63 @@ +Дана інструкція допоможе Вам налаштувати IDE [PhpStorm](https://jetbrains.com/phpstorm/) таким чином, щоб Blade директиви мали корректну підсвітку під час роботи з програмним кодом сайту. + +> **Примітка** +> Під час використання плагіна [Laravel Idea](https://laravel-idea.com/) усі директиви Blade додаються автоматично. Але Evolution CMS має певні Blade директиви, що не поставляються PhpStorm плагіном Laravel Idea. + +## Розширення PhpStorm + +1. У PhpStorm відкрийте «Налаштування» та перейдіть до PHP -> Blade (Файл | Параметри | PHP | Blade). +2. Зніміть прапорець «Використовувати налаштування за замовчуванням», а потім натисніть вкладку «Directives». +3. Додайте нові директиви. + +## Директиви Blade для Evolution CMS + +Цей список містить лише ті директиви Blade, що зареєстровано в Evolution CMS. Щоб додати інші директиви, які можуть вам бути потрібні, зверніться до відповідних інструкцій. + +### @makeUrl() + +Директива `@makeUrl($id)` в шаблоні Blade відповідає виклику метода `UrlProcessor::makeUrl($id);` в PHP коді. + +Приймає лише один аргумент - ID ресурса. + +#### makeUrl + +* Має параметр = YES +* Префікс: makeUrlWithString( +* Суфікс: );?> + +### @evoRole() + +Директива `@evoRole($role)` в шаблоні Blade відповідає за відображення контента в залежності від ролі користувача. + +Приймає лише один аргумент - Ключ ролі, або нічого. + +#### evoRole + +* Має параметр = YES +* Префікс: + +#### evoElseRole + +* Має параметр = YES +* Префікс: + +#### evoEndRole + +* Має параметр = NO +* Префікс: порожній +* Суфікс: порожній + +### evoConfig + +Директива `@evoConfig($name, $default)` в шаблоні Blade відповідає виклику метода `evo()->getConfig($name, $default);` в PHP коді. + +Приймає один, або два аргументи: + +- Перший аргумент (обов'язково) - ім'я конфігурації. +- Другий аргумент (опціонально) - значення, якщо конфіг нічого не повернув. + +* Має параметр = YES +* Префікс: getConfig( +* Суфікс: , "");?> diff --git "a/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/index.md" "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/index.md" new file mode 100644 index 00000000..b0ec5792 --- /dev/null +++ "b/ua/03_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\321\203/index.md" @@ -0,0 +1,19 @@ +Чому вам сподобається Evolution? + +- Абсолютний контроль над розгортанням сайту. +Все, що ви написали у коді у чанкові і шаблоні буде в точності відображено у коді сайту. У Evolution немає тисячі готових плагінів, у результаті роботи яких у код вклинюється така кількість синтаксичного сміття, у якому важко разібратися навіть знаючій людині. + +- Звідси слідує повний контроль над СЕО - чиста верстка і зручний код, кожна зміна у якому абсолютно прозора. + +- Структура. +Evolution змушує подумати, де що розташоване і як це між собою взаємодіє. + +- PHP. Проста реалізація своїх модулів і скриптів. Поріг вхождення мінімальний. + +- Комьюніті і подальший ріст. + +Комьюніті Evolution не може похвалитися мільйонною аудиториією. Але при цьому воно складається з людей, які дійсно пишуть код, а не ті хто збирає сайти мишкою. + +Evolution від самого початку створений для людини, яка хоче знати - що, як і для чого робить - а не просто шукати і ставити готові модулі. + +Підключайтеся! \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..707742f4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,659 @@ + + +

    AjaxSearch: Основні параметри

    +Основні параметри сніпету AjaxSearch. +
    +
    +
    +
    +
    + +
    +
    +Формат: default | custom_example | @FILE
    +Значення за замовчуванням: default
    +Примітка: Конфігураційні файли повинні викликатися у вигляді : .config.php. Встановлюються у папку configs або іншу папку через @FILE
    +

    Приклад:

    +
    &config=`example`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1 | 2 | 3
    +Значення за замовчуванням: 0
    +Примітка:
    0 : Режим не активований.
    +Файл звіту (ajaxSearch/debug/ajaxSearch_log.txt):
    +1 : Parameters, search context and sql query logged.
    +2 : Parameters, search context, sql query AND templates logged
    +3 : Parameters, search context, sql query, templates AND Results logged
    +

    Приклад:

    +
    &debug=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: chinese | english | finish | francais | german | hebrew | italian | japanese | nederlands | norsk | persian | portuguese | portuguese-br | russian | slovak | spanish | svenska
    +Значення за замовчуванням: мова, встановлена для MODX
    +Примітка: Ви можете самостійно додати мовні файли у папку /ajaxSearch/lang/
    +

    Приклад:

    +
    &language=`english`
    +
    +
    +
    +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка: 1 - використовувати | 0 - не використовувати
    +

    Приклад:

    +
    &ajaxSearch=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: exactphrase | allwords | nowords | oneword
    +Значення за замовчуванням: oneword
    +Примітка:
    exactphrase:надає документи , які містять точну фразу
    +allwords: надає документи, які містять всі слова
    +nowords: надає документи, які не містять вказаних слів
    +oneword: надає документи, які містять хоч би одне слово
    +

    Приклад:

    +
    &advSearch=`exactphrase`
    +
    +
    +
    +
    + +
    +
    +Формат: a-z, _ , 0-9 (з урахуванням регістру)
    +Значення за замовчуванням: нет
    +Примітка: Необхідний при багатократному (більше одного ) виклику AjaxSearch на одній сторінці. Може складатися з: латинських букв (з урахуванням регістра), цифр,знака підкреслювання.
    +ВАЖЛИВО! При багатократному виклику сніпета на сторінці у режимі &ajaxSearch=`1` в першого сніпета &asId не використовується.
    +

    Приклад:

    +
    &asId=`abc123`
    +
    +
    +
    +
    + +
    +
    +Формат: время в секундах
    +Значення за замовчуванням: 60
    +Примітка: при значенні 0 - протягом необмеженого часу .
    +

    Приклад:

    +
    &timeLimit=`30`
    +
    +
    +
    +
    + +
    +
    +Формат: content:pagetitle,longtitle,description,alias,introtext,menutitle,content | tv:tv_value | jot:jot_content | maxigallery:gal_title,gal_descr,gal_filename
    +Значення за замовчуванням: content|tv
    +Примітка: Ви можете використовувати ключові слова:
    +"content" для site_content, "tv" для site_tmplvar_contentvalues, "jot" для jot_content, "maxigallery" для maxigallery.
    +Формат: keywords:table fields
    + За замовчуванням: content|tv що означає : content:pagetitle,longtitle,description,alias,in +trotext,menutitle,content | tv:tv_value
    +Приклади:
    content:null|maxigallery - для пошуку тільки у maxigallery.
    +content:pagetitle,introtext,content|tv:tv_value|maxigallery:gal_title -пошук по усім основим полям
    +

    Приклад:

    +
    &whereSearch=`content:null|maxigallery`
    +
    +
    +
    +
    + +
    +
    +Формат: [ [ + | - ] [ : tvlist] ] список TV-параметрів, розділений комою
    +Значення за замовчуванням: всі TV-параметри
    +Примітка :
    +: - використовувати тільки ці TV-параметри
    +-: - виключити ці TV-параметри з пошуку
    +&withTvs=`tv1,tv2,tv3` // пошук по вказанимх пареметрах
    +&withTvs=`+:tv1,tv2,tv3` // пошук по вказанимх пареметрах
    +&withTvs=`+` // поушк за всіма параметрами
    +&withTvs=`-:tv1,tv2,tv3` // поушк за всіма параметрами окрім цих
    +

    Приклад:

    +
    &withTvs=`tv1,tv2,tv3`
    +
    +
    +
    +
    + +
    +
    +Формат: [ [ + | - ] [ : tvlist] ] список параметрів, розділений комою
    +Значення за замовчуванням: всі параметри
    +Примітка:
    +: - використовувати тільки ці параметри
    +-: - виключити ці параметри з пошуку
    +&withTvs=`tv1,tv2,tv3` // пошук по вказаним параметрам
    +&tvPhx=`+:tv1,tv2,tv3` // пошук по вказаним параметрам
    +&tvPhx=`+` // пошук за всіма параметрами
    +&tvPhx=`-:tv1,tv2,tv3` // пошук за всіма параметрами окрім цих +

    +У коді сніпета інший опис: +
    &tvPhx - display and set placeHolders for TV (template variables) +
    0 : disallow the feature +
    1 : allow the display of all Modx TVs of the document found (default) +
    'tb_alias:display_function_name[,[tb_alias:display_function_name]*]' : set up placeholders for custom joined tables +
    Default: 1 - tvPhx allowed for TV only +
    +

    Пример:

    +
    &tvPhx=`tv1,tv2,tv3`
    +
    +
    +
    +
    + +
    +
    +Формат: будь яке корректне імя TV параметра
    +Значення за замовчуванням: ні
    +Примітка: Необхідно створити TV параметр з назвами категорій і вказати його при виклику сніпета у якості значення &category.
    +

    Приклад:

    +
    &category=`tv1`
    +
    +
    +
    +
    + +
    +
    +Формат: mixed | unmixed
    +Значення за замовчуванням: unmixed
    +Примітка: mixed -змішувати, unmixed - не змішувати
    +

    Приклад:

    +
    &display=`mixed`
    +
    +
    +
    +
    + +
    +
    +Формат: розділений комами список параметрів з зазначенням напрямку сортування "DESC"
    +Значення за замовчуванням: publishedon, pagetitle (сортування за датою публікування, потім по заголовоку документа)
    +Примітка:
    +

    Приклад:

    +
    &order=`pagetitle DESC, publishedon`
    +
    +
    +
    +
    + +
    +
    +Формат: розділений комами список полів з зазначенням ваги кожного поля [string[:Integer][|[string[:Integer]]]]
    +Значення за замовчуваннямю: pagetitle:100,extract
    +Примітка: Результати з однаковим рангом будуть відсортовані згідно значенню параметра &order
    +

    Приклад:

    +
    &rank=`pagetitle:100,alias:10,extract`
    +
    +
    +
    +
    + +
    +
    +Формат: число від 1 до 10
    +Значення за замовчуваннямю: 5
    +Примітка:
    +

    Приклад:

    +
    &maxWords=`7`
    +
    +
    +
    +
    + +
    +
    +Формат: число від 2 до 100
    +Значення за замовчуваннямю: 3
    +Примітка: Не застосовується при &advSearch = +'allwords', 'oneword' або 'nowords'
    +Можливо при &advSearch = 'exactphrase' з урахуванням пробілів
    +У AjaxSearch 1.9.3 число від 1 до 100.
    +

    Приклад:

    +
    &minChars=`5`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 (false) | 1 (true)
    +Значення за замовчуваннямю: 1
    +Примітка: У версії 1.8.4 застосовується параметр &AS_showForm
    +

    Приклад:

    +
    &showInputForm=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 (відключити) | 1 (умівкнути)
    +Значення за замовчуваннямю: 1
    +Примітка: фраза "Будь ласка, введіть пошуковий запит , щоб почати пошук " від вікном пошуку (відображається за замовчуванням)
    +

    Приклад:

    +
    &showIntro=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: число:розділений комами список полів
    +Значення за замовчуваннямю: 1:content,description,introtext,tv_content
    +Примітка:
    n: максимальна кількість витягів
    +1:content,description,introtext,tv_value - один витяг
    +

    Приклад:

    +
    &extract=`99:content`
    +
    +
    +
    +
    + +
    +
    +Формат: 50 < число < 800
    +Значення за замовчуваннямю: 200
    +Примітка:
    +

    Приклад:

    +
    &extractLength=`300`
    +
    +
    +
    +
    + +
    +
    +Формат: рядок, використовується замість крапок для позначення початку та кінція вилучення
    +Значення за замовчування: ... (крапки)
    +Примітка:
    +

    Приклад:

    +
    &extractEllips=`***`
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    +Формат:
    |
    | інший html тег
    +Значення за замовчуваннямю:

    +Примітка:
    +

    Приклад:

    +
    &extractSeparator=`
    `
    +
    +
    +
    +
    + +
    +
    +Формат: будь-який валідний формат часу, який відповідає правилам функції PHP - strftime
    +Значення за замовчуваннямю: 'd/m/y : H:i:s' - результат: 21/01/08 : 23:09:22
    +Примітка:
    +

    Приклад:

    +
    &formatDate=`%d.%m.%Y`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуваннямю: 1
    +Примітка: Необхідно використовувати плагін highligth
    +

    Приклад:

    +
    &highlightResult=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1 (без використання ajax) 1 | 2 (при використанні ajax)
    +Значення за замовчуваннямю: 1
    +Примітка:
    0: Без посторінокового розбиття
    +1: Previous - X-Y /Z - Next
    +2: X-Y/Z - більше 10 результатів
    +

    Приклад:

    +
    &pagingType=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: строка
    +Значення за замовчуваннямю: | (вертикальна риса)
    +Примітка:
    +

    Приклад:

    +
    &pageLinkSeparator=`-`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуваннямю: 1
    +Примітка: У версії 1.8.4: &AS_showResults
    +

    Приклад:

    +
    &showResults=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: [ in | not in ] :список ID через кому
    +Значення за замовчуваннямю: по всім опублікованим документам
    +Примітка:
    &parents=`in:2,3` пошук тільки у дочірніх ресурсах вказаних у папках.
    +&parents=`not in:2,3` пошук по усім документам окрім дочірніх ресурсів папок з ідентифікаторами 2 і 3.
    +Глибина задається параметром &depth
    +

    Приклад:

    +
    &parents=`in:2,3`
    +
    +
    +
    +
    + +
    +
    +Формат: число більше 0
    +Значення за замовчуваннямю: 10
    +Примітка: повинен використовуватися з &parents
    +

    Приклад:

    +
    &depth=`5`
    +
    +
    +
    +
    + +
    +
    +Формат: [ in | not in ] :список ID через кому
    +Значення за замовчуваннямю: по всім опублікованим документам
    +Примітка:
    &documents = `in:28,29,30,31` пошук у документах 28,29,30,31
    +&documents = `not in:28,29,30,31` пошук в усіх документах окрім 28,29,30,31
    +

    Приклад:

    +
    &documents=`in:28,29,30,31`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1 | 2
    +Значення за замовчуваннямю: 2
    +Примітка:
    0: пошук тільки у документах, видимих у меню
    +1: пошук тільки в документах, не видимих у меню
    +2: пошук у видимих і невидимих у меню документах
    +

    Приклад:

    +
    &hideMenu=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуваннямю: 1
    +Примітка:
    0: шукати в документі з типом ресурса Веб-сторінка і Веб-посилання
    +1: шукати в документі з типом ресурса Веб-сторінка
    +

    Приклад:

    +
    &hideLink=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: Аналогічно параметру filter для Ditto 2.1.
    +Значення за замовчуваннямю:
    +Примітка:
    Аналогічно параметру filter для Ditto 2.1.
    +'#' Метасимвол замінюється рядком пошуку , наданого веб-користувачем при використанні параметра фільтру. AdvSearch параметр також засосовується в увазі . Якщо advSearch = +'oneword', 'nowords','allwords' тоді # може застосовуватися замість множинного фільтру.
    +Вкладений фільтр по TV-параметрам.
    +&filter=`pagetitle,#,8` при пошуковому запиті `school child` при advSearch='oneword' еквівалентно &filter=`pagetitle,school,8|pagetitle,child,8`
    +&filter=`articleTags,вулкан,7` покаже документи з `вулкан`. Документи відфільтруються по TV-параметру 'articleTags'
    +

    Приклад:

    +
    &filter=`pagetitle,#,8`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуваннямю: 0
    +Примітка: 0 - стандартний вивід, результати відображаються під формою пошуку
    +1 - призначений для користувача вивід з використанням плейсхолдерів [+as.inputForm+] і [+as.results+]
    +

    Приклад:

    +
    &output=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: імя користувальницької PHP функції, у файлі певної конфігурації.
    +Значення за замовчуваннямю: defaultStripInput
    +Примітка:
    +

    Приклад:

    +
    &stripInput=``
    +
    +
    +
    +
    + +
    +
    +Формат: імя користувальницької PHP функції, у файлі певної конфігурації.
    +Значення за замовчуваннямю: defaultStripOutput
    +Примітка: Перш ніж витягти відповідний фрагмент тексту +навколо пошукового терміна, документ аналізується. +Визначивши функцію stripOutput, користувач міг +змінити вихід
    +

    Приклад:

    +
    &stripOutput=``
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | рядок
    +Значення за замовчуваннямю:
    +Примітка: Панірувальні сухарі - це функція за замовчуванням +передбачено для таблиці "зміст". Функція +за ім'ям може слідувати якийсь параметр +ініціалізація
    +

    Приклад:

    +
    &breadcrumbs=`Breadcrumbs,showHomeCrumb: 0,showCrumbsAtHome:1`
    +
    +
    +
    +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуваннямю: 0
    +Примітка:
    добавити клас "cleardefault" у форму вводу тексту і встановити даний параметр.
    +0: не активований
    +1: активований

    +

    Приклад:

    +
    &clearDefault=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: шлях до файлу
    +Значення за замовчуваннямю: js/clearDefault/clearDefault.js
    +Примітка:
    +

    Приклад:

    +
    &jsClearDefault=``
    +
    +
    +
    +
    + +
    +
    +Формат: 0 (off) | 1 (on)
    +Значення за замовчуваннямю: 1
    +Примітка:
    +

    Приклад:

    +
    &mbstring=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: ajaxSearch log [ level [: comment [: Purge]]]
    +Значення за замовчуваннямю: 0:0:200
    +Примітка:
    level:
    +0: заборонити використання ajaxSearch журналу (за замовчуванням)
    +1: реєструвати невдалі запити пошуку
    +2: всі ajaxSearch запити заносяться до журналу
    +comment:
    +0: коментарі користувачів не допускаються (за замовчуванням)
    +1: коментарі користувачів дозволені
    +Purge: число реєстрацій, до автоматичної очистки таблиці
    +0: необмежене число реєстрацій
    + за замовчуваннямю: 200
    +&asLog = `x` еквівалентний &asLog = `x:0:200`
    +&asLog = `x:y` еквівалентний &asLog = `x:y:200`
    +&asLog = `1:1:500` означає,що можливо 500 невдалих запитів пошуку, дозволені коментарі .
    Невдалі запити зберігаються у таблиці ajaxSearch_log
    +

    Приклад:

    +
    &asLog=`1:1:500`
    +
    +
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/02_Ajax_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/02_Ajax_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..d01fb2c9 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/02_Ajax_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,150 @@ + + +

    AjaxSearch: Ajax параметри

    +Ajax параметри сніпета AjaxSearch. +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    Є два режима роботи форми ajaxSearch:
    +0 - форма і кнопка відображаються та пошук не починається до натискання кнопки користувачем.
    +1 - пошук запускається автоматично, як тільки користувач вводить пошуковий запит
    +

    Приклад:

    +
    &liveSearch=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 6
    +Примітка:
    +

    Приклад:

    +
    &ajaxMax=`10`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &showMoreResults=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: 0
    +Примітка: Дана сторінка повинна містити інший виклик сніпета для того , щоб показати результати
    +

    Приклад:

    +
    &moreResultsPage=`12`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 < число < 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &opacity=`0.9`
    +
    +
    +
    +
    + +
    +
    +Формат: jquery | mootools2 | mootools
    +Значення за замовчуванням: mootools
    +Примітка:
    +

    Приклад:

    +
    &jscript=`mootools2`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &addJscript=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: Шлях до бібліотеки MooTools
    +Значення за замовчуванням: manager/media/script/mootools/mootools.js
    +Примітка:
    +

    Приклад:

    +
    &jsMooTools=``
    +
    +
    +
    +
    + +
    +
    +Формат: Шлях до бібліотеки MooTools2
    +Значення за замовчуванням: js/mootools2/mootools1.2.js
    +Примітка: mootools2 - альтернатива mootools бібліотеці. +Mootools1.2.4 вже встановлена
    +

    Приклад:

    +
    &jsMooTools2=``
    +
    +
    +
    +
    + +
    +
    +Формат:Шлях до бібліотеки Jquery
    +Значення за замовчуванням: js/jQuery/jquery.js
    +Примітка: суміснусть з Jquery 1.4.2 бібліотекою
    +

    Приклад:

    +
    &jsJquery=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/03_\320\275\320\265_ajax_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/03_\320\275\320\265_ajax_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..22af5dfc --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/03_\320\275\320\265_ajax_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,49 @@ + + +

    AjaxSearch: Не Ajax параметри

    +Не Ajax параметри сніпета AjaxSearch. +
    +
    +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: нет
    +Примітка: У версії 1.8.4: &AS_landing
    +

    Приклад:

    +
    &landingPage=`12`
    +
    +
    +
    +
    + +
    +
    +Формат: число=>0
    +Значення за замовчуванням: 0
    +Примітка: 0 - необмежана кількість результатів
    +

    Приклад:

    +
    &grabMax=`20`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &showPagingAlways=`1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/04_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/04_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..5c528e3a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/04_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,8 @@ + + +

    AjaxSearch: Конфігурація

    +Конфігурація сніпета AjaxSearch. +
    +

    Файл конфігурації default.config.php використовується за замовчуванням, і містить значення всіх параметрів . Можна підключити інший конфігураційний файл. у конфігураційному файлі значення параметрів повинні бути додані за допомогою синтаксиса:

    +

    $param = 'значення' - щоб назначити значення параметру, наприклад $hideLink = '0';

    +

    $ __ param = 'значення' - для глобального параметра, наприклад $__hideLink = '0';

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/05_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/05_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270.md" new file mode 100644 index 00000000..63435101 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/05_\320\234\320\276\320\264\320\270\321\204\321\226\320\272\320\260\321\202\320\276\321\200\320\270.md" @@ -0,0 +1,19 @@ + + +

    AjaxSearch: Модифікатори

    +Модифікатори сніпета AjaxSearch ширина зображення висота зображення атрибути зображення максимальна ширина зображення максимальна висота зображення. +
    +

    Слугують для підключення зображень у результати пошуку. Застосовуються у шаблонах. Можливі наступні модифікатори:

    +

    imgwidth : ширина зображення

    +
    <img src="[+as.imgTag+]" width="[+as.imgTag:imgwidth+]" />
    +

    imgheigth : висота зображення

    +
    <img src="[+as.imgTag+]" width="[+as.imgTag: imgheigth+]" />
    +

    Imgattr : атрибути зображення

    +

    Задає зображенню атрибути, такі як height="xxx" і width="yyy"

    +
    <img src="[+as.imgTag +]" [+as.imgTag:imgattr+] />
    +

    Imgmaxwidth : максимальна ширина зображення

    +

    Обмежує зображення по ширині. Не може бути більше істинної ширини.

    +
    <img src="[+as.imgTag +]" width="[+as.imgTag:imgmaxwidth=`60`+]" />
    +

    Imgmaxheight : максимальна висота зображення

    +

    Обмежує зображення по висоті. Не може бути більше істинної висоти.

    +
    <img src="[+as.imgTag +]" width="[+as.imgTag:imgmaxheight=`90`+]" />
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..e4a2806d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,43 @@ + + +

    AjaxSearch: Плейсхолдери

    +Плейсхолдери використовуються у шаблонах сніпета AjaxSearch. +
    +

    Плейсхолдери використовуютсья у шаблонах. Форма пошуку теж доступна як плейсхолдер [+as.searchString +]. Вставте цей плейсхолдер у шаблоні втому місці, де хочете бачити форму пошуку .

    +

    Будь-який TV-параметр може превратиться перетворитися у плейсхолдер задопомогою параметрів &withTvs та &tvPhx. Дані плейсхолдери можна використовувати , наприклад, у шаблонах tplResult та tplAjaxResult:

    +
    [+as.****+]
    +

    замість **** вкажість імя TV-параметра.

    +

    Для того, щоб перевірити , містить чи не містить TV-параметр будь-яке значення, застосовується такий плейсхолдер:

    +
    [+as.****Show+]
    +

    котрий приймає значення [0 | 1], і рівний 0 коли **** = '', інакше приймає значення 1.

    +
    [+as.descriptionShow:is=`1`:then=`[+as.description+]`+]
    +

    Тобто якщо поле description не заповнене, то воно не виведеться.

    +

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

    +
    [+as.****Class+]
    +

    назва класа буде наступною:

    +

    1. ajaxSearch_result**** для результатів в не Ajax режимі (&tplResult)

    +

    2. AS_ajax_result**** для Ajax режиму (&tplAjaxResult)

    +

    Наприклад, при &whereSearch="content,tv" можна отримати наступні плейсхолдери:

    +
    [+as.id+]
    +[+as.publishedon+]
    +

    Плейсхолдери документа

    +
    [+as.pagetitle+], [+as.pagetitleShow+], [+as.pagetitleClass+]
    +[+as.longtitle+], [+as.longtitleShow+], [+as.longtitleClass+]
    +[+as.description+], [+as.descriptionShow+], [+as.descriptionClass+]
    +[+as.alias+], [+as.aliasShow+], [+as.aliasClass+]
    +[+as.introtext+], [+as.introtextShow+], [+as.introtextClass+]
    +[+as.menutitle+], [+as.menutitleShow+], [+as.menutitleClass+]
    +[+as.content+], [+as.contentShow+], [+as.contentClass+]
    +[+as.breadcrumbs+],[+as.breadcrumbsShow+],[+as.breadcrumbsClass+]
    +

    Змінні шаблона

    +
    [+as.tv_value+], [+as.tv_valueShow+], [+as.tv_valueClass+]
    +

    Breadcrumbs

    +
    [+as.breadcrumbs+], [+as.breadcrumbsShow+], [+as.breadcrumbsClass+]
    +

    Параметр &extract

    +
    [+as.extract+], [+as.extractShow+], [+as.extractClass+]
    +

    Імена класів:

    +

    AS_ajax_resultExtract (Ajax режим)
    ajaxSearch_resultExtract (не Ajax режим)

    +

    &whereSearch=`content,tv,maxigallery,jot`

    +
    [+as.jot_content], [+as.jot_contentShow], [+as.jot_contentClass]
    +[+as.gal_title], [+as.gal_titleShow], [+as.gal_titleClass]
    +[+as.gal_descr], [+as.gal_descrShow], [+as.gal_descrClass]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/07_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/07_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..9537e5f4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/07_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,166 @@ + + +

    AjaxSearch: Шаблони

    +Шаблони використання сніпета AjaxSearch. +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ input.tpl.html
    +Примітка:
    Приклади шаблонів знаходяттся у папці: templates/inputTemplates/
    +Input 1: простий пошук з простим введенням
    +Input 2: розширений пошук . Перемикачі для вибору варіанта пошуку
    +Input 3: пошук за параметрами з випадаючого списку (multi-select)
    +Параметр розширеного пошуку може бути змішаний з шаблонами (2 & 3).
    +При liveSearch кнопка пошуку не відображається.
    +

    Приклад:

    +
    &tplInput=`@FILE:assets/snippets/ajaxSearch/templates/inputTemplates/input2.tpl.html`
    +
    +
    +
    +
    + +
    +
    +Формат: імя чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ grpResult.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplGrpResult=``
    +
    +
    +
    +
    + +
    +
    +Формат: імя чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ results.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplResults=``
    +
    +
    +
    +
    + +
    +
    +Формат: імя чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ result.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplResult=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ comment.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplComment=``
    +
    +
    +
    +
    + +
    +
    +Формат: імя чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ Paging0.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplPaging0=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ Paging1.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplPaging1=``
    +
    +
    +
    +
    + +
    +
    +Формат: імя чанка | @FILE
    +Значення за замовчуванням: templates/ ajaxGrpResult.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplAjaxGrpResult=`assets/snippets/ajaxSearch/templates /myAjaxGrpResult.tpl.html`
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE
    +Значення за замовчуванням: templates/ ajaxResults.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplAjaxResults=`@FILE:assets/snippets/ajaxSearch/templates /myAjaxResults.tpl.html`
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE
    +Значення за замовчуванням: templates/ ajaxResult.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplAjaxResult=`@FILE:assets/snippets/ajaxSearch/templates /myAjaxResult.tpl.html`
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE
    +Значення за замовчуванням: @FILE:assets/snippets/ajaxSearch/templates/ Paging2.tpl.html
    +Примітка:
    +

    Приклад:

    +
    &tplPaging2=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/08_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/08_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..79ba7d1e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/08_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,14 @@ + + +

    AjaxSearch: Встановлення

    +Встановлення сніпета AjaxSearch. +
    +

    Сніпет AjaxSearch слугує для органsзації пошуку по сайту. Існує два режима роботи сніпета: з використанням Ajax (без перезавантаження сторінки) і без використання Ajax (з перезавантаженням сторінки ). Вивід результатів пошуку можна зробити як на тій же сторінці, де розташована форма пошуку, так і на цільовій сторінці, призначена для відображення результатів. Можна розташувати декілька форм пошуку на одній сторінці. Сніпет дозволяє залишати коментарі про отримані результати пошуку, сортувати знайдені документи по категоріям та рангу і т.д. Сніпет поставляєтся в комплекті з MODX Evolution.

    +
    1. Завантажте останню версію сніпета AjaxSearch
    +
    2. Створіть новий сніпет під назвою AjaxSearch і помістіть у Код сніпета вміст файла snippet.ajaxSearch.txt із завантаженого архіва
    +
    3. Створіть папку під назвою ajaxSearch у папці assets/snippets
    +
    4. Скопіюйте файли з архіву у папку ajaxSearch
    +
    5. Розташуйте у шаблоні такий виклик сніпета: [!AjaxSearch? &showResults=`0` &landingPage=`17` &showMoreResults=`1` &moreResultsPage=`17`!]
    +
    6.Налаштуйте стилі для відображення зовніщнього вигляду форми пошуку і вивід результатів
    +
    7. Перевірте роботу сніпета у режимі AJAX
    +
    8. Створіть цільову сторінку (дла параметрів landingPage і moreResultsPage)і розташуйте на ній ще один виклик сніпета: [!AjaxSearch? &showInputForm=`0` &ajaxSearch=`0`!]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/09_\320\222\320\270\320\262\321\226\320\264_\321\204\320\276\321\200\320\274.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/09_\320\222\320\270\320\262\321\226\320\264_\321\204\320\276\321\200\320\274.md" new file mode 100644 index 00000000..031f4f67 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/09_\320\222\320\270\320\262\321\226\320\264_\321\204\320\276\321\200\320\274.md" @@ -0,0 +1,28 @@ + + +

    AjaxSearch: Види форм

    +Варіанти форми сніпета AjaxSearch Простий пошук Рорзширений пошук з перемикачами типу Check Box Поиск за параметрами з випадаючого списку (multi-select). +
    +

    Варіанти форми пошукового запиту :

    +

    Форма введення у сніпеті AjaxSearch може бути трьох видів :

    +
    1. Простий пошук
    +
    2. Розширений пошук з перемикачами типу Check Box
    +
    3. Пошук за параметрами випадаючого з списку (multi-select)
    +

    Якщо користувач натискає на вікно пошуку, то текст, встановлений за замовчуванням , стирається, щоб користувач міг ввести пошуковий запит. Якщо він натисне поза вікна, не ввівши пошукового запиту, то текст за замовчуванням, появиться знову. Для керування цим параметром, використовуйте параметр &clearDefault.

    +

    У режимі Ajax (MooTools або Jquery), ви можете використовувати режим livesearch. Коли режим liveSearch встановлено, пошук відбується після введення кожного символу і кнопка надсилання пошукового запиту не відображаєтся.

    +

    Ці форми елементів і особливостей (liveSearch, clearDefault) використовуються у AjaxSearch за замовчуванням. Але з додатковими налаштуваннями, ви могли б отримати набагато більше від AjaxSearch.

    +

    Можливості за замовчуванням , у залежності від варіантів виклику сніпета

    +

    Без використання Ajax режиму (&ajaxSearch = `0`)

    +
      +
    • простий пошук: простий пошук з простим полем введення.
    • +
    • розширенний пошук : розширений пошук. Поле введення з вибором параметрів пошуку
    • +
    • великого вибору пошуку
    • +
    • простий пошук з clearDefault.
    • +
    +

    У режимі Ajax (&ajaxSearch=`1`) - Mootools 1.11/Mootools 1.2.4/JQuery 1.4.2

    +
      +
    • простий пошук: простий пошук з простим полем введенням .
    • +
    • розширений пошук. Поле введення з вибором параметрів пошуку
    • +
    • великий вибір пошук
    • +
    • простий пошук з liveSearch.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/10_\320\237\320\273\320\260\320\263\321\226\320\275_highlight.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/10_\320\237\320\273\320\260\320\263\321\226\320\275_highlight.md" new file mode 100644 index 00000000..6559a090 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/10_\320\237\320\273\320\260\320\263\321\226\320\275_highlight.md" @@ -0,0 +1,10 @@ + + +

    AjaxSearch: Плагіни Highlight

    +Плагіни Highlight для виділення слів у результатах пошук з використанням сніпета AjaxSearch. +
    +

    Плагіни призначені для виділення у результатах пошуку слів з пошукового запиту.

    +

    Плагін searchHighlight

    +

    Виділення між тегами <body></body>

    +

    Плагін advSearchHighlight

    +

    Виділення між тегами <!--start highlight--> и <!--end highlight-->. Можливе багатократне використання на сторінці.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/index.md" new file mode 100644 index 00000000..c400ab64 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AjaxSearch/index.md" @@ -0,0 +1,4 @@ + + +

    AjaxSearch Пошук по сайту в Ajax і не Ajax режимах

    +Сніпет для організації пошуку по сайту. Виклик результатів пошук на тій самій сторінці, або на цільовій сторінці. Також, можна розташувати декілька форм пошуку на одній сторінці. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..edaa24e3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,42 @@ + + +

    AnythingRating: Особливості

    +Особливості сніпета AnythingRating. +
    +
      +
    • Використовує AJAX
    • +
    • Працює з відключеним JavaScript
    • +
    • Ви можете використовувати необмежену кількість груп рейтингів
    • +
    • Будь-яка кількість пунктів для голосування
    • +
    • Перевірка не тільки на IP, але й також включає в себе перевірку Cookie
    • +
    • Точність результатів голосування до однієї сотої
    • +
    • Попереднє завантаження зображень
    • +
    • Багатомовність з можливістю додавати власні мовні пакети
    • +
    • Протестований в IE 6, IE 7, Firefox 2.x, Opera і Safari
    • +
    • Групи рейтингу - Визначте групу рейтингу тільки один раз на сторінці: +
        +
      • Виберіть кількість "зірок" (або будь-яке інше зображення)
      • +
      • Визначте дату закінчення конкурсу
      • +
      • Визначте в шаблоні інформацію про оцінки: зірки 3.25 / 5 65% (205 голосів)
      • +
      • Налаштуйте або змініть зображення "зірок" за допомогою стилів css
      • +
      • Вкажіть точну кількість IP-адресів
      • +
      • Дозвольте або забороніть мультиголосування
      • +
      • Голосування тільки для зареєстрованих користувачів
      • +
      +
    • +
    • Використовуйте унікальний ідентифікатор: +
        +
      • Об'єднайте елементи в групи
      • +
      • Встановіть "novote", щоб заборонити користувачам голосувати за цей пункт
      • +
      • Калібруйте першу оцінку
      • +
      +
    • +
    • Покажіть найпопулярніші пункти рейтингу: +
        +
      • Виберіть кількість відображуваних пунктів
      • +
      • Покажіть кращі або гірші пункти
      • +
      • Визначте інформацію в таблиці рейтингу (назва, опис, зображення, посилання)
      • +
      • Покажіть кілька різних рейтингів
      • +
      +
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..6e915d19 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,351 @@ + + +

    AnythingRating: Параметри

    +Параметри сніпета AnythingRating. +
    +
    +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    +

    Приклад:

    +
    &define=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    +

    Приклад:

    +
    &getTopRated=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: Ім'я мовного файлу
    + Значення за замовчуванням: Немає
    + Примітка: Мовні пакети реалізовані не повністю , ви можете додати власний мовний файл.
    +

    Приклад:

    +
    &language=`russian-utf8`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 5
    + Примітка: AnythingRating.css повинен відповідати цій кількості
    +

    Приклад:

    +
    &nbStars=`3`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: all
    + Примітка:
    +

    Приклад:

    +
    &nbIP=`50`
    +
    +
    +
    + +
    + +
    +
    + Формат: YYYY-MM-DD | необмежено
    + Значення за замовчуванням: необмежено
    + Примітка:
    +

    Приклад:

    +
    &endDate=`2012-12-12`
    +
    +
    +
    + +
    + +
    +
    + Формат: список веб-груп користувачів через кому
    + Значення за замовчуванням: голосування є доступним для всіх
    + Примітка: Для голосування веб-користувачу необхідно авторизуватися
    +

    Приклад:

    +
    &canVote=``
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: 0 - допускається тільки один голос
    +

    Приклад:

    +
    &multiVote=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях
    + Значення за замовчуванням: assets/snippets/anythingRating/css/anythingRating.css
    + Примітка:
    +

    Приклад:

    +
    &atrCss=``
    +
    +
    +
    + +
    + +
    +
    + Формат:
    + Значення за замовчуванням: @FILE:assets/snippets/anythingRating/templates/anythingRating.tpl.html
    + Примітка: @FILE:шлях до файлу
    +

    Приклад:

    +
    &atrTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: Будь-яка комбінація символів AZ, підкреслення і цифр 0-9
    + Значення за замовчуванням: 0
    + Примітка:
    +

    Приклад:

    +
    &atrId=`ar1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    +

    Приклад:

    +
    &noVotes=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: Числове значення & gt; = 1 та & lt; = & nbStars | Дані, відформатовані як наступні TVname[:DocId]
    + Значення за замовчуванням: 0
    + Примітка: Вміст TV повинен містити rating_value або "rating_value:nb_votes"
    +

    Приклад:

    +
    &init=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 5
    + Примітка:
    +

    Приклад:

    +
    &topNb=`10`
    +
    +
    +
    + +
    + +
    +
    + Формат: best | worst
    + Значення за замовчуванням: best
    + Примітка:
    +

    Приклад:

    +
    &topDir=`worst`
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях
    + Значення за замовчуванням: @FILE:assets/snippets/anythingRating/templates/topRated.tpl.html
    + Примітка: @FILE:шлях
    +

    Приклад:

    +
    &topTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат:
    + Значення за замовчуванням:
    + Примітка: Використовуються поля $_lang['atr_bestlabel'] або $_lang['atr_worstlabel'] з мовного файлу
    +

    Приклад:

    +
    &topLabel=``
    +
    +
    +
    + +
    + +
    +
    + Формат: Будь-яке існуюче ім'я таблиці без префікса MODX
    + Значення за замовчуванням:
    + Примітка:
    +

    Приклад:

    +
    &topTable=`site_content`
    +
    +
    +
    + +
    + +
    +
    + Формат:
    + Значення за замовчуванням: id
    + Примітка:
    +

    Приклад:

    +
    &topIdField=``
    +
    +
    +
    + +
    + +
    +
    + Формат:
    + Значення за замовчуванням: title
    + Примітка:
    +

    Приклад:

    +
    &topTitleField=``
    +
    +
    +
    + +
    + +
    +
    + Формат: і'мя поля
    + Значення за замовчуванням: Немає
    + Примітка:
    +

    Приклад:

    +
    &topDescrField=`description`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я поля
    + Значення за замовчуванням: Немає
    + Примітка:
    +

    Приклад:

    +
    &topImageField=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я поля
    + Значення за замовчуванням: Немає
    + Примітка:
    +

    Приклад:

    +
    &topLinkField=`alias`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..1b84eb17 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,132 @@ + + +

    AnythingRating: Плейсхолдери

    +Плейсхолдери сніпета AnythingRating. +
    +

    Список доступних плейсхолдерів, які можна використовувати в шаблонах.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    anythingRatingTpl - Шаблон для віджета голосування.

    + Шаблон за замовчуванням знаходиться в файлі: assets/snippets/anythingRating/templates/anythingRating.tpl.html
    [+atr.scoreSection+]Секція для оцінки
    [+atr.intro+]Відображення поточного результату голосування
    [+atr.rating+]Поточна оцінка
    [+atr.nbstars+]Кількість зірок
    [+atr.lbstars+]Лейбл для зірок. Береться з мовного файлу $_lang['atr_lbstars']
    [+atr.nbvotes+]Число голосів
    [+atr.lbvotes+]Лейбл для голосів. Береться з мовного файлу $_lang['atr_lbvotes']
    [+atr.msgSection+]Секція для повідомлень
    +

    topRatedTpl - Шаблон для виведення результатів голосування.

    + Шаблон за замовчуванням знаходиться в файлі: assets/snippets/anythingRating/templates/topRated.tpl.html
    [+atr.groupid+]Назва групи рейтингу
    [+atr.baseurl+]URL сайту
    [+atr.ratingid+]Ідентифікатор предмета рейтингу
    [+atr.hdrank+]Лейбл для рангу. Береться з мовного файлу $_lang['atr_hdrank']
    [+atr.hdscore+]Лейбл для оцінок. Береться з мовного файлу $_lang['atr_hdscore']
    [+atr.hdnbvotes+]Лейбл для кількості голосів. Береться з мовного файлу $_lang['atr_hdnbvotes']
    [+atr.hdtitle+]Лейбл для назви предмета рейтингу. Береться з мовного файлу $_lang['atr_hdtitle']
    [+atr.hddescr+]Лейбл для опису предмета рейтингу. Параметр topDescrField
    [+atr.hdimage+]Лейбл для картинки предмета рейтингу. Параметр topImageField
    [+atr.hdlink+]Лейбл для посилання предмета рейтингу. Параметр topLinkField
    [+atr.rank+]Ранг
    [+atr.rating+]Поточна оцінка
    [+atr.nbstars+]Кількість зірок
    [+atr.lbstars+]Лейбл для зірок. Береться з мовного файлу $_lang['atr_lbstars']
    [+atr.nbvotes+]Число голосів
    [+atr.lbvotes+]Лейбл для голосів. Береться з мовного файлу $_lang['atr_lbvotes']
    [+atr.title+]Заголовок
    [+atr.descr+]Опис. Параметр topDescrField
    [+atr.image+]Зображення. Параметр topImageField
    [+atr.link+]Посилання. Параметр topLinkField
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..31b3fb8a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,134 @@ + + +

    AnythingRating: Приклади

    +Приклади виклику сніпета AnythingRating. +
    +

    Використання

    +

    Додайте перший виклик на початку сторінки, для визначення групи рейтингу:

    +
    [!AnythingRating? &define=`1` &atrGrp=`grpName`!]
    +

    де:

    +
      +
    • &define=`1` - вказуємо, що даний виклик сніпета призначений для визначення групи рейтингу
    • +
    • &atrGrp=`grpName` - ім'я групи рейтингу. Будь-яка комбінація символів AZ, підкреслення і цифр 0-9
    • +
    +

    Біля предмета (зображення, статті тощо), до якого додаємо голосування розміщуємо такий виклик сніпета:

    +
    [!AnythingRating? &atrGrp=`grpName` &atrId=`idItem`!]
    +

    де:

    +
      +
    • &atrGrp=`grpName` - визначаємо, до якої групи належить наш рейтинг
    • +
    • &atrId=`idItem` - унікальний ідентифікатор предмета рейтингу. Може бути [*id*] або [+maxigallery.picture.id+] в чанку maxigallery або будь-яким іншим id.
    • +
    +

    Для виведення ТОП рейтингу використовуємо наступний виклик сніпета:

    +
    [!AnythingRating? &getTopRated=`1` &atrGrp=`grpName` &topTable=`site_content` &topTitleField=`pagetitle`!]
    +

    де:

    +
      +
    • &getTopRated=`1` - вказуємо, що даний виклик призначений для виведення результатів голосування
    • +
    • &atrGrp=`grpName` - визначаємо групу по якій будемо виводити результати
    • +
    • &topTable=`site_content` - вказуємо ім'я таблиці, яка містить дані предметів рейтингу. Ім'я таблиці вказується без префікса MODX
    • +
    • &topTitleField=`pagetitle` -поле, яке використовується в якості назви предмета рейтингу
    • +
    +

    Ви можете налаштувати зовнішній вигляд результатів голосування за допомогою CSS в файлі css/anythingRating.css. Також ви можете налаштувати форму для голосування в шаблоні templates/anythingRating.tpl.html або форму виведення результатів голосування в шаблоні templates/topRated.tpl.html. Дивіться можливі плейсхолдери для використання в шаблонах.

    + + +

    Визначення рейтингу групи

    +

    Це найпростіший приклад виклику - визначає рейтинг групи 'photos':

    +
    [!AnythingRating? &define=`1` &atrGrp=`photos`!]
    +
      +
    • зберігання всіх IP-адрес тих, хто проголосував за кожним пунктом
    • +
    • віджет з 5 зірок (визначене за умовчанням файлом CSS)
    • +
    • дата проведення рейтингу необмежена
    • +
    • мова встановлена в якості мови менеджера MODX
    • +
    +

    Цей виклик сніпета визначає рейтинг групи 'travelbook':

    +
    +[!AnythingRating?
    +&define=`1`
    +&atrGrp=`travelbook`
    +&language=`francais-utf8`
    +&canVote=`travel`
    +&nbIP=`200`
    +&nbStars=`10`
    +&endDate=`2014-06-30`
    +&atrTpl=`@FILE:assets/snippets/anythingRating/templates/travelBookTpl.tpl.html`
    +&atrCss=`@FILE:assets/snippets/anythingRating/css/travelBookCss.css`!]
    +
    +
      +
    • &language=`francais-utf8` - мовний пакет Francais-utf8
    • +
    • &canVote=`travel` - проголосувати можуть тільки веб-користувачі з веб-групи "travel"
    • +
    • &nbIP=`200` - зберігання до 200 IP-адрес тих, хто проголосував за кожним пунктом
    • +
    • &nbStars=`10` - віджет і 10 зірок (визначається CSS-файлом)
    • +
    • &endDate=`2014-06-30` - дата закінчення конкурсу
    • +
    • travelBookTpl.tpl.html - як файл шаблону
    • +
    • travelBookCss.css - як CSS-файл
    • +
    + +

    Пункт голосування

    +
    [!AnythingRating? &atrGrp=`travelbook` &atrId=`[*id*]`!]
    +

    де:

    +
      +
    • &atrGrp=`travelbook` - група рейтингу
    • +
    • &atrId=[*id*] - унікальний ідентифікатор поточного документу
    • +
    +

    Цей приклад виклику сніпета може використовуватися, наприклад в шаблоні для Ditto:

    +
    [[AnythingRating? &atrGrp=`travelbooks` &atrId=`[+id+]` &init=`opinion:[+id+]`]]
    +

    де:

    +
      +
    • &atrGrp=`travelbook` - група рейтингу
    • +
    • &atrId=[+id+] - унікальний ідентифікатор поточного документу +
    • +
    • &init=`opinion:[+id+]` - початкове значення рейтингу з TV 'opinion' документу + [+id+]
    • +
    +

    Цей сніпет викликається в шаблоні зображення maxigallery:

    +
    [!AnythingRating? &atrGrp=`photos` &atrId=`[+maxigallery.picture.id+]`!]
    +

    де:

    +
      +
    • &atrGrp=`photos` - група рейтингу
    • +
    • &atrId=[+maxigallery.picture.id+] - унікальний ідентифікатор зображення, яке ви хочете оцінити
    • +
    +
    [!AnythingRating? &atrGrp=`products` &atrId=`[*id*]` &noVotes=`1` &init=`opinion`!]
    +

    де:

    +
      +
    • &atrGrp=`products` - група рейтингу
    • +
    • &atrId=[*id*] - унікальний ідентифікатор поточного документу +
    • +
    • &noVotes=`1` - голосування забороняється, відображається тільки результат
    • +
    • &init=`opinion` - ініціалізація голосів від TV 'opinion'
    • +
    + +

    Кращі за рейтингом

    +

    Цей сніпет виведе рейтинг документів в конкурсі `travelbook`:

    +
    [[AnythingRating? &getTopRated=`1` &atrGrp=`travelbook` &topTable=`site_content` &topTitleField=`pagetitle` &topLabel=`travelbooks`]]
    +
      +
    • відображення 5 кращих за рейтингом
    • +
    • ідентифікатор, назва і опис в рейтингу береться з таблиці"site_content"
    • +
    • поле ідентифікатора використовується як "ID" за замовчуванням
    • +
    • назва блоку з результатами рейтингу"travelbooks"
    • +
    • ім'я поля для назви pagetitle з таблиці"site_content"
    • +
    • поля з описом, зображенням і посиланням за замовчуванням не використовуються
    • +
    • шаблон за замовчуванням: assets/snippets/anythingRating/templates/topRated.tpl.html
    • +
    +

    Цей сніпет виведе рейтинг зображень в конкурсі `photos`:

    +
    +[!AnythingRating?
    +&getTopRated=`1`
    +&topDir=`worst`
    +&atrGrp=`photos`
    +&topNb=`3`
    +&topTpl=`@FILE:assets/snippets/anythingRating/templates/anotherTopRated.tpl.html`
    +&topTable=`maxigallery`
    +&topDescrField=`descr`
    +&topImageField=`filename`
    +&topLinkField=`gal_id`
    +&topLabel=`photos`!]
    +
    +
      +
    • відображення 3 гірших по рейтингу!
    • +
    • ідентифікатор, назва і опис в рейтингу береться з таблиці "maxigallery"
    • +
    • поля для ідентифікатора і назви використовується як 'id' і 'title' за замовчуванням
    • +
    • назва блоку з результатми рейтингу "photos"
    • +
    • ім'я поля для опису 'descr' береться з таблиці "maxigallery"
    • +
    • для посилання використовується поле 'gal_id'
    • +
    • для зображення використовується поле 'filename'
    • +
    • шаблон за замовчуванням: assets/snippets/anythingRating/templates/anotherTopRated.tpl.html
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/05_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/05_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..c2f7e0eb --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/05_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,8 @@ + + +

    AnythingRating: Встановлення

    +Встановлення сніпета AnythingRating. +
    +

    1. Скачайте останню версію AnythingRating

    +

    2. Cтворіть директорію anythingRating в папці assets/snippets і скопіюйте туди файли з завантаженого архіву

    +

    3. Створіть новий сніпет AnythingRating і помістіть в код сніпета вміст файлу assets/snippets/anythingRating/snippet.anythingRating.php

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/index.md" new file mode 100644 index 00000000..0248c112 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/AnythingRating/index.md" @@ -0,0 +1,4 @@ + + +

    AnythingRating: Голосування на MODX Evolution Рейтинг ресурсів. Голосування відвідувачів

    +AnythingRating сніпет дозволяє організувати на своєму сайті голосування за будь-яку групу ресурсів: статтю, фотографію, коментар. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/BlackList/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/BlackList/index.md" new file mode 100644 index 00000000..c39d6a40 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/BlackList/index.md" @@ -0,0 +1,106 @@ + + +

    BlackList: Захист від спаму без капчі

    +Плагін Захисту від спаму без капчі на Evolution CMS. + +

    Автор: Олексій Лібер

    +

    Перше, що треба зробити - зареєструватися на сайті Akismet і отримати ключ API. (Там просить реєстрацію на Wordpress.com, тому що клас спочатку під нього заточений був). Потім перейти на сторінку з плагінами і бібліотеками, вибрати і завантажити клас PHP 5 Akismet.

    +

    Завантажений файлик akismet.class.php кидаємо в assets/lib/

    +

    Далі створюємо табличку для небажаних ip щоб відразу блокувати ip з яких розсилався спам.

    +

    Інструменти -> Резервне копіювання -> Відновити -> Виконати довільну команду SQL.

    +
    +CREATE TABLE `modx_ip_blocked` (
    +  `id` int(11) NOT NULL AUTO_INCREMENT,
    +  `ip` varchar(16) NOT NULL,
    +  `blocked` tinyint(4) NOT NULL,
    +  `when` varchar(18) NOT NULL,
    +  PRIMARY KEY (`id`),
    +  UNIQUE KEY `id` (`id`),
    +  UNIQUE KEY `ip` (`ip`)
    +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    +
    +

    Далі створюємо плагін на події OnBeforeLoadDocumentObject и OnLoadWebPageCache і вставляємо наступний код:

    +
    +$blockip = 1; //Блокувати користувачів по ip. 1 - так. 0 - ні.
    +$e = $modx->Event;
    +if ($e->name == 'OnBeforeLoadDocumentObject' || $e->name == 'OnLoadWebPageCache'){
    +	if ($blockip){
    +		$ip = $_SERVER["REMOTE_ADDR"];
    +		$tbl = $modx->getFullTableName('ip_blocked');
    +		if ($modx->db->getValue("Select count(*) from $tbl where `ip`='$ip'") == 1){
    +			exit('Welcome to the blacklist!');			
    +		}
    +	}
    +	if (($_POST['name']) || ($_POST['email']) || ($_POST['message'])){
    +		require_once ('assets/lib/akismet.class.php');
    +		$akismet = new Akismet('http://site.com/', '905c97472xxx');
    +		$akismet->setCommentAuthor($_POST['name']);
    +		$akismet->setCommentAuthorEmail($_POST['email']);
    +		$akismet->setCommentContent($_POST['message']);
    +		if($akismet->isCommentSpam()){
    +			$modx->db->insert(array('ip'=>$ip,'blocked'=>1,'when'=>time()),$tbl);
    +			exit('Welcome to the blacklist!');
    +		}
    +	}
    +}
    +
    +

    Дана конструкція перевіряє ім'я користувача, його email і саме повідомлення. В наведеному вище прикладі використовується ім'я поля message. Якщо у вас інше ім'я - поміняйте на ваше.

    +

    На момент написання посту пройшло близько 12-ї години з моменту установки даного рішення на одному з сайтів, спіймано п'ять листів які містять спам, і два від клієнтів доставлені адресату - тобто начебто працює справно.

    + + +

    Автор: Saniock

    +

    безкоштовна

    +

    Потрібно вручну додавати емейл адреси і доменні імена

    + +

    Створюємо ту ж таблицю для небажаних ip

    +
    +CREATE TABLE `modx_ip_blocked` (
    +  `id` int(11) NOT NULL AUTO_INCREMENT,
    +  `ip` varchar(16) NOT NULL,
    +  `blocked` tinyint(4) NOT NULL,
    +  `when` varchar(18) NOT NULL,
    +  PRIMARY KEY (`id`),
    +  UNIQUE KEY `id` (`id`),
    +  UNIQUE KEY `ip` (`ip`)
    +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    +
    + +

    Створюємо таблицю в якій будемо зберігати емейл адреси, або підозрілі доменні імена

    +
    +CREATE TABLE `modx_email_blocked` (
    +  `id` int(11) NOT NULL AUTO_INCREMENT,
    +  `email` varbinary(50) NOT NULL,
    +  PRIMARY KEY (`id`),
    +  UNIQUE KEY `id` (`id`),
    +  UNIQUE KEY `email` (`email`)
    +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
    +
    + +

    Далі створюємо плагін на події OnBeforeLoadDocumentObject, OnLoadWebPageCache, OnPageNotFound і вставляємо наступний код:

    +
    +$blockip = 1; //Блокувати користувачів по ip. 1 - так. 0 - ні.
    +$e = $modx->Event;
    +switch($e->name){
    +	case 'OnBeforeLoadDocumentObject':
    +	case 'OnLoadWebPageCache':
    +	case 'OnPageNotFound':
    +		$tbl_ip = $modx->getFullTableName('app_ip_blocked');
    +		$tbl_email = $modx->getFullTableName('app_email_blocked');
    +		
    +		if($blockip){
    +			$ip = $_SERVER["REMOTE_ADDR"];
    +			if($modx->db->getValue("Select count(*) from $tbl_ip where ip = '$ip'") == 1){
    +				exit('Welcome to the blacklist!');
    +			}
    +		}
    +		if($_POST['email']){
    +			$email = $modx->db->escape($_POST['email']);
    +			$email_domen = array_pop(explode('@', $email));
    +			
    +			if($modx->db->getValue("Select count(*) from $tbl_email where email = '$email' or email = '$email_domen'") > 0){
    +				$modx->db->insert(array('ip' => $ip,'blocked' => 1,'when' => time()), $tbl_ip);
    +				exit('Welcome to the blacklist!');
    +			}
    +		}
    +}
    +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..bd29851b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,12 @@ + + +

    Breadcrumbs: Особливості

    +Особливості сніпету Breadcrumbs. +
    +

    Breadcrumbs («Хлібні крихти», за іронічною аналогією з німецькою казкою «Гензель і Гретель», у якій діти, коли їх завели до лісу вдруге, не змогли знайти зворотну дорогу, тому що цього разу замість маленьких каменів вони залишали за собою хлібні крихти, згодом скльовані лісовими птахами) – елемент навігації по сайту, що є шлях сайтом від його «кореня» до поточної сторінки, на якій знаходиться користувач.

    +

    Зазвичай являє собою смугу у верхній частині сторінки приблизно такого вигляду:

    +
    +Modx Evolution / Доповнення / BreadcrumbsОсобливості
    +
    +

    Всі елементи, крім останнього, зазвичай є внутрішніми гіперпосиланнями.

    +

    Даний сніпет був розроблений для відображення на сторінках сайту шляху поточної сторінки. Йдеться про шлях сторінки в ієрархії сайту, а не шлях, яким сюди потрапив користувач.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..62a071b0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,339 @@ + + +

    Breadcrumbs: Параметри

    +Параметри сніпету Breadcrumbs. +
    +
    +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 100
    +Примітка: Якщо цей параметр встановлений рівним двом, а користувач знаходиться на 5-му рівні глибини, шлях виглядатиме так:
    +
    головна → ... → рівень 4 → рівень 5
    +Примітка. Перше посилання (на головну) не рахується.

    +

    Приклад:

    +
    &maxCrumbs=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка:
    +Відображати відрізок шляху до неопублікованих документів у дорозі. Якщо цей параметр дорівнює 1, то будуть відображені всі посилання, за винятком неопублікованих.
    +Наприклад, є шлях (неопубліковані у верхньому регістрі):
    +
    головна → новини → СПОРТ → ходьба на лижах → стаття
    +При &pathThruUnPub = 1 Ви отримаєте результат: +
    головна → новини → ходьба на лижах → стаття
    +При &pathThruUnPub = 0 отримаєте: +
    головна → ходьба на лижах → стаття
    +відображено посилання на головну та шлях після неопублікованого документа

    +

    Приклад:

    +
    &pathThruUnPub=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &respectHidemenu=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &showCurrentCrumb=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    1 - покаже поточну сторінку як посиланняи
    +0 - покаже поточну сторінку у вигляді тексту
    +

    Приклад:

    +
    &currentAsLink=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: menutitle,pagetitle,longtitle
    +Примітка: Варіанти: pagetitle, longtitle, description, menutitle. Як тест посилання буде використано перше з цих полів, що має значення.
    +

    Приклад:

    +
    &linkTextField=`pagetitle,longtitle,description`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: description,longtitle,pagetitle,menutitle
    +Примітка: Варіанти: pagetitle, longtitle, description, menutitle. Як title посилання буде використано перше з цих полів, що має значення.
    +

    Приклад:

    +
    &linkDescField=`longtitle,pagetitle,menutitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка: Якщо з якихось причин Ви хочете, щоб крихти були текстом, а не посиланнями, встановіть значення 0
    +

    Приклад:

    +
    &showCrumbsAsLinks=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: defaultString
    +Примітка: Існує два шаблони, які знаходяться в коді Сніппет: defaultString (використовується за замовчуванням) і defaultList. Ви можете вибрати один із цих шаблонів або створити власні шаблони.
    +

    Приклад:

    +
    &templateSet=`defaultList`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: ...
    +Примітка: Цей текст буде показаний, якщо кількість пунктів перевищить максимальну кількість пунктів, визначену maxCrumbs.
    +

    Приклад:

    +
    &crumbGap=`>>>`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: B_
    +Примітка: Breadcrumbs автоматично додадуть класи. Щоб уникнути конфліктів, ви можете визначити свій префікс. Опис класів:
    +crumbBox: клас тега span кожного пункту
    +hideCrumb: класс тега span для розриву "..."
    +currentCrumb: класс тега span або a для поточного пункту
    +firstCrumb: клас тега span, який буде застосовуватися до першого пункту, чи то "home", чи ні
    +lastCrumb: клас тега span останнього пункту, чи то поточна сторінка, чи ні
    +crumb: клас дається кожному тегу A ля проміжних пунктів (крім "home", "current", и "hide") +homeCrumb: Клас для пункту "home"
    +

    Приклад:

    +
    &stylePrefix=`Br_`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &showHomeCrumb=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: site_start
    +Примітка: Зазвичай початковою сторінкою "site start" вважається головна сторінка. Але ви можете визначити як початкову сторінку інший документ.
    +

    Приклад:

    +
    &homeId=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: немає
    +Примітка: Будь-який рядок, який буде відображено у посиланні на головну сторінку
    +

    Приклад:

    +
    &homeCrumbTitle=`Додому`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за заовчуванням: немає
    +Примітка: Ви можете вказати текст опису для title посилання на головну сторінку. Якщо параметр не вказувати, то значення буде використано поле, встановлене в параметрі homeCrumbTitle.
    +

    Приклад:

    +
    &homeCrumbDescription=`На головну`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &showCrumbsAtHome=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, через кому
    +Значення за замовчуванням: немає
    +Примітка: Розділений комами список ID документів, на яких не треба виводити Breadcrumbs.
    +

    Приклад:

    +
    &hideOn=`2,3`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, через кому
    +Значення за замовчуванням: немає
    +Примітка: Розділений комами список ID документів-контейнерів, у дочірніх документах яких не треба виводити Breadcrumbs.
    +

    Приклад:

    +
    &hideUnder=`2,3`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, через кому
    +Значення за замовчуванням: немає
    +Примітка: Розділений комами список ідентифікаторів документів, досягнувши яких, Breadcrumbs зупиняється. Це корисно, наприклад, на багатомовних сайтах.
    +

    Приклад:

    +
    &stopIds=`2,3`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, через кому
    +Значення за замовчуванням: немає
    +Примітка: Розділений комами список ID документів, які не повинні відображатися Breadcrumbs.
    +

    Приклад:

    +
    &ignoreIds=`25,26`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: »
    +Примітка:
    +

    Приклад:

    +
    &crumbSeparator=` >> `
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..f55babae --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,23 @@ + + +

    Breadcrumbs: Шаблони

    +Шаблони сніпета Breadcrumbs defaultString defaultList. +
    +
    +$templates = array(
    +	'defaultString' => array(
    +		'crumb' => '[+crumb+]',
    +		'separator' => ' » ',
    +		'crumbContainer' => '[+crumbs+]',
    +		'lastCrumbWrapper' => '[+lastCrumbSpanA+]',
    +		'firstCrumbWrapper' => '[+firstCrumbSpanA+]'
    +	),
    +	'defaultList' => array(
    +		'crumb' => '
  • [+crumb+]
  • ', + 'separator' => '', + 'crumbContainer' => '
      [+crumbs+]
    ', + 'lastCrumbWrapper' => '[+lastCrumbSpanA+]', + 'firstCrumbWrapper' => '[+firstCrumbSpanA+]' + ), +); +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..24e60a26 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,8 @@ + + +

    Breadcrumbs: Приклади

    +Приклади виклику сніпета Breadcrumbs. +
    +

    Найпростіший виклик сніппета без параметрів виглядає так:

    +
    [!Breadcrumbs!] // некешований
    +[[Breadcrumbs]] // кешований
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/index.md" new file mode 100644 index 00000000..76f3f13e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Breadcrumbs/index.md" @@ -0,0 +1,4 @@ + + +

    Breadcrumbs Шлях по сайту від кореня до теперішньої сторінки

    +Навігаційний ланцюжок - елемент навігації являє собой шлях по файловій системі від кореня до теперішньої сторінки. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ClientSettings/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ClientSettings/index.md" new file mode 100644 index 00000000..036739b2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ClientSettings/index.md" @@ -0,0 +1,40 @@ +Автор: mnoskov + + + +Модуль для створення форми користувацьких налаштувань. + +Для початку роботи необхідно перейменувати файли конфігурації `assets/modules/clientsettings/config/*.php.sample` у `*.php`. + +Конфігурація полів береться з файлів `*.php` у папці `/assets/modules/clientsettings/config/`. Кожен файл — це окрема вкладка. Такий спосіб зберігання дозволяє легко змінювати та переносити конфігурацію. + +Приклад файлу конфігурації: +```php + 'Заголовок вкладки', + 'introtext' => 'Опис вкладки', + 'settings' => [ + 'field_text' => [ + 'caption' => 'Текст', + 'type' => 'text', + 'note' => 'Це просто текст', + 'default_text' => 'Значення за замовчуванням', + ], + + ... + + ], +]; +``` + +Типи полів описані тут. + +Окрім стандартних полів можна використовувати тип `divider` для розділення списку полів на групи: +```php +'field_text' => [ + 'caption' => 'Заголовок групи полів', + 'type' => 'divider', +], +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/01_\320\232\320\276\320\274\320\260\320\275\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/01_\320\232\320\276\320\274\320\260\320\275\320\264\320\270.md" new file mode 100644 index 00000000..f3d30bcc --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/01_\320\232\320\276\320\274\320\260\320\275\320\264\320\270.md" @@ -0,0 +1,69 @@ + + +

    CodeMirror: Команди

    +Команди плагіна CodeMirror для підсвічування коду в адміністративній панелі сайту на Evolution CMS. +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ДіяКоманда
    Згортання/розгортання табаCtrl-Space
    Увімкнути/вимкнути FullScreenF11
    Вимкнути FullScreenEsc
    ЗберегтиCtrl-S
    Зберегти і продовжитиCtrl-E
    Зберегти і закритиCtrl-Q
    Зберегти і створити новийCtrl-B
    Виділити всеCtrl-A
    Виділити вміст контейнераCtrl-D
    Скасувати останню діюCtrl-Z
    Повторити останню діюCtrl-Y
    Перемістити курсор на початок рядкаAlt-стрілка вліво
    Перемістити курсор на кінець рядкаAlt-стрілка вправо
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/02_\320\234\320\276\320\266\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/02_\320\234\320\276\320\266\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..5b8aa597 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/02_\320\234\320\276\320\266\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,20 @@ + + +

    CodeMirror: Можливості

    +Можливості плагіна CodeMirror для підсвічування коду в адміністративній панелі сайту на Evolution CMS. +
    +

    Підсвічування коду в адміністративній панелі в чанках, сніпетах, модулях, шаблонах і т.д. На базі CodeMirror 3.13

    +
      +
    • Підсвічування js, css, json, xml в документах з відповідними типами.
    • +
    • Різні теми.
    • +
    • Висота блоку редактора залежить від вмісту.
    • +
    • Нумерація рядків.
    • +
    • Підсвічування активної лінії(&activeLine).
    • +
    • Настроюваний розмір TAB(&tabSize).
    • +
    • Точки зупинки.
    • +
    • Згортання в таб функцій та умов(JS), вмісту тегів(HTML) (Ctrl+Space).
    • +
    • Підсвічування однакових "слів"(&selectionMatches).
    • +
    • Full Screen(F11).
    • +
    • Підсвічування синттаксису MODX.
    • +
    • Гарячі клавіші.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/index.md" new file mode 100644 index 00000000..1d6ad1e9 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/CodeMirror/index.md" @@ -0,0 +1,4 @@ + + +

    CodeMirror Підсвічування коду на Evolution CMS

    +Підсвічування коду в адміністративній панелі в чанках, сніпетах, модулях, шаблонах Evolution CMS. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Combacart/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Combacart/index.md" new file mode 100644 index 00000000..0ad974a7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Combacart/index.md" @@ -0,0 +1,277 @@ +За допомогою **CombaCart** можна створити повноцінний інтернет-магазин чи маркетплейс (декілька Продавців на одному сайті) на базі EVO 1.4+ чи Evolution CMS 3.+, та керувати Замовленями покупців. + +Важливо: для редагування розширених властивостей товарів використовуйте окремі плагіни чи модулі (multiTV та подібні), для фасетного фільтру використовуйтк eFilter. + +Для Покупця: +- перегляд, додавання та редагування Товарів у Кошику, та подальше оформлення Кошика в Замовлення покупця +- сторінка Відстеження та Оплата замовлення +- трекінг відправлень Новапошта +- QR код з реквізитами оплати +- онлайн оплата через LiqPay або monobank +- перегляд історії Замовлень (персональний кабінет). Реєстрацію та авторизацію користувача робіть засобами Evolution CMS або через спеціалізований плагін, наприклад HybridAuth. +- підтримка багатомовності: Українська, Англійська. + +Для Менеджера: +- керування Замовленнями покупців на окремій сторінці, за замовчуванням //ваш_сайт/comba +- перегляд, редагування, зміна статусів обробки та друк Замовлення +- відправлення текстових повідомлень через пошту, смс, текст для месенджерів. + +Для Адміністратора: +- автоматичне прибирання Товару з Кошиків, якщо з товару знято Доступний для замовлення (редагування сторінки Товару в адмінці (evo)) +- для кожного товару можна задати свого Продавця +- Продавець це окрема юридична особа або ФОП зі своїми налаштуваннями. +- при оформленні Кошика автоматично сформуються декілька Замовлень якщо Товари у кошику від різних Продавців (опціонально) +- якщо Покупець зробив оплату на сайті, буде оброблено callback від платіжного сервісу, та змінено статус замовлення на "Сповіщенно про оплату" + + +## Мінімальна технічна конфігурація ## + +PHP 7.4 та вище + +Composer + +EVO CMS 1.4+ [Evolution CMS 1.4](https://github.com/evolution-cms/evolution/tree/1.4.x) +або +Evolution CMS 3.+ [Evolution CMS 3](https://github.com/evolution-cms/evolution/tree/3.2.x) + +## Важливо! ## +Використовуйте пакет [combacart-extras](https://github.com/zatomant/combacart-extras) для зручного встановлення плагіну CombaCart через модуль Extras в EVO 1.4+ та Evolution CMS 3+ [github.com](https://github.com/evolution-cms/evolution) +Extras пакет в автоматичному режимі створює шаблони, сніпети, ТВ та плагін для роботи CombaCart. +Крок 5 стадії встановлення оновлює CombaCart та його залежності до актуальної версії. + +Детальна інформація саме про CombaCart [github.com](https://github.com/zatomant/combacart) + +## Встановлення ## + +Для нового встановлення рекомендую використовувати пакет CombaCart extras, якій підготовлено як файл для модуля Extras в Evolution CMS. +Щоб дізнатись подробиці перейдіть на сторінку CombaCart extras [combacart-extras](https://github.com/zatomant/combacart-extras) + +Кроки: +1. завантажте останній реліз "CombaCart extras" з [github.com](https://github.com/zatomant/combacart-extras/archive/refs/heads/main.zip) +2. авторизуйтесь в адміністративній частині Evolution CMS ( /manager ) +3. запустіть модуль Extras, перейдіть до опції «Install by file», виберіть завантажений файл і натисніть «Install». +4. дочекайтесь закінчення процесу інсталяції extras пакету +5. відкрийте в браузері сторінку ваш_сайт/comba (або ваш_сайт/assets/plugins/combacart/update) для завершального кроку інсталяції - оновлення (composer update) залежностей + +Якщо на завершальному кроці (5) ви отримуєте помилку 504 Gateway Time-out, оновіть сторінку. +Або запустіть скрипт напряму через консоль веб серверу: +``` +cd коренева_тека_вашого_сайту_/assets/plugins/combacart/update +php process.php +``` + +Важливо! Видаліть файл 'combacart/update/lock.php', щоб дозволити виконання кроку 5 с самого спочатку. + +## Наявність composer ## + +Якщо отримали повідомлення "Composer не знайдено. Встановіть Composer перед виконанням цього оновлення.", а ви впевнені що він є, перевірте шлях до composer. + +Зазвичай, шлях до composer регулюється глобально системно, але ви можете примусово вказати повний шлях файлу composer. +Файл update/process.php строка 11 +``` +private const COMPOSER_PATH = 'composer'; +``` +наприклад так +``` +private const COMPOSER_PATH = '/usr/local/bin/composer'; +``` +або так +``` +private const COMPOSER_PATH = '/usr/bin/composer'; +``` +чи додатково ще вказати версію php +``` +private const COMPOSER_PATH = 'php8.1 /usr/bin/composer'; +``` + +## Оновлення CombaCart ## + +**Варіант 1 - Автоматично через браузер**: +відкрийте в браузері сторінку +``` +ваш_сайт/assets/plugins/combacart/update/ +``` + +**Варіант 2 - Автоматично через консоль веб сервера**: +виконайте в консолі +``` +cd _коренева_тека_вашого_сайту_/assets/plugins/combacart/update/ + +php process.php +``` +_Варіант 1 та 2 для автоматичної роботи оновлення потребує видалення файлу блокування в теці /combacart/update/_. + + +**Варіант 3 - Ручне оновлення файлів**: +- завантажте крайній реліз CombaCart [github.com](https://github.com/zatomant/combacart) та перезапишіть файли в /assets/plugins/combacart +- в теці /assets/plugins/combacart виконайте **composer update** для оновлення залежностей + +Файл composer.json містить перелік компонентів що використовується в CombaCart. +Ви можете прибрати зайві, на ваш розсуд, залежності та модифікувати шаблони за потреби. + + +## Налаштування ## + +Рекомендую задати свій "секрет" у файлі /assets/custom/Config/secret.php або у файлі .env вашого змінного середовища. +Інакше секрет сформується автоматично і його значення буде залежіть від налаштувань серверу. + +**файл /src/Config/** +* містить налаштування маркетплейсу за замовчуванням. не змінюйте в цій теці нічого. + +**тека /assets/custom/Config/** +* містить файли з вашими перевизначеними налаштуваннями згідно [Правила оновлення налаштувань](https://github.com/zatomant/combacart/docs/override_settings.md) +* наприклад, розмістить тут ваші налаштування маркетплейса та дані аутентифікації до стороніх сервисів: + - НоваПошта (*на травень 2025 р., для трекінга відправлень Новапошта можна не застосовувати API ключ*) + - LiqPay + - monobank (наразі, потребує тестування callback) + - смс провайдер AlphaSMS + - та інші + + +**файл /src/Bundle/Standalone/Server.php** +* містить клас автономного локального Comba сервера для керування Замовленнями: +1. метод marketplace() + - повертає загальні налаштування інтернет магазину + +2. метод sellers() + - повертає дані по Продавцях (публічні дані) + - Продавці крім основних параметрів містять посилання на Отримувачів оплат + +3. метод payee() + - повертає дані Отримувачів оплат + - Отримувачі оплат це юридичні особи або ФОПм з варіантами оплат які вони підтримують + +4. метод delivery() + - повертає перелік варіантів доставки + +5. метод payment() + - повертає перелік варіантів оплат + + + +## Перші кроки після закінчення інсталяції та налаштувань ## + +1. Необов'язковий пункт, але з ним легше. + На сторінці адміністрування CMS Evolution відкрийти `Конфігурація -> Дружні URL та відключить "Використовувати вкладені URL"` + Використовувати вкладені URL: Ні + +2. При інсталяції через Extras [combacart-extras](https://github.com/zatomant/combacart-extras) будуть автоматично створені необхідні елементи (інакше доведеться створити це вручну), а саме : + + * шаблон для Сторінки товару goods_tmplt + * шаблон для сторінки Оформлення замовлення checkout_tmplt + * шаблон для інших сторінок blank_tmplt + + * tv + - goods_avail ознака чи доступний товар до замовлення + - goods_code актикул товару (sku) + - goods_price ціна товару + - goods_price_old стара ціна товару + - goods_weight вага товару + - goods_isnewproduct ознака "новий товар" + - goods_isondemand ознака "товар під замовлення" + - goods_seller Продавець товару + - goods_inbalances ознака залежності товару від залишків + - goods_images містить перелік зображень, детально про [Зображення](https://github.com/zatomant/combacart/docs/images.md) + - goods_goods містить перелік видів товару (опціонально), використовує multiTV + + * сніпети: + - CombaHeader + - CombaFooter + - CombaHelper + - CombaFunctions + + * плагін CombaHelper + +3. Створіть нову сторінку (документ), задайте їй шаблон goods_tmplt. + Це буде ваш перший товар. + Код товару (артикул) має бути унікальним в контексті сторінки (документа). + Детально [Товари](https://github.com/zatomant/combacart/docs/product.md) + +4. Створіть сторінку з псевдонімом (alias) checkout та задайте їй шаблон checkout_tmplt + Це буде сторінка Оформлення замовлення. + Якщо використовуєте інший псевдонім, то перевизначить 'PAGE_CHECKOUT' + +5. Опціонально: створіть сторінку з псевдонімом (alias) tnx на яку буде перенаправлено Покупця після створення замовлення. + Якщо використовуєте інший псевдонім, то перевизначить 'PAGE_TNX' + У разі відсутності такої сторінки буде перехвачено та оброблено modx event 'OnPageNotFound' + +6. Створіть сторінку з псевдонімом (alias) cabinet, задайте шаблон blank_tmplt та вставте в вміст ресурсу ```[!CombaFunctions? &fnct=`cabinet`!]``` + Детально [Персональний кабінет покупця](https://github.com/zatomant/combacart/docs/cabinet.md) + +7. Опціонально: створіть сторінку з псевдонімом (alias) t - це буде сторінка відстеження замовлення. + Детально [Відстеження Замовлень](https://github.com/zatomant/combacart/docs/tracking.md) + +8. Опціонально: створіть сторінку з псевдонімом (alias) p - це буде сторінка з варіантами оплат замовлення. + Детально [Оплата Замовлень](https://github.com/zatomant/combacart/docs/payment.md) + + + +## Обробка замовлень ## + +Після того як Покупець сформував Замовлення (Кошик з товарами відправлено до обробки менеджерами Макретплейса), його можна подивитись на сторінці керування. +Доступ до сторінки має будь-якій користувач з ролю 'manager' що пройшов авторизацію через адміністративну сторінку EVO (http(s)://ваш_сайт/manager). +Після авторизації, відкрийте сторінку керування замовленнями за посиланням http(s)://назва_сайту/comba +На сторінці можна: +- передивлятись перелік замовлень за будь-який час +- вести пошук замовлень за номером, Замовником та його електронною поштою +- редагувати замовлення +- друкувати замовлення +- надсилати електронні листи, смс повідомлення та формувати тексти для подальшого використання в месенджерах. + +Присутня можливість зміни мови та теми інтерфейсу. + + +## Залежності та вимоги до налаштувань ## + +0. якщо отримуєте помилку Class 'IntlDateFormatter' not found + встановіть та активуйте extension php_intl + +1. **twig** (необхідно) https://twig.symfony.com/ + *наявно в composer.json + CombaCart використовує twig для шаблонів (після обробки даних парсером Modx/Evo) + +2. **boostrap, bootstrap-icon** (необхідно, опціонально) https://getbootstrap.com/ + *наявно в composer.json + верстка CombaCart заснована на Bootstrap 5 + якщо маєте наявну копію bootstrap змінить шляхи до вашого bootstrap в файлі snippetGoodsFooter.php + +3. bootbox.js (опціонально) [bootboxjs](https://github.com/bootboxjs/bootbox) + *наявно в пакеті інсталяції + для роботи з діалоговими формами bootstrap + +4. ~~phpthumb~~ + вирішив відмовитись від цього на користь більш активної, в плані оновлення, Intervention/image + +5. Intervention\Image (необхідно) [github](https://github.com/Intervention/image) + *наявно в composer.json + якщо користуєтесь іншим обробником зображень ніж phpthumb змінить клас ModxImage під свої потреби. + +6. multiTV (опціонально) [multiTV](https://github.com/extras-evolution/multiTV) + *встановлюється з extras + - використовується для списків зображень в TV goods_images. замість списків можете використовувати TV goods_images як "строка" для одного зображення + - використовується для списків підвидів товару в TV goods_goods + + Щоб виправити помилку з розташуванням вікна редагування властивостей зображення після встановлення multiTV + замініть у файлі assets/tvs/multitv/css/colorbox.css + рядок 5 + ```#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z1-index:9999; overflow:hidden;}``` + на цей + ```#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; overflow:hidden;}``` + +7. cropper.js (опціонально, компонент з multiTV) + *наявно в пакеті інсталяції CombaCart extras + Опис по налаштуванню cropper [multiTV](https://github.com/extras-evolution/multiTV) + використовується разом з multiTV для списків зображень + +8. venobox (опціонально) [VenoBox](https://github.com/nicolafranchini/VenoBox) + *наявно в пакеті інсталяції + використовується для роботи з діалоговими формами зображень + +9. reCaptcha (опціонально) + внесіть свої ключі для провайдера 'reCaptcha' у файл перевизначень /assets/custom/Config/provider.php якщо бажаете використовати капчу при перевірці оформлення замовлення + + +## Інше ## + +За замовчуванням, для підтримки багатомовності на сайті та в панелі керування замовленнями, використовується вбудований "перекладач". +Детально про [Багатомовність в шаблонах](https://github.com/zatomant/combacart/docs/template.md) diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/01_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/01_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..47e94af7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/01_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,115 @@ +## Налаштування плагіна ## + +Установки Commerce розташовані в розділі "Конфігурація" плагіна Commerce. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Назва параметраЗначення за замовчуваннямОпис
    Page ID for redirect after successfull payment[(site_start)]Ідентифікатор сторінки для перенаправлення після успішної оплати
    Page ID for redirect after payment error[(site_start)]Ідентифікатор сторінки для перенаправлення після помилки оплати
    Cart page IDІдентифікатор сторінки з кошиком
    Order page ID Ідентифікатор статусу із формою замовлення
    Status ID after payment3 (Оплачено)Ідентифікатор статусу після оплати
    Product templates IDsІдентифікатори шаблонів товарів
    Product title field namepagetitleІм'я поля, в якому міститься назва товару
    Product price field namepriceІм'я tv-параметра, в якому міститься ціна товару
    Chunk name for status change notificationlang/%LANG%/status_notification.tplІм'я чанка для повідомлення покупця про зміну статусу замовлення
    Chunk name for order paid notificationlang/%LANG%/order_paid.tplІм'я чанка для сповіщення покупця про оплату замовлення
    Chunk name for order changed notificationlang/%LANG%/order_changed.tplІм'я чанка для повідомлення покупця про зміну замовлення
    Email notifications recipient[(emailsender)]Email для надсилання повідомлень про замовлення
    Default payment code-Код оплати за промовчанням
    Default delivery code-Код доставки за промовчанням
    Redirect to payment after order processInstantПорядок перенаправлення на оплату після оформлення замовлення. Instant - негайно, Show prepare text - показати текст з посиланням на оплату
    Chunk name for redirect prepare textlang/%LANG%/redirect_to_payment.tplІм'я чанка, шаблон повідомлення, що показується покупцеві після оформлення замовлення перед перенаправленням на оплату
    Waiting time for order payment, days3Кількість днів для оплати замовлення
    + +Плагін Commerce повинен викликатись першим на подіях OnWebPageInit, OnPageNotFound, OnManagerPageInit. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/02_\320\232\320\276\321\210\320\270\320\272_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\321\214.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/02_\320\232\320\276\321\210\320\270\320\272_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\321\214.md" new file mode 100644 index 00000000..2c9a8064 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/02_\320\232\320\276\321\210\320\270\320\272_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\321\214.md" @@ -0,0 +1,99 @@ +Кошик викликається на всіх сторінках, де необхідна робота магазину - додавання, редагування та видалення товарів. + +**Порада:** кошик - це обгортка для сніппета DocLister і в ньому працюють практично всі його параметри. + +**Як це може стати в нагоді?** +Скажімо, ви хочете показувати в кошику фотографію товару. Нехай вона зберігається у ТБ з ім'ям `mainphoto`. Як і в DocLister, вам необхідно за допомогою параметра `&tvList=mainphoto` вказати сніппету, що у вибірку включається ТВ. + +## Приклад виклику ## + +```` +[!Cart + &instance=`products` + &tvList=`image` +!] +```` +## Параметри ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОпис
    instance +

    Тип кошика.

    +

    За допомогою сніпету можна вивести кошик із товарами, або списки обраного чи порівняння. Відповідно, значення може бути products, wishlist або comparison. Значення за промовчанням - products

    +

    Це значення встановлено. Якщо потрібні інші списки, їх можна створити в плагіні на подію OnInitializeCommerce:

    +
    ci()->carts->addCart(new \Commerce\Carts\ProductsList($modx, 'listname')));
    +
    theme +

    Префікс імені шаблонів.

    +

    За промовчанням пусте значення. Можна використовувати темизацію кошика, щоб не вказувати всі шаблони окремо. Може бути префіксом імен файлів, або ім'ям вкладеної папки (тоді в кінці потрібно вказати слеш).

    +

    Спочатку доступні шаблони без префіксу та з префіксом "mini", наприклад minicart_wrap та ін. - для мінікошика.

    tpl

    Шаблон рядка кошика, що відповідає такому ж параметру DocLister

    Окрім стандартних, у шаблоні доступні наступні плейсхолдери:
    [+original_title+] - назва товару з таблиці site_content,
    [+hash+] - хеш-код рядка,
    [+count+] - кількість даного товару,
    [+price+ ] - ціна товару,
    [+total+] - повна вартість цього товару,
    [+options+] - опції товару (оброблені чи ні) , залежить від параметра defaultOptionsRender).

    ownerTPL

    Шаблон обгортки кошика, відповідає такому ж параметру DocLister

    Крім стандартних, у шаблоні доступні такі плейсхолдери:
    [+hash+] - хеш-код козини ,
    [+items_price+] - сумарна вартість товарів,
    [+total+] - повна вартість кошика, з урахуванням додаткових зборів,
    [+subtotals+] - додаткові збори,
    [+count+] - кількість товарів у кошику,
    [+rows_count+] - кількість рядків у кошику,
    [+settings+] - масив налаштувань плагіна Commerce.

    noneTPL

    Шаблон порожнього кошика.

    optionsTpl

    Шаблон рядка опцій товару. Має сенс лише за &defaultOptionsRender=`1`. Мається на увазі, що опції товару задані як масив пар ключ => значення.

    У шаблоні доступні такі значення:
    [+key+] - ключ,
    [+option+] - значення опції.

    defaultOptionsRender

    Чи потрібно рендерувати опції товару. Приймає значення 0 або 1, за замовчуванням - 1.

    Якщо структура опцій має складніший формат, можна поставити значення 0, а опції обробляти в prepare.

    subtotalsTpl

    Шаблон обгортки для додаткових зборів.

    subtotalsRowTpl

    Шаблон рядка додаткових зборів.

    Доступні такі плейсхолдери:
    [+title+] - назва,
    [+price+]< /code> - ціна.

    prepareSubtotalsWrap

    prepare для обгортки додаткових зборів, дія аналогічна параметру prepareWrap

    prepareSubtotalsRow

    prepare для рядків додаткових зборів, дія аналогічна параметру prepare

    + +Інші параметри абсолютно аналогічні таким у сніпеті DocLister. + +## Шаблони ## +Усі шаблони за замовчуванням лежать у папці `assets/plugins/commerce/templates/front/`. Щоб змінити вигляд кошика, можна вказати свої чанки за допомогою параметрів сніпета, або скопіювати всі чанки кошика в нову папку та вказати ім'я папки у параметрі `theme`. + +Не змінюйте чанки за замовчуванням безпосередньо - так при оновленні ви втратите всі зміни. + +### Схема шаблону кошика ### + +У розмітці кошика мають бути обов'язкові атрибути, необхідні коректної роботи скриптів. + +```` +<... data-commerce-cart="[+hash+]"> +<... data-id="[+id+]" data-commerce-row="[+row+]" ...> + +<... data-commerce-action="decrease" .../> +<... data-commerce-action="increase" .../> +<... data-commerce-action="remove" .../> + + +<... data-commerce-action="clean" .../> + +```` + + + + + + + + + + +
    data-commerce-cart="[+hash+]"Атрибут обгортки кошика, весь вміст даного тега оновлюється при зміні в кошику
    data-id="[+id+]"Ідентифікатор товару, присвоюється рядку кошика
    data-commerce-row="[+row+]"Хеш-код рядка кошика, використовується для оновлення даних у цьому рядку
    data-commerce-action="recount"Поле з кількістю товару
    data-commerce-action="decrease"Елемент, за натисканням на який відбувається зменшення товару в рядку на 1
    data-commerce-action="increase"Елемент, після натискання на який відбувається збільшення товару в рядку на 1
    data-commerce-action="remove"Елемент, за натисканням на який відбувається видалення рядка з кошика
    data-commerce-action="clean"Елемент, після натискання на який відбувається очищення кошика
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/03_\320\240\320\276\320\267\320\274\321\226\321\202\320\272\320\260_\321\202\320\276\320\262\320\260\321\200\321\203.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/03_\320\240\320\276\320\267\320\274\321\226\321\202\320\272\320\260_\321\202\320\276\320\262\320\260\321\200\321\203.md" new file mode 100644 index 00000000..607f1347 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/03_\320\240\320\276\320\267\320\274\321\226\321\202\320\272\320\260_\321\202\320\276\320\262\320\260\321\200\321\203.md" @@ -0,0 +1,36 @@ +# Розмітка товару # + +Кожен товар повинен містити у верстці форму, а в ній певні атрибути та поля, виходячи з яких Commerce додаватиме цей товар у кошик. + + +### Приклад простої форми ### +```` +
    + + +
    +```` +### Приклад форми з додатковими опціями для товару ### +```` +
    + + + + + + + +
    +```` +Також можна додати або видалити товар за допомогою гіперпосилань, що містять у `data-атрибутах` id або row потрібного товару. (У випадку з row це відбуватиметься лише у кошику) + + +```` +Додати до кошика + +Додати до обраного + +Видалити товар за хешем + +Видалити товар за ID +```` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/04_\320\237\320\273\320\260\321\202\320\265\320\266\320\275\321\213\320\265_\320\277\320\273\320\260\320\263\320\270\320\275\321\213.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/04_\320\237\320\273\320\260\321\202\320\265\320\266\320\275\321\213\320\265_\320\277\320\273\320\260\320\263\320\270\320\275\321\213.md" new file mode 100644 index 00000000..6116cbd2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/04_\320\237\320\273\320\260\321\202\320\265\320\266\320\275\321\213\320\265_\320\277\320\273\320\260\320\263\320\270\320\275\321\213.md" @@ -0,0 +1,41 @@ +# Настройка платежных плагинов + +Принцип работы всех платежных плагинов примерно одинаков: + +1. Формирование ссылки/формы для оплаты; +2. Перенаправление покупателя на страницу оплаты; +3. Обработка уведомления от платежной системы о статусе платежа. + +Чтобы платежный плагин заработал, нужно выполнить несколько шагов: + +1. Задать в настройках платежного плагина данные для доступа к API, обычно это идентификатор магазина и секретный ключ, или токен - варианты могут быть разные. Все данные берутся из личного кабинета платежной системы; +2. Задать в настройках платежной системы адреса для уведомлений и перенаправления после оплаты; +4. Задать настройки плагина Commerce: "Page ID for redirect after successfull payment" и "Page ID for redirect after payment error" - идентификаторы страниц, на которые будет происходить переход после успешной оплаты и после ошибки/отмены платежа соответственно. + +Адреса для уведомлений и перенаправлений выглядят следующим образом: + + + + + + + + + + + + + + + + + + + + + +
    НазначениеТип запросаАдрес
    Уведомление магазина о статусе платежеPOSThttps://<ваш домен>/commerce/<payment_code>/payment-process
    Перенаправление после успешной оплатыPOSThttps://<ваш домен>/commerce/<payment_code>/payment-success
    Перенаправление после ошибки/отмены платежаPOSThttps://<ваш домен>/commerce/<payment_code>/payment-failed
    + +<payment_code> здесь - это символьный идентификатор платежного плагина, обычно представляет собой название платежной системы слитно с маленькой буквы, может быть также указан в документации к плагину. Например, для Paymaster payment_code будет равен paymaster. + +Стоит отметить, что эти адреса нужно указывать даже если вы создали отдельные страницы для показа после успешной оплаты и после отмены платежа. Это необходимо для правильной работы платежного плагина, а покупателю в итоге все равно покажутся заданные вами страницы. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/05_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/05_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..add75400 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/05_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,42 @@ +## Оформлення замовлення ## + +### Приклад ### +``` +[!Order + &formTpl=`formTpl` + &deliveryTpl=`deliveryTpl` + &deliveryRowTpl=`deliveryRowTpl` + &paymentsTpl=`paymentsTpl` + &paymentsRowTpl=`paymentsRowTpl` + &reportTpl=`reportTpl` + &ccSenderTpl=`ccSenderTpl` +!] +``` + +Більше прикладів ви можете знайти в папці: +``` +assets/plugins/commerce/templates/ +``` + +За замовчуванням шаблон форми замовлення містить всього 3 поля - ім'я, телефон та email. Додати відсутні, наприклад, регіон, місто, адреса доставки, повідомлення можна точно також, як і при використанні сниппета FormLister. + +Необхідно вказати ці поля в шаблоні форми (параметр `&formTpl`) і додати їх валідацію в параметр `&rules`. + +Дані будуть записані в масив замовлення. Для їх відображення в модулі вже необхідно написати плагін. + +## Плагін для відображення доп. полів замовлення ## +Нехай ми додали в форму `input` з `name=address`. +Створимо плагін на подію `OnManagerBeforeOrderRender`. + +### Приклад ### +``` +$params['groups']['contact']['fields']['address'] = + [ + 'title' => 'Адрес', + 'content' => function($data) { + return $data['fields']['address']; + }, + 'sort' => 40, + ]; + ``` +Зверніть увагу, що значення ключа `$params['groups']['contact']['fields']['address']` збігається з ім'ям поля з `formTpl`. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/07_\320\234\320\276\320\264\321\203\320\273\321\214_\320\234\320\260\320\263\320\260\320\267\320\270\320\275.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/07_\320\234\320\276\320\264\321\203\320\273\321\214_\320\234\320\260\320\263\320\260\320\267\320\270\320\275.md" new file mode 100644 index 00000000..a620f9a8 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/07_\320\234\320\276\320\264\321\203\320\273\321\214_\320\234\320\260\320\263\320\260\320\267\320\270\320\275.md" @@ -0,0 +1,23 @@ +# Модуль Магазин # + +Необхідний для відображення замовлень, що надійшли в адмін-панелі Evolution CMS. + + +Для того, щоб в панелі модуля "Магазин" відобразити значення відправленого сніпетів Order поля, необхідно створити плагін. + +## Приклад ## +Нехай ми додали в форму `input` з `name=address`. Покупець ввів в нього значення адреси, і ми хочемо побачити це значення в модулі "Магазин". + +Подія `OnManagerBeforeOrderRender` +### Код ### +``` +$params['groups']['contact']['fields']['address'] = + [ + 'title' => 'Адрес', + 'content' => function($data) { + return $data['fields']['address']; + }, + 'sort' => 40, + ]; + ``` + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/10_\320\241\320\265\321\200\320\262\320\265\321\200\320\275\321\226_\320\277\320\276\320\264\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/10_\320\241\320\265\321\200\320\262\320\265\321\200\320\275\321\226_\320\277\320\276\320\264\321\226\321\227.md" new file mode 100644 index 00000000..346aa9ee --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/10_\320\241\320\265\321\200\320\262\320\265\321\200\320\275\321\226_\320\277\320\276\320\264\321\226\321\227.md" @@ -0,0 +1,813 @@ +# Серверні події + +Commerce встановлює на сайт додаткові події, які можна перехоплювати за допомогою плагінів і тим самим додавати свою логіку в процеси магазину. + +В основному в подіях використовується передача параметрів по посиланню, тобто щоб змінити щось, не потрібно повертати результат - досить змінити значення параметра. Невеликий приклад: + +```php +switch ($modx->event->name) { + case 'OnBeforeCartItemAdding': { + $params['item']['price'] += 100; + break; + } +} +``` + +Тут видно два важливих моменти: +* Використовується саме `$modx->event->name` замість сформованої практики збереження посилання на `$modx->Event`, так як Commerce активно використовує вкладені події (http://modx.im/blog/docs/5933.html). +* Змінюється саме елемент масиву `$params`, а не змінна `$item`, так як посилання є тільки в масиві. + +## Опис подій + +#### OnInitializeCommerce + +Старт ініціалізації основного плагіна. Параметрів немає. + +Може використовуватися для реєстрації клієнтських скриптів, які залежать від Commerce, для реєстрації додаткових корзин, сховищ, додавання елементів в контейнер залежностей та ін. + +```php +switch ($modx->event->name) { + case 'OnInitializeCommerce': { + ci()->set('myCustomClass', function($ci) use ($params) { + require_once MODX_BASE_PATH . 'path/to/CustomClass.php'; + return new CustomClass($params); + }); + + $modx->regClientScript('path/to/custom-commerce-script.js'); + break; + } +} +``` + +#### OnInitializeOrderProcessor + +Викликається в момент отримання обробника замовлень. Можна зареєструвати свій обробник. Параметрів немає. + +```php +class CustomOrdersProcessor implements \Commerce\Interfaces\Processor { + ... +} + +switch ($modx->event->name) { + case 'OnInitializeOrderProcessor': { + $processor = new CustomOrdersProcessor($modx); + $modx->commerce->setProcessor($processor); + break; + } +} +``` + +#### OnCollectSubtotals + +Вызывается в разные моменты работы пакета для получения массива дополнительных сборов заказа. Сюда можно включить, например, выбранный покупателем способ доставки и ее стоимость, размер скидки или комиссии. + +Параметри: + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    rowsТак +Масив рядків, кожен рядок являє собою масив з ключами title і price - назва і ціна відповідно. +
    totalДаПідсумкова вартість замовлення
    realonlyНіПриймає значенняtrue, +якщо збираються тільки елементи, які реально змінюють вартість замовлення. Це має сенс, щоб не зберігати із замовленням суто інформативні елементи.
    + +```php +switch ($modx->event->name) { + case 'OnCollectSubtotals': { + $params['total'] += 100; + $params['rows']['fee'] = [ + 'title' => 'Комісія магазину', + 'price' => 100, + ]; + break; + } +} +``` +Щоб виводити додатковий збір тільки після переходу покупця до оформлення замовлення, можна використовувати метод обробника замовлень `isOrderStarted()`: +```php +if ($modx->commerce->loadProcessor()->isOrderStarted()) { + // додаємо вартість доставки +} +``` +Якщо висновок також залежить від обраного способу доставки або оплати, можна використовувати методи обробника `getCurrentDelivery()` і `getCurrentPayment()`: +```php +$processor = $modx->commerce->loadProcessor(); +if ($processor->getCurrentDelivery() == 'mydelivery' && $processor->getCurrentPayment() == 'mypayment') { + // додаємо вартість доставки +} +``` + + +#### OnRegisterDelivery + +Збір всіх доступних покупцеві способів доставки замовлення. + +Параметри: + + + +
    Ім'я параметраПередається по посиланнюОпис
    rowsТак +

    Масив рядків<псевдонім> => <параметри>, де <псевдонім> це символьний ідентифікатор способу доставки, а <параметри> - це масив масив з наступними ключами:

    + + + + +
    titleназва способу доставки
    priceціна
    markupдодатковий html-код
    +
    + +```php +switch ($modx->event->name) { + case 'OnRegisterDelivery': { + $params['rows']['mydelivery'] = [ + 'title' => 'Доставка', + 'price' => 100, + ]; + break; + } +} +``` + +#### OnRegisterPayments + +Збір всіх доступних покупцеві способів оплати. Параметрів немає. + +```php +class CustomPayment implements \Commerce\Interfaces\Payment { + ... +} + +switch ($modx->event->name) { + case 'OnRegisterPayments': { + $class = new CustomPayment($modx, $params); + $modx->commerce->registerPayment('mypayment', 'Мій спосіб платежу', $class); + break; + } +} +``` + +Часто буває так, що способи оплати замовлення залежать від обраного способу доставки. У такому випадку можна використовувати метод обробника замовлення `getCurrentDelivery()` для організації умов: +```php +if ($modx->isBackend() || $modx->commerce->loadProcessor()->getCurrentDelivery() == 'mydelivery') { + // реєструємо оброблювач платежу +} +``` + +Важливо також зауважити, що в цьому прикладі використовується перевірка `$modx->isBackend()`,щоб призначені для користувача умови не впливали на доступність методу оплати при редагуванні і перегляді замовлень в панелі адміністрування. + +#### OnBeforeOrderAddonsRender + +Викликається перед виведенням способів доставки і оплати, після їх реєстрації. Можна змінити обраний спосіб, змінити їх склад. Зручно, коли доставка залежить від оплати, або навпаки. + +Через те, що кошики виводяться окремо від форми замовлення, і зазвичай раніше її, зміна способів доставки ніяк не вплине на додаткові збори, встановлені даними способами доставки і на загальну суму замовлення. + +Параметри: + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    paymentsТакМасив способів оплати
    deliveryТакМасив способів доставки
    current_paymentТакОбраний спосіб оплати
    current_deliveryТакОбраний спосіб доставки
    + +```php +switch ($modx->event->name) { + case 'OnBeforeOrderAddonsRender': { + if (isset($params['delivery']['pickup'])) { + // додаємо пояснення для самовивозу + $params['delivery']['pickup']['markup'] .= '

    Дочекайтеся дзвінка оператора для узгодження часу самовивозу!

    '; + } + + if (isset($params['payments']['cash']) && $params['current_delivery'] != 'pickup') { + // якщо доставка - не самовивезення, прибираємо спосіб оплати готівкою + unset($params['payments']['cash']); + } + + break; + } +} +``` + +#### OnCommerceAjaxResponse + +Викликається перед відправкою відповіді сервера при ajax-запиті, наприклад при додаванні в кошик або оновленні кошиків. Дозволяє модифікувати відповідь. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    responseТакМасив елементів, з яких складається відповідь сервера.
    Ключ status є в будь-якому випадку, він може приймати значення success або failed і означає, успішний запит чи ні. Інші елементи в різних запитах розрізняються.
    + +```php +switch ($modx->event->name) { + case 'OnCommerceAjaxResponse': { + $url = trim($_GET['q'], '/'); + if ($url == 'commerce/action' && $_POST['action'] == 'cart/add') { + $params['response']['myparam'] = 'myresponse'; + } + break; + } +} +``` + +#### OnBeforeCartItemAdding + +Викликається перед додаванням товару в кошик. Дозволяє скасувати дію, або модифікувати атрибути додається товару. + +Параметри: + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    instanceНіТип кошика
    preventТак Прапор скасування дії. Якщо переключити в true, товар не буде додано.
    itemТак

    Масив з атрибутами товару, що додається. Елементи наступні:

    + + + + + + + +
    idІдентифікатор товару
    nameНазва
    countКількість
    priceЦіна однієї одиниці товару
    optionsМасив додаткових опцій
    metaМасив додаткових даних
    +
    + +```php +switch ($modx->event->name) { + case 'OnBeforeCartItemAdding': { + if ($params['item']['price'] < 100) { + $params['prevent'] = true; + $modx->event->stopPropagation(); + } + break; + } +} +``` + +#### OnBeforeCartItemUpdating + +Викликається перед зміною товару в кошику. Дозволяє модифікувати змінювані атрибути. + +Параметри: + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    instanceНіТип кошика
    rowТакІдентифікатор змінного рядка кошика
    itemТак

    Масив з уже зміненими атрибутами товару

    wasaddedНіПрапор, який означає, що першою дією було додавання товару
    preventТакПрапор скасування дії. Якщо переключити в true, товар не буде змінений
    + +#### OnCartChanged + + +Викликається після будь-якої зміни кошика. + +Параметри: + + + +
    Ім'я параметраПередається по посиланнюОпис
    instanceНіТип кошика
    + +```php +switch ($modx->event->name) { + case 'OnCartChanged': { + if ($params['instance'] == 'products') { + $cart = ci()->carts->getCart($params['instance']); + + if ($cart) { + $items = $cart->getItems(); + + if (count($items)) { + // для прикладу збільшимо кількість товару в першому рядку + $row = key($items); + $items[$row]['count'] += 1; + $cart->setItems($items); + } + } + } + break; + } +} +``` + +#### OnOrderRawDataChanged + +Викликається при зміні даних в процесі оформлення замовлення. + +Параметри: + + + +
    Ім'я параметраПередається по посиланнюОпис
    dataНіДані замовлення
    + +#### OnBeforeOrderProcessing + +Викликається після валідації даних замовлення, до створення самого замовлення. Дозволяє модифікувати як дані покупця, так і склад кошика замовлення. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    FLТакFormLister
    itemsТакМасив з товарами кошика
    + +```php +switch ($modx->event->name) { + case 'OnBeforeOrderProcessing': { + $FL->setField('name', 'Вася'); + break; + } +} +``` + +#### OnBeforePaymentProcess + +Викликається перед створенням платежу - після створення замовлення (якщо був обраний будь-який спосіб платежу), або при оплаті раніше створеного замовлення по спеціальному посиланню. + +Параметри: + + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderТакМасив із даними замовлення
    paymentНіМасив з описом і класом обробника платежу
    FLТакFormLister. Присутній тільки в процесі оформлення замовлення
    instant_redirectТакЯкщо 1 - покупець відразу буде перенаправлений в платіжну систему, 0 - буде показаний шаблон redirect_template
    redirect_textТакТекст повідомлення про перенаправлення на оплату. Присутній тільки в процесі оформлення замовлення
    redirect_templateТакШаблон тексту повідомлення про оформлення замовлення і перенаправлення на оплату
    + +```php +switch ($modx->event->name) { + case 'OnBeforePaymentProcess': { + if (isset($FL) && $order['fields']['payment_method'] == 'mypayment') { + $params['redirect_text'] = 'Перенаправлення!'; + } + break; + } +} +``` + +#### OnBeforePaymentCreate + +Викликається при створенні і збереженні платежу, дозволяє змінити суму. + +Параметри: + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    order_idНіІдентифікатор замовлення, який оплачується
    order_amountНіВартість замовлення
    amountТакСума платежу, за вирахуванням суми сплачених раніше траншей
    hashТакХеш платежу, для формування посилань
    + +```php +switch ($modx->event->name) { + case 'OnBeforePaymentCreate': { + // отримуємо дані форми замовлення + $data = ci()->commerce->loadProcessor()->getRawData(); + + // якщо включена передоплата, зменшуємо суму вполовину + if (!empty($data['partial'])) { + $params['amount'] = $params['amount'] * 0.5; + } + + break; + } +} +``` + +#### OnBeforeOrderSaving + +Викликається перед самим збереженням замовлення в базу даних, коли всі дані зібрані, при створенні, або оновленні замовлення. Дозволяє повністю змінити замовлення. Скасувати збереження не можна. + +Параметри: + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    order_idНіІдентифікатор замовлення, null якщо замовлення нове
    valuesТакЗначення полів для збереження в таблицю commerce_orders
    itemsТакМасив товарів, підготовлений для збереження в таблицю commerce_order_products
    subtotalsТакМасив доп. зборів, зберігається також в commerce_order_products в полегшеній формі
    + +#### OnBeforeOrderSending + +Викликається після збереження замовлення, перед відправкою повідомлення менеджеру. + +Параметри: + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    FLТакFormLister
    orderТакДані замовлення
    cartТакДані збереженого кошика
    + +#### OnOrderSaved + +Викликається після збереження замовлення в базу даних. + +Параметри: + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    order_idНіІдентифікатор замовлення
    valuesТакЗначення полів з таблиці commerce_orders
    itemsТакМасив товарів з таблиці commerce_order_products
    subtotalsТакМасив дод.зборів із таблиці commerce_order_products
    + +#### OnOrderProcessed + +Викликається після закінчення обробки замовлення. + +Параметри: + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    FLТакFormLister
    orderНіДані замовлення
    cartНіДані збереженого кошика
    + +#### OnBeforeCurrencyChange + +Викликається перед зміною поточної валюти. Дозволяє підмінити нову валюту на іншу. +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    oldНіСимвольний ідентифікатор поточної валюти
    newТакСимвольний ідентифікатор встановленої валюти
    + +#### OnOrderPlaceholdersPopulated + +Викликається після призначення плейсхолдерів з даними замовлення на сторінці переадресації після успішного оформлення замовлення або здійснення оплати. + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderНіДані замовлення
    + +#### OnBeforeOrderHistoryUpdate + +Викликається перед додаванням історії замовлення. Дозволяє змінити статус і коментар, або скасувати додавання або повідомлення покупця. + + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    order_idНіідентифікатор замовлення
    status_idТакІдентифікатор призначеного статусу замовлення
    commentТакКоментар
    notifyТакЧи потрібно повідомляти покупця про зміну статусу, true або false
    preventТакСкасувати зміни історії, true або false
    + +```php +switch ($modx->event->name) { + case 'OnBeforeOrderHistoryUpdate': { + if ($status_id == 4) { + $params['prevent'] = true; + $modx->event->stopPropagation(); + } + + if ($status_id == 10) { + $params['comment'] = 'Мій коментар'; + } + } +} +``` + +#### OnBeforeCustomerNotifySending + +Викликається перед повідомленням покупця при зміні історії замовлення або зміні даних замовлення. Дозволяє змінити повідомлення або скасувати відправку. + + + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    reasonНіТип події:
    order_changed - додавання історії замовлення
    status_changed - зміна даних замовлення
    orderТакДані замовлення
    subjectТакШаблон теми листа-повідомлення
    bodyТакШаблон тексту листа-повідомлення
    dataТакДані, які будуть використовуватися при парсінгу шаблонів листа
    preventТакСкасувати відправку повідомлення, true або false
    + +## Події панелі адміністратора + +Ці події викликаються при роботі менеджера з замовленнями в панелі адміністрування магазином. + +#### OnManagerBeforeOrdersListRender + +Викликається перед виведенням списку замовлень. Дозволяє модифікувати висновок. + + + + + + +
    Ім'я параметраПередається по повідомленнюОпис
    configТакКонфігурація DocLister. Висновок формується його контролером onetable
    columnsТакКонфігурація колонок - массив пар ідентифікатор колонки => параметри колонки
    filtersТакКонфігурація фільтрів
    + +Параметри конфігурації DocLister за замовчуванням: +```php +[ + 'orderBy' => 'created_at DESC', + 'display' => 10, + 'paginate' => 'pages', + 'TplWrapPaginate' => '@CODE:
      [+wrap+]
    ', + 'TplCurrentPage' => '@CODE:
  • [+num+]
  • ', + 'TplPage' => '@CODE:
  • [+num+]
  • ', + 'TplNextP' => '@CODE:', + 'TplPrevP' => '@CODE:', +]; +``` + +У параметрах колонок можна використовувати такі параметри: + + + + + + +
    Ім'я параметраОпис
    titleТема колонки
    contentВміст. Може бути рядком - ім'ям поля з замовлення, або анонімної функцією з наступними параметрами:
    $data - дані замовлення
    $DL - посилання на об'єкт $_DocLister
    $eDL - посилання на об'єкт $_extDocLister
    sortІндекс для сортування
    styleCss-стиль колонки, додається до кожної клітинки
    + +Конфігурація колонок за замовчуванням: +```php +[ + 'id' => [ + 'title' => '#', + 'content' => 'id', + 'sort' => 0, + 'style' => 'width: 1%; text-align: center;', + ], + ... + 'name' => [ + 'title' => $lang['order.name_field'], + 'content' => 'name', + 'sort' => 20, + ], + ... + 'email' => [ + 'title' => $lang['order.email_field'], + 'content' => function($data, $DL, $eDL) { + if (!empty($data['email']) && filter_var($data['email'], FILTER_VALIDATE_EMAIL)) { + return '' . $data['email'] . ''; + } + return ''; + }, + 'sort' => 40, + 'style' => 'white-space: nowrap;', + ], + ... +]; +``` + +Приклад: +```php +switch ($modx->event->name) { + case 'OnManagerBeforeOrdersListRender': { + $params['config']['display'] = 50; + + $params['columns']['lastname'] = [ + 'title' => 'Прізвище', + 'content' => function($data, $DL, $eDL) { + if (!empty($data['fields']['lastname'])) { + return htmlentities($data['fields']['lastname']); + } + return ''; + }, + 'sort' => 23, + ]; + } +} +``` + +#### OnManagerOrdersListRender + +Це стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки зі списком замовлень. Для установки значення потрібно використовувати метод `$modx->event->setOutput()`. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    ordersНіМасив замовлень для виведення
    + +#### OnManagerBeforeOrderRender + +Викликається перед виведенням детальної інформації про замовлення + +Параметри: + + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderТакДані замовлення
    groupsТакКонфігурація груп з інформацією про замовлення
    configТакКонфігурація DocLister для виведення товарів з замовлення
    columnsТакКонфігурація колонок для виведення товарів замовлення
    subcolumnsТакКонфігурація колонок для виведення додаткових зборів
    + +Приклад: +```php +switch ($modx->Event->name) { + case 'OnManagerBeforeOrderRender': { + $params['groups']['order_info']['fields']['msg'] = [ + 'title' => 'Коментар', + 'content' => function($data) { + return !empty($data['fields']['msg']) ? htmlentities($data['fields']['msg']) : ''; + }, + 'sort' => 40, + ]; + unset($params['columns']['options']); + break; + } +} +``` + +#### OnManagerOrderRender + + +Це стандартне подія Modx, розраховане на отримання рядка, яка буде виведена в кінці сторінки детального перегляду замовлення. Для установки значення потрібно використовувати метод `$modx->event->setOutput()`. + +Параметри: + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderНіМасив з даними замовлення
    productsНіМасив з товарами замовлення
    subtotalsНіМасив з дод.зборами замовлення
    + +#### OnManagerBeforeOrderEditRender + +Викликається перед виведенням сторінки редагування замовлення. + +Параметри: + + + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderТакДані замовлення
    fieldsТакКонфігурація полів замовлення
    configТакКонфігурація DocLister для виведення товарів з замовлення
    columnsТакКонфігурація колонок для виведення полів редагування товарів замовлення
    subcolumnsТакКонфігурація колонок для виведення полів редагування додаткових зборів
    + +#### OnManagerOrderRender + +Ця стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки редагування замовлення. Для установки значення потрібно використовувати метод `$modx->event->setOutput()`. + +Параметри: + + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderНіМасив з даними замовлення
    productsНіМасив товарів замовлення
    subtotalsНіМасив дод.зборів замовлення
    + +#### OnManagerBeforeOrderValidating + +Викликається при збереженні відредагованого замовлення перед валідацією нових значень. + +Параметри: + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    orderНіОригінальні дані замовлення
    dataТакМасив з новими даними і правилами їх перевірки. Для перевірки правил використовується валідатор з комплекту FormLister.
    + +Структура масиву з новими даними: + +```php +[ + 'order' => [ + 'data' => [ + // дані замовлення + 'name' => 'Вася', + 'email' => 'test@test.test', + ... + ], + 'rules' => [ + // правила перевірки, наприклад: + '!name' => [ + 'lengthBetween' => [ + 'params' => [2, 255], + 'message' => $lang['module.error.name_length'], + ], + ], + 'email' => [ + 'email' => $lang['module.error.email_incorrect'], + ], + ... + ], + ], + 'cart' => [ + 'data' => [ + // дані кошика замовлення + ], + 'rules' => [ + // правила перевірки + ], + ], + 'subtotals' => [ + 'data' => [ + // дані додаткових зборів замовлення + ], + 'rules' => [ + // правила перевірки + ], + ], +]; +``` + +#### OnManagerOrderValidated + +Викликається після перевірки даних замовлення, незалежно від того, пройдена перевірка чи ні. + +Параметри: + + + + + + +
    Имя параметраПередается по ссылкеОпис
    orderНіДані замовлення
    dataТакДані з події OnManagerBeforeOrderValidating
    errorsТакМасив з помилками.Якщо масив порожній - валідація пройде успішно, якщо немає - редагування замовлення буде скасовано, а помилки будуть виведені на екран
    + +#### OnManagerStatusesListRender + +Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы со списком статусов заказов. Для установки значения нужно использовать метод `$modx->event->setOutput()`. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОписание
    listНіМасив зі статусами замовлень
    + +#### OnManagerStatusRender + +Це стандартна подія Modx, розрахована на оримання рядка, яка буде виведена в кінці сторінки редагування статусу замовлень. Для установки значення потрібно використовувати метод `$modx->event->setOutput()`. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    statusНіМасив з даними статусу замовлень
    + +#### OnManagerCurrencyListRender + +Це стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки зі списком валют. Для установки значення потрібно використовувати метод `$modx->event->setOutput()`. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    listНіМасив зі списком валют
    + +#### OnManagerCurrencyRender + +Це стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки редагування валюти. Для установки значення потрібно використовувати метод `$modx->event->setOutput()`. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    statusНіМасив з даними валюти
    + +#### OnManagerBeforeDefaultCurrencyChange + +Викликається при збереженні валюти, в разі, якщо редагована валюта призначається валютою за умовчанням. + +Параметри: + + + + + +
    Ім'я параметраПередається по посиланнюОпис
    oldНіДані валюти, яка була встановлена за замовчуванням першою
    newТакДані валюти, що призначається за умовчанням
    + +#### OnManagerRegisterCommerceController + +Викликається перед обробкой шляху при роботі в модулі в панелі адміністрування. Дає можливість зареєструвати свій контролер. + +Параметри: + + + + +
    Ім'я параметраПередається по посиланнюОпис
    moduleТакПосилання на класс-менеджер модуля \Commerce\Module\Manager
    + +```php +class MyController extends \Commerce\Module\Controllers\Controller implements \Commerce\Module\Interfaces\Controller +{ + ... +} + +switch ($modx->Event->name) { + case 'OnManagerRegisterCommerceController': { + $module->registerController('customroute', new MyController($modx, $module)); + break; + } +} +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/20_\320\232\320\273\321\226\321\224\320\275\321\202\321\201\321\214\320\272\321\226_\320\277\320\276\320\264\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/20_\320\232\320\273\321\226\321\224\320\275\321\202\321\201\321\214\320\272\321\226_\320\277\320\276\320\264\321\226\321\227.md" new file mode 100644 index 00000000..43f18fdf --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/20_\320\232\320\273\321\226\321\224\320\275\321\202\321\201\321\214\320\272\321\226_\320\277\320\276\320\264\321\226\321\227.md" @@ -0,0 +1,169 @@ +# Клієнтські події + +Дані події викликаються на клієнта, для виклику та перехоплення використовується jQuery. Усі події знаходяться у просторі імен`commerce`. + +При роботі з кошиком (це дії`add`, `remove`, `update`, `clean`) порядок виклику подій наступний: + +1. `action-start.commerce` +2. `cart-.commerce` - у цій події можна скасувати подальші дії +3. `cart--complete.commerce` +4. `action-complete.commerce` + +#### action-start + +Викликається за будь-якої дії з кошиком, на самому початку обробки. + +Параметри події: + + + + + +
    ПараметрОпис
    actionНазва дії, наприклад cart/add
    paramsДані події. При додаванні до кошика містять дані товару, тип кошика. При видаленні корзини містять ідентифікатор рядка. І т.д.
    + +```js +$(document).on('action-start.commerce', function(e, params) { + console.log(params.action + ' called with ', params.data); +}); +``` + +#### action-complete + +Викликається після того, як дія з кошиком зроблена. + +Параметри події: + + + + + + +
    ПараметрОпис
    actionНазва дії, наприклад cart/add
    paramsДані події. При додаванні до кошика містять дані товару, тип кошика. При видаленні корзини містять ідентифікатор рядка. І т.д.
    responseВідповідь сервера
    + +#### cart-add + +Викликається перед додаванням товару до кошика. Дозволяє скасувати додавання + +Параметри події: + + + + +
    ПараметрОпис
    paramsПараметри запиту. Залежно від способу виклику, може містити різні дані. Наприклад, при додаванні товару з форми тут будуть усі дані з полів цієї форми, а якщо товар додається простим посиланням з атрибутом data-commerce-action="add",у параметрах будуть всі data-параметри цього посилання. Обов'язково є тільки id.
    + +Стандартні параметри запиту: + + + + + + +
    ПараметрОпис
    idІдентифікатор товару, що додається
    countКількість. Якщо відсутня, вважається рівною 1
    cartКількість. Об'єкт для опису кошика. Містить значення instance - тип кошика за замовчуванням products
    + +Приклад: + +```js +$(document).on('cart-add.commerce', function(e, params) { + if (params.cart.instance == 'comparison' && params.id == 53) { + e.preventDefault(); + } +}); +``` + +#### cart-add-complete + +Викликається під час обробки відповіді сервера на запит додавання товару + +Параметри події: + + + + + +
    ПараметрОпис
    responseВідповідь сервера. Містить status - результат запиту, success / failed, і row - унікальний ідентифікатор рядка з доданим товаром у кошику
    dataПараметри запиту, той самий склад, як і у подіїcart-add
    + +```js +$(document).on('cart-add-complete.commerce', function(e, params) { + if (params.response.status == 'success') { + $('.product[data-id="' + params.data.id + '"]').addClass('in-cart'); + } +}); +``` + +#### cart-remove + +Викликається перед видаленням товару із кошика + +#### cart-remove-complete + +Викликається під час обробки відповіді сервера на запит видалення товару з кошика + +#### cart-update + +Викликається перед зміною товару + +#### cart-update-complete + +Викликається під час обробки відповіді сервера на запит зміни товару + +#### cart-clean + +Викликається перед очищенням кошика + +#### cart-clean-complete + +Викликається під час обробки відповіді сервера на запит очищення кошика + +```js +$(document).on('cart-clean-complete.commerce', function(e) { + $('.order').remove(); +}); +``` + +#### collect-hashes + +Викликається при кожному запиті до сервера для збирання хешів усіх кошиків на сторінці, з метою оновлення вмісту цих кошиків + +#### cart-reload + +Викликається перед оновленням вмісту кошика, дію можна скасувати + +```js +$(document).on('cart-reload.commerce', function(e) { + if ($(e.target).hasClass('sidecart')) { + e.preventDefault(); + } +}); +``` + +#### cart-reloaded + +Викликається після оновлення вмісту кошика + +```js +$(document).on('cart-reloaded.commerce', function(e) { + var $cart = $(e.target); + + if ($cart.hasClass('minicart')) { + $cart.addClass('animate'); + } +}); +``` + +#### carts-reloaded + +Викликається після оновлення всіх кошиків, але лише за прямого виклику методу Commerce.reloadCarts() + +```js +$(document).on('carts-reloaded.commerce', function(e) { + alert('Усі кошики оновлені!'); +}); +``` + +#### order-data-update + +викликається перед відправкою на сервер даних форми замовлення + +#### order-data-updated + +викликається після надсилання на сервер даних форми замовлення diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/10_\320\224\320\276\321\201\321\202\320\260\320\262\320\272\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/10_\320\224\320\276\321\201\321\202\320\260\320\262\320\272\320\260.md" new file mode 100644 index 00000000..f49717dc --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/10_\320\224\320\276\321\201\321\202\320\260\320\262\320\272\320\260.md" @@ -0,0 +1,34 @@ +# Приклад доставки з фіксованою вартістю + +```php +$title = 'Доставка по місту'; +$price = ci()->currency->convertToActive(300); + +switch ($modx->Event->name) { + case 'OnRegisterDelivery': { + // Реєстрація доставки + $params['rows']['fixed'] = [ + 'title' => $title, + 'price' => $price, + ]; + + break; + } + + case 'OnCollectSubtotals': { + $processor = $modx->commerce->loadProcessor(); + + if ($processor->isOrderStarted() && $processor->getCurrentDelivery() == 'fixed') { + // Якщо замовлення в процесі оформлення та ця доставка вибрана, + // додаємо вартість доставки до замовлення + $params['total'] += $price; + $params['rows']['fixed'] = [ + 'title' => $title, + 'price' => $price, + ]; + } + break; + } +} + +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/20_\320\227\320\275\320\270\320\266\320\272\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/20_\320\227\320\275\320\270\320\266\320\272\320\270.md" new file mode 100644 index 00000000..7a980585 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/20_\320\227\320\275\320\270\320\266\320\272\320\270.md" @@ -0,0 +1,24 @@ +# Приклад додавання знижки +```php +switch ($modx->Event->name) { + case 'OnCollectSubtotals': { + $min = ci()->currency->convertToActive(5000); + + if ($modx->commerce->getCart()->getTotal() >= $min) { + $discount = $params['total'] * 0.2; + + // додаємо рядок з описом знижки в розділ додаткових зборів замовлення + $params['rows']['discount'] = [ + 'title' => 'Скидка', + 'price' => -$discount, + ]; + +// віднімаємо розмір знижки з підсумкової суми замовлення + $params['total'] -= $discount; + } + + break; + } +} + +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/30_\320\241\320\277\320\276\321\201\320\276\320\261\320\270_\320\276\320\277\320\273\320\260\321\202\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/30_\320\241\320\277\320\276\321\201\320\276\320\261\320\270_\320\276\320\277\320\273\320\260\321\202\320\270.md" new file mode 100644 index 00000000..00d1f730 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/30_\320\241\320\277\320\276\321\201\320\276\320\261\320\270_\320\276\320\277\320\273\320\260\321\202\320\270.md" @@ -0,0 +1,29 @@ +# Приклад простого платежу + +Приклад додавання простого способу платежу без інтеграції зі сторонніх сервісами + +```php +$code = 'on_delivery'; +$title = 'Оплата при отриманні'; + +if (!empty($modx->commerce) && $modx->Event->name == 'OnRegisterPayments') { + // Використовуємо для реєстрації попередньо встановлений + // Базовий клас способів платежів + $class = new \Commerce\Payments\Payment($modx, $params); + $modx->commerce->registerPayment($code, $title, $class); +} +``` + +В версії 2.0.x: + +```php +$code = 'on_delivery'; +$title = 'Оплата при отриманні'; + +if (defined('COMMERCE_INITIALIZED') && $modx->Event->name == 'OnRegisterPayments') { +// Використовуємо для реєстрації попередньо встановлений + // Базовий клас способів платежів + $class = new \Commerce\Payments\Payment($modx, $params); + $modx->commerce->registerPayment($code, $title, $class); +} +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/40_\320\237\320\265\321\200\320\265\320\264\320\277\320\273\320\260\321\202\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/40_\320\237\320\265\321\200\320\265\320\264\320\277\320\273\320\260\321\202\320\260.md" new file mode 100644 index 00000000..ca813893 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/40_\320\237\320\265\321\200\320\265\320\264\320\277\320\273\320\260\321\202\320\260.md" @@ -0,0 +1,39 @@ +# Приклад реалізації плагіна для часткової оплати замовлень (передоплати) +У цьому прикладі до форми замовлення додається галочка "Передплата 50%". Якщо вона відзначена покупцем, перший платіж буде зменшуватися наполовину. + +Насамперед скопіюйте код форми замовлення з файлу `assets/plugins/commerce/templates/front/order_form.tpl` у чанк, додайте до нього наступний код: + +```html +
    + +
    +``` + +У коді вище `Commerce.updateOrderData($(this.form))` означає, що при кожній зміні значення даного поля на сервер будуть надсилатися дані форми. + +Додайте параметр `formTpl` з ім'ям нового чанка до виклику сніпету `Order`. + +Далі створіть плагін: + +```php +switch ($modx->event->name) { + case 'OnBeforePaymentCreate': { + $processor = ci()->commerce->loadProcessor(); + $data = $processor->getRawData(); + + // Отримуємо вже оплачену суму на це замовлення + $paid = $processor->getOrderPaymentsAmount($params['order_id']); + + / якщо платежів на замовлення не було, і галочка передоплати зазначена, + // зменшуємо суму платежу наполовину + if (!$paid && !empty($data['partial'])) { + $params['amount'] = floor($params['amount'] * 0.5); + } + break; + } +} +``` + +Це все! diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/45_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\206\321\214\320\272\320\265_\320\277\320\276\320\273\320\265.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/45_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\206\321\214\320\272\320\265_\320\277\320\276\320\273\320\265.md" new file mode 100644 index 00000000..463ae0e1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/45_\320\232\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\206\321\214\320\272\320\265_\320\277\320\276\320\273\320\265.md" @@ -0,0 +1,83 @@ +# Приклад додавання поля користувача у форму замовлення +Наприклад, ви хочете додати обов'язкове поле "Місто". Насамперед створіть чанк із вмістом файлу `assets/plugins/commerce/templates/front/order_form.tpl` і вкажіть ім'я цього чанка в параметрі `formTpl` при виклику сніпету `Order`. + +Додати поле в чанк: + +```html +
    + + [+city.error+] +
    +``` + +тепер поле відображатиметься у формі замовлення та відправлятиметься на сервер разом з формою, але воно не проходитиме перевірку під час відправки та не відображатиметься в панелі адміністрування магазином та в листах повідомленнях. + +Для перевірки поля потрібно додати правила валідації у виклик Сніппет `Order`, вони ідентичні правилам `FormLister`. Мінімальне правило буде таким: +```json +"!city": { + "lengthBetween": { + "params": [2, 255], + "message": "Назва міста має бути довжиною від 2 до 255 символів" + } +} +``` +Тепер потрібно вирішити питання з відображенням у списку замовлень та перегляду замовлення. Для цього створіть плагін та прив'яжіть його до подій `OnManagerBeforeOrdersListRender` и `OnManagerBeforeOrderRender`: + +```php +switch ($modx->event->name) { + case 'OnManagerBeforeOrdersListRender': { + // додаємо стовпець до таблиці замовлень + $params['columns']['city'] = [ + 'title' => 'Місто', + 'content' => function($data, $DL, $eDL) { + return !empty($data['fields']['city']) ? $data['fields']['city'] : ''; + }, + 'sort' => 50, + ]; + break; + } + + case 'OnManagerBeforeOrderRender': { + // додаємо поле на сторінку перегляду замовлення + $params['groups']['payment_delivery']['fields']['city'] = [ + 'title' => 'Місто', + 'content' => function($data) { + return !empty($data['fields']['city']) ? $data['fields']['city'] : ''; + }, + 'sort' => 20, + ]; + break; + } +} +``` + +Тепер потрібно додати поле до сторінки редагування замовлення. Для цього додамо в плагін обробку події `OnManagerBeforeOrderEditRender`: + +```php +switch ($modx->event->name) { + case 'OnManagerBeforeOrderEditRender': { + unset($params['fields']['delivery_method']); + $params['fields']['city'] = [ + 'title' => 'Місто', + 'content' => function($data) { + $value = !empty($data['fields']['city']) ? $data['fields']['city'] : ''; + return ''; + }, + '!rules' => [ + 'lengthBetween' => [ + 'params' => [2, 255], + 'message' => 'Назва міста має бути довжиною від 2 до 255 символів', + ], + ], + 'sort' => 40, + ]; + break; + } +} +``` + +Залишилося вивести поле у листі-повідомленні. Для цього потрібно скопіювати в чанк вміст стандартного листа з файлу `assets/plugins/commerce/lang/russian-UTF8/order_report.tpl` і додати ім'я цього чанка в параметрі `reportTpl` при виклику сніппета `Order`. + +У чанці для виведення поля використовуйте `[+order.fields.city+]`. + + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/50_\320\222\321\226\320\272\320\275\320\276_\320\277\321\200\320\270_\320\264\320\276\320\264\320\260\320\262\320\260\320\275\320\275\321\226_\320\262_\320\272\320\276\321\210\320\270\320\272.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/50_\320\222\321\226\320\272\320\275\320\276_\320\277\321\200\320\270_\320\264\320\276\320\264\320\260\320\262\320\260\320\275\320\275\321\226_\320\262_\320\272\320\276\321\210\320\270\320\272.md" new file mode 100644 index 00000000..0a2b9409 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/99_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/50_\320\222\321\226\320\272\320\275\320\276_\320\277\321\200\320\270_\320\264\320\276\320\264\320\260\320\262\320\260\320\275\320\275\321\226_\320\262_\320\272\320\276\321\210\320\270\320\272.md" @@ -0,0 +1,119 @@ +# Виведення вікна підтвердження після додавання товару до кошика + +Якщо вам потрібне просте вікно, ви можете використовувати jquery-подію `cart-add-complete.commerce`: + +```javascript +$(document).on('cart-add-complete.commerce', function(e, params) { + alert('Товар в кошику!'); +}); +``` +Але найчастіше цього недостатньо, тому що із параметрів події можна дістати лише ідентифікатор доданого товару. В такому випадку може допомогти серверна подія `OnCommerceAjaxResponse`, яка дозволить модифікувати відповідь сервера після додавання товару і додати у відповідь свої дані. + +Допустимо, вам потрібно, щоб у вікні показувалася назва товару та вміст кошика. Для цього створіть плагін: + +```php +switch ($modx->event->name) { + case 'OnCommerceAjaxResponse': { + if (empty($_GET['q']) || empty($_POST['action'])) { + break; + } + + // потрібна тільки подія додавання до кошика + if ($_GET['q'] != 'commerce/action' || $_POST['action'] != 'cart/add') { + break; + } + + // тільки успішне додавання до кошика товарів + if ($response['status'] != 'success' || $response['instance'] != 'products') { + break; + } + + // отримуємо кошик + $cart = ci()->carts->getCart($response['instance']); + + // отримуємо рядок кошика за його ідентифікатором + $row = $cart->get($response['row']); + + if ($row) { + // формуємо заголовок вікна - назва товару + $product = $modx->runSnippet('DocLister', [ + 'idType' => 'documents', + 'documents' => $row['id'], + 'tpl' => '@CODE:Товар «[+pagetitle+]» додано до кошика!', + ]); + + // формуємо кошик + $cart = $modx->runSnippet('Cart', [ + 'theme' => 'mini', + 'ownerTPL' => '@CODE: +
    + + + + + + + + + + + + + + + + + [+dl.wrap+] + +
    [%cart.item_title%][%cart.count%][%cart.item_price%][%cart.item_summary%]
    [%cart.total%]:[[PriceFormat? &price=`[+total+]` &convert=`0`]]
    +
    + ', + ]); + + // додаємо у відповідь сервера розмітку модального вікна + //! ідентифікатор сторінки замовлення має бути заповнений у налаштуваннях плагіна Commerce! + $params['response']['popup'] = ci()->tpl->parseChunk('@CODE: + + ', [ + 'product' => $product, + 'cart' => $cart, + 'order_url' => $modx->makeUrl($modx->commerce->getSetting('order_page_id')), + ]); + } + break; + } +} +``` + +Щоб показати це вікно, додайте на сторінку js-код. Він перевірятиме, чи є у відповіді розмітка модального вікна, і якщо є – показувати його. + +```javascript +$(document).on('cart-add-complete.commerce', function(e, params) { + if (params.response.popup) { + $('#popupcart, .modal-backdrop').remove(); + var $modal = $(params.response.popup); + $modal.on('hidden.bs.modal', function() { + $modal.remove(); + }); + $modal.appendTo(document.body).modal('show'); + } +}); +``` + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/index.md" new file mode 100644 index 00000000..77f48c1f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Commerce/index.md" @@ -0,0 +1,45 @@ +Програмний комплекс для створення інтернет-магазину на базі Evolution CMS. + +## Встановлення ## +* Завантажити архів зі сторінки репозиторію https://github.com/mnoskov/commerce/archive/master.zip +* Зайти до адмін-панелі Evolution CMS +* Натиснути "Модуль-Extras", вибрати "Установка з архіву:" і далі дотримуватися інструкцій. + +## Що для чого? ## +Після встановлення ви побачите кілька встановлених додатків. Давайте розберемося, яке із них за що відповідає. + +
      +
    • Плагін Commerce - це основний плагін необхідний для роботи всього доповнення. Зверніть увагу, що в розділі "Конфігурація" плагін має багато налаштувань;
    • +
    • Модуль управління замовленнями (Commerce) - модуль всередині адмін-панелі (Модулі -> Commerce). Потрібен для відстеження замовлень, їх статусів та перегляду подробиць про кожне замовлення;
    • +
    • Сніпети Cart, Comparison, Wishlist - виведення кошика, списків порівняння з обраного;
    • +
    • Сніпет Order - виведення форми замовлення;
    • +
    • Сніпет PriceConvert - для виведення ціни у потрібній валюті;
    • +
    • Сніпет PriceFormat - для виведення ціни, відформатованої відповідно до налаштувань та у потрібній валюті;
    • +
    • Сніпет CurrencySelect - виведення елемента вибору валюти.
    • +
    + +## Принципи работи ## + +### Покупка ### +Щоб ресурс сприймався плагіном як товар, його верстка має бути відповідним чином модифікована – потрібно додати до розмітки необхідні плагіну атрибути. Детальніше про розмітку товару дивіться у матеріалі "Розмітка товару". + +Для виведення кошика використовується сніпет Cart. + +**Порада:** на відміну від Shopkeeper, ви не обмежені лише одним кошиком на кожній сторінці. Можна викликати сніпет Cart стільки разів, скільки необхідно для реалізації потрібного функціоналу. Також кошика може взагалі не бути на сторінці, це не завадить додавати до неї товари. + +Сніпет Cart має безліч параметрів для вибору необхідного зовнішнього вигляду. Ви можете створити невеликий кошик з кількістю товарів і загальною сумою замовлення, так і величезну таблицю з параметрами, видаленням, будь-якими ТБ-параметрами товару. +Детальніше про розмітку кошика дивіться у матеріалі "Кошик замовлень". + + +### Сторінка кошика ### +Окрема сторінка кошика нічим не відрізняється від будь-якої іншої сторінки сайту, за винятком виклику сніпета Cart, у параметрах якого потрібно вказати необхідні вам шаблони для відображення повного кошика. + +### Оформлення замовлення ### +Замовлення оформлюється за допомогою сніпету Order. Цей сніпет повертає форму з полями введення, після заповнення яких замовлення буде сформовано та надіслано до бази даних. +Як правило, на цій же сторінці розміщується виведення всіх плагінів, що впливають на доставку та оплату. +Докладніше про шаблонізацію та налаштування сніпета Order дивіться на сторінці "Оформлення замовлення" +. + +### Перегляд замовлень ### +Після надсилання замовлення відображаються у модулі "Магазин". Опис можливостей модуля та принципи його доопрацювання дивіться у розділі "Модуль магазин". + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \320\277\320\273\320\260\320\263\321\226\320\275\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \320\277\320\273\320\260\320\263\321\226\320\275\320\260.md" new file mode 100644 index 00000000..ca292e27 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \320\277\320\273\320\260\320\263\321\226\320\275\320\260.md" @@ -0,0 +1,19 @@ +* ```max``` - Максимальна кількість файлів для порівняння +* ```js``` - Підключити js +* ```css``` - Підключити css +* ```lang``` - Мова;string;ua +* ```active``` - Клас, який показує, що елемент в порівнянні +* ```compareSelector``` - Cелектор елементів для порівняння +* ```compareCount``` - Блок, який виводить кількість товарів в порівнянні + +Щоб порівняння працювало в фронтенді достатньо для кнопки або посилання добавити клас "to-compare" і атрибут "data-id" з id товару. + +Приклад: +```Додати в порівняння ``` + +Для елемента з кількістю товарів в порівнянні необхідно задати class = "compare-count" + +Приклад: +```Кількість товарів в порівнянні
    ``` + +Після завантаження сторінки скрипт пропише клас "active" для елементів, які вже є в списку порівняння. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/02_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/02_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..93cbbc65 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/02_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,14 @@ +### Задати список тв полів для порівняння можна декількома способами: + +* Перерахувавши їх в параметрі ```tvList``` +* Задати в батьківському документі в параметрі multiTV ```compare``` +* Задати в параметрі ```tvCategory``` id категорії тв параметрів, через кому + +### Для виведення списку товарів необхідно на сторінці викликати сніпет compare + +* ```lang``` - Мова (ru/en/ua) +* ```group``` - Виводить назву груп (1/0) +* ```showUniqueValues``` - Показує тільки тв з різними значеннями (0/1). За замовчуванням: 0 +* ```requiredTV``` - Тв для обов'язкової вибірки DocLister (Картинка, і т.д.) +* ```layoutType``` - Тип верстки (vertical/horizontal). За замовчуванням horizontal. +* ```api``` - Якщо поставити "1" в форматі, json поверне список товарів, тв полів, і значень за замовчуванням * diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..23e6bfb9 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,68 @@ +### Шаблони горизонтальної верстки + +* ownerTpl - Шаблон обгортки +Значення за замовчуванням: +```@CODE:[+wrapper+]
    ``` + +* firstRowTpl - Шаблон, в який обертається рядок зі списком товарів +Значення за замовчуванням: +```@CODE:[+wrapper+]``` + +* paramsFirstBlockTpl - Перша комірка таблиці, після якої йдуть товари +Значення за замовчуванням: + ```@CODE:[+paramCaption+]``` + +* itemTpl - Шаблон комірки з інформацією про товар +Значення за замовчуванням: +```@CODE:[+pagetitle+]

    <Видалити> ``` + +* rowTpl - Рядок з списком значень тв параметрів +Значення за замовчуванням: + ```@CODE:[+wrapper+]``` + +* paramNameTpl - Комірка з назвою тв параметра +Значення за замовчуванням: +```@CODE:[+name+]``` + +* paramTpl - Комірка зі значенням тв параметра +Значення за замовчуванням: + ```@CODE:[+value+]``` + +* groupOuterTpl - Обгортка рядка з назвою групи тв параметрів +Значення за замовчуванням:: +```@CODE:[+wrapper+]``` + +* groupRowTpl - Комірка з назвою групи +Значення за замовчуванням: +```@CODE:[+name+]``` + +### Шаблони вертикальної верстки + +* ownerTp - Шаблон в який обертається список товарів і їх значення +Значення за замовчуванням: + ```@CODE:
    [+wrapper+]
    ``` + +* blockOuter - Обгортка одного товару і значень тв параметрів +Значення за замовчуванням: +```@CODE:
    [+item+][+tvs+]
    ``` + +* itemTpl - Шаблон виведення інформації про товар +Значення за замовчуванням: +```@CODE:
    [+pagetitle+]

    Видалити
    ``` + +* paramBlockOuter - Обгортка списку тв параметрів +Значення за замовчуванням: +```@CODE:
      [+wrapper+]
    ``` + +* paramTpl - Шаблон значення тв параметра +Значення за замовчуванням: +```@CODE:
  • [+name+]

    [+value+]

  • ``` + +### Багатомовність +* Багатомовність для назв тв параметровий Префікс cp_. Синтаксис "cp_назва параметра" +Приклад: +```cp_ram = 'Оперативна пам'ять';``` + +* Багатомовність для назв категорій параметрів. Префікс cp_, синтаксис "cp_cat_Ід_категорії" +Приклад: +```cp_cat_12 = 'Блок';``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/04_JS API.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/04_JS API.md" new file mode 100644 index 00000000..98459197 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/04_JS API.md" @@ -0,0 +1,12 @@ +### JS api + +* Функція видалення з порівняння: ```deleteFromCompare(id)``` +* Функція додавання в порівняння: ```addInCompare(id)``` +* Функція для проставляння активного класу: ```setActive()``` + Можна використовувати якщо частина контенту грузиться Аяксом +* Функція callback після додавання в порівняння: ```afterAddToCompare(id,elem)``` +* Функція callback після видалення з порівняння: ```afterDeleteFormCompare(id,elem)``` +* Функція callback яка викликається коли скрипт, після завантаження сторінки, елементи з класом .to-compare роздає активний клас ```afterSetDefault(id,elem,status)``` + Якщо статус true то елемент в порівнянні. +* Функція callback ```afterSetCount``` викликається після того як встановлюється кількість елементів в порівнянні в блок. + Передає першим параметром кількість елементів в порівнянні. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..d462fa69 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,14 @@ +``` +[!compare? + &showUniqueValues=`0` //виводимо всі властивості + &layoutType=`vertical` // вертикальна верстка + &ownerTpl=`@CODE:
      [+wrapper+]
    ` + &blockOuter=`@CODE:
  • [+item+][+tvs+]
  • ` + &itemTpl=`tpl.compareItem` + ¶mBlockOuter=`@CODE:
      [+wrapper+]
    ` + ¶mTpl=`@CODE:
  • + [+name+] + [+value+] +
  • ` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/index.md" new file mode 100644 index 00000000..2c46bf50 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Compare/index.md" @@ -0,0 +1,23 @@ +# Compare snippet v2.0 +Сніпет-порівняння для вашого сайту. + +Готове (майже) рішення для вашого каталогу / інтернет-магазину. +Додав клас => клікнув на кнопочку => порівняння готове =) + +Нова версія старого сніпета. +Не такий "дикий" і набагато зручніший старого: + +* Гнучка настройка кожного елемента порівняння +* Багатомовність +* Підтримка горизонтальної / вертикальної верстки +* Зручне налаштування списку TV-полів + +### Переваги + +* Швидке встановлення і налаштування +* Підтримка blang +* Підтримка горизонтальної (таблиця) і вертикальної (блоки) верстки +* Зручне налаштування списку тв полів для порівняння з можливістю додавати свої поля для різних категорій +* Угруповання TV за категоріями +* Підстановка значень з Девера документів +* Можливість приховувати однакові параметри diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/01_\320\236\320\277\320\270\321\201.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/01_\320\236\320\277\320\270\321\201.md" new file mode 100644 index 00000000..6bbf786b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/01_\320\236\320\277\320\270\321\201.md" @@ -0,0 +1,32 @@ + + +

    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 був відзначений галочкою в списку при установці.
    • +
    +

    Файли

    +
      +
    • assets/snippets/DocLister/snippet.DLBuildMenu.php
    • +
    • assets/snippets/DocLister/lib/DLFixedPrepare.class.php (метод buildMenu)
    • +
    +

    Переваги DLBuildMenu

    +
      +
    • є можливість застосування prepare для обробки даних перед виведенням.
    • +
    • великий вибір способів завдання шаблонів, в тому числі онлайн-шаблони.
    • +
    • сортування по TV-параметрам з приведенням до потрібного типу.
    • +
    • може робити фільтрацію по TV-параметрам.
    • +
    • можна придумувати і задавати власні параметри і обробляти їх в prepare.
    • +
    +

    Крім того, в DLBuildMenu працюють і інші фішки з арсеналу ДокЛістер, описувати які тут не стану, для цього потрібно вивчати сам DL.

    +

    Автор: Agel_Nash

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/02_\320\221\320\260\320\267\320\276\320\262\321\226 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/02_\320\221\320\260\320\267\320\276\320\262\321\226 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..5c64d213 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/02_\320\221\320\260\320\267\320\276\320\262\321\226 \320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,31 @@ + + +

    DLBuildMenu: Базові параметри

    +Базові параметри cніпета DLBuildMenu - для виведення меню сайту на Evolution CMS. +
    +

    &idType (hardcoded)

    +

    Тип вибірки аналогічно DocLister.

    +

    Можливі значення: parents

    +

    Примітка: значення параметра &idType жорстко записано в коді як parents.

    +

    &parents

    +

    Батьківська (початкова) папка.

    +

    Можливі значення: ID батька, або список ID батьків через кому.

    +

    Значення за замовчуванням: 0

    +

    Примітка: Зверніть увагу, що в DLBuildMenu значення &parents за замовчуванням дорівнює 0, що означає «виводити починаючи з кореня сайту». Це відрізняється від дефолтного значення &parents параметра в ДокЛістері.

    +

    &currentDepth

    +

    Вихідний рівень вкладеності (глибина).

    +

    Можливі значення: ціле число від 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).

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \321\201\320\276\321\200\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \321\201\320\276\321\200\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..cb119e6d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \321\201\320\276\321\200\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,14 @@ + + +

    DLBuildMenu: Параметри сортування

    +Параметри сортування cніпета DLBuildMenu - для виведення меню сайту на Evolution CMS. +
    +

    &orderBy

    +

    Умови сортування документів всіх рівнів

    +

    Можливі значення: задаються як в DocLister (за правилами MySQL для ORDER BY).

    +

    Значення за замовчуванням: menuindex ASC, id ASC

    +

    &orderByN

    +

    Умови сортування документів N-го рівня вкладеності, для відповідних рівнів &orderBy має пріоритет над &orderBy.

    +

    Можливі значення: задаються за правилами MySQL для ORDER BY.

    +

    Значення за замовчуванням: немає

    +

    Примітка: Якщо &orderByN не заданий, для всіх рівнів використовується &orderBy.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/04_\320\241\320\277\320\270\321\201\320\276\320\272 \320\242\320\222.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/04_\320\241\320\277\320\270\321\201\320\276\320\272 \320\242\320\222.md" new file mode 100644 index 00000000..96f1bb39 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/04_\320\241\320\277\320\270\321\201\320\276\320\272 \320\242\320\222.md" @@ -0,0 +1,14 @@ + + +

    DLBuildMenu: Параметри «Список TV»

    +Параметри «Список TV» cніпета DLBuildMenu - для виведення меню сайту на Evolution CMS. +
    +

    &tvList

    +

    Список TV-параметрів, які беруть участь у вибірці (як в DocLister).

    +

    Можливі значення: список імен TV-параметрів через кому.

    +

    Значення за замовчуванням: немає

    +

    &tvListN

    +

    Список TV-параметрів у вибірці для N-го рівня вкладеності, для відповідних рівнів &tvListN має пріоритет над &tvList.

    +

    Можливі значення: список імен TV-параметрів через кому.

    +

    За замовчуванням: пусто.

    +

    Примітка: Якщо &tvListN не заданий, для всіх рівнів використовується &tvList.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/05_\320\243\320\274\320\276\320\262\320\270 \320\262\320\270\320\261\321\226\321\200\320\272\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/05_\320\243\320\274\320\276\320\262\320\270 \320\262\320\270\320\261\321\226\321\200\320\272\320\270.md" new file mode 100644 index 00000000..e168b8a8 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/05_\320\243\320\274\320\276\320\262\320\270 \320\262\320\270\320\261\321\226\321\200\320\272\320\270.md" @@ -0,0 +1,14 @@ + + +

    DLBuildMenu: Параметри умов вибірки

    +Параметри умов вибірки cніпета DLBuildMenu - для виведення меню сайту на Evolution CMS. +
    +

    &addWhereList

    +

    Умови вибірки документів для всіх рівнів.

    +

    Можливі значення: задаються як в DocLister (за правилами MySQL для умови WHERE).

    +

    Значення за замовчуванням: c.hidemenu = 0

    +

    &addWhereListN

    +

    Умови вибірки документів N-го рівня, для відповідних рівнів &addWhereListN має пріоритет над &addWhereList.

    +

    Можливі значення: задаються за правилами MySQL для умови WHERE.

    +

    Значення за замовчуванням: немає

    +

    Примітка: Якщо &addWhereListN не заданий, для всіх рівнів використовується &addWhereList.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..871ff482 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/06_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,27 @@ + + +

    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, &currentClass, &firstClass, &evenClass, &oddClass и &activeClass.

    +

    [+url+]

    +

    УРЛ ресурсу аналогічно ДокЛистеру.

    +

    [+e.title+]

    +

    Екрановане значення menutitle або pagetitle (якщо menutitle порожній) аналогічно Доклістеру.

    +

    [+id+]

    +

    ID ресурсу аналогічно ДокЛістеру.

    + +

    Ви можете використовувати і інші плейсхолдери ДокЛістера, що встановлюються контролером site_content і різними екстендерами.

    +

    Наприклад, плейсхолдери виду [+ tvPrefix.tvName +], плейсхолдери екранованих значень виду [+ e.fieldName +] (де fieldName - це ім'я поля таблиці site_content), [+ date +] та інші (див. Документацію до DocLister).

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/07_\320\237\321\200\321\226\320\276\321\200\321\226\321\202\320\265\321\202\320\270 \321\210\320\260\320\261\320\273\320\276\320\275\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/07_\320\237\321\200\321\226\320\276\321\200\321\226\321\202\320\265\321\202\320\270 \321\210\320\260\320\261\320\273\320\276\320\275\321\226\320\262.md" new file mode 100644 index 00000000..6e7a506a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/07_\320\237\321\200\321\226\320\276\321\200\321\226\321\202\320\265\321\202\320\270 \321\210\320\260\320\261\320\273\320\276\320\275\321\226\320\262.md" @@ -0,0 +1,77 @@ + + +

    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
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/08_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/08_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..c2a68bb4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/08_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,57 @@ + + +

    DLBuildMenu: Шаблони

    +Шаблони cніпета DLBuildMenu - для виведення меню сайту на Evolution CMS. +
    +

    Шаблони DLBuildMenu задаються за правилами DL, тобто можуть бути і онлайн-шаблонами, і іменами чанкі, або завантажуватися з файлу, з документа MODx, з конфіга, з глобального плейсхолдера.

    + +

    &TplMainOwner

    +

    Основний шаблон-обгортка (для рівня глибини 1).

    +
    Значення за замовчуванням:
    +
    @CODE:<ul id="nav" class="menu level-1">[+dl.wrap+]</ul>
    +

    Примітка: у вас повинен бути заданий шаблон & TplMainOwner або & TplOwner1, інакше буде використано дефолтний значення шаблона & TplMainOwner.

    +

    &TplSubOwner

    +

    Шаблон-обгортка для вкладених рівнів (для субменю).

    +
    Значення за замовчуванням:
    +
    @CODE:<ul class="sub-menu level-[+dl.currentDepth+]">[+dl.wrap+]</ul>
    +

    Примітка: для виведення N-рівневого меню у вас на додаток до основної обгортці повинен бути заданий принаймні & TplSubOwner і / або шаблони & TplOwnerN. Інакше буде використано дефолтний значення & TplSubOwner.

    +

    &TplOwnerN

    +

    Шаблон-обгортка для субменю N-го рівня вкладеності, для відповідних рівнів & TplOwnerN має пріоритет над & TplMainOwner і & TplSubOwner (див. Примітку).

    +

    Значення за замовчуванням: немає

    +

    Примітка: Якщо задані і & TplOwner1, і & TplMainOwner, то буде використаний & TplOwner1. Якщо задані і & TplOwner2 і & TplSubOwner, то для рівня 2 буде використаний & TplOwner2, а для рівнів починаючи з 3-го - &TplSubOwner.

    + + +

    &TplOneItem

    +

    Основний шаблон для кожного пункту меню всіх рівнів.

    +
    Значення за замовчуванням:
    +
    +@CODE:<li id="menu-item-[+id+]" class="menu-item [+dl.class+]">
    + <a href="[+url+]" title="[+e.title+]">[+title+]</a>
    + [+dl.submenu+]
    +</li>
    +
    +

    Примітка: у вас повинні бути задані всі потрібні вам шаблони пунктів меню, по крайней мере & TplOneItem. Інакше для пунктів, у яких шаблон не визначений вами, буде використано дефолтний значення &TplOneItem.

    +

    &TplDepthN

    +

    Шаблон пункту меню вкладеності N, для відповідних рівнів & TplDepthN має пріоритет над &TplOneItem.

    +

    Значення за замовчуванням: немає

    +

    Примітка: Наприклад, якщо заданий & TplDepth2, він замінить собою шаблон & amp; TplOneItem на 3-му рівні вкладеності.

    + + +

    &noChildrenRowTPL

    +

    Основний шаблон пункту меню без дочірніх елементів для всіх рівнів.

    +

    Значення за замовчуванням: немає

    +

    &TplNoChildrenDepthN

    +

    Шаблон пункту меню без дочірніх елементів вкладеності N. Для відповідних рівнів & TplNoChildrenDepthN має пріоритет над & noChildrenRowTpl.

    +

    Значення за замовчуванням: немає

    +

    Примітка: якщо для пункту меню не заданий ні & noChildrenRowTPL, ні & TplNoChildrenDepthN, то в якості шаблону для «бездітних» пунктів буде використаний шаблон, заданий вами в інших параметрах (& TplOneItem або &TplDepthN).

    + + +

    &TplCurrent

    +

    Шаблон поточного пункту меню з дочірніми, має пріоритет перед усіма шаблонами пунктів меню, крім &TplCurrentN.

    +

    Значення за замовчуванням: немає

    +

    &TplCurrentN

    +

    Шаблон поточного пункту меню вкладеності N з дочірніми, для N-го рівня шаблон & TplCurrentN має пріоритет перед усіма шаблонами пунктів меню з дочірніми, включаючи &TplCurrent.

    +

    Значення за замовчуванням: немає.

    +

    &TplCurrentNoChildrenN

    +

    Шаблон поточного пункту меню без дочірніх елементів, де N - номер рівня вкладеності. Для рівня N має пріоритет перед будь-якими іншими шаблонами «бездітних» пунктів меню.

    +

    Значення за замовчуванням: немає.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/index.md" new file mode 100644 index 00000000..826ec258 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLBuildMenu/index.md" @@ -0,0 +1,4 @@ + + +

    DLBuildMenu: документація, параметри, шаблони

    +Документація по сніпетів DLBuildMenu для створення меню на MODx Evo. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLCrumbs/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLCrumbs/index.md" new file mode 100644 index 00000000..db10bafd --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLCrumbs/index.md" @@ -0,0 +1,62 @@ + + +

    DLCrumbs - breadcrumbs за допомогою DocLister

    +

    Сніпет для створення навігації breadcrumbs за допомогою DocLister. Ви можете використовувати будь-який з параметрів DocLister у виклику DLCrumbs.

    +

    Автор: Agel_Nash

    + +

    id

    +

    ID поточної сторінки.

    +

    Значення за замовчуванням:

    +
    +$modx->documentIdentifier
    +
    +

    hideMain

    +

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

    +

    Значення за замовчуванням: 0.

    +

    showCurrent

    +

    Встановіть значення 1, щоб включити поточну сторінку.

    +

    Значення за замовчуванням: 0..

    +

    minDocs

    +

    Цей параметр визначає мінімальну кількість відображуваних елементів.

    +

    Значення за замовчуванням: 0..

    + + +

    tpl

    +

    Шаблон виведення крихти.

    +

    Значення за замовчуванням:

    +
    +@CODE:<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem"><meta itemprop="position" content="[+iteration+]" />
    +	<a href="[+url+]" title="[+e.title+]" itemprop="item">
    +		<span itemprop="name">[+title+]</span>
    +	</a>
    +</li>
    +
    +

    tplFirst

    +

    Шаблон виведення першого пункту.

    +

    Значення за замовчуванням: немає

    +

    Приклад шаблону для домашньої сторінки

    +
    +@CODE:<li itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem" class="home-link">
    +	<meta itemprop="position" content="[+iteration+]" />
    +	<a href="[+url+]" title="[+longtitle+]" itemprop="item" class="icon icon-home"><i class="fa fa-home"></i></a>
    +</li>
    +
    +

    tplCurrent

    +

    Шаблон виведення поточної сторінки.

    +

    Значення за замовчуванням:

    +
    +@CODE:<li class="active" itemprop="itemListElement" itemscope itemtype="http://schema.org/ListItem">
    +	<meta itemprop="position" content="[+iteration+]" />
    +	<span itemprop="item">[+title+]</span>
    +</li>
    +
    +

    ownerTPL

    +

    Шаблон обгортки.

    +

    Значення за замовчуванням:

    +
    +@CODE:<nav class="breadcrumbs">
    +	<ul class="breadcrumb" itemscope itemtype="http://schema.org/BreadcrumbList">
    +		[+crumbs.wrap+]
    +	</ul>
    +</nav>
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLLastViews/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLLastViews/index.md" new file mode 100644 index 00000000..03be646a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLLastViews/index.md" @@ -0,0 +1,73 @@ + + +

    DLLastViews: останні переглянуті документи

    +Сніпет для виведення останніх переглянутих документів, наприклад можна для магазинів виводити переглянуті товари. +

    У властивостях сніпета є два параметри:

    +
      +
    1. Час зберігання cookie. Здається в секундах, за замовчуванням 30 днів
    2. +
    3. Скільки документів запам'ятовувати? За замовчуванням: 5
    4. +
    +

    Автор: Максим

    +

    Установка:

    +
      +
    1. Створити новий сніпет і вставити туди код
    2. +
    3. Поставити галочку «Аналізувати DocBlock» і зберегти
    4. +
    +
    +<?php
    +/**
    + * DLLastViews
    + *
    + * Conclusion viewed products with DocLister.
    + *
    + * @category    snippet
    + * @version     1.1
    + * @internal    @properties &expired=Время хранения cookie;text;2592000;2592000;по умолчанию: 30 дней &maxDocs=Сколько документов запоминать;text;5;5
    + * @internal    @modx_category Content
    + * @internal    @installset base
    + * @author      Created By mkot, optimization Pathologic
    + * 
    + * @lastupdate  04/09/2017
    + */
    +
    +if (!isset($params['mode'])) $params['mode'] = 'register';
    +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']);   
    +}
    +
    +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);
    +                }
    +    break;
    +        default:
    +        break;
    +}
    +
    +

    Використання:

    +

    На сторінках, які потрібно запам'ятовувати написати не Кешована виклик без параметрів

    +
    [!DLLastViews!]
    +

    Там де потрібно виводити список переглянутих документів написати некешований виклик з параметрами. Всі параметри, як у DocLister'а (крім idType, він жорстко заданий в сніпеті) і додати параметр &mode=`show`

    +
    +[!DLLastViews? 
    +    &mode=`show`
    +    &ownerTPL=`
      [+dl.wrap+]
    ` + &tpl=`@CODE: <li><a href="[+url+]">[+title+]</a></li>` +!] +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..c892814a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,20 @@ + + +

    DLMenu: Особливості

    +Особливості cніпета DLMenu для виведення меню за допомогою DocLister. +
    +

    З Wayfinder все зрозуміло і так; DLBuildMenu хороший як ілюстрація можливостей параметра prepare, але такий спосіб вирішення завдання привів до підвищеного споживання ресурсів, що вже не дуже добре. До недоліків DLBuildMenu можна віднести і деяку складність при переході з Wayfinder. Загалом, пропоную своє рішення, яке повинно применшити недоліки DLBuildMenu, зберігши гнучкість в маніпуляціях з шаблонами. +

    Сніпет я написав, звичайно, на базі DocLister, розширивши контролер site_content.

    +

    Особливості:

    +
      +
    • система шаблонів і класів, схожа з Wayfinder;
    • +
    • кількість запитів дорівнює кількості рівнів в меню (без урахування запитів на додавання tv-параметрів і підрахунок дочірніх документів)
    • +
    • власне, можливість підрахувати кількість дочірніх ресурсів (для безпосередніх батьків);
    • +
    • майже всі параметри можна задавати як для всіх рівнів меню, так і для конкретного рівня;
    • +
    • можна використовувати prepare для обробки даних і підміни шаблонів; як і в DocLister можна за допомогою prepare виключати документи з виведення;
    • +
    • можна будувати меню від декількох батьків;
    • +
    • можна тримати розгорнутими певні гілки;
    • +
    • можна вивести меню у вигляді json-масиву;
    • +
    • кешування вихідних дані для прискорення роботи (піде в паблік, коли прикрутимо до Evo нормальний кеш).
    • +
    +

    Автор: Pathologic

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/02_\320\232\320\273\320\260\321\201\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/02_\320\232\320\273\320\260\321\201\320\270.md" new file mode 100644 index 00000000..c4322ac5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/02_\320\232\320\273\320\260\321\201\320\270.md" @@ -0,0 +1,26 @@ + + +

    DLMenu: Класи

    +Класи cніпета DLMenu для виведення меню за допомогою DocLister. +
    +

    Задаються для документів:

    +
      +
    • rowClass - клас документа, задається значенням параметра innerClass;
    • +
    • firstClass - клас першого документа в групі, задається значенням параметра firstClass (за замовчуванням - first);
    • +
    • lastClass - клас останнього документа в групі, задається значенням параметра lastClass (за замовчуванням - last);
    • +
    • levelClass - клас рівня меню, задається значенням параметра lastClass, до якого додається номер рівня (за замовчуванням - level);
    • +
    • webLinkClass - клас документа-посилання, задається значенням параметра webLinkClass;
    • +
    • parentClass - клас документа-батька, задається значенням параметра parentClass;
    • +
    • hereClass - клас поточного документа, задається значенням параметра hereClass (за замовчуванням - current);
    • +
    • activeClass - клас активного документа, задається значенням параметра activeClass (за замовчуванням - active);
    • +
    • oddClass - клас непарного документа в групі, задається значенням параметра oddClass (за замовчуванням - odd);
    • +
    • evenClass - клас парного документа в групі, задається значенням параметра evenClass (за замовчуванням - even);
    • +
    • stateClass - задається значенням плейсхолдера [+state+].
    • +
    +

    Можна також додати свої класи в prepare-сніпеті:

    +
    $data['classes'] = array('myClass'=>'my');
    +

    Задаються для обгорток:

    +
      +
    • innerClass - клас обгортки дочірніх документів, задається значенням параметра - innerClass;
    • +
    • outerClass - класу обгортки всього меню, задається значенням параметра - outerClass.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..18992ae4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,43 @@ + + +

    DLMenu: Основні параметри

    +Основні параметри cніпета DLMenu для виведення меню за допомогою DocLister. +
    +

    Для сортування і обмеження вибірки слід використовувати параметри DocLister (sortBy, sortDir, orderBy, addWhereList і т.д.) За замовчуванням виконується сортування за зростанням значення поля menuindex, документи з hidemenu=1 не виводятся.

    +

    Параметр prepare можна задати для певного рівня (наприклад, prepare2). Але в самому prepare-сніпеті дізнатися рівень можна з значення $data['level']. Параметр tvList також застосовується до всіх рівнів.

    +

    В параметрах шаблонів слід вказувати рівень на 1 менше (наприклад, rowTpl2 буде застосований до документів третього рівня, а rowTpl0 - першого).

    +

    parents

    +

    Список id документів, від яких будується меню, через кому. Якщо у зазначених документів різні батьки, то буде побудовано кілька меню. Щоб вивести в тому порядку, в якому перераховані батьки, слід використовувати параметр sortType1 зі значенням "doclist".

    +

    Можливі значення - список id через кому.

    +

    Значення за замовчуванням - id ресурсу, в якому викликаний сніпет.

    +

    maxDepth

    +

    Максимальна кількість рівнів в меню.

    +

    Можливі значення - число від 1.

    +

    Значення за замовчуванням - 10.

    +

    showParent

    +

    Якщо значення параметра дорівнює 1, то будуть показані документи, зазначені в параметрі parents.

    +

    Можливі значення - 0 або 1.

    +

    Значення за замовчуванням - 0.

    +

    api

    +

    Якщо значення параметра дорівнює 1, то результати будуть виведені у вигляді json-масиву.

    +

    Можливі значення - 0 або 1.

    +

    Значення за замовчуванням - 0.

    +

    hideSubMenus

    +

    Якщо значення параметра дорівнює 1, то неактивні гілки меню не показуються.

    +

    Можливі значення - 0 або 1.

    +

    Значення за замовчуванням - 0.

    +

    openIds

    +

    Результат аналогічний викликом з включеним параметром hideSubMenus, але можна вказати через кому id батьківських документів, чиї безпосередні нащадки будуть завжди на виду.

    +

    Можливі значення - список id через кому.

    +

    Значення за замовчуванням - не задано.

    +

    countChildren

    +

    Якщо значення параметра дорівнює 1, то буде обчислено кількість безпосередніх дочірніх документів для кожного ресурсу в меню.

    +

    Можливі значення - 0 або 1.

    +

    Значення за замовчуванням - 0.

    +

    titleField

    +

    Ім'я плейсхолдера, в якому задається назва документа.

    +

    Значення за замовчуванням - title.

    +

    joinMenus

    +

    Якщо задано кілька батьків і відключений параметр showParent, то сніпет виведе стільки ж меню. За допомогою цього параметра їх можна об'єднати в одне.

    +

    Можливі значення - 0 або 1.

    +

    Значення за замовчуванням - 0.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/04_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/04_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..3c323569 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/04_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,21 @@ + + +

    DLMenu: Плейсходери

    +Плейсходери cніпета DLMenu для виведення меню за допомогою DocLister. +
    +
      +
    • [+wrap+] - висновок дочірніх документів (в api-режимі - children); якщо значення плейсхолдера - масив, то він перетворюється в рядок із застосуванням відповідних шаблонів, якщо рядок - залишається без змін;
    • +
    • [+classNames+] - список класів, доступних в шаблоні (тільки імена);
    • +
    • [+classes+] - список класів, доступних в шаблоні (включаючи class=" ");
    • +
    • [+maxLevel+] - якщо встановлено, то вказує на те, що документ знаходиться в самому низу гілки, до якої належить;
    • +
    • [+iteration+] - порядковий номер документа в групі;
    • +
    • [+here+] - якщо встановлено, то документ є поточним документів;
    • +
    • [+active+] - якщо встановлено, то документ є активним документів;
    • +
    • [+state+] - якщо заданий параметр hideSubMenus, то плейсхолдер містить значення open для розгорнутої гілки і closed для згорнутої;
    • +
    • [+title+] - назва документа, так само полю menutitle, якщо воно не порожнє, або pagetitle;
    • +
    • [+url+] - посилання на документ;
    • +
    • [+count+] - кількість безпосередніх нащадків;
    • +
    • [+_renderRowTpl+] - якщо встановлено, то його значення буде використано як шаблон при виведенні документів;
    • +
    • [+_renderOuterTpl+] - якщо встановлено, то його значення буде використано як шаблон при виведенні обгортки дочірніх документів.
    • +
    +

    Також доступні плейсхолдери, що встановлюються екстендером e, і плейсхолдери окремих класів: [+oddClass+], [+rowClass+] і т.д.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/05_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/05_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..1ce3b1ab --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/05_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,32 @@ + + +

    DLMenu: Шаблони

    +Шаблони cніпета DLMenu для виведення меню за допомогою DocLister. +
    +

    outerTpl

    +

    Обгортка всього меню.

    +

    Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister.

    +

    Значення за замовчуванням:

    +
    @CODE:<ul[+classes+]>[+wrap+]</ul>
    +

    rowTpl, rowHereTpl

    +

    Шаблон для виведення пункту меню першого рівня без нащадків. Для поточного документа може бути заданий шаблон rowHereTpl.

    +

    Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister.

    +

    Значення за замовчуванням:

    +
    @CODE:<li[+classes+]><a href="[+url+]">[+title+]</a></li>
    +

    parentRowTpl, parentRowHereTpl, parentRowActiveTpl

    +

    Шаблон для виведення документа, у якого є нащадки. Для поточного документа може бути заданий шаблон parentRowHereTpl, для активного - parentRowActiveTpl.

    +

    Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister.

    +

    Значення за замовчуванням:

    +
    @CODE:<li[+classes+]><a href="[+url+]">[+title+]</a>[+wrap+]</li>
    +

    innerTpl

    +

    Обгортка блоку дочірніх документів.

    +

    Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister.

    +

    Значення за замовчуванням - значення параметра outerTpl.

    +

    innerRowTpl, innerRowHereTpl

    +

    Шаблон для виведення дочірнього документа. Для поточного документа може бути заданий шаблон innerRowHereTpl.

    +

    Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister.

    +

    Значення за замовчуванням - значення параметра rowTpl.

    +

    categoryFolderTpl

    +

    Шаблон для виведення категорії (документа з полем isfolder = 1 і шаблоном _blank або значенням поля link_attributes містить слово category).

    +

    Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister.

    +

    Значення за замовчуванням - значення параметра parentRowTpl.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/index.md" new file mode 100644 index 00000000..bd9c9b12 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLMenu/index.md" @@ -0,0 +1,207 @@ +## Опис +Заміна Wayfinder і DLBuildMenu. Особливості: + +* Система шаблонів і класів, схожа з Wayfinder; +* Кількість запитів дорівнює кількості рівнів в меню (без урахування запитів на додавання tv-параметрів і підрахунок дочірніх документів) +* Власне, можливість підрахувати кількість дочірніх ресурсів (для безпосередніх батьків); +* Майже всі параметри можна задавати як для всіх рівнів меню, так і для конкретного рівня; +* Можна використовувати prepare для обробки даних і підміни шаблонів; як і в DocLister можна за допомогою prepare виключати документи з виведення; +* Можна будувати меню від декількох батьків; +* Можна тримати розгорнутими певні гілки; +* Можна вивести меню у вигляді json-масиву; +* Кешування як вихідних даних, так і виведення при використанні компонента EvoTwig. + +## Основні параметри +Для сортування і обмеження вибірки слід використовувати параметри DocLister (sortBy, sortDir, orderBy, addWhereList і т.д.) За замовчуванням виконується сортування за зростанням значення поля menuindex, документи з hidemenu = 1 цієї статті не виводяться. Для того щоб виводилися документи, в яких параметр "Відображати в меню", неактивний, потрібно додати в виклик сніпепта параметр addWhereList з порожнім значенням (& addWhereList = ''). + +Параметр prepare можна задати для певного рівня (наприклад, prepare2). Але в самому prepare-сніпеті дізнатися рівень можна з значення $ data [ 'level']. Параметр tvList також застосовується до всіх рівнів. + +В параметрах шаблонів слід вказувати рівень на 1 менше (наприклад, rowTpl2 буде застосований до документів третього рівня, а rowTpl0 - першого). + +### documents +Список id документів, які утворюють однорівневе меню. Щоб вивести в тому порядку, в якому вони перераховані, слід використовувати параметр sortType1 зі значенням "doclist". + +### parents +Список id документів, від яких будується багаторівневе меню, через кому. Якщо у зазначених документів різні батьки, то буде побудовано кілька меню. Щоб вивести в тому порядку, в якому перераховані батьки, слід використовувати параметр sortType1 зі значенням "doclist". + +Можливі значення - список id через кому. + +Значення за замовчуванням - id ресурсу, в якому викликаний сниппет. + +### maxDepth +Максимальна кількість рівнів в меню. + +Можливі значення - число від 1. + +Значення за замовчуванням - 10. + +### showParent +Якщо значення параметра дорівнює 1, то будуть показані документи, зазначені в параметрі parents. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. + +### api +Якщо значення параметра дорівнює 1, то результати будуть виведені у вигляді json-масиву. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. + +### hideSubMenus +Якщо значення параметра дорівнює 1, то неактивні гілки меню не показуються. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. + +### openIds +Результат аналогічний викликом з включеним параметром hideSubMenus, але можна вказати через кому id батьківських документів, чиї безпосередні нащадки будуть завжди на виду. + +Можливі значення - список id через кому. + +Значення за замовчуванням - не задано. + +### countChildren +Якщо значення параметра дорівнює 1, то буде обчислено кількість безпосередніх дочірніх документів для кожного ресурсу в меню. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. +### titleField +Ім'я плейсхолдера, в якому задається назва документа. + +Значення за замовчуванням - title. + +### joinMenus +Якщо задано кілька батьків і відключений параметр showParent, то сніпет виведе стільки ж меню. За допомогою цього параметра їх можна об'єднати в одне. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. + +## Кешування +При використанні компонента EvoTwig можливо використовувати кеш для прискорення роботи DLMenu. При включеному кешуванні запити в БД для побудови меню виконуються тільки один раз, готове меню також кешируєтся, але тільки для активних пунктів меню (тобто загальна кількість відповідних записів в кеші буде дорівнює кількості пунктів меню плюс один запис для меню з неактивними пунктами, незалежно від кількості сторінок сайту, на яких це меню виводиться). + +### cache +Включає кешування. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 1. + +### cacheLifetime +Дозволяє кешувати дані на заданий час. Якщо значення дорівнює 0, то дані кешуються до тих пір, поки кеш не очистите. + +Можливі значення - кількість секунд. + +Значення за замовчуванням - 0. + +### cacheStrategy +Визначає режим кешування. При значенні user записи в кеші створюється два набори записів: для авторизованих і неавторизованих користувачів; при usergroup також враховуються групи, створені учасником. + +Можливі значення - user, usergroup. + +Значення за замовчуванням - порожньо. + +### cacheKeyGenerator +Дозволяє вказати функцію або статичний метод для побудови ключа кеша. При виклику використовуються аргументи modx (об'єкт DocumentParser) і DocLister (об'єкт контролера). За замовчуванням для побудови ключа використовує хеш параметрів, з якими був викликаний сніпет. + +Можливі значення - функція, статичний метод. + +Значення за замовчуванням - порожньо. + +## Шаблони +### outerTpl +Обгортка всього меню. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE:[+wrap+] +``` + +### rowTpl, rowHereTpl +Шаблон для виведення пункту меню першого рівня без нащадків. Для поточного документа може бути заданий шаблон rowHereTpl. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE:[+title+] +``` + +### parentRowTpl, parentRowHereTpl, parentRowActiveTpl +Шаблон для виведення документа, у якого є нащадки. Для поточного документа може бути заданий шаблон parentRowHereTpl, для активного - parentRowActiveTpl. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE:[+title+][+wrap+] +``` + +### innerTpl +Обгортка блоку дочірніх документів. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - значення параметра outerTpl. + +### innerRowTpl, innerRowHereTpl +Шаблон для виведення дочірнього документа. Для поточного документа може бути заданий шаблон innerRowHereTpl. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - значення параметра rowTpl. + +### categoryFolderTpl +Шаблон для виведення категорії (документа з полем isfolder = 1 і шаблоном \ _blank або значенням поля link_attributes містить слово category). + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - значення параметра parentRowTpl. + +## Класи +Задаються для документів: +* __rowClass__ - клас документа, задається значенням параметра rowClass; +* __firstClass__ - клас першого документа в групі, задається значенням параметра firstClass (за замовчуванням - first); +* __lastClass__ - клас останнього документа в групі, задається значенням параметра lastClass (за замовчуванням - last); +* __levelClass__ - клас рівня меню, задається значенням параметра levelClass, до якого додається номер рівня (за замовчуванням - level); +* __webLinkClass__ - клас документа-посилання, задається значенням параметра webLinkClass; +* __parentClass__ - клас документа-батька, задається значенням параметра parentClass; +* __hereClass__ - клас поточного документа, задається значенням параметра hereClass (за замовчуванням - current); +* __activeClass__ - клас активного документа, задається значенням параметра activeClass (за замовчуванням - active); +* __oddClass__ - клас непарного документа в групі, задається значенням параметра oddClass (за замовчуванням - odd); +* __evenClass__ - клас парного документа в групі, задається значенням параметра evenClass (за замовчуванням - even); +* __stateClass__ - задається значенням плейсхолдера __[+state+]__. + +Можна також додати свої класи в prepare-сніпеті: +``` +$data['classes'] = array('myClass'=>'my'); +``` + +Задаються для обгорток: +* __innerClass__ - клас обгортки дочірніх документів, задається значенням параметра innerClass; +* __outerClass__ - класу обгортки всього меню, задається значенням параметра outerClass. + +## Плейсходери +* __[+wrap+]__ - висновок дочірніх документів (в api-режимі - children); якщо значення плейсхолдера - масив, то він перетворюється в рядок із застосуванням відповідних шаблонів, якщо рядок - залишається без змін; +* __[+classNames+]__ - список класів, доступних в шаблоні (тільки імена); +* __[+classes+]__ - список класів, доступних в шаблоні (включаючи class = ""); +* __[+level+]__ - рівень документа; +* __[+maxLevel+]__ - якщо встановлено, то вказує на те, що документ знаходиться в самому низу гілки, до якої належить; +* __[+iteration+]__ - порядковий номер документа в групі; +* __[+\_display+]__ - загальна кількість документів в групі; +* __[+here+]__ - якщо встановлено, то документ є поточним документів; +* __[+active+]__ - якщо встановлено, то документ є активним документів; +* __[+state+]__ - якщо заданий параметр hideSubMenus, то плейсхолдер містить значення open для розгорнутої гілки і closed для згорнутої; +* __[+title+]__ - назва документа, так само полю menutitle, якщо воно не порожнє, або pagetitle; +* __[+url+]__ - посилання на документ; +* __[+count+]__ - кількість безпосередніх нащадків; +* __[+\_renderRowTpl+]__ - якщо встановлено, то його значення буде використано як шаблон при виведенні документів; +* __[+\_renderOuterTpl+]__ - якщо встановлено, то його значення буде використано як шаблон при виведенні обгортки дочірніх документів. + +Також доступні плейсхолдери, що встановлюються екстендером e, і плейсхолдери окремих класів: __[+oddClass+]__, __[+rowClass+]__ і т.д. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLPrevNext/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLPrevNext/index.md" new file mode 100644 index 00000000..1306679e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLPrevNext/index.md" @@ -0,0 +1,76 @@ +## Опис сніпета +Призначений для виведення посилань на сусідні документи з форматуванням виду виведених посилань. Для роботи необхідний встановлений [Doc Lister](http://docs.evo.im/04_extras/doclister.html). + +## Установка +1. Створіть новий сніпет з ім'ям DLPrevNext і вставте в нього код нижче: +``` +documentObject['id']; +$params = is_array($modx->Event->params) ? $modx->Event->params : array(); +$params = array_merge($params, array( + 'api' => 1, + 'debug' => '0' + )); + +$json = $modx->runSnippet("DocLister", $params); +$children = jsonHelper::jsonDecode($json, array('assoc' => true)); +$children = is_array($children) ? $children : array(); +$self = $prev = $next = null; +foreach ($children as $key => $data) { + if (! empty($self)) { + $next = $key; + break; + } + if ($key == $ID) { + $self = $key; + if (empty($prev)) { + $prev = end($children); + $prev = $prev['id']; + } + } else { + $prev = $key; + } +} +if (empty($next)) { + reset($children); + $next = current($children); + $next = $next['id']; +} +if ($next == $prev) { + $next = ''; +} + +$TPL = DLTemplate::getInstance($modx); +return ($prev == $ID) ? '' : $TPL->parseChunk($prevnextTPL, array( + 'prev' => empty($prev) ? '' : $TPL->parseChunk($prevTPL, $children[$prev]), + 'next' => empty($next) ? '' : $TPL->parseChunk($nextTPL, $children[$next]), +)); +?> + +``` +## Параметри і приклади використання +У потрібному місці шаблону вставте виклик сніпета, параметри виклику аналогічні [параметрам](http://docs.evo.im/04_extras/doclister/parameters.html) **Doclister**. + +**&prevnextTPL** — ім'я чанка або код (через @CODE :) виведення посилань на соседедніе документи, содержмт 2 плейсхолдера **[+prev+]** і **[+next+]** + +**&prevTPL** — ім'я чанка або код (через @CODE :) в якому задається зовнішній вигляд плейсхолдера **[+prev+]** + +**&nextTPL** — ім'я чанка або код (через @CODE :) в якому задається зовнішній вигляд плейсхолдера **[+next+]** + +Щоб не створювати зайвих чанкі, можна використовувати структуру ``` &nextTPL=`@CODE: ваш_html` ``` + + +#### Найпростіший виклик +``` +[[DLPrevNext? &idType=`parents` &prevnextTPL=`@CODE: [+prev+] | [+next+]` &prevTPL=`@CODE: ← [+title+]` &nextTPL=`@CODE: [+title+] →`]] + +``` +#### Виклик з урахуванням батьківської папки (зручно для виведення сусідніх документів в каталогах) +``` +[[DLPrevNext? &idType=`parents` &parents=`[*parent*]` &prevnextTPL=`@CODE: [+prev+] | [+next+]` &prevTPL=`@CODE: ← [+title+]` &nextTPL=`@CODE: [+title+] →`]] + +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLRequest/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLRequest/index.md" new file mode 100644 index 00000000..8eedb60c --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLRequest/index.md" @@ -0,0 +1,87 @@ + + +

    DLRequest - запуск сніпетів з параметрами з get/post

    +DLRequest - запуск сніпетів з параметрами з get/post +

    Сніпет розроблений для заміни Ditto з екстендером request на прохання Extremum і на його ж кошти, за що велике спасибі.

    +

    Сніпет приймає значення з post або get-масиву і використовує їх в якості параметрів для запуску іншого сніпета. Спочатку планувалася робота тільки з DocLister (звідси і назва), але в підсумку можна викликати будь-сніпет. Проте, наявність встановленого DocLister'а обов'язково.

    +

    DLRequest вміє не тільки передавати параметри, але і будувати форму для управління цими самими параметрами, без милиць типу:

    +
    +<?php
    +//[!selected? &field=`ditto_id1_sortDir` &value=`DESC`!]
    +if ($_REQUEST[$field] == $value) {
    +	echo "selected"; 
    +}
    +
    +

    Важливий момент - можливі значення параметрів задаються розробником, тобто якщо в формі для вибору кількості документів на сторінці зазначено «10, 20, 50, 100», то підставити руками url?display=100500 не вийде - такий параметр буде просто проігноровано.

    +

    Передбачена також можливість зберігати значення параметрів, які передаються з браузера для інших фрагментів, наприклад, для DocLister це буде параметр page. Тобто якщо в списку документів ви перебуваєте на сторінці 5, то після зміни, наприклад, напряму сортування, все одно залишитеся на сторінці 5.

    +

    Тепер приведу приклад виклику, з якого зрозуміло, як це все працює:

    +
    +[+paramsForm+]
    +<div>
    +	[!DLRequest? 
    +	&runSnippet=`DocLister` 
    +	&parents=`2` 
    +	&tpl=`@CODE:

    [+id+]. [+pagetitle+]

    ` + &paginate=`pages` + &display=`0` + &rqParams=`{ + "sortBy":{ + "id":"По id", + "pagetitle":"По pagetitle" + }, + "sortDir":{ + "asc":"По возрастанию", + "desc":"По убыванию" + }, + "display":{ + "1":"1 документ", + "3":"3 документа", + "5":"5 документов" + } + }` + &rqParamsNames=`{ + "sortBy":"Сортировать по", + "sortDir":"Порядок", + "display":"Результатов на странице" + }` + &selectedClassName=`selected` + & paramsForm=`paramsForm` + &keepParams=`page` + & paramsOwnerTPL=`@CODE: +
    + [+keepParams+] + [+params+] + +
    + ` + & param.ownerTPL=`@CODE: + + + ` + & param.tpl=`@CODE: + + ` + &sortBy.tpl=`@CODE: + + ` + &display.ownerTPL=`@CODE: + + + ` + &keepTpl=`@CODE: + + ` + !] +</div> +[+pages+] +
    +

    Після & прогалини стоять, бо інакше редактор підміняє символи.

    +

    Автор: Pathologic

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLSiblings/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLSiblings/index.md" new file mode 100644 index 00000000..720bdb31 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLSiblings/index.md" @@ -0,0 +1,64 @@ + + +

    DLSiblings: Вивід сусідніх ресурсів з шаблонізацією

    + +Вивід сусідніх ресурсів з шаблонізацією (множинна кільцева перелінковка). + +

    Автор: Aharito

    + +DLSiblings — сніпет виведення сусідніх ресурсів для Evolution CMS (MODx Evo). Призначений для організації множинної кільцевої перелінковки сторінок сайту. Заснований на сніпеті DocLister, тому можна використовувати всі можливості ДокЛістера. + +

    Трохи теорії

    +Що таке множинна кільцева перелінковка? Сеошники напевно знають про неї. А для тих, хто не знає - це схема перелінковки сторінок сайту, що дозволяє непогано підняти сайт по низькочастотних і СНЧ запитам. + +*** Детальніше про кільцевої перелінковке читайте в моїй статті: Схема перелінковки сайту під НЧ + +

    Параметри сніпета

    +
      +
    • &renderSnippet ( DocLister | sgController ) сніпет, який використовується для виведення, default DocLister
    • +
    • &prevQty - Кількість виведених сусідів-попередників, default 2
    • +
    • &nextQty - Кількість виведених сусідів-послідовників, default 2
    • +
    • все інші параметри і шаблони як в DocLister
    • +
    + +Можна використовувати успадковані від DocLister (такі ж, як у нього): умови вибірки & addWhereList і & filters, умови сортування & orderBy, глибину вибірки & depth, prepare-сніпети і багато інших параметрів і всі шаблони. + +Якщо в якості сніпета виведення вказано sgController, то відповідно можна використовувати і всі умови, параметри і шаблони sgController. + +

    Шаблони сніпета

    +Всі шаблони - точно такі ж, як у DocLister. Плейсхолдери в шаблонах - теж точно такі ж, як в DocLister. Якщо в якості сніпета виведення вказано sgController, то шаблони і плейсхолдери - точно такі ж, як в sgController. + +

    Установка

    +
      +
    • Сніпет знаходиться на Github
    • +
    • Архів потрібно скачать і встановити через Extras ("Установка з архіву").
    • +
    + +

    приклад

    + + [[DLSiblings? + &idType=`parents` + &parents=`[*parent*]` + &tpl=`@CODE: [+tv.h1+]
    ` + &prevQty=`2` + &nextQty=`2` + &tvList=`h1` + ]] + + + +*** Більше прикладів з кодом і поясненнями в моїй статті: Приклади застосування DLSiblings + +

    Результат праці

    +У цьому прикладі параметром & parents ми задаємо вибірку, в якій будемо шукати сусідів - всі документи, що знаходяться в тій же папці, що і поточний. + +Результатом роботи буде список посилань на статті, сусідні по ВД для поточної. + + + +### Ще приклад + +Результат роботи складнішого виклику сніпета з висновком превьюшек, дати і заголовка може виглядати приблизно так: +![siblings_demo_1](https://user-images.githubusercontent.com/6253807/50377091-b58ff300-0649-11e9-8880-f2672927e4af.png) + +Детальніше про сніпеті DLSiblings читайте на моєму сайті: Сніпет DLSiblings diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLSitemap/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLSitemap/index.md" new file mode 100644 index 00000000..50662ac2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DLSitemap/index.md" @@ -0,0 +1,11 @@ +## Опис +**DLSitemap** - сніпет, що дозволяє будувати XML карту сайту для пошукових систем. Він набагато швидший, ніж [sitemap](https://github.com/extras-evolution/sitemap/), і здатний змінювати пріоритет і міняти частоту оновлення, грунтуючись на часі останньої модифікації документа. + +Сам сніпет це обгортка для [DocLister](http://docs.evo.im/04_extras/doclister.html), який запускається з зумовленими параметрами (знаходяться в +`assets/snippets/DocLister/config/core/sitemap.json`), так що можна використовувати всі параметри [DocLister](http://docs.evo.im/04_extras/doclister.html) для фільтрації, зміни порядку і тому подібного. Так як в конфігурації параметр `prepare` вже заповнений викликом **DLSitemap**, то замість нього використовуйте параметри `BeforePrepare` і `AfterPrepare`. + +Якщо необхідно змінити пріоритет і частоту оновлення вручну, тоді необхідно створити ТВ-параметри з іменами `sitemap_priority` і `sitemap_changefreq` (імена можуть бути змінені за допомогою параметрів `priority` і `changefreq`). Якщо документ не має цих ТВ-параметрів, то пріоритет і частота оновлення будуть визначені автоматично. + + + + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..7a0e721f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,528 @@ + + +

    Ditto: Параметри

    +Параметри сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: Ім'я конфігураційного файлу
    +Значення за замовчуванням: default
    +Примітка: Файл конфігурації може включати значення різних параметрів Ditto, позбавляючи від незручностей, пов'язаних з обмеженнями, що накладаються MODX на значення параметрів сніпетів (не можна використовувати &, `, <enter> т.д.). Файли конфігурації зберігаються в папці &ditto_base/configs/. Їх імена мають формат &config.config.php
    +

    Приклад:

    +
    &config=``
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-який валідний формат часу, який відповідає правилам функції PHP - strftime
    +Значення за замовчуванням: [LANG]
    +Примітка: Визначає формат часу, яке виводиться за допомогою плейсхолдера
    +

    Приклад:

    +
    &dateFormat=`%d.%m.%Y`
    +
    +
    +
    + +
    + +
    +
    +Формат: Час в форматі UNIX timestamp з поля MODX або TV-параметра
    +Значення за замовчуванням: createdon
    +Примітка: Будь-яке значення часу в форматі UNIX timestamp з поля MODX або TV-параметра, як наприклад createdon, pub_date, or editedon.
    +

    Приклад:

    +
    &dateSource=`pub_date`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Режим налагодження дозволяє розібратися в складних і незрозумілих ситуаціях. Особливо актуальна можливість для великих сайтів, де безліч викликів Ditto можуть конфліктувати між собою. При включеному режимі налагодження крім результатів роботи виводиться безліч корисної для розробника інформації (всі параметри, список документів результату, їх ID і т.п.). +
    +

    Приклад:

    +
    &debug=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 1
    +Примітка: Число рівнів в глибину для пошуку документів. Документи будуть знайдені всередині документів-контейнерів, зазначених в &startID і &parents і вкладених документів-контейнерів до рівня зазначеного в &depth. Тобто якщо цей параметр дорівнює 1, то будуть брати тільки безпосередньо дочірні документи, зазначених в &startID і &parents. Якщо &depth = 2, в пошук пройде ще і в дочірніх.
    +

    Приклад:

    +
    &depth=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат: число | all
    +Значення за замовчуванням: 3
    +Примітка: all - усі документи
    +

    Приклад:

    +
    &display=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: шлях
    +Значення за замовчуванням: [(base_path)]assets/snippets/ditto/
    +Примітка: Папка зі слешем на кінці, яка вказує розміщення фалів Ditto на сервері. Як правило цей параметр змінювати не доводиться.
    +

    Приклад:

    +
    &ditto_base=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, через кому
    +Значення за замовчуванням: немає
    +Примітка: Цей параметр повинен містити список ID'ів тих документів, які будуть відображені в результатах. Т.ц. Можна жорстко задати список документів, які будуть відображатися.
    +

    Приклад:

    +
    &documents=`1, 35, 122`
    +
    +
    +
    + +
    + +
    +
    +Формат: Розширення через кому
    +Значення за замовчуванням: немає
    +Примітка: Вказує Ditto, які розширення слід завантажити. Приклад розширення з коментарями (англійською) можна знайти шляхом: &ditto_base/extenders/example.extender.inc.php. Всі розширення знаходяться в папці &ditto_base/extenders/ і імена файлів мають формат: name.extender.inc.php.
    +

    Приклад:

    +
    &extenders=`summary`
    +
    +
    +
    + +
    + +
    +
    +Формат: поле, критерій, тип порівняння
    +Значення за замовчуванням: NULL
    +Примітка: використовується формат `поле, критерій, тип порівняння` з коми між значеннями.
    +Список фільтрів:
    +За замовчуванням: NULL
    +Типи порівняння:
    +1 - != (не відповідає критерію)
    +2 - == (відповідає критерію)
    +3 - < (менше критерію)
    +4 - > (більше критерію)
    +5 - <= (менше або дорівнює критерієм)
    +6 - >= (більше або дорівнює критерієм)
    +7 - (не містить текст критерію)
    +8 - (містить текст критерію)
    + 9 - case insenstive version of #7
    +10 - case insenstive version of #8
    +11 - checks leading character of the field
    +Може містити декілька запитів, розділених глобальним роздільником |.
    +

    Приклад:

    +
    &filter=`id,10,2|id,20,2`
    +
    +
    +
    + +
    + +
    +
    +Формат: html | json | xml | atom | rss
    +Значення за замовчуванням: html
    +Примітка: Ditto вміє працювати з різними форматами даних. Наприклад, він може виводити RSS стрічку новин або дані в XML форматі.
    +

    Приклад:

    +
    &format=`rss`
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-який символ, який не буде використовуватися в правилі фільтру
    +Значення за замовчуванням: |
    +Примітка: Задає значення роздільник для параметра &filter.
    +

    Приклад:

    +
    &globalFilterDelimiter=``
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-яка назва параметра MODX або TV-параметра, перераховані через кому.
    +Значення за замовчуванням: NULL
    +Примітка:
    +

    Приклад:

    +
    &hiddenFields=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &hideFolders=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &hidePrivate=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: Числа або букви англійського алфавіту. Рядок чутливий до регістру.
    +Значення за замовчуванням: немає
    +Примітка: Унікальний ідентифікатор потрібен головним чином тоді, коли необхідно використовувати більше одного виклику Ditto на сторінці, причому актуальний це параметр тоді, коли для більш ніж одного виклику Ditto використовуються глобальні плейсхолдери.
    +Наприклад, Ви виводите на одній сторінці спосок новин і список останніх публікацій, причому обидва списки мають пейджер. Якщо Ви вставите двічі [+pages+], то обидва пейджер будуть управляти двома списками відразу. Це по-перше. А по-друге обидва пейджер буду відбивати сторінки першого списку. Тобто коли MODX обробить перший виклик, він замінить обидва плейсхолдера [+pages+] на це значення. А список сторінок другого списку ні куди не потрапить.
    +Так ось в такому випадку, слід використовувати для кожного виклику Ditto свій id. А глобальні плейсхолдери візьмуть вид [+id_placeholder+]. Символ підкреслення між ідентифікатором і назвою плейсхолдера додасться автоматично.
    +

    Приклад:

    +
    &id=`nav`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Використовується як [+keywords+] або джерело tagData.
    +

    Приклад:

    +
    &keywords=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: Назва мовного файлу
    +Значення за замовчуванням: english
    +Примітка: У мовних файлах Ditto зберігаються шаблони, які використовуються за замовчуванням, опису помилок і повідомлення.
    +Ditto спочатку завантажує свій стандартний мовний файл, а вже після цього той файл, що вказаний в даному параметрі. Таким чином, якщо в файлі вказаному користувачем немає якого-небудь рядка, вона буде використана з стандартного файлу. +Примітка. Мовні файли знаходяться в папці &ditto_base/lang/. Імена маю формат: &language.inc.php

    +

    Приклад:

    +
    &language=`russian-UTF8`
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-який символ, який не буде використовуватися в параметрі фільтра
    +Значення за замовчуванням: ,
    +Примітка:
    +

    Приклад:

    +
    &localFilterDelimiter=``
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-який текст або назва чанка
    +Значення за замовчуванням: LANG
    +Примітка:
    +

    Приклад:

    +
    &noResults=`Документи не знайдені`
    +
    +
    +
    + +
    + +
    +
    +Формат: Розділений комами список
    +Значення за замовчуванням: createdon DESC
    +Примітка: Натомість &sortBy і &sortDir.
    +

    Приклад:

    +
    &orderBy=`pagetitle ASC`
    +
    +
    +
    + +
    + +
    +
    +Формат: Список ID через кому
    +Значення за замовчуванням: Поточний документ
    +Примітка: Вказує Ditto список ідентифікаторів (id) документів-контейнерів, звідки будуть братися документи для виведення Ditto. Документи беруться до глибини &depth.
    +

    Приклад:

    +
    &parents=`1, 5, 8`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка: У Ditto є вбудований парсер PHx. Ця опція вмикає/вимикає його.
    +

    Приклад:

    +
    &phx=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 0
    +Примітка: 0 - немає обмеження
    +

    Приклад:

    +
    &queryLimit=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Остерігайтеся кешованих викликів!
    +

    Приклад:

    +
    &randomize=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-яка назва чанка, яке використовується при виведенні
    +Значення за замовчуванням: NULL
    +Примітка: Зазвичай використовується для видалення коментарів
    +

    Приклад:

    +
    &removeChunk=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1 | 2 | 3
    +Значення за замовчуванням: 0
    +Примітка: 0 - off; returns output
    +1 - remaining; returns output
    +2 - all;
    +3 - all; returns ph only
    +

    Приклад:

    +
    &save=`3`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Використовується якщо глибина (&depth) більше 1
    +

    Приклад:

    +
    &seeThruUnpub=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +0 - показувати всі документи
    +1 - показувати тільки документи у яких поставлений прапор «Показувати в меню»
    +

    Приклад:

    +
    &showInMenuOnly=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +0 - показувати тільки неопубліковані документи
    +1 - показувати лише опубліковані документи
    +

    Приклад:

    +
    &showPublishedOnly=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &start=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат: число | all
    +Значення за замовчуванням: all
    +Примітка:
    +

    Приклад:

    +
    &total=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-який валідний вираз MySQL WHERE
    +Значення за замовчуванням: NULL
    +Примітка: Використовується тільки для параметрів документів. Не підтримує TV-параметри.
    +

    Приклад:

    +
    &where=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..0242fc24 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,140 @@ + + +

    Ditto: Плейсхолдери

    +У Ditto є свої власні пдейсхолдери, плюс він підтримує змінні (поля) які використовуються в кожному документі. +
    +

    Створюючи шаблон Ditto, ви вказуєте плейсхолдери там, де ви хочете побачити свої дані. У Ditto є свої власні пдейсхолдери, плюс він підтримує змінні (поля) використовуються в кожному документі. (Примітка: якщо ви хочете використовувати змінні (поля) документа безпосередньо на сторінці зі звичайним шаблоном, ви повинні використовувати формат [*alias*])

    +

    Плейсхолдери документа

    +
    +

    [~[+id+]~] – Створює повний URL, заснований на ID, але не створює саме посилання.

    +

    Наприклад:

    +
    <h3><a href="[~[+id+]~]">[+title+]</a></h3>
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОпис
    [+alias+]Ім'я користувача сторінки, використовується для створення ЧПУ
    [+cacheable+]Повертає 1 (true) or 0 (false) якщо цей документ повинен бути кешованим. За умовчанням встановлено в false для нормального функціонування динамічних сніпетів
    [+content+]Вміст документа
    [+contentType+]Повертає рядковий параметр типу вмісту з меню, що випадає Content Type в панелі адміністратора
    [+content_dispo+]Рядок впровадження або прикріплення. Впроваджені документи показуються в веб-браузерах. Прикріплені документ можуть бути завантажені на локальну машину через діалогове вікно завантаження файлу веб-браузера
    [+createdby+]Повертає ідентифікатор користувача, який створив документ
    [+createdon+]Дата (у секундах з 1 січня 1970 г.), коли документ був створений
    [+deleted+]Повертає 1 (true) or 0 (false). Коли true, цей документ знаходиться в кошику до її очищення. Після цього запис стирається повністю з бази даних (видаляється ПО-СПРАВЖНЬОМУ)
    [+deletedby+]Повертає ідентифікатор користувача, який видалив цей документ
    [+deletedon+]Повертає дату видалення документа (в секундах з 1 січня 1970 г.)
    [+description+]Опис документа
    [+donthit+]True (1) or False (0) показує встановлений чи ні лічильник відвідувань сторінки
    [+editedby+]Повертає ідентифікатор користувача, який останній редагував документ
    [+editedon+]Повертає дату останнього редагування (в секундах з 1 січня 1970 г.)
    [+haskeywords+]True (1) or False (0) показує встановлені чи ні ключові слова для даного документа
    [+hasmetatag+]True (1) or False (0) показує встановлені чи ні метатеги для даного документа
    [+hidemenu+]Повертає 1 (true) або 0 (false) - відповідно якщо цей документ показується в меню чи ні
    [+id+]Ціле число позначає або показує ідентифікатор документа
    [+introtext+]Анотація документа
    [+isfolder+]Ціле число: true (1) якщо документ є контейнером або false (0) якщо ні.
    [+longtitle+]Розширений заголовок документа
    [+menuindex+]Ціле число, яке показує позицію в меню
    [+menutitle+]Назва документа в меню
    [+pagetitle+]Заголовок документа
    [+parent+]ідентифікатор батьківського документа
    [+privatemgr+]True (1) or False (0) показує встановлені дозволи на перегляд цього документа для менеджерів
    [+privateweb+]True (1) or False (0) показує встановлені дозволи на перегляд цього документа для веб-користувачів
    [+pub_date+]Дата з якої документ опублікують (в секундах з 1 січня 1970 р.) Примітка: якщо цей параметр вказаний, published автоматично встановлюється в true (1)
    [+published+]Ціле число показує статус публікування (0 = ні, 1 = так)
    [+richtext+]true (1) або false (0), встановлюється, якщо в адміністративній панелі повинен використовуватися rich text editor
    [+searchable+]Повертає 1 (true) або 0 (false), що означає що цей документ доступний або не доступний для пошуку
    [+template+]ідентифікатор шаблону, використовуваного для цього документа
    [+type+]Повертає рядковий параметр document для сторінок або "reference" для посилань
    [+unpub_date+]Дата закінчення публікації документа (в секундах з 1 січня 1970 р.). Примітка: установка цього параметра НЕ має ефекту на зміну статусу установок published
    +
    +
    +

    Плейсхолдери Ditto

    +
    +
    + + + + + + + + + + + + + + +
    ПараметрОпис
    [+author+] Ім'я автора. Спочатку createdby->fullname, createdby->username, admin
    [+date+]Дата в установленому форматі. За замовчуванням використовується createdon (editedon і pub_date як варіанти)
    [+ditto_iteration+]Порядковий номер отриманого документа в межах поточної сторінки
    [+ditto_sort+]Порядковий номер отриманого документа в межах повного набору документів
    [+title+]Вміст поля заголовка
    [+url+]Посилання на документ
    [+ditto+] або [+wrapper+]З версії 2.1.1. Використовується в шаблоні & outerTpl. Місце виведення результату роботи сніпета
    [+ditto_class+]З версії 2.1.1. Виводить класи even/odd, first/last і current
    +
    +
    +

    Плейсхолдери пагінації

    +
    +
    + + + + + + + + + + + + + + + + + +
    ПараметрОпис
    [+next+]Кнопка «Наступне»
    [+previous+]Кнопка «Попереднє»
    [+splitter+]Роздільник якщо завжди показується 0
    [+start+]Номер першої сторінки яка показуєтьсяtr> +
    [+urlStart+]Номер поточної сторінки, як показано в адресному рядку (?start=)
    [+stop+]Номер останньої показується сторінки
    [+total+]Загальна кількість сторінок
    [+pages+]Список сторінок
    [+currentPage+]Показується номер поточної сторінки
    [+perPage+]Відображених елементів на сторінці (равно display)
    [+totalPages+]Загальна кількість сторінок
    [+ditto_pagination_set+]1 якщо paginate ввімкнено
    [+item[x]+]Сформований висновок індивідуального документа
    +
    +
    +

    Плейсхолдери summary

    +
    +
    + + + + + + + +
    ПараметрОпис
    [+summary+]Поле анотація (введення) повністю, якщо вказано, або початкова частина вмісту сторінки
    [+link+]Посилання на повний текст. Текст посилання установливается параметром &trunctText. За замовчуванням з файлу мови Ditto
    +
    +
    +

    Плейсхолдери tagging

    +
    +
    + + + + + + + +
    ПараметрОпис
    [+tagLinks+]Список тегів, пов'язаних з документом, розділених &tagDelimiter
    [+tags+]На сторінці, що містить результат: теги, які використовуються для фільтрації відображуваних документів
    +
    +
    +

    Плейсхолдери dateFilter

    +
    +
    + + + + + + + + + +
    ПараметрОпис
    [+year+]Рік для фільтра. Двох або чотирьох значне значення
    [+month+]Місяць для фільтра
    [+day+]День для фільтра
    [+month_numeric+]Чисельне значення місяця
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/04_\320\227\320\260\321\201\321\202\320\276\321\201\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/04_\320\227\320\260\321\201\321\202\320\276\321\201\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..ba7f8eb9 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/04_\320\227\320\260\321\201\321\202\320\276\321\201\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,14 @@ + + +

    Ditto: Застосування

    +Ditto це потужний інструмент для створення блогу, виведення блоків новин, каталогу товарів, пагінації, показу короткої версії статті, генерування архівів та сортування по заголовку. +
    +

    Ditto - сніпет для групування та структурування інформації з різних документів в необхідному вигляді. З його допомогою можна реалізувати:

    +
      +
    • блог
    • +
    • список статей, новин, посилання
    • +
    • архів новин
    • +
    • каталог товарів, сайтів, файлів і т.д.
    • +
    • RSS, XML, JSON, ATOM дані
    • +
    • багато інших форматів виводу, завдяки повній підтримці шаблонів
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/05_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/05_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..11cf5919 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/05_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,114 @@ + + +

    Ditto: Шаблони

    +Шаблони сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tpl=`news`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: &tpl
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplAlt=`news_alt`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: &tpl
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplCurrentDocument=`news_current`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: &tpl
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplFirst=`news_first`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: &tpl
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplLast=`news_last`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: ні
    +Примітка: Доступні плейсхолдери:
    +[+ditto+] +або його аналог +[+wrapper+]
    +

    Приклад:

    +
    &outerTpl=`<ul>[+ditto+]</ul>`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/06_\320\225\320\272\321\201\321\202\320\265\320\275\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/06_\320\225\320\272\321\201\321\202\320\265\320\275\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..b566150b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/06_\320\225\320\272\321\201\321\202\320\265\320\275\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,581 @@ + + +

    Ditto: Екстендери

    +Екстендери сніпета Ditto це додаткові розширення які дозволяють вирішувати додаткові завдання. +
    +

    Екстендери - це додаткові розширення, які дозволяють вирішувати додаткові завдання. Всі екстендери Ditto лежать в папці assets/snippets/ditto/extenders/.

    +

    dateFilter

    +
    +

    Опис: Призначений для фільтрації документів по даті, може використовуватися разом зі сніпетом Reflect.

    +

    Параметри: &dateFilterSource, &dateFilterDefault, &month, &year, &day

    +

    Плейсхолдери: [+year+], [+month+], [+day+], [+month_numeric+]

    +

    Приклад:

    +
    +
    +
    +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + +
    +

    Застосування

    +
    Автор: Admin від 19.03.2015
    +
    Ditto це потужний інструмент для створення блогу, виведення блоків новин, каталогу товарів, пагінації, показу короткої версії статті, генерування архівів та сортування по заголовку.
    +
    +
    +

    Параметри

    +
    Автор: Admin від 19.03.2015
    +
    Параметри сніпета Ditto.
    +
    +
    +

    Шаблони

    +
    Автор: Admin від 19.03.2015
    +
    Шаблони сніпета Ditto.
    +
    +
    +

    Параметри пагінації

    +
    Автор: Admin від 19.03.2015
    +
    Параметри пагінації сніпета Ditto.
    +
    +
    +

    Параметри summary

    +
    Автор: Admin від 19.03.2015
    +
    Параметри summary сніпета Ditto.
    +
    +
    +

    Параметри dateFilter

    +
    Автор: Admin від 19.03.2015
    +
    Параметри dateFilter сніпета Ditto.
    +
    +
    +

    Параметри tagging

    +
    Автор: Admin від 19.03.2015
    +
    Параметри tagging сніпета Ditto.
    +
    +
    +

    Параметри request

    +
    Автор: Admin от 19.03.2015
    +
    Завдяки екстендерів request сніпет Ditto обробляє значення і виводить результат відповідно до переданих параметрів.
    +
    +
    +

    Параметри glossaryFilter

    +
    Автор: Admin від 19.03.2015
    +
    Параметри glossaryFilter сніпета Ditto.
    +
    +
    +

    Параметри search

    +
    Автор: Admin від 19.03.2015
    +
    Параметри search сніпета Ditto.
    +
    +
    +

    Параметри tvFilter

    +
    Автор: Admin від 19.03.2015
    +
    Фільтрація по ТВ параметрам в сніпеті Ditto.
    +
    +
    +

    Плейсхолдери

    +
    Автор: Admin від 19.03.2015
    +
    У Дітто є свої власні пдейсхолдери плюс він підтримує змінні (поля), які використовуються в кожному документі.
    +
    +
    +

    Приклади

    +
    Автор: Admin від 19.03.2015
    +
    Приклади виклику сніпета Ditto.
    +
    +
    +

    Екстендери

    +
    Автор: Admin від 19.03.2015
    +
    Екстендери сніпета Ditto це додаткові розширення які дозволяють вирішувати додаткові завдання.
    +
    + +
    +
    +
    +
    +<form id="dateFilterForm" method="get" action="[~[*id*]~]">
    +	<select size="1" name="year">
    +		<option selected value="">-- рік --</option>
    +		<option value="2015">2015</option>
    +		<option value="2016">2016</option>
    +	</select>
    +	<select size="1" name="month">
    +		<option selected value="">-- місяць --</option>
    +		<option value="1">Січень</option>
    +		<option value="2">Лютий</option>
    +		<option value="3">Березень</option>
    +		<option value="4">Квітень</option>
    +		<option value="5">Травень</option>
    +		<option value="6">Червень</option>
    +		<option value="7">Липень</option>
    +		<option value="8">Серпень</option>
    +		<option value="9">Вересень</option>
    +		<option value="10">Жовтень</option>
    +		<option value="11">Листопад</option>
    +		<option value="12">Грудень</option>
    +	</select>
    +	<input type="submit" value="Ок" name="Submit">
    +</form>
    +<h3>[+year+] [+month+]</h3>
    +[!Ditto? &parents=`163` &extenders=`dateFilter` &dateSource=`createdon`!]
    +
    +

    где:

    +
      +
    • &extenders=`dateFilter` - ім'я використовуваного розширення
    • +
    • &dateSource=`createdon` - поле по якому буде відбуватися фільтрація
    • +
    +
    + +

    request

    +
    +

    Опис: Зміна параметрів Ditto через URL.

    +

    Параметри: &stripTags, &bad, &good

    +

    Плейсхолдери: ні

    +

    Приклад:

    +
    +
    +
    +

    Сортувати за...

    +
    +
    +
    + + + + +
    +
    +
    +
    +

    Результат

    + + Екстендери
    Шаблони
    Приклади
    Застосування
    Плейсхолдери
    Параметри Пагінації
    Параметри tvFilter
    Параметри tagging
    Параметри summary
    Параметри search
    Параметри request
    Параметри glossaryFilter
    Параметри dateFilter
    Параметри
    +
    +
    +
    +
    +<form action="[~[*id*]~]" method="get">
    +	<p>Сортувати за...</p>
    +	<select name="ditto_id1_sortDir">
    +		<option value="">-- вибрати --</option>
    +		<option value="ASC">Зростанням</option>
    +		<option value="DESC">Зменшенням</option> 
    +	</select> 
    +	<input name="Submit" type="submit" value="Ок">
    +</form>
    +<h3>Результат</h3>
    +[!Ditto? &id=`id1` &parents=`163` &tpl=`@CODE:[+pagetitle+]<br>` &extenders=`request` &sortBy=`pagetitle`!]
    +

    где:

    +
      +
    • &extenders=`request` - ім'я використовуваного розширення
    • +
    • &sortBy=`pagetitle` - параметр, за яким проводиться сортування
    • +
    +
    + +

    summary

    +
    +

    Опис: Формування короткого опису і підстановка цього опису в плейсхолдер [+summary+].

    +

    Параметри: &truncSplit, &trunc, &truncAt, &truncLen, &truncOffset, &truncText, &tplTrunc.

    +

    Плейсхолдери: [+summary+], [+link+]

    +

    Приклад:

    +

    Вивести анотації до документів, але поле [+introtext+] у документів буде не у всіх. У шаблоні замість плейсхолдера [+introtext+] вставляємо плейсхолдер [+summary+], а виклик сніпета стане таким:

    +
    [!Ditto? &tpl=`@CODE:<h3>[+pagetitle+]</h3><p>[+summary+]</p><p>[+link+]</p>` &parents=`2` &extenders=`summary` &truncLen=`400` &truncText=`Докладніше...`!]
    +

    де:

    +
      +
    • &extenders=`summary` - ім'я використовуваного розширення
    • +
    • &truncLen=`400` - максимальна кількість відображуваних символів
    • +
    • &truncText=`Докладніше...` - текст посилання на докладний опис
    • +
    +
    + +

    tagging

    +
    +

    Опис: Фільтрація документів за тегами.

    +

    Параметри: &tagDocumentID, &tags, &tagMode, &tagDelimiter, &caseSensitive, &tagDisplayDelimiter, &tagSort, &tagData, &tagDisplayMode, &tplTagLinks, &tagCallback

    +

    Плейсхолдери: [+tagLinks+], [+tags+]

    +

    Екстендер tagging автоматично підключається при використанні параметра &tagData. Як значення параметра &tagData використовується ім'я TV-параметра з типом введення Text, Radio Options або Check Box. За замовчуванням, роздільником між тегами є пробіл. Змінити роздільник можна за допомогою параметра &tagDelimiter=`, `. Теги відображаються в плейсхолдере [+tagLinks+] у вигляді набору посилань.

    +
    +[!Ditto?
    +&parents=`4`
    +&tagData=`keyw`
    +&tagDelimiter=`,`
    +&tagDisplayDelimiter=`, `
    +&tpl=`@CODE:<h3>[+pagetitle+]<small>[+tagLinks+]</small></h3>`
    +&tagSort=`0`
    +&tagDocumentID=`[*id*]`!]
    +
    +

    де:

    +
      +
    • &tagData=`keyw` - поле документа або змінна шаблону, що містить теги
    • +
    • &tagDelimiter=`,` - роздільник між тегами
    • +
    • &tagDisplayDelimiter=`, ` - роздільник між тегами при їх виведенні
    • +
    • &tagSort=`0` - відключаємо сортування тегів за алфавітом
    • +
    • &tagDocumentID=`[*id*]` - ID документа, де буде виводитися список відфільтрованих документів
    • +
    +
    + +

    andFilter

    +
    +

    Джерело: /assets/snippets/ditto/extenders/andFilter.extender.inc.php

    +
    +<?php
    +// ---------------------------------------------------
    +// Group: Filters
    +// The filter works with TV settings that have multiple values, checking for compliance with each
    +//**************************
    +// zk – http://nopreset.ru
    +//**************************
    +// Example call Ditto:
    +// [!Ditto? &startID=`42` &tpl=`tpl` &extenders=`andFilter` &andFilterTv=`color:green,red;size:L,XL,XXL` !] 
    +// – will return documents where all the red and green things the size L, XL and XXL ;)
    +// ---------------------------------------------------
    +
    +// If no fieldname value has been supplied, don't do anything else
    +if ($andFilterTv === false) {
    +	return false;
    +}
    +
    +global $tvsarray;
    +$tmparray = explode ( ';', $andFilterTv);
    +foreach ( $tmparray as $tmpvalue ) {
    +	$tmpexplode = explode ( ':', $tmpvalue );
    +	$tvsarray[] = $tmpexplode;
    +	$filtertvs .= (empty($filtertvs)?"":",") . $tmpexplode[0];
    +}
    +
    +$filters["custom"]["andFilter"] = array( $filtertvs, "andFilter"); 
    +
    +if (!function_exists("andFilter")) {
    +	function andFilter($resource) {
    +		global $modx,$tvsarray;
    +		$good = true;
    +		foreach ( $tvsarray as $tv ) {
    +			$values = explode( ',', $tv[1] );
    +			if( array_search($resource[$tv[0]], $values) !== false  ){
    +				$good = $good && true;
    +			} else {
    +				$good = $good && false;
    +			}
    +		}
    +		if ($good) { return 1; } else { return 0; }
    +	}
    +}
    +?>
    +
    +

    Ще є невеликий код для програмного формування фільтрів, я їх передаю через масив в GET з такими ж назвами як TV-параметри. (Але у Дітто є баг з масивами, так що потрібно або фіксують Дітто, або виправляти на POST):

    +
    +<?php
    +//$array_param = array ( 'tv1', 'tv2' .. )
    +function andFilterTvGet ( $array_param ) {
    +	foreach ( $array_param as $param ) {
    +		if (!is_array($_GET[$param])) continue;
    +		$andfilter .= (empty($andfilter)?"":";") . $param . ':';
    +		$params = '';
    +		foreach ($_GET[$param] as $value) {
    +			$param_g = htmlspecialchars($value);
    +			if ( !empty($param_g) ) $params .= (empty($params)?"":",") . $param_g; 
    +		}
    +		$andfilter .= $params;
    +	}
    +	return $andfilter;
    +}
    +
    +

    Опис: Фільтрація по TV-параметру, що має кілька значень. Перевірка на відповідно кожному значенню.

    +

    Параметри: &andFilterTv.

    +

    Плейсхолдери: ні.

    +

    Приклад: Вивести товари червоного і зеленого кольору, розмірів L, XL і XXL

    +
    [!Ditto? &tpl=`tpl` &parents=`2` &extenders=`andFilter` &andFilterTv=`color:зелений, червоний;size:L,XL,XXL`!]
    +

    де:

    +
      +
    • &extenders=`andFilter` - ім'я використовуваного розширення
    • +
    • &andFilterTv=`color:зелений, червоний;size:L,XL,XXL` - параметри, за якими відбувається фільтрація документів.
    • +
    +
    + +

    countDocs

    +
    +

    Опис: Підрахунок кількості документів.

    +

    Обов'язкові параметри: ні.

    +

    Плейсхолдери: [+count+]

    +

    Приклад: Вивести загальну кількість документів в контейнерах 3,4,5:

    +
    [!Ditto? &tpl=`@CODE:[+count+]` &parents=`3,4,5` &extenders=`countDocs` &display=`1`!]
    +

    де:

    +
      +
    • &extenders=`countDocs` - ім'я використовуваного розширення
    • +
    • &display=`1` - встановлюємо значення рівне 1, так як нам необхідно вивести тільки один раз.
    • +
    +
    + +

    distinct

    +
    +

    Джерело: distinct

    +

    Опис: Повертає тільки унікальні результати полів, зазначених в якості значення параметра &distinct=`param1,param2`.

    +

    Параметри: &distinct

    +

    Плейсхолдери: ні

    +

    Приклад: отримати тільки унікальні заголовки сторінок для кожної дати.

    +
    [!Ditto? &parents=`4` &extenders=`distinct` &distinct=`pagetitle,pub_date`!]
    +

    де:

    +
      +
    • &extenders=`distinct` - ім'я використовуваного розширення
    • +
    • &distinct=`pagetitle,pub_date` - параметри, за якими проводиться фільтрація
    • +
    +
    + +

    customsort або nosort

    +
    +

    Джерело: Створити екстендер в assets/snippets/ditto/extenders/ з ім'ям customsort.extender.inc.php і наступним вмістом:

    +
    +<?php
    +if(!function_exists('customsort')){
    +	function customsort($a, $b){
    +		$pos_a=array_search($a['id'],$GLOBALS['documents']);
    +		$pos_b=array_search($b['id'],$GLOBALS['documents']);
    +		if($pos_a == $pos_b){
    +			return 0;
    +		}
    +		return($pos_a < $pos_b)?-1:1;
    +	}
    +}
    +$GLOBALS['documents']=explode(',',$documents);
    +$orderBy["custom"][] = array("id", "customsort");
    +$ditto->advSort = true;
    +?>
    +
    +

    Опис: Призначений для користувача порядок сортування документів в параметрі &documents.

    +

    Параметри: &documents

    +

    Плейсхолдери: ні

    +

    Приклад: вивести список документів в строго заданому порядку.

    +
    [!Ditto? &parents=`4` &extenders=`customsort` &documents=`40,46,47,35,36,37,44,41,43,49,48,50,54,53`!]
    +

    де:

    +
      +
    • &extenders=`customsort` - ім'я використовуваного розширення
    • +
    • &documents=`40,46,47,35,36,37,44,41,43,49,48,50,54,53` - заданий порядок виведення документів
    • +
    +
    + +

    glossaryFilter

    +
    +

    Джерело: glossaryFilter

    +

    Опис: просунута фільтрація документів.

    +

    Параметри: &filterVar, &filterMode, &filterBy, &forceUTF8

    +

    Плейсхолдери: ні

    +

    Приклад: фільтрація документів за першими літерами алфавіту.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +<?php
    +$allowed_req = array(
    +	# 'label-for-button-or-link' => 'actual-value-for-regex-clause',
    +	'A' => 'A',
    +	'B' => 'B',
    +	'C' => 'C',
    +	'D' => 'D',
    +	'E' => 'E',
    +	'F' => 'F',
    +	'G' => 'G',
    +	'H' => 'H',
    +	'I' => 'I',
    +	'J' => 'J',
    +	'K' => 'K',
    +	'L' => 'L',
    +	'M' => 'M',
    +	'N' => 'N',
    +	'O' => 'O',
    +	'P' => 'P',
    +	'Q' => 'Q',
    +	'R' => 'R',
    +	'S' => 'S',
    +	'T' => 'T',
    +	'U' => 'U',
    +	'V' => 'V',
    +	'W' => 'W',
    +	'X' => 'X',
    +	'Y' => 'Y',
    +	'Z' => 'Z',
    +	'0-9' => '0|1|2|3|4|5|6|7|8|9', 
    +	'Все' => 'A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z',
    +);
    +$cur_filter = isset($_POST['filter']) && isset($allowed_req[$_POST['filter']]) && $allowed_req[$_POST['filter']] ? $allowed_req[$_POST['filter']] : '';
    +$index = '<form method="post" action="ditto/ekstendery">';
    +
    +foreach ($allowed_req as $label => $request){
    +	if ($request) {
    +		$index .= '<input type="submit" name="filter" value="' . $label . '"' . ($request == $cur_filter ? ' disabled' : '') . '>' . ' ';
    +	}
    +}
    +
    +$index .= '<input type="submit" name="clear" value="Очистити"></form>';
    +
    +$params['parents']='4';
    +$params['orderBy']='pagetitle ASC';
    +$params['filterVar']='pagetitle';
    +$params['filterBy']= $cur_filter;
    +$params['depth']='1';
    +$params['extenders']='glossaryFilter';
    +
    +$custom_filter = $modx->runSnippet('Ditto',$params);
    +return $index . ($cur_filter ? $custom_filter : '');
    +?>
    +
    +
    + +

    jotcount

    +
    +

    Опис: кількість коментарів Jot до певної сторінці в шаблоні Ditto.

    +

    Параметри: ні

    +

    Плейсхолдери: [+jotcount+]

    +

    Приклад: вивести кількість коментарів.

    +
    [!Ditto? &parents=`4` &extenders=`jotcount` &tpl=`@CODE:<h3>[+pagetitle+] <small>[+jotcount+]</small></h3>`!]
    +

    де:

    +
      +
    • &extenders=`jotcount` - ім'я використовуваного розширення
    • +
    +
    + +

    jotdatesort

    +
    +

    Опис: інформація про коментарі Jot до певної сторінці в шаблоні Ditto.

    +

    Параметри: &jotfilter, &jotauthorfield

    +

    Плейсхолдери: [+jotcount+], [+jotlastdate+], [+jotlastauthor+]

    +

    Приклад: вивести кількість коментарів.

    +
    +[!Ditto?
    +&parents=`4`
    +&extenders=`jotdatesort`
    +&tpl=`@CODE:<h3><a href="[~[+id+]~]">[+title+]</a></h3>Кількість коментарів: [+jotcount+]<br />Автор коментаря: [+jotlastauthor+]<br />Дата останнього коментаря: [+jotlastdate:date=`%d.%m.%Y, %H:%M:%S`+]<br />Дата поста: [+date+]<br />Автор поста: [+author+]`
    +&jotfilter=`1`
    +&jotauthorfield=`Гість`!]
    +
    +

    де:

    +
      +
    • &extenders=`jotdatesort` - ім'я використовуваного розширення
    • +
    • &jotfilter=`1` - не виводити без коментарів
    • +
    • &extenders=`jotdatesort` - ім'я автора коментаря (гостя)
    • +
    +
    + +

    level

    +
    +

    Опис: висновок документів певного рівня.

    +

    Параметри: &level

    +

    Плейсхолдери: ні

    +

    Приклад: вивести кількість коментарів.

    +
    [!Ditto? &parents=`4` &extenders=`level` &depth=`3` &level=`3`!]
    +

    де:

    +
      +
    • &extenders=`level` - ім'я використовуваного розширення
    • +
    • &depth=`3` - глибина сканування
    • +
    • &level=`3` - вивести документи 3-го рівня
    • +
    +
    +

    search

    +
    +

    Опис: пошук на Ditto.

    +

    Параметри: &searchFields, &searchOptions, &searchString, &searchOptionsSeparators

    +

    Плейсхолдери: ні

    +

    Приклад:

    +
    [!Ditto? &parents=`4` &extenders=`search` &searchString=`my search string` &searchFields=`content,tv1,tv2` &searchOptions=`caseSensitive` ...`!]
    +

    де:

    +
      +
    • &extenders=`search` - ім'я використовуваного розширення
    • +
    • &searchString=`my search string` - пошуковий запит
    • +
    • &searchFields=`content,tv1,tv2` - поля і змінні шаблону, за якими відбувається пошук
    • +
    • &searchOptions=`caseSensitive` - проводити пошук з урахуванням регістру
    • +
    +
    + +

    tvFilter

    +
    +

    Опис: фільтрація документів по заданим TV.

    +

    Параметри: &tvFilterBy, &tvFilterMode

    +

    Плейсхолдери: ні

    +

    Приклад: показати всі дочірні документи контейнерів 3, 4 і 5, до яких прив'язаний TV-параметр dummy.

    +
    [!Ditto? &parents=`3,4,5` &extenders=`tvFilter` &tvFilerBy=`dummy` &tvFilterMode=`0`!]
    +

    де:

    +
      +
    • &extenders=`tvFilter` - ім'я використовуваного розширення
    • +
    • &tvFilerBy=`dummy` - ім'я TV-параметра, за яким відбувається фільтрація
    • +
    • &tvFilterMode=`0` - виключити документи, до яких НЕ прив'язаний TV-параметр dummy
    • +
    +
    + +

    multiTvFilter

    +
    +

    Опис: фільтрація рядків змінної шаблону multiTv.

    +

    Параметри: &multiTvFilterBy, &multiTvFilterOptions

    +

    Плейсхолдери: ні

    +

    Приклад: показати всі дочірні документи контейнерів 3, 4 і 5, у яких змінна шаблону multiTv event в стовпці title не містить Important.

    +
    +[!Ditto?
    +&parents=`3,4,5`
    +&extenders=`@FILE assets/tvs/multitv/dittoExtender/multitvfilter.extender.inc.php`
    +&multiTvFilterOptions=`[{"name":"title","type":"text","value":"Important","mode":"contains"}]`!]
    +
    +

    де:

    +
      +
    • &extenders=`@FILE assets/tvs/multitv/dittoExtender/multitvfilter.extender.inc.php` - ім'я використовуваного розширення
    • +
    • &multiTvFilterBy=`event` - ім'я змінної шаблону multiTv, по якій відбувається фільтрація
    • +
    • &multiTvFilterOptions=`[{"name":"title","type":"text","value":"Important","mode":"contains"}]` - виключити елементи, у яких в стовпці title не міститься Important
    • +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/07_dateFilter.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/07_dateFilter.md" new file mode 100644 index 00000000..7c28ce18 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/07_dateFilter.md" @@ -0,0 +1,81 @@ + + +

    Ditto: Параметри dateFilter

    +Параметри dateFilter сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: get, params, name of $_REQUEST variable
    +Значення за замовчуванням: get
    +Примітка:
    +

    Приклад:

    +
    &dateFilterSource=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1 | 2 | 3
    +Значення за замовчуванням: 0
    +Примітка: 0,1,2,3 (Вимкнено, поточний рік, поточний місяць, сьогодні)
    +

    Приклад:

    +
    &dateFilterDefault=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: Чисельне значення місяця
    +Значення за замовчуванням: ні
    +Примітка: Чисельне значення місяця
    +

    Приклад:

    +
    &month=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: Рік (2 або 4-значний)
    +Значення за замовчуванням: ні
    +Примітка:
    +

    Приклад:

    +
    &year=`2012`
    +
    +
    +
    + +
    + +
    +
    +Формат: День місяця
    +Значення за замовчуванням: ні
    +Примітка:
    +

    Приклад:

    +
    &day=`25`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/08_glossaryFilter.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/08_glossaryFilter.md" new file mode 100644 index 00000000..73287825 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/08_glossaryFilter.md" @@ -0,0 +1,68 @@ + + +

    Ditto: Параметри glossaryFilter

    +Параметри glossaryFilter сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: поле документа | TV-параметр
    +Значення за замовчуванням: pagetitle
    +Примітка: ВАЖЛИВО! Вам краще уникати використання поля content, або робити це обережно
    +

    Приклад:

    +
    &filterVar=``
    +
    +
    +
    + +
    + +
    +
    +Формат: class | custom | chunk
    +Значення за замовчуванням: class
    +Примітка: class (default) - match with RegExp /^[...]/i where ... is substituted with the value of filterBy parameter +
    custom - match with full-fledged RegExp provided with filterBy parameter +
    chunk - match with full-fledged RegExp privided with a chunk whose name is kept within filterBy parameter
    +

    Приклад:

    +
    &filterMode=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &filterBy=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &forceUTF8=`1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/09_\320\237\320\260\320\263\321\226\320\275\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/09_\320\237\320\260\320\263\321\226\320\275\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..1aef409f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/09_\320\237\320\260\320\263\321\226\320\275\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,169 @@ + + +

    Ditto: Параметри пагінації

    +Параметри пагінації сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: На кожній сторінці виведеться &show документів. Для виведення пейджера використовуються глобальні плейсхолдери:
    +[+next+] – Кнопка «Наступне»
    +[+previous+] – Кнопка «Попереднє»
    +[+pages+] – Список сторінок
    +[+totalPages+] – Загальна кількість сторінок
    +[+start+] – Номер першої сторінки, яка показується
    +[+stop+] – Номер останньої сторінки, яка показується
    +[+currentPage+] – Номер поточної сторінки, яка показується
    +[+total+] – Загальна кількість сторінок
    +

    Приклад:

    +
    &paginate=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: У разі якщо сторінки для переходу немає (крайні сторінки), то посилання Previous або Next буде показана у вигляді тексту без посилання і буде укладена в тег <spanclass="ditto_off">Privious</span>
    +0 - показувати посилання Next і Previous тільки тоді, якщо існують сторінки для переходу
    +1 - завжди показувати посилання Next і Privious
    +

    Приклад:

    +
    &paginateAlwaysShowLinks=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: символ (або рядок)
    +Значення за замовчуванням: |
    +Примітка: Символ для поділу Previous і Next, коли paginateAlwaysShowLinks вимкнений і є обидва посилання. Запобігає показ посилань у вигляді <Previous Next>, коли [+pages+] не використовується
    +

    Приклад:

    +
    &paginateSplitterCharacter=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplPaginateCurrentPage=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplPaginateNext=`newsPaginateNext`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplPaginatePrevious=`newsPaginatePrevious`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FIL
    +

    Приклад:

    +
    &tplPaginateNextOff=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplPaginatePage=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: LANG
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplPaginatePreviousOff=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/10_Request.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/10_Request.md" new file mode 100644 index 00000000..95d340d5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/10_Request.md" @@ -0,0 +1,51 @@ + + +

    Ditto: Параметри request

    +Завдяки екстендеру request, сніпет Ditto обробляє значення і виводить результат відповідно до переданих параметрів. +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &stripTags=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: Параметри Ditto через кому
    +Значення за замовчуванням: seeThroughtUnpub, showInMenuOnly, showPublishedOnly, debug, start, config, extenders, dittoID
    +Примітка:
    +

    Приклад:

    +
    &bad=``
    +
    +
    +
    + +
    + +
    +
    +Формат: Параметри Ditto через кому
    +Значення за замовчуванням: Всі параметри, які не ввійшли в список bad
    +Примітка:
    +

    Приклад:

    +
    &good=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/11_Search.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/11_Search.md" new file mode 100644 index 00000000..223fa36c --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/11_Search.md" @@ -0,0 +1,68 @@ + + +

    Ditto: Параметри search

    +Параметри search сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: список полів через кому
    +Значення за замовчуванням: content
    +Примітка:
    +

    Приклад:

    +
    &searchFields=`content,tv1,tv2`
    +
    +
    +
    + +
    + +
    +
    +Формат: caseSensitive | regex | snippet
    +Значення за замовчуванням: ні
    +Примітка: caseSensitive - проводити пошук з урахуванням регістру
    +regex - пошук з регулярними виразами
    +snippet - використання фрагментів для отримання результатів
    +

    Приклад:

    +
    &searchOptions=`caseSensitive`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок | @FILE | @CHUNK
    +Значення за замовчуванням: порожньо
    +Примітка: JSON рядок з роздільниками для списку опцій.
    +

    Приклад:

    +
    &searchString=`@CHUNK regexSearchChunk`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок | @FILE | @CHUNK
    +Значення за замовчуванням: '{"outer":",","inner":"="}'
    +Примітка:
    +

    Приклад:

    +
    &searchOptionsSeparators=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/12_Summary.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/12_Summary.md" new file mode 100644 index 00000000..ee6abd1a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/12_Summary.md" @@ -0,0 +1,115 @@ + +

    Ditto: Параметри summary

    +Параметри summary сніпета Ditto. +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &truncSplit=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +0 - викл
    +1 - вкл
    +

    Приклад:

    +
    &trunc=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: <!-- splitter -->
    +Примітка: Будь унікальний текст або код, який міститься в змісті кожного документа
    +

    Приклад:

    +
    &truncAt=``
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 300
    +Примітка: Будь-яке число більше ніж &truncOffset
    +

    Приклад:

    +
    &truncLen=`800`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 30
    +Примітка: Будь-яке число не перевищує &truncLen
    +

    Приклад:

    +
    &truncOffset=`50`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: Read more...
    +Примітка: Будь-який текст або уривок html-коду
    +

    Приклад:

    +
    &truncText=`Читати далі...`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: &truncText
    +Примітка:
    +Будь-яка валідна назва чанка
    +Код через @CODE
    +Файл через @FILE
    +

    Приклад:

    +
    &tplTrunc=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/13_Tagging.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/13_Tagging.md" new file mode 100644 index 00000000..999ab2f1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/13_Tagging.md" @@ -0,0 +1,176 @@ + + +

    Ditto: Параметри tagging

    +Параметри tagging с +пета Ditto. +
    +
    +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &tagDocumentID=``
    +
    +
    +
    + +
    + +
    +
    +Формат: Будь-які допустимі теги, розділені за допомогою tagDelimiter
    +Значення за замовчуванням: немає
    +Примітка: Будь-які допустимі теги, розділені за допомогою tagDelimiter
    +

    Приклад:

    +
    &tags=``
    +
    +
    +
    + +
    + +
    +
    +Формат: onlyAllTags | onlyTags | removeAllTags | removeTags
    +Значення за замовчуванням: onlyTags
    +Примітка:
    onlyAllTags показує документи, що містять всі теги з параметра tags +
    onlyTags — показує документи, які мають будь-який з тегів tags +
    removeAllTags — видалити документи, які містять всі теги tags +
    removeTags — видалити документи, які мають будь-який з тегів tags
    +

    Приклад:

    +
    &tagMode=`onlyAllTags`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: пробіл
    +Примітка: Будь-який символ, що не міститься в тегах
    +

    Приклад:

    +
    &tagDelimiter=`, `
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: 1 - вкл., 0 - викл.
    +

    Приклад:

    +
    &caseSensitive=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: значення параметра tagDelimiter
    +Примітка:
    +

    Приклад:

    +
    &tagDisplayDelimiter=`, `
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &tagSort=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: Поле документа або змінна шаблону
    +Значення за замовчуванням: немає
    +Примітка: автоматично додає в позначки Extender
    +

    Приклад:

    +
    &tagData=`tags`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 2
    +Значення за замовчуванням: 1
    +Примітка:
    1 - рядок з посиланнями і роздільником tagDisplayDelimiter) +
    2 - UL/LI перелік
    +

    Приклад:

    +
    &tagDisplayMode=`2`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: немає
    +Примітка:
    +

    Приклад:

    +
    &tplTagLinks=``
    +
    +
    +
    + +
    + +
    +
    +Формат: будь-яке припустиме ім'я функції
    +Значення за замовчуванням: немає
    +Примітка:
    +

    Приклад:

    +
    &tagCallback=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/14_tvFilter.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/14_tvFilter.md" new file mode 100644 index 00000000..3558b460 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/14_tvFilter.md" @@ -0,0 +1,37 @@ + + +

    Ditto: Параметри tvFilter

    +Фільтрація по ТБ параметрам в сніпеті Ditto. +
    +
    +
    + +
    +
    +Формат: TV-параметр
    +Значення за замовчуванням: порожньо
    +Примітка:
    +

    Приклад:

    +
    &tvFilterBy=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка: 1 - виключає документи, до яких прив'язаний TV-параметр
    +0 - виключає документи, до яких не прив'язаний TV-параметр
    +

    Приклад:

    +
    &tvFilterMode=`0`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/15_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/15_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..98a405b0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/15_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,56 @@ + + +

    Ditto: Приклади

    +Приклади виклику сніпета Ditto. +
    +

    Простий виклик

    +
    [!Ditto? &tpl=`news_tpl` &parents=`2`!] // некешований виклик
    +[[Ditto? &tpl=`news_tpl` &parents=`2`]] // кешований виклик
    +

    де:

    +

    &tpl=`news_tpl` - шаблон виводу документів

    +

    &parents=`2` - ID папки в якій знаходяться оброблювані документи

    + +

    Сортування документів

    +
    [!Ditto? &tpl=`news_tpl` &parents=`2` &orderBy=`pagetitle ASC`!]
    +

    где:

    +

    &orderBy=`ASC pagetitle` - сортувати по зростанням по полю заголовка документів

    + +

    Пагінація

    +
    [!Ditto? &tpl=`news_tpl` &parents=`2` &id=`news` &paginate=`1` &display=`10`!]
    +<div class="pagination">
    +Сторінка [+news_currentPage+] з [+news_totalPages+] [+news_previous+][+news_pages+][+news_next+]
    +</div> 
    +

    де:

    +

    &id=`news` - ідентифікатор Ditto. Повинен бути унікальним для кожного з викликів Ditto з посторінковим розбиттям. Необхідний для коректної роботи посторінкових плейсхолдеров, якщо на сторінці використовуються і інші виклики сніпета Ditto

    +

    &paginate=`1` - включаємо посторінкове розбиття

    +

    &display=`10` - кількість відображуваних документів на кожній сторінці

    +

    При використанні ідентифікатора при посторінковому розбитті, ідентифікатор повинен бути доданий в якості суфікса до плейсхолдерів у пагінацію, тобто в даному випадку плейсхолдер [+pages+] повинен перетворитися в [+news_pages+].

    + +

    Висновок дати

    +
    [!Ditto? &tpl=`news_tpl` &parents=`2` &dateSource=`pub_date` &dateFormat=`%d.%m.%Y`!]
    +

    де:

    +

    &dateSource=`pub_date` - джерело, що визначає значення плейсхолдера [+date+], що використовується в шаблоні news_tpl

    +

    &dateFormat=`%d.%m.%Y` - визначає формат часу, яке виводиться за допомогою плейсхолдера [+date+] згідно з правилами функції PHP - strftime.

    + +

    Фільтрація документів

    +
    [!Ditto? &tpl=`news_tpl` &parents=`2` &filter=`id,10,2|id,20,2`!]
    +

    де:

    +

    &filter=`id,10,2|id,20,2` - виключає документи з id 10 і 20

    + +

    Виклик в сніпеті

    +
    +$modx->runSnippet(
    +	'Ditto', 
    +	array(
    +		'startID' => 34,33,37,35,36,
    +		'summarize' => 9,
    +		'tpl' => 'portfolioTpl',
    +		'dateFormat' => '%d.%m.%Y',
    +		'dateSource' => 'pub_date',
    +		'display' => 9,
    +		'paginate' => 1,
    +		'paginateAlwaysShowLinks' => 1,
    +		'filter' => 'year,'.$_GET['year'].',1'
    +	)
    +);
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/index.md" new file mode 100644 index 00000000..838b9ae6 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Ditto/index.md" @@ -0,0 +1,4 @@ + + +

    Ditto Створення стрічки новин або блогу, каталогу товарів, сортування і тощо.

    +Ditto MODX Evo - потужний інструмент для створення блогу, блоків новин, каталогу товарів, розбивка на сторінки, створення короткої версії статті, генерування архівів, сортування за назвою. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \320\262\320\270\320\261\321\226\321\200\320\272\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \320\262\320\270\320\261\321\226\321\200\320\272\320\270.md" new file mode 100644 index 00000000..a154cd98 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \320\262\320\270\320\261\321\226\321\200\320\272\320\270.md" @@ -0,0 +1,357 @@ +# Параметри вибірки + ++ [Основні параметри вибірки](#params) ++ [Вибірка з TV-параметрами](#tv) ++ [Сортування](#sort) ++ [Сортування по TV-параметрам](#tv-sort) ++ [Додаткові дані](#other) + +## Основні параметри + +### controller + +Задає клас для вибірки даних. Базові класи (розташовані в папці `DocLister/core/controller/`): + +* `site_content` - для роботи з документами MODX; +* `shopkeeper` - для роботи з каталогом `Shopkeeper`; +* `onetable` - для роботи з довільними таблицями; +* `site_content_tags` - висновок документів MODX з фільтрацією за тегами в зв'язці з плагіном `TagSaver`. + +Значення за замовчуванням - `site_content` + +### idType + +Тип вибірки документів. Можливі значення - `parents, documents`. + +Список документів підставляється в запит буде обраний з параметра, ім'я якого збігається зі значенням даного параметра. + +Щоб уникнути непорозумінь рекомендується завжди явно визначати цей параметр. Особливо актуально, коли одночасно будуть використовуватися установки `parents` і `documents`. + +Значення за замовчуванням - `parents` + +### parents + +Вибірка документів на підставі списку батьківських документів. + +Можливі значення - значення `id` батьківських документів, розділені комою. + +Значення за замовчуванням - `id` сторінки, на якій викликається сніпет. + +### documents + +Вибірка довільних документів. + +Якщо використовується параметр `parents__`, то документи перераховані в цьому параметрі будуть просто підмішані в результат і схильні до наступниx правилаx вибірки (фільтрація, сортування). + +Можливі значення - значення `id` документів, розділені комою. + +### ignoreEmpty + +Дозволяє зробити вибірку всіх записів з таблиці, якщо параметр documents не заданий. Параметр `idType` в цьому випадку повинен бути `documents`. + +Можливі значення - `1` або `0`. + +За замовчуванням - `0`. + +### display + +Максимальне число документів при вибірці. + +Можливі значення - ціле число, яке більше або дорівнює нулю. + +Може бути перевизначити значенням параметра `queryLimit`. + +Значення за замовчуванням - `0`. + +### queryLimit + +Максимальне число документів при вибірці. + +Можливі значення - ціле число, яке більше або дорівнює нулю. + +Значення за замовчуванням - `0`. + +### depth + +Глибина вибірки з використанням параметра parents. + +Можливі значення - ціле число, яке більше або дорівнює нулю. + +Значення за замовчуванням - `0`. + +### offset + +Число документів, що пропускаються з початку списку перевизначаються при використанні пагінації Якщо ж потрібно завжди пропускати документи, то необхідно використовувати параметр `start`. + +Можливі значення - ціле число, яке більше або дорівнює нулю. + +Значення за замовчуванням - `0`. + +### start + +Число документів, що пропускаються з початку вибірки, складається зі значенням `offset`, автоматично встановлюються при пагінації. + +Можливі значення - ціле число, яке більше або дорівнює нулю. + +Значення за замовчуванням - `0`. + +### total + +Максимальне число документів відображається на одній сторінці в вибірці. + +Можливі значення - ціле число, яке більше або дорівнює нулю. + +Значення за замовчуванням - `0`. + +### addWhereList + +Додаткові умови вибірки документів. Будь-який рядок задовольняє вимоги рядка для підстановки в `WHERE` блок SQL запиту. + +Значення за замовчуванням - `пусто`. + +### showParent + +Вилучення документів з яких робилася вибірка з використанням параметра `parents`. + +Можливі значення: + +* `0` - примусове ігнорування батьків у вибірці; +* `1` - примусове додавання батька в вибірку; +* `-1` - ігноруються тільки батьки, зазначені в параметрі `parents`. + +Значення за замовчуванням - `0`. + +### selectFields + +Імена полів, що включаються до вибірки. + +Значення за замовчуванням - `порожньо`. + +### groupBy + +Групування результатів по якомусь полю. + +Значення за замовчуванням - визначається в контролері + +##Параметри вибірки для довільних таблиць (контролер `onetable`) + +### table + +Ім'я таблиці по якій буде здійснюватися вибірка. Якщо в таблиці `PrimaryKey` відрізняється від `id`, то необхідно додатково поставити ім'я цього поля в параметрі `idField`. + +Можливі значення - будь-яке ім'я таблиці без префікса таблиць MODX. + +Значення за замовчуванням - `site_content` + +### idField + +Ім'я поля `PrimaryKey`. Документи, зазначені через параметр `documents`, будуть вибиратися по цьому полю. + +Можливі значення - будь-яке ім'я поля доступного в таблиці, зазначеної через параметр `table`. + +Значення за замовчуванням - `id` + +### parentField + +Ім'я поля в якому зберігаються значення `idField` батьківських документів. Використовується при вибірці документів з параметра `parents`. + +Можливі значення - будь-яке ім'я поля доступного в таблиці, зазначеної через параметр `table`. + +Значення за замовчуванням - `parent`. + +## Вибірка з TV-параметрами + +### tvPrefix + +Префікс для плейсхолдерів створюваних з імен TV-параметрів. + +Значення за замовчуванням - `tv` + +### tvList + +Список TV-параметрів, які повинні бути в вибірці. + +Можливі значення - імена TV-параметрів, розділені комою. + +Значення за замовчуванням - `пусто`. + +### renderTV +TV-параметри, значення яких необхідно підготувати до відображення відповідно до встановлених віджетами. TV параметри яких немає в значенні параметра `tvList` будуть проігноровані. + +Можливі значення - `*` або список імен TV параметрів, розділений комою. + +Значення за замовчуванням - `пусто`. + +## Сортування + +### sortType + +Значення sortType визначає режим сортування. Якщо не задано, то проводиться сортування по критеріям, зазначеним у параметрах orderBy або sortBy і sortDir + +Можливі значення: + +* `none` - автоматичне сортування правилами MySQL (зазвичай по primary key); +* `doclist` - висновок документів в тому порядку, в якому вони передані в сніпет через параметр documents; + +Значення за замовчуванням - `none`. + +### orderBy + +Єдиний рядок сортування (як мінімум сукупність параметрів `sortBy` і `sortDir`, але має більший пріоритет). + +Можливі значення - будь-який рядок задовольняє правилам побудови параметра `ORDER BY` в SQL запиті. При сортуванні в контролері `site_content` бажано використовувати префікс `c.` для полів таблиці `site_content`. Імена TV-параметрів вказуються як є. + +Для сортування у випадковому порядку значення параметра `orderBy` буде `RAND()`. + +Значення за замовчуванням - `id DESC` (або визначається в контролері) + +### sortBy + +Критерії сортування без напряму. + +Можливі значення - будь-який рядок задовольняє правила побудови параметра `ORDER BY` в SQL запиті. Імена TV-параметрів вказуються як є. + +Значення за замовчуванням - `пусто`. Значення за замовчування може бути жорстко задано в контролері. + +### order + +Напрямок сортування. + +Можливі значення - `ASC`, `DESC`. Значення даного параметра може бути перевизначеним значенням параметра `sortDir`. + +Значення за замовчуванням - `DESC`. + +### sortDir + +Синонім параметра order, але має більший пріоритет. Якщо встановлені два параметри: `order` і `sortDir`, то буде використовуватися значення параметра `sortDir`. + +Можливі значення - `ASC`, `DESC`. + +Значення за замовчуванням - `DESC` (або визначається в контролері). + +## Сортування по TV-параметрам + +### tvSortType + +Правила приведення типів TV-параметрів при сортуванні. + +Можливі значення (перераховуються через кому в тому порядку, в якому вказані імена TV в параметрі `orderBy`): + +* `DECIMAL` - числа з двома знаками після коми; +* `UNSIGNED` - беззнакові цілі числа; +* `SIGNED` - цілі більше нуля; +* `BINARY` - бінарний режим; +* `DATETIME` - дата; +* `TVDATETIME` - приводить рядок в дату відповідно до формату, який використовується TV-параметром з типом введення `Date` (доступно тільки з контролерів на базі `site_content`). + +### tvSortWithDefault + +В силу особливостей движка (TV-параметри значення яких збігаються зі значеннями за замовчуванням, не зберігаються в окрему таблицю), сортування записів може бути не коректним, якщо значення за замовчуванням відрізняється від порожнього рядка. +Тому рекомендується додатково вказувати ТВ параметри у яких примусово вказано значення за замовчуванням. + +## Фільтрація + +### showNoPublish + +Висновок віддалених або неопублікованих ресурсів (використовується тільки в контролерах на базі `site_content`) + +Можливі значення - `0`, `1` + +Значення за замовчуванням - `0` + +### filters + +Правила для фільтрації документів. + +Можливі значення - рядок сформований за правилами описаним в `DocLister::getFilters()`. Детальніше в розділі [Фільтри](https://github.com/keslo/docs/blob/master/ru/04_%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B/DocLister/04_%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D1%8B.md). + +Значення за замовчуванням - `порожньо`. + +#### Приклад рядка +``` +OR(AND(filter:field:operator:value;filter2:field:operator:value);(...)) +``` + +### filter_delimiter + +Роздільник фільтрів для режиму `containsOne`. + +Можливі значення - `будь-який рядок`. + +##Вибірка за тегами + +### tagsData + +Рядок визначає джерело тегів. + +Можливі значення - Рядок з правилами поділу двокрапкою. + +Значення за замовчуванням - `порожньо`. + +Для автоматичної підстановки тегів з `GET` змінної необхідно вказати ім'я цієї змінної, передавши в цьому параметрі значення типу `get:tag`. В такому випадку, теги повинні підставлятися в `$_GET['tag']`. У разі ж, якщо потрібна статична вибірка, то можна `get` замінити на `static` і після двокрапки передати значення тега, наприклад, `static:значення_тега` + +## Додаткові дані + +### urlScheme + +Схема генерації URL + +Можливі значення - схеми доступні в MODX Evolution (відносні, http, https, full). + +Значення за замовчуванням - `порожньо` (відносні) + +### dateSource + +Поле документа в якому розташовується дата. + +Можливі значення - назва поля в таблиці. Якщо в якості значення був вказаний рядок відмінний від `createdon` і значення даного поля в базі рівно `0`, то тоді все одно береться значення з `createdon`. Для прикладу: якщо ви використовуєте відкладену публікацію для деяких документів і вказуєте сортування по полю `pub_date`. Так ось, з `DocLister` у вас ніколи не вийде ситуації, що документи опубліковані без відкладеної публікації та завжди будуть в кінці списку. + +Значення за замовчуванням - `pub_date`. + +### dateFormat + +Правила форматування дати `format` для PHP функції `strftime`. + +Як джерело дати використовується параметр `dateSource`. Крім цього враховується зсув дати на сервері (дивіться системний параметр `server_offset_time`). Таким чином, можна використовувати персоналізацію підстановки часу в залежності від часового поясу користувача. + +Значення за замовчуванням - `%d.%b.%y %H:%M` + +### summary + +Правила обробки текстів для формування короткого опису. + +Завантажує екстендер `summary`. У контролері `site_content` є додаткове правило для оброблюваного тексту: за замовчуванням на обробку відправляється поле `content`. Але якщо поле `introtext` не порожнє, то текст саме з цього поля буде переданий на додаток `summary`. Аналогічним чином собі веде і контролер `onetable`. + +Можливі значення - рядок сформований за правилами екстендера `summary`: + +``` +дія1:параметр1,дія2:параметр2А:параметр2Б,дія3 +``` + +Значення за замовчуванням - `порожньо`. + +### introField + +Ім'я поля для джерела короткого опису тексту з `contentField`. Використовується тільки якщо завантажений екстендер `summary`. + +Значення за замовчуванням - порожньо. + +### contentField + +Ім'я поля в якому зберігається основний текст документа. Використовується тільки якщо завантажений екстендер `summary` + +Значення за замовчуванням - `порожньо`. + +### e + +Екранування значень полів. Імена полів доступні в шаблонах через плейсхолдери з префіксом `e`: `[+e.pagetitle+]`, `[+e.longtitle+]`. + +Можливі значення - `імена полів` через кому. + +### jotcount + +Додає до вибірки кількість коментарів `JotX` за допомогою екстендера `jotcount`. + +Можливі значення - `1` або `0` + +Значення за замовчуванням - `0` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/02_\320\236\320\261\321\200\320\276\320\261\320\272\320\260 \320\264\320\260\320\275\320\270\321\205 \320\277\320\265\321\200\320\265\320\264 \320\262\320\270\320\262\320\276\320\264\320\276\320\274.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/02_\320\236\320\261\321\200\320\276\320\261\320\272\320\260 \320\264\320\260\320\275\320\270\321\205 \320\277\320\265\321\200\320\265\320\264 \320\262\320\270\320\262\320\276\320\264\320\276\320\274.md" new file mode 100644 index 00000000..9d6a1380 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/02_\320\236\320\261\321\200\320\276\320\261\320\272\320\260 \320\264\320\260\320\275\320\270\321\205 \320\277\320\265\321\200\320\265\320\264 \320\262\320\270\320\262\320\276\320\264\320\276\320\274.md" @@ -0,0 +1,319 @@ + +Найчастіше отримані дані виводяться не в чистому вигляді. Наприклад, слід дотримуватися при виведенні будь-яких умов або обробок (висновок превью для картинки, перерахунок ціни, форматування значень). + +Традиційним способом в MODX є виклик сніпетів в шаблонах виведення або використання модифікаторів (phx). Такий підхід часто використовується новачками в силу простоти, але при цьому збільшується навантаження на парсер і базу даних. + +У DocLister передбачена можливість попередньої обробки даних засобами PHP за допомогою параметра prepare. + +Значенням параметра prepare може бути: + +* ім'я сніпета; +* виклик методу заздалегідь завантаженого класу; +* анонімна функція. + +Можна задавати кілька значень для послідовних обробок. + +##Використання сніпетів + +Сніпет обробляє значення масиву $data після обробки повертає масив $data або false. В останньому випадку дані виводитися не будуть, тобто можна використовувати prepare таким чином для фільтрації даних. + +Також в сніпеті можна використовувати об'єкти $_DocLister і $_extDocLister. + +Об'єкт $_DocLister дає можливість звертатися до методів і властивостей контролера. Наприклад, можна підмінити поточний шаблон виведення: + +``` +$_DocLister->renderTPL = "@CODE:[+pagetitle+]"; +``` +Для того, щоб отримати значення параметрів з виклику сніпета використовуйте конструкцію: + +``` +$parameter_value = $_DocLister->getCFGDef('parameter_name'); +``` +Дана конструкція дозволяє отримати значення параметра 'parameter_name' з виклику сніпета. + +``` +[[DocLister? &tpl=`tplChunk` &parents=`1` ¶meter_name=`1`]] +``` + +В об'єкті $_extDocLister доступні методи getStore і setStore. setStore зберігає, а getStore, відповідно, отримує дані з пам'яті. Як тільки DocLister завершив свою роботу, збережені блоки видаляються з пам'яті. + +##Використання методів класу + +``` +class DLprepare { + public static function prepare(array $data = array(), DocumentParser $modx, $_DL, prepare_DL_Extender $_extDocLister) { + return $data + } +} +``` +Значення параметра в цьому випадку: DLprepare::prepare + +Аналогічним чином можна використовувати анонімні функції. + +##Приклади з блогу Agel Nash + +###Приклад 1 + +Отже, уявімо, що у нас є певний виклик DocLister'a: + +``` +[[DocLister? &tpl=`tplChunk` &parents=`1`]] +``` + +Де tplChunk це ніщо інше, як: + +``` +[[if? &is=`[+longtitle+]:notempty` &then=`[+longtitle+]` &else=`[[snippet? &text=`[+pagetitle+]`]]`]] +``` + +Усередині чанка tplChunk є вкладений виклик if (припустимо той, що був зазначений на початку топіка). Що ми робимо? + +Додаємо до виклику DocLister параметр &prepare=`test` (можна і не тест, а будь-яке інше значення). + +Створюємо сніпет з ім'ям test (ну або з тим ім'ям, яке було зазначено в параметрі prepare) + +У сніпеті пишемо такий код: + +``` +runSnippet("snippet", array('text'=>$data['pagetitle'])); +} +return $data; +``` + +Звичайно, ви можете замість runSnippet написати і: + +``` +$data['longtitle'] = "[[snippet? &text=`".$data['pagetitle']."`]]"; +``` +Але ще раз згадаємо чому це погано: pagetitle може містити символи про які запнется парсер modx. Так можна написати тільки в тому випадку, якщо pagetitle може містити виклик сніпета (але це дуууже рідкісний випадок + є інші способи для обробки вкладених modx тегів)! Але повернемося до наших баранів. + +Позбувшись від вкладеного сніпета, ми можемо спокійно позбутися чанка tplChunk і винести шаблон прямо в виклик DocLister'a: + +``` +[[DocLister? &tpl=`@CODE:[+longtitle+]` &parents=`1`]] +``` + +Тепер можна підвести підсумок: Перевірка умов засобами php (за допомогою сніпета prepare) дозволяє уникнути непотрібних викликів вкладених сніпетів (вкладений виклик відбувається тільки тоді, коли умова true). А ще, на мій скромний погляд, inline шаблони це дуже зручно, тому що наочно видно і сам виклик і шаблон - все в 1 місці. + +###Приклад №2 + +Цей приклад буде складніший для розуміння. Але він ще більш наочно демонструє перевагу параметра prepare. + +На сайті є кілька груп товарів (телефони, телевізори, магнітофони). У кожній групі відповідно свої позиції, які користувач додає в кошик. На сторінці оформлення замовлення всі обрані позиції повинні ще мати підпис (до якої групи товарів вони належать). Кожний товар в кошику має такі характеристики, як кількість товару що замовляється, вартість товару і загальна вартість з урахуванням кількості. Так само потрібно порахувати загальну суму у вигляді повної суми замовлення. + +Спростимо трохи цю задачку перемістивши в TV-параметр count замовляється позицій. А сам кошик виведемо точним перерахуванням ID документів. Таким чином виклик приймає наступний вигляд: + +``` +[!DocLister? + &documents=`5133, 5132, 5135, 5131, 5136` + &idType=`documents` + &tpl=`ListShop` + &tvList=`price,count` + &ownerTPL=`@CODE:[+dl.wrap+]
    КатегорияПозицияОстатокСтоимостьОбщая стоимость
    ` +!] +``` + +А чанк ListShop містить такий код: + +``` + + [[DocInfo? &docid=`[+parent+]` &field=`pagetitle`]] + [+pagetitle+] + [+tv.count+] шт. + [+tv.price+] руб. + [[FullPrice? &price=`[+tv.price+]` &count=`[+tv.count+]`]] руб. + +``` + +Якщо сніпет DocInfo всім знайомий, то сніпет FullPrice це ніщо інше, як банальне множення двох чисел: + +``` + +``` + +Щоб стало зрозуміліше, ось так виглядає дерево ресурсів: + +Дерево ресурсів + +Доб'ємо останній штрих - порахуємо на яку суму у нас усього товарів в кошику. Для цього буде потрібно накидати невеликий сніпет, який пробіжить знову по всіх документах і виведе загальну суму FullPrice. Назвемо цей сніпет totalFullPrice (де 27 і 26 це ID тв-параметрів з ціною і кількістю): + +``` +runSnippet("DocLister", array('documents'=>'5133, 5132, 5135, 5131, 5136', 'idType'=>'documents', 'idType'=>'parents', 'depth'=>2, 'api'=>'id', 'JSONformat'=>'id')); +$out = json_decode($out, true); +$id = array(); +foreach($out as $item){ + $id[] = $item['id']; +} + +$q = $modx->db->query("SELECT value,contentid,tmplvarid FROM ".$modx->getFullTableName("site_tmplvar_contentvalues")." WHERE contentid IN (".implode(",", $id).") AND tmplvarid IN (26, 27)"); +$q = $modx->db->makeArray($q); +$out = array(); +foreach($q as $item){ + $out[$item['contentid']][$item['tmplvarid']] = $item['value']; +} +$price = 0; +foreach($out as $id=>$data){ + $price += $data['27'] * $data['26']; +} +return $price; +?> +``` + +Оскільки це кошик, то всі виклики сніпетів робимо некешованими і дивимося на результат (мене цікавить загальне число запитів): 12 SQL запитів для вирішення такого завдання. + +Пробуємо тепер зробити те ж саме за допомогою prepare сніпета. + +``` +[!DocLister? +&documents=`5133, 5132, 5135, 5131, 5136` +&idType=`documents` +&prepare=`total` +&tpl=`@CODE: [+category+][+pagetitle+][+tv.count+] шт.[+tv.price+] руб.[+fullPrice+] руб.` +&tvList=`price,count` +&ownerTPL=`@CODE:[+dl.wrap+]
    КатегорияПозицияОстатокСтоимостьОбщая стоимость
    `!] +``` + +Як бачите, в цьому випадку ми знову відмовилися від чанка на користь inline шаблону в якому використовуються 2 незрозумілих плейсхолдера - category і fullPrice. Давайте подивимося на код сніпета prepare, щоб стало зрозуміліше: + +``` +runSnippet('DocInfo',array('docid'=>$data['parent'], 'field'=>'pagetitle')); + +$key = 'totalFullPrice'; +$price = $modx->getPlaceholder($key); +if(empty($price)){ + $price = 0; +} +$price += $data['fullPrice']; +$modx->setPlaceholder($key,$price); + +return $data; +?> + +``` +fullPrice це ні що інше, як банальне множення 2 чисел (ціни і кількості). Погодьтеся, немає необхідності для такої банальної операції створювати / викликати ще 1 сніпет, коли можна провести розрахунок прямо як то кажуть "не відходячи від каси". + +category запускає той же самий DocInfo за допомогою runSnippet (тобто нічого не змінилося). + +А тепер найголовніше! Створюється глобальний плейсхолдер totalFullPrice, який можна вже використовувати поза чанком DocLister'a! Якщо його немає - то встановлюється значення 0. Якщо є, то до нього додається fullPrice. Таким чином, ми позбавляємося від необхідності робити повторну вибірку тих же самих даних тільки заради того, щоб порахувати загальну вартість. Тобто вважаємо все і відразу. відповідно виклик [!totalFullPrice!] на сторінці замінюється на [+totalFullPrice+] (я ще жодного разу не зустрічав, щоб подібні даних отримували за допомогою сніпета вкладеного в чанк ListShop. Як правило їх отримують саме за допомогою сніпета схожого на totalFullPrice.) + +Перевіряємо результат - 9 SQL запитів. + +Давайте знову підіб'ємо підсумок: Завдяки prepare сніпетів вдалося врятуватися від необхідності повторної обробки тих же самих даних, які потрібні для отримання і виведення якоїсь іншої інформації в довільному місці цієї ж сторінки. + +###Приклад №3 +Цей приклад ще складніше, але одночасно з цим ще більше корисніше і цікавіше. + +Отже, якщо подивитися уважно на скріншот дерева ресурсів і список ID документів які ми виводимо, то можна помітити, що з розділів телевізорів і магнітофонів виводиться по 2 документа. Таким чином, parents у документів 5135, 5131 і 5136, 5132 будуть однаковими відповідно. Тобто у першої пари parents буде 5638, а у другій 5639. Що нам це дає? А це дає ось що - ми цілих 2 рази викликаємо DocInfo просто так. Уявіть, ви отримали pagetitle документа 5638 і запам'ятали його. Якщо він знадобився вам знову - то ви не повторно його запитуєте, а відразу використовуєте. + +Саме для цієї мети в DocLister, а якщо бути точніше в екстендерів prepare є 2 методи: getStore і setStore. Один зберігає, а другий відповідно отримує дані з пам'яті. Як тільки DocLister завершив свою роботу, збережені блоки видаляються з пам'яті (масив автоматично очищається) і все працює далі без будь-яких глюків, як це могло б бути, якби ми зберігали тимчасові дані в глобальний масив плейсхолдерів. Більш того, при такому підході і великих обсягах треба було б дуже багато пам'яті ... + +Гаразд, вистачить лірики. Давайте подивимося як можна переписати сніпет prepare з урахуванням getStore і setStore: + +``` +if(($data['category']=$_extDocLister->getStore('currentParents'.$data['parent'])) === null){ + //[[DocInfo? &docid=`[+parent+]` &field=`pagetitle`]] + $data['category'] = $modx->runSnippet('DocInfo',array('docid'=>$data['parent'], 'field'=>'pagetitle')); + $_extDocLister->setStore('currentParents'.$data['parent'], $data['category']); +} +``` + +Я не став копіювати усе джерело, а тільки процитував змінену частину. Але думаю тут і так зрозуміло, що ми "обернули" виклик сніпета DocInfo в ці 2 функції. А в якості унікального ключа вказали currentParents[+parent+]. Таким чином, для формувань цієї ж сторінки MODX-у треба було всього 7 SQL запитів. + +Таким чином: сніпет prepare дозволяє не тільки обробляти дані, а й виключити марне повторне виконання коду. + +##Обробка шаблону обгортки +Після того, як кожен документ оброблений, DocLister намагається застосувати обгортку ownerTPL. Часом буває необхідно цю обгортку додатково обробити і можливо підмінити в залежності від різних умов (кількість виведених документів, дати і т.д.). + +### Висновок 3 блоків з рівномірним наповненням за 1 виклик +``` +return $modx->runSnippet('DocLister', array( + 'ownerTPL' => '@CODE:
    + + + + + +
    ', + 'tpl' => '@CODE:
    + [+e.title+] +
    ', + 'tvList' => 'image', + 'prepareWrap' => function($data, $modx, $_DL, $_eDL){ + $plh = isset($data['placeholders']) && is_array($data['placeholders']) ? $data['placeholders'] : array(); + $plh['slider.left'] = $plh['slider.center'] = $plh['slider.right'] = ''; + $wrap = explode('', + (isset($plh['dl.wrap']) && is_scalar($plh['dl.wrap']) ? $plh['dl.wrap'] : '') + ); + $count = count( + isset($data['docs']) && is_array($data['docs']) ? $data['docs'] : array() + ); + + for($i = 0; $i <= $count; $i){ + $left = APIHelpers::getkey($wrap, $i++, ''); + $center = APIHelpers::getkey($wrap, $i++, ''); + $right = APIHelpers::getkey($wrap, $i++, ''); + + if(empty($left) || empty($center) || empty($right)){ + break; + }else{ + $plh['slider.left'] .= $left; + $plh['slider.center'] .= $center; + $plh['slider.right'] .= $right; + } + } + return $plh; + } +)); +``` +### Підстановка даних в шаблон обгортку для меню певного рівня +``` +return $modx->runSnippet('DLBuildMenu', array( + 'idType' => 'parents', + 'parents' => 0, + 'debug' => 0, + 'maxDepth' => 2, + 'tvList' => 'dropMenu', + 'TplOneItem' => '@CODE:
  • [+title+]
  • ', + 'TplNoChildrenDepth1' => '@CODE:
  • [+title+]
  • ', + 'TplDepth1' => '@CODE:
  •  [+title+][+dl.submenu+]
  • ', + 'TplMainOwner' => '@CODE: ', + 'TplSubOwner' => '@CODE:
    + +
    +
    +
      + [+dl.wrap+] +
    +
    +
    + [+addText+] +
    +
    +
    ', + 'AfterPrepare' => 'mainMenu::afterPrepare', + 'prepareWrap' => function($data, $modx, $_DL){ + $plh = $data['placeholders']; + if($_DL->getCfgDef('currentDepth', 1)==2){ + $parent = current($_DL->getOneField('parent', true)); + $plh['addText'] = $modx->runSnippet('DDocInfo', array('id' => $parent, 'field' => 'dropMenuText')); + $bg = $modx->runSnippet('DDocInfo', array('id' => $parent, 'field' => 'dropMenuImage')); + if($bg && file_exists(MODX_BASE_PATH . $bg) && is_file(MODX_BASE_PATH . $bg)){ + $plh['background'] = 'background:url('.$bg.') right bottom no-repeat'; + } + } + return $plh; + } +)); +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/03_\320\222\320\270\320\262\321\226\320\264 \320\264\320\260\320\275\320\270\321\205.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/03_\320\222\320\270\320\262\321\226\320\264 \320\264\320\260\320\275\320\270\321\205.md" new file mode 100644 index 00000000..990635e3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/03_\320\222\320\270\320\262\321\226\320\264 \320\264\320\260\320\275\320\270\321\205.md" @@ -0,0 +1,536 @@ +##Завдання шаблонів + +За замовчуванням вважається, що в параметрах шаблону передано ім'я чанка. Але якщо ім'я чанка починається з символу @, то відбувається перевірка початкового слова в імені шаблону із заздалегідь зарезервованими правилами завантаження шаблонів. Усі наступні слова використовується в якості параметра до вибраного правилом. + +__@FILE__ +Завантаження шаблону з html файлу розташованого в папці або підпапках assets/templates/ + +__@CHUNK__ +Звичайне завантаження шаблону з чанка + +__@TPL, @CODE__ +Значення параметра використовується в ролі inline шаблону + +__@DOCUMENT, @DOC__ +Шаблон береться з content поля зазначеного документа + +__@PLH, @PLACEHOLDER__ +Шаблон завантажується з глобального плейсхолдера MODX + +__@CFG, @CONFIG, @OPTIONS__ +Шаблон береться з загальних параметрів поточної установки MODX Evolution + +Варто зауважити, що навіть якщо початковий символ був @ і після обробки всіх правил шаблон все одно виявився порожнім, то відбувається спроба виявити чанк по повному імені шаблону + +##Плейсхолдери + +Плейсхолдери в DocLister: + +* плейсхолдер таблиці, ім'я такого плейсхолдера збігається з назвою колонки в таблиці; +* віртуальний плейсхолдер, який став доступний після запуску екстендера або якихось обчислень всередині контролера; +* глобальний плейсхолдер, який доступний з поза шаблонів переданих в сніпет (як правило має префікс dl і може бути перевизначений за допомогою параметрів sysKey або id). + +> Екстендер в DocLister - це допоміжний клас для будь-яких обробок, який не має нічого спільного з екстендерами Ditto. + +###Плейсхолдери таблиці + +Якщо вказано контролер site_content або будь-який інший його розширює, то за замовчуванням використовується таблиця site_content. У випадку з контролером onetable ім'я таблиці визначається параметром table. Таким чином, отримати повний список плейсхолдерів можна відкривши таблицю mysql, наприклад, через phpmyadmin і підглянувши які в цій таблиці є поля. + +###Віртуальний плейсхолдер + +####Плейсхолдери встановлюються екстендером paginate + +__[+параметр_id.pages+]__ +Пагінація + +__[+параметр_id.totalPages+]__ +Загальна кількість сторінок + +__[+параметр_id.isstop+]__ +1 якщо поточна сторінка - остання + +__[+параметр_idisstart+]__ +1 якщо поточна сторінка - перша + +__[+параметр_id.from+]__ +Номер документа на сторінці від (Приклад: товарів __1__-8 з 16) + +__[+параметр_id.to+]__ +Номер документа на сторінці до (Приклад: товарів 1-__8__ з 16) + +__[+параметр_id.count+]__ +Загальна кількість документів (Приклад: товарів 1-8 з __16__) + +####Плейсхолдери встановлюються екстендером jotcount + +Екстендер завантажується, якщо при виклику сніпета заданий параметр __&jotcount__. + +__[+jotcount+]__ +Число коментарів з сніпета JOT + +####Плейсхолдери встановлюються екстендером tv + +__[+tv.имяТВпараметра+]__ +Значення ТВ параметра + +За замовчуванням до всіх ТБ параметрів додається префікс tv, але від нього можна позбутися або перевизначити параметром tvPrefix. + +####Плейсхолдери встановлюються екстендером e + +Екстендер завантажується, якщо при виклику сніпета заданий параметр __&е=`імена полів через кому`__ + +__[+e.імяПоля+]__ +Екрановане значення поля. + +####Плейсхолдери встановлюються екстендером summary + +__[+summary+]__ +Анотація на сторінку + +####Плейсхолдери встановлюються екстендером user + +Екстендер необхідно завантажити вручну, вказавши його ім'я в параметрі & extender. Також повинні бути задані параметри: +* usertype - можливі значення: manager, mgr, web. ОВизначає з яких таблиць брати дані користувачів; +* userFields - назви колонок через кому, в яких вказано id користувача, наприклад createdby, publishedby. + +__[+user.id.НазваКолонки+]__ +ID користувача + +__[+user.username.НазваКолонки+]__ +Логін користувача + +__[+user.fullname.НазваКолонки+]__ +Повне ім'я користувача + +__[+user.role.НазваКолонки+]__ +ID ролі користувача + +__[+user.email.НазваКолонки+]__ +e-mail + +__[+user.phone.НазваКолонки+]__ +Телефон + +__[+user.mobilephone.НазваКолонки+]__ +Мобільний телефон + +__[+user.blocked.НазваКолонки+]__ +Статус блокування + +__[+user.blockeduntil.НазваКолонки+]__ +До якого UNIX-часу користувач буде заблокований + +__[+user.blockedafter.НазваКолонки+]__ +Після якого UNIX-часу користувач буде заблокований + +__[+user.logincount.НазваКолонки+]__ +Загальна кількість авторизаций + +__[+user.lastlogin.НазваКолонки+]__ +UNIX-час останньої авторизації + +__[+user.thislogin.НазваКолонки+]__ +UNIX-час поточної авторизації + +__[+user.failedlogincount.НазваКолонки+]__ +Число невдалих спроб авторизуватися + +__[+user.lastlogin.НазваКолонки+]__ +UNIX-час останньої авторизації + +__[+user.dob.НазваКолонки+]__ +Дата народження + +__[+user.gender.НазваКолонки+]__ +Стать + +__[+user.country.НазваКолонки+]__ +Країна + +__[+user.state.НазваКолонки+]__ +Регіон + +__[+user.zip.НазваКолонки+]__ +Поштовий індекс + +__[+user.fax.НазваКолонки+]__ +Факс + +__[+user.photo.НазваКолонки+]__ +Світлина + +__[+user.comment.НазваКолонки+]__ + +####Плейсхолдери встановлюються в контролерах site_content + +__[+title+]__ +Назва документа для списків. Якщо menutitle порожній, то використовується pagetitle + +__[+iteration+]__, __[+ЗначенняПараметраsysKey.full_iteration+]__ +Порядковий номер елемента в списку; порядковий номер у списку з урахуванням пагінації. + +**Примітка:** для контролера **site_content** і для контролера **shopkeeper** плейсхолдер [+iteration+] виглядає як зазначено вище - [+iteration+] без префікса, а для контролера **onetable** - як [+ЗначенняПараметраsysKey.iteration+] з префіксом. Значення префіксу ПараметраsysKey за замовчуванням дорівнює dl, тобто для **onetable** цей плейсхолдер за замовчуванням - [+dl.iteration+]. + +__[+url+]__ +Посилання на документ + +__[+date+]__ +дата публікації документа сформована за правилами вказаними в параметрі dateFormat (за замовчуванням %d.%b.%y%H:%M). Крім цього враховується server_offset_time в настройках двіжка. + +__[+ЗначенняПараметраsysKey.active+]__ +Прапор визначає, що документ який обробляється, збігається, і документ на якому був викликаний сніпет це одне і теж (1 - якщо правда, 0 якщо немає) + +__[+ЗначенняПараметраsysKey.class+]__ +Класи які можуть бути автоматично привласнені документу (first, last, current, odd, even) + +__[+ЗначенняПараметраsysKey.wrap+]__ +HTML код списку підготовлений для виведення користувачеві (використовується тільки для шаблону ownerTPL) + +##Параметри для установки плейсхолдерів + +###sysKey + +Префікс для системних плейсхолдеров. + +Можливі значення - будь-який рядок. На виході виходить плейсхолдер з ім'ям [+sysKey.placeholder+], де sysKey це значення даного параметра + +Значення за замовчуванням - dl + +###id + +Префікс для локальних плейсхолдерів. + +Можливі значення - будь-який рядок. Якщо id зазначено, то на виході виходить [+id.placeholder+]. Де id це і є передання значення. У разі якщо id не задано, то перед ім'ям плейсхолдера крапка не ставиться. + +Значення за замовчуванням - порожньо. + +##Параметри виведення в шаблони + +###ownerTPL + +Шаблон в який обертається список результатів. Якщо потрібних результатів не виявлено, то за замовчуванням результат з шаблоном noneTPL теж обертається в цей шаблон. За подробицями звертайтеся до опису параметра noneWrapOuter. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - порожньо. + +####Приклад: +``` +&ownerTPL=`@CODE: +
      + [+dl.wrap+] +
    +` +``` + +###tpl + +Шаблон. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. Значення параметра може бути змінено з prepare-сніпета c допомогою властивості $_DocLister->renderTPL. + +Значення за замовчуванням - визначається в контролері. + +####Приклад: +``` +&tpl=`@CODE: +
  • + [+e.pagetitle+] + [+title+] ([+id+]) +
  • +` +``` + +###tplId1, tplId2, ..., tplIdN + +Шаблон для оформлення документа під номером 1, 2 і т.д., де номер - це номер ітерації починаючи з 1. + +Значення за замовчуванням береться з значення параметра tpl. + +**Примітка:** Зверніть увагу, Id в назвах шаблонів не повинно вводити вас в оману, насправді номер - це не Id документа, а його номер по порядку в виведенні (номер ітерації). + +###tplOdd, tplEven + +Шаблон для оформлення парного / непарного документа. + +Значення за замовчуванням береться з значення параметра tpl. + +###tplFirst + +Шаблон для оформлення першого документа в списку. Синонім параметра tplId1, але має більший пріоритет. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. Якщо не задано, то збігається з шаблоном tpl. + +Значення за замовчуванням - порожньо. + +###tplLast + +Шаблон для оформлення останнього документа в списку. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. Якщо не задано, то збігається з шаблоном tpl. + +Значення за замовчуванням - порожньо. + +###tplСurrent + +Шаблон для оформлення поточного документа в списку документів. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. Якщо не задано, то збігається з шаблоном tpl. + +Значення за замовчуванням - порожньо. + +###noneTPL + +Шаблон з повідомленням про те, що за заданими критеріями нічого не виявлено. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - порожньо. + +###noneWrapOuter + +Чи повертати відповідь noneTPL в шаблон ownerTPL. Параметр актуальний тільки в тому випадку, якщо немає документів для створення списків і заданий ownerTPL. + +Можливі значення - 1 або 0. + +Значення за замовчуванням - 1. + +##Пагінація + +###paginate + +Висновок даних з пагінацією. Дивіться плейсхолдери, які встановлюються екстендером paginate. + +Можливі значення: + +* offset - пагінація в стилі Ditto; +* pages - пагінація з прострілами. + +Значення за замовчуванням - pages. + +###TplFirstP + +Шаблон для вставки посилання "перша сторінка". + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: пусто. + +###TplLastP + +Шаблон для вставки посилання "остання сторінка". + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: пусто. + +###TplNextP + +Шаблон для вставки посилання "наступна сторінка". +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: ' . $this->DocLister->getMsg('paginate.next', 'Next') . ' > +``` + +Плейсхолдерів для підстановки даних з мовного пакета поки немає. + +###TplPrevP + +Шаблон для вставки посилання "попередня сторінка". + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: < ' . $this->DocLister->getMsg('paginate.prev', 'Prev') . ' +``` + +Плейсхолдерів для підстановки даних з мовного пакета поки немає. + +###TplPage + +Шаблон для вставки номера сторінки в пагінатор. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: [+num+] +``` + +###TplCurrentPage + +Шаблон оформлення поточної сторінки в пагінаторі + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: [+num+] +``` + +###TplWrapPaginate + +Шаблон контейнера для обгортки сторінок в пагінацію. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE:
    [+wrap+]
    +``` + +###pageLimit + +Число сторінок відображається в пагінаторі. + +Можливі значення - ціле число більше нуля. + +Значення за замовчуванням - 1. + +###pageAdjacents + +Максимальне число сторінок зліва і справа щодо поточної сторінки. + +Можливі значення - ціле число більше нуля. + +Значення за замовчуванням - 4. + +###PaginateClass + +Клас для контейнера в який будуть вкладені сторінки пагінації. + +Можливі значення - будь-який рядок сформований за правилами для підстановки в HTML атрибут тегів class. + +Значення за замовчуванню - paginate. + +###PrevNextAlwaysShow + +Завжди показувати "наступна сторінка" та "попередня сторінка". + +Можливі значення - 1 або 0. + +Значення за замовчуванню - 0. + +###TplFirstI + +Шаблон для вставки посилання "перша сторінка", використовується спільно з PrevNextAlwaysShow. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: пусто. + +###TplLastI + +Шаблон для вставки посилання "остання сторінка", використовується спільно з PrevNextAlwaysShow. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: пусто. + +###TplNextI + +Шаблон для вставки неактивній посилання "наступна сторінка", використовується спільно з PrevNextAlwaysShow. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: [%paginate.next%] > +``` + +###TplPrevI + +Шаблон для вставки неактивній посилання "попередня сторінка", використовується спільно з PrevNextAlwaysShow. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: < [%paginate.prev%] +``` + +###TplDotsPage + +Шаблон прострілу. + +Можливі значення - ім'я шаблону вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням: +``` +@CODE: ... +``` + +###noRedirect + +Забороняє переадресацію при запиті неіснуючої сторінки. + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. + +###paginationMeta + +Висновок метатегів prev і next в head сайту. + +``` + + +``` + +Можливі значення - 0 або 1. + +Значення за замовчуванням - 0. + +##Висновок в плейсхолдери + +###contentPlaceholder + +Установка значень документів в персоналізацію плейсхолдери. + +Можливі значення - 0, 1. Якщо значення параметра дорівнює 1, то DocLister створює плейсхолдери виду [+id.item[x]+]. Де x це порядковий номер документа в списку, а id це значення параметра id (див. Опис параметра id). + +Значення за замовчуванням - 0 + +###paginationMetaPlaceholder + +Можливі значення - 0 або 1. Якщо значення параметра дорівнює 1, то результат виконання параметра `paginationMeta` потрапляє не в шапку, а в глобальний плейсхолдер `[+paginationMeta+]`. + +Значення за замовчуванням - 0 + +##Роздільник між шаблонами + +###outputSeparator + +Установка роздільнику, який буде виводитися між значеннями, виведеними в шаблоні tpl. + +Можливі значення - будь-який рядок. + +Значення за замовчуванням - порожньо. + +####Приклад +Використовується в полі "Можливі значення" TV-параметра +``` +@EVAL $snippet_name = 'DocLister';$arrparams = array('id' => 'brands_select','parents' => '1171','depth' => '0','tvPrefix' => '','tvList' => '','tpl'=>'brands_select_tpl','orderBy'=>'pagetitle ASC', 'total' => 'all', 'noneWrapOuter' => '0', 'dateFormat'=>'%d.%m.%Y','outputSeparator'=>'||');return $modx->runSnippet($snippet_name,$arrparams); +``` + + +##API-режим + +###api + +Використовується для формування видачі в форматі JSON. + +Можливі значення - 0, 1 або список полів обираних документів. + +Значення за замовчуванням - 0. + +###JSONformat + +За яким принципом формувати JSON-відповідь. + +Можливі значення - old, new. У форматі old відповідь виглядає у вигляді звичайного масиву. У форматі new відповідь загортається в rows секцію + додається домішка total в якій зазначено загальна кількість їх використань у вибірці + +Значення за замовчуванням - old. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/04_\320\244\321\226\320\273\321\214\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/04_\320\244\321\226\320\273\321\214\321\202\321\200\320\270.md" new file mode 100644 index 00000000..b9cbd02e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/04_\320\244\321\226\320\273\321\214\321\202\321\200\320\270.md" @@ -0,0 +1,89 @@ +##Фільтри + +У комплекті наступні фільтри: + +* content - для фільтрації по полях таблиці site_content, можна замінити параметром addWhereList; +* tv - для фільтрації по TV-параметрам; +* tvd - для фільтрації по TV-параметрам з урахуванням значень за замовчуванням; +* private - для фільтрації документів з урахуванням прав доступу. + +##Побудова фільтра +####Приклад +``` +OR(AND(filter:field:operator:value;filter2:field:operator:value);(...)) +``` + +##Оператори +###=, eq, is + +Так само. + +###!=, no, isnot, isnotnull + +Не дорівнює. + +###>, gt + +Більше. + +###<, lt + +Менше. + +###<=, elt + +Менше або дорівнює. + +###>=, egt +Більше чи рівно. + +###%, like +Містить рядок. + +###like-r +Починається рядком. + +###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:шукана стрічка)`]] +``` +З цього прикладу передбачається, що в базі даних є FULLTEXT індекс по полях pagetitle,description,content,introtext + +###containsOne +Пошук будь-якого слова або його частини в тексті за допомогою LIKE. +####Приклад: +``` +[[DocLister? &filters=`AND(content:content:containsOne:коли, настане, світ)`]] +``` +Буде побудований SQL запит виду +``` +(content LIKE '%когда%' OR content LIKE '%настане%' OR content LIKE '%світ%') +``` +Тобто в кінцевому рахунку з бази будуть обрані документи в тексті яких використовуються слова "коли" або "настане" або "світ". +З прикладу виклику видно, що слова розділені комою. Ця поведінка можна перевизначитися параметром ___filter_delimiter___. + +###in +Входить в безліч. + +###notin +Не входить в безліч. + +####Приклад виклику з фільтрацією за ціною від 0 до 300: + +``` +[[DocLister? &filters=`AND(tv:price:gt:0;tv:price:lt:300)`]] +``` + +А тепер те ж саме, тільки з урахуванням значень за замовчуванням + +``` +[[DocLister? &filters=`AND(tvd:price:gt:0;tvd:price:lt:300)`]] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/05_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/05_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\320\270.md" new file mode 100644 index 00000000..7cf26cea --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/05_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\320\270.md" @@ -0,0 +1,11 @@ +##Параметри + +###customLang + +Завантаження довільного лексикону. + +Можливі значення - ім'я php файлу з папки /lang/ з асоціативним масивом $_lang + +Значення за замовчуванням - порожньо. + +За допомогою лексикону можна перевизначити як стандартні мовні повідомлення з папки /core/lang/[(manager_language)]/, так і створювати нові. Для перевизначення важливо в масиві вказувати повні назви стандартного мовного ключа (наприклад, core.test або paginate.next). Для використання лексикону досить в шаблоні написати тег [%КлючЛексикону%] diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..f88684e4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,162 @@ +## Простий приклад без пагінації +``` +[!DocLister? +&display=`20` +&summary=`notags,len:200` +&dateSource=`pub_date` +&parents=`5` +&tvList=`img,tag` +&id=`lastnews` +&tpl=`ListSummaryPost`!] +``` +Вибірка останніх 20 документів батьком яких є документ з ID=5. + +Текст кожного документа буде схильний до додаткової обробки класом summary з попереднім видаленням html тегів і урізанням довжини тексту до 200 +/- 50 символів. При цьому в чанка будуть доступні плейсхолдери tv.img і tv.tag зі значенням TV параметрів img і tag. + +Для наочності чанк ListSummaryPost + +``` +
    +
    [+createdon+]
    +

    [+pagetitle+]

    +
    Теги: [+tv.tag+]
    +
    + +

    [+summary+]...

    + Подробнее +
    +
    +``` + +## Використання конфігів +``` +[!DocLister? &config=`test`!] +``` +Після чого створюємо JSON файл test.json в папці сніпета /config/custom/ з таким вмістом: +``` +{ + "display" : "20", + "summary" : "notags,len", + "dateSource" : "pub_date", + "parents" : "5", + "tvList" : "img,tag", + "id" : "lastnews", + "tpl" : "ListSummaryPost" +} +``` + +Результат роботи цього виклику буде ідентичний попередньому прикладу. + +## Використання лексиконів + +``` +[!DocLister? &tpl=`example` &customLang=`news`!] +``` + +Після чого створюємо php файл news.php з $\_lang масивом в підпапці сніпета /lang/ + +``` +[+num+]` +&TplCurrentPage=`@CODE:
  • [+num+]
  • ` +&TplWrapPaginate=`@CODE: ` +!] + +[+list.pages+] +``` + +В даному випадку відбувається вибірка всіх документів з контейнера з ID = 2 з глибиною 2 і шаблонами 6 або 7. +Після чого будуть відфільтровані документи контейнери (ті документи всередині яких проводився пошук. А саме - документ з ID = 2 і все його дочірні елементи які є контейнерами). + +При виведенні буде підготовлена ​​пагінація типу page і перевизначаються шаблони для елементів пагінації на ті, що вказані в параметрах TplWrapPaginate, TplCurrentPage і TplPage. Шаблони для посилань наступна і попередня будуть порожніми (відповідно текст в цих елементах не була виводитимуться). До всіх плейсхолдерів сніпета DocLister додасться префікс list, а до кожного документ бере участь у видачі додадуться значення TV параметрів img і tag в плейсхолдери tv.img і tv.tag відповідно. + +TV параметр img буде отрендеріть відповідно до віджетом, зазначеним при створенні цього TV параметра. Всього на сторінці буде відображено по 4 документа. При цьому сортування буде проведена не за датою створення, а по menuindex (позиції в меню). Як джерело дати братиметься дата публікації документа. + +Для наочності чанк ListSummaryPost + +``` +
    +
    [+createdon+]
    +

    [+pagetitle+]

    +
    Теги: [+tv.tag+]
    +
    + [+tv.img+] +

    [+summary+]...

    + Подробнее +
    +
    +``` + +## Приклад виведення інформації з таблиці, відмінною від site_content + +В даному прикладі інформація буде виводитися з таблиці site_snippets. Як колонки PrimaryKey виступає поле id. Сортування відбувається по зростанню значень в колонці name. + +``` +[!DocLister? +&controller=`onetable` +&idType=`documents` +&table=`site_snippets` +&display=`10` +&ignoreEmpty=`1` +&sortBy=`name` +&sortDir=`ASC` +&tpl=`row_tpl` +&showParent=`0` +&idField=`id` +!] +``` + +Чанк row_tpl +``` +
    +

    [+name+]

    + [+snippet+]
    + + + + + + + + + + + + + + + + + + +
    ПолеЗначение
    id[+id+]
    name[+name+]
    description[+description+]
    editor_type[+editor_type+]
    category[+category+]
    cache_type[+cache_type+]
    locked[+locked+]
    properties[+properties+]
    moduleguid[+moduleguid+]
    +
    +
    +``` + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/07_\320\235\320\260\320\273\320\260\320\263\320\276\320\264\320\266\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/07_\320\235\320\260\320\273\320\260\320\263\320\276\320\264\320\266\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..7d69aa21 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/07_\320\235\320\260\320\273\320\260\320\263\320\276\320\264\320\266\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,5 @@ +Для налагодження роботи сніпета використовується параметр debug. + +Можливі значення: -2, -1, 0, 1, 2. 1 покаже тільки SQL-запити; 2 - весь стек роботи сніпета (які чанки використовувалися, які дані підставлялися і т.д.) Мінус впливає лише на положення блоку налагоджування (більше нуля - до результатів роботи сніпета, а менше нуля - після). + +Значення за замовчуванням - 0. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/08_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\320\260\320\274.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/08_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\320\260\320\274.md" new file mode 100644 index 00000000..396d8408 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/08_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\320\260\320\274.md" @@ -0,0 +1,151 @@ +##Контролери + +Ім'я класу розташованого у файлі php повинно закінчуватися на DocLister, а сам клас повинен бути успадкований від абстрактного класу DocLister. + +У параметрі dir можна вказати значення від кореня сайту до папки з контролером. + +##Екстендери + +Екстендери можуть завантажуватися з контролера або за допомогою параметра extenders, в якому перераховані імена файлів * .extender.inc з папки /core/extender/ + +Екстендер, який завантажується повинен бути класом, ім'я якого має починатися з імені екстендера і закінчуватися на _DL_Extender. Крім цього, екстендер що завантажується повинен бути успадкований від абстрактного класу extDocLister. + +##Фільтри + +Правила фільтрації можна знайти в файлі * .filter.php на ім'я фільтра з папки /core/filter/. Клас в файлі повинен бути успадкований від абстрактного гласса filterDocLister, а саме ім'я повинно закінчуватися на _DL_filter. + +##Приведення типів TV-параметрів + +####Приклад в контролері site_content: +``` +public function changeSortType($field, $type) + { + $type = trim($type); + switch (strtoupper($type)) { + case 'TVDATETIME': + { + $field = "STR_TO_DATE(" . $field . ",'%d-%m-%Y %H:%i:%s')"; + break; + } + default: + { + $field = parent::changeSortType($field, $type); + } + } + return $field; + } +``` + + +##Збереження об'єкта DocLister + +Це може бути зручно, коли один і той же список необхідно шаблонізувати 2 рази. + +``` +$out1 = $modx->runSnippet('DocLister', array( + 'idType' => 'parents', + 'parents' => 0, + 'tpl' => '@CODE: [+pagetitle+]
    ', + 'saveDLObject' => '_DL' +)); +$_DL = $modx->getPlaceholder('_DL'); +$out2 = $_DL->docsCollection()->reduce(function($out, $data) use ($_DL, $modx){ + $data['title'] = empty($data['menutitle']) ? $data['pagetitle'] : $data['menutitle']; + $data['url'] = $modx->makeUrl($data['id']); + return $out.$_DL->parseChunk('@CODE: [+title+]
    ', $data); +}); +/** Або через підміну конфіга, щоб задіяти екстендери і штатну підготовку плейсхолдеров */ +$_DL->setConfig(array( + 'tpl' => '@CODE: [+title+]
    ' +)); +$out2 = $_DL->render(); +return implode("
    ", array($out1, $out2)); +``` + +Або, наприклад, потрібно отримати масив ID документів, які задіяні у висновку + +``` +$out = $modx->runSnippet('DocLister', array( + 'saveDLObject' => '_DL' +)); +$_DL = $modx->getPlaceholder('_DL'); +$ids = $_DL->getOneField('id'); +/** або через колекцію */ +$ids = $_DL->docsCollection()->map(function($val){ + return $val['id']; +})->toArray(); +``` + +##Використання шаблонізатора DocLister в своїх сніпета +Підключивши клас DLTemplate ви вже можете користуватися шаблонізатором, який: + + - Розуміє inline шаблони + - Вміє створювати плейсхолдери з багатовимірних масивів + - Автоматично активує phx при необхідності + - Дозволяє рендерити документ застосувавши будь-який шаблон (як із застосуванням подій, так і без них) + + +Найбільш вдала практика - створення шаблонізатора в змінної tpl у об'єкта $ modx. Щоб не робити це постійно, найкраще скористатися невеликим плагіном на події OnWebPageInit і OnPageNotFound +``` +require_once(MODX_BASE_PATH.'assets/snippets/DocLister/lib/DLTemplate.class.php'); +$modx->tpl = DLTemplate::getInstance($modx); +``` + +###Звичайна шаблонізація +``` +$data = array( + array('id' => 1, 'text' => 'hello', + 'info' => array( + 'phone' => '01', + 'site' => 'http://example.org' + ) + ), + array('id' => 2, 'text' => 'world', + 'info' => array( + 'phone' => '02', + 'site' => 'http://example.com' + ) + ) +); +$out = ''; +foreach($data as $item){ + $out .= $modx->tpl->parseChunk('@CODE: [+id+]. [+text+] ([+info.phone+], [+info.site+])', $item); +} +return $out; +``` + +###Підміна шаблону у документа +Найбільш вдалий приклад - версія для друку. Часом буває простіше зробити мінімальний шаблон кожного типу і налаштувати висновок так, як потрібно, ніж гратися з CSS. + +Для спрощення сприйняття, весь процес налаштування ТВ параметрів буде упущений. Тож уявімо, що у нас є: + + - Плагін cfgTV з префіксом для налаштувань cfg_. + - ТВ параметр зі списком ID можливих шаблонів для друку (для кожного документа можна вибрати свій шаблон) + - Посилання на версію для друку виводяться у вигляді [~[*id*]~]?save=print + +Створюємо плагін для подій OnLoadWebDocument і OnLoadWebPageCache +``` +if(isset($modx->print)) return; + +$defaultTPL = $modx->getConfig('cfg_printTPL'); +$modx->print = true; + +if(isset($_GET['save']) && $_GET['save']=='print' && !empty($modx->documentObject)){ + $tpl = !empty($modx->documentObject['printTPL'][1]) ? $modx->documentObject['printTPL'][1] : $defaultTPL; + if(!empty($tpl)){ + $modx->print = $modx->tpl->renderDoc($modx->documentObject['id'], true, (int)$tpl); + }else{ + $modx->print = false; + } +} + +if($modx->print){ + if($modx->print !== true){ + echo $modx->print; + die(); + } +}else{ + $modx->sendErrorPage(); +} +``` +Використовувати підміну шаблонів може бути зручно, якщо ви редагуєте сайт на гарячу (без розгортання девелоперських версій). diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/09_MODxAPI.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/09_MODxAPI.md" new file mode 100644 index 00000000..e76f7818 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/09_MODxAPI.md" @@ -0,0 +1,165 @@ +##Вступ +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: +``` +create(array( + 'pagetitle' => 'example', + 'template' => 10, + 'parent' => 1 +)); + +/** +* змінити pagetitle заголовок документа на new title +*/ +$doc->set('pagetitle', 'new title'); + +/* +* Зберегти документ викликавши події OnBeforeDocFormSave OnDocFormSave, +* але не виробляти скидання кешу. +* ID нового документа помістити в змінну id +*/ +$id = $doc->save(true, false); + +/** +* Відкрити на редагування документ з ID = 10 +*/ +$doc->edit(10); + +/** +* Міняємо батька документа +*/ +$doc->set('parent', 0); + + +/* +* Зберігаємо документ не викликаючи події OnBeforeDocFormSave OnDocFormSave, +* Але при цьому виробляємо скидання кеша. +* ID документа зберігається в змінної $id +*/ +$id = $doc->save(false, true); + +/*** +* Видалити всі документи, які помічені на видалення. +* При цьому викликати події OnBeforeEmptyTrash і OnEmptyTrash +* Якщо значення параметра змінити з true на false, то події викликані не будуть, хоча документи видаляться +*/ +$doc->clearTrash(true); + +/** +* Видалити документ з ID = 5, минаючи кошик +* При цьому події OnBeforeEmptyTrash і OnEmptyTrash, будуть викликані. +*/ +$doc->delete(5, true); +``` + +За допомогою моделі modUsers можна проводити не тільки запис і отримання даних, але ще і проводити маніпуляції з авторизацією: +``` +include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modUsers.php"); +$user = new modUsers($modx); + +/** +* Авторизуватись від імені веб-користувача з ID = 1 +*/ +$user->authUser(1); + +/** +* Перевірити статус блокування веб-користувача з ID = 1 +* Даний метод повертає значення типу boolean +* true - заблокований +* false - активний +*/ +$flag = $user->checkBlock(1); + +/** +* Перевірити пароль myPassword для веб-користувача з ID = 1 +* Після чого виконати перевірку статусу блокування. Якщо навіть пароль вказано вірний, а користувач заблокований, то даний метод поверне значення false. У разі, якщо змінити значення 3 параметра на false, то статус блокування перевірятися не буде. +* Даний метод повертає значення типу boolean +* true - вірний пароль +* false - пароль не коректний +*/ +$flag = $user->testAuth(1, 'myPassword', true); + +/** +* Примусово разлогініть веб-користувача +*/ +$user->logOut(); +``` + + +###Практичне застосування +*modUsers* +Наступний плагін для подій OnWebPageInit і OnPageNotFound, дозволяє виробляти моментальне застосування блокування. Це буває корисно, коли користувача начебто забанили, але він продовжує проявляти активність, тому що сесія не закінчилася. +``` +include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modUsers.php"); +$modx->user = new modUsers($modx); +if($modx->isFrontend() && $modx->getLoginUserID('web')){ + $modx->user->edit((int)$modx->getLoginUserID('web')); + if(!$modx->user->getID() || $modx->user->checkBlock()){ + $modx->user->logOut(); + } +} +``` + +*modResource* +Наступний сніпет дозволяє послідовно отримувати значення полів одного і того ж документа не виконуючи при цьому повторий SQL запит. +``` +/** +*
    [[DocInfo? &id=`6` &field=`pagetitle`]]
    +* +* З даним сніпетом буде виконаний всього 1 SQL запит +*/ +if(empty($modx->doc)){ + include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php"); + $modx->doc = new modResource($modx); +} +$id = isset($id) ? (int)$id : $modx->documentObject['id']; +$field = isset($field) ? (string)$field : 'id'; +if($field == 'id'){ + $out = $id; +}else{ + if($modx->documentObject['id'] == $id){ + $out = isset($modx->documentObject[$field]) ? $modx->documentObject[$field] : ''; + if(is_array($out)){ + $out = isset($out[1]) ? $out[1] : ''; + } + }else{ + $doc = clone $modx->doc; + $out = $doc->edit($id)->get($field); + } +} +return (string)$out; +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/10_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/10_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..907a38af --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/10_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,50 @@ +

    DocLister: Особливості

    +особливості сніпета 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 - циклічна навігація вперед / назад між сусідніми документами
    • +
    • DLMenu - Побудова меню необмеженої вкладеності
    • +
    • DLSitemap - Побудова xml-карти сайту
    • +
    • DLReflect - Побудова списку дат
    • +
    • DLReflectFilter - Фільтрація документів по датах
    • +
    • DLBeforeAfter - Пагінація по минулим і майбутнім подіями з урахуванням поточної дати
    • +
    +

    Компоненти на базі DocLister:

    +
      +
    • SimpleGallery – висновок галереї на сторінці
    • +
    • SimpleTube – плагін і сніпет для створення відеогалереї +
    • +
    • SimpleFiles – прикріплюємо на сторінку файли
    • +
    • SimplePolls
    • +
    • LikeDislike – можливість ставити оцінки
    • +
    • FormLister - cніпет для роботи з формами
    • +
    • FastImageTV
    • +
    • DLRequest - запуск сніпетів з параметрами з get/post
    • +
    • evoSearch
    • +
    • eFilter
    • +
    • Selector - custom TV для складання списку документів
    • +
    +

    Автор: Agel_Nash

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/index.md" new file mode 100644 index 00000000..98166357 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/DocLister/index.md" @@ -0,0 +1,20 @@ +Автор: [Agel Nash](https://github.com/AgelxNash/) + +Сніпет для виведення інформації з різних таблиць. Спочатку розроблявся як заміна сніпета Ditto, але в підсумку істотно перевершив його в можливостях, гнучкості і продуктивності. При цьому в простих випадках використовувати DocLister не складніше, ніж Ditto (багато параметрів збігаються). + +Відмітні особливості: + +* легко розширюється; +* дозволяє виводити дані з будь-яких таблиць (в тому числі з каталогу Shopkeeper); +* є можливість вивести дані в json-форматі; +* можливість довільної обробки даних перед виведенням; +* зручні засоби налагодження; +* сортування по TV-параметрам з перетворенням типів; +* фільтрація документів, в тому числі по TV-параметрам; +* підтримка лексиконів; +* завантаження параметрів з файлів. + +Для роботи DocLister потрібно PHP 5.3 або вище. + +[Github](https://github.com/AgelxNash/DocLister) + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..16a8c6b6 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,15 @@ + + +

    Easy Newsletter: Особливості

    +Особливості модуля Easy Newsletter Масова електронна розсилка листів на Evolution CMS. +
    +

    Easy Newsletter - дозволяє організувати інформаційну розсилку вашим підписникам, звертатися до підписників в межах менеджера і дозволити відвідувачам самостійно підписатися/відписатися від розсилки.

    +
      +
    • Відвідувачі можуть підписатися і відмовитися від підписки на вашу розсилку.
    • +
    • Підписна форма може перебувати на будь-якій сторінці вашого сайту.
    • +
    • Ви можете відредагувати і видалити підписників.
    • +
    • Створюйте та редагуйте розсилку в форматі HTML.
    • +
    • Проводьте тестову розсилку перш, ніж Ви розішле її підписникам
    • +
    • Різні методи відправки листів: SMTP, Qmail MTA, Sendmail, пошта PHP.
    • +
    • Цей випуск містить англійську, німецьку, італійську та датську мови. Ви можете додати власні мовні файли.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/02_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/02_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..254cecb0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/02_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,17 @@ + + +

    Easy Newsletter: Встановлення

    +Встановлення модуля Easy Newsletter. Масова електронна розсилка листів на Evolution CMS. +
    +

    Примітка: З метою безпеки, перш, ніж встановлювати Easy Newsletter, не забудьте зробити резервну копію вашого сайту!

    +

    1. Скачайте останню версію Easy Newsletter.

    +

    2. Помістіть папку easynewsletter із завантаженого архіву в папку "assets/modules/"

    +

    3. Створіть новий модуль з назвою "Easy Newsletter", описом "<strong>0.3</strong> Newsletter manager." і помістіть в код модуля вміст файлу "module.txt".

    +

    4. Збережіть модуль. Тепер нам необхідно дізнатися ID створеного модуля. У Mozilla Firefox це робиться в такий спосіб: зайдіть в режим редагування модуля і натисніть праву кнопку мишки і виберете пункт У цьому фреймі >> Відкрити фрейм у новій вкладці, у вкладці в адресному рядку з'явиться приблизно наступна конструкція: "index.php?a=108&id=3", де "&id=3" це і є вказівка ​​на ID модуля. Запам'ятайте цифру 3, але у вас вона може відрізнятися. Перейдіть в конфігурацію модуля і в поле "Конфігурація модуля:" помістіть наступний код:

    +
    &modId=Module ID;int;3 &path=Path;text;../assets/modules/easynewsletter/
    +

    попередньо змінивши цифру 3, на ID вашого модуля, якщо він у вас відрізняється.

    +

    5. Збережіть модуль.

    +

    6. Вийдіть з адміністративної частини і зайдіть знову.

    +

    7. Створіть новий сніпет "easy newsletter" з описом "<strong>0.3</strong> Subscription for front end." і помістіть в код сніпета вміст файлу "snippet.txt"

    +

    8. Помістіть виклик сніпета в тому місці вашого шаблону, де це необхідно:

    +
    [!easy newsletter!]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/03_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/03_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..0f9582bc --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/03_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,27 @@ + + +

    Easy Newsletter: Налаштування

    +Налаштування модуля Easy Newsletter. Масова електронна розсилка листів на Evolution CMS. +
    +

    Налаштування мовного файлу

    1. В папці /assets/modules/easynewsletter/languages/ знаходяться мовні файли. Тут вже є файли для датського, німецького, італійського та англійської мов. Щоб створити власний мовний файл, скопіюйте, наприклад, файл english.php і перейменуйте його в russian.php. Потім відкрийте файл russian.php і перекладіть його. Мовний файл для російської мови повинен бути в кодуванні utf-8.

    +

    2. Щоб підключити файл російської мови, необхідно відредагувати файл /assets/modules/easynewsletter/backend.php, відкрийте цей файл і знайдіть ці рядки, які зустрічаються в коді двічі (319-320 і 331-332 рядки):

    +
    +
    +if(mysql_result($result,$i,"lang_frontend") == 'german'){$dropdown2 = ' selected="selected"';} else {$dropdown2 = '';}
    +$list .= '<option value="german"'.$dropdown2.'>Deutsch</option>';
    +
    +
    +

    в першому блоці відбувається підключення мовного файлу для форми підписки, яка відображається на сторінці сайту, а в другому блоці для мови встановленого модуля. Такі ж конструкції використовуються для інших мовних пакетів. Вставте відразу після цих рядків підключення власного мовного пакету:

    +
    +
    +if(mysql_result($result,$i,"lang_backend") == 'russian'){$dropdown2 = ' selected="selected"';} else {$dropdown2 = '';}
    +$list .= '<option value="russian"'.$dropdown2.'>Русский</option>';
    +
    +
    +

    Ви можете самі створити файл russian.php і відредагувати файл backend.php, або завантажте уже готові файли за цим посиланням.

    +

    Налаштування конфігурації модуля

    Зайдіть в модуль Модулі >> Easy Newsletter і перейдіть в розділ Configuration. В поле Language - website оберіть Русский, в поле Language - manager теж виберіть Російський. Збережіть зміни. Вийдіть з модуля і зайдіть спочатку, і якщо ви все зробили правильно, форма підписки і модуль будуть тепер російською мовою.

    +

    Знову зайдіть в модуль Модулі >> Easy Newsletter і перейдіть в розділ Конфігурація, тут вам необхідно заповнити поля Ім'я відправника, Електронна пошта відправника, Метод відправки листів і налаштування поштового сервера. Якщо ви не знаєте, які налаштування вибрати, уточніть інформацію у вашого хостера.

    +

    ВАЖЛИВО!

    +

    Робота модуля може бути нестабільної при великій кількості підписників 1000 і більше.

    +

    При створенні розсилки ви не можете використовувати жирний, курсивний і підкреслені шрифти.

    +

    Ви не зможете додавати в розсилку картинки.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/index.md" new file mode 100644 index 00000000..763715a4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/EasyNewsletter/index.md" @@ -0,0 +1,4 @@ + + +

    Easy Newsletter — масова електронна розсилка

    +Модуль Easy Newsletter — масова електронна розсилка листів на Evolution CMS. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..aa6eb76d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,84 @@ + + +

    FirstChildRedirect: Параметри

    +Параметри cніпета FirstChildRedirect переадресація на перший дочірній документ Evolution CMS. +
    +
    +
    + +
    +
    +Формат: id документа
    +Значення за замовчуванням: ID поточної сторінки
    +Примітка:
    +

    Приклад:

    +
    &docid=`12`
    +
    +
    +
    + +
    + +
    +
    +Формат: id доумента | site_start | site_unavailable_page | error_page | unauthorized_page
    +Значення за замовчуванням: site_start
    +Примітка:
    +

    Приклад:

    +
    &default=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: поле документа
    +Значення за замовчуванням: menuindex
    +Примітка: будь-яке припустиме поле документа
    +

    Приклад:

    +
    &sortBy=`pagetitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: ASC | DESC
    +Значення за замовчуванням: ASC
    +Примітка:
    ASC - за зростанням +
    DESC - по спаданню
    +

    Приклад:

    +
    &sortDir=`DESC`
    +
    +
    +
    + +
    + +
    +
    +Формат: 301 | 302 | HTTP/1.1 302 Moved Temporarily
    +Значення за замовчуванням: 301
    +Примітка:
    +

    +

    Приклад:

    +
    &responseCode=`302`
    +
    +
    +
    + +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..6781b476 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,9 @@ + + +

    FirstChildRedirect: Приклади

    +Приклади cніпета FirstChildRedirect переадресація на перший дочірній документ Evolution CMS. +
    +

    переадресація на перший дочірній документ:

    +
    [!FirstChildRedirect!]
    +

    переадресація на перший дочірній документ контейнера з id=12:

    +
    [[FirstChildRedirect? &docid=`12`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/index.md" new file mode 100644 index 00000000..70ac7677 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FirstChildRedirect/index.md" @@ -0,0 +1,4 @@ + + +

    FirstChildRedirect Переадресація на перший дочірній документ

    +Сніпет переадресації на перший дочірній документ Evolution CMS. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ForgotManagerLogin/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ForgotManagerLogin/index.md" new file mode 100644 index 00000000..fcc2c3ad --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ForgotManagerLogin/index.md" @@ -0,0 +1,13 @@ + + +

    Forgot Manager Login Відновлення пароля для входу в панель управління сайтом

    +Відновлення пароля для входу в панель управління сайтом. +

    За допомогою даного плагіна можна відновити пароль до панелі управління.

    +

    Плагін додає посилання "Забули свій пароль?" на сторінці авторизації. Посилання на зміну пароля відправляється на електронну адресу, вказану при реєстрації.

    +

    Системні події:

    +
      +
    • OnBeforeManagerLogin
    • +
    • OnManagerAuthentication
    • +
    • OnManagerLoginFormRender
    • +
    +

    Попередні версії плагіна мали критичні уразливості. Настійно рекомендується оновити плагін до актуальної версії, або відключити його.

    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\265\321\200\320\270.md" new file mode 100644 index 00000000..fa69d255 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/010_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\265\321\200\320\270.md" @@ -0,0 +1,50 @@ +## Контролери +Контролер являє собою клас, успадкований від базового класу \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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..d3114bf5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/020_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,291 @@ +## Загальні параметри + +Ці параметри обробляються базовим класом 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/030_\320\222\320\260\320\273\321\226\320\264\320\260\321\206\321\226\321\217 \320\264\320\260\320\275\320\270\321\205.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/030_\320\222\320\260\320\273\321\226\320\264\320\260\321\206\321\226\321\217 \320\264\320\260\320\275\320\270\321\205.md" new file mode 100644 index 00000000..f145fae8 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/030_\320\222\320\260\320\273\321\226\320\264\320\260\321\206\321\226\321\217 \320\264\320\260\320\275\320\270\321\205.md" @@ -0,0 +1,149 @@ +## Валідація даних + +При валідації даних валідатор послідовно застосовує до значення поля задані правила, при виникненні помилки в масив даних про помилки додається запис і подальша обробка форми припиняється. + +Валідація вважається пройденою, якщо в масиві даних про помилки відсутні записи. + +### Правила валідації +Список правил задається у вигляді масиву. Ключем є ім'я поля, а значенням - масив правил валідації. Правило валідації є методом класу-валідатора. У масиві правил ключем є ім'я правила (назва методу валідації), значенням може бути або рядок з повідомленням про помилку валідації правила, або ж масив з описом. У цьому масиві в ключі 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 в списку правил). + +При цьому, **true** - означає що перевірка пройшла успішно і все добре, **false** або **рядок з текстом помилки** - що перевірка пройшла з помилкою. + +Приклад сніпета з функцією для перевірки чи є в перевіряємом полі посилання, і якщо є то повертаємо помилку: +``` + 0) { + // Посилання є, не важливо скільки, повернення помилки + return false; + } + + // Посилань немає, валідація пройшла успішно + return true; +} +``` + +У прикладі використовується назва правила "сustom", але можна використовувати будь-яку назву правила, якого немає в класі валідації. Таким чином можна використовувати кілька правил даного типу. + +### Результати валідації +Дані про помилки зберігаються у вигляді масиву і можуть бути отримані викликом методу getFormData('errors'): +``` +{ + "ім'я поля 1": { + "ім'я порушеного правила" : "повідомлення про помилку" + }, + "ім'я поля 2": { + "ім'я порушеного правила" : "повідомлення про помилку" + } +} +``` +Для додавання даних в цей масив використовується метод addError (ім'я поля, ім'я правила, повідомлення про помилку). Таким чином, можна впливати на підсумковий результат валідації, вручну додаючи записи в цей масив. Можна також оголосити валідацію непройденной за замовчуванням, викликавши метод setValid (false). + +У шаблонах результати валідації для кожного поля виводяться за допомогою плейсхолдера [+ім'я поля.error+]. Загальний результат може бути виведений в плейсхолдер [+form.messages+], який задається шаблоном messagesTpl. У свою чергу, в цьому шаблоні можна використовувати плейсхолдери: + +- [+required+] - повідомлення про незаповнені поля; +- [+ errors +] - повідомлення про невірно заповнені поля. + +Отримати повідомлення про помилки для певного поля можна за допомогою методу getErrorMessage (ім'я поля). diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/035_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 \320\272\320\260\320\277\321\207\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/035_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 \320\272\320\260\320\277\321\207\321\226.md" new file mode 100644 index 00000000..2221f96b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/035_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 \320\272\320\260\320\277\321\207\321\226.md" @@ -0,0 +1,175 @@ +## Використання капчі + +За замовчуванням 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: +
    +
    +
    +
    + + +
    + +
    + + [+phone.error+] +
    +
    +[+form.messages+] +
    +
    + +
    +
    + + + [+vericode.error+] +
    +
    +
    +
    ` +&successTpl=`@CODE:Код авторизації відправлений на номер [+phone.value+]. Термін дії коду - 3 хвилини.` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/040_\320\222\320\270\320\262\321\226\320\264 \320\264\320\260\320\275\320\270\321\205.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/040_\320\222\320\270\320\262\321\226\320\264 \320\264\320\260\320\275\320\270\321\205.md" new file mode 100644 index 00000000..6c68b78d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/040_\320\222\320\270\320\262\321\226\320\264 \320\264\320\260\320\275\320\270\321\205.md" @@ -0,0 +1,57 @@ +## Виведення даних + +Для виведення в шаблони дані екрануються, а масиви перетворюються в рядки. Крім цього, для елементів управління встановлюються спеціальні плейсхолдери. + +Виведення неекранованого значення поля: +``` +[+ім'я поля+] +``` + +Виведення значення поля: +``` +[+ім'я поля.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/050_\320\222\321\226\320\264\320\277\321\200\320\260\320\262\320\272\320\260 \320\273\320\270\321\201\321\202\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/050_\320\222\321\226\320\264\320\277\321\200\320\260\320\262\320\272\320\260 \320\273\320\270\321\201\321\202\321\226\320\262.md" new file mode 100644 index 00000000..aa3b8926 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/050_\320\222\321\226\320\264\320\277\321\200\320\260\320\262\320\272\320\260 \320\273\320\270\321\201\321\202\321\226\320\262.md" @@ -0,0 +1,237 @@ +## Надсилання листів + +Контролер Form дозволяє відправляти дані форми в листі. + +## Параметри відправки пошти +### parseMailerParams +Дозволяє використовувати дані форми в параметрах відправки пошти (&to=\`[+user.email.value+]\` и т.п.). + +Можливі значення - 1, 0. + +Значення за замовчуванням - 0. + +### 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, ccSubject, autoSubject +Тема листа. + +Можливі значення - рядок. + +Значення за замовчуванням - порожньо. + +### subjectTpl, ccSubjectTpl, autoSubjectTpl +Шаблон теми листа. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - значення параметра subject (ccSubject, autoSubject). + +### autosender +Адреса на який відправляється додатковий лист. + +Можливі значення - email-адреса. + +Значення за замовчуванням - порожньо. + +### autosenderFromName +Ім'я відправника додаткового листа. + +Можливі значення - рядок. + +Значення за замовчуванням - параметр конфігурації site_name. + +### ccSender +Якщо параметр заданий, то на адресу вказану в полі форми відправляється лист. + +Можливі значення - 1, 0. + +Значення за замовчуванням-0. + +### ccSenderField +Ім'я поля, в якому зберігається адреса одержувача. + +Можливі значення - ім'я поля форми. + +Значення за замовчуванням - email. + +### ccSenderFromName +Ім'я відправника листа на задану в полі форми адресу. + +Можливі значення - рядок. + +Значення за замовчуванням - не вказано. + +## ccMailConfig +Дозволяє перевизначити параметри відправки для листів, що відправляються за адресою з форми (isHtml, from, fromName, subject, replyTo, cc, bcc, noemail). + +Можливі значення - JSON або php масив. + +Значення за замовчуванням - не вказано. + +## autoMailConfig +Дозволяє перевизначити параметри відправки для додатково відправлених листів (isHtml, from, fromName, subject, replyTo, cc, bcc, noemail). + +Можливі значення - JSON або php масив. + +Значення за замовчуванням - не вказано. + +## Захист від повторної відправки +### 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\321\226\321\217 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\321\226\321\217 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262.md" new file mode 100644 index 00000000..164a63d8 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/060_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\321\226\321\217 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262.md" @@ -0,0 +1,129 @@ +## Авторизація користувачів + +Авторизація користувачів в `FormLister` здійснюється з використанням контролера `Login`. + +Авторизація може проходити по імені, email або іншому полю з облікового запису. Поле задається в параметрі `loginField`. Поле для авторизації має бути **унікальним** для кожного веб-користувача. Зазвичай для авторизації використовуються поля `username` або `email`. + +Додаткове використання плагіна [userHelper](https://github.com/evolution-cms/evolution/blob/develop/assets/snippets/FormLister/snippet.FormLister.php) дозволяє: + +* вести облік кількості логінів +* визначити час останньої авторизації +* реалізувати автологін або вихід з облікового запису + +Перед використанням плагіна `userHelper` переконайтеся що він не відключений: + +![Не забудьте включити userHelper](https://habrastorage.org/web/dbc/1e2/abd/dbc1e2abd8664a548f4eca254187fb60.png) + +## Параметри контролера + +### 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 +Перенаправляє користувача на сторінку з зазначеним 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/070_\320\240\320\265\321\224\321\201\321\202\321\200\320\260\321\206\321\226\321\217 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/070_\320\240\320\265\321\224\321\201\321\202\321\200\320\260\321\206\321\226\321\217 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262.md" new file mode 100644 index 00000000..600b8745 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/070_\320\240\320\265\321\224\321\201\321\202\321\200\320\260\321\206\321\226\321\217 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\321\226\320\262.md" @@ -0,0 +1,137 @@ +## Регистрация пользователей + +Контролер 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\321\226\321\217 \320\276\320\261\320\273\321\226\320\272\320\276\320\262\320\270\321\205 \320\267\320\260\320\277\320\270\321\201\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\321\226\321\217 \320\276\320\261\320\273\321\226\320\272\320\276\320\262\320\270\321\205 \320\267\320\260\320\277\320\270\321\201\321\226\320\262.md" new file mode 100644 index 00000000..a0701a42 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/075_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\321\226\321\217 \320\276\320\261\320\273\321\226\320\272\320\276\320\262\320\270\321\205 \320\267\320\260\320\277\320\270\321\201\321\226\320\262.md" @@ -0,0 +1,84 @@ +## Активация учетных записей + +Контролер Activate реалізує активацію облікового запису. Таким чином з'являється можливість вимагати у користувача підтвердження облікового запису шляхом переходу по спеціальному посиланню з листа, відправленого при реєстрації. + +Якщо з якоїсь причини користувач не отримав лист, то з допомогою контролера 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/080_\320\240\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217 \320\277\321\200\320\276\321\204\321\226\320\273\321\216 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/080_\320\240\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217 \320\277\321\200\320\276\321\204\321\226\320\273\321\216 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" new file mode 100644 index 00000000..65e08916 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/080_\320\240\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217 \320\277\321\200\320\276\321\204\321\226\320\273\321\216 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" @@ -0,0 +1,99 @@ +## Редагування профілю користувача + +Контролер 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/085_\320\222\320\270\320\264\320\260\320\273\320\265\320\275\320\275\321\217 \320\277\321\200\320\276\321\204\321\226\320\273\321\216 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/085_\320\222\320\270\320\264\320\260\320\273\320\265\320\275\320\275\321\217 \320\277\321\200\320\276\321\204\321\226\320\273\321\216 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" new file mode 100644 index 00000000..c4897a16 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/085_\320\222\320\270\320\264\320\260\320\273\320\265\320\275\320\275\321\217 \320\277\321\200\320\276\321\204\321\226\320\273\321\216 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" @@ -0,0 +1,50 @@ +## Видалення профілю користувача + +Контролер 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/090_\320\222\321\226\320\264\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217 \320\277\320\260\321\200\320\276\320\273\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/090_\320\222\321\226\320\264\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217 \320\277\320\260\321\200\320\276\320\273\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" new file mode 100644 index 00000000..5c14720c --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/090_\320\222\321\226\320\264\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217 \320\277\320\260\321\200\320\276\320\273\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" @@ -0,0 +1,143 @@ +## Відновлення паролів користувачами + +Контролер 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/100_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217 \321\202\320\260 \321\200\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/100_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217 \321\202\320\260 \321\200\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" new file mode 100644 index 00000000..bc559c97 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/100_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217 \321\202\320\260 \321\200\320\265\320\264\320\260\320\263\321\203\320\262\320\260\320\275\320\275\321\217 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" @@ -0,0 +1,166 @@ +## Створення та редагування документів користувачами + +Контролер Content дозволяє web-користувачам створювати і редагувати записи в таблицях MODxAPI. Розширює контролер Form, що дозволяє відправляти листи після створення запису. При редагуванні записів відправка пошти відключена, при необхідності її можна реалізувати за допомогою плагінів на подію збереження (OnDocFormSave і т.п.). + +Дані форми передаються в об'єкт MODxAPI як є, відповідно розробнику потрібно піклуватися про їх коректність самостійно. + +При редагуванні записів можна заборонити зміну окремих полів, використовуючи параметр keepDefaults. + +При створенні нового запису викликається подія OnMakeDocUrl, в яке передається id запису і масив data зі значеннями полів запису. Це дозволяє повернути посилання на створений запис, вона буде доступна через плейсхолдер [+content.url+]. Посилання можна використовувати в листі c повідомленням про створення нового запису. + +Також можна використовувати дані авторизованого користувача, доступні через плейсхолдери [+user.fullname+], [+user.email+] і т.д. + +## Параметри +### model +Клас MODxAPI. + +Можливі значення - ім'я класу MODxAPI. + +Значення за замовчуванням - \modResource. + +### modelPath +Шлях до файлу класу, якщо клас не завантажується заздалегідь. + +Можливі значення - відносний шлях до файлу. + +Значення за замовчуванням - assets/lib/MODxAPI/modResource.php. + +### userModel +Клас для роботи з користувачами. + +Можливі значення - ім'я класу. + +Значення за замовчуванням - \modUsers + +### userModelPath +Шлях до файлу класу для роботи з користувачами. + +Можливі значення - відносний шлях до файлу. + +Значення за замовчуванням - assets/lib/MODxAPI/modUsers.php + +### onlyUsers +Дозволити додавання записів тільки для зареєстрованих користувачів. + +Можливі значення - 0, 1. + +Значення за замовчуванням - 1. + +### userGroups +Групи користувачів, яким дозволено додавати або змінювати записи. + +Можливі значення - список груп через крапку з комою. + +Значення за замовчуванням - порожньо (дозволені будь-які групи). + +### onlyOwners +Дозволяє редагування записів тільки їх авторами. Автор визначається по полю, вказаному в параметрі ownerField. + +Можливі значення - 0, 1. + +Значення за замовчуванням - 1. + +### ownerField +Ім'я поля, що визначає власника запису. Якщо працювати з документами modResource, то це буде ім'я tv-параметра (в Evo не передбачено створення записів веб-користувачами). + +Можливі значення - ім'я поля. + +Значення за замовчуванням - aid. + +### idField +Ім'я ключа масиву $ _REQUEST, за яким визначається id редагованого запису. Якщо ключ не заданий, то контролер викликається в режимі створення записів. Інформацію про режим контролера можна отримати за допомогою методу getMode. + +У формі редагування потрібно передбачити приховане поле з ім'ям параметра, в якому буде зберігатися id запису. + +Значення за замовчуванням - id. + +### contentFields +Задає зіставлення полів MODxAPI і полів форми. Можна не задавати, якщо імена полів збігаються. Якщо параметр не заданий, то обмежити список переданих в модель полів можна за допомогою параметрів allowedFields і forbiddenFields. + +Можливі значення - масив виду: +``` +&contentFields=`{ + "поле MODxAPI":"поле форми", + "поле MODxAPI":"поле форми" +} +` +``` +Значення за замовчуванням - порожньо. + +### clearCache +Очищати кеш після збереження запису. + +Можливі значення - 0, 1. + +Значення за замовчуванням - 0. + +### redirectTo +Перенаправляє користувача на вказану статтю після збереження нового запису. У режимі редагування не використовується. + +Можливі значення - id цільової сторінки або масив. + +Значення за замовчуванням - порожньо. + +### editAfterCreate +Переправляє користувача на сторінку для редагування створеного запису. Сторінка вказується в параметрі redirectTo. + +Можливі значення - 1 або 0. + +Значення за замовчуванням - 0. + +### editTpl +Шаблон форми для редагування документа. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - значення параметра formTpl. + +### badOwnerTpl +Шаблон повідомлення про те, що користувач не є автором документа. Тільки режим редагування. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - запис з лексикону Content з ключем [+edit.default_badOwnerTpl+]. + +### badGroupTpl, badGroupEditTpl +Шаблон повідомлення про те, що користувач не входить в групу користувачів яким дозволено створювати і редагувати документи. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - запис з лексикону Content з ключем +[+create.default_badGroupTpl+] або [+edit.default_badGroupTpl+]. + +### badRecordTpl +Шаблон повідомлення про те, що користувач не може редагувати запис: наприклад, запис не існує. Тільки режим редагування. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - запис з лексикону Content з ключем [+edit.default_badRecordTpl+]. + +### exitTo +Перенаправляє неавторизованого користувача на вказану статтю. + +Можливі значення - id цільової сторінки або масив. + +Значення за замовчуванням - порожньо. + +### skipTpl, skipEditTpl +Шаблон повідомлення для неавторизованого користувача. Для режиму редагування - skipEditTpl. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - запис з лексикону Content з ключем [+create.default_skipTpl+] (edit.default_skipEditTpl). + +### successTpl +Шаблон повідомлення про успішне збереження нового запису. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - запис з лексикону Content з ключем [+create.default_successTpl+] + +### editSuccessTpl +Шаблон повідомлення про успішне оновлення запису. + +Можливі значення - ім'я шаблону, вказане за правилами завдання шаблонів в DocLister. + +Значення за замовчуванням - порожньо. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/105_\320\222\320\270\320\264\320\260\320\273\320\265\320\275\320\275\321\217 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/105_\320\222\320\270\320\264\320\260\320\273\320\265\320\275\320\275\321\217 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" new file mode 100644 index 00000000..1f86a704 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/105_\320\222\320\270\320\264\320\260\320\273\320\265\320\275\320\275\321\217 \320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262 \320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260\320\274\320\270.md" @@ -0,0 +1,97 @@ +## Видалення профілю користувача + +Контролер 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\320\270.md" new file mode 100644 index 00000000..941304d5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/110_\320\233\320\265\320\272\321\201\320\270\320\272\320\276\320\275\320\270.md" @@ -0,0 +1,18 @@ +## Лексикони + +Для використання лексиконів необхідно створити папку з повною назвою мови (russian-UTF8, english і т. д.), в ній створити файл назва_лексикона.inc.php: +``` + +``` +Для завантаження лексиконів при виклику сніппета слід вказати параметри: + +* langDir - шлях до папки з лексиконами; +* lang - мова лексикону (якщо не вказано, то використовується параметр конфігурації manager_language); +* lexicon - назва лексикону, можна вказати кілька назв через кому. + +Після цього в шаблонах можна використовувати плейсхолдери [%ключ%] для підстановки значень з завантажених мовних файлів. Крім того підтримуються лексикони компонента EvoBabel. \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/001_\320\237\321\200\320\276\321\201\321\202\320\260_\321\204\320\276\321\200\320\274\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/001_\320\237\321\200\320\276\321\201\321\202\320\260_\321\204\320\276\321\200\320\274\320\260.md" new file mode 100644 index 00000000..1aff4fb1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/001_\320\237\321\200\320\276\321\201\321\202\320\260_\321\204\320\276\321\200\320\274\320\260.md" @@ -0,0 +1,90 @@ +``` +[!FormLister? +&formid=`basic` +&rules=` +{ + "name":{ + "required":"Обов'язково введіть ім'я", + "matches":{ + "params":"\/^[\\pL\\s\\-']++$\/uD", + "message":"Введіть ім'я правильно" + } + }, + "email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" + }, + "phone":{ + "required":"Обов'язково введіть номер телефону", + "phone":"Введіть номер правильно" + }, + "message":{ + "required":"Обов'язково напишіть повідомлення", + "minLength":{ + "params":10, + "message":"Повідомлення повинно бути не менше 10 символів" + } + } +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+phone.error+] +
    +
    + +
    + +
    + + [+message.error+] +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&ccSender=`1` +&ccSenderField=`email` +&ccSenderTpl=`@CODE:Дякую за звернення, [+name.value+]` +&reportTpl=`@CODE: +

    Имя: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +

    Повідомлення: [+message:strip_tags:nl2br+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Нове повідомлення` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/002_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270_\320\272\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/002_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270_\320\272\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..2d688861 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/002_\320\225\320\273\320\265\320\274\320\265\320\275\321\202\320\270_\320\272\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,139 @@ +``` +[!FormLister? +&formid=`advanced` +&rules=`{ +"name":{ + "required":"Обов'язково введіть ім'я" +}, +"email":{ + "required":"Обов'язково введіть email" +}, +"phone":{ + "required":"Обов'язково введіть номер телефону", + "phone":"Введіть номер правильно" +}, +"message":{ + "required":"Звернення не може бути порожнім", + "minLength":{ + "params":100, + "message":"Повинно бути не менше 100 символів" + } +}, +"agree":{ + "required":"Ви не можете відправити звернення, якщо не згодні з правилами" +}, +"products":{ + "minCount":{ + "params": 2, + "message": "Виберіть мінімум 2 продукти" + } +} +}` +&defaults=`{ +"topic":"Скарга" +}` +&formControls=`topic,agree,department,products` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+name.error+] +
    +
    +
    +
    + + + [+email.error+] +
    +
    +
    +
    + + + [+phone.error+] +
    +
    +
    +
    + + +
    +
    + +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    + +
    + [+products.error+] +
    +
    + + + [+message.error+] +
    +
    + + [+agree.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&subjectTpl=`@CODE: [+topic.value+] в [+department.value+]` +&reportTpl=`@CODE: +

    Ім'я: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +

    Продукти: [+products.value+]

    +

    Повідомлення: [+message:strip_tags:nl2br+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Нове повідомлення` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/003_\320\222\321\226\320\264\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/003_\320\222\321\226\320\264\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\321\226\320\262.md" new file mode 100644 index 00000000..897983bf --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/003_\320\222\321\226\320\264\320\277\321\200\320\260\320\262\320\272\320\260_\321\204\320\260\320\271\320\273\321\226\320\262.md" @@ -0,0 +1,118 @@ + +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обов'язково введіть ім'я" +}, +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +}, +"message":{ + "required":"Обов'язково введіть повідомлення" +} +}` +&attachments=`first,second` +&attachFiles=`{"userfile":{"filepath":"assets/images/logo.png","filename":"logo.png"}}` +&fileRules=`{ +"first":{ + "required":"Прикладіть документ", + "allowed":{ + "params": [ ["doc","docx","pdf"] ], + "message": "Дозволені тільки документи Word і Pdf" + }, + "maxSize" : { + "params": 100, + "message": "Розмір файлу не повинен перевищувати 100 кб" + } +}, +"second":{ + "required":"Прикладіть 2 картинки", + "maxSize" : { + "params": 1024, + "message": "Розмір файлу не повинен перевищувати 1 мб" + }, + "allowed": { + "params": [ ["jpg","jpeg","png","gif"] ], + "message" : "Дозволені тільки картинки" + }, + "maxCount":{ + "params" : 4, + "message" : "Не більше 4 картинок" + }, + "minCount":{ + "params" : 2, + "message" : "Не менше 2 картинок" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+message.error+] +
    +
    +
    + +
    + + [+first.error+] +
    +
    +
    + +
    + + [+second.error+] +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&reportTpl=`@CODE: +

    Ім'я: [+name.value+]

    +

    Email: [+email.value+]

    +

    Повідомлення: [+message:strip_tags:nl2br+]

    +

    Документи:[+first.value+]

    +

    Картинки:[+second.value+]

    +

    Дод.:[+userfile.value+] +

    Вкладення: [+attachments.value+]

    +` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Нове повідомлення` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/004_\320\244\320\276\321\200\320\274\320\260_\320\267_\320\272\320\260\320\277\321\207\320\265\321\216.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/004_\320\244\320\276\321\200\320\274\320\260_\320\267_\320\272\320\260\320\277\321\207\320\265\321\216.md" new file mode 100644 index 00000000..fc15664d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/004_\320\244\320\276\321\200\320\274\320\260_\320\267_\320\272\320\260\320\277\321\207\320\265\321\216.md" @@ -0,0 +1,84 @@ +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обов'язково введіть ім'я" +}, +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +}, +"phone":{ + "required":"Обов'язково введіть номер телефону", + "phone":"Введіть номер правильно" +}, +"message":{ + "required":"Обов'язково напишіть повідомлення", + "minLength":{ + "params":100, + "message":"Повідомлення повинно бути не менше 100 символів" + } +} +}` +&captcha=`modxCaptcha` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + + [+name.error+] +
    +
    +
    + +
    + + [+email.error+] +
    +
    +
    + +
    + + [+phone.error+] +
    +
    + +
    + +
    + + [+message.error+] +
    +
    + [+form.messages+] +
    + +
    +
    Введіть число
    + + [+vericode.error+] +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    ` +&errorClass=` has-error` +&requiredClass=` has-warning` +&subject=`Нове повідомлення` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/005_\320\222\320\270\320\262\321\226\320\264_\320\277\320\276\320\262\321\226\320\264\320\276\320\274\320\273\320\265\320\275\321\214.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/005_\320\222\320\270\320\262\321\226\320\264_\320\277\320\276\320\262\321\226\320\264\320\276\320\274\320\273\320\265\320\275\321\214.md" new file mode 100644 index 00000000..e43d0edf --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/005_\320\222\320\270\320\262\321\226\320\264_\320\277\320\276\320\262\321\226\320\264\320\276\320\274\320\273\320\265\320\275\321\214.md" @@ -0,0 +1,74 @@ + +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обов'язково введіть ім'я" +}, +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +}, +"phone":{ + "required":"Обов'язково введіть номер телефону", + "phone":"Введіть номер телефону правильно" +}, +"message":{ + "required":"Обов'язково напишіть повідомлення", + "minLength":{ + "params":100, + "message":"Повідомлення повинно бути не менше 100 символів" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + [+form.messages+] +
    +
    + +
    +
    +
    +
    +
    +
    ` +&messagesTpl=`@CODE:
    [+required+][+errors+][+messages+]
    ` +&messagesRequiredOuterTpl=`@CODE:
    Ви не заповнили обов'язкові поля
    [+messages+]
    ` +&messagesErrorOuterTpl=`@CODE:
    Деякі поля заповнені невірно
    [+messages+]
    ` +&messagesOuterTpl=`@CODE:
    [+messages+]
    ` +&errorClass=` has-error` +&requiredClass=` has-warning` +&errorTpl=`@CODE:[+message+]` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\270_\320\277\320\276\320\273\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\270_\320\277\320\276\320\273\321\226\320\262.md" new file mode 100644 index 00000000..ddee1dc3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/006_\320\224\320\262\320\260_\320\275\320\260\320\261\320\276\321\200\320\270_\320\277\320\276\320\273\321\226\320\262.md" @@ -0,0 +1,147 @@ +Залежно від значення поля type використовуються різні правила валідації і шаблони листа. + +### Вызов FormLister +``` +[!FormLister? +&formid=`basic` +&rules=`{ +"name":{ + "required":"Обов'язково введіть имя" +}, +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +}, +"phone":{ + "required":"Обов'язково введіть номер телефону", + "phone":"Введіть номер правильно" +} +}` +&entRules=`{ +"entname":{ + "required":"Обов'язково введіть ім'я" +}, +"entemail":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +}, +"entphone":{ + "required":"Обов'язково введіть номер телефону", + "phone":"Введіть номер правильно" +}, +"entaddress":{ + "required":"Обов'язково введіть адресу" +} +}` +&formControls=`type` +&defaults=`{"type":"Фізична особа"}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + +
    +

    Заповнюється тільки фізособами

    +
    + + + + [+name.error+] + +
    +
    +
    +
    + + + + [+email.error+] + +
    +
    +
    +
    + + + + [+phone.error+] + +
    +
    +
    +

    Заповнюється тільки юрособами

    +
    + + + [+entname.error+] + +
    +
    +
    +
    + + + [+entemail.error+] +
    +
    +
    +
    + + + [+entphone.error+] +
    +
    +
    +
    + + + [+entaddress.error+] + +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`test@test.com` +&subjectTpl=`@CODE:[+type.value+]` +&reportTpl=`@CODE: +

    Ім'я: [+name.value+]

    +

    Телефон: [+phone.value+]

    +

    Email: [+email.value+]

    +` +&reportEntTpl=`@CODE: +

    Назва підприємства: [+entname.value+]

    +

    Телефон: [+entphone.value+]

    +

    Email: [+entemail.value+]

    +

    Юридична адреса: [+entaddress.value+]

    +` +&prepare=`typeSelector` +&errorClass=` has-error` +&requiredClass=` has-warning` +&messagesOuterTpl=`@CODE:` +&errorTpl=`@CODE:[+message+]` +!] +``` +### Prepare-сніпет typeSelector +``` +if ($FormLister->getField('type') == 'Юридична особа') { + $FormLister->config->setConfig(array( + 'rules'=>$FormLister->getCFGDef('entRules'), + 'reportTpl'=>$FormLister->getCFGDef('reportEntTpl') + )); +} else { + $FormLister->setField('type','Фізична особа'); +} +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..6100daa5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/007_\320\220\320\262\321\202\320\276\321\200\320\270\320\267\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,47 @@ +``` +[!FormLister? +&formid=`login` +&controller=`Login` +&loginField=`email` +&rules=`{ +"email":{ + "required":"обов'язково введіть email", + "email":"Введіть email правильно" +}, +"password":{ + "required":"Обов'язково введіть пароль" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    +
    + + + [+password.error+] +
    + [+form.messages+] +
    + +
    + +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&skipTpl=`@CODE:
    Ви вже авторизовані.
    ` +&successTpl=`@CODE:
    Привіт, [+fullname+]!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/008_\320\240\320\265\321\224\321\201\321\202\321\200\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/008_\320\240\320\265\321\224\321\201\321\202\321\200\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..7a906e3b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/008_\320\240\320\265\321\224\321\201\321\202\321\200\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,97 @@ + +Під час реєстрації користувач додається в групу opt. Відправляється два листи - менеджеру і користувачеві. Користувач повинен підтвердити реєстрацію, перейшовши за посиланням з листа (див. Активація облікових записів). + +``` +[!FormLister? +&formid=`register` +&controller=`Register` +&userGroups=`opt` +&checkActivation=`1` +&activateTo=`1514` +&rules=`{ +"fullname":{ + "required":"Обов'язково введіть ім'я" +}, +"email":{ + "required":"обов'язково введіть email", + "email":"Введіть email правильно" +}, +"password":{ + "required":"Обов'язково введіть пароль", + "minLength":{ + "params":6, + "message":"У паролі має бути більше 6 символів" + } +}, +"repeatPassword":{ + "required":"Повторіть пароль", + "equals":{ + "message":"Паролі не співпадають" + } +}, +"agree":{ + "required":"Для реєстрації ви повинні прийняти правила" +} +}` +&allowedFields=`fullname` +&formControls=`agree` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+fullname.error+] +
    +
    + + + [+email.error+] +
    +
    +
    +
    + + + [+password.error+] +
    +
    +
    +
    + + + [+repeatPassword.error+] +
    +
    +
    +
    + + [+agree.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&to=`info@sitename.ru` +&reportTpl=`@CODE:Новий користувач [+fullname.value+] ([+id.value+])` +&ccSender=`1` +&ccSenderField=`email` +&ccSenderTpl=`@CODE:Привіт [+fullname.value+]. Для активації облікового запису потрібно перейти за посиланням [+activate.url+]` +&subject=`Реєстрація на сайті [(site_name)]` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    Вітаємо з успішною реєстрацією, [+fullname.value+]! Після активації ви можете авторизуватись на сайті. Якщо ви не отримали листа для активації облікового запису, попросіть його ще раз.
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\321\226\321\217_\320\276\320\261\320\273\321\226\320\272\320\276\320\262\320\276\320\263\320\276_\320\267\320\260\320\277\320\270\321\201\321\203.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\321\226\321\217_\320\276\320\261\320\273\321\226\320\272\320\276\320\262\320\276\320\263\320\276_\320\267\320\260\320\277\320\270\321\201\321\203.md" new file mode 100644 index 00000000..1ff64612 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/009_\320\220\320\272\321\202\320\270\320\262\320\260\321\206\321\226\321\217_\320\276\320\261\320\273\321\226\320\272\320\276\320\262\320\276\320\263\320\276_\320\267\320\260\320\277\320\270\321\201\321\203.md" @@ -0,0 +1,42 @@ + +``` +[!FormLister? +&controller=`Activate` +&formid=`activate` +&protectSubmit=`0` +&rules=`{ +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    На вказаний вами при реєстрації email відправлено лист з подальшими інструкціями!
    ` +&subject=`Активація облікового запису` +&reportTpl=`@CODE:

    Для активації облікового запису перейдіть за посиланням [+activate.url+]

    ` +&activateReportTpl=`@CODE:

    Вітаю, [+fullname.value+]!

    Ваш обліковий запис успішно активовано.

    ` +&activateSuccessTpl=`@CODE:
    Ваш обліковий запис успішно активовано!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/010_\320\222\321\226\320\264\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217_\320\277\320\260\321\200\320\276\320\273\321\216.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/010_\320\222\321\226\320\264\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217_\320\277\320\260\321\200\320\276\320\273\321\216.md" new file mode 100644 index 00000000..0f9203ce --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/010_\320\222\321\226\320\264\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217_\320\277\320\260\321\200\320\276\320\273\321\216.md" @@ -0,0 +1,130 @@ +## Варіант 1 +Пароль генерується автоматично і відправляється в листі. +``` +[!FormLister? +&controller=`Reminder` +&formid=`remind` +&rules=`{ +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    На вказаний вами при реєстрації email відправлено лист з подальшими інструкціями!
    ` +&subject=`Відновлення паролю` +&resetTo=`38` +&reportTpl=`@CODE:

    Для відновлення пароля перейдіть за посиланням [+reset.url+]

    ` +&resetReportTpl=`@CODE:

    Вітаю, [+fullname.value+]!

    Ваш новий пароль: [+newpassword+]

    ` +&resetSuccessTpl=`@CODE:
    На вказаний вами при реєстрації email відправлено лист з новим паролем!
    ` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` + +## Варіант 2 +Пользователь вводит новый пароль. +``` +[!FormLister? +&controller=`Reminder` +&formid=`remind` +&rules=`{ +"email":{ + "required":"Обов'язково введіть email", + "email":"Введіть email правильно" +} +}` +&resetRules=`{ +"password":{ + "required":"Обов'язково введіть пароль", + "minLength":{ + "params":6, + "message":"У паролі має бути більше 6 символів" + } +}, +"repeatPassword":{ + "required":"Повторіть пароль", + "equals":{ + "message":"Паролі не співпадають" + } +} +}` +&formTpl=`@CODE: +
    +
    +
    +
    + +
    + + + [+email.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    ` +&resetTpl=`@CODE: +
    +
    +
    +
    + + + +
    + + + [+password.error+] +
    +
    + + + [+repeatPassword.error+] +
    + [+form.messages+] +
    + +
    +
    +
    +
    +
    +` +&uidName=`uid` +&messagesOuterTpl=`@CODE:` +&successTpl=`@CODE:
    На вказаний вами при реєстрації email відправлено лист з подальшими інструкціями!
    ` +&subject=`Відновлення паролю` +&reportTpl=`@CODE:

    Для відновлення пароля перейдіть за посиланням [+reset.url+]

    ` +&resetReportTpl=`@CODE:

    Вітаю, [+fullname.value+]!

    Ваш новий пароль: [+newpassword+]

    ` +&resetSuccessTpl=`@CODE:Готово!` +&resetTo=`12` +&errorTpl=`@CODE:[+message+]` +&errorClass=` has-error` +&requiredClass=` has-warning` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/011_\320\241\320\262\320\276\321\227_\320\277\321\200\320\260\320\262\320\270\320\273\320\260_\320\262\320\260\320\273\321\226\320\264\320\260\321\206\321\226\321\227_\320\267_\321\204\321\203\320\275\320\272\321\206\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/011_\320\241\320\262\320\276\321\227_\320\277\321\200\320\260\320\262\320\270\320\273\320\260_\320\262\320\260\320\273\321\226\320\264\320\260\321\206\321\226\321\227_\320\267_\321\204\321\203\320\275\320\272\321\206\321\226\321\227.md" new file mode 100644 index 00000000..fea1aead --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/500_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270/011_\320\241\320\262\320\276\321\227_\320\277\321\200\320\260\320\262\320\270\320\273\320\260_\320\262\320\260\320\273\321\226\320\264\320\260\321\206\321\226\321\227_\320\267_\321\204\321\203\320\275\320\272\321\206\321\226\321\227.md" @@ -0,0 +1,35 @@ +Як зробити свої правила валідації з функції (сніппета). + +Код сніпета **checkUrls** з функцією *checkUrls* яка перевіряє наявність посилань в полі, і якщо вони є, то повертає помилку перевірки (валідації): +``` + 0) { + // Помилка, посилання є + return false; + } + + // Все добре, посилань немає + return true; +} +``` + +Перед викликом форми FormLister-а необхідно викликати сам сніппет: +``` +[!checkUrls!] +[!FormLister?... +``` + +Потім в FormLister, у правилах валідації для поля **message** задати правила валідації: +``` +... +"message":{ + "required":"Обов'язково введіть повідомлення", + "custom":{ + "function":"checkUrls", + "message":"Посилання в тексті заборонені" + } +}, +... +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/index.md" new file mode 100644 index 00000000..68d259c4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/FormLister/index.md" @@ -0,0 +1,17 @@ +Автор: [Pathologic](https://github.com/Pathologic/) + +Сніппет для роботи з формами. На відміну від eForm сніппет складніше в налаштуванні, що компенсується можливістю більш гнучко вирішувати різні завдання із застосуванням форм. + +Особливості: + +* легко допрацьовується за допомогою контролерів і prepare-сніпетів; +* використовує шаблонізатор DocLister; +* підтримує лексикони; +* не залежить від html-коду форми і не впливає на нього; +* має api-режим для роботи з шаблонізаторами і ajax; +* вміє завантажувати вихідні дані із зовнішніх джерел (масиви, плейсхолдери, сесія, куки, MODxAPI); +* підтримує зберігання параметрів у файлах. + +Версія PHP - не нижче ніж 5.6. + +[Github](https://github.com/Pathologic/FormLister) \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..70fa7dfa --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,83 @@ + + +

    GetField: Параметри

    +Параметри сніпета GetField. +
    +
    +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: поточний документ
    +Примітка:
    +

    Приклад:

    +
    &docid=`25`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я поля | TV-параметр
    +Значення за замовчуванням: pagetitle
    +Примітка:
    +

    Приклад:

    +
    &field=`content`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: При значенні 0 буде виведено поле або TV-параметр з батьківського документа. При значенні 1 з кореневого каталогу.
    +

    Приклад:

    +
    &parent=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 0
    +Примітка: 0 - повертає самий верхній документ (кореневий)
    +1 - повертає прямого батька
    +

    Приклад:

    +
    &parentLevel=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: 0
    +Примітка: ID самого верхнього документа в дереві документа, в якому можна шукати батька. Використовується тільки з параметром parent =1.
    +

    Приклад:

    +
    &topid=`3`
    +
    +
    +
    + +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..e3b4b145 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,7 @@ + + +

    GetField: Приклади

    +Приклади сніпета GetField. +
    +

    Отримати заголовок документа з id=2.

    +
    [!GetField? &docid=`2` &field=`pagetitle`!]
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/03_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/03_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..ca5217f5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/03_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,9 @@ + + +

    GetField: Встановлення

    +Встановлення сніппета GetField. +
    +

    Сніпет GetField повертає поля і TV-параметри будь-якого документа або його батька до зазначеної кількості рівнів.

    +

    1. Завантажуємо сніппет.

    +

    2. Розміщуємо файл getfield.inc.php в папку /assets/snippets/getfield/.

    +

    3. Створюємо новий сніппет GetField і поміщаємо в код сніппета вміст файлу GetField.tpl.

    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/index.md" new file mode 100644 index 00000000..404f3e98 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/GetField/index.md" @@ -0,0 +1,4 @@ + + +

    GetField Повертає параметри будь-якого документа

    +Сніппет GetField повертає поля і TV-параметри будь-якого документа або його батька до зазначеної кількості рівнів. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/HybridAuth/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/HybridAuth/index.md" new file mode 100644 index 00000000..2c15deb4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/HybridAuth/index.md" @@ -0,0 +1,81 @@ +# HybridAuth + +### Особливості: + ++ використовується бібліотека `HybridAuth`, яка реалізує авторизацію через безліч соцмереж (провайдерів) без посередників; ++ Реєстрація (в тому числі з додаванням в групи) і авторизація користувачів; ++ Прив'язка декількох соцмереж до одного користувача; ++ Управління прив'язаними соцмережами з адмінки. + +#### Встановлення + +Завантажувати тут: [github.com/Pathologic/EvoHybridAuth](https://github.com/Pathologic/EvoHybridAuth) + +Після встановлення потрібно зайти на сторінку веб-користувача в адмінці, щоб створилася таблиця. Потім перейменувати файл `config.sample` в `config.php` в папці `assets/plugins/hybridauth/config` і налаштувати в ньому необхідні соцмережі. По налаштуванню доведеться гуглити, але щось можна знайти тут: `docs.modx.pro/components/hybridauth/providers/` +Також потрібно включити плагін `userHelper`. + +Класи для основних провайдерів знаходяться в папці `assets/plugins/hybridauth/vendor/hybridauth/hybridauth/hybridauth/Hybrid/Providers/` і не вимагають додаткових дій. У разі додаткових провайдерів з папки `assets/plugins/hybridauth/vendor/hybridauth/hybridauth/additional-providers/` необхідно додати в конфігурацію провайдера ключ wrapper. На прикладі Vkontakte: + +``` +"Vkontakte" => array( + "enabled" => true, + "keys" => array("id" => "", "secret" => ""), + "wrapper" => array( + 'class'=>'Hybrid_Providers_Vkontakte', + 'path' => MODX_BASE_PATH.'assets/plugins/hybridauth/vendor/hybridauth/hybridauth/additional-providers/hybridauth-vkontakte/Providers/Vkontakte.php' + ) + ), +``` + +Компонент складається з плагіна і сніпета. Cніппет виводить список доступних для використання соцмереж, а плагін забезпечує взаємодію з ними. + +## Параметри плагіна + +### registerUsers +дозволяє реєстрацію нових користувачів. Якщо заборонено, то авторизований користувачів повинен прив'язати в своєму профілі соцмережі і входити потім через них + +### debug +включає режим налагодження, повідомлення пишуться як в лог MODX, так і в файл `assets/cache/ha/error.log` + +### rememberme, cookieName, cookieLifetime +параметри для запам'ятовування користувача після авторизації, описані в документації `FormLister` + +### redirectUri +адреса сторінки, на яку користувача повертають з соцмереж, якщо не заповнювати, то буде використовуватися головна сторінка сайту; ця адреса має збігатися з тим, що вказується в налаштуваннях додатків соцмереж + +### loginPage +id сторінки, на яку користувач повинен бути перенаправлений після авторизації; якщо не заповнено, то поточна сторінка + +### logoutPage +id сторінки, на яку користувач повинен бути перенаправлений після виходу; якщо не заповнено, то поточна сторінка + +### groups +список груп, в які потрібно додати користувача після реєстрації, у вигляді json-масиву + +### userModel +клас для роботи з користувачами, за замовчуванням — `modUsers` + +### tabName +заголовок вкладки на сторінці веб-користувача в адмінці + + + +## Параметри сніппета + +### langDir, lang, lexicon +Налаштування лексиконів, див. документацію `FormLister` + +### tpl +шаблон списку провайдерів, доступні плейсхолдери `[+providers+]` і `[+error+]`; якщо значення порожнє, то повернеться масив з ключами providers і error + +### providerTpl +шаблон провайдера, доступні плейсхолдери `[+url+]` (посилання для виконання дії), `[+classNames+]` (імена класів), [+title+] (назва провайдера) + +### activeProviderTpl +шаблон підключеного провайдера, якщо не вказувати, то використовується значення providerTpl + +### errorTpl +шаблон повідомлення про помилку, доступний плейсхолдер `[+error+]` + +### registerCss +підключає файл `assets/snippets/hybridauth/css/default.css` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..c6e14eb6 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,534 @@ + + +

    Jot: Основні параметри

    +Основні параметри сніппета Jot для організації коментарів на Evolution CMS. +
    +
    +
    + +
    +
    +Формат: default | count-comments | count-subscriptions | comments | form
    +Значення за замовчуванням: default
    +Примітка:
    default - форма і коментарі
    +count-comments - лічильник-коментарів
    +count-subscriptions - лічильник-підписок
    +comments - коментарі
    +form - форма
    +

    Приклад:

    +
    &action=`count-comments`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: батьківський документ
    +Примітка:
    +

    Приклад:

    +
    &docid=`23`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок [A-Za-z0-9]
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &tagid=`tag`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    0 - відключити можливість оповіщення по електронній пошті
    +1 - включити можливість оповіщення по електронній пошті. +
    +

    Приклад:

    +
    &subscribe=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    Модератор може переглядати коментарі до публікації
    +0 - нові коментарі будуть опубліковані
    +1 - нові коментарі будуть не опубліковані
    +

    Приклад:

    +
    &moderated=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1 | 2
    +Значення за замовчуванням: 1
    +Примітка:
    Веб-групи модераторів вказуються в параметрі canmoderate
    +0 = без сповіщень
    +1 = сповіщати про нові неопубліковані коментарі
    +2 = сповіщати про всі нові коментарі +
    +

    Приклад:

    +
    &notify=`2`
    +
    +
    +
    + +
    + +
    +
    +Формат: строка
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &subjectSubscribe=``
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &subjectModerate=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1 | 2
    +Значення за замовчуванням: 0
    +Примітка:
    0 = відключення
    +1 = включення
    +2 = включення, але тільки для незареєстрованих і не авторизованих користувачів +
    +

    Приклад:

    +
    &captcha=`2`
    +
    +
    +
    + +
    + +
    +
    +Формат: список фраз | ім'я чанка
    +Значення за замовчуванням: нет
    +Примітка: Список фраз через кому або ім'я чанка зі списком фраз. Використовується в поєднанні з параметром bw
    +

    Приклад:

    +
    &badwords=`{{MyBadwordsChunk}}`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1 | 2
    +Значення за замовчуванням: 1
    +Примітка:
    0 - опубліковує
    +1 - не опубліковує
    +2 - відхиляє коментар. В особливих випадках повідомлення втрачається назавжди +
    +

    Приклад:

    +
    &bw=`2`
    +
    +
    +
    + +
    + +
    +
    +Формат: додаткові поля, через кому
    +Значення за замовчуванням: name,email
    +Примітка: Поля будуть створені в додатковій таблиці автоматично. +Стандартне значення "name,email". (Примітка: у списку, через кому, не повинно бути пробілів)
    +

    Приклад:

    +
    &customfields=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ID автора
    +Значення за замовчуванням: автор коментаря
    +Примітка: За замовчуванням автор коментаря.
    +

    Приклад:

    +
    &authorid=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: longtitle
    +Примітка: Використовується для теми коментаря, коли у формі поле заголовка залишено порожнім.
    +

    Приклад:

    +
    &title=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    0 - не включати <link rel="stylesheet" src="assets/snippets/jot/templates/jot.css" /> в заголовок шаблона, в тег <HEAD></HEAD>
    +1 - включить <link rel="stylesheet" src="assets/snippets/jot/templates/jot.css" /> в заголовок шаблона +
    +

    Приклад:

    +
    &css=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: путь к файлу
    +Значення за замовчуванням: assets/snippets/jot/templates/jot.css
    +Примітка:
    +

    Приклад:

    +
    &cssFile=``
    +
    +
    +
    + +
    + +
    +
    +Формат: список критеріїв через кому
    +Значення за замовчуванням: createdon:d
    +Примітка:
    ім'я поля:a - за зростанням
    +ім'я поля:d - за спаданням
    +

    Приклад:

    +
    &sortby=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    0 - перший коментар внизу
    +1 - перший коментар вверху. +
    +

    Приклад:

    +
    &numdir=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: content:You forgot to enter a comment.
    +Примітка:
    Синтаксис: fieldname:message(:validation)
    +Якщо поле додано в validate то воно стає обовязковим для заповнення. Можливі значення:
    +number
    +email
    +регулярний вираз
    +Приклады.
    +Обов'язкове поле:
    +MyRequiredField:Поле обов'язково має бути заповнено!
    +Перевірка електронної пошти:
    +MyEmailField:Адреса електронної пошти внесений вами не правильно.:email
    +Перевірка на числове значення:
    +MyNumberField:Номер будинку повинен бути в цифровому значенні.:number
    +Комбінація вимог:
    +MyRequiredField:Поле обов'язково має бути заповнено!,MyEmailField:Адреса електронної пошти внесений вами не правильно.:email,MyNumberField:Номер будинку повинен бути в цифровому значенні.:number + +
    +

    Приклад:

    +
    &validate=`MyRequiredField:Поле обов'язково має бути заповнено!,MyEmailField:Адреса електронної пошти внесений вами не правильно.:email,MyNumberField:Номер будинку повинен бути в цифровому значенні.:number`
    +
    +
    +
    + +
    + +
    +
    +Формат: строка
    +Значення за замовчуванням: anonymous
    +Примітка:
    +

    Приклад:

    +
    &guestname=`Гость`
    +
    +
    +
    + +
    + +
    +
    +Формат: секунди, як ціле число
    +Значення за замовчуванням: 15
    +Примітка:
    +

    Приклад:

    +
    &postdelay=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 0
    +Примітка:
    0 - відключення, показувати всі коментарі на одній сторінці (стандартне значення)
    +1 > будь-яке числове значення
    +

    Приклад:

    +
    &pagination=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    0 - ніяких плейсхолдеров не створено (за замовчуванням)
    +1 - плейсхолдери створені для кожного значення debug (дивіться параметр debug)
    +якщо tagid не знайдений, плесхолдери створюються так:
    +[+jot.html.form+]
    +якщо tagid знайдений, плейсхолдери будуть створені так:
    +[+jot.html.form.tagid+]
    +

    Приклад:

    +
    &placeholders=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | 0
    +Значення за замовчуванням: 1
    +Примітка:
    0 - заховати результати (може використовуватися з параметром placeholder)
    +1 - показати результати (за замовчуванням) +
    +

    Приклад:

    +
    &output=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    0 - відключити вивід "прихованих" змінних. (За замовчуванням)
    +1 - включити вивід "прихованих" змінних.
    +

    Приклад:

    +
    &debug=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: список груп користувачів
    +Значення за замовчуванням:
    +Примітка: Коммментаріі користувачів з цих груп будуть публікуватися за замовчуванням, коли moderated встановлений 1. Параметр badwords не застосовується до цих груп.
    +

    Приклад:

    +
    &trusted=``
    +
    +
    +
    + +
    + +
    +
    +Формат: список груп користувачів
    +Значення за замовчуванням:
    +Примітка: Залиште порожнім, для публічного коментування
    +

    Приклад:

    +
    &canpost=``
    +
    +
    +
    + +
    + +
    +
    +Формат: список груп користувачів
    +Значення за замовчуванням:
    +Примітка: Залиште порожнім для публічного перегляду.
    +

    Приклад:

    +
    &canview=``
    +
    +
    +
    + +
    + +
    +
    +Формат: список груп користувачів
    +Значення за замовчуванням:
    +Примітка: Залиште порожнім для того щоб користувачі не могли редагувати коментарі.
    +

    Приклад:

    +
    &canedit=``
    +
    +
    +
    + +
    + +
    +
    +Формат: список груп користувачів
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &canmoderate=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &notifyAuthor=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &subjectAuthor=``
    +
    +
    +
    +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..cdb28a91 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,66 @@ + + +

    Jot: Приклади

    +Приклади виклику сніппета Jot для організації коментарів на Evolution CMS. +
    +

    Простой вызов

      +
    • з оповіщенням на ел.пошту.
    • +
    • з посторінковою навігацією: 10 коментарів на сторінці.
    • +
    +
    [!Jot? &subscribe=`1` &pagination=`10`!]
    +

    З альтернативним сортуванням

      +
    • з оповіщенням на ел.пошту.
    • +
    • з посторінковою навігацією: 10 коментарів на сторінці.
    • +
    • коментарі сортуються починаючи з самого старого.
    • +
    +
    [!Jot? &subscribe=`1` &pagination=`10` &sortby=`createdon:a`!]
    +

    Модерація

      +
    • з оповіщенням на ел.пошту.
    • +
    • з посторінковою навігацією: 10 коментарів на сторінці.
    • +
    • нові коментарі не публікуються, їх опубліковує модератор.
    • +
    • автору не будуть приходити повідомлення. Ви повинні створити веб-групу з веб-користувачами, які б виступали в якості модераторів.
    • +
    • Але автор буде отримувати повідомлення +
        +
      • якщо використовується Jot 1.1.3+
      • +
      • менеджером є автор коментаря
      • +
      • ви додасте ¬ifyAuthor=`1`
      • +
      +
    • +
    +
    [!Jot? &subscribe=`1` &pagination=`10` &moderated=`1`!]
    +

    Розширена модерація

      +
    • з оповіщенням на ел.пошту.
    • +
    • з посторінковою навігацією: 10 коментарів на сторінці.
    • +
    • нові коментарі не публікуються, їх опубліковує модератор.
    • +
    • нові коментарі будуть опубліковані лише в тому випадку, якщо автор входить до складу групи "Довірені користувачі".
    • +
    +
    [!Jot? &subscribe=`1` &pagination=`10` &moderated=`1` &trusted=`Довірені Користувачі`!]
    +

    Анти-спам: автоматичний

      +
    • з посторінковою навігацією: 10 коментарів на сторінці.
    • +
    • з представленням динамічної картинки з кодом (captcha).
    • +
    • якщо в чорний список слів входить слово, яке використовується в коментарі, коментар буде відхилений, можливо, що навіть втрачено.
    • +
    • чорним списком фраз є чанк "myBadwordList"
    • +
    +
    [!Jot? &pagination=`10` &captcha=`1` &badwords=`{{myBadwordList}}` &bw=`2`!]
    +

    Анти-спам: з модерацією

      +
    • з посторінковою навігацією: 10 коментарів на сторінці.
    • +
    • з представленням динамічної картинки з кодом (captcha).
    • +
    • якщо в чорний список слів входить слово, що використовується в коментарі, коментар не буде опублікований, і модератор при цьому буде сповіщений.
    • +
    • веб-користувачі з групи "Модератори коментарів" можуть редагувати коментарі.
    • +
    • чорним списком фраз є чанк "myBadwordList".
    • +
    +
    [!Jot? &pagination=`10` &captcha=`1` &canmoderate=`Модератори коментарів` &badwords=`{{myBadwordList}}` &bw=`1`!]
    +

    Розташування блоків

    Для того, щоб змінити на сторінці місце і порядок виведення блоків (форма, модерація, коментарі, навігація), помістіть виклик сніппета, як зазвичай:

    +

    [!Jot? &placeholders=`1` &output=`0` &pagination=`10` &captcha=`1` &canmoderate=`Jot Moderators` &badwords=`{{myBadwordList}}` &bw=`1`!]

    +

    Зверніть увагу, наступні параметри ви повинні вказати обов'язково:

    +
    &placeholders=`1` &output=`0`
    +

    Тепер, розмістіть на сторінці з викликом сніппета Jot наступні плейсхолдери:

    +
    [+jot.html.navigation+] - Перший. Місце на сторінці для навігації
    +[+jot.html.comments+] - Другий. Місце на сторінці для коментарів
    +[+jot.html.moderate+] - Третій. Місце на сторінці для модерації
    +[+jot.html.form+] - Четвертий. Місце на сторінці для форми
    +

    Ви можете змінити порядок блоків так, як вважаєте за потрібне:

    +
    [+jot.html.form+] - Перший. Місце на сторінці для форми
    +[+jot.html.comments+] - Другий. Місце на сторінці для коментарів
    +[+jot.html.moderate+] - Третій. Місце на сторінці для модерації
    +[+jot.html.navigation+] - Четвертий. Місце на сторінці для навігації
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/04_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/04_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..e6f89f19 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/04_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,171 @@ + + +

    Jot: Шаблони

    +Шаблони сніппету Jot для організації коментарів на Evolution CMS. +
    +
    +
    + +
    +
    +Формат: і'мя чанка
    +Значення за замовчуванням: chunk.form.inc.html
    +Примітка:
    +

    Приклад:

    +
    &tplForm=``
    +
    +
    +
    + +
    + +
    +
    +Формат: і'мя чанка
    +Значення за замовчуванням: chunk.comment.inc.html
    +Примітка: Повторюється для кожного коментаря на сторінці
    +

    Приклад:

    +
    &tplComments=``
    +
    +
    +
    + +
    + +
    +
    +Формат: і'мя чанка
    +Значення за замовчуванням: chunk.moderate.inc.html
    +Примітка: Цей шаблон використовується один раз над коментарями
    +

    Приклад:

    +
    &tplModerate=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: chunk.navigation.inc.html
    +Примітка: Цей шаблон застосовується у верхній і частинах блоку
    +

    Приклад:

    +
    &tplNav=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: chunk.subscribe.inc.html
    +Примітка:
    +

    Приклад:

    +
    &tplSubscribe=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: chunk.notify.inc.txt
    +Примітка:
    +

    Приклад:

    +
    &tplNotify=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: chunk.notify.moderator.inc.txt
    +Примітка:
    +

    Приклад:

    +
    &tplNotifyModerator=``
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: chunk.notify.author.inc.txt
    +Примітка:
    +

    Приклад:

    +
    &tplNotifyAuthor=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &cssRowAlt=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &cssRowMe=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +

    Приклад:

    +
    &cssRowAuthor=``
    +
    +
    +
    +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/05_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/05_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..c6555de5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/05_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,19 @@ + + +

    Jot: Встановлення

    +Встановлення сніпета Jot для організації коментарів на Evolution CMS. +
    +

    Сніпет Jot дає можливість користувачам вашого сайту залишати коментарі.

    +

    Первинне встановлення

    +

    Даний сніпет вже входить в комплект MODX Evolution, перед встановленням, переконайтесь, що сніпет ще не встановлено.

    +
    1. Завантажте і розпакуйте архів.
    +
    2. Створіть папку «jot» в папці assets/snippets/
    +
    3. Перенесіть файли із завантаженого архіву в папку jot
    +
    4. Створіть новий сніпет Jot і помістіть в код сніпета вміст файлу jot.snippet.txt
    +
    +

    Оновлення

    +
    1. Завантажте останню версію сніпета
    +
    2. Зробіть Backup і видаліть вміст папки assets/snippets/jot
    +
    3. Скопіюйте в цю папку файли з завантаженого архіву
    +
    4. Оновіть код сніпета Jot в адміністративній панелі MODX, помістивши в нього вміст файлу jot.snippet.txt
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/index.md" new file mode 100644 index 00000000..9348c64b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Jot/index.md" @@ -0,0 +1,4 @@ + + +

    Jot Коментарі користувачів

    +Сніпет, який дає можливість користувачам вашого сайту залишати коментарі про сторінку, додавати коментарі до статей, створювати гостьові книги. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/JotX/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/JotX/index.md" new file mode 100644 index 00000000..91a95556 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/JotX/index.md" @@ -0,0 +1,97 @@ +JotX - покращений та доповнений Jot +----------------------------------- + +### Конфігурація з файлу. +Всі параметри і шаблони можна прописувати в одному файлі. + +```php + [!JotX? &config=`faq` !] - Запитання-відповідь + [!JotX? &config=`tree` !] - деревовидні коментарі + [!JotX? &config=`tree-ajax` !] - деревовидні коментарі з аякс +``` + +### Режими винесені в файли. + +```php + [!JotX? &action=`lastcomments` !] - Останні коментарі +``` + +### Нові параметри. + +* **notifyEmails** - підписка на певні адреси +* **subjectEmails** - заголовок листів для цієї розсилки +* **subscriber** - ім'я отримувача для цієї розсилки, якщо не вказано (за замовчуванням "підписник") +* **tplNotifyEmails** - шаблон для цієї розсилки + + ```php + [!JotX? ¬ifyEmails=`user1@site.ua:Підписник 1,user2@site.ua:Підписник 2,user3@site.ua` !] + +* **docids** - список docid, можна вказувати діапазони +* **tagids** - список tagid, через кому +* **userids** - список id користувачів, через кому. Для веб-користувачів - негативні. +* **limit** - обмеження кількості коментарів + + ```php + [!JotX? &action=`lastcomments` &limit=`10` !] - 10 останніх коментарів зі всього сайту + [!JotX? &docids=`*` &sortby=`rand()` &limit=`1` !] - випадковий коментар зі всього сайту + [!JotX? &docids=`1,2,5-10,20*,30-35,40**,` !] - так теж можна :) + +Параметри docids і tagids використовують для виводу даних, docid і tagid - для вводу поточних, тому вони розділені + +* **depth** - глибина деревовидних коментарів (за замовчуванням 10) +* **upc** - як рахувати userpostcount (0 - не рахувати, 1(за замовчуванням) - рахувати для всього сайту , 2 - рахувати для поточної сторінки) + +* **js і jsFile** - аналоги css і cssFile + +Посторінкова навігація + +* **tplNavPage** - шаблон для оформлення номеру сторінки +* **tplNavPageCur** - шаблон для оформлення номеру поточної сторінки +* **tplNavPageSpl** - розділювач номерів сторінок +* **tplNavPageDots** - розрив пагінації (за замовчуванням три крапки) +* **pageAdjacents** - кількість сторінок до і після поточної (за замовчуванням 2) + +### Події. +В кожному з двох класів свої. + +onBeforeConfiguration,onBeforeRunActions,onRunActions,onConfiguration,onBeforeFirstRun, +onFirstRun,onSubscriptionCheck,onDeleteComment,onGetCommentFields,onBeforeSaveComment, +onSaveComment,onGetSubscriptions,onBeforeGetSubscriptions,onBeforeGetUserInfo, +onBeforeNotify,onBeforeSubscribe,onBeforeUnsubscribe,onBeforeValidateFormField, +onValidateFormFieldFail,onBeforePOSTProcess,onProcessForm,onBeforeProcessPassiveActions, +onProcessPassiveActions,onBeforeGetCommentCount,onBeforeGetComments,onGetComments, +onReturnOutput,onSetDefaultOutput,onBeforeGetUserPostCount,onSetFormOutput,onSetCommentsOutput + +### Плагіни на події. +Їх можна довантажувати як з сніпетів, так і з файлів. Можна прописувати через кому. + +```php + [!JotX? &onBeforeValidateFormField=`nolink,onlyrus` !] +``` + +До складу входять плагіни: + +* **subscribe** (події: onBeforeFirstRun,onSaveComment,onBeforeRunActions,onBeforeProcessPassiveActions,onGetSubscriptions,onBeforeGetUserInfo,onBeforeNotify) - +підписка гостей сайту на сповіщення про нові коментарі. Також необхідно 2 виправлення в шаблонах: чекбокс і текст про відписку, див. приклад в tree.config.php +* **ajax** (події: onSetCommentsOutput,onSetFormOutput,onReturnOutput) - завантаження всього через аякс +* **antispam** (події: onBeforePOSTProcess,onSetFormOutput) - боротьба з ботами шляхом додавання прихованого поля-пастки +* **nolink** (події: onBeforeValidateFormField) - заборонити посилання в коментарях +* **onlyrus** (події: onBeforeValidateFormField) - заборонити неросійський спам +* **notifyfaq** (події: onProcessForm,onBeforeNotify) - повідомлення користувачу про відповідь на питання в FAQ +* **rss** (події: onBeforeProcessPassiveActions,onSetCommentsOutput) - додає посилання на RSS-стрічку +* **rating** (події: onFirstRun,onReturnOutput) - додає голосування за коментар + +Будуть і інші. + +### Інші виправлення. + +* Система повідомлень об'єднана і перероблена під PHPMailer +* Оптимізовано запити в базу, в тому числі і для userpostcount. Поля користувачів об'єднані з полями коментарів. +* Виправлені старі баги з видаленням / додаванням полів +* Посторінкова пагінація, в деревовидних коментарів вона теж працює, якщо включити +* Всякі дрібниці, типу граваторів + +### Корисні посилання +[основний репозиторій](https://github.com/Temus/JotX) +[обговорення JotX в спільноті](http://community.modx-cms.ru/blog/addons/8080.html) +[сторінка в репозиторії](http://extras.evolution-cms.com/packages/users/jotx.html) diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/LikeDislike/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/LikeDislike/index.md" new file mode 100644 index 00000000..1089970a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/LikeDislike/index.md" @@ -0,0 +1,71 @@ + + +

    LikeDislike - можливість ставити оцінки

    +LikeDislike - можливість ставити оцінки на Evolution CMS. +

    завантажувати тут: Pathologic

    +

    В коробцы:

    +
      +
    • сніпет Like Dislike, який і дає можливість ставити оцінки;
    • +
    • сніпет ldController для запуску DocLister з розширеним контролером site_content;
    • +
    • модуль LikeDislike, щоб бачити оцінки в адмінці.
    • +
    +

    Захист від накруток ныяка проста – кукы, ip, також можна дозволити оцінювати тільки зареєстрованим користувачам.

    +

    Встановлення

    +

    Після установки потрібно запустити модуль, щоб створилися таблиці.

    +

    На сторінці документа потрібно підключити скрипт jGrowl:

    +
    +<script type="text/javascript" src="assets/js/jGrowl/jquery.jgrowl.min.js"></script>
    +<link rel="stylesheet" href="assets/js/jGrowl/jquery.jgrowl.min.css">
    +
    + +

    І скрипт для ajax-розбробника:

    +
    +<script type="text/javascript" src="assets/snippets/LikeDislike/likedislike.js"></script>
    +<link rel="stylesheet" href="assets/snippets/LikeDislike/likedislike.css">
    +
    + +

    Виклик сниппета виглядає так:

    +
    +[!LikeDislike? 
    +&enabledTpl=`@CODE:
    +<div class="likedislike" data-id="[+rid+]">
    +	<a href="#" class="like">
    +		<i class="fa fa-lg fa-thumbs-up"></i>
    +		<span>[+like+]</span>
    +	</a>
    +	<a href="#" class="dislike">
    +		<i class="fa fa-lg fa-thumbs-down"></i>
    +		<span>[+dislike+]</span>
    +	</a>
    +</div>
    +` 
    +&disabledTpl=`@CODE: 
    +<div class="likedislike">
    +	<span class="like">За: <span>[+like+]</span></span>
    +	<span class="dislike">Против: <span>[+dislike+]</span></span>
    +</div>
    +`
    +!]
    +
    +

    Скрипт likedislike.jsнаписаний під верстку в цьому прикладі.

    +

    Крім виведення шаблонів сниппет задає плейсхолдери [+modResource.like.{id}+] і [+modResource.dislike.{id}+].

    +

    Параметри сніпета LikeDislike

    +
      +
    • rid – id оцінюваного ресурсу, якщо параметр не заданий, то по можливості використовується id поточного ресурсу;
    • +
    • classKey – параметр дозволяє розділяти оцінювані суті. Зроблено на майбутнє, раптом знадобиться ставити оцінки користувачам або ще чого-небудь. За замовчуванням – modResource.
    • +
    • action – дія: like, dislike, stat (за замовчуванням – stat);
    • +
    • enabledTpl – шаблон, якщо дозволено оцінювати;
    • +
    • disabledTpl – шаблон, якщо заборонено оцінювати;
    • +
    • onlyUsers – дозволено оцінювати тільки зареєстрованим користувачам;
    • +
    +

    Якщо не ставити шаблони, то сниппет поверне масив з ключами like і dislike.

    + +

    Параметри сніпета ldController

    +
      +
    • allowLD – дозволити оцінювати в списку (за замовчуванням - 0);
    • +
    • enabledTpl – шаблон, якщо дозволено оцінювати;
    • +
    • disabledTpl – шаблон, якщо заборонено оцінювати;
    • +
    • onlyUsers – дозволено оцінювати тільки зареєстрованим користувачам;
    • +
    • classKey;
    • +
    +

    Для виведення в основному шаблоні (&tpl) потрібно використовувати плейсхолдер [+likedislike+]. Імена полів в параметрах для вибірки і сортування краще ставити з префіксом таблиці («c» для site_content і «ld» для likedislike). Поле like обов'язково повинно бути в зворотних лапках - `like`, інакше поламаються запити.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..3600e464 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,19 @@ + + +

    ListChild: Особливості

    +Особливості cніпетa для формування динамічного списку дочірніх документів. +
    +

    Основне завдання снипета ListChild для MODX Evolution - формування динамічного списку дочірніх документів в TV-параметрі з типом введення DropDown List Menu, Listbox, Check Box или Radio Options. Хоча, його можливості цим не обмежуються. Мені вже не раз зустрічалися подібні сніпети, які виконують цю ж задачу, але в них не вистачало гнучкості і додаткових налаштувань. До того ж, не будемо забувати, що подібні завдання легко реалізуються за допомогою нескладного MySQL запиту, приблизно так:

    +
    @SELECT pagetitle, id FROM modx_site_content WHERE parent=10 and published=1 and deleted=0
    +

    Тому, написання ще одного подібного сніпета нагадує винахід велосипеда. але сніпет ListChild має ряд переваг:

    +
      +
    • працює не тільки в backend,але і у frontend
    • +
    • велика кількість додаткових налаштувань, враховані практично всі можливі варіанти вибірки
    • +
    • можливість задавати глибину сканування
    • +
    • може викликатися кілька разів на одній сторінці (для frontend)
    • +
    • Можна зареєструвати обрані значення (для frontend)
    • +
    • підключення власного шаблону, що дозволяє виводити не тільки список, що розкривається, але і перемикачі (для frontend)
    • +
    • може виводити кількість знайдених документів або список їх ідентифікаторів
    • +
    • виведення підміню або анонсів статей
    • +
    +

    Не працює с TV-параметрами

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..66c4899c --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,272 @@ + + +

    ListChild: Параметри

    +Параметри сніпетa для формування динамічного списку дочірніх документів. +
    +
    +
    + +
    +
    +Формат: ID документів, розділених комою
    +Значення за замовчуванням: поточний документ
    +Примітка:
    +

    Приклад:

    +
    &docid=`10,11,12`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &depth=`2`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &published=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &deleted=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: нет
    +Примітка: Відповідає where в MySQL У фронтенді необхідно замінювати все "=" на "@eq".
    +

    Приклад:

    +
    &where=`isfolder @eq 1 and hidemenu @eq 0`
    +
    +
    +
    + +
    + +
    +
    +Формат: поле документа
    +Значення за замовчуванням: pagetitle
    +Примітка: Будь-яке поле документа, окрім TV-параметрів
    +

    Приклад:

    +
    &param=`longtitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: поле документа
    +Значення за замовчуванням: id
    +Примітка: Будь-яке поле документа, крім TV-параметрів
    +

    Приклад:

    +
    &value=`pagetitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: поле документа
    +Значення за замовчуванням: ¶m
    +Примітка: Значення за замовчуванням - & param (параметр для вибірки)
    +

    Приклад:

    +
    &sort=`menuindex`
    +
    +
    +
    + +
    + +
    +
    +Формат: ASC | DESC
    +Значення за замовчуванням: ASC
    +Примітка:
    +

    Приклад:

    +
    &dir=`DESC`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: без обмежень
    +Примітка:
    +

    Приклад:

    +
    &limit=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: нет
    +Примітка: Тільки для виклику у frontend. Використовується для запам'ятовування вибраних значень.
    +

    Приклад:

    +
    &name=`country`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +

    Приклад:

    +
    &emptyfield=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: selected | selected="selected" | checked | checked="checked"
    +Значення за замовчуванням: selected="selected"
    +Примітка: Тільки для виклику у frontend.
    +

    Приклад:

    +
    &selectedValue=`checked`
    +
    +
    +
    + +
    + +
    +
    +Формат: имя чанка
    +Значення за замовчуванням: ні
    +Примітка: Тільки для виклику у frontend. +
    Доступні плейсхолдери: +
    [+param+] - назва параметра для вибірки (див. ¶m); +
    [+value+] - значення параметра для вибірки (див. &value); +
    [+desc+] - короткий опис (див. &desc); +
    [+selected+] - місце для виведення атрибута selected для запам'ятовування обраних значень (див. &selectedValue); +
    Шаблон, який використовується за умовчанням: +
    <option value="[+value+]" [+selected+]>[+param+]</option> +
    Приклад шаблону для перемикачів: +
    <input type="radio" name="country" value="[+value+]" [+selected+]> [+param+]
    +

    Приклад:

    +
    &tpl=`countryTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    0 - робота в звичайному режимі. За замовчуванням. +
    1 - висновок кількості знайдених документів +
    При використанні параметра count зі значенням 1, параметри tpl, name, selectedValue, value і param не використовуються.
    +

    Приклад:

    +
    &count=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: ні
    +Примітка:
    +

    Приклад:

    +
    &separator=`, `
    +
    +
    +
    + +
    + +
    +
    +Формат: поле документа
    +Значення за замовчуванням: introtext
    +Примітка: Будь-яке поле документа, крім TV-параметрів.
    +

    Приклад:

    +
    &desc=`description`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..47324a21 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,896 @@ + + +

    ListChild: Приклади

    +Приклади сніпетa для формування динамічного списку дочірніх документів. +
    +

    Динамічний список дочірніх документів

    +

    Приклад використання в backend (адміністративної панелі)

    +

    сніпет сформує список у вигляді: параметр1==значення1||параметр2==значення2

    +

    Створіть TV-параметр з типом введення DropDown List Menu.

    +

    В можливих значеннях вкажіть:

    +
    @EVAL return $modx->runSnippet('ListChild', array('docid' => 10, 'where' => 'isfolder = 1 and hidemenu = 0'));
    +

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

    +

    Або так:

    +
    @EVAL return $modx->runSnippet('ListChild', array('docid' => '10,11,12', 'depth' => 2));
    +

    Відобразити всі опубліковані і невидалені дочірні документи, в тому числі і контейнери, папок 10, 11 і 12 до другого рівня вкладеності.

    + +

    Випадаючий список (frontend)

    +

    Пример использования во frontend (частини користувача)

    +

    сніпет сформує список у вигляді: <option value="значення">параметр</option>

    +

    Додайте в шаблоні наступний код:

    +
    +<form action="[~[*id*]~]">
    +	<select class="form-control">
    +		[[ListChild? &docid=`152` &depth=`1` &where=`isfolder = 0` &emptyfield=`0`]]
    +	</select>
    +</form>
    +
    +
    +
    + +
    +
    +

    Відобразить у вигляді списку всі опубліковані і невидалені дочірні документи папки 4, до другого рівня вкладеності, які не є контейнерами.

    +

    Зверніть увагу, що в даному прикладі після вибору зі списку будь-якого пункту, форма перевантажується і вибране значення скидається.

    +

    Приклад використання у frontend із запам'ятовуванням обраних значень

    +

    Тегу select додайте атрибут name. Значення атрибута вкажіть у відповідному параметрі сніпета.

    +

    Важливо! Не використовуйте для різних списків однакові значення атрибута name.

    +
    +<form action="[~[*id*]~]">
    +	<select onchange="this.form.submit();" name="dropdown"  class="form-control">
    +		[[ListChild? &docid=`18` &name=`dropdown` &emptyfield=`0`]]
    +	</select>
    +</form>
    +
    +
    +
    + +
    +
    +

    Тепер після вибору зі списку будь-якого пункту, форма перевантажується але вибране значення зберігається.

    +

    Подія onchange="this.form.submit();" автоматично відправляє дані форми після кожної зміни елемента форми.

    + +

    Перемикачі radio (frontend)

    +

    Приклад c використанням шаблону у frontend

    +

    1. Завдання - вивести у вигляді перемикачів.

    +
    +[[ListChild? &docid=`152` &name=`radio` &tpl=`tplRadio` &selectedValue=`checked="checked"` &emptyfield=`0`]]
    +
    +

    Шаблон tplRadio:

    +
    +<div class="col-lg-3 col-sm-4 col-xs-6">
    +	<div class="radio">
    +		<label>
    +			<input type="radio" name="radio" class="colored-blue" value="" onchange="this.form.submit();">
    +			<span class="text"> </span>
    +		</label>
    +	</div>
    +</div>
    +
    +

    Відобразить у вигляді перемикачів всі опубліковані і невидалені дочірні документи папки 4, без порожнього поля на початку списку. Запам'ятає вибране значення.

    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +

    Праворці checkbox (frontend)

    +

    Приклад c використанням шаблону у frontend

    +

    Завдання - вивести у вигляді перемикачів.

    +
    [[ListChild? &docid=`152` &name=`checkbox` &tpl=`tplCheckbox` &selectedValue=`checked="checked"` &emptyfield=`0`]]
    +

    Шаблон tplCheckbox:

    +
    +<div class="col-lg-2 col-sm-4 col-xs-6">
    +	<label class="csscheckbox csscheckbox-primary">
    +		<input type="checkbox" name="checkbox" class="colored-blue" value="" onchange="this.form.submit();">
    +		<span></span> 
    +	</label>
    +</div>
    +
    +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    +

    Відобразить у вигляді перемикачів всі опубліковані і невидалені дочірні документи папки 4, без порожнього поля на початку списку.

    + +

    Кількість знайдених документів

    +

    Висновок кількості знайдених документів

    +
    [[ListChild? &docid=`152` &count=`1`]]
    +

    Відобразить кількість опублікованих і невидалених дочірніх документів папки 4.

    + +

    Висновок id знайдених документів

    +

    Висновок ідентифікаторів знайдених документів

    +
    [[ListChild? &docid=`152` &tpl=`idTpl` &emptyfield=`0` &separator=`,`]]
    +

    Чанк idTpl:

    +
    [+value+]
    +

    Відобразить список id всіх опублікованих і невидалених дочірніх документів папки 4, розділених комою.

    +

    Висновок заголовків знайдених документів

    +

    За аналогією з id документа, можна вивести будь-яку змінну шаблону (крім TV-параметрів). Наприклад, якщо потрібно вивести заголовки:

    +
    [[ListChild? &docid=`152` &tpl=`idTpl` &emptyfield=`0` &separator=`, ` &value=`pagetitle`]]
    +

    Відобразить заголовки всіх опублікованих і невидалених дочірніх документів папки 4, розділених комою з пропуском.

    + +

    Використання параметра where

    +

    ППри використанні параметра whereнеобхідно замінювати все = на @eq = на @eq. Наприклад, для того, щоб вивести ідентифікатори всіх документів з шаблоном 5 і menuindex рівним 0, розміщуємо такий виклик:

    +
    [[ListChild? &docid=`0` &depth=`10` &tpl=`tplId` &emptyfield=`0` &separator=`, ` &where=`template @eq 5 and menuindex @eq 0`]]
    +

    Чанк tplId:

    +
    [+value+]
    + +

    Анонс статей або підміню

    +

    Виводимо анонс статей

    +
    <ul>[[ListChild? &docid=`152` &emptyfield=`0` &tpl=`tplNews` &limit=`3` &sort=`menuindex` &dir=`DESC`]]</ul>
    +

    Чанк tplNews:

    +
    <li><a href="[~[+value+]~]">[+param+]</a><p>[+desc+]</p></li>
    +

    Відобразить анонси трьох статей з коротким описом.

    +

    Выводим подменю

    +
    <ul>[[ListChild? &docid=`152` &emptyfield=`0` &tpl=`tplSubmenu` &limit=`3` &sort=`menuindex` &dir=`DESC`]]</ul>
    +

    Чанк tplSubmenu:

    +
    <li><a href="[~[+value+]~]">[+param+]</a></li>
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/index.md" new file mode 100644 index 00000000..76f7ebb4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListChild/index.md" @@ -0,0 +1,3 @@ + +

    ListChild Динамічний список дочірніх документів у TV

    +Сніпет для формування динамічного списку дочірніх документів. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..5717a0c6 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,6 @@ + + +

    ListIndexer: Особливості

    +Особливості сніпета для виведення форматованого списку посилань на документи. +
    +

    Сніппет ListIndexer призначений для виведення форматованого списку посилань на документи. Підтримується пагінація і сортування. Шаблони не підтримуються. Зовнішній вигляд визначається конфігурацією і CSS. Зазвичай використовують для відображення інформації про останні опублікованих документах на сайті. Взагалі, Ditto з лишком перекриває можливості ListIndexer, але ListIndexer дає менше навантаження на сервер і має спеціальний режим підвищеної продуктивності. Можна використовувати для формування стрічки новин.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/02_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/02_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..5dc1bb44 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/02_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,159 @@ + + +

    ListIndexer: Основні параметри

    +Основні параметри сніпета для виведення форматованого списку посилань на документи. +
    +
    +
    + +
    +
    + Формат: ID документів, через кому
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &LIn_root=`3,6,88`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: 0 - всі рівні
    + Приклад: +
    &LIn_depth=`2`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &LIn_seeThru=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &LIn_seeShowInMenu=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 1
    + Примітка:
    + Приклад: +
    &LIn_hidePrivate=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: short | full
    + Значення за замовчуванням: short
    + Примітка:
    + Приклад: +
    &LIn_mode=`full`
    +
    +
    +
    + +
    + +
    +
    + Формат: alpha | date | menuindex
    + Значення за замовчуванням: date
    + Примітка:
    alpha - по алфавіту +
    date - по даті +
    menuindex - по позициї в меню
    + Приклад: +
    &LIn_sort=`menuindex`
    +
    +
    +
    + +
    + +
    +
    + Формат: ASC | DESC
    + Значення за замовчуванням: нет
    + Примітка:
    + Приклад: +
    &LIn_dir=`DESC`
    +
    +
    +
    + +
    + +
    +
    + Формат: id документ
    + Значення за замовчуванням: пусто
    + Примітка: Розділений комами список ідентифікаторів документів, які повинні бути виключені з результатів.
    + Увага! Дочірні документи не виключаються.
    + Приклад: +
    &LIn_exclude=`3,11`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &LIn_removeLinks=`1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/03_\320\222\321\226\320\264\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/03_\320\222\321\226\320\264\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..125be4af --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/03_\320\222\321\226\320\264\320\276\320\261\321\200\320\260\320\266\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,221 @@ + + +

    ListIndexer: Відображення

    +Відображення сніпета для виведення форматованого списку посилань на документи. +
    +
    +
    + +
    +
    + Формат: строка
    + Значення за замовчуванням: нет
    + Примечание:
    + Пример: +
    &LIn_title=`Новини компанії`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 1
    + Примечание:
    + Пример: +
    &LIn_sDesc=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 1
    + Примечание:
    + Пример: +
    &LIn_fDesc=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документа
    + Значення за замовчуванням: нет
    + Примечание:
    + Пример: +
    &LIn_link=`10`
    +
    +
    +
    + +
    + +
    +
    + Формат: строка
    + Значення за замовчуванням: Index
    + Примечание:
    + Пример: +
    &LIn_indexText=`Все новости`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 1
    + Примітка:
    + Приклад: +
    &LIn_showDate=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: Y | y | M | m | D | d
    + Значення за замовчуванням: Y.m.d - для версії 1.0.1, M d, Y - для версії 1.0.2
    + Примечание:
    Y = год (4 цифры) +
    y = рік (2 цифри) +
    M = місяць (Jan - Dec) +
    m = місяц (01 - 12) +
    D = день (Sun - Sat) +
    d = день (01 -31)
    + Приклад: +
    &LIn_dateFormat=`d.m.Y`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 3
    + Примітка:
    + Приклад: +
    &LIn_sQty=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: 0 - повна назва
    + Приклад: +
    &LIn_titleLength=`15`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: 0 - опис повністю
    + Приклад: +
    &LIn_descriptionLength=`150`
    +
    +
    +
    + +
    + +
    +
    + Формат: текст | плейсхолдери MODX
    + Значення за замовчуванням: нет
    + Примітка: Як значення можуть використовуватися плейсхолдери MODX
    + Приклад: +
    &LIn_SEOprefix=`[(site_name)]`
    +
    +
    +
    + +
    + +
    +
    + Формат: текст | плейсхолдери MODX
    + Значення за замовчуванням: пусто
    + Примітка: Як значення можуть використовуватися плейсхолдери MODX
    + Приклад: +
    &LIn_SEOsuffix=`[(site_name)]`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: Якщо longtitle порожній, не відбудеться з нічого
    + Приклад: +
    &LIn_SEOlongTitle=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &LIn_addSeoToLinks=`1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/04_\320\237\320\260\320\263\321\226\320\275\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/04_\320\237\320\260\320\263\321\226\320\275\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..079729bf --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/04_\320\237\320\260\320\263\321\226\320\275\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,56 @@ + + +

    ListIndexer: Пагінація

    +Пагінація сніпета для виведення форматованого списку посилань на документи. +
    +
    +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 10
    + Примітка:
    + Приклад: +
    &LIn_fQty=`20`
    +
    +
    +
    + +
    + +
    +
    + Формат: строка
    + Значення за замовчуванням: |
    + Примітка: Даний параметр налаштовується тільки в коді сніпета в змінній $pageSeparator. +
    Щоб з'явилася можливість задавати роздільник номерів сторінок при виклику сніпета, необхідно в код сніпета в блоці з конфігурацією додати наступний рядок:
    $pageSeparator = (isset($LIn_pageSeparator))? $LIn_pageSeparator : $pageSeparator ;
    + Приклад: +
    &LIn_pageSeparator=`||`
    +
    +
    +
    + +
    + +
    +
    + Формат: top | bottom | both
    + Значення за замовчуванням: both
    + Примітка:
    top - зверху +
    bottom - знизу +
    both - і зверху і знизу +
    Даний параметр налаштовується тільки в коді сніпета в змінної $pgPosition. +
    Щоб з'явилася можливість задавати положення пагінацію при виклику сніпета, необхідно в код сніпета в блоці з конфігурацією додати наступний рядок:
    $pgPosition = (isset($LIn_pgPosition))? $LIn_pgPosition : $pgPosition ;
    + Приклад: +
    &LIn_pgPosition=`bottom`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..19b758ba --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,27 @@ + + +

    ListIndexer: Приклади

    +Приклади сніпета для виведення форматованого списку посилань на документи. +
    +

    Формуємо висновок стрічки новин:

    +
    +[!ListIndexer?
    +&LIn_root=`26`
    +&LIn_sQty=`5`
    +&LIn_sDesc=`0`
    +&LIn_title=`Новини компанії`
    +&LIn_fDesc=`0`
    +&LIn_link=`26`
    +&LIn_indexText=`Всі новини`
    +&LIn_dateFormat=`d.m.Y`!]
    +
    +

    где:

    +
      +
    • &LIn_root=`26` - папка з новинами компанії
    • +
    • &LIn_sQty=`5` - кількість відображуваних новин
    • +
    • &LIn_sDesc=`0` - приховуємо короткий опис новини
    • +
    • &LIn_title=`Новини компанії` - встановлюємо заголовок для списку новин
    • +
    • &LIn_link=`26` - посилання на кореневий документ
    • +
    • &LIn_indexText=`Все новости` - текст посилання на кореневий документ
    • +
    • &LIn_dateFormat=`d.m.Y` - формат дати
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/06_\320\237\321\200\320\276\320\264\321\203\320\272\321\202\320\270\320\262\320\275\321\226\321\201\321\202\321\214.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/06_\320\237\321\200\320\276\320\264\321\203\320\272\321\202\320\270\320\262\320\275\321\226\321\201\321\202\321\214.md" new file mode 100644 index 00000000..9d79369a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/06_\320\237\321\200\320\276\320\264\321\203\320\272\321\202\320\270\320\262\320\275\321\226\321\201\321\202\321\214.md" @@ -0,0 +1,36 @@ + + +

    ListIndexer: Продуктивність

    +Продуктивність сніпета для виведення форматованого списку посилань на документи. +
    +
    +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: Не допускається використовувати при декількох виклики сніпета на одній сторінці
    + Приклад: +
    &LIn_fast=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 1
    + Примітка:
    + Приклад: +
    &LIn_newLinesForLists=`0`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/07_\320\241\321\202\320\270\320\273\321\226\321\201\321\202\320\270\320\272\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/07_\320\241\321\202\320\270\320\273\321\226\321\201\321\202\320\270\320\272\320\260.md" new file mode 100644 index 00000000..4831879f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/07_\320\241\321\202\320\270\320\273\321\226\321\201\321\202\320\270\320\272\320\260.md" @@ -0,0 +1,12 @@ + + +

    ListIndexer: Стилі

    +Стилі сніпета для виведення форматованого списку посилань на документи. +
    +
    div.LIn_title {} Стиль заголовку
    +
    ul.LIn_fullMode {} Клас для списку в full режимі
    +
    ul.LIn_shortMode {} Клас для списку в short режимі
    +
    span.LIn_date {} Класс для дати
    +
    span.LIn_desc {} Класс оформляє опис
    +
    div.LIn_pagination {} Стиль для посилань на такі сторінки (пагінація)
    +
    span.LIn_currentPage {} Клас для поточної сторінки
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/index.md" new file mode 100644 index 00000000..ff3acfde --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ListIndexer/index.md" @@ -0,0 +1,4 @@ + + +

    ListIndexer - форматований списку посилань документів

    +Сніпет для виведення форматованого списку посилань на документи. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/01_\320\206\320\275\321\201\321\202\321\200\321\203\320\272\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/01_\320\206\320\275\321\201\321\202\321\200\321\203\320\272\321\206\321\226\321\217.md" new file mode 100644 index 00000000..2d4438e4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/01_\320\206\320\275\321\201\321\202\321\200\321\203\320\272\321\206\321\226\321\217.md" @@ -0,0 +1,294 @@ + +

    MODxBB и phpBB: Інструкція

    +Посібник зі встановлення та налаштування конфігурації MODxBB. +
    + +

    Ласкаво просимо до документації MODxBB. Ця документація включена до пакету MODxBB, також ви можете ознайомитися з нею в Інтернеті на сайті modxbb.net/documentation

    +

    Даний посібник пов'язаний із змістом на правій стороні, так само там є інформація про дату створення та останню модифікацію для кожної сторінки. Ця інформація дозволяє швидко перевірити, коли сторінку було оновлено. Крім того, я створив файл CSS для виведення на друк, який повинен стати в нагоді тим, хто воліє читати документацію на папері.

    + + +

    MODxBB інтегрує MODX і PhpBB один в одного при збереженні масштабованості

    +

    MODX є системою керування контентом, що високо налаштовується, яка також може бути використана як основа для керування контентом

    +

    PhpBB це дуже потужна система управління веб-форумами, яка широко використовується як комунікаційна платформа, однак, вона має значний потенціал

    +

    Адміністратори, які хотіли б використовувати MODX PhpBB стикаються з проблемою, що користувачам доведеться двічі реєструватися та підтримувати два облікові записи для одного сайту. Одна з головних цілей MODxBB полягає у вирішенні цієї проблеми шляхом інтеграції обох систем одна в одну

    +

    Це набагато більше, ніж просто міст для облікових записів користувачів. Використовуючи MODxBB, розробник може отримати доступ до обох інтерфейсів на будь-якій PhpBB сторінці, а також на будь-якій сторінці MODX
    Докладніше про MODxBB та його особливості можна прочитати у статті Ласкаво просимо в MODxBB на modxbb.net.

    + +

    Цей документ вийшов набагато докладнішим, ніж спочатку планувалося. Він призначений для ознайомлення навіть недосвідченими користувачами, однак, необхідно відзначити, що чим глибші ваші знання про (X) HTML, CSS та PHP, тим більше ви можете отримати від використання MODxBB

    +

    У цьому посібнику розглядаються всі можливі типи установки, отже, вам не потрібно все це вивчати. Додаткові розділи починаються з повідомлення про те, коли вони потрібні для читання

    +

    Незважаючи на не дуже просте встановлення та налаштування, після встановлення у вас не повинно виникнути проблем у використанні MODxBB. У майбутніх версіях планується створити інтерфейс для спрощення встановлення та налаштування.

    + +

    Докладніші посібники, поради та приклади з різних тем будуть додаватися на блогmodxbb.net пізніше.

    + + +
      +
    • MODX Evolution 1.0.0 - 1.0.15 рекомендується: 1.0.7
    • +
    • phpBB 3.0.4 - 3.0.11 • рекомендуєтся: 3.0.11
    • +
    • MODxBB 0.9.5 (входить до комплекту постачання)
    • +
    • Веб-сервер для работи phpBB и MODX.
    • +
    + +

    УВстановіть MODX Evolution. Якщо така установка вже існує, рекомендується оновити до останньої версії, якщо ви ще не зробили цього. На сторінці завантаження MODX ви можете дізнатися, яка версія є останньою та завантажити її за потреби

    +

    У процесі встановлення ви повинні поставити сайт в "Оффлайн" режим: Інструменти -> Конфігурація -> Статус сайту виберіть 'Оффлайн'.

    + +

    Створіть у корені вашого сайту папку 'forum' (форум може бути встановлений у будь-яку папку, але папка 'forum' рекомендується). Якщо у вас уже встановлено phpBB, відвідайте сторінку завантаження PhpBB, щоб переконатися, що у вас остання версія.

    +

    Настійно рекомендується розташувати папку 'forum' у корені сайту. Встановлення форуму в іншу папку має виконуватися лише досвідченими користувачами. Якщо ви хочете, щоб ваш форум був інтегрований у шаблон сайту, як це зроблено на MODxBB.net Вам необхідно налаштувати основні шаблони phpBB (overall_header і overall_footer). Про те, як це робиться, докладно описано у відповідній гілці форуму phpBB.com.

    +

    ПОРАДА: Деякі браузери мають корисні інструменти (Firebug у Firefox або DragonFly в Opera), що може вам стати в нагоді при оформленні стилю вашого форуму, тому що вони полегшують роботу з CSS. Я також рекомендую безкоштовну утиліту Colour To HTML , оскільки вона економить масу часу при доборі необхідного кольору, яку потрібно змінити на інший. (Color-picker -> find in CSS)

    +

    Ще одна порада, яка може заощадити вам багато часу: overall_header.html та overall_footer.html разом узяті є повною HTML-сторінкою. Ви можете їх об'єднати (наприклад, у редакторі) для редагування та розділити знову, після того, як закінчите редагування.

    +

    Вставка PhpBB шаблону як частина шаблону або документа MODX, до речі, теоретично можлива, але не розумна.

    + +

    ПРИМІТКА: function_user.php MODXBB, що входить до пакету, містить виправлення помилки в рядку 2186, яке вирішує питання про аватарів галереї, які не сортуються належним чином. Я додав це разом із можливістю MODxBB використовувати аватари галереї.

    + +

    ВАЖЛИВО: Зробіть резервне копіювання всіх файлів, які будуть замінені або відредаговані. Щоб дізнатися, які файли були змінені при повній установці MODxBB, читайте сторінку Список файлів або перегляньте папку "Documents", включаючи підпапки.

    +

    За бажанням ви можете зробити копію всього сайту, але це не обов'язково. Файли, які будуть перезаписані (швидке встановлення) або відредаговані (вибіркова установка), можна знайти в папці Documents в архіві MODxBB.

    + +

    Якщо все, що ви хочете, це вивести чанки та сніпети на вашому форумі, просто скопіюйте файл modxapi.php (що входить до комплекту MODxBB) у корінь вашого сайту, та переходьте до розділу 2.4.6.

    + +

    Є три вимоги до швидкого встановлення:

    +
      +
    • 1. PhpBB 3.0.11
    • +
    • 2. MODX 1.0.7 Evo
    • +
    • 3. Жоден з файлів, які будуть замінені, не були змінені користувачем до цієї установки (якщо ви не хочете втрати внесених змін).
    • +
    +

    НЕ ЗАБУДЬТЕ ПРО РЕЗЕРВНОЕ КОПИРОВАНИЕ!

    +

    Просто скопіюйте файли з папки MODxBB\Documents у корінь вашого сайту, зберігши структуру папок.

    +

    ПРИМІТКА: Це передбачає, що ваша папка форуму називається "forum". Крім того, якщо ви не хочете налаштувати стиль JOT у стилі MODxBB, пропустіть папку JOT.

    + +

    Вибіркова установка потрібна, якщо ви використовуєте застарілу версію PhpBB або MODX, або модифіковану версію, яку ви хочете зберегти або просто хочете знати, що було відредаговано під час встановлення.

    +

    Я відмовився від мого початкового плану показати всі зміни, що вносяться, назвавши номери рядків, тому що є ризик вас заплутати. Залежно від версії та кількості модифікацій доданих користувачами, відмінності у змінах можуть бути занадто великими.

    +

    Замість цього ми будемо використовувати більш безпечний та зрозумілий спосіб: Відвідаємо сторінку WinMerge та завантажуємо останню версію WinMerge. Це чудова безкоштовна програма, яка може порівнювати файли та показувати їх відмінності. Linux та Mac користувачі можуть знайти альтернативи в цій статті.

    +

    Все, що потрібно зробити зараз, це порівняти файли в папці "Original" з файлами в папці "Documents". Зверніть увагу на відмінності та їх розташування у файлі. Не покладайтесь на номер рядка! Натомість перевірте рядки до та після змін та увімкніть їх у тому ж місці файлу на вашому веб-сервері.

    +

    Приклад:

    +

    Після встановлення, запустіть WinMerge та виберіть у меню Файл -> Відкрити, щоб додати файл index.php знаходиться в папці "Documents", а також файл, який розташований у папці "Original", які можна знайти в архіві MODxBB. Тепер скачайте index.php вашого сайту і увімкніть у нього відмінності двох інших файлів, які показав WinMerge (не забудьте про резервні копії ваших файлів!). Коли закінчите, завантажте відредагований та збережений файл index.php у корінь вашого сайту. Зробіть те саме з іншими файлами.

    + +

    Установка MODxBB елементів не є обов'язковою. Ви можете встановити їх усі або тільки частину. Ви можете пропустити цей розділ, якщо ці елементи не потрібні. У наступній таблиці перелічені всі включені до комплекту MODxBB елементи:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваТипОпис
    LatestTopicsBBсніпетВідображає останні активні теми форуму
    LoginBBсніпетРеєстрація в MODxBB та профіль авторизованого користувача
    OnlineListBBсніпетПоказує, хто знаходиться на сайті
    PrevPollsBBсніпетВідображає історію опитувань
    SitePollBBсніпетВиводить PhpBB опитування на будь-якій сторінці сайту
    PluginBBплагін +

    Зв'язує профілі користувачів PhpBB із профілями веб-користувачів MODX

    +
    +
    +

    Детальніший опис, включаючи скріншоти, можна знайти на MODxBB.net

    +

    Для установки будь-який з наведених вище cybggtnjd, увійдіть у ваш менеджер MODX, перейдіть за посиланням: Елементи -> Управління Елементами -> Сніппети та натисніть кнопку "Новий Сніппет". Назва така сама, як ім'я файлу або як у наведеному вище списку. Для опису введіть 0.9.5, а потім введіть опис з таблиці вище. Опис допоможе розпізнати фрагмент, номери версії потрібні на відміну від можливих майбутніх версій

    +

    Тепер вставте вміст відповідного файлу в код сніпета, файли знаходяться в папці "Elements" у пакеті MODxBB. Не забудьте зберегти сніпет!

    +

    Для встановлення плагіна PluginBB перейдіть в Елементи -> Управління Елементами -> Плагіни та натисніть кнопку "Новий плагін"

    +

    Задайте назву, опис та код як у прикладі вище.
    Тепер натисніть на "Системні події" та активуйте прапорці "OnUserFormRenter" та "OnWUsrFormRender". Збережіть плагін.

    + +

    Той, хто хоче розробити свій стиль форуму, налаштувавши дизайн відповідно до дизайну сайту, повинен пройти кроки, описані в розділі 2.3

    +

    Наступний крок необхідний лише тим, хто хоче розмістити MODX елементи (сніпети, чанки) або повідомлення про помилки MODX на форумі. Якщо це не потрібно, ви можете перейти до розділу 3. Конфігурація

    +

    По-перше, відкрийте файл overall_header.html. Це може бути зроблено в PhpBB адміністраторської панелі управління (Загальні -> Стилі -> Шаблони), або шляхом пошуку файлів у папці forum\styles\ВашаТема\template (за умови, що форум знаходиться в папці "forum" і у вас встановлена необхідна тема). Потім додайте наступні рядки на початку цього файлу:

    +
    <?php
    +	if (!defined('ADMIN_START')){
    +		require_once($phpbb_root_path . '../modxapi.php');
    +	}
    +	else {
    +		require_once($phpbb_root_path . '../../modxapi.php');
    +	}
    +
    +	global $modx;
    +	$modx = new MODxAPI();
    +	$modx->connect();
    +	$modx->getSettings();
    +?>
    +

    Наступний крок необхідний тільки якщо ви хочете відображати повідомлення про помилку MODX на форумі PhpBB.

    +

    Додайте такі рядки в нижній частині шаблону:

    +
    <?php
    +	$MODx_output = '';
    +	global $MODx_output;
    +	if ($MODx_output) {
    +		echo $MODx_output;
    +	}
    +?>
    +

    Тепер знайдіть файл overall_footer.html (перебуває в тій же папці) і додайте наступні рядки у верхній частині:

    +
    <?php
    +	global $modx;
    +?>
    + + +

    Якщо ви зробили мінімальну установку, ви можете перейти до розділу 3.1.4.

    + +

    Ви повинні позбутися реєстраційної форми WebLogin якщо вона у вас використовується, тому що PhpBB піклується про реєстрацію користувачів і передає дані користувача в MODX. Для забезпечення авторизації та реєстрації на ваших сторінках MODX використовуйте сніпет LoginBB, який включений у пакет MODxBB.

    + +

    Це необхідно, якщо ви хочете налаштувати JOT у стилі MODxBB, як показано на головній сторінці та на форумі MODX

    +

    Увійдіть у свій PhpMyAdmin, виберіть базу даних MODX і натисніть на modx_web_user_attributes (у вас може бути інший префікс, не modx_). Тепер натисніть на "Структура" (верхній рядок), перейдіть до рядка "Додати" (залежно від теми PhpMyAdmin вона може бути також у верхній частині). Додайте 1 поле, клацніть перемикач "Наприкінці таблиці" натисніть ОК

    +

    Тепер введіть такі значення:

    +
    Поле: postcount
    +
    Тип: Int (11)
    +
    За замовчуванням: 0 [вибрати "Як визначено:" зі списку, що випадає]
    +
    Коментарі: jot comments
    +

    Натисніть кнопку Зберегти.

    + +

    Те ж саме застосовується і тут: Це тільки необхідно, якщо ви хочете використовувати Jot в стилі MODxBB

    +

    Відкрийте chunk.comment.inc.html у папці jot\templates (той, який ви завантажили раніше) і замініть assets/images/YourDefaultAvatar.png у рядку 8 на URL до аватару за замовчуванням, та assets/images/YourGuestAvatar.png у рядку 10 на URL до аватара за умовчанням для гостей

    +

    Ви можете завантажувати аватари в папку assets або зберігати їх в іншому місці, однак, щоб зберегти узгодженість, я рекомендую додати аватар групі для гостей (анонімних користувачів) та для групи зареєстрованих користувачів у PhpBB і використовувати їх

    +

    Ви можете зробити це в адміністраторі PhpBB (ACP) -> Користувачі та групи -> Управління групами - -> Налаштування.

    +

    3.1.4 Додати посилання на форум

    +

    Щоб показати посилання на Ваш форум у списках, створених сніпетом Wayfinder і т.д. (наприклад у карті сайту), Ви повинні створити веб-посилання на ваш форум. Це може бути зроблено у менеджері MODX. Для отримання додаткової інформації про створення веб-посилання читайте документацію MODX або запитуйте на форумі.

    + + +

    Це необхідно тільки, якщо ви хочете показати елементи MODX або повідомлення про помилки на вашому форумі, інакше переходьте до розділу 3.2.2.

    +

    Увійдіть в адміністраторську панель (АСР) PhpBB і натисніть кнопку "Безпека" в "Конфігурація сервера" на вкладці Загальні. Перейдіть до "Дозволити PHP у шаблонах:" і виберіть "Так". Натисніть кнопку Надіслати. Цей крок необхідний для обробки команд MODX, які були додані до шаблону PhpBB.

    +

    УВАГА: Не завантажуйте та не запускайте ненадійні PhpBB теми в той час, коли цей параметр увімкнено! Ви повинні завантажити теми лише з phpBB.com або з інших надійних джерел.

    + +

    Цей крок необхідний тільки якщо ви хочете, щоб гості мали змогу проголосувати на ваших сторінках MODX під час використання сніпету SitePollBB

    +

    Ідіть на ту ж сторінку, як у 3.2.1 (ACP -> Загальні -> Конфігурація сервера -> Безпека) і знайдіть пункт "Прив'язати форми до гостьових сесіях:" (має бути внизу). Змініть значення на "Ні" та натисніть кнопку Надіслати.

    + +

    Цей крок необхідний, якщо ви плануєте додати чанки або сніпети до PhpBB. Це гарантує, що ваш форум розпізнає та відобразить візуальні зміни, зроблені вашими елементами MODX на форумі

    +

    Увійдіть до свого phpBB АСР. На вкладці Загальні перейдіть до вкладки "Конфігурація сервера" і натисніть "Навантаження на сервер". Тепер потрібно знайти "Перекомпілювати старі шаблони:" змініть на "Так" і натисніть кнопку Надіслати.

    + +

    Тепер ви можете додавати команди для запуску MODX елементів (чанки, сніпети) на форумі. Вони можуть бути додані в будь-який із шаблонів, які ми редагували в розділі 2.4.6 або будь-який інший шаблон, який належить цій же темі, проте я рекомендую додати їх у нижній частині overall_header.html

    +

    Це ефективний спосіб показу оголошень на вашому форумі (але особисто я не люблю оголошення на форумах), як на MODxBB.net або ще щось, що Ви хочете, щоб ваші читачі форуму побачили. Приклади: Щоб запустити чанк MODX, який відображає оголошення на вашому форумі, відкрийте overall_header.html розташований у папці forum\styles\ВашаТема\template і додайте наступні рядки в нижній частині шаблону між тегами PHP, які ми додавали в розділі 2.4.6 :

    +
    echo $modx->getChunk('Announcement');
    +

    Де 'Announcement' ім'я вашого чанка.

    +

    Якщо ви додавали шаблон рядка для виведення помилок MODX, це буде виглядати так:

    +
    <?php
    +	echo $modx->getChunk('Announcement');
    +	$MODx_output = '';
    +	global $MODx_output;
    +	if ($MODx_output){
    +		echo $MODx_output;
    +	}
    +?>
    +

    або так:

    +
    <?php
    +	echo $modx->getChunk('Announcement');
    +?>
    +

    Ви можете також додати це будь-де в межах шаблону або в будь-якому іншому шаблоні.

    +

    Щоб вставити сніпет, використовуйте:

    +
    echo $modx->runSnippet('SomeSnippet');
    +

    Якщо сніпет має параметри, ми зробимо так:

    +
    echo $modx->runSnippet("MySnippet", array('column'=>'3', 'tpl'=>'MyTemplate')
    +

    Де 'column' і 'tpl' - параметри, а '3' і 'MyTemplate' - значення.

    +

    Для наочності ви можете створити масив:

    +
    $parameters['column']=3;
    +$parameters['tpl']=MyTemplate;
    +echo $modx->runSnippet('snippet_name', $parameters);
    +

    При розміщенні у шаблоні, не забувайте PHP теги:

    +
    <?php
    +	$parameters['column']=3;
    +	$parameters['tpl']=MyTemplate;
    +	echo $modx->runSnippet('snippet_name', $parameters);
    +?>
    + +

    Для установки сніппетів, відкрийте його та змініть змінні в розділі конфігурації. У пізніших версіях ви зможете передавати параметри в сніпет.

    + +

    Є три змінні, які можна налаштувати в конфігурації цього сніпета. Перша $num_post визначає кількість статей, що відображаються, які відображає цей сніпет. По-друге, $num_chars визначає кількість символів, які відображаються в кожній статті і, нарешті, $DefaultAvatar дозволяє встановити аватар за умовчанням для користувачів, які не встановили аватар. > +

    +

    Є два параметри, які можна змінити. Як змінна $phpBB_folder у першому розділі міститься ім'я головної папки форуму. Якщо це, відповідно до рекомендацій, папка «forum», залиште значення змінної як є

    +

    Для налаштування рангів користувачів прокрутіть вниз до switch ($phpBB_rank). Тут перераховані візуальні відображення рангів, а цифри використовуються для ідентифікації рангів PhpBB. Більшість з цього очевидна, однак, буде стаття про MODxBB.net, яка докладно пояснить роботу системи рангів і груп у phpBB і MODxBB.

    + +

    Цей сніпет також має параметр $phpBB_folder у першому абзаці, який має бути змінений у разі, якщо папка вашого форуму не називається «forum»

    +

    Якщо ви НЕ використовуєте сніпет SitePollBB на тій же сторінці, розкоментуйте, будь ласка, другий абзац (видалив / * і * / ).

    +

    OnlineListBB використовує JQuery, щоб дізнатися, що це таке і як воно працює, читайте документацію JQuery. Нехай вас це не лякає, насправді потрібно додати лише один рядок, щоб підключити JQuery, який виглядає так:

    +
    <script type="text/javascript" src="js/jquery-1.5.min.js"></script>
    +

    Це передбачає, що ви завантажили сценарій JQuery і скопіювали його в папку "js". Майте на увазі, що вам, можливо, не потрібно цього робити, якщо ви вже маєте підключену бібліотеку JQuery. Ви також можете встановити режим сумісності, якщо ви використовуєте бібліотеку MooTools, наприклад.

    + +

    Цей сніпет відображає історію опитувань. Він може бути використаний як історія для опитувань, які були показані SitePollBB або окремо

    +

    Якщо папка вашого форуму відрізняється від стандартної папки, ви повинні налаштувати її і тут. У першому абзаці знайдіть $phpbb_root_path та замініть "forum" на ім'я папки вашого форуму. Наприклад, якщо ваша папка називається 'board', замініть './forum/' на './board/'

    +

    Існують п'ять змінних, які встановлюються у розділі конфігурації (другий абзац). $forum_ids ідентифікатори форумів, з яких необхідно брати опитування, вказуються через кому.

    +

    $num_posts визначає максимальну кількість опитувань, що відображаються.

    +

    $per_page кількість опитувань на одній сторінці. Якщо $per_page буде менше $num_posts, то сніппет відобразить пагінацію для переходу між опитуваннями.

    +

    $page_start стартова сторінка під час пагінації. Де request_var є функція PhpBB, яка дозволяє безпечно перейти до значення запиту. Рекомендується залишити цей параметр без змін.

    + +

    Конфигурация этого сниппета находится в файле poll.php , расположенном в папке modxbb, поставляется с пакетом MODxBB.

    + + +

    Це основний двигун для сніпету SitePollBB. Він містить дві змінні для його налаштування

    +

    Змініть значення $prevpollID у рядку 20, вказавши ID вашої MODX сторінки, яка містить сніпет PrevPollsBB, підключений до сніпета SitePollBB. Пояснення: Є посилання "Попередні опитування" у сніпеті SitePollBB, яке визначається тут.

    +

    У рядку 54 встановлюються форум(и), звідки беруться опитування для розміщення на сторінці MODX, яка містить SitePollBB. Ви можете вибрати один або декілька

    +

    Наприклад, якщо ви хочете відобразити останні опитування форумів з ID 12 та 13, необхідно змінити рядок таким чином: $CFG['poll_forum'] = array(12,13);

    +

    У рядках 57-59 налаштовується відображення BBCode, смайликів та URL-адрес.

    + +

    MODxBB підтримує додаткові поля PhpBB. Ви можете зробити так (але не обов'язково), щоб вони відображалися у профілі веб-користувачів MODX

    +

    Для цього вам потрібно налаштувати edit.php та signup.php обидва розташовані в папці modxbb. Приклад із "fullname" вже включений туди. Якщо ви створюєте профіль користувача в PhpBB з ідентифікацією по "fullname", ви автоматично отримаєте значення для цього поля з профілю веб-користувачів MODX "Fullname". Щоб створити додаткове поле, зайдіть в АСР, на закладці "Користувачі та групи" натисніть "Додаткові поля у профілі" у розділі Користувачі

    +

    Цей файл керує змінами, які зроблені в PhpBB і передає їх у MODX, отже, додаткові поля необхідно ввести окремо, якщо ви хочете, щоб вони відобразились у профілі MODX. У рядках 38-47 показано, як це працює. Префікс pf_ завжди додається, решта (тут «fullname») поле ідентифікації користувача профілю

    +

    Детальний посібник про те, як створювати та керувати додатковими полями, в тому числі, як змінити профілі веб-користувачів у MODX буде пізніше опубліковано у блозі MODxBB.net.

    + +

    Другий файл, який потрібно змінити, якщо ви хочете додати додаткові поля в MODX і PhpBB є signup.php

    +

    Рядок 26 містить приклад для «fullname»:

    +
    $fields["fullname"] = $cp_data['pf_fullname'];
    +

    в цьому рядку параметру pf_fullname надається значення параметра fullname з таблиці MODX. Ви також можете призначити це значення будь-якому іншому параметру.

    +

    У рядку 28 значення поля fone таблиці site_web_user_attributes присвоюється значення поля user_id таблиці phpbb_users. Я вибрав цей шлях для простоти. Можна, звичайно, створити поле phpBB_ID у базі даних MODX або використовувати будь-яку іншу область. Це використовується для зв'язку профілів PhpBB та MODX, таким чином, якщо ви використовуєте інше поле, відмінне від поля за замовчуванням, потрібно налаштувати плагін PluginBB (просто знайти "phone" та замінити на потрібне поле).

    +

    У рядку 29 замініть forum/download/file.php?avatar=g2_1266363854.png URL для аватара за замовчуванням (для користувачів, у яких немає аватара).

    +

    Якщо ви не хочете, щоб новим користувачам надсилалося повідомлення з привітанням, поставте на початку рядка 33 дві риси //

    + +

    Цей файл містить текст повідомлення, яке надсилається користувачам відразу після реєстрації.

    +

    Як показано в рядку 25, ви можете використовувати $BridgeUser як шаблон для одержувача. Теоретично можна використовувати будь-які інші параметри, що належать користувачеві, значення яких зберігається в MODX або PhpBB. Смайли та BBcode також підтримуються

    +

    У рядку 45 $fields["phone"] вказується ідентифікатор користувача PhpBB. Якщо, як описано в попередньому розділі, ви вибрали інше поле, вкажіть його замість "phone"

    +

    Інше має бути зрозумілим.

    + +

    Переконайтеся, що ви використовуєте однакові параметри кодування для поля username обох систем (MODX і PhpBB). Рекомендується кодування utf8_unicode_ci, проте, якщо ви вирішите використовувати інше кодування, його необхідно змінити в рядку 88. Просто замініть "utf8_unicode_ci" у цьому рядку назвою кодування.

    + + +

    Всі елементи MODxBB підтримують CSS і таким чином дозволяють налаштовувати висновок. Рекомендується використовувати CSS-скидання, щоб налаштувати однакове відображення у всіх браузерах (це також загальні рекомендації CSS, а не тільки MODxBB).

    +

    На сторінці CSS селектори перераховані всі селектори, які знаходяться в файлі css. Ці значення ідентичні тим, що використовуються на MODxBB.net.

    + +

    Можливо використовувати окремі аватари для блогів (відмінних від аватарів на форумі). Те саме стосується будь-яких інших даних профілю. Оскільки зміни, які вносяться до PhpBB в "Панелі управління", будуть відправлені в MODX, але не навпаки.

    +

    ВАЖЛИВО: Якщо вручну внести зміни до адміністративної панелі керування АСР (наприклад, ім'я користувача) , це має бути зроблено вручну і MODX, так як це ще не автоматизовано в цій версії.

    + +

    Ви можете налаштувати індивідуальний зміст для кожного користувача відповідно до його рівня чи звання, або за іншими критеріями. Це стосується і властивостей у профілі.

    +

    Приклади:

    +

    - Можна створювати контент, який видно лише зареєстрованим користувачам.

    +

    - Ви можете написати оголошення, яке буде показане лише користувачам з 1000 або більше повідомленнями або зі спеціальним званням "Premium User" (спеціальні звання можуть бути створені в PhpBB ACP).

    +

    - Повідомлення користувачам, які святкують свій день народження з особливим змістом (наприклад, банер з вітанням).

    +

    Докладний опис та приклади на цю тему будуть розміщені в блозі MODxBB.net пізніше.

    + +

    Деякі читачі можуть запитати, чому просто не використовувати тільки систему аутентифікації PhpBB, раз PhpBB інтегровано таким чином на сторінки MODX. Це дійсно можливо, але якщо ви опустите автентифікацію в MODX, облікові записи користувачів на сайті MODX будуть повністю непридатними для деяких додатків MODX. Це також включає ролі та права створені в менеджері MODX

    +

    Якщо вам це не проблема, і ви знайомі з PHP, вам ні що не заважає це використовувати. Все, що вам потрібно, це відключення оновлення параметрів MODX

    +

    Я напишу підручник з цієї теми, якщо на нього буде попит.

    + +

    Це лише корисний інструмент, який може стати в нагоді в деяких випадках. Ви можете відкрити у вікні адміністративної панелі MODX профіль phpBB. Якщо ви віддаєте перевагу відкриттю у повному вікні, просто відкрийте його в новій вкладці.

    + +

    MODxBB генерує журнали, які можна прочитати в адміністративній панелі MODX (Звіти -> Перегляд подій). Вони нададуть, як передбачається, допомогу у пошуку потенційних проблем та спроб злому. Найважливіша інформація показується без детального перегляду. Це економить час та підвищує читабельність. Помилки входу в систему відображаються як "Тип помилки - IP - Ім'я користувача", де P - введено неправильний пароль, а U - неправильне ім'я користувача.

    + +

    Ця тема безпосередньо не пов'язана з MODxBB і PhpBB. Будь-який працюючий форум, швидше за все, зіткнеться із проблемою спаму. Зокрема, від початку цього року спостерігається збільшення спам-атак

    +

    Існують різні способи захисту форуму від спаму. Я спочатку планував розповісти про деякі з них тут, але phpBB.com вже є корисні статті про це. Таким чином, я просто додам посилання на ці статті:

    +

    Preventing Spam in phpBB3 - Більшість з цих методи також застосовні і для інших платформ.

    +

    Spam Discussion - Додаткові поради.

    > + +

    Коли користувач реєструється, MODxBB створює відповідний обліковий запис веб-користувача MODX. Web2Manager дуже корисний плагін для керування веб-користувачами. Він також дозволяє створити обліковий запис веб-користувача з наявного облікового запису користувача MODX. Існуючі облікові записи будуть оновлені

    +

    Останню версію можна завантажити тут: Web2Manager-0.3 .3.zip

    + + +

    У дуже поодиноких випадках оновлення сторінки з опитуванням може дати можливість проголосувати 2 рази. Це відбувається лише тоді, коли гості мають право голосу та гості можуть змінити свій вибір і може бути вибрано кілька варіантів відповіді. Це дуже малоймовірно, але не неможливо.

    +

    Обхідний шлях: Просто видаліть додаткові опції.

    + +

    Вихід із системи у сніпеті LoginBB перенаправляє на індексну сторінку форуму замість повернення на ту саму сторінку, на відміну від входу до облікового запису, коли користувач повертається на ту саму сторінку.

    +

    Примітка: Це не помилка. Щоб повернути користувача на ту саму сторінку, яку він відвідав, перш ніж вийти з системи, довелося б змінити файл ядра, в той час як користувачеві в більшості випадків байдуже, куди він буде перенаправлений.

    +

    Рішення: щоб повернути користувача туди, де він знаходився при виході з системи, ви повинні внести зміни до функції PhpBB meta_refresh.

    + +

    Спеціальні теги MODX ([~ID~]) не працюють на сторінках PhpBB. Це може бути виправлено в одній із майбутніх версій

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/02_\320\206\321\201\321\202\320\276\321\200\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/02_\320\206\321\201\321\202\320\276\321\200\321\226\321\217.md" new file mode 100644 index 00000000..8d1ecb43 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/02_\320\206\321\201\321\202\320\276\321\200\321\226\321\217.md" @@ -0,0 +1,30 @@ + +

    MODxBB та phpBB: Історія розвитку

    +Історія розвитку форуму MODxBB на MODX Evolution. +
    + +

    Ідея створення мосту, що з'єднує MODX та PhpBB, з'явилися наприкінці 2009 року.

    +

    MODX та PhpBB були основним проектом, однак, не було жодного програмного забезпечення, яке б їх об'єднувало.

    +

    Мостом, сформованим ще в період розвитку їхньої взаємної інтеграції, і став MODxBB, про що було публічно оголошено (попередній перегляд) 9.9.2010 вперше. Перший публічний реліз був опублікований 19.05.2011 року.

    + +

    0.9.5 третя публічна версія - оновлення для PhpBB 3.0.11

    +

    - оновлення для MODx Evo 1.0.7

    +

    - виправлено: 3 версії помилки "log-out bug", при яких користувач виходив із системи відразу після авторизації.

    +

    - виправлено: зворотний порядок варіантів відповіді в опитуваннях на сайті та в історії опитувань порівняно з форумом.

    +

    - додано: відображення загальної кількості голосів в історії опитувань.

    +

    - додано: нові зареєстровані користувачі можуть автоматично додаватися до групи "Registered Users" (за замовчуванням вимкнено).

    +

    - покращено: замінені всі "echo" у сніпетах на "return".

    +

    - покращено: зменшення кількості вбудованих стилів у сніпетах.

    +

    - покращено: кілька дрібних виправлень та покращень.

    +

    Реліз: 17 Грудня 2012

    +

    0.9.4 друга публічна версія

    +

    - оновлення для PhpBB 3.0.9

    +

    - LoginBB тепер працює на сторінках PhpBB

    +

    - Неправомірні користувачі переадресовуються на 'несанкціоновану сторінку'

    +

    Реліз: 12 Липень 2011

    +

    0.9.3 перша публічна версія

    +

    Реліз: 19 травня 2011

    + +

    - Зручна інсталяція та налаштування

    +

    - Підтримка [~ID~] на сторінках PhpBB

    +

    - Виправлення помилок

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/03_\320\222\321\226\320\264\320\274\320\276\320\262\320\260_\320\262\321\226\320\264_\320\262\321\226\320\264\320\277\320\276\320\262\321\226\320\264\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/03_\320\222\321\226\320\264\320\274\320\276\320\262\320\260_\320\262\321\226\320\264_\320\262\321\226\320\264\320\277\320\276\320\262\321\226\320\264\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..43c3dac1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/03_\320\222\321\226\320\264\320\274\320\276\320\262\320\260_\320\262\321\226\320\264_\320\262\321\226\320\264\320\277\320\276\320\262\321\226\320\264\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,11 @@ + +

    MODxBB та phpBB: Відмова від відповідальності

    +Copyright & Відмова від відповідальності форуму phpBB на MODX Evolution. +
    + +

    Обидва MODx та PhpBB це програми з власними та товарними знаками відповідних власників.

    +

    MODx є зареєстрованою торговою маркою MODX Technologies, LLC .

    +

    PhpBB є продуктом PhpBB групи і випущений під ліцензією GPL.

    +

    MODxBB випущено під ліцензією MIT . Це означає, що ви можете робити практично все, що завгодно з цим програмним забезпеченням, однак, все на свій страх та ризик. Немає жодних гарантій і автори MODxBB не несуть відповідальності за будь-які збитки, збитки тощо. Для більш детальної інформації прочитайте повну версію цієї ліцензії.

    +

    Є умова, але не обов'язкова, щоб зроблені модифікації були видані в дусі відкритого джерела, щоб дати іншим користувачам шанс їх використання. Для цього ви можете розмістити на форумі MODxBB або надіслати повідомлення автору за допомогою контакту або особисте повідомлення. Корисний внесок, ймовірно, розглядатиметься у наступних релізах.

    +

    Жодна тварина не постраждала під час розробки, тестування та випуску цього продукту.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/04_\320\241\320\265\320\273\320\265\320\272\321\202\320\276\321\200\321\213.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/04_\320\241\320\265\320\273\320\265\320\272\321\202\320\276\321\200\321\213.md" new file mode 100644 index 00000000..26914e8a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/04_\320\241\320\265\320\273\320\265\320\272\321\202\320\276\321\200\321\213.md" @@ -0,0 +1,373 @@ + +

    MODxBB и phpBB: Селекторы

    +Селекторы форума phpBB на MODX Evolution. +
    + +

    На этой странице представлены CSS-селекторы для настройки отображения сниппетов MODxBB.
    Большинство из них говорят сами за себя. Я добавил комментарии, чтобы объяснить некоторые моменты. Значения и примеры идентичны тем, которые используются в файле CSS на сайте MODxBB

    +

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

    +

    Названия разделов описывают сниппеты, к которым они принадлежат. Они сортируются по порядку, в котором они появляются на сайте.

    +

    =============[ ПАНЕЛЬ ПОЛЬЗОВАТЕЛЯ ]=============

    +
    .loginbb {
    +	position:relative; 
    +	float:left;
    +	margin:0;
    +	padding:0 0 33px 0; 
    +}
    +
    +.loginbb table {
    +	float:left;
    +	margin:0 0 0 21px;
    +	padding:0px;
    +}
    +
    +.loginbb tr {
    +	float:left;
    +	width:243px;
    +	padding:3px;
    +}
    +
    +.loginbb button {
    +	width:59px;
    +	height:23px;
    +	margin:3px 0 0 -3px;
    +	vertical-align:bottom !important;
    +}
    +
    +.loginbb input:focus {
    +	outline:#7F91A1 dotted 2px;
    +}
    +
    +.loginbb .leftbb {
    +	float:left;
    +	padding-top:5px;
    +}
    +
    +.loginbb .buttonpanel {
    +	height:27px;
    +	margin-left:21px;
    +	padding-right:9px;
    +}
    +
    +.buttonpanel .leftbb {
    +	padding:5px 18px 0px 0px;
    +}
    +
    +.leftbb label {
    +	vertical-align:1px;
    +}
    +
    +.loginbb .rightbb {
    +	float:right;
    +}
    +
    +.loginbb .inputbb {
    +	border-right:2px white solid;
    +	border-bottom:2px white solid;
    +	border-left:1px Gray solid;
    +	border-top:1px Gray solid;
    +}
    +

    /* Класс privmsg используется для отображения в профиле пользователя информации о непрочитанных сообщениях в их почтовом ящике */

    +
    .privmsg {
    +	margin:3px 0;
    +	padding:2px 0 3px 0;
    +	border-top:2px #E6DBD8 solid;
    +	border-bottom:2px #E6DBD8 solid;
    +	background:#AF2525;
    +	font:normal small-caps 900 12px Arial, sans-serif;
    +}
    +
    +.privmsg a:link, .privmsg a:visited {
    +	color:white;
    +	text-decoration:underline;
    +}
    +
    +.privmsg a:hover {
    +	color:white;
    +	text-decoration:none;
    +}
    +
    +.privmsg a:active {
    +	color:white;
    +	text-decoration:overline underline;
    +}
    +
    +.privmsg span {
    +	font-variant:normal;
    +	letter-spacing:normal;
    +}
    +
    +.userpanel {
    +	position:relative;
    +	float:left;
    +	margin:0;
    +	padding:0 0 33px 0; 
    +}
    +
    +.userpanel table {
    +	float:left;
    +	margin-left:15px;
    +	padding:0px;
    +}
    +
    +.userpanel tr {
    +	float:left;
    +	width:270px;
    +	padding:3px;
    +	vertical-align:middle;
    +}
    +
    +.userpanel td {
    +	float:left;
    +	width:270px;
    +	border:1px #D3D3D3 solid;
    +	letter-spacing:normal;
    +}
    +
    +.userpanel img {
    +	float:left;
    +	width:90px;
    +	height:90px;
    +}
    +
    +.userpanel .userstats {
    +	position:relative;
    +	float:left;
    +	margin:0;
    +	padding:15px 0 0 3px;
    +	text-align:left;
    +	font:12px/110% Arial, sans-serif;
    +	letter-spacing:normal;
    +}
    +
    +.userpanel .userstats .userlinks {
    +	line-height:15px;
    +}
    +
    +.userpanel .username {
    +	color:#63463A;
    +	font:bold 16px/120% Arial, sans-serif;
    +}
    +

    ============[ ИСТОРИЯ ОПРОСОВ ]============

    +

    / * Они используются для нумерации страниц PrevPollsBB. Все остальные объекты этого сниппета используют селекторы Опроса Сайта * /

    +
    .pagination {
    +	text-align:center;
    +}
    +
    +.pagination a, .pagination strong {
    +	margin:0 3px;
    +}
    +

    ==============[ ОПРОС САЙТА ]==============

    +
    .sitepoll {
    +	display:block;
    +	position:relative;
    +	float:left;
    +	width:100%;
    +	margin:0;
    +	padding:33px 0 83px;
    +}
    +
    +.sitepoll h2 {
    +	margin-bottom:-9px;
    +}
    +
    +.sitepoll table {
    +	width:100%;
    +}
    +
    +.polloptions {
    +	letter-spacing:normal;
    +	width:auto;
    +	padding-right:0;
    +	padding-left:1px;
    +	margin-right:0;
    +	text-align:center;
    +}
    +

    /*. polloptions0 и.pollcount0 используются прежде, чем голосование сделано, .polloptions и.pollcount после того, как голосование было сделано */

    +
    .polloptions0 {
    +	letter-spacing:1px;
    +	padding-left:9px;
    +	text-align:center;
    +}
    +
    +.pollrow:hover {
    +	background:#A9CBD6;
    +}
    +
    +.pollshare {
    +	margin:0;
    +	padding-right:0;
    +	width:auto;
    +	min-width:120px;
    +	letter-spacing:normal;
    +}
    +
    +.pollshare div {
    +	margin:2px 0;
    +	padding:0;
    +	background:#A52A2A;
    +	text-align:center;
    +}
    +
    +.pollcount {
    +	position:relative;
    +	float:right;
    +	margin-right:0;
    +	margin-left:-3px;
    +	width:21px;
    +}
    +
    +.pollcount0 {
    +	position:relative;
    +	float:right;
    +	margin-right:5px;
    +	margin-left:-3px;
    +	width:21px;
    +}
    +
    +.voted {
    +	position:relative;
    +	float:right;
    +	width:5px;
    +	color:#696969;
    +}
    +
    +.maxvotes {
    +	line-height:21px;
    +	letter-spacing:normal;
    +	color:#696969;
    +}
    +
    +.maxvotes strong {
    +	color:#635757;
    +	letter-spacing:1px;
    +}
    +
    +.pollmsg {
    +	position:relative;
    +	float:left;
    +	width:210px;
    +	margin:7px 0 3px 9px;
    +	letter-spacing:normal;
    +}
    +
    +.pollmsg0 {
    +	position:relative;
    +	float:none;
    +	width:210px;
    +	padding:3px 0 9px;
    +	letter-spacing:normal;
    +}
    +
    +.errormsg {
    +	position:relative;
    +	float:left;
    +	width:210px;
    +	margin:7px 0 3px 9px;
    +	color:red;
    +	text-align:center;
    +	letter-spacing:normal;
    +	font-size:18px;
    +	font-weight:bold;
    +}
    +
    +.submitvote {
    +	position:relative;
    +	float:right;
    +	width:auto;
    +	height:auto;
    +	margin:-1px 9px 3px 3px;
    +}
    +
    +.submitvote button {
    +	width:59px;
    +	height:23px;
    +	margin-top:9px;
    +	vertical-align:bottom !important;
    +}
    +

    ============[ ПОСЛЕДНИЕ ТЕМЫ ]============

    +

    /* Есть только один класс для этого сниппета. Для дальнейшей настройки используйте html селекторы, как сделано ниже. */

    +
    .latestposts {
    +	width:295px;
    +	margin:0 0 0 7px;
    +	padding:33px 0 0px;
    +	text-align:left;
    +}
    +
    +.latestposts h4 {
    +	text-align:center;
    +	padding-bottom:3px;
    +}
    +
    +.latestposts div {
    +	margin-bottom:12px;
    +	padding:3px 0 3px 2px;
    +	border:1px #A1A1A1 dashed;
    +	overflow:hidden;
    +}
    +
    +.latestposts p {
    +	display:block;
    +	position:relative;
    +	min-height:54px;
    +	margin:0;
    +	padding:0 1px 0 43px;
    +	color:#696969;
    +	font:italic normal normal 12px/normal Arial, sans-serif; 
    +	letter-spacing:normal;
    +}
    +
    +.latestposts img {
    +	display:block;
    +	position:relative;
    +	float:left;
    +	height:33px;
    +	width:33px;
    +	border:1px #939393 solid;
    +	border-right:1px #4B4B4B solid;
    +	border-bottom:1px #4B4B4B solid;
    +}
    +

    ============[ КТО СЕЙЧАС НА САЙТЕ ]============

    +
    #onlinebox {
    +	margin:-7px 0 0;
    +	padding:0 0 39px;
    +}
    +
    +.onlineheader {
    +	font:12px/normal Calibri, Arial, sans-serif;
    +}
    +
    +#onlinelist {
    +	position:relative;
    +	width:100%;
    +	height:0px;
    +	margin:0;
    +	padding:0;
    +	background:#CFBFB1;
    +	color:#fff;
    +	text-align:left;
    +	font-size:14px;
    +	overflow:hidden;
    +}
    +
    +#onlinelist p {
    +	padding:5px;
    +}
    +

    /* span используется для легенды */

    +
    #onlinelist p span {
    +	font:italic normal normal 12px/normal Arial, sans-serif;
    +}
    +
    +#onlinelist a:link, #onlinelist a:visited {
    +	color:#63463A;
    +	text-decoration:none;
    +}
    +
    +#onlinelist a:hover {
    +	color:#7B91A5;
    +	text-decoration:underline;
    +}
    +
    +#onlinelist a:active {
    +	color:#FFFFED;
    +	text-decoration:none;
    +}
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/05_\320\241\320\277\320\270\321\201\320\276\320\272_\321\204\320\260\320\271\320\273\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/05_\320\241\320\277\320\270\321\201\320\276\320\272_\321\204\320\260\320\271\320\273\321\226\320\262.md" new file mode 100644 index 00000000..f4727664 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/05_\320\241\320\277\320\270\321\201\320\276\320\272_\321\204\320\260\320\271\320\273\321\226\320\262.md" @@ -0,0 +1,182 @@ + +

    MODxBB и phpBB: Список файлів

    +Список файлів форума phpBB на MODX Evolution. +
    + +

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

    +

    Список є повним, тобто він справедливий для необмеженої повної установки.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ІМ'Я ФАЙЛАШЛЯХЧАСТИНА
    index.php./MODx
    actionlist.inc.php./manager/includesMODx
    jot.class.inc.php./assets/snippets/jotJOT
    jot.db.class.inc.php./assets/snippets/jot/includesJOT
    chunk.comment.inc.html./assets/snippets/jot/templatesJOT
    chunk.form.inc.html./assets/snippets/jot/templatesJOT
    chunk.moderate.inc.html./assets/snippets/jot/templatesJOT
    chunk.subscribe.inc.html./assets/snippets/jot/templatesJOT
    jot.css./assets/snippets/jot/templatesJOT
    common.php./forumphpBB
    ucp.php./forumphpBB
    ucp_activate.php./forum/includes/ucpphpBB
    ucp_remind.php./forum/includes/ucpphpBB
    ucp_profile.php./forum/includes/ucpphpBB
    functions_user.php./forum/includesphpBB
    overall_header./forum/styles/proglass/templatephpBB
    overall_footer./forum/styles/proglass/templatephpBB
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ІМ'Я ФАЙЛАШЛЯХТИП
    login.php./modxbbphp file
    signup.php./modxbbphp file
    edit.php./modxbbphp file
    delete../modxbbphp file
    poll.php./modxbbphp file
    vote.php./modxbbphp file
    onlinelist.php./modxbbphp file
    LoginBBsnippet
    PrevPollsBBsnippet
    SitePollBBsnippet
    LatestTopicsBBsnippet
    OnlineListBBsnippet
    PluginBBplug-in
    MODxBBmodule
    +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/index.md" new file mode 100644 index 00000000..d4393c46 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MODxBB_phpBB/index.md" @@ -0,0 +1,4 @@ + + +

    MODxBB і phpBB форум в MODX Evolution

    +Інтеграція форума phpBB в MODX Evolution. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..e600fcc2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,6 @@ + + +

    ManagerManager: Особливості

    +Особливості плагіну ManagerManager для налаштування зовнішнього вигляду ресурсу в бекенд сайту. +
    +

    ManagerManager дозволяє вам налаштувати зовнішній вигляд сторінки створення/редагування ресурсу в бекенді вашого сайту. Ви можете перейменувати, приховувати й переміщувати основні та додаткові параметри ресурсу і вкладки. І робити це для конкретних ролей користувачів або шаблонів. Абсолютна влада!

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..11545299 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,175 @@ + + +

    ManagerManager: Параметри

    +Параметри плагіну ManagerManager для налаштування зовнішнього вигляду ресурсу в бекенд сайту. +
    +

    Назва полів

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Ім'я параметру в MMЗаголовок параметру
    pagetitleЗаголовок ресурсу
    longtitleРозширений заголовок
    descriptionОпис
    aliasПсевдонім
    link_attributesАтрибути силки
    introtextАнотація (введення)
    templateШаблон
    menutitleПункт меню
    menuindexПозиція в меню
    show_in_menuПоказувати в меню
    hide_menu Протилежність "Показувати в меню"
    parentПапка
    is_folderКонтейнер (має дочірні ресурси)
    is_richtextВикористовувати HTML-редактор
    logРеєструвати відвідування:
    publishedПублікувати
    pub_dateДата публікації
    unpub_dateДата скасування публікації
    searchableДоступний для пошуку
    cacheableКешований
    clear_cacheОчистити кеш?
    content_typeТип вмісту
    content_dispoМісцезнаходження вмісту
    keywordsКлючові слова
    metatagsMETA-теги
    contentВміст ресурсу
    which_editorРедактор
    resource_typeТип ресурсу
    +
    +

    Назви вкладок

    +
    + + + + + + + + + + + + + + + + + + + + + + +
    Імена вкладок в MMІмена вкладок
    generalСпільні
    settingsНалаштування сторінки
    accessПрава доступу
    metaКлючові слова
    +
    +

    Назви секцій

    +
    + + + + + + + + + + + + + + + + + + +
    Імена секцій в MMІмена секцій
    contentВміст ресурсу
    tvsПараметри (TV)
    accessПрава доступу
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/03_\320\222\321\226\320\264\320\266\320\265\321\202\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/03_\320\222\321\226\320\264\320\266\320\265\321\202\320\270.md" new file mode 100644 index 00000000..9c7d1079 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/03_\320\222\321\226\320\264\320\266\320\265\321\202\320\270.md" @@ -0,0 +1,1763 @@ + + +

    ManagerManager: Віджети

    +Віджети плагіну ManagerManager для налаштування зовнішнього вигляду ресурсу в бекенд сайту. +
    +

    Обмеження вводу даних

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddMaxLength($fields, $roles, $templates, $length)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДоступні значенняЗначення за замовчуванням
    fields *Поля документу (або TV), для яких необхідно задати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    lengthМаксимальна кількість символів, які можна ввести.{integer}150
    +
    +

    Приклад: Підключення віджету для TV «Slogan», обмеживши кількість символів до 140

    +
    mm_ddMaxLength('Slogan', '', '', 140);
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddNumericFields($tvs, $roles, $templates, $allowFloat, $decimals)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tvs *Імена TV, для яких необхідно задати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    allowFloatЧи можна вводити числа з плаваючою комою?{0; 1}1
    decimalsКількість цифр після коми (0 –  будь-яке).{integer}0
    +
    +

    Приклад: Зробити можливим ввід тільки цифр з точністю у 2 знаки після коми в TV «price» для шаблонів з id, рівним 15 або 16 і всіх ролей

    +
    mm_ddNumericFields('price', '', '15,16', 1, 2);
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_hideTemplates($tplIds, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tplIds *Id шаблонів, які необхідно приховати зі списку.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Приховати шаблони з id = 0 і 4 зі списку у всіх документах для користувачів з id ролі = 1

    +
    mm_hideTemplates('0,4', '1');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_hideFields($fields, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), які необхідно приховати.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Приховати поле «псевдонім» у документів з id шаблону = 3 для користувачів з id ролі = 1

    +
    mm_hideFields('alias', '1', '3');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddReadonly($fields, $roles, $templates)

    +

    Опис параметрів: Значення відображаються при редагуванні, але їх неможливо змінити.

    +

    Інколи бувають випадки, коли ми зберігаємо якусь інформацію про документ в його TV (наприклад, кількість переглядів або завантажувань, рейтинг і т.д.). Така інформація обновляється автоматично (будь-який сніпет/плагін просто зберігає значення в TV відповідного документу). І ось Петро раптом вирішив відредагувати текст документу: відкрив, почав писати, його відволікли по роботі, потім зателефонували, потім терміново довелося поїхати, дві години їздив, повернувся, продовжив редагувати. Весь цей час документ у нього був відкритий, дані про кількість завантажень вже 100 разів встигли змінитися (було 3, а стало 33), але у Петра до цього часу відображається 3. Петро закінчив свою роботу, натискає «Зберегти» і… кількість завантажень перезаписується на 3! Неприємна ситуація. Що можна зробити? Варіант 1: можна зробити якусь суперсистемну групу і виставити її для тих TV, значення яких не повинно редагуватися користувачами. Непоганий варіант, але не надійний (може знайтись хтось, хто поставить собі цю групу й обов'язково щось зіпсує) і не підходить, якщо хочеться бачити ці дані при редагуванні документа. Саме для таких випадків і призначений цей віджет.

    +

    Робота віджета ділиться на 3 частини:

    +

    Перед збереженням документу (OnBeforeDocFormSave) виходять і запам'ятовуються актуальні значення необхідних полів (із бази).

    +

    Після збереження (OnDocFormSave) записуються назад.

    +

    JS робить поля візуально не редагованими.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), які необхідно зробити доступними тільки для читання.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Зробити поле TV «myVar» доступним тільки для читання для користувачів з id ролі = 2

    +
    mm_ddReadonly('myVar', '2');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_requireFields($fields, $roles, $templates)

    +

    Опис параметрів: Додає зірочку червоного кольору близько з іменем обов'язкового для заповнення поля, видає повідомлення при спробі зберігання не заповнюючи обов'язкові поля, запобігаючи збереження.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), які повинні бути обов'язковими.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Зробити обов'язковим для заповнення заголовків і дат публікації всіх документів

    +
    mm_requireFields('pagetitle,pub_date');
    +
    +
    +
    +
    +

    Встановлення необхідних значень

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_inherit($fields, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), які необхідно успадкувати.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Виставити всім новим документам заголовок як у батьківського для користувачів з id роллю = 0 або 1

    +
    mm_inherit('pagetitle', '0,1');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_default($fields, $value, $roles, $templates, $eval)

    +

    Опис параметрів: Зараз TV задаються як «tvN», де N – id TV.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), для яких необхідно встановити значення за замовчуванням.{comma separated string}
    valueЗначення за замовчуванням. Якщо в якості поля вказано «pub_date»  або «unpup_date», а значення порожнє, то виставляється поточна дата. Також значення може бути стрічкою PHP-коду, який буде виконаний при параметрі «eval» = true.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    evalЧи необхідно оброблювати значення параметру «value» як PHP-код?{bollean}false
    +
    +

    Приклад: Автоматично виставити дату скасування публікації через 4 неділі від поточної для документів з id шаблону = 4

    +
    mm_default('unpub_date', 'return date("d-m-Y H:i:s", now()+(60*60*24*28));', '', '4', true);
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddSetFieldValue($fields, $value, $roles, $templates)

    +

    Опис параметрів: Схожий на mm_default, але виставляє завжди.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Імена полів документів або TV, для яких необхідно встановити значення.{comma separated string}
    valueЗначення, яке необхідно встановити.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: У документів з шаблонами id = 1 і 3 виставити значення TV «someTv» в 'this is some' для редагування (роль з id = 2)

    +
    mm_ddSetFieldValue('someTv', 'this is some', '2', '1,3');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_synch_fields($fields, $roles, $templates)

    +

    Опис параметрів: Наприклад: щоб заголовок і пункт меню документу були однаковими, – особливо зручно, коли одне із полів приховано. Працює тільки з текстовими полями (input, textarea).

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), які необхідно синхронізувати. Необхідно задати мінімум 2 поля.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Зробити значення цих полів завжди однаковими (для всіх користувачів і документів)

    +
    mm_synch_fields('pagetitle,menutitle,longtitle');
    +
    +
    +
    +
    +

    Зміни назв і підказок

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_renameField($fields, $newlabel, $roles, $templates, $newhelp)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваниеОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу або TV, які необхідно перейменувати.{comma separated string}
    newlabel *Новий текст для відображення.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    newhelpНовий текст підказки, яка з'являється при наведенні на іконку близько з полем, або опису для TV.{string}
    +
    +

    Приклад: Перейменувати поле «заголовок» у документів з id шаблона = 3 для всіх користувачів

    +
    mm_renameField('longtitle', 'ФИО', '', '3');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_changeFieldHelp($field, $helptext, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    field *Поле документу (або TV), у якого необхідно змінити підказку.{string}
    helptext *Новий текст підказки.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Змінити підказку для поля «псевдонім» у всіх документів для користувачів з id ролі = 3

    +
    mm_changeFieldHelp('alias', 'Це останній фрагмент адреси сторінки', '3');
    +
    +
    +
    +
    +

    Дозвіл функціоналу вводу даних

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddMultipleFields($tvs, $roles, $templates, $columns, $columnsTitle, $templates, $colWidth, $splY, $splX, $imgW, $imgH, $minRow, $maxRow, $columnsData)

    +

    Опис параметрів: Значення записуються в одне через необхідні роздільники, наприклад: декілька зображень. Можливості:

    +

    Додавання до одного документу довільної кількості зображень, текстових полів, списків (з можливістю вибору значення).

    +

    Завдання декількох колонок різних типів (або однакових), наприклад: зображень і підписів до них (приклад «coloumns»).

    +

    Вивід заголовків колонок (приклад «coloumnsTitle»).

    +

    Кількість значень (рядків) може бути як фіксованим, динамічним, так і у визначених діапазонах (приклади «minRow» і «maxRow»).

    +

    Сортування (перетягування) рядків між собою.

    +

    Генерація унікального ідентифікатора кожної стрічки рядка (приклад «coloumns»).

    +

    Вивід зумовлених списків значень (приклади «coloumns» і «coloumnsData»). Увага, це зараз в беті!

    +

    Для виводу даних використовується сніпет ddGetMultipleField.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tvs *Імена TV, для яких необхідно задати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    columnsТипи колонок: +
      +
    • field – колонка типу поля;
    • +
    • text – текстова колонка;
    • +
    • textarea – колонка з багаторядковим полем;
    • +
    • richtext – колонка з HTML-редактором (TinyMCE);
    • +
    • date – колонка з датою;
    • +
    • id – прихована колонка з унікальним ідентифікатором;
    • +
    • select – список з вибором значень (см. параметр «coloumnsData»).
    • +
    +
    {comma separated string}'field'
    columnsTitleЗаголовки колонок.{comma separated string}
    colWidthШирини колонок (може бути задана одна ширина).{comma separated string}180
    splYРоздільник між стрічками рядку.{string}'||'
    splXРоздільник між колонками.{string}'::'
    imgWМаксимальна ширина прев'юшки (для зображень).{integer}300
    imgHМаксимальна висота прев'юшки (для зображень).{integer}100
    minRowМінімальна кількість рядків.{integer}0
    maxRowМаксимальна кількість рядків (0 – без ліміту).{integer}0
    columnsDataСписок можливих значень для полів у форматі json, через ||.{separated string}
    +
    +

    Приклад: Можливість додавання контактів співробітників, але не більше 5 і не менше 2, з різними розмірами колонок (для текстової tv «employees»)

    +
    mm_ddMultipleFields('employees', '', '', 'text,text,text', 'Ім'я, Телефон, Посада', '250,100,100', '||', '::', 300, 100, 2, 5);
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddSelectDocuments($tvs, $roles, $templates, $parentIds, $depth, $filter, $max, $labelMask)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tvs *Імена TV, для яких необхідно задати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    parentIds *Id батьківських документів, дочірні документи яких необхідно вибрати.{comma separated string}
    depthГлибина пошуку дочірніх документів.{integer}1
    filterУмови фільтрації документів (чимось схожий на фільтр Ditto), розділені через '&' між парами та через '=' між ключем і значенням. Наприклад: 'template=15&published=1', – отримаємо тільки опубліковані документи з id шаблону 15.{separated string}
    maxМаксимальна кількість документів, які користувач може вибрати (при == 0 – без обмежень).{integer}0
    labelMaskШаблон відображення елементу в списку вибору документів. Задається як рядок, який має плейсхолдери з полями документа (і TV). Також доступні додатковий плейсхолдер '[+title+]', в який буде підставлено значення поля «menutitle», а якщо воно не заповнене, то «pagetitle».{string}'[+title+] ([+id+])'
    +
    +

    Приклад:

    +
    mm_ddSelectDocuments();
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_widget_tags($fields, $delimiter, $source, $display_count, $roles, $templates)

    +

    Опис параметрів: Для потрібного TV автоматично формується «список» вибору зі всіма тегами, при цьому, нові теги просто вписуються через розділювач також тут) на сторінці редагування документа. +TV повинен бути текстового типу.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *TV, для яких необхідно відобразити теги.{comma separated string}
    delimiterРозділювач між тегами в полі{string}','
    sourceTV, із яких повинні братися теги для списку вибору. Це дозволяє використовувати різні поля для вводу тегів і формування списку вибору. Значення за замовчуванням береться з параметра «fields». Не використовуйте цей параметр, якщо не впевнені.{comma separated string}= fields
    display_countЧи відображати в списку вибору кількість документів, в яких використовується тег (в лапках після самого тега)?{boolean}false
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Зробити для TV «docTags» віджет тегів з відображенням кількості документів, які використовують кожен тег близько з ним у документів з id шаблона = 2 для всіх ролей

    +
    mm_widget_tags('docTags', ',', '', '1', '', '2');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_widget_colors($fields, $default, $roles, $templates)

    +

    Опис параметрів: Обраний колір зберігається в TV в hex форматі. TV повинен бути текстового типу.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *TV, для яких необхідно відобразити палітру кольорів.{comma separated string}
    defaultКолір за замовчуванням, який буде вставлятися при порожньому значенні в TV (у випадку, якщо значення за замовчуванням у TV не задано стандартними засобами MODx).{string}'#ffffff'
    rolesРоли, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Додати палітру вибору кольорів для TV «bgcolor» у документах з id шаблона = 2 для користувачів з id ролі = 1 і виставити чорний колір за замовчуванням

    +
    mm_widget_colors('bgcolor', '#000000', '1', '2');
    +
    +
    +
    +
    +

    Робота з секціями

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddCreateSection($title, $id, $tabId, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    title *Текст заголовка нової секції.{string}
    id *Унікальний id нової секції.{string}
    tabIdId вкладки, в яку буде вставлена секція. Можна указати як id одної із стандартних вкладок, так і id вкладки, створеної за допомогою mm_createTab.{string}'general'
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Створити секцію з заголовком «Категорії» в основній вкладці у всіх документах для всіх користувачів

    +
    mm_ddCreateSection('Категорії', 'mycats');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddMoveFieldsToSection($fields, $sectionId, $roles, $templates)

    +

    Опис параметрів: На жаль, неможливо перемістити наступні поля: keywords, metatags, which_editor, show_in_menu, menuindex.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документа (або TV), які необхідно перемістити.{string}
    sectionId *Id секції, в яких необхідно перемістити поля. Можна указати як id одної із стандартних секцій, так і id секції, створеної за допомогою mm_ddCreateSection.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Перемістити TV «profilePhoto» в секцію «images» для всіх користувачів і шаблонів

    +
    mm_ddMoveFieldsToSection('profilePhoto', 'images');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_hideSections($sections, $roles, $templates)

    +

    Опис параметрів: «Секції» – це такі області на сторінці редагування документа, наприклад: «Вміст ресурсу» або «Параметри (TV)».

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    $sections *Секції, які необхідно приховати.{comma separated string}
    $rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    $templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Приховати секції «Вміст ресурсу» і «Параметри (TV)» у документів з id шаблону = 3 для користувачів з id ролі = 1

    +
    mm_hideSections('content,tvs', '1', '3');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_renameSection($section, $newlabel, $roles, $templates)

    +

    Опис параметрів: «Секції» – це такі області на сторінці редагування документа, наприклад: «Вміст ресурсу» або «Параметри (TV)».

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    $section *Секція, яку необхідно перейменувати.{'content'; 'tvs'}
    $newlabel *Новий текст заголовка секції.{string}
    $rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    $templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Перейменувати секцію контенту документа для користувачів з id ролі = 2

    +
    mm_renameSection('content', 'Текстик (відображається на сторінці)', '2');
    +
    +
    +
    +
    +

    Робота з вкладками

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_createTab($name, $id, $roles, $templates, $intro, $width)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    name *Текст заголовка нової вкладки.{string}
    id *Унікальний id нової вкладки.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    introОпис нової вкладки, відображається зверху (можна використовувати HTML).{string}
    widthШирина вмісту нової вкладки, можна використовувати css значення (наприклад: '100%', '450px', 'auto').{string}680
    +
    +

    Приклад: Створити нову вкладку шириною 450px з описом у документах з id шаблона = 3 або 4

    +
    mm_createTab('SEO', 'seoTab', '', '3,4', '  Тут ви можете відредагувати все, що стосується пошукової оптимізації. ', '450');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_moveFieldsToTab($fields, $tabId, $roles, $templates)

    +

    Опис параметрів: На жаль, неможливо перемістити наступні поля: keywords, metatags, which_editor, show_in_menu, menuindex.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документа (або TV), які необхідно перемістити.{comma separated string}
    tabId *Id вкладки, в яку необхідно перемістити поля. Можна вказати як id одної із стандартних вкладок, так і id вкладки, створеної за допомогою mm_createTab.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Перемістити дату публікації документа в основну вкладку для користувачів з id ролі = 2

    +
    mm_moveFieldsToTab('pub_date', 'general', '2');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_hideTabs($tabs, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tabs *Id вкладок, які необхідно приховати.{'general'; 'settings'; 'access'}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Приховати вкладку «Права доступу» у документів з id шаблона = 3 для користувачів з id ролі = 1

    +
    mm_hideTabs('access', '1', '3');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_renameTab($tab, $newlabel, $roles, $templates)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tab *Id вкладки, яку необхідно перейменувати.{'general'; 'settings'; 'access'}
    newlabel *Новий текст заголовка вкладки.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Перейменувати вкладку «Спільні» для користувачів з id ролі = 2

    +
    mm_renameTab('general', 'Основні', '2');
    +
    +
    +
    +
    +

    Карти

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddGMap($tvs, $roles, $templates, $w, $h, $hideField)

    +

    Опис параметрів: Початкова позиція карти задається дуже просто: достатньо вказати необхідні координати в якості «значення за замовчуванням» відповідно TV.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tvs *Імена TV, для яких необхідно застосувати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    wШирина контейнера з картою.{'auto'; integer}'auto'
    hВисота контейнера з картою.{integer}400
    hideFieldЧи необхідно приховувати оригінальне текстове поле з координатами.{0; 1}1
    +
    +

    Приклад: Підключення віджету Google Maps для TV «LatLng»

    +
    mm_ddGMap('LatLng');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddYMap($tvs, $roles, $templates, $w, $h, $hideField)

    +

    Опис параметрів: Для простого виводу карти на сторінку використовуйте сніпет ddYMap. Початкова позиція карти задається дуже просто: достатньо вказати необхідні координати в якості «значення за замовчуванням» відповідно TV.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tvs *Імена TV, для яких необхідно задати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    wШирина контейнера з картою.{'auto'; integer}'auto'
    hВисота контейнера з картою.{integer}400
    hideFieldЧи необхідно приховувати оригінальне текстове поле з координатами.{0; 1}1
    +
    +

    Приклад: Підключення віджету Yandex Maps для TV «LngLat»

    +
    mm_ddYMap('LngLat');
    +
    +
    +
    +
    +

    Інше

    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_widget_showimagetvs($fields, $maxWidth, $maxHeight, $thumbnailerUrl, $roles, $templates)

    +

    Опис параметрів: Аналогічний плагіну ShowImageTVs, який не сумісний з ManagerManager.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fieldsTV, для яких необхідно відобразити прев'юшки.{comma separated string}
    maxWidthМаксимальна ширина прев'юшки в px.{integer}300
    maxHeightМаксимальна висота прев'юшки в px.{integer}100
    thumbnailerUrlЯкщо у вас встановлений PHPThumb, ви можете вказати url, де він знаходиться, адрес прев'ю буде обернений до нього з передачею url вихідної картинки, ширини й висоти.{string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    +
    +

    Приклад: Показати прев'ю для TV «mypic» у документів з id шаблона = 2 і відправити й на генерацію в phpThumb для отримання прев'юшок розміром 300×200 px

    +
    mm_widget_showimagetvs('mypic', '300', '200', '/assets/snippets/phpthumb/phpThumb.php', '', '2');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddResizeImage($tvs, $roles, $templates, $width, $height, $cropping, $suffix, $replaceFieldVal, $background, $multipleField, $colNum, $splY, $splX, $num, $allowEnlargement)

    +

    Опис параметрів: Віджет спрацьовує тільки в момент збереження документів (подія «OnBeforeDocFormSave») і не створює зображень повторно, що забезпечує мінімальний розхід ресурсів сервера.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    tvs *Імена TV з зображеннями, для яких необхідно застосувати віджет.{comma separated string}
    rolesРолі, для яких необхідно задати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно задати віджет, порожнє значення – всі шаблони.{comma separated string}
    width *Ширина створеного зображення в px. Порожнє значення – автоматичний розрахунок виходячи з висоти. Обов'язковий хоча б один розмір.{integer}
    height *Висота створеного зображення в px. Порожнє значення – автоматичний розрахунок виходячи з висоти. Обов'язковий хоча б один розмір.{integer}
    croppingЧи обрізати зображення, намагаючись добити відповідність розмірам. +
      +
    • 0 – не обрізати;
    • +
    • 1 – просто обрізати (не змінюючи масштаб);
    • +
    • 'crop_resized' – спочатку зменшити, потім обрізати;
    • +
    • 'fill_resized' – пропорційно зменшити, заповнюючи утворені поля кольором («background»).
    • +
    +
    {0; 1; 'crop_resized'; 'fill_resized'}'crop_resized'
    suffixСуфікс для імен створених зображень. При порожньому значенні змінюються вихідні зображення!{string}'_ddthumb'
    replaceFieldValЧи потрібно переписувати значення в TV на імена створених зображень (ті, що з урахуванням «suffix»). Не працює при multipleField = 1!{0; 1}0
    backgroundКолір фону (використовується при cropping = 'fill_resized').{string}'#FFFFFF'
    multipleFieldЧи являється поле множинним (для mm_ddMultipleFields).{0; 1}0
    colNumНомер колонки, в якій знаходиться зображення (для mm_ddMultipleFields).{integer}0
    splYРозділювач рядків (для mm_ddMultipleFields).{string}'||'
    splXРозділювач колонок (для mm_ddMultipleFields).{string}'::'
    numНомер рядка, який потрібно оброблювати (для mm_ddMultipleFields).{integer; 'all'}'all'
    allowEnlargementДозволити збільшення зображень?{0; 1}1
    +
    +

    Приклад: Створити для зображень, виставлених в TV «imageTV», зменшені копії, перезаписуючи значення в TV

    +
    mm_ddResizeImage('imageTV', '', '', 200, 100, 'crop_resized', '_ddthumb', 1);
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddAutoFolders($roles, $templates, $yearsParents, $dateSource, $yearFields, $monthFields, $yearPublished, $monthPublished, $numericMonth)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    rolesРолі, для яких необхідно застосувати віджет, порожнє значення – всі ролі.{comma separated string}
    templates *Id шаблонів, для яких необхідно застосувати віджет.{comma separated string}
    yearsParents *ID первинних батьківських (безпосередньо батьківських документів).{comma separated string}
    dateSourceПоле документа, із якого необхідно брати дату.{string}'pub_date'
    yearFieldsПоля документів (і TV), які необхідно виставити документам-рокам. Асоціативний масив в JSON, де ключ – ім'я поля, значення – значення.{string: JSON}'{"template":0,"published":0}'
    monthFieldsПоля документів (і TV), які необхідно виставити документам-місяцям. Асоціативний масив в JSON, де ключ – ім'я поля, значення – значення.{string: JSON}'{"template":0,"published":0}'
    yearPublishedУвага! Застарілий параметр, використовуйте «$yearFields». Чи потрібно публікувати документи-роки?{0; 1}
    monthPublishedУвага! Застарілий параметр, використовуйте «$monthFields». Чи потрібно публікувати документи-місяці?{0; 1}
    numericMonthЧи потрібно документам-місяцям робити псевдоніми у вигляді порядкового номера з ведучим нулем (наприклад: «03»).{boolean}false
    +
    +

    Приклад:

    +
    mm_ddAutoFolders();
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddFillMenuindex($parent)

    +

    Опис параметрів: За замовчуванням позиція меню в MODx для нових документів просто рівна кількості дочірніх документів на одному рівні, що не завжди зручно.

    +
    + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    parentID документа, для дочірніх документів якого повинен застосовуватися віджет. Якщо залишити порожнім (не вказувати), то віджет буде застосований абсолютно до всіх документів.{integer; ''}
    +
    +

    Приклад:

    +
    mm_ddFillMenuindex();
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_widget_accessdenied($ids, $default, $roles)

    +

    Опис параметрів: Наприклад, в батьківському документі викликається сніпет «Ditto», і ви не хочете, щоб користувачі редагували цей документ, але хочете, щоб користувачі могли створювати та редагувати дочірні документи.

    +

    Використовуйте цей віджет з обережністю, тому що він не забезпечує такого захисту, як встановлена система прав MODx. Користувач, який володіє технічними знаннями може обійти цей захист через інструменти для розробки в браузері.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    ids *Список документів, до яких необхідно заборонити доступ.{comma separated string}
    defaultПовідомлення про заборону доступу (дозволений HTML).{string}'Access denied - Access to current document closed for security reasons.'
    rolesРолі, для яких необхідно застосувати віджет, порожні значення – всі ролі.{comma separated string}
    +
    +

    Приклад: Заборонити доступ до документів з id = 1 і 15 користувачам з id ролі = 2 і відобразити вихідне повідомлення про заборону доступу

    +
    mm_widget_accessdenied('1,15', 'Цей документ заборонено редагувати. Давай, до побачення!' '2');
    +
    +
    +
    +
    + +
    +
    +

    +

    Синтаксис: mm_ddHTMLCleaner($fields, $roles, $templates, $validAttrsForAllTags, $validStyles, $validAttrs)

    +

    Опис параметрів:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    fields *Поля документу (або TV), для яких необхідно застосувати віджет.{comma separated string}
    rolesРолі, для яких необхідно застосувати віджет, порожнє значення – всі ролі.{comma separated string}
    templatesId шаблонів, для яких необхідно застосувати віджет, порожнє значення – всі шаблони.{comma separated string}
    validAttrsForAllTagsРозширені атрибути для всіх тегів (атрибути, які не потрібно видаляти, решта видаляються).{comma separated string}'title,class'
    validStylesДозволені стилі для всіх тегів (стилі, які не потрібно видаляти із атрибута «style»).{comma separated string}'word-spacing'
    validAttrsДозволені атрибути для тегів (вони не будуть видалятися). Як ключ використовується ім'я тега, як значення – дозволені атрибути (рядок, розділений через кому).{string: JSON}'{"img":"src,alt,width,height","a":"href,target"}'
    +
    +

    Приклад:

    +
    mm_ddHTMLCleaner();
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..b0cacdb1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,26 @@ + + +

    ManagerManager: Встановлення

    +Встановлення плагіну ManagerManager для налаштування зовнішнього вигляду ресурсу в бекенд сайту. +
    +

    Нова установка

    Даний плагін вже входить в інсталяційний комплект MODx Evolution, тому, перед тим як його встановлювати, перевірте його наявність і версію в Елементи >> Керування елементами >> Плагіни.

    +

    1. Завантажте останню версію ManagerManager

    +

    2. Розархівуйте завантажений файл.

    +

    3. В панелі управління сайтом створіть новий плагін «ManagerManager», вставте вміст із файлу plugin.txt.

    +

    4. У вкладці "Системні події" відмітьте події:

    +
      +
    • OnDocFormRender
    • +
    • OnDocFormPrerender
    • +
    • OnBeforeDocFormSave
    • +
    • OnDocFormSave
    • +
    • OnDocDuplicate
    • +
    • OnPluginFormRender
    • +
    • OnTVFormRender
    • +
    +

    5. У вкладці "Конфігурації" вставте нижченаведений код в поле "Конфігурація плагіну:", і натисніть "Оновити параметри":

    +
    &remove_deprecated_tv_types_pref=Remove deprecated TV types;list;yes,no;yes &config_chunk=Configuration Chunk;text;
    +

    6. Скопіюйте всі файли із архіву (крім plugin.txt) на сайт (необхідна структура папок і файлів дотримана в архіві, файли плагіну повинні виявитися в /assets/plugins/managermanager)

    +

    7. Якщо ви хочете редагувати правила в панелі керування сайтом, створіть чанк «mm_rules» (або з будь-яким іншим іменем) і вкажіть його у параметрі плагіну «Configuration Chunk» (у вкладці «Конфігурація»). Якщо ви хочете редагувати правила в файлі, редагуйте файл /assets/plugins/managermanager/mm_rules.inc.php. Увага, параметр плагіну «Configuration Chunk» повинен бути порожнім.

    +

    Увага, необхідно відключити плагін «ShowImageTVs» (якщо він є у вас) і використовувати замість нього віджет mm_widget_showimagetvs

    +

    Оновлення

    Видаліть всі файли із папки /assets/plugins/managermanager/ й сам плагін ManagerManager, потім встановіть заново, дотримуючись вищеописаних інструкцій.

    +

    Віджет

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

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..21a35bd7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,35 @@ + + +

    ManagerManager: Приклади

    +Приклади плагіну ManagerManager для налаштування зовнішнього вигляду ресурсу в бекенд сайту. +
    +

    За допомогою ManagerManager ви можете змінювати зовнішній вигляд сторінки редагування ресурсу. Ви можете змінювати заголовки параметрів ресурсу, додавати нові вкладки, приховані секції та багато іншого. Також ви можете розширяти можливості ManagerManager додаючи свої віджети. ManagerManager працює виконуючи правила, які задаються до визначених областей сторінки редагування ресурсу. Кожне правило може бути застосоване до певної ролі, визначеному шаблону або їхньої будь-якої комбінації.

    +

    Для перейменування параметру "Заголовок ресурсу" для всіх шаблонів і всіх користувачів, ви можете використовувати:

    +
    mm_renameField('pagetitle', 'Новий текст заголовка');
    +

    просто помістіть це правило в чанк mm_demo_rules (або інший чанк, вказаний в конфігурації плагіну).

    +

    Ви можете задавати правило для користувачів з конкретною роллю, вказав третій параметр, який є ідентифікатором однієї або декількох ролей користувачів. Ідентифікатор ролі ви можете знайти на вкладці "Ролі".

    +

    Щоб задати наведене вище правило тільки до ролі з ідентифікатором "1", ви повинні написати:

    +
    mm_renameField('pagetitle', 'Новий текст заголовка', '1');
    +

    Ви можете додати декілька ролей, через кому:

    +
    mm_renameField('pagetitle', 'Новий текст заголовка', '1,3,5');
    +

    Якщо ви хочете зробити правило "для всіх крім", то ви повинні поставити перед списком ролей знак оклику "!". Наприклад, щоб задати правило для всіх, крім адміністраторів (ідентифікатор ролі адміністратора "1"), ви повинні написати:

    +
    mm_renameField('pagetitle', 'Новий текст заголовка', '!1');
    +

    Примітка: виняток застосовується до всіх ролей.

    +
    mm_renameField('pagetitle', 'Новий текст заголовка', '!2,3');
    +

    Додайте правило до користувачів, які не входять в ролі з ідентифікаторами 2 або 3.

    +

    Нарешті, якщо ви залишите параметр з ідентифікаторами ролей порожнім, або пропустіть його, правило буде застосовуватися до всіх ролей.

    +

    Можна уточнювати правила, обмежуючи їх застосування для шаблонів з визначеним ідентифікатором. Наприклад:

    +
    mm_renameField('pagetitle', 'Новий текст заголовка', '', '3');
    +

    Додасть правило тільки до ресурсів, які використовують шаблон з ідентифікатором "3".

    +
    mm_renameField('pagetitle', 'Новий текст заголовка', '!1', '3');
    +

    Додасть правило до користувачів, які не належать до ролі з ідентифікатором "1", коли вони редагують ресурс, який використовує шаблон з ідентифікатором "3".

    +

    Ви можете використовувати змінні PHP. Наприклад, для збереження ідентифікаторів шаблону і ролі.

    +
    $news_role = '3';
    +$news_tpl = '10';
    +mm_createTab('SEO','seoTab', '', $news_tpl, '', '600');
    +mm_renameField('longtitle','Заголовок статті', $news_role, $news_tpl, 'Це заголовок статті');
    +

    Ви можете застосувати правило до ресурсів з визначеним ідентифікатором.

    +
    // приховає поле ресурсу, якщо батьківський ідентифікатор цього ресурсу "28".
    +if($content['parent'] == 28){
    +	mm_hideFields('tvname','2');
    +}
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/06_\320\224\320\276\320\264\320\260\321\202\320\272\320\276\320\262\320\276.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/06_\320\224\320\276\320\264\320\260\321\202\320\272\320\276\320\262\320\276.md" new file mode 100644 index 00000000..55119032 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/06_\320\224\320\276\320\264\320\260\321\202\320\272\320\276\320\262\320\276.md" @@ -0,0 +1,376 @@ + + +

    ManagerManager: Додатково

    +Доповнення плагіну ManagerManager для налаштування зовнішнього вигляду ресурсу в бекенд сайту. +
    +

    Модуль ddMMEditor

    +

    Модуль для зручного редагування файлу конфігурації плагіну ManagerManager.

    +

    Можливості:

    +
      +
    • візуальне створення правил для MM;
    • +
    • застосування правил для необхідних шаблонів і ролей у два кліка;
    • +
    • autocomplete зі всіма іменами полів і TV;
    • +
    • об'єднання правил в групи по змісту (групи можна називати довільними іменами);
    • +
    • згортання-розгортання груп для зручного перегляду в спільному вигляді;
    • +
    • drag'n'drop правил і груп між собою;
    • +
    • можливість «ручної» вставки довільного коду в початок і кінець конфігураційного файлу.
    • +
    +

    Установка

    +

    Вміст файлу module.php повинен бути скопійований в поле «Код модулів» в меню створення нового модуля. Решта файлів повинні знаходитись в assets/modules/ddmmeditor/... (в архіві вже створена потрібна структура папок). Модуль змінює файл assets/plugins/managermanager/mm_rules.inc.php плагіна ManagerManager.

    +

    Увага! Щоб ManagerManager використовував правила, створення модулів, параметр «Configuration Chunk» в конфігурації плагіну (вкладка «Конфігурація») повинен бути порожнім.

    +

    Сніпет ddGetMultipleField

    +

    Сніпет для виводу даних, розділених через визначені роздільники. Зручно використовувати для виклику значень полів документів, сформованих віджетом mm_ddMultipleFields. Можливості:

    +
      +
    • Отримання необхідного поля документу (і TV) по id. Параметри «docField» і «docId».
    • +
    • Вивід необхідної кількості значень за номерами рядків і за значенням. Параметри «startRow», «totalRows» і «filter».
    • +
    • Вивід необхідних значень за номерами колонок. Параметр «columns».
    • +
    • Сортування рядків за значенням колонок перед виводом ('ASC', 'DESC', 'RAND', 'REVERSE'), в тому числі і множинне сортування. Параметри «sortDir» і «sortBy».
    • +
    • Вивід значень через розділювач рядків і колонок. Параметри «rowGlue» і «colGlue».
    • +
    • Видалення порожніх значень колонок і рядків перед виводом. Параметри «removeEmptyRows» і «removeEmptyCols».
    • +
    • Типографування значень перед виводом (використовується сніпет ddTypograph). Приклад «typography».
    • +
    • URL-кодування результату перед виводом. Параметр «urlencode».
    • +
    • Вивід результату в JSON. Приклад «outputFormat».
    • +
    • Вивід значень за шаблонами (чанкам) рядків і колонок (в шаблоні рядків також доступний плейсхолдер [+rowNumber+] з номером рядку). Параметри «rowTpl» і «colTpl».
    • +
    • Вивід результату виконання в чанк «outerTpl» з передачею додаткових даних через параметр «placeholders»
    • +
    +

    Увага! З пар параметрів «string»/«docField» необхідно передавати лише один.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    string *Вихідна стрічка рядка, яка має значення з розділювачами.{separated string}
    docFieldІм'я поля документу / TV, що містить значення.В такому випадку параметр «string» ігнорується, значення виходить з поля документу.{string}
    docIdID документу, значення поля якого потрібно отримати. Якщо id не заданий, береться id поточного документа.{integer}
    rowDelimiterРозділювач між рядками у вихідній стрічці рядку.{string; regexp}'||'
    colDelimiterРозділювач між колонками у вихідній стрічці рядку.{string; regexp}'::'
    startRowНомер рядка, починаючи з якого необхідно повернути (нумерація рядків починається з 0).{integer}0
    totalRowsКількість рядків, що повертаються. При значенні == 'all' будуть повернені всі наявні рядки.{integer; 'all'}'all'
    columnsНомери колонок через кому, які необхідно повернути (нумерація колонок починається з 0). При значенні == 'all' будуть повернуті всі колонки.{comma separated string; 'all'}'all'
    filterФільтр за значенням колонок. Наприклад, при '0::a||0::b||1::1' виводяться тільки рядки, в яких значення колонки 0 рівне 'a' або 'b' і значення колонки 1 рівне '1'.{separated string}
    removeEmptyRowsВидаляти порожні рядки?{0; 1}1
    removeEmptyColsВидаляти порожні колонки?{0; 1}1
    sortByНомер колонки (нумеруються з нуля), по якій необхідно сортувати. Для множинного сортування параметри вказуються через кому (наприклад: '0,1').{comma separated string}0
    sortDirНаправлення сортування рядків. При значенні == 'REVERSE' рядку будуть повернуті в зворотному порядку.{'ASC'; 'DESC'; 'RAND'; 'REVERSE'; ''}
    typographyНомери колонок через кому, значення яких потрібно типографувати (рядки нумеруються з 0). Якщо не задано, нічого не типографуються.{comma separated string}
    outputFormatФормат, в якому повертають результат.{'html'; 'JSON'; 'array'; 'htmlarray'}'html'
    rowGlueРозділювач (об'єднувач) між рядками при виведенні. Може використовуватись спільно з шаблоном «rowTpl».{string}
    colGlueРозділювач (об'єднувач) між колонками при виведенні. Може використовуватись спільно з шаблоном «colTpl» (але не «rowTpl», зі зрозумілих причин).{string}
    rowTplШаблон для виводу рядків (приклад «outputFormat» повинен бути == 'html'). Допустимі плейсхолдери: [+rowNumber+] (номер рядку, починаючи з 1), [+total+] (загальна кількість рядків), [+resultTotal+] (кількість рядків, що повертаються), [+col0+], [+col1+], … (значення відповідних колонок).{string: chunkName}
    colTplСписок шаблонів для виводу колонок, через кому (параметр «outputFormat» повинен бути == 'html'). Якщо шаблонів менше, ніж колонок, для всіх відсутніх виставляється останній вказаний шаблон. Значення 'null' – без шаблону. Доступний плейсхолдер: [+val+].{comma separated string: chunkName; 'null'}
    outerTplШаблон зовнішньої обгортки (при «outputFormat» != 'array'). Доступні плейсхолдери: [+result+], [+total+] (загальна кількість рядків), [+resultTotal+] (кількість рядків, що повертаються), [+rowY.colX+] (де «Y» – номер рядку, «X» – номер колонки).{string: chunkName}
    placeholdersДодаткові дані, які необхідно передати в шаблон «outerTpl». Формат: рядок, розділений '::' між парою ключ-значення і '||' між парами.{separated string}
    urlencodeПотрібно URL-кодувати результативний рядок (при «outputFormat» != 'array')? Рядок кодується згідно з RFC 3986.{0; 1}0
    totalRowsToPlaceholderІм'я зовнішнього плейсхолдера, в який потрібно вивести загальну кількість. Якщо параметр не заданий – не виводиться.{string}
    resultToPlaceholderІм'я зовнішнього плейсхолдера, в який потрібно зберігати результати робіт сніпета замість звичайного виводу. Якщо параметр не заданий – сніпет просто повертає результат.{string}
    +
    + +

    Приклади

    +

    Вивід зображень с описом

    +

    Вихідна стрічка рядку (шлях знаходиться в TV документа «images»):

    +
    /assets/images/some_img1.jpg::Зображення 1||/assets/images/some_img2.jpg::Зображення 2
    +

    Виклик сніпета в шаблоні документа:

    +
    [[ddGetMultipleField?
    +&string=`[*images*]`
    +&rowTpl=`imgRow`
    +]]
    +

    Код чанка «imgRow»:

    +
    [+col1+]:
    +<img src="[+col0+]" alt="[+col1+]" />
    +

    Отримання і вивід даних з поля (TV) «prices» документа з id = 25 в вигляді таблиці, якщо щось є, якщо нічого немає

    +

    Вихідні значення поля:

    +
    Яблука смачні::100::кг||Цвяхи звичайні::5 000::центнер||Коти::865::шт
    +

    Виклик сніпета (де зручно):

    +
    [[ddGetMultipleField?
    +&docField=`prices`
    +&docId=`25`
    +&rowTpl=`pricesRow`
    +&outerTpl=`pricesWrap`
    +]]
    +

    Код чанка «pricesRow»:

    +
    <tr>
    +	<td>[+rowNumber+]</td>
    +	<td>[+col0+]</td>
    +	<td>[+col1+] руб./[+val2+]</td>
    +</tr>
    +

    Код чанка «pricesWrap»:

    +
    <h1>Таблиця цін </h1>
    +<table>
    +	[+result+]
    +</table>
    +

    Вивід тегів документа через кому з використовуванням регулярного вираження в «rowDelimiter»

    +

    Шлях тегів документу у нас зберігаються в TV «tags» і до цього TV у нас заданий віджет mm_widget_tags. Користувач заповняє теги через кому, при цьому, може заповнюватися як з пробілами по краях, так і без них.

    +

    Значення TV «tags»:

    +
    Коти, Кішки, Собаки, Ведмеді, Слони
    +

    Виклик сніпета в шаблоні документа:

    +
    [[ddGetMultipleField?
    +&string=`[*tags*]`
    +&rowDelimiter=`/\s*,\s*/`
    +&rowGlue=`, `
    +&rowTpl=`tagsRow`
    +]]
    +

    Код чанка «tagsRow»:

    +
    <a href="[~[*parent*]~]?tags=[+col0+]">[+col0+]</a>
    +

    Результат:

    +
    <a href="[~[*parent*]~]?tags=Коти">Коти</a>,
    +<a href="[~[*parent*]~]?tags=Кішки">Кішки</a>,
    +<a href="[~[*parent*]~]?tags=Собаки">Собаки</a>,
    +<a href="[~[*parent*]~]?tags=Ведмеді">Ведмеді</a>,
    +<a href="[~[*parent*]~]?tags=Слони">Слони</a>
    + +

    Сніпет ddTypograph

    +

    Сніпет типографується текст. Не використовує сторонніх сервісів, не відправляє ніяких запитів, все здійснюється на вашому сервері.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    text *Текст, який потрібно типографувати.{string}
    optAlignОптичні вирівнювання (висяча пунктуація).{0; 1}0
    text_paragraphsПростановка параграфів і переносів рядків.{0; 1}0
    text_autoLinksВиділення силки з тексту (в тому числі email).{0; 1}0
    etc_unicodeConvertПеретворювати html-суті в юнікод (– замість &mdash; і т.д.).{0; 1}1
    noTagsНе додавати теги. Бувають ситуації, коли використовування HTML-тегів в тексті недопустимо (наприклад, коли текст виводиться в значення атрибуту тега), для таких випадків і призначений цей параметр.{0; 1}0
    +
    + +

    Приклади

    +

    Типографування анотації перед виводом

    +
    [[ddTypograph? &text=`[*introtext*]`]]
    +

    Типографування анотації з автоматичним розставленням абзаців, силок і адрес email

    +
    [[ddTypograph? &text=`[*introtext*]` &text_paragraphs=`1` &text_autoLinks=`1`]]
    +

    Типографування анотації з автоматичним оптичним вирівнюванням (висячі лапки і пр.)

    +
    [[ddTypograph? &text=`[*introtext*]` &optAlign=`1`]]
    + +

    Сніпет ddYMap

    +

    Сніпет для виводу на сторінку Яндекс. Карт у звичайному вигляді.

    +

    Зручно використовувати спільно з віджетом mm_ddYMap.

    +

    Увага! На сторінці вже повинен бути підключений jQuery.

    +

    З пари параметрів «geoPos» / «docField» необхідно передавати лише один.

    +

    Сніпет можна викликати в будь-якому місці сторінки, місце його виклику не має значення.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    geoPos *Координати на карті (широти і довготи, перечислені через кому).{comma separated string}
    docFieldІм'я поля документа, що має координати, значення якого необхідно отримати.{string}
    docIdID документа, значення поля якого потрібно отримати.{integer}Поточний документ
    mapElementСелектор контейнера, де буде знаходитись карта.{string}'#map'
    defaultTypeТип карти за замовчуванням: 'map' – схема, 'satellite' – супутник, 'hybrid' – гібрид, 'publicMap' – народна карта, 'publicMapHybrid' – народний гібрид.{'map'; 'satellite'; 'hybrid'; 'publicMap'; 'publicMapHybrid'}'map'
    defaultZoomМасштаб карти за замовчуванням.{integer}15
    iconЗображення іконки для мітки на карті.{string}без іконки (використовується стандартна)
    iconOffsetЗміщення іконки в пікселях відносно базового положення, задається в вигляді пар чисел, розділених комою (x, y). Базові положення: іконка розташовується горизонтально по центру точки (geoPos), вертикально – над точкою.{comma separated string}
    scrollZoomЧи розширено зміни масштабу карти колесом миші?{0; 1}0
    mapCenterOffsetЗміщення центру карти відносно центру контейнера в пікселях.{comma separated string}
    +
    +

    Приклади

    +
    [[ddYMap? &geoPos=`55.177446326764496,61.29041790962219`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/index.md" new file mode 100644 index 00000000..757be8d3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ManagerManager/index.md" @@ -0,0 +1,4 @@ + + +

    ManagerManager Налаштування зовнішнього вигляду панелі керування сайтом

    +ManagerManager дозволяє налаштовувати зовнішній вигляд сторінки створення, редагування ресурсу в бекенді сайту. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..aa8358cd --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,6 @@ + + +

    MaxiGallery: Особливості

    +Особливості сніпета MaxiGallery для організації галереї на MODX Evolution. +
    +

    Сніпет MaxiGallery один з найпопулярніших сніпетів, для організації галереї на сайті під керуванням MODx Evolution. Цей сніпет достатньо простий у використанні та легко встановлюється. Велика кількість параметрів і можливість використовувати з шаблонів, дозволяє налаштовувати галерею практично під будь-які потреби. Підтримується декілька типів галерей, в тому числі з застосуванням Ajax. Сніпет автоматично створю ескізи заданих розмірів і копіює їх в папку з id галереї. Є можливість накладання водяних знаків і ряд інших ефектів. Керування галереєю (додавання фотографій, сортування і т.д.) здійснюється через front-end.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..2a88afd2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,2039 @@ + + +

    MaxiGallery: Параметри

    +Параметри сніпета MaxiGallery для організації галереї на MODX Evolution. +
    +
    +
    + +
    +
    + Формат: Розділені комою назви груп вебкористувачів
    + Значення за замовчуванням: не
    + Примітка: Розділені комою назви груп вебкористувачів
    + Приклад: +
    &admin_webgroups=`manager`
    +
    +
    +
    + +
    + +
    +
    + Формат: Розділені комою назви груп веб-користувачів
    + Значення за замовчуванням: не
    + Примітка: Розділені комою назви груп вебкористувачів
    + Приклад: +
    &admin_webusers=``
    +
    +
    +
    + +
    + +
    +
    + Формат: slidebox | lightboxv2 | popup | external
    + Значення за замовчуванням: external
    + Примітка:
    + Приклад: +
    &big_img_linkstyle=`popup`
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка: Повинна бути такого ж кольору що і задній фон.
    + Приклад: +
    &big_mask_bgcolor=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets/ maxigallery/ imagemask/ demomask–frame2.png
    + Примітка: Шлях до зображень яких ви хотіли б використовувати як imagemask для великих зображень (Зображення - водяной знак).
    + Приклад: +
    &big_mask_img=``
    +
    +
    +
    + +
    + +
    +
    + Формат: top | topleft | topright | left | center | right | bottom | bottomleft | bottomright | resize
    + Значення за замовчуванням: resize
    + Примітка: Розміщення зображення - водяний знак для великих картинок. + Опція resize змінює розмір imagemask до розміру зображення.
    + Приклад: +
    &big_mask_position =`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка: Повинно бути так, як і колір фону сторінки.
    + Приклад: +
    &big_shadow_bgcolor=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/dropshadow/
    + Примітка:
    + Приклад: +
    &big_shadow_path=``
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &big_use_dropshadow=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &big_use_imagemask=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &big_use_watermark =`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 1 | 2 | 3 | 4 | 5
    + Значення за замовчуванням 5
    + Примітка:
    + Приклад: +
    &big_watermark_font=`3`
    +
    +
    +
    + +
    + +
    +
    + Формат: left | center | right
    + Значення за замовчуванням: right
    + Примітка:
    + Приклад: +
    &big_watermark_halign=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets/ maxigallery/watermark/ watermark.png
    + Примітка: Зображення може бути прозорим PNG.
    + Приклад: +
    &big_watermark_img=``
    +
    +
    +
    + +
    + +
    +
    + Формат: текст
    + Значення за замовчуванням: Copyright <YEAR> <SITENAME>
    + Примітка:
    + Приклад: +
    &big_watermark_txt =``
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка:
    + Приклад: +
    &big_watermark_txt_color=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 15
    + Примітка:
    + Приклад: +
    &big_watermark_txt_hmargin=`25`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 15
    + Примітка:
    + Приклад: +
    &big_watermark_txt_vmargin=`25`
    +
    +
    +
    + +
    + +
    +
    + Формат: text | image
    + Значення за замовчуванням: text
    + Примітка:
    + Приклад: +
    &big_watermark_type=`image`
    +
    +
    +
    + +
    + +
    +
    + Формат: top | center | bottom
    + Значення за замовчуванням: bottom
    + Примітка:
    + Приклад: +
    &big_watermark_valign=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документів, через кому | all
    + Значення за замовчуванням Поточний документ
    + Примітка:
    Розділений комами список ID для пошуку галерей в них.
    + "all" відображати всі галереї. +
    + Приклад: +
    &childgalleries_ids=`all`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: Нуль - всі рівні.
    + Приклад: +
    &childgalleries_level_limit=`3`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: Значення 0 служить для виводу всіх дочірніх галерей.
    + Приклад: +
    &childgalleries_limit=`10`
    +
    +
    +
    + +
    + +
    +
    + Формат: поле документа
    + Значення за замовчуванням: menuindex
    + Примітка:
    + Приклад: +
    &childgalleries_order_by =`pagetitle`
    +
    +
    +
    + +
    + +
    +
    + Формат: ASC | DESC
    + Значення за замовчуванням: ASC
    + Примітка:
    + Приклад: +
    &childgalleries_order_direction=`DESC`
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | рядок
    + Значення за замовчуванням: @FILE:assets/snippets /maxigallery/templates /childgallerytpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string> +
    + Приклад: +
    &childgalleryTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | рядок
    + Значення за замовчуванням: @FILE:assets/snippets /maxigallery/templates /clearertpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &clearerTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | рядок
    + Значення за замовчуванням: assets/snippets/maxigallery/ css/default.css
    + Примітка:
    + Приклад: +
    &css=`MaxigalleryCss`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: функція до кінця не реалізована
    + Приклад: +
    &debug=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: Використовується коли MooTools, Prototype або Scriptaculous javascript бібліотеки викликані в заголовку шаблона сайту і ви хочете, щоб MaxiGallery не завантажував свої копії цих бібліотек.
    + Приклад: +
    &disable_js_libs=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &disable_rightclick=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: normal | embedded | childgalleries | pictureview
    + Значення за замовчуванням: normal
    + Примітка:
    + Приклад: +
    &display=`pictureview`
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | рядок
    + Значення за замовчуванням: @FILE:assets/snippets /maxigallery/templates /draggabletpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string> +
    + Приклад: +
    &draggableTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: slidebox | lightboxv2 | slimbox | smoothgallery | popup | external
    + Значення за замовчуванням: нет
    + Примітка: Якщо в display вказаний параметр "embedded", цим параметром можна регулювати ефекти. "External" відкриває картинку на іншій сторінці.
    + Приклад: +
    &embedtype=`external`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: /
    + Примітка: Наприклад, якщо корневий каталог для FTP /home/username/ і MODx встановлений в папці /home/username/public_html/modx/ то в якості значення парметра ftp_base_dir вкажіть /public_html/modx/
    + Приклад: +
    &ftp_base_dir=`/public_html/modx/`
    +
    +
    +
    + +
    + +
    +
    + Формат: пароль
    + Значення за замовчуванням: нет
    + Примітка:
    + Приклад: +
    &ftp_pass=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 21
    + Примітка:
    + Приклад: +
    &ftp_port=``
    +
    +
    +
    + +
    + +
    +
    + Формат: FTP-адрес
    + Значення за замовчуванням: нет
    + Примітка:
    + Приклад: +
    &ftp_server=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я користувача
    + Значення за замовчуванням: не
    + Примітка:
    + Приклад: +
    &ftp_user=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документів, через кому | all
    + Значення за замовчуванням: не
    + Примітка:
    Список ID документів, розділений комами +
    "all" - всі документи
    + Приклад: +
    &gal_query_ids=`all`
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /galleryoutertpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string> +
    + Приклад: +
    &galleryOuterTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /gallerypicturetpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &galleryPictureTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ряд
    + Значення за замовчуванням: maxigallery
    + Примітка: До таблиці MODx додається префікс
    + Приклад: +
    >able=``
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &is_target=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: не
    + Примітка:
    + Приклад: +
    &js=`<scripttype="text/javascript"> alert(hello);</script>`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &keep_bigimg=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 1
    + Примітка:
    + Приклад: +
    &keep_date=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: en | fi
    + Значення за замовчуванням: en
    + Примітка: Мовні файли не повністю реалізовані. Не соромтесь додати свої мови. (См. lang_en.php для прикладу.)
    + Приклад: +
    &lang=`ru`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 9999999
    + Примітка:
    + Приклад: +
    &limit=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документа
    + Значення за замовчуванням: не
    + Примітка:
    + Приклад: +
    &manage_gallery=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документа
    + Значення за замовчуванням: не
    + Примітка:
    + Приклад: +
    &manage_target=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /manageoutertpl.html
    + Примітка:
    Имя чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &manageOuterTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /managepicturetpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &managePictureTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: список веб груп користувачів через кому
    + Значення за замовчуванням:
    + Примітка:
    + Приклад: +
    &manager_webgroups=``
    +
    +
    +
    + +
    + +
    +
    + Формат: Розділений комою імена веб-користувачів
    + Значення за замовчуванням:
    + Примітка: Розділений комою імена веб-користувачів
    + Приклад: +
    &manager_webusers=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /managebuttontpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &manageButtonTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: шлях | ім'я чанка | ряд
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /manageuploadtpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &manageUploadTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px) | WidthxHeight (px) (наприклад 200x400) | 0
    + Значення за замовчуванням: 1024
    + Примітка: Розмір зображення в пікселях, або нуль для використовування оригінального розміру зображення
    + Приклад: +
    &max_big_size=`200x400`
    +
    +
    +
    + +
    + +
    +
    + Формат: число | 0
    + Значення за замовчуванням: 0
    + Примітка: 0 - необмежена кількість зображень
    + Приклад: +
    &max_pic_number=`25`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px) | WidthxHeight (px) (например 200x400) | 0
    + Значення за замовчуванням: 450
    + Примітка: 0 - оригінальний розмір зображення
    + Приклад: +
    &max_pic_size=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px) | WidthxHeight (px) (например 200x400) | 0
    + Значення за замовчуванням: 130
    + Примітка: 0 - оригінальний розмір зображення
    + Приклад: +
    &max_thumb_size=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: Кількість рядків, які потрібно пропустити
    + Приклад: +
    &offset=``
    +
    +
    +
    + +
    + +
    +
    + Формат: date, pos, filename, title, id, random
    + Значення за замовчуванням: pos,date
    + Примітка:
    date +
    pos +
    filename +
    title +
    id +
    random - випадковий порядок
    + Приклад: +
    &order_by=`random`
    +
    +
    +
    + +
    + +
    +
    + Формат: ASC | DESC
    + Значення за замовчуванням: DESC
    + Примітка:
    + Приклад: +
    &order_direction=`ASC`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я чанка | @FILE | @CODE
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /pagenumbertpl.html
    + Примітка:
    Имя чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &pageNumberTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка: Повинен бути такого ж кольору, як колір фону сторінки.
    + Приклад: +
    &pic_mask_bgcolor=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/imagemask /demomask-frame2.png
    + Примітка:
    + Приклад: +
    &pic_mask_img=``
    +
    +
    +
    + +
    + +
    +
    + Формат: top | topleft | topright | left | center | right | bottom | bottomleft | bottomright | resize
    + Значення за замовчуванням: resize
    + Примітка: Положення resize розтягує зображення маски на всю картинку.
    + Приклад: +
    &pic_mask_position=``
    +
    +
    +
    + +
    + +
    +
    + Формат: Розділений комами список ідентифаторів зображень
    + Значення за замовчуванням:
    + Примітка:
    + Приклад: +
    &pic_query_ids=``
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка: Повинен бути такого ж кольору, як і колір фону сторінки.
    + Приклад: +
    &pic_shadow_bgcolor=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/dropshadow/
    + Примітка:
    + Приклад: +
    &pic_shadow_path=``
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &pic_use_dropshadow=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &pic_use_imagemask=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &pic_use_watermark=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 1 | 2 | 3 | 4 | 5
    + Значення за замовчуванням: 3
    + Примітка:
    + Приклад: +
    &pic_watermark_font=`4`
    +
    +
    +
    + +
    + +
    +
    + Формат: left | center | right
    + Значення за замовчуванням: right
    + Примітка:
    + Приклад: +
    &pic_watermark_halign=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/watermark /watermark.png
    + Примітка:
    + Приклад: +
    &pic_watermark_img=``
    +
    +
    +
    + +
    + +
    +
    + Формат: строка
    + Значення за замовчуванням: Copyright <YEAR> <SITENAME>
    + Примітка:
    + Приклад: +
    &pic_watermark_txt=``
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка:
    + Приклад: +
    &pic_watermark_txt_color=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 10
    + Примітка:
    + Приклад: +
    &pic_watermark_txt_hmargin=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 10
    + Примітка:
    + Приклад: +
    &pic_watermark_txt_vmargin=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: text | image
    + Значення за замовчуванням: text
    + Примітка:
    image +
    text
    + Приклад: +
    &pic_watermark_type=`image`
    +
    +
    +
    + +
    + +
    +
    + Формат: top | center | bottom
    + Значення за замовчуванням: bottom
    + Примітка:
    + Приклад: +
    &pic_watermark_valign=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0
    + Примітка: 0 - не обмежено
    + Приклад: +
    &pics_per_page=`25`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 4
    + Примітка:
    + Приклад: +
    &pics_per_row=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документа
    + Значення за замовчуванням: Поточний документ
    + Примітка: Використовуйте той же виклик сніпета в цьому документі, і додайте в його виклику параметр: &is_target=`1`
    + Приклад: +
    &picture_target=`10`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я чанка | @FILE | @CODE
    + Значення за замовчуванням: @FILE:/assets/snippets /maxigallery/templates /picturetpl.html
    + Примітка:
    Ім'я чанка +
    @FILE:<path to a file> +
    @CODE:<template string>
    + Приклад: +
    &pictureTpl=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ідентифікатор фотографії
    + Значення за замовчуванням: не
    + Примітка: При &display=`pictureview`
    + Приклад: +
    &pictureview_start_id=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 1
    + Примітка: При &display=`pictureview`
    + Приклад: +
    &pictureview_start_pos=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число (%)
    + Значення за замовчуванням: 100
    + Примітка: Відсоток від 0-100 для великих зображень
    + Приклад: +
    &quality_big=`90`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (%)
    + Значення за замовчуванням: 70
    + Примітка: Відсоток від 0-100 для великих зображень
    + Приклад: +
    &quality_pic=`90`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (%)
    + Значення за замовчуванням: 70
    + Примітка: Якість у відсотках від 0-100 для ескізів.
    + Приклад: +
    &quality_thumb=`60`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 1
    + Примітка: Визначає, скільки рівнів в глибині, щоб перейти від батьківських до документів вказаних у gal_query_ids
    + Приклад: +
    &query_level_limit=`3`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: Якщо включено, будуть застосовуватися випадкові імена у завантажених фотографій.
    + Приклад: +
    &random_filenames=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: число от 0 до 1
    + Значення за замовчуванням: 0.7
    + Примітка: Де: + 0 = прозорий (не видно) і 1,0 = повністю непрозорий +
    + Приклад: +
    &smoothgallery_carouselMaximizedOpacity=`0.9`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 20
    + Примітка:
    + Приклад: +
    &smoothgallery_carouselMinimizedHeight=`25`
    +
    +
    +
    + +
    + +
    +
    + Формат: число от 0 до 1
    + Значення за замовчуванням: 0.4
    + Примітка: Де: + 0 = прозорий (не видно) і 1,0 = повністю непрозорий
    + Приклад: +
    &smoothgallery_carouselMinimizedOpacity=`0.5`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (ms)
    + Значення за замовчуванням: 9000
    + Примітка:
    + Приклад: +
    &smoothgallery_delay=`8000`
    +
    +
    +
    + +
    + +
    +
    + Формат: true | false
    + Значення за замовчуванням: true
    + Примітка: Якщо ви видаляєте цей параметр, також видаляйте силку з galleryPictureTpl
    + Приклад: +
    &smoothgallery_embedLinks=`false`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (ms)
    + Значення за замовчуванням: 500
    + Примітка:
    + Приклад: +
    &smoothgallery_fadeDuration=`1000`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: max_pic_size
    + Примітка: Переповнення будуть приховані, так що це повинно бути висотою найбільших зображень (наприклад, як і max_pic_size).
    + Приклад: +
    &smoothgallery_height=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: нет
    + Примітка: Це дозволяє мати декілька smoothgalleries на одній сторінці.
    + Приклад: +
    &smoothgallery_id=``
    +
    +
    +
    + +
    + +
    +
    + Формат: true | false
    + Значення за замовчуванням: true
    + Примітка:
    + Приклад: +
    &smoothgallery_preloader=`false`
    +
    +
    +
    + +
    + +
    +
    + Формат: true | false
    + Значення за замовчуванням: true
    + Примітка:
    + Приклад: +
    &smoothgallery_showArrows=`false`
    +
    +
    +
    + +
    + +
    +
    + Формат: true | false
    + Значення за замовчуванням: true
    + Примітка:
    + Приклад: +
    &smoothgallery_showCarousel=`false`
    +
    +
    +
    + +
    + +
    +
    + Формат: true | false
    + Значення за замовчуванням: true
    + Примітка:
    + Приклад: +
    &smoothgallery_showInfopane=`false`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 0.7
    + Примітка: 0 = прозора (не видно) і 1,0 = повністю непрозора
    + Приклад: +
    &smoothgallery_slideInfoZoneOpacity=`0.9`
    +
    +
    +
    + +
    + +
    +
    + Формат: текст
    + Значення за замовчуванням: "pictures" текст з файлу язика lang
    + Примітка:
    + Приклад: +
    &smoothgallery_textShowCarousel=``
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 75
    + Примітка:
    + Приклад: +
    &smoothgallery_thumbHeight=`90`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 10
    + Примітка:
    + Приклад: +
    &smoothgallery_thumbSpacing=`15`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 100
    + Примітка:
    + Приклад: +
    &smoothgallery_thumbWidth=`150`
    +
    +
    +
    + +
    + +
    +
    + Формат: true | false
    + Значення за замовчуванням: false
    + Примітка:
    + Приклад: +
    &smoothgallery_timed=`true`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: max_pic_size
    + Примітка: Переповнення будуть приховані, так що це повинно бути шириною найбільших зображень (наприклад, як і max_pic_size).
    + Приклад: +
    &smoothgallery_width=``
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка: Повинен бути таким як і колір фону сторінки.
    + Приклад: +
    &thumb_mask_bgcolor=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/imagemask /demomask-frame1.png
    + Примітка:
    + Приклад: +
    &thumb_mask_img=``
    +
    +
    +
    + +
    + +
    +
    + Формат: top | topleft | topright | left | center | right | bottom | bottomleft | bottomright | resize
    + Значення за замовчуванням: resize
    + Примітка: Опція resize - підтягує розмір imagemask до розміру зображення.
    + Приклад: +
    &thumb_mask_position=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка: Повинен бути такого ж кольору, як колір фону сторінки.
    + Приклад: +
    &thumb_shadow_bgcolor=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/dropshadow/
    + Примітка:
    + Приклад: +
    &thumb_shadow_path=``
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &thumb_use_dropshadow=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &thumb_use_imagemask=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &thumb_use_watermark=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 1 | 2 | 3 | 4 | 5
    + Значення за замовчуванням: 1
    + Примітка:
    + Приклад: +
    &thumb_watermark_font=`2`
    +
    +
    +
    + +
    + +
    +
    + Формат: left | center | right
    + Значення за замовчуванням: right
    + Примітка:
    + Приклад: +
    &thumb_watermark_halign=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: путь
    + Значення за замовчуванням: assets/snippets /maxigallery/watermark /watermark.png
    + Примітка:
    + Приклад: +
    &thumb_watermark_img=``
    +
    +
    +
    + +
    + +
    +
    + Формат: текст
    + Значення за замовчуванням: Copyright <YEAR>
    + Примітка:
    + Приклад: +
    &thumb_watermark_txt=``
    +
    +
    +
    + +
    + +
    +
    + Формат: RGB Hexadecimal
    + Значення за замовчуванням: FFFFFF
    + Примітка:
    + Приклад: +
    &thumb_watermark_txt_color=`000000`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 2
    + Примітка:
    + Приклад: +
    &thumb_watermark_txt_hmargin=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: число (px)
    + Значення за замовчуванням: 2
    + Примітка:
    + Приклад: +
    &thumb_watermark_txt_vmargin=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: text | image
    + Значення за замовчуванням: text
    + Примітка:
    + Приклад: +
    &thumb_watermark_type=``
    +
    +
    +
    + +
    + +
    +
    + Формат: top | center | bottom
    + Значення за замовчуванням: bottom
    + Примітка:
    + Приклад: +
    &thumb_watermark_valign=`center`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення за замовчуванням: 10
    + Примітка:
    + Приклад: +
    &upload_field_count=`15`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: Це необхідно в визначених серверних середовищах.
    + Приклад: +
    &use_ftp_commands=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документа
    + Значення за замовчуванням: не
    + Примітка:
    + Приклад: +
    &view_gallery=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..7dac8006 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/03_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,468 @@ + + +

    MaxiGallery: Плейсхолдери

    +Плейсхолдери сніпету MaxiGallery для організації +галереї на MODX Evolution. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    manageButtonTpl - - Шаблон для клавіші керування фотографіями.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/managebuttontpl.html
    [+maxigallery.urlaction+]URL для обробки форми
    [+maxigallery.hiddenfields+]Приховані поля форми
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.config.parameter+]Значення параметру сніпету. "parameter" - будь-який з параметрів сніпета.
    +

    manageOuterTpl - Зовнішній шаблон для керування галереєю

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/manageoutertpl.html
    [+maxigallery.messages+]Повідомлення про помилку / сповіщення про керування зображеннями (береться з мовного файлу)
    [+maxigallery.urlback+]URL для силки "Повернеться в звичайний перегляд"
    [+maxigallery.urlaction+] URL для обробки форми
    [+maxigallery.urldragsort+]URL для силки "Сортувати зображення"
    [+maxigallery.managepictures+]Зображення (контент з managePictureTpl)
    [+maxigallery.uploadpictures+]Поле для завантаження зображень (контент з manageUploadTpl)
    [+maxigallery.hiddenfields+]Приховане поле для форми Керування зображеннями, яке повинне бути в ній
    [+maxigallery.pics_allowed_count+]Кількість зображень, дозволених для завантаження
    [+maxigallery.config.parameter+]Значення параметру сніпета. "parameter" - будь-яким з параметрів сніпету.
    [+maxigallery.pageinfo.fieldname+]Поле документу MODx, в якому знаходиться галерея. "fieldname" може бути pagetitle, longtitle, pub_date і т.д.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    +

    managePictureTpl - Шаблон для одного елемента зображення в керуванні галерей

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/managepicturetpl.html
    [+maxigallery.picture.fieldname+]Вміст для області зображення MaxiGallery. "fieldname" може мати значення id, gal_id, filename, title, date, descr, pos або own_id.
    [+maxigallery.path_to_gal+]Шлях до поточного зображення галереї, наприклад: assets/galleries/120/
    [+maxigallery.fieldnames.field+]Назва полів вводу форми. "field" може бути delete, position, title, pictureid, modified і description. Подивіться в шаблоні за замовчуванням, як вони використовуються.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.config.parameter+]Значення параметру сніпету. "parameter" - будь-якої з параметрів сніпету.
    +

    manageUploadTpl - Шаблон для завантажування файлу в керуванні галерей

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/manageuploadtpl.html
    [+maxigallery.counter+]Номер для поточного рядка
    [+maxigallery.fieldnames.file+]Ім'я для поля форми
    [+maxigallery.config.parameter+]Значення параметру сніпета. "parameter" - будь-якого з параметрів сніпета.
    +

    galleryOuterTpl - Зовнішній шаблон для короткого огляду галереї

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/galleryoutertpl.html
    [+maxigallery.managebutton+]Клавіша для керування зображеннями
    [+maxigallery.childgalleries+]Дочірні галереї (вміст childgalleryTpl)
    [+maxigallery.childgallerycount+]Кількість дочірніх галерей
    [+maxigallery.currentpage+]Номер поточної сторінки
    [+maxigallery.pagecount+]Спільне число сторінок
    [+maxigallery.previous_page_url+]Силка на попередню сторінку
    [+maxigallery.next_page_url+]Силка на наступну сторінку
    [+maxigallery.pagenumbers+]Номери сторінок (вміст pageNumberTpl)
    [+maxigallery.pictures+]Галерея зображень (вміст galleryPictureTpl)
    [+maxigallery.picscount+]Кількість фотографій в галереї
    [+maxigallery.embedtype+]Обраний embedtype
    [+maxigallery.pageinfo.fieldname+]Поле документу MODx, в якому знаходиться галерея. "fieldname" може бути pagetitle, longtitle, pub_date і т.д.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.config.parameter+]Значення параметру сніпета. "parameter" - будь-який з параметрів сніпета.
    +

    galleryPictureTpl - Шаблон для кожного зображення (ескізу) при огляді галереї.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/gallerypicturetpl.html
    [+maxigallery.embedtype+]Значення параметру embedtype конфігурації MaxiGallery
    [+maxigallery.picture.fieldname+]Вміст для області зображення MaxiGallery. "fieldname" може мати значення id, gal_id, filename, title, date, descr, pos або own_id.
    [+maxigallery.path_to_gal+]Шлях до поточного зображення галереї, наприклад: assets/galleries/120/
    [+maxigallery.picture_link_url+]URL для силки на зображення
    [+maxigallery.big_pic_exists+]Ідентифікатор, який відображає існування великого зображення. 1 - так, 0 - ні
    [+maxigallery.picture_height_big+]Висота великого зображення
    [+maxigallery.picture_width_big+]Ширина великого   зображення
    [+maxigallery.picture_height_normal+]Висота нормального зображення
    [+maxigallery.picture_width_normal+]Ширина нормального зображення
    [+maxigallery.picture_height_thumb+]Висота ескізу
    [+maxigallery.picture_width_thumb+]Ширина ескізу
    [+maxigallery.pageinfo.fieldname+]Поле документу MODx, в якому знаходиться галерея. "fieldname" може бути pagetitle, longtitle, pub_date і т.д.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.config.parameter+]Значення параметру сніпета. "parameter" - будь-якої з параметрів сніпету.
    [+maxigallery.rownumber+]Номер стрічки рядка для зображення (тільки для версії 0.6)
    [+maxigallery.picrownumber+]Кількість зображень в стрічці рядка (тільки для версії 0.6)
    [+maxigallery.picpagenumber+]Кількість зображень на сторінці (тільки для версії 0.6)
    [+maxigallery.picnumber+]Кількість зображень в галереї (тільки для версії 0.6)
    +

    childgalleryTpl - Шаблон для відображення дочірньої галереї.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/childgallerytpl.html
    [+maxigallery.picscount+]Кількість зображень в галереї
    [+maxigallery.pageinfo.fieldname+]Поле документу MODx, в якому знаходиться галерея. "fieldname" може бути pagetitle, longtitle, pub_date і т.д.
    [+maxigallery.pageinfo.tv.tvname+]Перемінні шаблону з дочірнього документа галереї. "tvname" - ім'я TV-параметра.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.picture.fieldname+]Вміст для області зображення MaxiGallery (перше зображення в дочірній галереї). "fieldname" може мати значення id, gal_id, filename, title, date, descr, pos або own_id.
    [+maxigallery.childurl+]URL до документа дочірньої галереї
    [+maxigallery.path_to_gal+]Шлях до поточного зображення галереї, наприклад: assets/galleries/120/
    [+maxigallery.big_pic_exists+]Ідентифікатор, що відображає існування великого зображення. 1 - так, 0 - ні
    [+maxigallery.picture_height_big+]Висота великого зображення
    [+maxigallery.picture_width_big+]Ширина великого зображення
    [+maxigallery.picture_height_normal+]Висота нормального зображення
    [+maxigallery.picture_width_normal+]Ширина нормального зображення
    [+maxigallery.picture_height_thumb+]Висота ескізу
    [+maxigallery.picture_width_thumb+]Ширина ескізу
    [+maxigallery.config.parameter+]Значення параметру сніпету. "parameter" - будь-якого з параметрів сніпету.
    +

    pictureTpl - Шаблон для предперегляду зображення.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/childgallerytpl.html
    [+maxigallery.managebutton+]Клавіша для керування зображеннями
    [+maxigallery.big_img_linkstyle+]Значення параметру big_img_linkstyle
    [+maxigallery.keep_bigimg+]Значення параметру keep_bigimg
    [+maxigallery.path_to_gal+]Шлях для поточного зображення галереї, наприклад: assets/galleries/120/
    [+maxigallery.picture.fieldname+]Місце для області зображення MaxiGallery. "fieldname" може мати значення id, gal_id, filename, title, date, descr, pos або own_id.
    [+maxigallery.counter+]Поточний номер зображення
    [+maxigallery.total_pics_count+]Спільна кількість зображень в галереї
    [+maxigallery.previous_pic_url+]Силка на попередні зображення
    [+maxigallery.next_pic_url+]Силка на наступні зображення
    [+maxigallery.index_url+]Силка на короткий огляд галереї
    [+maxigallery.big_pic_exists+]Ідентифікатор, що відображає існування великого зображення. 1 - так, 0 - ні
    [+maxigallery.picture_height_big+]Висота великого зображення
    [+maxigallery.picture_width_big+]Ширина великого зображення
    [+maxigallery.picture_height_normal+]Висота нормального зображення
    [+maxigallery.picture_width_normal+]Ширина нормального зображення
    [+maxigallery.picture_height_thumb+]Висота ескізу
    [+maxigallery.picture_width_thumb+]Ширина ескізу
    [+maxigallery.pageinfo.fieldname+]Поле документу MODx, в якому знаходиться галерея. "fieldname" може бути pagetitle, longtitle, pub_date і т.д.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.config.parameter+]Значення параметру сніпета. "parameter" - будь-якої з параметрів сніпета.
    +

    pageNumberTpl - Шаблон для показу номерів сторінок в короткому огляді галереї.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/pagenumbertpl.html
    [+maxigallery.pageurl+]URL до сторінки
    [+maxigallery.pagenumber+]Номер сторінки
    [+maxigallery.pagecount+]Спільне число сторінки
    [+maxigallery.currentpage+]Номер поточної сторінки
    [+maxigallery.config.parameter+]Значення параметру сніпету. "parameter" - будь-якого з параметрів сніпета.
    +

    draggableTpl - Шаблон для ручного сортування зображень галереї.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/draggabletpl.html
    [+maxigallery.path+]Шлях до папки MaxiGallery
    [+maxigallery.path_to_gal+]Шлях до поточного зображення галереї, наприклад: assets/galleries/120/
    [+maxigallery.pageinfo.fieldname+]Поле документу MODx, в якому знаходиться галерея. "fieldname" може бути pagetitle, longtitle, pub_date і т.д.
    [+maxigallery.strings.keyname+]Текст з мовного файлу MaxiGallery. "keyname" може бути click_to_zoom, previous, next і т.д.
    [+maxigallery.config.parameter+]Значення параметру сніпету. "parameter" - будь-якого з параметрів сніпета.
    +

    clearerTpl - Шаблон, що використовується при використанні параметру pics_per_row.

    +Шаблон за замовчуванням знаходиться в файлі: assets/snippets/maxigallery/templates/clearertpl.html
    Немає використаних плейсхолдерів
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..50e09514 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,26 @@ + + +

    MaxiGallery: Встановлення

    +Установка сніпета MaxiGallery для організації галереї на MODX Evolution. +
    +

    Первинна установка

    1. Завантажте MaxiGallery.

    +

    2. Розпакуйте архів і помістіть вміст архіву в корінну папку сайту. Файли будуть скопійовані в правильному місці.

    +

    3. Для папки assets/galleries/ необхідно встановити права на запис.

    +

    4. Створіть новий сніпет MaxiGallery і помістіть в нього код із файлу maxigallery.txt.

    +

    Оновлення

    1. Створіть резервну копію файлів, на той випадок, якщо були внесені зміни в файлову систему, наприклад, були додані мовні пакети або файли конфігурації.

    +

    2. Видаліть папку /assets/snippets/maxigallery/

    +

    3. Розпакуйте архів і помістіть вміст архіву в корінну папку сайту. Файли будуть скопійовані в правильному місці.

    +

    4. Замініть код сніпету MaxiGallery, помістивши в нього код з файлу maxigallery.txt.

    +

    Паралельна установка

    Якщо ви хочете встановити нову версію, але не хочете видаляти поточну установку MaxiGallery, ви можете зробити це за допомогою паралельної установки.

    +

    1. Розпакуйте архів на своєму комп'ютері.

    +

    2. Перейменуйте папку /assets/snippets/maxigallery такім чином: /assets/snippets/maxigallery-new.

    +

    3. Відкрийте файл maxigallery.txt і знайдіть в ньому стрічку рядка

    +
    define(MAXIGALLERY_PATH, "assets/snippets/maxigallery/");
    +

    Змініть в ньому назву папки:

    +
    define(MAXIGALLERY_PATH, "assets/snippets/maxigallery-new/");
    +

    4. Помістіть вміст архіву в корінну папку сайту. Файли будуть скопійовані в правильному місці.

    +

    5. Створіть новий сніпет MaxiGalleryNew і помістіть в нього код з файлу maxigallery.txt.

    +

    6. Використайте наступний виклик сніпету: MaxiGalleryNew.

    +

    Відомі проблеми

    При виникненні помилки

    +
    Function split() is deprecated
    +

    замініть в файлі maxigallery.class.inc.php у 242 рядку застарілу функцію split на explode.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/05_\320\243\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260_\320\274\320\276\320\262\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/05_\320\243\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260_\320\274\320\276\320\262\320\260.md" new file mode 100644 index 00000000..3dd8bd18 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/05_\320\243\320\272\321\200\320\260\321\227\320\275\321\201\321\214\320\272\320\260_\320\274\320\276\320\262\320\260.md" @@ -0,0 +1,27 @@ + + +

    MaxiGallery: Українська мова

    +Спочатку в MaxiGallery українська мова не входить, тому, необхідно створити свій файл з перекладом. +
    +

    Спочатку в MaxiGallery українська мова не входить, тому, необхідно створити свій файл з перекладом. Але через те, що MaxiGallery складається з деяких галерей, які додатково використовують скрипти і картинки, спільний переклад галереї на українську мову буде складатися з декількох кроків.

    +

    Створюємо файл lang_uk-utf8.php

    +

    Всі файли з мовними пакетами знаходяться в папці /assets/snippets/maxigallery/lang/. Створюємо файл lang_uk-utf8.php в цій же папці на основі одного з чинних мовних пакетів, наприклад, lang_en.php і переводимо всі необхідні рядки. Або завантажуємо готовий файл:

    +

    lang_uk-utf8.php

    +

    Не забудьте, що кодування файлу повинне бути utf-8.

    +

    Створюємо файл slidebox_lang_uk-utf8.js

    +

    Ви напевно звернули увагу на стрічки рядків в мовному файлі:

    +
    // If you are going to make your own language file and are usign the lighbox,
    // make a language file for it too, f.ex. /maxigallery/slidebox/slidebox_lang_en.js
    +

    Т.е. якщо ми збираємось створювати свій мовний файл, нам рекомендують також перевести і slidebox_lang_en.js. Діємо по тому ж принципу, створюємо в папці новий файл slidebox_lang_uk-utf8.js на основі файлу slidebox_lang_en.js і перекладаємо його. Або завантажуємо готовий файл:

    +

    slidebox_lang_uk-utf8.js

    +

    Не забудьте, що і в цьому випадку кодування файлу повинне бути utf-8.

    +

    Створюємо картинки для галерей slimbox і lightboxv2

    +

    Галереї slimbox і lightboxv2 в якості навігації використовують картинки closelabel.gif, nextlabel.gif і prevlabel.gif. Ці картинки знаходяться в папці:

    +
    /assets/snippets/maxigallery/lightboxv2/images/  для lightboxv2
    +/assets/snippets/maxigallery/slimbox/images/  для slimbox
    +

    Щоб і в цих галереях навігація стала на українську мову, створюємо повідомлення картинки і замінюємо ними картинки з англійською мовою. Ви можете створити свої картинки або завантажити готові:

    + + + +

    Виклик українізованого MaxiGallery

    +

    Щоб під'єднати український мовний файл, не забудьте при виклику MaxiGallery використовувати наступний параметр:

    +
    &lang=`uk-utf8`
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..63333eff --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,186 @@ + + +

    MaxiGallery: Приклади

    +Приклади сніпета MaxiGallery для організації галереї на MODX Evolution. +
    +

    Завантаження зображення за допомогою FTP

    1. Визначаємо ID галереї, в яку необхідно завантажити зображення. Для прикладу, ця галерея має ID 89.

    +

    2. Створюємо папку /assets/galleries/89 якщо такої папки ще не існує. Якщо в цій галереї вже існує декілька зображень, завантажених через MaxiGallery то така папка повинна вже існувати.

    +

    3. Права на папку повинні бути 777.

    +

    4. Завантажуємо в папку 89 зображень за допомогою FTP.

    +

    5. Права на зображення повинні бути 666.

    +

    6. Переходимо до керування зображеннями в MaxiGallery і натискаємо кнопку "Пересинхронізувати Галерею".

    +

    Простий виклик

    Створіть новий документ в дереві документів MODx і помістіть в ньому виклик сніпета:

    +
    [!MaxiGallery!]
    +
    +

    Примітка: керування зображеннями галереї (завантаження, сортування, видалення) здійснюється не в адміністраторські панелі, а на сторінці з виводом галереї.

    +
    +

    При такому виклику на сторінці галереї відображатиметься кнопка для керування зображеннями: "Manage pictures". Цю клавішу буде видно тільки авторизованим користувачам. Натиснув на цю клавішу ви попадете на сторінку з формою завантаження зображень. Всі зображення завантажуються в папку assets/galleries/ID-галереї/ де ID-галереї - це ID документа MODx, в якому розміщений виклик галереї.

    +

    Виклик за додатковими параметрами

    [!MaxiGallery? &lang=`ru-utf8` &display=`embedded` &embedtype=`slimbox` &pics_per_row=`3` &max_thumb_size=`110` &max_pic_size=`0` &thumb_use_dropshadow=`1`!]
    +

    де:

    +
      +
    • &lang=`ru-utf8` - підключаємо мовний файл (Українська мова в MaxiGallery) За замовчуванням en.
    • +
    • &display=`embedded` - обираємо тип галереї (за замовчуванням normal).
    • +
    • &embedtype=`slimbox` - обираємо ефект зміни зображень (тільки для типу галереї embedded).
    • +
    • &pics_per_row=`3` - визначаємо кількість ескізів в одному ряду (за замовчуванням 4).
    • +
    • &max_thumb_size=`110` - обираємо розмір ескізу (за замовчуванням 130).
    • +
    • &max_pic_size=`0` - встановлюємо розмір нормального зображення як оригінальне (за замовчуванням 450).
    • +
    • &thumb_use_dropshadow=`1` - включаємо відображення тіні в ескізах.
    • +
    +

    Додаємо водяні знаки

    +
    +[!MaxiGallery?
    +&lang=`ru-utf8`
    +&pics_per_row=`3`
    +&max_thumb_size=`110`
    +&max_pic_size=`400`
    +&keep_bigimg=`1`
    +&big_img_linkstyle=`popup`
    +&pic_use_watermark=`1`
    +&pic_watermark_type=`image`!]
    +
    +

    де:

    +
      +
    • &keep_bigimg=`1` - зберігаємо оригінал зображення.
    • +
    • &big_img_linkstyle=`popup` - обираємо спосіб відображення великих зображень.
    • +
    • &pic_use_watermark=`1` - включаємо використання водяних знаків для зображень нормального розміру.
    • +
    • &pic_watermark_type=`image` - встановлюємо тип водяного знаку для нормальних зображень в вигляді картинки. Ми можемо використовувати свою картинку для водяного знаку, указав до неї шлях за допомогою параметру &pic_watermark_img=`шлях до картинки`.
    • +
    +

    Вивід дочірніх галерей

    Створимо в папці Галереї декількох дочірніх галерей Галерея 1, Галерея 2 і т.д. і завантажимо фотографії. Ми можемо вивести список всіх дочірніх галерей розміщуючи в батьківській папці Галереї такій виклик сніпету.

    +
    [!MaxiGallery? &lang=`ru-utf8` &display=`childgalleries` &childgalleries_ids=`all` &order_by=`random` &childgalleries_order_by=`createdon`!]
    +

    де:

    +
      +
    • &display=`childgalleries` - визначаємо тип галереї.
    • +
    • &childgalleries_ids=`all` - включаємо відображення всіх дочірніх галерей. Ми також можемо вказати тільки визначені галереї, вказуючи список ID галерей через кому.
    • +
    • &order_by=`random` - включаємо відображення випадкового зображення з дочірньої галереї.
    • +
    • &childgalleries_order_by=`createdon` - поле, по якому сортується дочірні галереї.
    • +
    +

    Вивід заданих дочірніх галерей

    [!MaxiGallery? &lang=`ru-utf8`&display=`childgalleries` &childgalleries_ids=`67,5`!]
    +

    де:

    +
      +
    • &childgalleries_ids=`67,5` - задаємо ID галерей, які необхідно вивести.
    • +
    +

    Фотоблог с Jot

    1. Створіть новий чанк, наприклад, mgPictureTplComment і помістіть в нього код з файлу maxigallery/templates/picturetpl.html.

    +

    2. В цей шаблон додайте виклик Jot (ви можете змінити всі параметри сніпета, крім &tagid):

    +
    +[[Jot?
    +&subscribe=`1`
    +&tagid=`[+maxigallery.picture.id+]`
    +&pagination=`10`
    +&badwords=`something`
    +&customfields=`name,email`
    +&canmoderate=`Jot Moderators`
    +&trusted=`Jot Trusted Users`]]
    +
    +

    3. Створіть нову галерею і помістіть такий виклик сніпету (додайте до виклику будь-які параметри, які ви хочете):

    +
    [!MaxiGallery? &pictureTpl=`mgPictureTplComment`!]
    +

    Зображення й ескізи на одній сторінці

    Цей приклад показує, як зробити свій шаблон, щоб отримати ескізи та картини в одному документі й додати зміни зображення за допомогою JavaScript.

    +

    1. Створюємо виклик сніпета, що відображає список ескізів:

    +
    [!MaxiGallery? &galleryPictureTpl=`mgGalleryPicture` &js=`mgJs`!]
    +

    2. Створюємо чанк mgGalleryPicture, який буде використовуватися при перегляді ескізів:

    +
    +<li>
    +	 <a href="javascript:void(0);"onClick="javascript:showPic('[(base_url)][+maxigallery.path_to_gal+][+maxigallery.picture.filename+]','[+maxigallery.picture.title:htmlent+]','[+maxigallery.picture.descr:htmlent+]',[+maxigallery.picture_width_normal+],[+maxigallery.picture_height_normal+]);return false;">
    +		<img src="[(base_url)][+maxigallery.path_to_gal+]tn_[+maxigallery.picture.filename+]" class="thumbnail" title="[+maxigallery.picture.title:htmlent+]" alt="[+maxigallery.picture.title:htmlent+]" />
    +	 </a>
    +</li>
    +
    +

    3. Створюємо чанк mgJs с JavaScript, який буде використовувати для перемикання зображень. (Можна також створити його як зовнішній файл .js і визначити шлях до нього в параметрі &js):

    +
    +<script type="text/javascript">
    +	function showPic(url,title,descr,width,height) {
    +		var img = document.getElementById('maxImage');
    +		var titleHolder = document.getElementById('maxTitle');
    +		var descrHolder = document.getElementById('maxDescr');
    +		var newImg = new Image();
    +		newImg.onLoad = doImage(img,url,width,height);
    +		if (titleHolder != null) {
    +			for (var i = 0; i < titleHolder.childNodes.length; i++) {
    +				titleHolder.removeChild(titleHolder.childNodes[i]);
    +			};
    +			if (title != "") {
    +				var node=document.createTextNode(title);
    +			}
    +			else {
    +				var node=document.createTextNode("");
    +			}
    +			titleHolder.appendChild(node);
    +		}
    +		if (descrHolder != null) {
    +			for (var i = 0; i < descrHolder.childNodes.length; i++) {
    +				descrHolder.removeChild(descrHolder.childNodes[i]);
    +			};
    +			if (descr != "") {
    +				var node=document.createTextNode(descr);
    +			}
    +			else {
    +				var node=document.createTextNode("");
    +			}
    +			descrHolder.appendChild(node);
    +		}
    +	}
    +	 
    +	function doImage(img,url,width,height) {
    +		img.src=url;
    +	}
    +</script>
    +
    +

    4. Створюємо ще один виклик сніпета, щоб показати зображення. Ми використовуємо приклад &display=`pictureview`, щоб показувати зображення в режимі перегляду за замовчуванням. Якщо ви використовуєте якісь інші параметри сортування, ніж той що використовується за замовчуванням, додайте їх в цей виклик сніпета, так він отримає перше зображення автоматично.

    +
    [!MaxiGallery? &pictureTpl=`mgPicture` &display=`pictureview`!]
    +

    5. Створюємо чанк mgPicture для показу одного зображення:

    +
    +<div class="picturecontainer">
    +	 <img id="maxImage" src="[(base_url)][+maxigallery.path_to_gal+][+maxigallery.picture.filename+]" alt="[+maxigallery.picture.title:htmlent+]" />
    +	 <p id="maxTitle">[+maxigallery.picture.title:htmlent+]</p>
    +	 <p id="maxDescr">[+maxigallery.picture.descr:htmlent+]</p>
    +</div>
    +
    +

    Вспливаюче вікно з ескізами

    Цей приклад показує, як зробити вспливаюче вікно з ескізами зображень, які має prev/next силки.

    +

    1. Створіть новий документ для вспливаючого вікна. Обирайте шаблон blank, зніміть флажок і Показувати в меню. У вмісті документу помістіть наступний код:

    +
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    +	<head>
    +		<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    +		<base href="[(site_url)]" />
    +		<title>[(site_name)] | [*pagetitle*]</title>
    +	</head>
    +<body
    +	[!MaxiGallery? &is_target=`1`!]
    +</body>
    +</html>
    +
    +

    2. Створіть новий документ для показу ескізів і помістіть в нього такий виклик сніпета. Замініть <docid> на ідентифікатор документа, який ви зробили в кроці 1:

    +
    +[!MaxiGallery? &js=`mgJs` &galleryPictureTpl=`mgGalleryPicture` &picture_target=`<docid>`!]
    +
    +

    3. Створіть чанк mgJs, який має JavaScript, вспливаюче вікно. Змініть ширину і висоту вікна на необхідні:

    +
    +<script type="text/javascript">
    +	function openWindow(URL) {
    +		var day = new Date();
    +		var id = day.getTime();
    +		var width=600;
    +		var height=600;
    +		var left = Math.floor( (screen.width - width) / 2);
    +		var top = Math.floor( (screen.height - height) / 2);
    +		var str = "page" + id + " = window.open('" + URL + "', '" + id +
    +	"','toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width="
    +	+ width + ",height=" + height + ",left=" + left + ",top=" + top +
    +	"');";
    +		 eval(str);
    +		 if (window.focus) {eval("page"+id+".focus();");}
    +	}
    +</script>
    +
    +

    4. Створіть чанк mgGalleryPicture з шаблоном, який буде використовуватись при перегляді ескізів:

    +
    +<li>
    +	<a href="javascript:void(0);"onClick="javascript:openWindow('[+maxigallery.picture_link_url+]');return false;">
    +		<img src="[(base_url)][+maxigallery.path_to_gal+]tn_[+maxigallery.picture.filename+]" class="thumbnail" title="[+maxigallery.strings.click_to_zoom+]" alt="[+maxigallery.picture.title:htmlent+]" />
    +	 </a>
    +	 <p style="width: [+maxigallery.picture_width_thumb+]px;">
    +		[+maxigallery.picture.title:htmlent+]
    +	 </p>
    +</li>
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/index.md" new file mode 100644 index 00000000..04e28926 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MaxiGallery/index.md" @@ -0,0 +1,4 @@ + + +

    MaxiGallery галерея на MODX Evolution

    +Один з найпопулярніших сніпетів, для організації галереї на MODX Evolution. Простий у використанні й легко встановлюється. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..da04fb8e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,66 @@ + + +

    MemberCheck: Параметри

    +Параметри сніпета MemberCheck для перевірки, чи користувачі належать до певної групи. +
    +
    +
    + +
    +
    + Формат: список имен групп веб-пользователей, разделенных запятой
    + Значення за замовчуванням: немає
    + Примітка:
    + Приклад: +
    &groups=`siteadmin, registered users`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я чанка
    + Значення за замовчуванням: немає
    + Примітка:
    + Приклад: +
    &chunk=`privateSiteNav`
    +
    +
    +
    + +
    + +
    +
    + Формат:
    + Значення за замовчуванням: немає
    + Примітка:
    + Приклад: +
    &ph=`MemberMenu`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &debug=`1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..734628a5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,6 @@ + + +

    MemberCheck: Приклади

    +Приклади сніпета MemberCheck для перевірки, чи користувачі належать до певної групи. +
    +
    [[MemberCheck? &groups=`siteadmin, registered users` &chunk=`privateSiteNav` &ph=`MemberMenu` &debug=`true`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/index.md" new file mode 100644 index 00000000..50e73343 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MemberCheck/index.md" @@ -0,0 +1,4 @@ + + +

    MemberCheck Показ прихованого чанка групі авторизованих користувачів

    +Перевіряє, чи користувачі належать до певної групи і відображає вказаний чанк. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..5bc8f753 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,8 @@ + + +

    MetaX: Особливості

    +Особливості сніпета MetaX. +
    +

    MetaX (Meta Tags Extended) являє собою сніпет, який автоматично генерує HTML теги base, meta і link в заголовку вашого сайту. Переконайтеся, що ваш сайт містить всі елементи, які йому потрібні.

    +

    Автор: Salvatore Sodano

    +

    Сайт автора проекту: salscode.com

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/02_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/02_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..89f18d73 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/02_\320\236\321\201\320\275\320\276\320\262\320\275\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,246 @@ + + +

    MetaX: Основні параметри

    +Основні параметри сніпета MetaX. +
    +
    +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка: Якщо 1, буде використовуватися HTML синтаксис. Якщо 0, буде використовуватися XHTML синтаксис .
    + Приклад: +
    &html=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: int>=0
    + Значення за замовчуванням: 1
    + Примітка:
    + Приклад: +
    &tabs=`3`
    +
    +
    +
    + +
    + +
    +
    + Формат: int>=0
    + Значення за замовчуванням: 0
    + Примітка: Контролює кількість пробілів перед кожним елементом, додається після Tab.
    + Приклад: +
    &spaces=`2`
    +
    +
    +
    + +
    + +
    +
    + Формат: 2 символа
    + Значення за замовчуванням: en
    + Примітка:
    + Приклад: +
    &language=`ru`
    +
    +
    +
    + +
    + +
    +
    + Формат: TV-параметр
    + Значення за замовчуванням: keywords
    + Примітка:
    + Приклад: +
    &keywords=`mykeys`
    +
    +
    +
    + +
    + +
    +
    + Формат: Chunk
    + Значення за замовчуванням: AllKeywords
    + Примітка:
    + Приклад: +
    &allkeywords=`allkeys`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я поля | TV-параметр
    + Значення за замовчуванням: longtitle
    + Примітка:
    + Приклад: +
    &abstract=`description`
    +
    +
    +
    + +
    + +
    +
    + Формат: URI
    + Значення за замовчуванням: favicon.ico
    + Примітка:
    + Приклад: +
    &favicon=`path/icon1.ico`
    +
    +
    +
    + +
    + +
    +
    + Формат: URI
    + Значення за замовчуванням: mobile.png
    + Примітка:
    + Приклад: +
    &mobile=`path/mob.png`
    +
    +
    +
    + +
    + +
    +
    + Формат: рядок
    + Значення за замовчуванням: site_name
    + Примітка:
    + Приклад: +
    &author=`Ім'ян Батькович Прізвищенко`
    +
    +
    +
    + +
    + +
    +
    + Формат: рядок
    + Значення за замовчуванням: site_name
    + Примітка:
    + Приклад: +
    ©holder=`Ім'ян Батькович Прізвищенко`
    +
    +
    +
    + +
    + +
    +
    + Формат: Рік
    + Значення за замовчуванням: Немає
    + Примітка:
    + Приклад: +
    ©from=`2007`
    +
    +
    +
    + +
    + +
    +
    + Формат: Рік
    + Значення за замовчуванням: Поточний рік
    + Примітка:
    + Приклад: +
    ©till=`2013`
    +
    +
    +
    + +
    + +
    +
    + Формат: 1 | 0
    + Значення за замовчуванням: 1
    + Примітка: Якщо 1, то панель IE Image Toolbar відключена, якщо 0 - включена.
    + Приклад: +
    &ietool=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: URI
    + Значення за замовчуванням: Немає
    + Примітка:
    + Приклад: +
    &rss=`20,21,22`
    +
    +
    +
    + +
    + +
    +
    + Формат: URI
    + Значення за замовчуванням: Немає
    + Примітка: Розділений комами список URL-адрес CSS файлів. У разі необхідності, можна додати умовні коментарі для IE
    + Приклад: +
    &css=`c1.css,c2.css:lt IE 7`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_Dublin_Core.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_Dublin_Core.md" new file mode 100644 index 00000000..246fb4fd --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_Dublin_Core.md" @@ -0,0 +1,157 @@ + + +

    MetaX: Параметри Dublin Core

    +Параметри Dublin Core сніпета MetaX. +
    +
    +
    + +
    +
    + Формат: 0 | 1
    + Значення за замовчуванням: 0
    + Примітка:
    0 - вимкнено (за замовчуванням)
    + 1 - включено
    + Приклад: +
    &dublin=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: рядок
    + Значення за замовчуванням: site_name
    + Примітка:
    + Приклад: +
    &dccontributor=``
    +
    +
    +
    + +
    + +
    +
    + Формат: рядок | TV-параметр
    + Значення за замовчуванням: dccoverage
    + Примітка:
    + Приклад: +
    &dccoverage=``
    +
    +
    +
    + +
    + +
    +
    + Формат: рядок
    + Значення за замовчуванням: site_name
    + Примітка:
    + Приклад: +
    &dccreator=`Ім'ян Батькович Прізвищенко`
    +
    +
    +
    + +
    + +
    +
    + Формат:
    + Значення за замовчуванням:
    + Примітка: Управління значенням поля дати в форматі YYYY-MM-DD. Якщо параметр не вказано, виводиться дата останнього редагування документа.
    + Приклад: +
    &dcdate=``
    +
    +
    +
    + +
    + +
    +
    + Формат: рядок
    + Значення за замовчуванням: site_name
    + Примітка:
    + Приклад: +
    &dcpublisher=`Ім'ян Батькович Прізвищенко`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я TV параметра
    + Значення за замовчуванням: dcrelation
    + Примітка: Ім'я TV-параметра, що містить ID документа або URL відповідного документа
    + Приклад: +
    &dcrelation=``
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я TV параметра
    + Значення за замовчуванням: dcsource
    + Примітка:
    + Приклад: +
    &dcsource=``
    +
    +
    +
    + +
    + +
    +
    + Формат: поле документа
    + Значення за замовчуванням: pagetitle
    + Примітка:
    + Приклад: +
    &dctitle=`longtitle`
    +
    +
    +
    + +
    + +
    +
    + Формат: ім'я TV параметра | тип
    + Значення за замовчуванням: Немає
    + Примітка:
    + Приклад: +
    &dctype=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..e1f6f706 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/04_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,8 @@ + + +

    MetaX: Встановлення

    +Встановлення сніпета MetaX. +
    +

    1. Завантажте останню версію MetaX.

    +

    2. Створіть новий сніпет з назвою MetaX і помістіть в нього код з завантаженого файлу. У полі "Опис" сніпета вкажіть його версію та короткий опис, наприклад так:

    +
    <strong>1.5</strong> - Автоматична генерація HTML тегів Base, Meta і Link
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..d7d64c0d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,55 @@ + + +

    MetaX: Приклади

    +Приклади виклику сніпета MetaX. +
    +

    Виклик сніпета необхідно розмістити між тегами <head> и </head>. Сніпет використовує змінні, значення яких за замовчуванням можуть не збігатися з вашими значеннями. Наприклад, сніпет шукає ключові слова в TV-параметрі "keywords", переконайтеся, що для ключових слів у вас використовується такий же TV-параметр або вкажіть при виклику сніпета інше значення в параметрі & keywords.

    +

    Приклад виклику сніпета для російськомовного сайту:

    +
    [!MetaX? &language=`ru`!]
    +

    Приклад коду, що генерується сніпетом MetaX

    +

    Стаття була б неповною, якщо б я не привів кінцевий результат роботи сніпета. Код, згенерований сніпетом MetaX на цій самій сторінці виглядає наступним чином:

    +
    <!-- base -->
    +<base href="[!baseUrl!]" />
    +<meta name="robots" content="index, follow" />
    +<link rel="canonical" href="[!baseUrl!]metax/" />
    +<meta http-equiv="content-language" content="ru" />
    +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    +<meta http-equiv="pragma" content="cache" />
    +<meta http-equiv="cache-control" content="cache" />
    +<meta http-equiv="Content-Style-Type" content="text/css" />
    +<meta http-equiv="Content-Script-Type" content="text/javascript" />
    +
    +<!-- meta -->
    +<meta name="keywords" content="Документація MODx, Сніпети, Шаблон MODx, " />
    +<meta name="description" content="Сніпет MetaX. Автоматична генерація HTML тегів Base, Meta і Link" />
    +<meta name="abstract" content="Автоматична генерація HTML тегів Base, Meta і Link" />
    +<meta http-equiv="last-modified" content="Sat, 14 Jan 2012 11:17:36 +0300" />
    +<meta name="author" content="Saniock" />
    +<meta name="copyright" content="Copyright (c) 2014 - 2015 by saniock.com" />
    +<meta http-equiv="imagetoolbar" content="no" />
    +
    +<!-- Dublin Core -->
    +<link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
    +<meta name="DC.contributor" content="Saniock" />
    +<meta name="DC.creator" content="Saniock" />
    +<meta name="DC.date" content="2012-01-14" />
    +<meta name="DC.description" content="Сніпет MetaX. Автоматична генерація HTML тегів Base, Meta і Link" />
    +<meta name="DC.format" content="text/html" />
    +<meta name="DC.identifier" content="MetaX - 435" />
    +<meta name="DC.language" content="ru" />
    +<meta name="DC.publisher" content="Saniock" />
    +<meta name="DC.rights" content="Copyright (c) 2014 - 2015 by Saniock" />
    +<meta name="DC.subject" content="Документація MODx, Сніпети, Шаблон MODx, " />
    +<meta name="DC.title" content="MetaX" />
    +
    +<!-- icons/rss/css -->
    +<link rel="shortcut icon" type="image/x-icon" href="[!baseUrl!]img/favicon.ico" />
    +<link href="[!baseUrl!]rss.xml" rel="alternate" type="application/rss+xml" title="MODx Evolution - saniock.com" />
    +<link rel="stylesheet" href="assets/templates/magicbox/css/style.css" type="text/css" />
    +<link rel="stylesheet" href="assets/css/AnimationMenus2.css" type="text/css" />
    +<!-- end MetaX output -->
    +
    + +
    +[!MetaX? &language=`ru` &author=`Saniock` &favicon=`img/favicon.ico` &subject=`MODX Evolution. Документація, Корисні матеріали`!]
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/index.md" new file mode 100644 index 00000000..5feb82f0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/MetaX/index.md" @@ -0,0 +1,4 @@ + + +

    MetaX Сніпет MetaX. Автоматична генерація HTML тегів Base, Meta і Link

    +Являє собою сніпет який автоматично генерує HTML теги base meta і link в заголовку вашого сайту. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ModxAccount/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ModxAccount/index.md" new file mode 100644 index 00000000..20cae559 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ModxAccount/index.md" @@ -0,0 +1,163 @@ + + +

    Особистий кабінет веб користувача MODx Evo

    +Сніпет для реєстрації, входу, нагадування пароля і особистого кабінету користувача. +

    Установка

    +

    Створюється сніпет account з кодом

    +
    +<?php
    +require MODX_BASE_PATH.'assets/snippets/account/snippet.account.php';
    +?>
    +
    +

    Створюється документ "Особистий кабінет" -> псевдонім -> account

    +

    Далі в ньому дочірні ресурси

    +

    Реєстрація -> register

    +

    Профіль -> profile

    +

    Відновлення паролю -> forgot

    +

    І на кожній сторінці ставиться виклик сніпета

    +

    account

    +
    +[!account?
    +&controller=`account`
    +&controllerRegister=`account/register`
    +&controllerLogin=`account`
    +&controllerForgot=`account/forgot`
    +&controllerProfile=`account/profile`
    +&success=``
    +&userGroupId=``
    +!]
    +
    +

    register

    +
    +[!account?
    +&controller=`account/register`
    +&controllerRegister=`account/register`
    +&controllerLogin=`account`
    +&controllerForgot=`account/forgot`
    +&controllerProfile=`account/profile`
    +&success=``
    +&userGroupId=``
    +!]
    +
    +

    profile

    +
    +[!account?
    +&controller=`account/profile`
    +&controllerRegister=`account/register`
    +&controllerLogin=`account`
    +&controllerForgot=`account/forgot`
    +&controllerProfile=`account/profile`
    +&success=``
    +&userGroupId=``
    +!]
    +
    +

    forgot

    +
    +[!account?
    +&controller=`account/forgot`
    +&controllerRegister=`account/register`
    +&controllerLogin=`account`
    +&controllerForgot=`account/forgot`
    +&controllerProfile=`account/profile`
    +&success=``
    +&userGroupId=``
    +!]
    +
    +

    Замість псевдонімів контролерів &controller..., можна поставити id сторінок на яких розташований той чи інший виклик сніпета.

    +

    &success - перенаправлення після вдалої дії сніпета.

    +

    &userGroupId - id груп, через кому для нового зареєстрованого користувача.

    +

    При створенні вкладеності документів, як вказано вище і використовуючи вкладені URL, виклик сніпета можна скоротити до одного рядка

    +
    +[!account?&userGroupId=``!]
    +
    +

    або використовувати свої шаблони

    +
    +[!account?
    +&tpl=`@FILE:assets/snippets/account/view/register.tpl.txt`
    +&userGroupId=``
    +!]
    +
    + +

    AJAX

    +

    Для роботи через ajax використовується ModxLoader - ModxLoader

    + +

    Капча

    +

    Використовується ця ModxCaptcha

    +

    Приклад використання

    +
    +<img src="assets/captcha" alt="captcha" width="120px" height="60px"/>
    +
    +

    або створити сніпет captcha і вивести його на окремій сторінці з шаблоном blank і типом text/plain

    +
    +<?php
    +$chars = !empty($modx->config['captcha_words']) ? preg_replace('![^\w\d]*!', '', $modx->config['captcha_words']) : '1234567890';
    +$chars = substr(str_shuffle($chars), 0, 5);
    +if(isset($_REQUEST['key'])) {
    +    $_SESSION['veriword_' . md5($_REQUEST['key'])] = $chars;
    +} else {
    +    $_SESSION['veriword'] = $chars;
    +}
    +header("Pragma: no-cache");
    +header("Content-Type:image/png");
    +$img = imagecreate(210, 100);
    +imagecolorallocatealpha($img, 255, 255, 255, 127);
    +$color = imagecolorallocate($img, 0, 0, 0);
    +$x = 10;
    +for($i = 0; $i < strlen($chars); $i++) {
    +    $letter = mb_substr($chars, $i, 1, 'UTF-8');
    +    imagettftext($img, 70, rand(-10, 10), $x, 75, $color, MODX_MANAGER_PATH . "includes/ttf/ftb_____.ttf", $letter);
    +    $x += 35;
    +}
    +imagepng($img);
    +imagedestroy($img);
    +?>
    +
    +

    Гілка обговорення сніпета на форумі modx.im

    + +

    Приклади використання

    +

    Реєстрація

    +

    Наприклад поле Адреса, замість того щоб запропонувати користувачеві записати весь адреса одним рядком, можна поставити поля для кожного значення.

    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    далі ці дані запишуться в базу у вигляді json рядка.

    +

    Рівень вкладеності можна використовувати будь-який, але розумніше дальше 3-4 ого НЕ залазити.

    +
    +
    +
    +

    Шаблони

    +

    Шаблони для форми в html зі вставками php коду, можна використовувати php відразу в шаблоні, або всі тегі modx.

    +
    +
    +<? if($error_email) { ?>
    +
    + <?= $error_email ?> +
    +<? } ?> +
    +

    або використовувати чанкі, підключивши їх в &tpl=`ваший чанк`

    +
    +
    +<@IF:[+error_email+]>
    +	
    + [+error_email+] +
    +<@ENDIF> + + +<@IF:[+error_custom_field.address.street+]> +
    + [+error_custom_field.address.street+] +
    +<@ENDIF> +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/OpenGraphTags/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/OpenGraphTags/index.md" new file mode 100644 index 00000000..c47e2e52 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/OpenGraphTags/index.md" @@ -0,0 +1,101 @@ + +

    OpenGraphTags: Виведення OG-тегів для статті

    +Сніпет виведення OG-тегів для статті у Evolution CMS. +

    Автор: Aharito

    +

    Параметри:

    +

    tplList

    +

    список шаблонів через кому, ОБОВ'ЯЗКОВИЙ!!

    +

    locale

    +

    string за замовчуванням "ru_RU"

    +

    site_name

    +

    string за замовчуванням [(site_name)]

    +

    flag

    +

    string, ім'я ТВ-параметра-прапора (чекбокс, ним можна увімкнути/вимкнути виведення OG-тегів для статті, навіть якщо її шаблон у списку $tplList). За замовчуванням 1 (увімкнено).

    +

    thumbSnippet

    +

    string - сніппет для превьюшек як у SG та FastImage. Наприклад, "sgThumb" або "phpthumb". За промовчанням пусто.

    +

    thumbOptions

    +

    string - опції превьюшки, задані як у SG або FastImageTV або phpthumb. За промовчанням пусто.

    +

    NOTE: Для роботи сніпета повинні бути створені наступні ТВ-параметри:

    +
      +
    • og_on_off - ТВ-параметр-прапор (чекбокс, ним можна включити/відключити виведення OG-тегів для статті, навіть якщо її шаблон є у списку $tplList)< /li> +
    • og_title - заголовок для соцмереж, якщо не заданий, соцмережі найчастіше беруть Title.
    • +
    • og_description - опис для соцмереж, не більше 137 символів за моїми експериментами
    • +
    • og_image - картинка для соцмереж, якщо не задана, соцмережі шукають картинки в контенті
    • +
    + +

    Приклад виклику сніппета:

    +
    +[[OpenGraphTags? &tplList=`31,32` &site_name=`[(cfg_company_brand_name)]` &thumbSnippet=`sgThumb` &thumbOptions=`840x420`]]
    +
    + +

    Код сніпету:

    +
    +<?php
    +/**
    + * OpenGraphTags
    + * Виводить OG-теги лише для вказаних шаблонів.
    + *
    + * @category snippet
    + * Це повинні бути тільки шаблони статей (og_type – жорстко прописаний як article)!!!
    + * Виводить непусті значення тегів OpenGraph, зазначені в адмінці для посту
    + *
    + * @param $tplList - список шаблонів через кому, ОБОВ'ЯЗКОВИЙ!!
    + * @param $locale, string, за замовчуванням "ru_RU"
    + * @param $site_name, string, за замовчуванням [(site_name)]
    + * @param $flag, string, ім'я ТВ-параметра-прапора (чекбокс, ним можна включити/вимкнути виведення OG-тегів для статті, навіть якщо її шаблон у списку $tplList). За замовчуванням 1 (увімк.).
    + *
    + * @param &thumbSnippet, string - сниппет для превьюшек як у SG та FastImage. Наприклад, "sgThumb" або "phpthumb". За промовчанням порожньо.
    + * @param &thumbOptions, string - опції превьюшки, задані як у SG або FastImageTV або phpthumb. За промовчанням порожньо.
    + *
    + * @NOTE: Для роботи сніпету повинні бути створені наступні ТВ-параметри:
    + * og_on_off - ТВ-параметр-прапор (чекбокс, ним можна включити/вимкнути висновок OG-тегів для статті, навіть якщо її шаблон є у списку $tplList)
    + * og_title - заголовок для соцмереж, якщо не заданий, соцмережі найчастіше беруть Title.
    + * og_description - опис для соцмереж, не більше 137 символів за моїми експериментами
    + * og_image - картинка для соцмереж, якщо не задана, соцмережі шукають картинки в контенті
    + *
    + *
    + * @internal @category SMO
    + *
    + * @version 0.2
    + * @author Aharito http://aharito.ru
    + *
    + *
    + * @example [[OpenGraphTags? &tplList=`31,32` &site_name=`[(cfg_company_brand_name)]` &thumbSnippet=`sgThumb` &thumbOptions=`840x420`]]
    +**/
    +
    +$out = '';
    +
    +$tplList = str_replace(" ", "", $tplList); //Прибираємо можливі зайві прогалини між ID шаблонів у списку
    +$_tplList = explode(",", $tplList);
    +
    +$docObject = $modx->documentObject;
    +
    +if ( in_array($docObject['template'], $_tplList) && $docObject['og_on_off'][1] ) { // Якщо шаблон у списку $tplList, і якщо прапор "увімкнено"
    +
    +// Ці параметри задані один раз при викликі сніпету OpenGraphTags
    +$site_name = isset($site_name)? $site_name : $modx->getConfig('site_name');
    +$locale = isset($locale)? $locale: "ru_RU";
    +
    +// Ці параметри задаються під час редагування кожної статті
    +// Якщо вони не задані, то для них 100% дефолтні значення, вони і виводяться
    +$title = !empty($docObject["og_title"][1]) ? $docObject["og_title"][1] : $docObject["pagetitle"];
    +$url = $modx->makeUrl($docObject["id"], '', '', 'full'); // Була нагода редагувати УРЛ, але я прибрав за непотрібністю
    +
    +// Ці параметри задаються під час редагування кожної статті
    +// Для них немає 100% дефолтних значень, тому якщо вони не задані, то взагалі не виводимо відповідний метатег
    +$desc = !empty($docObject["og_description"][1]) ? $docObject["og_description"][1] : $modx->runSnippet('summary', array('text' => $docObject['content'], 'len' => '50'));
    +$descTPL = !empty($desc)? '<meta property="og:description" content="' .$desc. '">' : '';
    +
    +$imgTPL = !empty($docObject["og_image"][1]) ? '<meta property="og:image" content="' .(isset($thumbSnippet) ? $modx->runSnippet($thumbSnippet, array("input" => $docObject["og_image"][1], "options"=>$thumbOptions)) : $docObject["og_image"][1]).'">' : '';
    +
    +$out .= '';
    +$out .= PHP_EOL."\t".'';
    +$out .= PHP_EOL."\t".'';
    +$out .= PHP_EOL."\t".'';
    +$out .=$descTPL? PHP_EOL."\t".$descTPL : '';
    +$out .=$imgTPL? PHP_EOL."\t".$imgTPL : '';
    +$out .= PHP_EOL."\t".'';
    +}
    +
    +return $out;
    +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PHx/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PHx/index.md" new file mode 100644 index 00000000..67b8f911 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PHx/index.md" @@ -0,0 +1,204 @@ + +

    PHx Додаткові можливості для тегів MODX Evolution

    +Додаткові можливості для відображення плейсхолдерів, тегів MODx (включаючи параметри TV) і теги налаштувань сайту. +

    PHx (Placeholders Xtended) додає нові можливості для відображення плейсхолдерів, тегів MODx (включаючи TV параметри) та теги налаштувань сайту. Рекурсивний парсер дає змогу використовувати вкладені теги. Можна створювати свої модифікатори шляхом створення сніппетів.

    +

    PHx підтримує такі теги MODx:

    +
    +[+placeholder+]
    +[*теги вмісту*] ([*content*], [*pagetitle*], наприклад)
    +[*TV параметри*]
    +[(теги налаштування)] (наприклад, [(base_url)], [(site_name)] та інші)
    +
    +

    Використання

    +

    Звичайний плейсхолдер виду [+placeholder+] легко перетворюється на плейсхолдер PHx: [+placeholder:esc+]. Те саме можна зробити з тегом вмісту:

    +

    [*createdby*]

    +

    Додаємо модифікатор:

    +
    [*createdby:date=`%a %B %d, %Y at %H:%M`*]
    +

    Також можна використовувати кілька модифікаторів одразу. Вони будуть оброблені ліворуч:

    +
    somevar:esc:nl2br:strip
    +

    Розширене застосування

    +

    Наявність спеціального плейсхолдера "phx" дозволяє використовувати синтаксис PHx без реальної змінної.

    +
    [+phx:if=`[+this+]`:is=`[+that+]`:then=`do this`:else=`do that`+]
    +

    З деякими модифіакторами цей плейсхолдер набуває певного значення. У випадку модифікатора "userinfo" він повертає відповідне значення з інформації про поточного користувача:

    +

    [+phx:userinfo=`username`+]

    +
    Синтаксис
    +

    Хоч це і здається логічним, але на цьому варто загострити увагу. Уникайте використання наступних конструкцій у шаблоні, якщо вони не є частиною тегу MODx:

    +
    +[+
    +[*
    +[(
    ++]
    +*]
    +)]
    +]]
    +
    +

    Парсер спробує їх обробити та MODx видасть помилку. Зазвичай такої проблеми немає. Але у випадку з JavaScript у вас може бути конструкція, подібна до цієї:

    +array[counter++] +

    що спровокує дивну поведінку через +].

    +

    Також CDATA, що закриває тег, може створити проблеми.

    +/* ]]> */ +

    Пам'ятайте, що ви не зможете втратити дані вашого сайту, використовуючи неправильний синтаксис PHx. Найгірше, що може статися, - ваш шаблон неправильно відобразиться.

    + + +

    lcase

    +

    - Повертає рядок, наведений до нижнього регістру.

    +
    [+string:lcase+]
    + +

    ucase

    +

    - Приведе всі символи рядка до верхнього регістру.

    +
    [+ucase:lcase+]
    + +

    ucfirst

    +

    - Перша літера в рядку стане великою.

    +
    [+ucfirst:lcase+]
    + +

    ellipsis

    +

    - Обрізає рядок.

    +
    [+description:ellipsis=`150`]
    + +

    length | len

    +

    - Поверне довжину рядка.

    +
    [+string:len+]
    + +

    notags

    +

    - Виріже всі HTML теги з рядка.

    +
    [+string:notags+]
    + +

    esc

    +

    - Видаляє html теги та розриви рядків

    +
    [+string:esc+]
    + +

    htmlent

    +

    - Конвертує вихідну змінну в html сутності. Аналог htmlentities() у PHP.

    +
    [+string:htmlent+]
    + +

    nl2br

    +

    - Конвертує символи перекладу рядка на теги.

    +
    [+string:nl2br+]
    + +

    strip

    +

    - Видалити символи нового рядка(\n), табулятори(\t), що йдуть пробіли підряд.

    +
    [+string:strip+]
    + +

    reverse

    +

    - Переверне задом навпаки літери.

    +
    [+string:reverse+]
    + +

    wordwrap

    +

    - Встановлює переноси в залежності від кількості символів слова, аналогічно функції php (За замовчуванням: 70).

    +
    [*pagetitle:wordwrap=`10`*]
    + +

    limit

    +

    - Поверне перші символи X від поточного значення (За замовчуванням: 100).

    +
    [*pagetitle:limit=`50`*]
    + +

    date

    +

    - Перетворює мітку часу unix timestamps відповідно до заданого формату.

    +
    [*createdon:date=`%d.%m.%Y`*]
    + +

    md5

    +

    - Створює MD5-хеш поточного значення.

    +
    [*pagetitle:md5*]
    + +

    userinfo

    +

    - Повертає запитані модифікатори дані про користувача.

    +
    [+phx:userinfo=`username`+]
    +
      +
    • cachepwd : Cache password
    • +
    • comment : Comment
    • +
    • country : Країна
    • +
    • dob : Дата народження у форматі часу UNIX
    • +
    • email : Email
    • +
    • fax : Факс
    • +
    • fullname : Повне ім'я
    • +
    • gender : Пол
    • +
    • internalKey : User internal key
    • +
    • lastlogin : Last login, in UNIX time format
    • +
    • logincount : Number of logins
    • +
    • mobilephone : Мобільний телефон
    • +
    • password : Пароль
    • +
    • phone : Телефон
    • +
    • photo : Фотографія
    • +
    • role : Роль
    • +
    • state : Статус
    • +
    • thislogin : Цей сайт, в UNIX time format
    • +
    • username : Логін
    • +
    • zip : Поштовий індекс
    • +
    + +

    math

    +

    - Використовувати обчислення, такі, як - * + /.

    +

    "?" символ замінюється поточним значенням розширення, але також можна використовувати вкладені теги.

    +
    [+price:math=`?*[+curs+]`+] 
    + +

    ifempty

    +

    - Використовувати "інше значення" якщо значення placeholder або templatevar порожнє.

    +
    [*longtitle:ifempty=`[*pagetitle*]`*]
    + +

    select

    +

    - Приймає значення, залежно від значень placeholder або templatevar.

    +
    [+placeholder:select=`0=OFF&1=ON&2=UNKNOWN`+]
    + +

    Умовні вирази

    +

    is - одно (==)

    +

    - аліаси: eq

    +

    ne - не одно (!=)

    +

    - аліаси: isnot, isnt

    +

    eg - більше або одно (>=)

    +

    - аліаси: isgt

    +

    el - менше або одно (<=)

    +

    - аліаси: islt

    +

    gt - більше (>)

    +

    lt - менше (<) + +

    mo=`Webgroups`

    +

    - аліаси: isinrole, ir, memberof

    +

    Приймає як параметр розділений комами список веб-груп і повертає значення true/false залежно від того, чи належить поточний користувач до будь-якої з цих груп чи ні (замінює собою модифікатор "inrole" , який необхідно було поєднувати з умовним оператором).

    +
    [+phx:mo=`Адміністратори`:then=`Я адмін`:else=`Я простий смертний`+]
    + +

    if=`value`

    +

    - Приймає як параметр змінну для порівняння. Також може бути використане у поєднанні з :or або :and.

    +
    [+phx:if=`[+price+]`:gt=`0`:then=`Ціна: [+price+]`+]
    + +

    or

    +

    - Логічне АБО (перевіряється, чи вірна перша чи друга умова).

    +
    [+phx:if=`[*id*]`:is=`2`:or:is=`3`:then=`{{Chunk}}`:else =`{{OtherChunk}}`+]
    + +

    and

    +

    - Логічне І (перевіряється, чи правильні обидві умови).

    +
    [+phx:if=`[!UltimateParent!]`:is=`1`:and:isnot=`[*id*]`:then=`{{ChildChunk} }`:else=`{{ParentChunk}}`+]
    + +

    then=`template`

    +

    - Значення template відображається, коли всі умови правильні. Тут можна вказати виклик {{чанка}}, [[сніппета]] або чистий HTML.

    +

    else=`template`

    +

    - Значення template відображається, коли всі умови не правильні. Тут можна вказати виклик {{чанка}}, [[сніппета]] або чистий HTML.

    + +

    show

    +

    - Використовується подібно до then, але як шаблон для виведення використовується вихідне значення. Виконується, якщо умови правильні.

    +
    [+myplaceholder:len:gt=`3`:show+]
    + + +
    +[+myplaceholder:is=`myvalue`:then=`Правильно`:else=`Неправильно`+]
    +
    +
    +[+myplaceholder:isnot=`myvalue`:then=`Правильно`:else=`Неправильно`+]
    +[+myplaceholder:is=`othervalue`:then=`Правильно`:else=`Неправильно`+]
    +
    +
    +[+myplaceholder:is=`2`:then=``:else=``+]
    +
    +
    +[+myplaceholder:gt=`1`:then=`Yes`:else=`No`+]
    +[+myplaceholder:lt=`3`:and:gt=`1`:then=`Yes`:else=`No`+]
    +[+myplaceholder:lt=`[+someplaceholder+]`:then=`Yes`:else=`No`+]
    +[+myplaceholder:islt=`2`:then=`Yes`:else=`No`+]
    +[+myplaceholder:isnot=`2`:or:lt=`3`:then=`Yes`:else=`No`+]
    +
    +
    +[+myplaceholder:isnot=`2`:then=`Yes`:else=`No`+]
    +[+myplaceholder:gt=`[+someplaceholder+]`:then=`Yes`:else=`No`+]
    +[+myplaceholder:lt=`2`:then=`Yes`:else=`No`+]
    +[+myplaceholder:gt=`2`:then=`Yes`:else=`No`+]
    +[+myplaceholder:lt=`1`:then=`Yes`:else=`No`+]
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..cd7b4773 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/01_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,72 @@ +Основний шаблон блока повинен бути знайдений для ключа `owner`. Крім нього, масив повинен містити шаблони для кожної групи полів, і може містити шаблони для полів, які мають властивість `elements` (це поля типу `dropdown`, `checkbox`, `radio`). У таких шаблонах доступні вибрані значення властивості `elements`. + +Наприклад, якщо у масиві полів використовується група `images`, то в шаблонах має бути визначений елемент із ключем `images`, який буде містити або рядок шаблону: + +```php +'images' => '[+title+]' +``` + +або асоціативний масив шаблонів: + +```php +'images' => [ + 'item' => '[+title+]', + 'thumb' => '
    ', +], +``` + +У другому випадку виведення цих елементів у батьківському шаблоні можна використовувати як `[+images.item+]` і `[+images.thumb+]`. + +#### Плейсхолдери + +Як плейсхолдери можуть використовуватися імена полів (наприклад `[+title+]`), імена групових полів (наприклад `[+images+]`, `[+images.thumb+]`). + +У шаблонах для полів вибору `dropdown`, `checkbox`, `radio` доступні плейсхолдери `[+value+]` і `[+title+]`. + +Також у шаблоні 'owner' доступні плейсхолдери `[+index+]` і `[+iteration+]`, а в групових полях та полях вибору - `[+{имя_группы_поля}_index+]` і `[+{имя_группы_поля}_iteration+]`. + +#### Джерела шаблонів + +Розмітку можна вказати у самому значенні масиву, як показано у прикладах вище. + +Можлива вказівка імені чанка, у якому знаходиться потрібний шаблон. Для цього потрібно використати прив'язку `@CHUNK`, наприклад: + +```php +'checkbox' => '@CHUNK all_fields_checkboxes', +``` + +Також можливе підвантаження шаблону з файлу, наприклад: + +```php +'owner' => '@FILE pagebuilder/all_fields.tpl', +``` + +У цьому прикладі файл шаблону буде завантажено з `MODX_BASE_PATH . "assets/templates/pagebuilder/all_fields.tpl"`. Взагалі файл шукається в наступних каталогах: +``` +assets/tvs/ +assets/chunks/ +assets/templates/ +``` + +Або можна вказати повний шлях від кореня сайту. Перший слеш не вказується. + +#### Групи шаблонів + +Шаблони можна групувати, щоб під час виводу використовувати різні групи шаблонів з параметром `&templates`. Наприклад, якщо вказати наступну конфігурацію блоку: + +```php +'templates' => [ + 'owner' => '@CHUNK full_owner', + 'images' => '@CHUNK full_images' + + 'anchors' => [ + 'owner' => '@CHUNK link_owner', + ], +], +``` + +то виклик сніпета з параметром `&templates`, рівним `anchors`, буде використовувати для виведення шаблони, які визначені в групі `anchors`: + +``` +[[PageBuilder? &templates=`anchors`]] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/02_\320\242\320\270\320\277\320\270_\320\277\320\276\320\273\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/02_\320\242\320\270\320\277\320\270_\320\277\320\276\320\273\321\226\320\262.md" new file mode 100644 index 00000000..927ca23a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/02_\320\242\320\270\320\277\320\270_\320\277\320\276\320\273\321\226\320\262.md" @@ -0,0 +1,67 @@ +#### Структура масиву для опису поля + + + + + + + + + + + + +
    КлючЗначення
    captionНазва поля, яку бачить менеджер. Не обов'язково
    typeТип поля, див. нижче
    theme + +Тема редактора для поля `richtext`, доступні значення можна переглянути у конфігурації Evolution CMS, на вкладці "Інтерфейс" + +
    options + +Додаткові опції для поля `richtext`, значення можна переглянути тут + +
    fields + +Вкладені поля для типу `group` + +
    height + +Висота поля, із зазначенням одиниць виміру, наприклад `150px`. Доступно для типу поля `textarea`. + +Для полів `richtext` вказується у складі опцій редактора, у ключі `options` + +
    elements + +Можливі значення для поля вибору. Доступні для полів `dropdown`, `radio`, `checkbox`, `imageradio`, `imagecheckbox`. Можуть бути представлені у вигляді масиву `ключ => значення`, або у вигляді рядка у доступному форматі Evolution CMS (`@SELECT` та ін. працюють). + +
    layout + +Вид розташування варіантів для полів `radio`, `checkbox`, `imageradio` та `imagecheckbox`, або вид розташування полів для типу `group`. Можливі значення - `vertical` (за замовчуванням) та `horizontal`. Для типу `group` також є значення `gallery`. + +
    default + +Значення за замовчуванням. Для типу поля `checkbox` може бути масивом значень. + +Можлива вказівка у форматі `1||2||3`, та використання прив'язок `@SELECT`, `@EVAL` и пр. + +
    + +#### Типи полів + + + + + + + + + + + + + + +
    ЗначенняОписание
    textОднорядкове текстове поле
    imageТекстове поле з мініатюрою та кнопкою для вибору зображенняТекстовий редактор
    richtextТекстовий редактор TinyMCE 4
    textareaБагаторядне текстове поле
    dateТекстове поле з календарем, що випадає, для вибору дати
    dropdownВипадаючий список
    checkboxПрапорці, дозволяє вибрати кілька варіантів із представлених
    radioПеремикачі дозволяють вибрати тільки один варіант
    imagecheckboxТе саме, що й checkbox, але замість тексту – зображення. У масиві elements як значення повинні бути адреси зображень.
    imageradioТе саме, що і radio, але замість тексту – зображення. У масиві elements як значення повинні бути адреси зображень.
    group + +Група полів обов'язково повинні бути визначені вкладені поля в ключі `fields` + +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\321\201\320\275\321\226\320\277\320\265\321\202\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\321\201\320\275\321\226\320\277\320\265\321\202\320\260.md" new file mode 100644 index 00000000..5651c494 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\321\201\320\275\321\226\320\277\320\265\321\202\320\260.md" @@ -0,0 +1,24 @@ +Для виведення заповнених блоків використовується сниппет PageBuilder з параметрами: + + + + + + + + + + +< /tr> +
    Ім'я параметраЗначення за замовчуваннямМожливі значення
    docidПоточний документІдентифікатор будь-якого існуючого документа, ціле число
    containerdefaultІм'я контейнера або кілька через кому
    blocks* + +Список блоків через кому, без пробілів. Береться ім'я конфігураційного файлу без розширення (Наприклад, `all_fields,groups`). Якщо вказати `*`, фільтрація на ім'я зроблена не буде +
    wrapTpl[+wrap+]Ім'я чанка, що містить шаблон-обгортку для списку блоків виведеного контейнера
    templatesІдентифікатор групи шаблонів, які будуть використовуватись для виводу. Повинен бути визначений у конфігурації кожного блоку, що виводиться.
    offset0Число блоків, що пропускаються, з початку виведення
    limit0Число блоків для виведення, або 0 - для виведення всіх
    renderTotemplates + +Вид виводу:
    +`templates` - виведення шаблонів,
    +`structure` - вивід у вигляді структури з ключами `name` (ім'я конфіга), `index`, `iteration`, `config` (конфігурація блоку), `data` - значення,
    +`array` - виведення простого масиву зі значеннями блоків,
    +`json` - висновок у вигляді json. + +
    giveToЯкщо параметр заданий, то результат роботи буде переданий у зазначений у цьому параметрі сніпет, а потім буде виведений результат роботи цього сніпета
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\320\277\320\273\320\260\320\263\321\226\320\275\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\320\277\320\273\320\260\320\263\321\226\320\275\320\260.md" new file mode 100644 index 00000000..0bad74b6 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\320\277\320\273\320\260\320\263\321\226\320\275\320\260.md" @@ -0,0 +1,21 @@ +Плагін відповідає за виведення форми редагування блоків. Параметри плагіна та конфігурації контейнерів практично ідентичні один одному. + + + + + +
    Ім'я параметраЗначення за замовчуваннямМожливі значення
    tabNamePage BuilderНазва вкладки на сторінці редагування ресурсу, в якій буде виводитися форма (або заголовок блоку)
    addTypedropdown + +Вид секції для додавання нових блоків може мати значення `dropdown`, `icons`, `images`. + +Для значення `icons` у конфігурації кожного блоку має бути визначений ключ `icon`, що містить клас іконки. + +Для значення `images` має бути визначений ключ `image` з адресою зображення (макс. 80х60) + +
    placementtab + +Розміщення форми: `tab` - в окремій вкладці, `content` - під вмістом ресурсу, `tv` - замість tv-параметра (тільки для використання у файлі конфігурації контейнера) + +
    + +Параметри, зазначені в налаштуваннях плагіна, застосовуються до контейнера за замовчуванням. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/05_\320\237\320\276\320\264\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/05_\320\237\320\276\320\264\321\226\321\227.md" new file mode 100644 index 00000000..2b34d244 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/05_\320\237\320\276\320\264\321\226\321\227.md" @@ -0,0 +1,24 @@ +Під час встановлення PageBuilder створює такі події, які можуть використовуватися для кастомізації: + +#### OnPBContainerRender + +Ця подія викликається після відображення форми редагування контейнера, результат просто додається у висновок. + +Параметри події: + + + + + +
    nameІм'я контейнера
    containerКонфігурація контейнера
    configsКонфігурація доступних у контейнері блоків
    blocksЗаповнені блоки
    + +#### OnPBFieldRender + +Ця подія викликається після відображення кожного поля, результат додається у висновок. + +Параметри події: + + + + +
    nameІм'я поля
    fieldКонфігурація поля
    valueЗначення поля
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270_\320\272\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270_\320\272\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\227.md" new file mode 100644 index 00000000..a4b7dcb3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/06_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270_\320\272\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\227.md" @@ -0,0 +1,95 @@ +Приклади конфігурації можна знайти тут. (Щоб приклади блоків стали доступними для вибору, необхідно перейменувати файли *.php.sample в *.php) + +### Приклад 1 + +У цьому прикладі створюється контентний блок з однорядковими та багаторядковими текстовими полями, який буде виводитися в шаблонах з ідентифікатором `2` під ім'ям `Example 1`: + +```php + 'Example 1', + 'show_in_templates' => 2, + 'container' => 'default', + 'templates' => [ + 'owner' => ' +
    Text:
    [+text+]
    +
    Textarea:
    [+textarea+]
    + ', + ], + 'fields' => [ + 'text' => [ + 'caption' => 'Text', + 'type' => 'text', + ], + 'textarea' => [ + 'caption' => 'Textarea', + 'type' => 'textarea', + 'default' => 'Default content for textarea', + 'height' => '80px', + ], + ], + ]; +``` + +### Приклад 2 + +У наступному прикладі контентний блок міститиме однорядкове поле для заголовка, дату та список зображень. +Основний шаблон виведення буде завантажений із чанка з ім'ям `example2`. + +Блок буде виводитися тільки в документах з ідентифікаторами `37` та `41` під ім'ям `Example 2` у контейнерах `default` і `slider`: + +```php + 'Example 2', + 'show_in_docs' => [37, 41], + 'container' => ['default', 'slider'], + 'templates' => [ + 'owner' => '@CHUNK example2', + 'images' => '', + ], + 'fields' => [ + 'text' => [ + 'caption' => 'Text', + 'type' => 'text', + ], + 'date' => [ + 'caption' => 'Date', + 'type' => 'date', + ], + 'images' => [ + 'caption' => 'Images', + 'type' => 'group', + 'fields' => [ + 'image' => [ + 'caption' => 'Image', + 'type' => 'image', + ], + ], + ], + ], + ]; +``` + +### Приклад 3 + +Якщо конфігурації блоків не вказано контейнер, вони виводяться в контейнері `default`. Щоб додати новий контейнер, потрібно створити в папці `configs` файл `container.<ім'я контейнера>.php` з подібним змістом: + +```php + 'Page Builder Container', + 'addType' => 'images', + 'placement' => 'content', + 'templates' => [ + 'owner' => ' +
    + Container: + [+wrap+] +
    + ', + ], + ]; +``` + +Цей конфіг створить контейнер, який буде виведений під контентом ресурсу із зображеннями для додавання блоків. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/07_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270_\321\201\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\272\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/07_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270_\321\201\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\272\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\321\226\320\262.md" new file mode 100644 index 00000000..3a068773 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/07_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270_\321\201\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\272\320\276\320\275\321\202\320\265\320\271\320\275\320\265\321\200\321\226\320\262.md" @@ -0,0 +1,70 @@ +Допустимо, варто завдання вивести на сторінці слайдер у шапці зі слайдами з різним наповненням, а також набір блоків заповнення тіла сторінки. + +У слайдері у нас буде можливість вибрати блоки `image`, `image-text`, а в тілі сторінки - `text`, `image-text`, `2col_text_photo`. + +Для початку визначимося з контейнерами: для слайдера створимо контейнер `slider`, він буде розташований в окремій вкладці з ім'ям "Слайдер", з мініатюрами зображень для додавання блоків: + +```php + 'Слайдер', + 'addType' => 'images', + 'placement' => 'tab', + 'templates' => [ + 'owner' => ' +
    + [+wrap+] +
    + ', + ], +]; +``` + +Для тіла сторінки використовуватимемо розташування замість tv-параметра. Для цього створимо новий tv-параметр `page_body` з типом введення - `pagebuilder`. Потім створимо файл конфігурації цього контейнера: + +```php + 'Тіло сторінки', + 'addType' => 'images', + 'placement' => 'tv', + 'templates' => [ + 'owner' => ' +
    + [+wrap+] +
    + ', + ], +]; +``` + +Важливо, щоб ім'я tv-параметра збігалося з ім'ям контейнера, і опція `placement` дорівнювала `tv`. + +Переходимо до блоків. Вони всі йдуть у постачанні разом із плагіном, нам залишилося тільки перейменувати їх та прив'язати до контейнерів. + +Спочатку перейменуйте файли конфігурації блоків, видаливши кінцівку `.sample`. + +Потім додайте до кожного файлу рядок прив'язки до контейнера. Для блоку `image`: +```php +'container' => 'slider', +``` + +Для блоків `text` і `2col_text_photo`: +```php +'container' => 'page_body', +``` + +Для блока `image-text`, так як він буде прив'язаний до двох контейнерів, рядок матиме такий вигляд: +```php +'container' => ['slider', 'page_body'], +``` + +На цьому налаштування адміністративної частини закінчилися, даних дій достатньо, щоб у всіх документах з'явилася форма заповнення двох контейнерів, у тв-параметрах та окремій вкладці. + +Для виведення контейнерів потрібно додати наступний код до шаблонів: +``` +[[PageBuilder? &container=`slider`]] +[[PageBuilder? &container=`page_body`]] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/index.md" new file mode 100644 index 00000000..176d5c3b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/PageBuilder/index.md" @@ -0,0 +1,67 @@ +Автор: mnoskov + + + +Плагін дозволяє розробнику визначити набір блоків з певною розміткою та списком полів, щоб контент-менеджер використовував ті блоки, які вважає за потрібне, зі своїм наповненням. + +Після встановлення потрібно створити файли конфігурації, або перейменувати файли `*.php.sample` в `*.php`. На панелі адміністрування плагін додає нову вкладку на сторінці редагування ресурсу. Для виведення результатів використовується сніппет `[[PageBuilder]]`. + +Конфігурація блоків береться з папки `config`. Для створення нового блоку потрібно створити у цій папці файл `<имя конфига>.php`, який має повернути асоціативний масив. Для створення контейнера потрібно створити файл `container.<имя контейнера>.php`. Структура масиву така: + + + + + + + + + + + + + + + + + + + + +
    КлючЗначення
    titleНазва блоку, видиму менеджеру при заповненні
    containerІм'я контейнера (якщо кілька масив імен), в якому буде виводиться блок.
    fields +Асоціативний масив полів, у яких ключами є ідентифікатори полів, а значеннями - масиви опцій цих полів. + +Можливі типи полів та опції наведені нижче. +
    show_in_templatesМасив ідентифікаторів шаблонів, для яких доступні редагування та виведення блоків
    hide_in_docsМасив ідентифікаторів документів, для яких редагування та висновок недоступні
    show_in_docsМасив ідентифікаторів документів, для яких доступні редагування та виведення блоків. + +Якщо цей параметр вказаний, то hide_in_docs не береться до уваги. + +Якщо не вказано жодного з параметрів, що обмежують доступ, блоки будуть доступні у всіх документах.
    orderПорядок сортування в секції додавання блоку або порядок сортування контейнерів (вкладок). Цей параметр не впливає на сортування самих блоків!
    templates + +Асоціативний масив, що містить шаблон для ключа owner, а також шаблони для кожної групи полів. + +Опис методів створення шаблонів дивіться тут. + +
    icon + + Клас іконки, який виводитиметься в секції для додавання нового блоку, якщо в параметрах плагіна значення `&addType` встановлено в `icons` + +Наприклад, якщо задати клас 'fa fa-cogs', то в інтерфейс буде виведено наступне: +```html + +``` + +
    image + + Зображення, яке буде виводитися в секції для додавання нового блоку, якщо параметри плагіна значення `&addType` встановлено в `images`. + +Зображення буде оброблено сниппетом `phpthumb` з параметром `w=80` + +
    prepareІм'я сніпету або функція, яка буде викликана перед виведенням даних. Наприклад: + +```php +'prepare' => function(&$options, &$values) { + ... +}, +``` + +Параметри для функції та сніпета однакові: `options` - конфігурація контейнера, `values` - значення полів.
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..9fd96d68 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,91 @@ + + +

    Personalize: Параметри

    +Параметри сніпета Personalize для перевірки авторизації веб-користувача або менеджера. +
    +
    +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: ні
    +Примітка:
    +Приклад: +
    &yesChunk=`Link`
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: ні
    +Примітка:
    +Приклад: +
    &noChunk=`Register`
    +
    +
    +
    +
    + +
    +
    +Формат:
    +Значення за замовчуванню: ні
    +Примітка: Використовується тільки в чанці yesChunk
    +Приклад: +
    &ph=`name`
    +
    +
    +
    +
    + +
    +
    +Формат: web | mgr
    +Значення за замовчуванню: web
    +Примітка:
    +Приклад: +
    &context=`mgr`
    +
    +
    +
    +
    + +
    +
    +Формат:
    +Значення за замовчуванню:
    +Примітка:
    +Приклад: +
    &yesTV=``
    +
    +
    +
    +
    + +
    +
    +Формат:
    +Значення за замовчуванню:
    +Примітка:
    +Приклад: +
    &noTV=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..ada97deb --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,6 @@ + + +

    Personalize: Приклади

    +Приклади сніпета Personalize для перевірки авторизації веб-користувача або менеджера. +
    +
    [[Personalize? &yesChunk=`Link` &noChunk=`Register` &ph=`name`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/index.md" new file mode 100644 index 00000000..ad9393f4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Personalize/index.md" @@ -0,0 +1,4 @@ + + +

    Personalize Перевірка на авторизацію користувача

    +Сніпет для перевірки авторизації веб-користувача або менеджера. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..b72ffd6b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,321 @@ + + +

    Reflect: Параметри

    +Параметри сніпета Reflect - для створення архівів , статей, зображеннь і т.д. +
    +
    +
    + +
    +
    + Формат: путь
    + Значення по замовчуванню: assets/snippets/reflect/
    + Примітка:
    + Приклад: +
    &reflect_base=``
    +
    +
    +
    + +
    + +
    +
    + Формат: Числа або букви англійського алфавіту. Рядок чутливий до реєстру.
    + Значення по замовчуванню: нет
    + Примітка:
    + Приклад: +
    &id=`wp`
    +
    +
    +
    + +
    + +
    +
    + Формат: default | wordpress | CONFIG_NAME (Шлях або @FILE)
    + Значення по замовчуванню: default
    + Примітка: Файл конфігураціх повинен знаходитись в папці reflect/configs і називатися name.config.php
    + Приклад: +
    &config=`wordpress`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення по замовчуванню: 0
    + Примітка:
    + Приклад: +
    &getDocuments=`1`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення по замовчуванню: 1
    + Примітка:
    + Приклад: +
    &showItems=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення по замовчуванню: 1
    + Примітка:
    + Приклад: +
    &groupByYears=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: ID документа
    + Значення по замовчуванню: текущий документ
    + Примітка: ID страницы с вызовом Ditto, где будет происходить сортировка: extenders=`dateFilter`
    + Приклад: +
    &targetID=`55`
    +
    +
    +
    + +
    + +
    +
    + Формат: createdon, pub_date, editedon или TV-параметр содержащий дату
    + Значення по замовчуванню: createdon
    + Примітка:
    + Приклад: +
    &dateSource=`pub_date`
    +
    +
    +
    + +
    + +
    +
    + Формат: Будь-який валідний формат часу, який відповідає правилам функції PHP - strftime
    + Значення по замовчуванню: %d-%b-%y %H:%M
    + Примітка: Визначає формат часу, який виводиться за допомогою плейсхолдера [+date+]
    + Приклад: +
    &dateFormat=`%d.%m.%Y`
    +
    +
    +
    + +
    + +
    +
    + Формат: ASC | DESC
    + Значення по замовчуванню: DESC
    + Примітка:
    + Приклад: +
    &yearSortDir=`ASC`
    +
    +
    +
    + +
    + +
    +
    + Формат: ASC | DESC
    + Значення по замовчуванню: ASC
    + Примітка:
    + Приклад: +
    &monthSortDir=`DESC`
    +
    +
    +
    + +
    + +
    +
    + Формат: число
    + Значення по замовчуванню: 0
    + Примітка:
    + Приклад: +
    &start=`5`
    +
    +
    +
    + +
    + +
    +
    + Формат: 0 | 1
    + Значення по замовчуванню: 1
    + Примітка:
    + Приклад: +
    &phx=`0`
    +
    +
    +
    + +
    + +
    +
    + Формат: Будь-які валідні параметри Ditto в форматі name:value разділені (|)
    + Значення по замовчуванню: нет
    + Примітка: Цей параметр необхідний тільки для config, start, і phx, тепер ви можете просто використовувати параметри, ніби як би Reflect був Ditto
    + Приклад: +
    &dittoSnippetParameters=`parents:69`
    +
    +
    +
    + +
    + +
    +
    + Формат: Будь-яка валідка назва сніппета
    + Значення по замовчуванню: Ditto
    + Примітка:
    + Приклад: +
    &source=``
    +
    +
    +
    + +
    + +
    +
    + Формат: будь-яке валідне им'я чанка | @CODE | @FILE
    + Значення по замовчуванню: default.tempates.php
    + Примітка:
    + Приклад: +
    &tplContainer=``
    +
    +
    +
    + +
    + +
    +
    + Формат: будь-яке валідне им'я чанка | @CODE | @FILE
    + Значення по замовчуванню: default.tempates.php
    + Примітка:
    + Приклад: +
    &tplYear=``
    +
    +
    +
    + +
    + +
    +
    + Формат: будь-яке валідне им'я чанка | @CODE | @FILE
    + Значення по замовчуванню: default.tempates.php
    + Примітка:
    + Приклад: +
    &tplYearInner=``
    +
    +
    +
    + +
    + +
    +
    + Формат: будь-яке валідне им'я чанка | @CODE | @FILE
    + Значення по замовчуванню: default.tempates.php
    + Примітка:
    + Приклад: +
    &tplMonth=``
    +
    +
    +
    + +
    + +
    +
    + Формат: будь-яку валідне им'я чанка | @CODE | @FILE
    + Значення по замовчуванню: default.tempates.php
    + Примітка:
    + Приклад: +
    &tplMonthInner=``
    +
    +
    +
    + +
    + +
    +
    + Формат: будь-яке валідне им'я чанка | @CODE | @FILE
    + Значення по замовчуванню: default.tempates.php
    + Примітка:
    + Приклад: +
    &tplItem=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..576c166d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,11 @@ +

    Reflect: Приклади

    +Приклади сніпета Reflect - для створення архіву новин, статей, зображеннь і т.д. +
    +

    Виклик сніпета Reflect виконується на сторінці, на якій необхідно вивести архів по рокам. Розміщаємо приблизно такий виклик сніпета:

    +
    [!Reflect? &config=`wordpress` &id=`wp` &targetID=`111` &dittoSnippetParameters=`parents:100` &getDocuments=`1`!]
    +

    де:

    +

    config=`wordpress` – им'я конфігурації сніпета Reflect;
    id=`wp` – унікальний идентифікатор для сніпета Ditto;
    targetID=`111` – ID ресурса, в який потрібно виводити результати. Якщо результати виводяться на цій же сторінці, то параметр можна не вказувати;
    dittoSnippetParameters=`parents:100` – параметр Ditto ‘parents’ за значенням 100, тобто яку папку сортувати по датам.

    +

    Створюємо документ з ID 111 (вказуємо цей ID в targetID) і вставляємо такий код:

    +
    [+wp_month+] [+wp_day+] [+wp_year+]
    +
    +[!Ditto? &id=`wp` &extenders=`dateFilter` &parents=`100`!]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/index.md" new file mode 100644 index 00000000..6aeb3261 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Reflect/index.md" @@ -0,0 +1,4 @@ + + +

    Reflect створення архіву новин

    +Сніпет для створення архивів новин, статей, зображеннь і т.д. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Sass/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Sass/index.md" new file mode 100644 index 00000000..f6de4cec --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Sass/index.md" @@ -0,0 +1,90 @@ + + +

    Sass плагін для MODX

    +Зручний інструмент для верстки, створення і розуміння роботи плагінів в MODx. +

    Початківцям: зручний інструмент для верстки, створення і розуміння роботи плагінів в MODX.

    +

    Sass – правильний CSS

    +

    Більшість із того (якщо не все), що не вистачало старому доброму CSS (аж до CSS3), реалізовано в розширеному форматі написання каскадних таблиць стилів – Sass. Недарма прихильники Ruby on Rails (звідки бере корені Sass) ласкаво називають його «синтаксичний цукор».

    +

    Після того, як спробуєш Sass «на смак», стає тяжко відмахнутися від идеї ввести його в бойовий арсенал кожного верстальника. Адже до чого ж зручно, наприклад, задати в $змінних значення кольорів корпоративної гами замовника, щоб, якщо йому раптом знадобиться, з ще більшою легкістю «зробити сайт бальш зеленим»!

    +

    Не відстаємо від тенденцій сучасності

    +

    Для тих, хто програмує на PHP в умовах CMS MODX, пропонується створити плагін, який буде слідкувати за наявністю і змінами в sass-файлах і автоматично (ре)генерувати відповідні css-файли, які підключаються в шаблоні.

    +

    Використовуємо пошук: «php sass parser»

    +

    Одна із реализацій потрібного нам функціонала є в надрах бібліотеки phamlp. В складі phamlp присутня й інша «Ruby-цукерка» – haml (чудова заміна для HTML), але це істория на перспективу.

    +

    Плагін для MODX

    +

    Декілька простих кроків:

    +

    1. Завантажуємо архів з бібліотекою phamlp

    +

    2. Архів розпаковуємо в «assets/plugins/phamlp» (можна без папки haml)

    +

    2. В «Елементах» створюємо новий плагін «SASS»

    +

    4. Копіюємо і вставляємо код плагіна:

    +
    +// директорія з стилями (в кінці слеш обов'язково)
    +$style_dir = MODX_BASE_PATH.'assets/css/'; 
    +
    +// скування вміст
    +$files = scandir(rtrim($style_dir,'/'));
    +
    +// вибір файлів с розширенням sass
    +foreach ($files as $sass_file)
    +if (is_file($style_dir.$sass_file) && (strtolower(pathinfo($style_dir.$sass_file,PATHINFO_EXTENSION))=='sass')) {
    +	// обчислення перевірочного md5 хеша вмісту .sass файла
    +	$sass_hash = hash('md5',file_get_contents($style_dir.$sass_file));
    +
    +	// при відсутності записаного (в .sasshash файл) хеша або його розбіжності з записаним - генерація css
    +	if (!file_exists($style_dir.$sass_file.'hash')||($sass_hash!=file_get_contents($style_dir.$sass_file.'hash'))) {
    +		// підключення бібліотеки phamlp
    +		include_once(MODX_BASE_PATH.'assets/plugins/phamlp/sass/SassParser.php');
    +
    +		// ініціалізація і налаштування класу работи з sass форматом 
    +		$sass = new SassParser(
    +			array(
    +				'cache'=>false,
    +				'style'=>'expanded',
    +				'vendor_properties'=>array(
    +					'border-radius' => array(
    +						'-moz-border-radius',
    +						'-webkit-border-radius',
    +						'-khtml-border-radius'
    +					),
    +						'border-top-right-radius' => array(
    +						'-moz-border-radius-topright',
    +						'-webkit-border-top-right-radius',
    +						'-khtml-border-top-right-radius'
    +					),
    +					'border-bottom-right-radius' => array(
    +						'-moz-border-radius-bottomright', 
    +						'-webkit-border-bottom-right-radius',
    +						'-khtml-border-bottom-right-radius'
    +					),
    +					'border-bottom-left-radius' => array(
    +						'-moz-border-radius-bottomleft',
    +						'-webkit-border-bottom-left-radius',
    +						'-khtml-border-bottom-left-radius'
    +					),
    +					'border-top-left-radius' => array(
    +						'-moz-border-radius-topleft',
    +						'-webkit-border-top-left-radius',
    +						'-khtml-border-top-left-radius'
    +					),
    +					'box-shadow' => array('-moz-box-shadow', '-webkit-box-shadow'),
    +					'box-sizing' => array('-moz-box-sizing', '-webkit-box-sizing'),
    +					'opacity' => array('-moz-opacity', '-webkit-opacity', '-khtml-opacity'),
    +				)
    +			)
    +		);
    +
    +		// генерація css файла 
    +		file_put_contents( $style_dir.substr($sass_file,0,-4).'css', $sass->toCss($style_dir.$sass_file) );
    +
    +		// запис хеша
    +		file_put_contents( $style_dir.$sass_file.'hash', $sass_hash );
    +	}
    +}
    +
    +

    5. На вкладці «Системні події» ставим галочку навпроти OnWebPageInit. Це означає запуск коду плагіна під час ініціалізації веб-сторінки (легше кажучи – кожний раз, коли хто-небудь загружає будь-яку із сторінок сайту). З тим же успіхом можна використовувати й інші події MODX, що відбуваються в цей час (OnWebPagePrerender, OnParseDocument).

    +

    6. Зберігаємо плагін

    +

    Працюємо з стилями в Sass-форматі

    +

    Звичайно, для цього підійде навіть штатний веб-редактор MODX (або завантаження по FTP файлах, створених в Блокноті), але якщо вже розширювати инструментарій веб-розробки, то краще відкрити для себе можливості однієї із інтегрованих середовищ розробки (IDE) з потужним набором вбудованих засобів (FTP-менеджер, підсвічування синтаксису, управління версіями і т.п.).

    +

    В директорії «assets/css» (як вказано в змінній $style_dir) создаємо файл с разширенням .sass. Для початку, в цьому файлі можна зберегти приклади з вікіпедії.

    +

    Відкриваємо сайт в браузері або оновлюємо відкриту сторінку. В момент виникнення події OnWebPageInit запуститься плагін «SASS», який при скануванні виявить свіжий sass-файл, і згенерує його css-версію, яка з цього момента доступна для завантаження в браузери користувачів з усього світу.

    +

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

    +

    UPD: MODX Evo і MODX Revo мають одинакові принципи створення плагінів і назви вказаних системних подій.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Selector/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Selector/index.md" new file mode 100644 index 00000000..4a208cfc --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Selector/index.md" @@ -0,0 +1,40 @@ +## Selector - custom TV для складання списку документів в Evolution CMS. ## +Selector є заміною для mm_ddSelectDocuments. + +На відміну від mm_ddSelectDocuments: +- приживається з SimpleGallery; +- завдяки DocLister дозволяє вибирати дані для списку як завгодно і звідки завгодно; +- список результатів пошуку можна оформляти по-різному (реалізовано за допомогою prepare в DocLister); +- код повністю відкритий. + +Для роботи необхідний DocLister. + +Після встановлення доповнення з магазину додатків необхідно у потрібного TV параметра обрати тип вводу "selector". +Компонент потребує деякого налаштування під себе. + +Припустимо, є tv-параметр з назвою `related`, для зберігання списку схожих товарів. Щоб його поведінка відрізнялася від базового, потрібко створити в файлі `assets/tvs/selector/lib/related.controller.class.php` клас: + +``` +dlParams['parents'] = 5; + $this->dlParams['addWhereList'] = 'c.published = 1'; + } +} +``` + +Слід звернути увагу, що параметр – `related`, назва файлу – `related.controller.class.php`, а назва класу – `RelatedController` (з великої букви). + +Можна довантажувати потрібний клас вручну за допомогою плагіна на OnManagerPageInit. В цьому випадку значення має тільки правильну назву класа. +**Важливо:** є обмеження на назву tv-параметру: допускаються тільки латинські букви і символ підкреслювання. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/01_\320\241\320\275\321\226\320\277\320\265\321\202_Shopkeeper.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/01_\320\241\320\275\321\226\320\277\320\265\321\202_Shopkeeper.md" new file mode 100644 index 00000000..2c09027e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/01_\320\241\320\275\321\226\320\277\320\265\321\202_Shopkeeper.md" @@ -0,0 +1,434 @@ +## Опис ## + +Сніпет виводить кошик замовлень двох типіп (розширений і простий). + +Сніпет можна викликати на сторінці декілька разів, але кошик виводиться тільки в місці першого виклика. Другий і наступні виклики ігноруються. + +**Приклад:** +*Якщо кошик на сторінках каталогу товарів знаходиться в правій колонці шаблона, а на сторінці оформлення заказу виклик сніпета вставлений в контент сторінки, то на цій сторінці кошик буде виведений тільки в центральній колонці (в правій виклик сніпета можна не прибирати).* + +## Параметри сніпета ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОпис і значенняЗначення за замовчуваннямПримітка
    &langмоваМова системи керуванняВ данний час доступні мови:
    `russian`, `english`, `german`, `francais`
    &styleстиль кошикаdefault
    (assets/snippets/shopkeeper/style/default/)
    &style=`0` - якщо не потрібен окремий стильовий файл для кошика
    &cartType + тип кошика
    + full - розширений,
    + small - простий,
    + empty - тільки очистка кошика без виведення на сторінці +
    full 
    ¤cyвалютаруб. 
    &priceTVім'я TV-параметру, який використовується для ціни.priceЯкщо ваш TV для ціни має назву не "price", обов'язково вкажіть це ім'я в даному параметрі.
    &orderFormPageID сторінки з формою замовлення1обов'язковий параметр
    &noJQuery=`1`якщо на сайті вже використовується бібліотека JQuery0 
    &noConflict=`1`если на сайті використовується інша JS-бібліотека (не JQuery), наприклад Mootools, Prototype.0 
    &noCounterприховувати (значення `1`) або ні (значення `0`) лічильник товарів при додаванні в кошик0 
    &linkAllow=`0`Виводить назви товарів в кошику без посилань.1Якщо цей параметр вказаний (=`0`) на сторінці оформлення заказу, лист з складом замовлення і список товарів в модулі будуть без посилань.
    &stuffContCSS-селектор елемента, всередині якого знаходиться інформація про товар.div.shk-itemПриклад чанка: chunk_shopStuff.tpl
    &debug=`1`запустити отладку JavaScript-функцій (виведення інформації)0 
    &tplPathшлях до папки з чанками`assets/snippets/shopkeeper/chunks/ru/`
    &cartTplчанк з шаблоном кошика@FILE:chunk_shopCart.tplЧанк вміщає одразу 3 шаблони - для порожнього, заповненого розширеного і простого кошика.
    якщо чанки зберігаються в файлах, можно дізнатись шлях з командою "@FILE:". Якщо чанки створенні в системі управління, то вказується тільки ім'я чанка (наприклад &cartTpl=`shopCart`)
    &cartRowTplчанк шаблону рядка з інформацією товару в розширеному кошику@FILE:chunk_shopCartRow.tpl 
    &cartHelperTplчанк шаблону "хелпера" - блок, який з'являється для підтвердження дій- 
    &additDataTplчанк для додаткових параметрів товарів в кошику ([+addit_data+])- 
    &orderDataTplчанк списку товарів в звіті про замовлення ([+orderData+])-Використовується в листі з звітом про замовлення (eForm &report) і в модулі.
    &flyToCartдія при додаванні товару в кошик.
    + helper - з'являється блок з лічильником кількості товарів і летить в кошик,
    + image - в кошик летить картинка товару
    + nofly - в кошик нічого не летить; +
    `helper`При &flyToCart=`image` тег <img> повинен мати CSS-клас "shk-image"
    &noLoader=`1`не показувати прелоадер (анімаційна картинка)0 
    &excepDigitGroup=`1`розділяти числа цін в кошику на розряди1 
    &changePrice=`1`при зміні параметрів з ціною - змінюється цвна товару, а індекс з плюсом не з'являється0 
    &counterField=`1`додати до всіх полів <input name="shk-count"> (кількість товару) стрілки більше/менше0 
    &noJavaScript=`1`Робота без JavaScript.0Зверніть увагу, що в чанку "shopCart" кнопка "Пересчитать" знаходиться всередині тега "noscript". Якщо використовується режим &noJavaScript=`1`, рекомендується тег "noscript" видалити.
    &hideOnВимкнути кошик на сторінці0Зазвичай використовується в вивлику сніпета короткого виду кошику. Вказується ID сторніки з докладним видом кошика (оформление заказа). На этой странице краткий вид корзины будет отключен.
    + +## Приклади ## + +Простий виклик: +``` +[!Shopkeeper? &priceTV=`price` &orderFormPage=`10`!] +``` + +Розширений виклик: +``` +[!Shopkeeper? +&cartType=`small` +&priceTV=`price` +&orderFormPage=`10` +&changePrice=`1` +&counterField=`1` +&flyToCart=`nofly` +!] +``` + + +## Шаблони (чанки) і плейсхолдери ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Параметр сніпетаОписПлейсхолдери в шаблоніПримітка
    &cartTpl (&cartType=`full`)шаблон розширеного кошика + [+inner+] - рядок з інформацією про товар (cartRowTpl);
    + [+price_total+] - Загальна сума;
    + [+this_page_url+] - URL поточної сторінки;
    + [+empty_url+] - URL для очистки кошика;
    + [+order_page_url+] - URL сторінки оформлення замовлення;
    + [+currency+] - валюта; +
    + Приклад: chunk_shopCart.tpl +
    (містить 3 шаблони кошика)

    + <!--tpl_separator--> - роздільник шаблонів (видаляти неможна) +
    &cartTpl (&cartType=`small`)шаблон спрощеного кошика + [+price_total+] - загальна сума;
    + [+total_items+] - Число обраних товарів;
    + [+plural+] - слово "товар" в множині залежно від числа выбранних товарів;
    + [+this_page_url+] - URL поточної сторінки;
    + [+empty_url+] - URL для очистки кошика;
    + [+order_page_url+] - URL сторінки оформлення замовлення;
    + [+currency+] - валюта +
    &cartRowTplшаблон рядка з інформацією про товар в розширеному кошику + [+id+] - ID товару (документа);
    + [+name+] - назва товару;
    + [+link+] - посилання на сторінку товару;
    + [+addit_data+] - рядок з інформацією про додаткові параметри товару;
    + [+price+] - ціна;
    + [+price_total+] - ціна товару + додаткові параметри;
    + [+price_count+] - ціна товару * кількість;
    + [+currency+] - валюта;
    + [+count+] - кількість;
    + [+this_page_url+] - URL поточної сторінки;
    + [+index+] - номер товару в кошику (від нуля);
    + [+будь-який TV+] - будь-який TV-параметр, наприклад [+image+];
    + [+shk_будь-який TV+] - будь-який додатковий параметр, обраний при додаванні товарк в кошик (із [+addit_data+]), наприклад [+shk_param1+]. +
    Приклад: chunk_shopCartRow.tpl і chunk_shopCartRow2.tpl
    &additDataTplшаблон для додаткових параметрів товарів в кошику ([+addit_data+]) + [+param+] - ім'я і ціна параметру. Ціна вказується в дужках. Якщо ціна = 0, то пишеться тільки назва параметру (без дужок);
    + [+name+] - ім'я параметру;
    + [+price+] - ціна параметру; +
    Приклад: chunk_additDataTpl.tpl
    &orderDataTplшаблон списку товарів в звіті про замовлення ([+orderData+]) + Все плейсхолдери чанку &cartRowTpl

    + [+loop+], [+end_loop+] - початок і кінець рядка даних товарів (цикл). +
    Приклад: chunk_orderDataTpl.tpl
    &report (eForm)шаблон тексту листа з складу замовлення + [+orderData+] - склад замовлення (список покупок);
    + [+orderID+] - номер замовлення; +
    Приклад: chunk_shopOrderReport.tpl і chunk_shopOrderReportWebUser.tpl
    Сторінка, на якій викликається сніпет Shopkeeper + [+totalItems+] - кількість товару в кошику;
    + [+totalPrice+] - загальна ціна товару в кошику; +
    + + + +## Необхідні CSS-класи, Id і імена полів ## +Для повноцінної работи Shopkeeper необхідні наступні css-класи, id і імена полів: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ШаблонCSS-класиid HTML-елементівІмена полів s кнопокПримітка
    Шаблон виведення інформації товару + shk-item - клас "обертаючого" елементу блока з інформацією про товар;
    + shk-image - картинка товару (якщо використовується &flyToCart=`image`);
    + shk-price -клас элементу з ціною товару.
    +
    + shk-id - ім'я прихованого поля з id товару;
    + shk-count - ім'я прихованого поля з кількістю товару. +
    Приклад chunk_shopStuff.tpl
    Шаблон кошика + — + + shopCart - id "огортаючого" елемента блоку кошика;
    + butEmptyCart - id кнопки-силки очистки кошика;
    + butOrder - id посилання на сторінку оформлення товару. +
    + shk_recount - кнопка "Перерахувати".
    + +
    Приклад chunk_shopCart.tpl
    Шаблон рядка інформації про товар в кошику + shk-del - кнопка-посилання видалення товару.
    + +
    + — + + count[] - ім'я полей з кількістью товару.
    +
    Приклад chunk_shopCartRow.tpl
    Шаблон форми замовлення + — + + — + + email - поле "E-mail";
    + phone - поле "Телефон" +
    Приклад chunk_shopOrderForm.tpl і chunk_shopOrderFormWebUser.tpl
    + +CSS-класи (і id) використовуються в JS-функціях Shopkeeper'а. + + +## Поради ## +### Дві і більше ціни для одного товару ## +Для цього потрібно створити дві або більше форми (form) і в полі name="shk-id" після ID написати ім'я TV з ціною. + +**Приклад:** +``` + +``` + +При submit форми в корзині додасться ціна з TV-параметру з іменем "price2". + +### Додавання в кошик даних, не створюючи TV-параметри ### + +**Приклад:** +``` + +``` +В кошик додасться параметр, який можна виводити в месці вставки плейсхолдера `[+test+]` (виведетсья "додаткові дані"). + + +## Події для плагінів ## + +* OnSHKFrontendInit - ініціалізація сніпета Shopkeeper в зовнішній частині. +* OnSHKChangeStatus - зміна статусу замовлення. +* OnSHKOrderDescRender - виведення докладної информації про замовлення в модулі. +* OnSHKMailApprovedForPayment - відправка листа при статусі "Прийнятий до оплати". Плагін може додавати в лист додаткову інформацію `([+plugin+])`. +* OnSHKcartLoad - завантаження кошика (вивід інформації в чанку `&cartTpl - [+plugin+]`). +* OnSHKstatusSendMail - відправка листа про зміну статусу. +* OnSHKmodRenderTopLinks - вивід силок у верхній частині в модуля Shopkeeper. +* OnSHKmodPagePrint - вивід сторінки модуля. Можна використовувати для створення своєї сторінки(див. приклад OnSHKmodPagePrint_plugin_example.txt). +* OnSHKbeforeSendOrder - перед відправленням замовлення. Можна використовувати для зміни полів ($fields). +* OnSHKsaveOrder - збереження замовлення. +* OnSHKcalcTotalPrice - розрахунок загальної вартості. + +В папці shopkeeper/docs/ є приклади плагінів. + + +## "Сallback-функції" на JavaScript ## +* setCartActionsCallback - перезавантаження кошика, +* fillCartCallback - додавання товару в кошик, +* emptyCartCallback - очищення кошику. + +Просто створіть функції з такими іменами і вони будуть викликатися при відповідних діях. + + +## Приклади чанків в папці install/examples/ ## + +* chunk_shopCart.tpl - чанк кошика. Може бути використаний як значення параметру & cartTpl при виклику Shopkeeper. Чанк містить відразу 3 шаблони - для порожнього, заполненого расширеного і заполненого простого кошика. +* chunk_shopCartRow.tpl - чанк шаблону рядки з інформацією товару в розширеній кошику. +* chunk_shopCartRow2.tpl - приклад з картинкою (TV - image) и умовою PHx. +* chunk_shopStuff.tpl - чанк короткої інформації про товар. Може бути використаний як значення параметру & tpl при виклику Ditto. +* chunk_shopStuff_2.tpl - приклад з двома цінами для одного товару (продаж і прокат). +* chunk_shopToCart.tpl - може бути використаний в шаблоні сторінки докладного опису товару або можна вставляти виклик чанку `{{shopToCart}}` в візуальний редактор. +* chunk_shopCartHelper.tpl - чанк шаблону "хелпера" - блока, який з'являється для підтвердження дій. +* chunk_additDataTpl.tpl - шаблон для додаткових параметрів товарів в кошику. +* chunk_shopOrderForm.tpl - чанк форма оформлення замовлення. Може бути використаний як значення параметру &tpl при виклику eForm. +* chunk_shopOrderFormWebUser.tpl - чанк форма оформлення замовлення для зареєстрованих користувачів. +* chunk_shopOrderReport.tpl - чанк листа з інформацією про замовлення. Може бути використаний як значення параметра &report при виклику eForm. +* chunk_shopOrderReportWebUser.tpl - чанк листа з інформацією про замовлення для зареєстрованих користувачів. +* chunk_FormSignup.tpl - приклад чанка з шаблоном форми реєстрації для сніпета WebSignup. +* chunk_weblogin.tpl - приклад чанка з шаблоном форми авторизації сніпета WebLogin. +* chunk_orderDataTpl.tpl - шаблон списку товарів в звіті про замовлення `([+orderData+])` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\321\202\320\276\320\262\320\260\321\200\321\203_shk_widget.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\321\202\320\276\320\262\320\260\321\200\321\203_shk_widget.md" new file mode 100644 index 00000000..7fa670e5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270_\321\202\320\276\320\262\320\260\321\200\321\203_shk_widget.md" @@ -0,0 +1,51 @@ +Модифікатор shk_widget для плагіну PHx. + +## Опис ## +Модифікатор служить для створення віджетів (випадаючий список, радіокнопка, чекбокс) параметрів товарів в інтернет-магазині. Працює спільно з сніпетом Shopkeeper. Можна використовувати на сторінці докладного опису товару або в чанку сніпетів типу catalogView, DocLister або Ditto. + +## Встановлення ## +- Перевірити щоб файл модифікатора `install/_upload/assets/plugins/phx/modifiers/shk_widget.phx.php` був заванатжений в папку `assets/plugins/phx/modifiers` вашого сайту. +- Встановити плагін PHx + +### Приклад використовування ### +``` +[+param1:shk_widget=`radio:param1:wraptag:first_selected`+] +``` + +## Параметри модифікатора ## +- перший параметр - тип створюваного елемента. Можливі значення: select, radio, checkbox, radioimage; +- другий параметр - ім'я параметру TV; + +Далі параметри можна вводити в довільному порядку + +- first_selected - відмітити перше значення елемента; +- wraptag - обернути тегом DIV. Може використовуватися для radio і checkbox; +- desc_page - вказати, якщо параметр виводиться на сторінці товару-документа MODx. + +### Приклад: створення списку доступних кольорів, матеріалів и т.п. ### + +Тип (format) віджета radioimage служить для візуального представлення списку доступних кольорів або матеріалів для товару. Картинки кольорів, матеріалів і т.п. завантажуються за допомогою TV-image, при редагуванні товару можна вибрати їх із списку. + +- Створіть в дереві документів розділ, наприклад "Матеріали". ID цього розділу пізніше знадобиться. +- В цьому розділі створіть для кожного матеріала (кольора або т.п.) окрему сторінку. Для всіх матеріалів потрібно ввести свою назву. +- Якщо для цього разділа немає TV з типом введення "Image", створіть його. Завантажте для кожного матеріала картинку. +- Створіть новий TV-параметр. +- Ім'я параметру: наприклад "material". Заголовок: наприклад "Матеріал". Тип введення: Listbox (Multi-Select) або Check Box. + +В поле Можливі значення введіть такий запит: +``` +@SELECT cnt.pagetitle, tvc.id FROM modx_site_content cnt, modx_site_tmplvar_contentvalues tvc WHERE cnt.id = tvc.contentid AND tvc.tmplvarid = 4 AND cnt.parent = 48 +``` +де 4 - ID TV-картинки, 48 - ID розділу зі сторінками матеріалів, modx_ - префікс таблиць в БД, заданий при встановленні Evolution. +- Візуальний компонент: Delimited List +- Delimiter - "," (кома без лапок). + + +- В блоці "Доступ шаблонів" виберіть шаблон товарів (щоб TV був доступний при редагуванні товарів). +- Натисніть "Зберегти". + +Тепер для кожного товару можна вибрати матеріал (колір або т.п.) із списку. Для виділення декількох пунктів використовуйте клавішу CTRL або SHIFT. +Приклад використання в шаблоні товару-документа: +``` +
    [*material:shk_widget=`radioimage:material:first_selected`*]
    +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/03_\320\234\320\276\320\264\321\203\320\273\321\214_\320\272\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217\320\274\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/03_\320\234\320\276\320\264\321\203\320\273\321\214_\320\272\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217\320\274\320\270.md" new file mode 100644 index 00000000..ad699e50 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/03_\320\234\320\276\320\264\321\203\320\273\321\214_\320\272\320\265\321\200\321\203\320\262\320\260\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217\320\274\320\270.md" @@ -0,0 +1,113 @@ +Керування замовленнями інтернет-магазину +## Функції ## +- Редагування і видалення замовлень, що надійшли; +- Можливість встановити замовленню статус (новий, в процесі виконання, відісланий, виконаний, виникли проблеми); +- Можливість писати нотатки до кожного замовлення; +- Сортування замовлень. +- Керування товарами в каталозі (створення, редагування). + +## Конфігурація ## +- **Замовлень на сторінці** - число замовлень в списку на одній сторінці. +- **Валюта** - впливає на відображення в таблиці замовлень і докладної інформації про замовлення. +- **Кольори статусів** - кольори рядків в таблиці замовлень, відповідні статусам замовлень. Назви статусів можна змінювати в мовному файлі `shopkeeper/lang/lang_ru.php` +- **Облік товару на складі** - ім'я TV-параметра, який використовується для обліку кількості товарів на складі. Докладніше нижче. +- **Категорія каталогу за замовчуванням** - Вкажіть ID документа, який буде використовуватися для каталогу за замовчуванням. У модулі з'явиться кнопка для переходу в каталог. Необхідно також налаштувати плагін SaveToSHK. +- **Скасовувати замовлення через, день/дні** - якщо замовлення знаходиться в статусі "Прийнято до оплати" більше днів, він скасовується. +- **ID TV-параметру ціни** - потрібно для каталогу Shopkeeper. +- **Відправляти покупцеві ел. листи при зміні статусу замовлення** - листи відправляються при переведенні замовлення в статуси "Прийнято до оплати" і "Відправлений". Шаблони для листів знаходяться в папці shopkeeper/module/templates/. +- **Шаблон для контактної інформації** - шаблон докладного виду контактної інформації замовлення. Можна вказувати плейсхолдери тільки ті, які використовуються в шаблоні листа замовлення сніпета eForm (параметр `&report`), а також `[+orderData+] (склад замовлення)` і `[+orderID+] (номер замовлення)`. +- **Шаблон для контактної інформації в списку товарів** - шаблон для контактної інформації, яка відображається в таблиці замовлень. +Можна вказувати плейсхолдери тільки ті, які використовуються в шаблоні листа замовлення сніпета eForm (параметр &report), а також [+orderData+] (склад замовлення) і [+orderID+] (номер замовленя). +За замовчуванням: `[+name+], [+address+], [+email+], [+phone+], [+delivery+], [+payment+]` +- **Кнопка "Видалити всі записи"** видаляє таблиці модуля із бази данних (деінсталяція). + +## Шаблони, чанки і плейсхолдери ## + + + + + + + + + + + + + + + + + + + + +
    Найменування шаблонаПлейсхолдери в шаблоніПримітка
    Шаблон для листа покупцеві про зміну статусу замовлення + [+date+] - дата замовлення;
    + [+site_name+] - ім'я сайту;
    + [+orderID+] - номер замовлення;
    + [+status+] - статус замовлення;
    + [+loop+]/[+end_loop+] - початок і кінець рядка даних товарів (цикл);
    + [+name+] - назван товару;
    + [+link+] - посилання на товар;
    + [+price+] - ціна товару
    + [+addit_data+] - список додаткових параметрів (використовується шаблон additData.tpl);
    + [+count+] - кількість одиниць товару;
    + [+totalPrice+] - загальна ціна;
    + [+currency+] - валюта;
    + [+order_changed_txt+] - текст (береться із мовного файла) виводиться, якщо склад замовлення був змінений менеджером магазину і один або більше товарів можна купити;
    + [+order_notpossible_txt+] - текст (береться із мовного файла) виводиьтся, якщо жоден з обраних товарів не можна купити;
    + + [+contact+] - Контактна информація (адрес, спосіб доставки і т.п.). Шаблон редагується в конфігурації модуля. +
    shopkeeper/module/templates/mail_changeStatus.tpl
    Шаблон для письма покупцеві про відправку замовленняshopkeeper/module/templates/mail_shipped.tpl
    Шаблон для списку додаткових параметрів товару в листі + [+param+] - ім'я та ціна параметра. Ціна вказується в дужках. Якщо ціна = 0, то пишеться тільки назва параметру (без дужок).
    + [+name+] - ім'я параметру.
    + [+price+] - ціна параметру. +
    shopkeeper/module/templates/additData.tpl
    + +## Каталог ## +Є можливість зберігати товари в каталозі Shopkeeper, а не в дереві документів. + +Щоб в модулі Shopkeeper (в адмінці) з'явилося посилання "Каталог", потрібно в конфігурації вказати ID категорії каталогу (ID документа) за замовчуванням. +Також необхідно налаштувати конфігурацію плагіна SaveToSHK - вказати ID шаблону товарів і ID TV-параметра ціни. + +У каталозі для переходу в іншу категорію потрібно натиснути на іконку поруч з назвою поточної категорії і вибрати в дереві документів нову. Потім натиснути на посилання категорії, що з'явилася. + +Для нормальної роботи каталогу Shopkeeper потрібно налаштувати плагін SaveToSHK. Вкажіть ID шаблону товарів і ID TV-параметра ціни. + +## Облік кількості товарів на складі ## +Для того щоб покупець і власник магазину знали, яка кількість товару є на складі, можна створити додатковий TV-параметр (наприклад inventory) з типом введення "Text". Далі в конфігурації модуля потрібно ввести ім'я TV в поле "Облік товару на складі (ім'я TV)". + +Після перекладу замовлення в статус "Відправлений" число цього параметра для кожного обраного товару буде автоматично перераховано. Якщо поле "Облік товару на складі" порожнє, кількість товарів на складі не враховується. + +## Важливо ## +Для того щоб замовлення відправлялися в модуль, в виклик сніпета eForm додати параметри: +``` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +``` + + +У чанку шаблону форми оформлення замовлення повинно бути приховане поле з назвою чанка тексту листа (reportTpl) + +`````` + +### Приклад виклику eForm ### + +``` +[!eForm? +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&vericode=`1` +&gotoid=`11` +&subject=`Замовлення в інтернет-магазині` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +!] +``` + +## Експорт замовленнь ## +В модулі є можливість експортувати список замовлень в CSV-файл. + +Якщо для відкриття ти використовуєте OpenOffice, відкрив файл, вкажіть параметр роздільника - "Точка з комою", кодування - "Кирилиця (Windows-1251)". diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/04_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/04_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..06fcacb4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/04_\320\236\321\204\320\276\321\200\320\274\320\273\320\265\320\275\320\275\321\217_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,200 @@ +В даний момент форма замовлення робиться за допомогою сніпета eForm. Можливо також зробити все на основі FormLister, використовуючи prepare-конструкції. + +* Оформлення замовлення на eForm +* Оформлення замовлення на FormLister + + +

    Оформлення замовлення на eForm

    + +**Важливо:** на сторінці формування замовлення сніпет Shopkeeper повинен викликатися раніше eForm! + +В чанку форми замовлення обов'язково додати приховане поле: +``` + +``` +де shopOrderReport - це назва чанку з шаблоном звіту(параметр &report сніпета eForm). + +``` +&eFormOnBeforeMailSent=`populateOrderData` - функція для заповнення даних про обрані товари. +``` + +Для того щоб замовлення відправлялися в модуль Shopkeeper, в виклик сніпета eForm добавити параметр +``` +&eFormOnMailSent=`sendOrderToManager` +``` + +### Приклад виклику eForm: ### +``` +[!eForm? +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&ccsender=`1` +&gotoid=`11` +&subject=`Нове замовлення` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +!] +``` + +## Товари в каталозі Shopkeeper ## +Можна зберігати товари в окрему таблицю БД (не документи).При цьому залишається можливість використовувати стандартні TV-параметри для товарів и плагіни. Для створення і редагування товарів використовується стандартний інтерфейс (можна налаштувати за допомогою плагіна ManagerManager). Для виведення товарів на сайті використовується сніпет catalogView. + +Товари можна "вкласти" в будь-який документ (категорію), обравши в дереві документів. Оскільки категорія каталогу (структура) створюється як раніше, документами, але самі товари будуть зберігатися в окремій таблиці БД. + +Якщо товар з каталогу Shopkeeeper, в чанк товару (сніпет catalogView) потрібно вставити приховане поле: + +``` + +``` +Щоб в модулі Shopkeeper (в адмінці) з'явилась силка "Каталог", потрібно в конфігурації вказати ID категорії каталога (документ MODx) за замовчуванням. + +Також необхідно налаштувати конфігурацію плагіна SaveToSHK — вказати ID шаблону товарів і ID TV-параметра ціни. + + +## Важливо! ## + +Рекомендується використовувати ЧПУ. В шаблонах сайту рекомендується використовувати `` всередині і відносні шляхи. +Якщо чанки зберігаються в файлах (використовується команда @FILE:), перевірте кодування цих файлів. Вона повинна бути така ж як і у вашого сайта. + +Рекомендується встановити плагін PHx. В чанку chunk_shopOrderFormWebUser.tpl він використовується для заповнення прихованих полів даними авторизованого користувача. + +Для виведення кошика (сніпета) в різних місцях рекомендується створювати різні шаблони для сторінок або використовувати плагін PHx. +Якщо використовується множення ціни товару на ціну додаткового параметра, в шаблоні інформації про товар (chunk_shopStuff.tpl і chunk_shopToCart.tpl) поле з ID товару (``) має бути вище додаткових параметрів по HTML-коду. + + +

    Оформлення замовлення на FormLister

    +В файлі assets/snippets/shopkeeper/shopkeeper.inc.php шукаємо рядки + +``` +require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php"; +$shopCart = new Shopkeeper($modx, $shkconf); +``` +замінюємо їх на + +``` +require_once MODX_BASE_PATH."assets/snippets/shopkeeper/classes/class.shopkeeper.php"; +$shopCart = new Shopkeeper($modx, $shkconf); +if (!empty($saveObject)) { + $modx->setPlaceholder($saveObject, $shopCart); +} +``` + +У виклик Shopkeeper на сторінці замовлення тепер потрібно додати параметр: + +``` +&saveObject=`shk` +``` +Далі слід створити сніпет ShkForm, через який будемо викликати FormLister: + +``` +getPlaceholder($shkObject)) && ($shk instanceof Shopkeeper) && !empty($purchases)) { + $params['ignoreMailerResult'] = 1; + $params['protectSubmit'] = 0; + $params['submitLimit'] = 0; + $params['prepareProcess'] = [function ($modx, $data, $FormLister) use ($shk) { + $shk->populateOrderData($data); + $shk->sendOrderToManager($data); + return $data; + }]; + + $out = $modx->runSnippet('FormLister', $params); +} + +return $out; +``` + +**Приклад** + +Виклик Shopkeeper: + +``` +[!Shopkeeper? +&cartType=`full` +&priceTV=`price` +&changePrice=`1` +&counterField=`1` +&style=`0` +&noJavaScript=`0` +&noJQuery=`1` +&flyToCart=`nofly` +&orderFormPage=`5067` +&cartTpl=`shopCart` +&cartHelperTpl=`cart_action_helper_tpl` +&cartRowTpl=`shopCartRow` +&orderDataTpl=`shopOrderData` +&saveObject=`shk` +!] +``` + +Виклик ShkForm: + +``` +[!ShkForm? +&formid=`shopOrderForm` +&shkObject=`shk` +&formTpl=`shopOrderForm` +&reportTpl=`shopOrderReport` +&captcha=`modxCaptcha` +&parseDocumentSource=`1` +&rewriteUrls=`1` +&filters=`{ + "name":["trim", "stripTags", "removeExtraSpaces"], + "email":["trim", "email"], + "phone":["trim", "phone", "removeExtraSpaces"], + "address":["trim", "stripTags", "removeExtraSpaces"], + "message":["trim", "stripTags", "compressText"] +}` +&rules=`{ + "name":{ + "required":"Введіть ім'я" + }, + "email":{ + "required":"Введіть электронну скриньку", + "email":"Введіть электронну скриньку правильно" + }, + "phone":{ + "required":"Введіть номер телефону", + "phone":"Введіть номер телефону правильно" + }, + "address": { + "required":"Введіть адрес" + }, + "payment":{ + "required":"Виберіть способ оплати", + "!equals": { + "params":["0"], + "message":"Виберіть спосіб оплати" + } + } +}` +&formControls=`payment,delivery` +&subject=`Нове замовлення на сайті` +&to=`test@test.ru` +&successTpl=`shopThankYou` +!] +``` + +Чанк shopOrderReport: + +``` +

    В інтернет-магазині зроблено замовлення.

    +

    Номер замовлення: [+orderID+]

    +Склад замовлення: +[+orderData+] +

    +Дані покупця:
    + + + + + + + + +
    Адрес: [+address.value+]
    Спосіб доставки: [+delivery.value+]
    Спосіб оплати: [+payment.value+]
    П.І.П.: [+name.value+]
    E-mail: [+email.value+]
    Телефон: [+phone.value+]
    Повідомлення: [+message:nl2br+]
    +``` +Обговорення на сайті [співтовариства](http://modx.im/blog/fast-solution/5917.html) diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/05_\320\237\321\200\320\276\321\204\321\226\320\273\321\214_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/05_\320\237\321\200\320\276\321\204\321\226\320\273\321\214_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" new file mode 100644 index 00000000..e55a87ad --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/05_\320\237\321\200\320\276\321\204\321\226\320\273\321\214_\320\272\320\276\321\200\320\270\321\201\321\202\321\203\320\262\320\260\321\207\320\260.md" @@ -0,0 +1,77 @@ + +### Сніпет SHKUserProfile - особистий кабінет покупця ### + +Сніпет виводить список поточних і архів замовлень користувача. Користувач може редагувати свої дані, вказані при реєстрації. Працює спільно зі сніпетом Paykeeper. Якщо статус замовлення "Прийнятий до оплати", то можна оплатити замовлення через Robokassa або WebMoney. + +Також у користувача є можливість до оплати відмовитись від замовлення або після оплати повторити попереднє замовлення. +Підтримується плагін addWebUserFields, за допомогою якого можна додавати додаткові поля для користувача при реєстрації. + +В шаблонах сніпета підтримується PHx. + +## Парамери: ## +- &id - ID сніпета. Корисно при виклику декілька разів на одній ст. +- &lang - мова. За замовчуванням мова системи управління. +- &profileTpl - Ім'я чанку або файл (@FILE:) з шаблоном для сторінки редагування профілю. +
    За замовчуванням: `@FILE:assets/snippets/shk_userprofile/tpl/profile.tpl.` + +- &ordersListTpl - Шаблон (чанк) з списком замовлень. +
    За замовчуванням: `@FILE:assets/snippets/shk_userprofile/tpl/ordersList.tpl`. + +- &orderDescTpl - Шаблон перегляду складу замовлення. +
    За замовчуванням: `@FILE:assets/snippets/shk_userprofile/tpl/orderDesc.tpl`. + +- &purchasesListTpl - Шаблон для списку товарів в замовленні на сторінці зі списком замовленнь (За замовчуванням вимкнено - `false`). +
    Приклад: `@FILE:assets/snippets/shk_userprofile/tpl/purchasesList.tpl` + +- &menuTpl - Шаблон першого рівня меню. +
    За замовчуванням: `@FILE:assets/snippets/shk_userprofile/tpl/menu.tpl`. + +- &subMenuTpl - Шаблон другого рівня меню. +
    За замовчуванням: `@FILE:assets/snippets/shk_userprofile/tpl/subMenu.tpl`. + +- &excepDigitGroup - розділяти числа цін в кошику на розряди. + +- &oneLevelMenu=`true` - будувати меню в один рівень. + +- &additFieldsTpl - Шаблон для додаткових полів. +
    За замовчуванням: `@FILE:assets/snippets/shk_userprofile/tpl/addit_fields.tpl`. + +- &additFieldsHide - Не давати редагувати (і не показувати) користувачу додаткові поля (через кому). +
    За замовчуванням: count_purchase. +Приклад: `&additFieldsHide=count_purchase,distribution`. + +- &showOrder=`true` - показати інформацію про замовлення і оплатити (якщо встановлений сніпет Paykeeper). +
    Використовується на сторінці оплати для незареєстрованого покупця. + +- &display - число замовлень на сторінці при виведенні архіва замовлень. + +- &action - сторінка за замовчуванням. +
    Можливі значення: profile (профіль), curorders (поточні закази), archorders (архів замовленнь). + +Можна передавати, будь-які, параметри сніпету Paykeeper (з префіксом "pay_"). + +Приклад: `&pay_payment_method=robokassa`. + +В шаблоні orderDescTpl цей сніппет виводиться в місці плейсхолдера [+payment_snippet+]. + + +## Приклади виклика: ## + +Шаблони За замовчуванням: +``` +[!SHKUserProfile!] +``` + +Виклик з параметрами: +``` +[!SHKUserProfile? +&purchaseTpl=`@FILE:assets/snippets/shk_userprofile/tpl/purchase.tpl`&oneLevelMenu=`true` +!] +``` +На сторінці оплати для незареєстрованого користувача (виведення информації про замовлення): +``` +[!SHKUserProfile? +&showOrder=`true` +&orderDescTpl=`@FILE:assets/snippets/shk_userprofile/tpl/orderDescNotRegd.tpl` +!] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/06_\320\236\320\277\320\273\320\260\321\202\320\260_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/06_\320\236\320\277\320\273\320\260\321\202\320\260_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..875472e1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/06_\320\236\320\277\320\273\320\260\321\202\320\260_\320\267\320\260\320\274\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,480 @@ +Оплата замовлень в магазині на Shopkeeper. + +* Paykeeper +* Yandex.Money + + +Розглянемо 2 найпопулярніших рішення для оплати. + +

    Paykeeper

    +За замовчуванням з магазином встановлюється сніпет Paykeeper. +Підтримується система Webmoney (без посередників) і Robokassa. Paykeeper достатньо тісно інтегрується з Shopkeeper: після здійснення оплати замовлення в модулі переводиться в статус "Оплата отримана", а також Paykeeper інтегрується з сніпетів особистого кабінету покупця - SHKUserProfile. + +Із додаткових опцій можна відзначити, що проводити оплату можливо як відразу після відправки замовлення, так і після підтвердження замовлення менеджером. Є опція "повторити замовлення". + +## Налаштування Paykeeper ## + +## Встановлення ### +За замовчуванням Paykeeper буде встановлений із репозиторія разом з магазином. Якщо цього не відбулося, то потрібно завантажити і встановити дистрибутив окремо. + +### Встановлення Paykeeper вручну: ### + +* В системі управління створити новий сніпет +* Назва сніпета: `Paykeeper` +* Опис: Онлайн-оплата покупок +* Відкрити [файл сніпета](https://github.com/extras-evolution/Shopkeeper/blob/master/install/assets/snippets/Paykeeper.tpl) з репозиторія, скопіювати вміст і вставити в поле "Код сніпета", зберегти. +* Скопіювати [всі файли сніпета](https://github.com/extras-evolution/Shopkeeper/tree/master/assets/snippets/paykeeper) в папку `assets/snippets/paykeeper/`. + +## Налаштування Paykeeper ## + +### Оплата відразу після відправки замовлення ### +В системі управління відкрити для редагування сторінку, яка відкривається після оформлення замовлення (`& gotoid` в eForm). + + Вставити в поле "Вміст ресурсу", або в шаблон сторінки виклик сніпета: + +``` +[!Paykeeper!] +``` +Перевірте щоб на сторінці оформлення замовлення у виклику сніпета eForm був вказаний параметр & gotoid. + +**Приклад:** +``` +[!eForm? +&gotoid=`15` +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&subject=`Нове замовлення` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` +!] +``` +де 15 - це ID сторінки, яка буде відкриватися після відправки замовлення. + +У шаблоні форми повинен бути, що випадає (select) для вибору методу оплати. + +**Приклад:** +``` + +``` +Тепер після відправки замовлення на наступній сторінці буде з'являтися кнопка "Оплатити зараз". + +## Налаштування платіжних систем ## + +### Налаштування ROBOKASSA ### +* В особистому кабінеті в поле "Result URL" введіть URL, по якій доступний файл `result.php` - `http://[ваш домен]/assets/snippets/paykeeper/result.php` +* Метод відсилання даних по Result URL - POST. +* Success URL - сторінка, яка буде відкриватися після успішного проходження платежу. +* Метод відсилання даних по Success URL - POST +* Fail URL - сторінка, яка буде відкриватися після незавершеного платежу. +* Метод відсилання даних по Fail URL - POST +* Введіть Пароль # 1 і Пароль # 2. +* Відкрийте файл `paykeeper/robokassa/config.php` і введіть свої дані (логін, пароль 1, пароль 2.). + + +### Налаштування WEBMONEY ### +* У вас повинен бути Атестат продавця. Відкрийте сайт http://merchant.webmoney.ru/ і авторизуйтесь +* Перейдіть "Налаштування" -> "Web Merchant Interface" -> "R-гаманець" -> "Налаштувати". +* Налаштування аналогічні Robokassa. +* Відкрийте файл `paykeeper/webmoney/config.php` і введіть номер R-гаманця (`$purse['rub']`) і Secret Key. + + +## Шаблони, чанкі і плейсхолдери ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    параметр сніпетаОписПлейсхолдери в шаблоніПримітка
    &WMstartPayTplШаблон першої сторінки при оплаті Webmoney. + [+action+] - action для форми;
    + [+email+] - адрес електронної пошти користувача;
    + [+payment_button+] - назва кнопки;
    + [+disabled+] - блокування кнопки, якщо користувач не зареєстрований і e-mail не вказано(disabled="disabled"). +
    + + Приклад: paykeeper/tpl/WMstartPayTpl.tpl + +
    &RKstartPayTplШаблон першої сторінки при оплаті через Robokassa. + + Приклад: paykeeper/tpl/RKstartPayTpl.tpl + +
    &WMpayTplШаблон сторінки другого кроку оплати Webmoney (перед переходом на сторінку системи оплати). + [+action+] - action для форми;
    + [+email_string+] - рядок з попередженням, якщо зазначений некоректний e-mail;
    + [+pay_summ+] - сума платежу;
    + [+pay_purse_type+] - тип WM-гаманця для оплати;
    + [+h_inputs+] - приховані текстові, необхідні для системи оплати. +
    + + Приклад: paykeeper/tpl/WMkpayTpl.tpl + +
    &RKpayTplШаблон сторінки другого кроку оплати Robokassa (перед переходом на сторінку системи оплати). + [+action+] - див. вище.
    + [+email_string+] - див. вище.
    + [+pay_summ+] - див. вище.
    + [+pay_currency+] - валюта (руб.)
    + [+h_inputs+] - див. вище. + +
    + + Приклад: paykeeper/tpl/RKpayTpl.tpl + +
    + + +## Параметри сніпета ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОпис і значенняЗначення за замовчуваннямПримітка
    &langмоваМова системи управлінняВ даний час доступні мови:
    `russian` (папка paykeeper/lang/)
    &paymentDescопис платежу`Оплата покупки в інтернет-магазині` 
    &paymentButtonНазва кнопки на першій сторінці`Оплатити зараз` 
    &resultURLURL сторінки "Result URL"`http://[ваш сайт]/assets/snippets/paykeeper/result.php`Не обов'язковий параметр. Можна застосовувати для Webmoney.
    &payment_methodМетод оплати
    `webmoney`, `robokassa`
    $_SESSION['shk_payment_method'] 
    &payment_orderidID замовлення$_SESSION['shk_order_id'] 
    &payment_useridID користувача$_SESSION['shk_order_user_id'] 
    &payment_useremailE-mail користувача$_SESSION['shk_order_user_email'] 
    &payment_valueСума оплати$_SESSION['shk_order_price'] 
    &payment_currencyВалюта оплати$_SESSION['shk_currency'] 
    &payment_reserveЗарезервувати товар для оплати
    `true`, `false`
    `false`Оплата здійснюється після того як статус замовлення переводиться в "Прийнято до оплати". Новий параметр в версії 1.5.
    &WMstartPayTplІм'я чанка з шаблоном першої сторінки при оплаті Webmoney`@FILE:assets/snippets/paykeeper/tpl/WMstartPayTpl.tpl`Якщо чанки зберігаються у файлах, можна вказати шлях з командою "@FILE:". Якщо чанки створені в системі управління, то вказується тільки ім'я чанка (наприклад &WMstartPayTpl=`WMstartPay`)
    &WMpayTplІм'я чанка з шаблоном сторінки другого кроку оплати Webmoney (перед переходом на сторінку системи оплати)`@FILE:assets/snippets/paykeeper/tpl/WMkpayTpl.tpl`
    &RKstartPayTplІм'я чанка з шаблоном першої сторінки при оплаті через Robokassa`@FILE:assets/snippets/paykeeper/tpl/RKstartPayTpl.tpl`
    &RKpayTplІм'я чанка з шаблоном сторінки другого кроку оплати Robokassa (перед переходом на сторінку системи оплати)`@FILE:assets/snippets/paykeeper/tpl/RKpayTpl.tpl`
    &payTestТестовий режим оплати. Можливі значення: `true`, `false`.`false` 
    + +## Особливості та додаткові можливості ## +Якщо сніпет викликається без параметрів, значення суми оплати, ID замовлення і т.д. береться з сесій, які створюються сніпетом Shopkeeper після збереження замовлення. + +Сніпет можна викликати з інших сніпетів через функцію $modx->runSnippet(). + +У даній версії (1.x) для WebMoney підтримується оплата тільки WMR (рублі). +Сніпет тесторовался тільки з кодуванням сайту UTF-8, тому що вона є рекомендованою для Evolution CMS. C іншим кодуванням коректна робота не гарантується. + + +**Приклади виклику Paykeeper:** + +Оплата після відправки замовлення +``` +[!Paykeeper!] +``` +Резервування (оплата після підтвердження менеджером) +``` +[!Paykeeper? &payment_reserve=`true`!] +``` +Оплата окремого замовлення +``` +[!Paykeeper? +&payment_method=`webmoney` +&payment_orderid=`2` +&payment_value=`100` +&payment_currency=`WMR`!] +``` + +

    Yandex.Money

    +Рішення для оплати за допомогою сервісу Яндекс.Деньги. + +**Доступні платіжні методи, якщо ви працюєте як юридична особа:** + +* Банківські картки - Visa (включаючи Electron), MasterCard і Maestro, будь-якого, банку світу +* Електронні гроші - Яндекс.Деньги, WebMoney і QIWI Wallet +* Готівка - Понад 170 тисяч пунктів оплати по Росії +* Баланс телефону - Білайн, Мегафон і МТС +* Інтернет банкінг - Альфа-Клік, Сбербанк Онлайн, MasterPass і Промсвязьбанк +* Кредитування + +## Встановлення модуля + +### Встановлення модуля +Для установки даного модуля необхідно: +* Розпакувати [архів](https://github.com/yandex-money/yandex-money-cms-modx-evo/archive/master.zip) і перемістити папку `assets` в папку` assets` Вашого сайту +* Перейти в адміністративну панель Evolution CMS +* Перейти в меню `Модулі` - `Управління модулями` - `Новий модуль` і створити новий модуль з назвою `YandexMoney` +* Вставити в код модуля `YandexMoney` наступний код: +``` +include '../assets/snippets/yandexmoney/yandexmoney.class.php'; + +$dbname = $modx->db->config['dbase']; //ім'я бази даних +$dbprefix = $modx->db->config['table_prefix']; //префікс таблиць +$mod_table = $dbprefix."yandexmoney"; //таблиця модуля +$theme = $modx->config['manager_theme']; //тема адмінки +$basePath = $modx->config['base_path']; //шляї до сайта на сервері + +$action = isset($_POST['action']) ? $_POST['action']:''; + +switch($action) { + +//Встановлення модуля (створення таблиці в БД) +case 'install': + $sql = "CREATE TABLE $mod_table (id INT(11) NOT NULL AUTO_INCREMENT, config LONGTEXT, PRIMARY KEY (id))"; + $modx->db->query($sql); + + $sql = "INSERT INTO $mod_table (id, config) VALUES (1, '')"; + $modx->db->query($sql); + + header("Location: $_SERVER[REQUEST_URI]"); +break; + +//Видалення таблиці модуля +case "uninstall": + $sql = "DROP TABLE $mod_table"; + $modx->db->query($sql); + header("Location: $_SERVER[REQUEST_URI]"); +break; + +//Оновлення запису в БД +case 'save': + $fields = array( + 'config' => serialize($_POST['config']) + ); + $ym_stat = new yamoney_statistics($_POST['config']); + $query = $modx->db->update($fields, $mod_table, 'id = 1'); + header("Location: $_SERVER[REQUEST_URI]"); +break; + + +//Перезавантаження сторінки (сброс $_POST) +case 'reload': + header("Location: $_SERVER[REQUEST_URI]"); +break; + +//Сторінка модуля +default: + echo Yandexmoney::adminHeadHtml($theme);; + if (!Yandexmoney::isInstalled($dbname, $mod_table)){ + //якщо таблиці не існує, виводимо кнопку "Встановити модуль" + echo Yandexmoney::adminInstallHtml(); + }else{ + $data_query = $modx->db->select("*", $mod_table, "", "id ASC", ""); + $row = $modx->db->getRow($data_query); + $config = unserialize($row['config']); + + $ym = new Yandexmoney($config); + echo $ym->adminModuleHtml(); + } + break; +} +``` + +Перейти в меню `Элементи` - `Сніппети` і створити новий сніпет з назвою `YandexMoney`. + +Вставити наступний код: + +``` +db->config['dbase']; //ім'я бази даних +$dbprefix = $modx->db->config['table_prefix']; //префікс таблиць +$mod_table = $dbprefix."yandexmoney"; //таблиця модуля +$theme = $modx->config['manager_theme']; //тема адмінки +$basePath = $modx->config['base_path']; //шлях до сайта на сервері +if(!defined('YANDEXMONEY_PATH')) { + define('YANDEXMONEY_PATH', MODX_BASE_PATH."assets/snippets/yandexmoney/"); +} +require_once YANDEXMONEY_PATH.'yandexmoney.class.php'; + +$data_query = $modx->db->select("*", $mod_table, "", "id ASC", ""); +$row = $modx->db->getRow($data_query); +$config = unserialize($row['config']); +$ym = new Yandexmoney($config); +if ($_POST['payment']){ + $ym->pay_method = $_POST['payment']; +} +if ($action == 'showMethods') { + return $ym->getSelectHtml(); +} +?> +``` + +Перейти в меню `Элементи - Управління файлами` і в файл `assests/snippets/shopkeeper/shopkeeper.inc.php` вставити наступний код: + +``` +if(!function_exists('sendOrderToManager')){ + function sendOrderToManager(&$fields){ + global $modx, $shkconf; + + if(!class_exists('Shopkeeper')) require_once MODX_BASE_PATH."assets/snippets/shopkeeper/class.shopkeeper.php"; + if(!defined('YANDEXMONEY_PATH')) define('YANDEXMONEY_PATH', MODX_BASE_PATH."assets/snippets/yandexmoney/"); + if(!function_exists('YandexMoneyForm')) require_once YANDEXMONEY_PATH.'yandexmoney.class.php'; + $shopCart = new Shopkeeper($modx, $shkconf); + + $shopCart->sendOrderToManager($fields); + + YandexMoneyForm($fields); + + return true; + } +} +``` + +Перейти в меню `Элементи - Чанки` і створити новий чанк з назвою `YandexMoney` + +Вставити в код чанка `YandexMoney` наступний код: + +``` +[[YandexMoney?&action=`showMethods`]] +``` + +Приклад з вставленої рядком `[[YandexMoney?&action=`showMethods`]]`: + +``` + +``` + +У коді сторінки з формою замовлення необхідно вставити наступний код: + +``` +[[YandexMoney? &action=`beforeCart`]] +``` + +Приклад з вставленої рядком `[[YandexMoney? &action=`beforeCart`]]`: + + +``` +[[YandexMoney? +&action=`beforeCart` +]] + +[!Shopkeeper? +&cartType=`full` +&priceTV=`price` +&orderFormPage=`34` +¤cy=`руб.` +&noJQuery=`1` +!] + +[!eForm? +&formid=`shopOrderForm` +&tpl=`shopOrderForm` +&report=`shopOrderReport` +&vericode=`1` +&ccsender=`1` +&gotoid=`35` +&subject=`Нове замовлення` +&eFormOnBeforeMailSent=`populateOrderData` +&eFormOnMailSent=`sendOrderToManager` !] +``` + +Перейти в `Модулі` і клацнути по значку поряд з `YandexMoney`, а потім вибрати пункт "Встановити YandexMoney" diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/index.md" new file mode 100644 index 00000000..5c69e063 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Shopkeeper/index.md" @@ -0,0 +1,35 @@ +Програмний комплекс для створення інтернет-магазину на базі Evolution CMS. + +## Встановлення ## +Встановити Shopkeeper можна в 1 клік із магазину доповнень Evolution CMS. + +## Що для чого? ## +Після встановлення ви побачите декілька встановлених доповнень. Давайте розберемося, яке з них за що відповідає. + +- Cніппет Shopkeeper - це сніпет для формування кошика на сторінках сайту. +- Модуль управління замовленнями - модуль всередині адмін-панелі (Модулі -> Shopkeeper). Потрібен для відстеження замовленнь, їх статусів і перегляду деталей про кожне конкретне замовлення. +- Модифікатор shk_widget і плагін paramEdit дозволяють зробити різну вартість товарів, яка залежить від обраних опцій. +- Плагін PHx - плагін потрібен для частини функціонала магазину, у тому числі для shk_widget. +- Сніпет shk_userprofile - профіль користувача, історія замовлень. +- Сніпет paykeeper - сніпет для cплати замовлення + + +## Принципи работи ## + +### Купівля ### +На кожній сторінці, де здійснюється купівля, повинен бути викликаний сніпет Shopkeeper. Саме він буде відображати кошик і він же ж і відповідає за додавання в неї товарів. + +Верстка кожного товару повинна бути відповідним чином модифікована. Товарам присвоюються певні класи, всередині розміщуються кнопки і поля цін, і кількості. +Після чого скрипт - Shopkeeper'а зможе зрозуміти, що перед ним - товар, обробити натискання кнопки "Купити" и добавити товар в кошик. + +Докладніше про розмітку товарів дивіться в матеріалі "Сніпет Shopkeeper". + +### Оформлення замовлення ### +Для оформлення замовлення також використовується виклик сніпета Shopkeeper і виклик будь-якого доповнення, який має обробляти форми. За замовчуванням Shopkeeper оптимізований для використання з сніпетом eForm. Але ніщо не заважає використовувати і більш сучасний FormLister. +Докладніше дивіться на сторінці "Оформлення замовлення". + +### Оплата замовлення ### +Для оплати використовується, як правило, сніпет paykeeper. Відомі також рішення на основі Яндекс.Деньги. + +### Профіль користувача і історія замовленнь ### +Для відстеження замовленнь за сторони користувача використувується сніпет shk_userprofile. Його опис доступний на відповідній стрінці. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleFile/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleFile/index.md" new file mode 100644 index 00000000..a203497e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleFile/index.md" @@ -0,0 +1,49 @@ + + +

    SimpleFiles - прикріплюємо до сторінки файли

    +SimpleFiles - прикріплюємо до сторінки файли Evolution CMS. +

    Ще одне доповнення на базі DocLister і EasyUI. Цього разу до сторінки прикріплюються файли і редагуються в таблиці – як в MultiFiles, але трохи зручніше (особливо, коли йде мова про велику кількість файлів) (:

    +

    Для роботи необхідна наявністьDocLister і MODxAPI, а також PHP не менше 5.6.

    +

    Завантажувати тут: Pathologic

    +

    Налаштування плагіну

    +
      +
    • Tab name – назва вкладки;
    • +
    • Controller class – клас контролера відмінний від стандартного;
    • +
    • Templates – id шаблонів, з якими працює плагін, обов'язково;
    • +
    • Documents – те ж саме, але для окремих ресурсів;
    • +
    • Ignore Documents – id ресурсів що виключаються;
    • +
    • Roles – id дозволених ролей;
    • +
    • Storage folder – папка, в якій зберігаються файли, за замовчуванням assets/storage/;
    • +
    • Icons folder – папка, в якій зберігаються іконки файлів, за замовчуванням assets/snippets/simplefiles/icons/;
    • +
    • Allowed files – розширення файлів, дозволених для завантаження, через кому; якщо не вказувати, то будуть використані системні налаштування;
    • +
    +

    Maximum file size – обмеження розміру файлу, в мегабайтах.

    +

    Іконки повинні іменуватися як розширення_файлу_рядковими_буквами.png

    +

    Іконка file.png підставляється, якщо не знайшлось відповідної.

    + +

    Вивід записів

    +

    Після виводу записів читаємо про SimpleGallery.

    +

    При виведенні через сніпети-обгортки 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 – дата додавання файлу.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/01_\320\222\320\270\320\262\321\226\320\264 \320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\321\214.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/01_\320\222\320\270\320\262\321\226\320\264 \320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\321\214.md" new file mode 100644 index 00000000..5bb2fdf3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/01_\320\222\320\270\320\262\321\226\320\264 \320\267\320\276\320\261\321\200\320\260\320\266\320\265\320\275\321\214.md" @@ -0,0 +1,135 @@ +##Вивід зображень + +Для демонстрації галереї використовується 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+] — дата додавання зображення. + +Для виведення екранованих данних (параметр є в 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:
    [+dl.wrap+]
    ` +&thumbSnippet=`sgThumb` +&thumbOptions=`400x300` +&display=`16` +&paginate=`pages` +&PrevNextAlwaysShow=`1` +&tpl=`@CODE: + +` +&TplWrapPaginate=`@CODE:` +&TplCurrentPage=`@CODE:
  • [+num+]
  • ` +&TplPage=`@CODE:
  • [+num+]
  • ` +&TplNextP=`@CODE:
  • ` +&TplLastP=`@CODE:
  • ` +&TplFirstP=`@CODE:
  • ` +&TplPrevP=`@CODE:
  • ` +&TplNextI=`@CODE:
  • ` +&TplLastI=`@CODE:
  • ` +&TplFirstI=`@CODE:
  • ` +&TplPrevI=`@CODE:
  • ` +!] +[+pages+] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/02_\320\222\320\270\320\262\321\226\320\264 \321\201\320\277\320\270\321\201\320\272\321\203 \320\263\320\260\320\273\320\265\321\200\320\265\320\271.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/02_\320\222\320\270\320\262\321\226\320\264 \321\201\320\277\320\270\321\201\320\272\321\203 \320\263\320\260\320\273\320\265\321\200\320\265\320\271.md" new file mode 100644 index 00000000..5c774798 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/02_\320\222\320\270\320\262\321\226\320\264 \321\201\320\277\320\270\321\201\320\272\321\203 \320\263\320\260\320\273\320\265\321\200\320\265\320\271.md" @@ -0,0 +1,66 @@ +##Виведення списку галерей + +Реалізуєтся за допомогою контроллера 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:

    [+pagetitle+] [+count+]

    [+images+]` +&sgDisplay=`4` +&sgOuterTpl=`@CODE:
    [+wrapper+]
    ` +&sgRowTpl=`@CODE: + +` +&thumbSnippet=`sgThumb` +&thumbOptions=`400x300` +&orderBy=`menuindex ASC` +&sgOrderBy=`sg_index DESC` +]] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/03_\320\223\320\265\320\275\320\265\321\200\320\260\321\206\321\226\321\217 \320\277\321\200\320\265\320\262'\321\216 \320\277\321\200\320\270 \320\267\320\260\320\263\321\200\321\203\320\267\321\206\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/03_\320\223\320\265\320\275\320\265\321\200\320\260\321\206\321\226\321\217 \320\277\321\200\320\265\320\262'\321\216 \320\277\321\200\320\270 \320\267\320\260\320\263\321\200\321\203\320\267\321\206\321\226.md" new file mode 100644 index 00000000..7275cf6f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/03_\320\223\320\265\320\275\320\265\321\200\320\260\321\206\321\226\321\217 \320\277\321\200\320\265\320\262'\321\216 \320\277\321\200\320\270 \320\267\320\260\320\263\321\200\321\203\320\267\321\206\321\226.md" @@ -0,0 +1,31 @@ +##Генерація прев'ю при загрузці + +Реалізуєтся за допомогою [системи плагінів](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. Сніппет повинен повернути посилання на прев'ю. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/04_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\320\260\320\274.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/04_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\320\260\320\274.md" new file mode 100644 index 00000000..5ce9b3f8 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleGallery/04_\320\240\320\276\320\267\321\200\320\276\320\261\320\275\320\270\320\272\320\260\320\274.md" @@ -0,0 +1,5 @@ +##Розробникам + +[Створення плагінів](http://modx.im/blog/docs/3006.html) +[Зміни логіки роботи і интерфейсу](http://modx.im/blog/docs/3277.html) +[Динамічна зміна параметрів](http://modx.im/blog/docs/3321.html) diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleTube/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleTube/index.md" new file mode 100644 index 00000000..af514584 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SimpleTube/index.md" @@ -0,0 +1,62 @@ + + +

    SimpleTube - плагін і сніпет для створення відеогалерей

    +SimpleTube - плагін і сніпет для створення відеогалерей. +

    Основних відмінностей всього дві, проте мені здається, вони достатньо суттєві, щоб змінити назву:

    +
      +
    • тепер використовується окрема таблиця для зберігання данних, замість TV-параметра з json;
    • +
    • новий зручний інтерфейс з jQuery EasyUI
    • +
    +

    Для роботи всього цього необхіна наявність DocLister і MODxAPI, а також PHP 5.6.

    +

    Скачати тут: Pathologic

    +

    Сніпет вміє знаходити за допомогою классу Panorama-PHP інформацію про відео за посиланням, а також при можливості завантажити Зображення-прев'ю. Підтримуються youtube, rutube, vimeo, metacafe і dailymotion. Взагалі класс підтримує більше відеохостингів, але це в теорії; тому я залишив тільки те, що більш-менш працює (при цьому, наприклад, про metacafe і dailymotion я ні разу не чув).

    +

    З допомогою цього сніпета плагін отримує інформацію для додавання в таблицю, але нічого не заважає використовувати його без плагіна, як сніпет getVideo з MultiVideos.

    +

    Параметри Сніпета:

    +
      +
    • &input – посилання;
    • +
    • &forceDownload – якщо 1, то завжди скачувати прев'ю, якщо 0, то тільки в тому випадку, якщо зображення немає в папці; за замовчуванням – 0;
    • +
    • &folder – папка для зберігання прев'ю; за замовчуванням – assets/images/video/;
    • +
    • &noImage – шлях до зображення, котре виводиться в режимі &api=`0` при відсутності прев'ю; за замовчуванням – assets/snippets/simpletube/noimage.png;
    • +
    • &api – якщо 0, то виводиться чанк &tpl, 1 – json, 2 – массив; за замовчуванням – 0;
    • +
    • &tpl – чанк для виведення в режимі &api=`0`, вказується так само, як в DocLister. Доступні плейсхолдері: [+st_title+] (назва відео), [+st_thumbUrl+] (посилання на прев'ю або зображення noImage), [+st_embedUrl+] (посилання для вбудови), [+st_service+] (назва відеохостинга), [+st_duration+] (довжина відео, секунд);
    • +
    • &ytApiKey – ключ для роботи з Youtube, якщо параметр не вказаний, то сніппет намагатиметься отримати це значення з налаштувань плагіна.
    • +
    +

    Параметри Плагіна:

    +

    Плагін використовується для керування галереями на сторінці ресурсу.

    +
      +
    • Tab name – назва вкладки;
    • +
    • Templates – id шаблонів ресурсів з відео, обов'язковоо – ;
    • +
    • Roles – id дозволених ролей;
    • +
    • Thumbs folder – папка для прев'ю;
    • +
    • Thumbs cache folder – папка для прев'ю (:
    • +
    • No image picture – зображення, якщо немає прев'ю;
    • +
    • Thumbs width – її ширина;
    • +
    • Thumbs height – і висота;
    • +
    • Force download – завантажувати прев'ю завжди, або при необхідності;
    • +
    • Youtube API Key – ключ для работы з YouTube.
    • +
    +

    Вивід такий ж, як в SimpleGallery – c поправкой на назву таблиці і полей. Тому дивитись тут.

    +

    Поля в таблиці st_videos:

    +
      +
    • st_id – id відео (idField);
    • +
    • st_index – позиція в списку;
    • +
    • st_title – назва відео;
    • +
    • st_videoUrl – вихідне посилання на відео;
    • +
    • st_thumbUrl – посилання на прев'ю;
    • +
    • st_embedUrl – посилання для вбудови;
    • +
    • st_duration – довжина відео, секунди;
    • +
    • st_isactive – прапорець, щоб приховати якісь відео з виведення;
    • +
    • st_service – назва відеохостинга;
    • +
    • st_rid – id ресурсу, котрому належить відео (parentField).
    • +
    • st_createdon – дата додавання відео.
    • +
    + + +

    Старий API, з котрим можна було працювати без ключів, більше не доступний, тому прийдеться реєструвати аккаунт і отримати ключ:

    +
      +
    1. ІдемО сюдИ console.developers.google.com/
    2. +
    3. Створюємо проєкт.
    4. +
    5. В розділі APIs вибираємо YouTube Data API, нажимаєм Enable API.
    6. +
    7. В розділі Credentials нажимаєм Create New Key, вибираємо Browser Key і відразу Create (в текстове поле нічого писати не потрібно).
    8. +
    9. Копируем API Key и вставляємо в налаштування плагіна.
    10. +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SiteMap/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SiteMap/index.md" new file mode 100644 index 00000000..6a4eb135 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/SiteMap/index.md" @@ -0,0 +1,4 @@ + + +

    SiteMap Мапа сайта для пошукових систем

    +Мапа сайта для пошукових систем. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/StarRating/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/StarRating/index.md" new file mode 100644 index 00000000..b08b97e3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/StarRating/index.md" @@ -0,0 +1,103 @@ + + +

    Зірковий рейтинг для MODX Evolution

    +Відрізняється від основної збірки дуже гнучкими налаштуваннями (зображення зірок, оформлення і т.п.). +

    Установка

    +

    Створити новий сніпет з ім'ям star_rating і наступним вмістом:

    +
    +<?php
    +return require MODX_BASE_PATH . 'assets/snippets/star_rating/snippet.php';
    +?>
    +
    +

    Створити новий модуль Star Rating, з наступним вмістом:

    +
    +include MODX_BASE_PATH . 'assets/snippets/star_rating/starrating.module.php';
    +
    +

    Після створення модуля необхідно оновити сторінку щоб посилання на модуль появилось на вкладці "Модулі". Далі якщо ви раніше не встановлювали цей компонент необхідно натиснути кнопку "Установити".

    +

    Використання

    +

    Приклад виклику сніпета:

    +
    +[!star_rating? &id=`418` &tpl=`@CHUNK:star_rating`!]
    +
    +

    Параметри сніпета

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрЗа замовчуваннямОпис
    id[*id*]ID документа. Якщо не вказати буде використаний ID поточного документа
    tpltemplateШаблон для виведення рейтинга. Для використання чанків MODX потрібно в імені чанка добавити приставку @CHUNK: як на прикладі
    langruМова. Всі мови знаходятся в папці /assets/snippets/star_rating/langs/
    interval86400Інтервал в секундах після закінчення котрого можна буде оставити голос знову
    noJs-Якщо вказати 1 вбудовані скрипти не будуть виводитись на сторінку
    noCss-Якщо вказати 1 вбудовані стилі не будуть виводитись на сторінку
    class-Добавляє ваший css клас в шаблон <div class="star-rating-container[+class+]">, вказувати без пробіла
    stars5Кількість зірок рейтингу
    starOn-Зображення заповненої зірки (вказувати тільки ім'я файла з розширенням)
    starOff-Зображення не заповненої зірки (вказувати тільки ім'я файла з розширенням)
    starHalf-Зображення напів-заповненої зірки (вказувати тільки ім'я файла з розширенням)
    imagesPath-Шлях до папки із зображенням зірок. starOn, starOff, starHalf звязані з цим параметром
    readOnlyfalseЗабороняє можливість голосувати, тільки перегляд рейтингу
    starTypeimgЗа замовчуванням img, якщо вказати span то замість зображень буде використовуватись шрифт із зірками
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TagSaver/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TagSaver/index.md" new file mode 100644 index 00000000..d4f112e5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TagSaver/index.md" @@ -0,0 +1,128 @@ + + +

    TagSaver: Плагін для роботи з тегами

    +Плагін TagSaver для роботи з тегами. +

    Взагалі, фільтрація по тегам в MDOX реалізується доволі кисло. Уявіть, у вас є якись TV параметр, в якому у вас до кожної статті прописано по 10 тегів.

    +

    А в базі всі ці теги для документа зберігаються в одній стрічці. Тобто виглядає це приблизно так

    +
    modx, теги, робота з тегами, сортування за тегами
    +

    Як зазвичай відбувається сортування? Створюється SQL запит в таблицю site_tmplvar_contentvalues з використанням WHERE value LIKE %тег%

    +

    Таким чином, ми можемо шукати не тільки по тим тегам, які задумувались автором сайта, а й по тегам

    +
      +
    • і, р
    • +
    • ми, фи
    • +
    • льтра
    • +
    • бот
    • +
    • філ
    • +
    • mod
    • +
    +

    Більш того, якщо документів дуже багато, то пошук відбувається неймовірно довго. Як взагалі ідеально повинна виглядати робота з тегами?

    +

    Таблиця з документами вигляду: id, content, pagetitle

    +

    Таблица з тегами: id, tag

    +

    Таблица зв'язків з тегами: doc_id, tag_id

    +

    Можна звісно довго спорити про необхідності таблиці звязку, Оскільки придеться робити лишній JOIN. Але щодо правильно розставлених індексів цей джоін взагалі непомітний. Більш того, трохи завершивши таблицю ми можемо вписувати теги в декількох TV-шках, а зберігати в одній таблиці по вищеописаному стандарту.

    +

    На основі всього вищесказаного у нас получаються вот такі 2 таблиці

    +
    +DROP TABLE IF EXISTS `modx_site_content_tags`;
    +CREATE TABLE `modx_site_content_tags` (
    +  `doc_id` int(11) NOT NULL,
    +  `tag_id` int(11) NOT NULL,
    +  `tv_id` int(11) NOT NULL DEFAULT '0',
    +  PRIMARY KEY (`tag_id`,`doc_id`,`tv_id`),
    +  UNIQUE KEY `dtt` (`doc_id`,`tag_id`,`tv_id`) USING BTREE,
    +  KEY `doc_id` (`doc_id`),
    +  KEY `tag_id` (`tag_id`),
    +  KEY `tv_id` (`tv_id`)
    +) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    +
    +DROP TABLE IF EXISTS `modx_tags`;
    +CREATE TABLE `modx_tags` (
    +  `id` int(11) NOT NULL AUTO_INCREMENT,
    +  `name` varchar(50) NOT NULL,
    +  PRIMARY KEY (`id`),
    +  UNIQUE KEY `name` (`name`)
    +) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    +
    +

    Як видно, формат у таблиць MyISAM. Але у такого вибору є своя причина. Одна з них це auto_increment. А друга – унікальний ключ по декільком полям. Не буду довго затримуватись на цьому пункті. Скажу одне – якщо у вас MODX встановлений з префіксом таблиць відмінним від modx, то поміняйте його на свій;-)

    + +

    Створили таблиці? І що? Як тепер інформацію в них додавати?

    +

    Все дуже просто. Створіть як зазвичай TV параметр. Можете навіть додати віджет mm_widget_tags від ManagerManager. Після цього створіть плагін TagSaver з параметрами

    +
    &tv=ID TV-параметра;input; &sep=Роздільник тегів;input;
    +

    Якщо роздільника немає, то можна залишити порожнім.

    + +

    Що робити якщо мені потрібно 2 поля з тегами?

    +

    Створіть копію плагіна з іншим іменем з аналогічними параметрами. Тільки не забудьте в новій версії плагіна вказати роздільник і ID другого TV параметра.

    + +

    Чому плагін робить SELECT за значенями TV, а не приймає $_POST['tv'.$tv]?

    +
      +
    1. Ми працюємо в адмінці і ± 1 SQL запит особливої шкоди не зробить
    2. +
    3. Можуть стояти інші плагіни котрі викликаються раніше і змінюють значення TV параметра що зберігається
    4. +
    5. Значення TV параметра з $_POST може відрізнятися від збереженого в базу
    6. +
    + +

    Як вивести на сторінці теги привязані до поточної сторінки?

    +

    Виводити їх можна як і раніше – через сніпети DocInfo, просто демонструючи TV параметр на сторінці .

    + +

    Як тепер відсортувати данні за потрібним тегом?

    +

    Очень просто. Створіть сніпет приблизно з таким вмістом

    +
    +$tag = ((isset($tag) && is_scalar($tag))? $tag : (isset($_GET['tag']) && !is_array($_GET['tag']) ? $_GET['tag'] : ''));
    +$id = isset($id) ? (int)$id : 0;
    +$out = array();
    +if($id>0 && $tag!=''){
    +	$sql=$modx->db->query("SELECT doc_id FROM ".$modx->getFullTableName("tags")." as t
    +	LEFT JOIN ".$modx->getFullTableName("site_content_tags")." as ct ON ct.tag_id = id
    +	WHERE t.`name`='".$modx->db->escape($tag)."' AND ct.tv_id={$id}");
    +	$sql=$modx->db->makeArray($sql);
    +	foreach($sql as $item){
    +		$out[]=$item['doc_id'];
    +	}
    +}
    +return implode(",",$out);
    +
    + +

    І результат роботи цього сніпета передаєте в параметр documents від Ditto. У сніпета вказаного вище є 2 параметра:

    +
      +
    • tag – якщо цей параметр переданий, то сніпет використовує його значення. В іншому випадку намагаєтся взяти значення $_GET змінної tag
    • +
    • id – Індетифікатор TV змінної в котрій зберігаються теги
    • +
    +

    Виходить приблизно так

    +
    [[Ditto? &documents=`[!GetTag? &id=`2`!]`]]
    +

    Як тепер вивести популярні теги?

    +
    +$count = isset($count) ? (int)$count : 10;
    +$tv = isset($tv) ? (int)$tv : '';
    +$out = array();
    +$sql = $modx->db->query(
    +	"SELECT ct.tv_id,t.name,count(ct.tag_id) as count
    +	FROM ".$modx->getFullTableName("tags")." as t
    +	LEFT JOIN ".$modx->getFullTableName("site_content_tags")." as ct ON ct.tag_id=t.id
    +	LEFT JOIN ".$modx->getFullTableName("site_content")." as c on c.id=ct.doc_id
    +	WHERE deleted=0 AND published=1 ".(($tv!='') ? ("AND ct.tv_id=".$tv) : "")."
    +	GROUP BY tag_id ORDER BY count(ct.tag_id) DESC LIMIT 0,".$count
    +);
    +$sql = $modx->db->makeArray($sql);
    +foreach($sql as $item){
    +	$out[]=$modx->parseChunk($tpl,$item,"[+","+]");
    +}
    +return implode((isset($outSep) ? $outSep : ""),$out);
    +
    + +

    У сніпета є 3 параметра

    +
      +
    • count – скількі тегів виводити (за замовчуванням 10)
    • +
    • tv – Ідентификатор TV змінної в якій зберігаються теги
    • +
    • tpl – чанк в котрий будуть підставляться теги. У мене він виглядає так +
      <a href="/[~11~]?tag=[[urlencode? &input=`[+name+]`]]" title="Статті з тегом [+name+]" class="label">[+name+] ([+count+])</a>
      +	
      +
    • +
    +

    Як бачимо, цей сніпет не тільки теги підставляє, але ще й считує скільки разів вони використовуються. Таким чином виклик сніпета для хмари тегів виглядає так:

    +
    [[TagCloud? &tpl=`TagCloudItem` &tv=`7` &count=`20`]]
    + +

    А що за сніпет urlencode?

    +
    +return isset($input) ? urlencode($input) : '';
    +
    +

    Для чого він потрібний найдете в гуглі

    +

    В силу того, що мені доволі часто приходиться працювати з сайтами зробленими іншими програмістами, то можу сказати вам одне – таких рішень ще ніде не було. Всі сортують за страрими стандартами Ditto і винаходять свої велосипеди у вигляді екстендерів для нього. Моє рішення дозволяє вам працювати з видимою частиною також, як і раніше. Проте суттєво знімає навантаження на сервер при сортуваннях. І полегшує вибірку, навіть, якщо ви використовуєте знаменитий сніпет DropDownDocs для прив'язки статей до декількох розділів (адже по суті це також теги, тільки вигляд з боку). Відповідно, якщо вам потрібні теги й сортування за параметрам TV в значенні котрих може бути декілька даних – використовуйте TagSaver.

    +

    Автор: Agel_Nash

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TransAlias/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TransAlias/index.md" new file mode 100644 index 00000000..2a5f8b86 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TransAlias/index.md" @@ -0,0 +1,4 @@ + + +

    TransAlias Автоматична генерація псевдоніма документа

    +Автоматична генерація псевдоніма документа diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..4a1cd7cf --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,355 @@ + + +

    TvTagCloud: Параметри

    +Параметри сніпета TvTagCloud для виведення хмари тегів на Evolution CMS. +
    +
    +
    + +
    +
    +Формат:
    +Значення за замовчуванням: 0
    +Примітка: можна вказувати декілька ID через кому
    +Приклад: +
    &parent=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням : 10
    +Примітка:
    +Приклад: +
    &depth=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: 0
    +Примітка: на основі pub_date, 0 - вибрати всі дні
    +Приклад: +
    &days=`30`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: 0
    +Примітка: 0 - показати все
    +Прикла: +
    &min=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат: asc | desc | numasc | numdesc | random
    +Значення за замовчуванням: нет
    +Примітка: asc - по зростанню
    +dec - по спаданню
    +numasc - по зростанню лічильника
    +numdesc - по спаданню лічильника
    +random - випадковий порядок
    +Приклад +
    &sort=``
    +
    +
    +
    + +
    + +
    +
    +Формат: id документа
    +Значення за замовчуванням: Id даного документа
    +Примітка:
    +Приклад: +
    &landing=``
    +
    +
    +
    + +
    + +
    +
    +Формат: TV-параметр
    +Значення за замовчуванням: repo_tags
    +Примітка:
    +Приклад: +
    &tvTags=`tags`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: ,
    +Примітка:
    +Приклад: +
    &tagDelim=``
    +
    +
    +
    + +
    + +
    +
    +Формат: cloud | list | custom
    +Значення за замовчуванням: cloud
    +Примітка: в вигляді хмари, маркованого списка чи вибірково
    +Приклад: +
    &displayType=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: немає
    +Примітка: Плейсхолдери,що використовуються: [+class+] [+landing+] [+qs_seperator+] [+url_param+] [+tag+] [+urlencoded_tag+] [+tooltip+] [+count+] [+bracketed_count+]
    +Приклад: +
    &customDisplayChunk=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &showCount=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: 1 - вкл., 0 - викл., більше того, без цього параметра російські букви відображаються некоректно
    +Приклад: +
    &caseSensitive=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: 14,25,34,51,100
    +Примітка: тобто, скільки раз повинен бути вибраний тег, щоб збільшитись в розмірах, розділяються комами
    +Приклад: +
    &steps=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: s5,s4,s3,s2,s1
    +Примітка:
    +Приклад: +
    &styles=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка: Приймає значення і , які будуть замінені відповідними значеннями тега
    +Приклад: +
    &tooltip=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: пусто
    +Примітка:
    +Приклад: +
    &dittoID=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: 0
    +Примітка: 0 - без обмежень
    +Приклад: +
    &limit=`20`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &exclude=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &promote=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &demote=``
    +
    +
    +
    + + + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: current
    +Примітка:
    +Приклад: +
    &currentClass=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: tags
    +Примітка:
    +Приклад: +
    &urlParam=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..7659b596 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,11 @@ + + +

    TvTagCloud: Приклади

    +Приклади сніпета TvTagCloud для виведення хмари тегів на Evolution CMS. +
    +

    1. Створюємо TV-параметри tags зі значенням Text і вказуємо всі шаблони, для яких він буде присвоюватись. Тепер на тих сторінка, де повинні бути теги, заповнюємо параметри tags, вказуючи теги через кому.

    +

    2.Створюємо новий документ в дереві ресурсів. В налаштуваннях сторінки забираємо з «Використовувати HTML-редактор», «Доступний для пошуку» і «Кешуючий», також забираємо галочку з «Показувати в меню». Зберігаємо ресурс, потім знову заходимо до нього і в вмісті ресірса вставляємо такий виклик Ditto:

    +
    [!Ditto? &tagData=`tags` &tagDelimiter=`,` &parents=`0` &extenders=`tagging`!]
    + +

    3. В місці, де має бути хмара, вставляємо виклик TvTagCloud:

    +
    [!TvTagCloud? &parent=`1` &landing=`22` &tvTags=`tags` &showCount=`1` &caseSensitive=`1`!]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/index.md" new file mode 100644 index 00000000..9cd97e09 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/TvTagCloud/index.md" @@ -0,0 +1,3 @@ + +

    TvTagCloud Хмаринка тегів Evolution CMS

    +Сніпет для виводу хмаринки тегів на Evolution CMS. \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..e3ba5786 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,51 @@ + + +

    UltimateParent: Параметри

    +Параметри сніпета UltimateParent. +
    +
    +
    + +
    +
    + Формат: id документа
    + Значення за замовчуванням: Id даного документа
    + Примітка:
    + Приклад: +
    &id=`45`
    +
    +
    +
    + +
    + +
    +
    + Формат: id документа
    + Значення за замовчуванням: 0
    + Примітка:
    + Приклад: +
    &top=`6`
    +
    +
    +
    + + +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..6f66c3db --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,11 @@ + + +

    UltimateParent: Приклади

    +Приклади використання сніпета UltimateParent. +
    +

    Отримати id батьківського документа 45, до документа з id = 6:

    +
    [[UltimateParent? &id=`45` &top=`6`]]
    +

    Отримати id третього зверху батьківського документа 45:

    +
    [[UltimateParent? &id=`45` &topLevel=`3`]]
    +

    З ланцюжка батьківських документів, отримати id другого батьківського зверху. Само собою виклик сніпета повинен походити з документа розташованого як мінімум на третьому рівні вкладеності. Інакше буде повертатися id найвищого батьківського документа.

    +
    [[UltimateParent? &topLevel=`2`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/index.md" new file mode 100644 index 00000000..b9a43a86 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/UltimateParent/index.md" @@ -0,0 +1,4 @@ + + +

    UltimateParent Повертає батьківський документ

    +Параментри і приклади використовування сніпета UltimateParent Сніпет повертає батьківський документ. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..c176d1f9 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,336 @@ + + +

    Wayfinder: Основні параметри

    +Основні параметри сніпета Wayfinder. +
    +
    +
    + +
    +
    +Формат: default | breadcrumb | cssplay-basicdropdown | cssplay-dropdown | cssplay-dropline | cssplay-flyout | cssplay-flyoutrev | cssplay-upmenu | mollio | slidingdoors
    +Значення за замовчуванням: default
    +Примітка: В цьому файлі містяться шаблони і параметри для відображення меню. Файл конфігурації повинен мати назву filename.config.php. Приклади розміщені в папці: /assets/snippets/wayfinder/configs/
    +Приклад: +
    &config=`breadcrumb`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Встановити режим налагодження для діагностики.
    +Приклад: +
    &debug=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Якщо &displayStart=1 змусить Wayfinder вивести посилання на документ, який використовується в якості &startId, використовуючи шаблон &startItemTpl. Параметр працює, тільки якщо &startId не дорівнює нулю.
    +Приклад: +
    &displayStart=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, розділених комою
    +Значення за замовчуванням: немає
    +Примітка: список будь-яких документів, розділений комами
    +Приклад: +
    &excludeDocs=`6,7,8`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &fullLink=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: поточний id
    +Примітка: Потрібно вказувати тільки якщо скрипт сам його невірно визначає, наприклад при виведенні меню з чанка іншого сніпета.
    +Приклад: +
    &hereId=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчування: 0
    +Примітка:
    +Приклад: +
    &hideSubMenus=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчування: 0
    +Примітка:
    +Приклад: +
    &ignoreHidden=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документів, розділених комою
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &includeDocs=`5,6,7`
    +
    +
    +
    + +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 0
    +Примітка: 0 - показувати всі рівні
    +Приклад: +
    &level=`3`
    +
    +
    +
    + +
    + +
    +
    +Формат: ціле число
    +Значення за замовчуванням: 0
    +Примітка: 0 - без обмеження
    +Приклад: +
    &limit=`5`
    +
    +
    +
    + +
    + +
    +
    +Формат: плейсхолдер
    +Значення за замовчуванням: немає
    +Примітка: Весь код результату буде збережений в змінну, значення якої можна вставити в сторінку за допомогою плейсхолдера з ім'ям змінної.
    +Приклад: +
    &ph=`wf_menu`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Прибирати символ розриву рядків при виведенні. т. е. весь результуючий код буде у вигляді одного рядка.
    +Приклад: +
    &removeNewLines=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: немає
    +Примітка: Додавати префікс до ідентифікатора (id) для кожного елемента (id складається з значення rowIdPrefix + docId)
    +Приклад: +
    &rowIdPrefix=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &showSubDocCount=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: id | menutitle | pagetitle | introtext | menuindex | pub_date | published | hidemenu | parent | isfolder | description | alias | longtitle | type | template | random
    +Значення за замовчуванням: menuindex
    +Примітка: id, menutitle, pagetitle, introtext, menuindex, published, hidemenu, parent, isfolder, description, alias, longtitle, type, template, random
    +Приклад: +
    &sortBy=`pagetitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: ASC | DESC
    +Значення за замовчуванням: ASC
    +Примітка: ASC - за зростанням | DESC - по спадаючій
    +Приклад: +
    &sortOrder=`DESC`
    +
    +
    +
    + +
    + +
    +
    +Формат: ID документа
    +Значення за замовчуванням: поточний документ
    +Примітка: Будь-який номер (ID) документа-контейнера.
    +Приклад: +
    &startId=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: menutitle | id | pagetitle | description | parent | alias | longtitle | introtext
    +Значення за замовчуванням: menutitle
    +Примітка:
    +Приклад: +
    &textOfLinks=`longtitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: menutitle | id | pagetitle | description | parent | alias | longtitle | introtext
    +Значення за замовчуванням: pagetitle
    +Примітка:
    +Приклад: +
    &titleOfLinks=`longtitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &useWeblinkUrl=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: немає
    +Примітка: Відповідає where в MySQL
    +Приклад: +
    &where=`isfolder = 1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/03_\320\232\320\273\320\260\321\201\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/03_\320\232\320\273\320\260\321\201\320\270.md" new file mode 100644 index 00000000..efa1f541 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/03_\320\232\320\273\320\260\321\201\320\270.md" @@ -0,0 +1,156 @@ + + +

    Wayfinder: Класи

    +Параметри CSS класів, що використовуюються в шаблонах сніпета Wayfinder. +
    +
    +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &firstClass=`firstClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: active
    +Примітка:
    +Приклад: +
    &hereClass=`hereClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &innerClass=`innerClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: last
    +Примітка:
    +Приклад: +
    &lastClass=`lastClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: немає
    +Примітка: Число рівня буде додано до вказаного класу (тобто level1, level2, level3, и т.д... )
    +Приклад: +
    &levelClass=`level`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &outerClass=`outerClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS клас
    +Значення за замовчуванням:немає
    +Примітка:
    +Приклад: +
    &parentClass=`parentClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням:немає
    +Примітка:
    +Приклад: +
    &rowClass=`rowClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням: немає
    +Примітка:изначає лише даний документ.
    +Приклад: +
    &selfClass=`selfClass`
    +
    +
    +
    + +
    + +
    +
    +Формат: назва CSS класа
    +Значення за замовчуванням:немає
    +Примітка:
    +Приклад: +
    &webLinkClass=`webLinkClass`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \321\210\320\260\320\261\320\273\320\276\320\275\321\226\320\262.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \321\210\320\260\320\261\320\273\320\276\320\275\321\226\320\262.md" new file mode 100644 index 00000000..bd9386d9 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/04_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270 \321\210\320\260\320\261\320\273\320\276\320\275\321\226\320\262.md" @@ -0,0 +1,358 @@ + + +

    Wayfinder: Параметри Шаблона

    +Параметри Шаблона сніпета Wayfinder. +
    +
    +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка: Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назва посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - вивід значення поля опису
    +[+wf.introtext+] - виводе значення інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]</a>[+wf.wrapper+]</li>
    +Приклад: +
    &activeParentRowTpl=`activeParentRowTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка: Категорія визначається установкою шаблона blank чи атрибутом посилання rel="category".
    +Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS-класа (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назва посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових отрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]</a>[+wf.wrapper+]</li>
    +Приклад: +
    &categoryFoldersTpl=`categoryFoldersTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &cssTpl=`cssTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат:Ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка:Можливі плейсхолдери:
    +[+wf.classes+] -місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] -вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових отрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><span>[+wf.linktext+]</span>[+wf.wrapper+]</li>
    +Приклад: +
    &hereTpl=`hereTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка: Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] -місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] -ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><span>[+wf.linktext+]</span>[+wf.wrapper+]</li>
    +Приклад: +
    &innerHereTpl=`innerHereTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка: Можливі плейсхолдери:
    + //Примітка: Можливі плейсхолдери: +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] -вивід додаткових атрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]</a>[+wf.wrapper+]</li>
    +Приклад: +
    &innerRowTpl=`innerRowTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка: Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.wrapper+] - місце де буде виводитись вміст меню.
    +Прилад шаблона: <ul [+wf.classes+]>[+wf.wrapper+]</ul>
    +Приклад: +
    &innerTpl=`innerTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат:ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &jsTpl=`jsTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: rowTpl
    +Примітка:: Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назва посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]</a>[+wf.wrapper+]</li>
    +Приклад: +
    &lastRowTpl=`lastRowTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значение за замовчуванням: + <ul[+wf.classes+]>[+wf.wrapper+]</ul>
    +Примітка: Можливі плейсхолдери:
    +[+wf.classes+] -місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.wrapper+] -місце де виводитиметься вміст меню.
    +Приклад шаблона: <ul id="topnav" [+wf.classes+]>[+wf.wrapper+]</ul>
    +Приклад: +
    &outerTpl=`outerTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка:Можливі плейсхолдери:
    +[+wf.classes+] -місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] -вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] -ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] -виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]»</a>[+wf.wrapper+]</li>
    +Приклад: +
    &parentRowHereTpl=`parentRowHereTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: немає
    +Примітка: Можливі плейсхолдери:
    +[+wf.classes+] -місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] -ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] -виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]»</a>[+wf.wrapper+]</li>
    +Приклад: +
    &parentRowTpl=`parentRowTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: <li[+wf.id+][+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]" [+wf.attributes+]>[+wf.linktext+]</a>[+wf.wrapper+]</li>
    +Примітка: Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] -кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <li[+wf.classes+]><a href="[+wf.link+]" title="[+wf.title+]">[+wf.linktext+]</a>[+wf.wrapper+]</li>
    +Приклад: +
    &rowTpl=`rowTpl`
    +
    +
    +
    + +
    + +
    +
    +Формат: ім'я чанка
    +Значення за замовчуванням: <h2[+wf.id+][+wf.classes+]>[+wf.linktext+]</h2>[+wf.wrapper+]
    +Примітка: Використовується при &displayStart=`1`
    +Можливі плейсхолдери:
    +[+wf.classes+] - місце для вказування використовуюючого CSS- класу (включає class=" ")
    +[+wf.classnames+] - містить тільки назву CSS-класа (не включає class=" ")
    +[+wf.link+] - адреса (href) для посилання
    +[+wf.title+] - текст для titile посилання
    +[+wf.linktext+] - текст назви посилання
    +[+wf.wrapper+] - місце для виведення підменю
    +[+wf.id+] - вивід унікального ідентифікатора (id)
    +[+wf.attributes+] - вивід додаткових атрибутів посилання
    +[+wf.docid+] - ідентифікатор для даного елемента
    +[+wf.subitemcount+] - кількість елементів в папці
    +[+wf.description+] - виводе значення поля опису
    +[+wf.introtext+] - виводе значення поля інтротекста
    +Приклад шаблона: <h2>[+wf.linktext+]</h2>[+wf.wrapper+]
    +Приклад: +
    &startItemTpl=`startItemTpl`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..ac58de5b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/05_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,16 @@ + + +

    Wayfinder: Приклади

    +Приклади створення меню за допомогою сніпета Wayfinder. +
    +

    Простий варіант виклика:

    +
    [[Wayfinder? &startId=`15`]]
    + +

    Дочірні документи

    +
    [[Wayfinder? &startId=`[*id*]`]]
    + +

    Сусідні документо-розділи

    +
    [[Wayfinder? &startId=`[*parent*]`]]
    + +

    Мапа сайта

    +
    [[Wayfinder? &startId=`0`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/index.md" new file mode 100644 index 00000000..c0a8699a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/Wayfinder/index.md" @@ -0,0 +1,4 @@ + + +

    Wayfinder Меню сайта, навігація по сайту, мапа сайта і т.д

    +Меню сайта, навігація по сайту, мапа сайта і т.д diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebLogin/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebLogin/index.md" new file mode 100644 index 00000000..76b398e4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebLogin/index.md" @@ -0,0 +1,4 @@ + + +

    WebLogin Реєстрація та авторизація веб-користувачів

    +Реєстрація та авторизація веб-користувачів. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebSignup/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebSignup/index.md" new file mode 100644 index 00000000..647e0b5f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebSignup/index.md" @@ -0,0 +1,4 @@ + + +

    WebSignup Реєстрація веб-користувачів

    +Реєстрація веб-користувачів. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..95a05819 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,138 @@ + + +

    WebLoginPE: Параметри

    +Параметри сніпета WebLoginPE. +
    +

    &lang

    +

    WebLoginPE separates all language specific strings into a separate file stored in /webloginpe/lang/ (the default is english "en.php"). You can help by translating en.php into another language if you are multi-lingual.

    +
    [!WebLoginPE? &lang=`ru`!]
    + +

    &type

    +

    WebLoginPE has many functions (and each of those functions has many functions). There are six basic types. They are 'simple', 'register', 'profile', 'users', 'manager' and 'taconite'.

    +

    The 'simple' WebLoginPE can handle most of the tasks involved in user management (Login, Logout, Registration, Profile editing, etc...).

    +

    Type 'register' handles all the functions of creating new users. Type 'profile' allows a user to manage the details of their account (their attributes).

    +

    Type 'users' displays a list of all registered users (customizable and templateable) and provides links to view the user attributes individually as well as message the user.

    +

    Type 'manager' much like 'users' displays a list of the web users, but adds the ability to edit or delete any users. This should be accessible to Admins only

    +

    Type 'taconite' provides the functionality of WebLoginPE but squelches the output so you can handle those functions asynchronously (AJAX). The default type is 'simple'

    +
    [!WebLoginPE? &type=`users`!]
    + +

    &regType

    +

    WebLoginPE has two types of registration, 'instant' and 'verify'. The main difference is that an 'instant' registration allows a user to choose their password and log in... well, instantly with the username and password they just chose. In regType 'verify', the applicant provides an email address and chooses a username and WebLoginPE generates a password for them, then emails it to them (using the web signup email template in the manager configuration), in effect forcing them to 'verify' that they are using a REAL email address.

    +
    [!WebLoginPE? &type=`register` &regType=`verify`!]
    + +

    &regRequired

    +

    WebLoginPE allows you to specify which inputs in your form are required for registration. The regRequired parameter is a comma separated list of form field "name" attributes that the user MUST fill out. If the form is submitted and one of your required fields is blank, WebLoginPE will display a message notifying the user of which required fields they left blank. If you want to verify/confirm form fields (e.g. a password field or email field), give the field a name attribute of the field name you want to confirm plus ".confirm". To confirm a password:

    +
    +<input type="password" name="password" />
    +<input type="password" name="password.confirm" />
    +
    +
    [!WebLoginPE? &type=`register` &regRequired=`email,username,fullname,password,formcode,tos`!]
    + +

    &customTable, &customFields

    +

    For total control, WebLoginPE creates a table in your MODx database to store as many user attributes as you want. The default name for this table is 'web_user_attributes_extended', but you can override that with the customTable parameter. You can specify an unlimited amount of column names for this table using the customFields parameter.

    +
    [!WebLoginPE? &customTable=`my_web_users` &customFields=`website,aim,msn,city,address1`!]
    + +

    &prefixTable

    +

    WebLoginPE will create a table for storing extended user attributes, but if you have already created your own table (and specified it in &customTable) and it does not use the table prefix you entered when you installed MODx, you can use &prefixTable=`0` (default is 1) and WebLoginPE will not auto append the MODx table prefix to the table when it searches for it.

    +
    [!WebLoginPE? &customTable=`a_table_i_created` &prefixTable=`0`!]
    + +

    &disableServices

    +

    This parameter will accept a comma separated list of services to disable.You can disable individual services like "deleteprofile" and "viewprofile" as well as entire types like "register" and "users".

    +
    [!WebLoginPE? &disableServices=`deleteprofile,users` !]
    +

    If you want to disable front end registration (only the admin can add users)

    +
    [!WebLoginPE? &disableServices=`register` !]
    + + +

    &tableCheck

    +

    When you run WebLoginPE, it checks for the existence of the extra user attributes table and creates it if it does not exist. In 1.3.0 it also creates some new Web Access Service Events for plugins if they do not already exist. By setting &tableCheck to 0 (default is 1) you can skip these checks for a little speed bump. If you have not let WebLoginPE create your table and System Events yet, they will not be created.

    +
    [!WebLoginPE? &tableCheck=`0`!]
    + +

    &groups

    +

    You can specify which document user group your new applicants will be added to on successful registration. The parameter &groups is a comma separated list of 'Web User Groups' (See "Security > Web Permissions" in the manager).

    +
    [!WebLoginPE? &type=`register` &groups=`Registered Users`!]
    +

    or, to add them to more than one group...

    +
    [!WebLoginPE? &type=`register` &groups=`Cadets,New Applicants,Limited`!]
    + +

    &notify

    +

    A comma separated list of email addresses to be notified on new user registration.

    +
    [!WebLoginPE? &type=`register` &notify=`webmaster@yoursite.com, admin@mysite.url`!]
    + +

    &liHomeId (the login home id)

    +

    A comma separated list of document ID's to redirect the user to after successful login. WebLoginPE will loop through the list and attempt to load each page for the user. If the user does not have permission for that page WebLoginPE will try the next and so on. The user is redirected to the first document in the list that they have permission to access.

    +
    [!WebLoginPE? &liHomeId=`51,44,37,15`!]
    + +

    &loHomeId (the log out home id)

    +

    The document ID of the page the user should be redirected to after logging out.

    +
    [!WebLoginPE? &loHomeId=`4`!]
    + +

    &regHomeId

    +

    The document ID of the page containing the WebLoginPE snippet call for type register. This is useful if you have WebLoginPE in the sidebar but you want to use a full page of input forms, etc... that will not fit in a narrow side bar.

    +
    [!WebLoginPE? &regHomeId=`66`!]
    + +

    &profileHomeId

    +

    The document ID of the page containing the WebLoginPE snippet call for type profile. This is useful if you have WebLoginPE in the sidebar but you want to use a full page of input forms, etc... that will not fit in a narrow side bar.

    +
    [!WebLoginPE? &profileHomeID=`67`!]
    + +

    &regSuccessId, &regSuccessPause

    +

    The document ID of the page you want the user to be redirected to after successfully registering for a new account. If unset, this is ignored and the user stays at the registration confirmation. You can specify the amount of time (in seconds) to delay before redirection using &regSuccessPause. The default pause is 5 seconds.

    +
    [!WebLoginPE? &type=`register` &regSuccessId=`71` &regSuccessPause=`3`!]
    + +

    &userImage

    +

    WebLoginPE can upload and resize an image to identify a user, kind of like an avatar. You can specify the maximum allowable file size of this image (in bytes) and its width and height (in pixels). The default is '105000,100,100' (100kb, 100px X 100px).

    +
    [!WebLoginPE? &type=`profile` &userImage=`500000,250,250`!]
    + +

    &dateFormat

    +

    You can specify the string format for the date in the placeholders set by WebLoginPE. please see for details on the format. The default is '%A %B %d, %Y at %I:%M %p'.

    +
    [!WebLoginPE? &dateFormat=`%m-%d-%Y`!]
    + +

    &loadJquery

    +

    WebLoginPE was designed to work with jQuery and the jQuery taconite plugin, but, if you prefer to use another JavaScript library... well, that's fine too. WebLoginPE works the way you want to. If you would like to have the jQuery files loaded into the head of your template automatically, set this parameter to 'true'. The default is 'false'

    +
    [!WebLoginPE? &loadJquery=`true`!]
    + +

    &customJs

    +

    The URL to the custom JavaScript file you are using with the jQuery package. See 'example.js' to get an idea of how it works.

    +
    [!WebLoginPE? &customJs=`assets/snippets/webloginpe/js/example.js`!]
    + +

    &pruneDays

    +

    The number of days after which non-activated user accounts will be deleted. When a new user registers, a time stamp for the current date/time is placed in the `cachepwd` column of the `web_users` table. When they log in, the timestamp is deleted. If a user passes a false email address, or they register and never log in, the account is stale, useless, and takes up space in your database.

    +

    For example: &pruneDays=`30` will check the database for all accounts that have a time stamp in the cachepwd column, then check those accounts to see if the time stamp in cachepwd is older than the number of days we set in the &pruneDays parameter (in this case, 30 days). If it IS older, the account is deleted and a notification is sent to the address of [(emailsender)].

    +

    If this parameter is not set in your snippet call, no user pruning action will ever be taken

    +
    [!WebLoginPE? &pruneDays=`7`!]
    + +

    &inputHandler

    +

    A parameter for super-fine control of form inputs. More details and examples can be found in .

    +

    The syntax is &inputHandler=`LABEL:DOM_ID:FIELDNAME:FIELD_TYPE:Option(value),Option2(value2)`. Use double bars to separate inputs (for inputs that are not in the standard web_user_attributes table, remember to specify them in &customFields.

    +

    &inputHandler loops over every option in the form field (select, select multiple, radio, or checkbox) and compares it to the entries stored in the user's table. If the user has any of the options, radios or checkboxes selected, it will output selected="selected" or checked="checked" in the fields. &inputHander also sets a placeholder [+form.fieldname+] (example [+form.favorite_color+]) which includes the entire label, field, options and all.

    +

    So in your form where you would put your label->input->etc... you just put the form placeholder. You have to use this placeholder if you want the checks checked and the selects selected.

    +
    +[!WebLoginPE?
    +&customFields=`website,aim,msn,address1,city,favorite_color,demographic,emailprivate,aimprivate,msnprivate`
    +&inputHandler=`Favorite Colors:userProfileFavoriteColor:favorite_color:select multiple:Red(red), Blue(blue), Green(green), Black(black), Orange(orange), Yellow(yellow)||Age Group:userDemographic:demographic:radio:Less than 13(1),14 - 18(2),19 - 30(3), 31 - 40(4), 41-50(5), 51-65(6), 65 or older(7)||Keep my email private:userProfileEmailPrivate:emailprivate:checkbox:()||Keep my AIM account private:userProfileAIMPrivate:aimprivate:checkbox:()||Keep my MSN account private:userProfileMSNPrivate:msnprivate:checkbox:()`!]
    +
    +

    You may have noticed the xxxprivate fields above. That is also a new feature. Lets take the email column in the attributes table for example. if you put `emailprivate` in your &customFields and then assign it a checkbox in &inputHandler, when a user checks that checkbox on their profile, any time another user views their profile, it will say "Private" instead of their actual email. You can do this for ANY field.

    + +

    &usersList

    +

    For use with both `user` and `manager` types.

    +

    A parameter for controlling the list(s) of users in a WebLoginPE `users` page (formerly "View all users"). This allows you to display multiple lists of your web users (all on the same page) filtered by certain values, sorted in the order of a certain field in ascending or descending format. It is really quite flexible. The Format is as follows.

    +
    &usersList=`List Name:outerTplChunk:userTplChunk:sortField:sortOrder:filter(value),filter2()`
    +

    Ok, let's break that down. This snippet parameter has seven distinct areas. I'll explain them one at a time.

    +
      +
    • List Name: The name of the list. Should be descriptive, like "Administrators", or "Female users"
    • +
    • outerTplChunk: The chunk name of an outer template. Basically a "List wrapper". See as plain text.
    • +
    • userTplChunk: The chunk name of a template to display each user. This will be repeated for every user in this list. See as plain text.
    • +
    • sortField: Any of the user attributes (including customFields) that you want to sort your list by, such as username, fullname, internalKey, etc...
    • +
    • sortOrder: The order to display the sorted list in (ASC for ascending | DESC for descending).
    • +
    • filter(value): The filter section looks complex, but let me simplify. The filter can be any field in the user attributes or customTable (or the word "webgroup" or the word "online"). For the database fields, it will loop through your users and eliminate anyone who does not have data in that field.
    • +
    +

    But filter(value) goes on deeper than that. It can search for a particular value too. If you used email(hotmail), it would return a list of everyone who has the string "hotmail" in their `email` column. if you used just email(), it would return everyone with ANY value in their `email` column (should be everyone, right?). Instead of providing a column to filter by, you can use the word "webgroup" and pass a web group name as it's value. For example webgroup(Registered Users) would return only people in the group "Registered Users". You could make a list of the administrators by using webgroup(Site Admins). You can also pass "online()" as a filter value and it will return a list of the users who are currently online (within the last 15 minutes). You can string these together to really filter them down too! Lets make a list called "Online Admins with Gmail accounts" using the default templates, sorted by internalKey in ascending order and filtered by, of course, must be online, must be an admin, and must have gmail in their email address

    +
    +[!WebLoginPE?
    +&type=`users`
    +&usersList=`Online Admins with Gmail accounts:default:default:internalKey:ASC:online(), webgroup(Site Admins), email(gmail)`!]
    +
    +

    For multiple lists on a page, you separate the lists in &usersList with double pipes (||). In the first list below, I have left the entire filter area blank because I want ALL USERS, but notice that I have left the colon (:) after the sort order. This is important.

    +
    [!WebLoginPE? &type=`users` &usersList=`All Users:default:default:username:ASC:||usersList=`Female Users:default:default:username:ASC:gender(2)`!]
    +

    If you do not want to specify all this list stuff and just want to use

    +
    [!WebLoginPE? &type=`users`]
    +

    to get a list of web users, WebLoginPE has a default list format. This is overridden when you specify &usersList.

    +
    [(site_name)] Members:default:default:username:ASC:
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/02_\320\237\321\200\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/02_\320\237\321\200\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" new file mode 100644 index 00000000..b6421371 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/02_\320\237\321\200\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270.md" @@ -0,0 +1,38 @@ + + +

    WebLoginPE: Плейсхолдери

    +Плейсхолдери сніпета WebLoginPE. +
    +

    One of the things that makes WebLoginPE so easy to customize is the comprehensive set of placeholders that it provides for use in your custom views and templates.

    +

    General Purpose Placeholders

    +

    For areas such as login and profile editing where you would want to display information about the currently logged in user, there are placeholders set for each of the attributes stored in the database with their internalKey. These placeholders start with "user" and then the name of the database column.

    +

    Приклади

    +
    +[+user.username+], [+user.fullname+], [+user.email+], [+user.aim+], [+user.website+], etc...
    +
    + +

    View User Placeholders

    +

    For areas such as the users page and view profile where you would want to display information about other web users, there are placeholders set for each of the attributes stored in the database with that user's internalKey. These placeholders start with "view" and then the name of the database column.

    +

    Приклади

    +
    +[+view.username+], [+view.age+], [+view.country+], [+view.gender+], [+view.website+], etc...
    +
    + + +

    Form Placeholders

    +

    When using the &inputHandler parameter, entire sections of a form are generated and put into placeholders that start with "form" and then the input's name attribute. These placeholders contain the label, select, options, radios, checkboxes, et al, so all you have to do is put the placeholder in the form where you would want the element to appear. There are two form placeholders that are generated by default

    +

    Приклади

    +
    +[+form.country+] and [+form.gender+]
    +
    + +

    Other Useful Placeholders

    +

    WebLoginPE also generates a few other helpful placeholders that you can use in your forms and templates.

    +

    Примеры

    +
    +[+tos+] The Terms of Service chunk.
    +[+user.defaultphoto+] A pointer to the default user photo.
    +[+request.userid+] The user ID for the Activation form.
    +[+request.activationkey+] The activation key for the Activation form.
    +[+form.captcha+] The captcha image for use with your registration form. +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" new file mode 100644 index 00000000..b36b2251 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/03_\320\250\320\260\320\261\320\273\320\276\320\275\320\270.md" @@ -0,0 +1,883 @@ + + +

    WebLoginPE: Шаблони

    +Шаблони сніпета WebLoginPE Simple Register Profle Manager Users Taconite. +
    +

    Every view that is presented to the user can be customized using MODx chunks.

    +

    The snippet changes between views based on a post-back system. It looks for the value of $_POST['service'] to determine which view to display. In the case of the default view for a logged in user, a form is presented with two submit buttons. The buttons each have the name attribute set to "service", but a different value

    +
    + 
    +
    +
    +

    If the "Log Out" button is pressed, the $_POST['service'] value is "logout" and WebLoginPE executes the code in the case 'logout': block.

    +

    The services in WebLoginPE are:

    + + + + + + +

    &messageTpl

    +

    WebLoginPE will display many messages, either confirmations or errors. The message will be placed in a placeholder ([+wlpe.message+]) which you can put anywhere in your custom form or anywhere on the page.

    +

    When creating the chunk for &messageTpl you should place "[+wlpe.message.text+]" wherever you want the actual message to show up in the template.

    +

    Default:

    +
    +<div><p>[+wlpe.message.text+]</p></div>
    +
    + +

    &loginFormTpl

    +

    The view presented to the user asking for their "username" and "password". Required form field names are "username" and "password". Optional inputs are a checkbox named "rememberme" which sets a 5 year cookie, or a select named "stayloggedin" which sets a cookie for the number of seconds specified in each options value. The cookie name is "WebLoginPE" and the value is a MD5 hash of the username and password (usernames and passwords should never be set in the open because cookies are saved in plain text. That is why WebLoginPE converts them to a hash). When the user returns to your site, WebLoginPE grabs the cookie, uses an algorithm to decode the username and password, then automatically logs the user in.

    +

    Default: defaultLoginFormTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    + Web User Login Form + + + + + +
    + +
    + + + +
    +
    +
    +
    + +

    &successTpl

    +

    The view presented to the user asking for their "username" and "password". Required form field names are "username" and "password". Optional inputs are a checkbox named "rememberme" which sets a 5 year cookie, or a select named "stayloggedin" which sets a cookie for the number of seconds specified in each options value. The cookie name is "WebLoginPE" and the value is a MD5 hash of the username and password (usernames and passwords should never be set in the open because cookies are saved in plain text. That is why WebLoginPE converts them to a hash). When the user returns to your site, WebLoginPE grabs the cookie, uses an algorythm to decode the username and password, then automatically logs the user in.

    +

    Default: defaultLoginSuccessTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    + <img id="wlpeMyProfileImg" src="[+user.photo+]" alt="[+user.username+]" title="[+user.username+]" height="30" width="30"> +

    Welcome back [+user.username+]!

    +
    +

    You have logged into [(site_name)] [+user.logincount+] times now.
    + Your last login was [+user.lastlogin+]

    +
    + [+user.comment+] +
    +
    +
    +
    + + +
    +
    +
    +
    + + +

    &registerTpl

    +

    The view presented to the user to register for a new account. You can have a form input for every field in the database table "web_user_attributes" and all the fields set in &customFields*. When setting up your form, the input name attribute should be the same as the field name in the table. For example, the form input asking for the users mobile phone number (table field "mobilephone") should be:

    +
    <input type="text" name="mobilephone" value="[+post.mobilephone+]" />
    +

    Placeholders for values in the $_POST array are available for use in your forms so that if there is an error, all the information that the user entered in your form is not lost. As you can see in the example for "mobilephone" above, the placeholder "[+post.inputname+]" is set for each input name attribute.

    +

    If you specified form fields in &inputHandler, you could also use the [+form.fieldname+] placeholder here.

    +

    *It is advised against providing inputs for id, internalKey, role, blocked, blockedunitl, blockedafter, failedlogincount, and sessionid as that can SERIOUSLY corrupt your entire MODx installation. Those fields should only be edited by the web master from the back end.

    +

    Default Instant: defaultRegisterInstantFormTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    +
    +

    Use this form to register for a new user account.
    + Filds marked with * are required. +

    +
    + Register for a new user account + + + + + + + + + + + + + + + + + + + + + [+form.country+] + + + + [+form.gender+] + + <img id="wlpeUserDefaultImage" src="[+user.defaultphoto+]" alt="Default User Image" title="Default User Image" height="100" width="100"> + + +

    No bigger than 100kb. will be resized to 100 x 100.

    + + + + <img id="wlpeCaptchaImage" src="[+form.captcha+]" width="148" height="60" alt="If you have trouble reading the code, click on the code itself to generate a new random code."> + + + +

    Terms of Service/Privacy Policy

    +
    [+tos+]
    + + +
    + +
    + + +
    +
    +
    +
    +

    Default Verify: defaultRegisterVerifyFormTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    +

    Enter your email address, your name, and your desired username in the fields below.

    +

    A password will be emailed to you with instructions on how to activate Your account.

    + + + + + + + +
    +
    + + +
    +
    +
    +
    + +

    &registerSuccessTpl

    +

    The view presented to the user to after successfully registering for a new account. If you want this custom view to be displayed after registration, DO NOT put the &regSuccessId parameter in your call. The default is the whatever is specified in &loginFormTpl so the user can log in after registering.

    +

    Default: defaultLoginFormTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    + Web User Login Form + + + + + +
    + +
    + + + +
    +
    +
    +
    + +

    &tosChunk

    +

    In your registration form, you may want your users to agree to your "Terms Of Service / Privacy Policy" before you accept their registration. You specify your terms of service chunk with this parameter, then in your registration form, use the placeholder [+tos+] (which is set by WebLoginPE to hold your tosChunk) where you want your Terms of Service to be displayed and put a checkbox with the name attribute set to "tos". You should also specify "tos" in the &regRequired parameter to make sure that if they don't check it (signifying that they agree) they will not be allowed to register.

    +
    +

    Terms of Service/Privacy Policy

    +
    [+tos+]
    + +
    +

    The default terms of service were generated by Kinky Solution's Terms Of Service / Privacy Policy Document Generator.

    +

    Default: defaultTosTpl

    + + + +

    &profileTpl

    +

    The form presented to the user which allows them to modify their attributes stored in the databse. Like &registerTpl, this form can contain as many or as few of the table fields from web_user_attributes AND the extended user attributes table as you want. The difference in this form is that you can set the value of the form fields to one of the placeholders. For example the "Full Name" input would look like:

    +
    +
    +
    +

    If you specified form fields in &inputHandler, you could also use the [+form.fieldname+] placeholder here and the users selections and checks would be remembered and pre-selected or pre-checked.

    +

    Default: defaultProfileTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    +
    +

    Hello [+user.fullname+] ([+user.username+])!

    +

    Use this form to update your profile information

    +
    + + Your User Profile + + + + + + + + + + + + + + + + [+form.country+] + + + + [+form.gender+] + + + + <img id="wlpeUserProfilePhotoImg" src="[+user.photo+]" alt="[+user.username+]" title="[+user.fullname+]" height="100" width="100"> + + + +

    No bigger than 100kb. will be resized to 100 x 100.

    + +
    + Change your password +

    Change your password
    (leave blank if you do not want a new password).

    + + + + +
    +
    + +
    + + + + +
    +
    +
    +
    + + + +

    &userOuterTpl

    +

    The template that works as a "wrapper" for each of your lists in type=`users`.

    +

    Default: defaultUserOuterTpl

    +
    +[+wlpe.message+]
    +
    +

    [+view.title+]

    + [+view.list+] +
    +
    + +

    &usersTpl

    +

    When you have called WebLoginPE with &type=`users`, each user in the databases is listed and (in the default template) their user image and username are links to a separate area that can list more details about the user and give other users a form to contact that user. Since this view may contain privileged data, you may want to use "Access Permissions" on this page. The &usersTpl paramter chunk should define the structure of the block for EACH user on this page. It will loop through each user, one at a time, exchange the placeholders for their info, add it to the que, then go to the next user. When it has finished looping over each user, it will return the entire que to the page. This view has access to the [+user.age+] placeholder that calculates the user's age based on their DOB.

    +

    If you specified form fields in &customFields parameter for register and profile, you should also specify them here to make sure placeholders are set for them.

    +

    Default: defaultUsersTpl

    +
    +[+wlpe.message+]
    +
    +
    + <a href="[~[*id*]~]?service=viewprofile&username=[+view.username+]"> + <img src="[+view.photo+]" alt="[+view.photo+]" title="[+view.username+]" height="100" width="100"> + </a> + <a href="[~[*id*]~]?service=viewprofile&username=[+view.username+]"> +

    [+view.username+]

    + </a> +
    +
    +

    Username: [+view.username+]

    +

    Age: [+view.age+]

    +

    Last Login: [+view.thislogin+]

    +
    [+view.comment+]
    +
    +
    +
    + +

    &viewProfileTpl

    +

    When you have called WebLoginPE with &type=`users`, each user in the databases is listed and (in the default template) their user image and username are links to a separate area that can list more details about the user and give other users a form to contact that user. As with &usersTpl, this view may contain privileged data, you may want to use "Access Permissions" on the calling page. The &viewProfileTpl paramter chunk should define the structure of this separate area to view more details on an individual user. This view has access to the [+view.age+] placeholder that calculates the user's age based on their DOB.

    +

    If you specified form fields in &customFields parameter for register and profile, you should also specify them here to make sure placeholders are set for them.

    +

    Default: defaultViewProfileTpl

    +
    +[+wlpe.message+]
    +
    +	
    +		
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +			
    +		
    +		
    +			
    +		
    +	
    +

    Viewing the profile of "[+view.username+]":

    Username:[+view.username+]
    Full Name:[+view.fullname+]
    Email:[+view.email+]
    Phone Number:[+view.phone+]
    Mobile Phone Number:[+view.mobilephone+]
    Fax Number:[+view.fax+]
    State:[+view.state+]
    Country:[+view.country+]
    Age:[+view.age+]
    Gender:[+view.gender+]
    Signature:[+view.comment+]
    Photo:<img src="[+view.photo+]" alt="[+view.photo+]" title="[+view.username+]">
    +
    +
    +

    Contact [+view.username+]

    + + + +
    +
    + +
    +
    +
    +
    + +

    &profileDeleteTpl

    +

    The form presented to the user to confirm that they actually want to delete their account. This is presented after the user has clicked the "Delete My Profile" button on the profile page. We want to make sure they didn't click it by accident!

    +

    Default: defaultProfileDeleteTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    + Delete Your Profile +

    WARNING!

    +

    You are about to delete your profile. Are you sure you want to continue?

    +
    + +
    + + +
    +
    +
    +
    + +

    &manageOuterTpl

    +

    The template that works as a "wrapper" for each of your lists in type=`manager`. The default is the same as the default &userOuterTpl.

    +

    Default: defaultUserOuterTpl

    +
    +[+wlpe.message+]
    +
    +

    [+view.title+]

    + [+view.list+] +
    +
    + +

    &manageTpl

    +

    The template (chunk) that will be applied to each user in type=`manager`.

    +

    Default: defaultManageTpl

    +
    +
    +
    +
    + <img src="[+view.photo+]" alt="[+view.photo+]" title="[+view.username+]" height="100" width="100"> +

    [+view.username+]

    + + + +
    +
    +

    Username: [+view.username+]

    +

    Age: [+view.age+]

    +

    Current Status: [+view.status+]

    + +
    + + +
    +
    +
    +
    +
    + +

    &manageProfileTpl

    +

    The Form (chunk) that will be displayed when editing a user's attributes in type=`manager`.

    +

    Default: defaultManageProfileTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    +
    +

    Editing the profile of [+view.username+] ([+view.fullname+])!

    +

    Use this form to edit [+view.username+]'s profile information

    +
    + + [+view.username+]'s User Profile + + + + + + + + + + + + + + + + + + + + [+form.country+] + + + + [+form.gender+] + + + + <img id="wlpeUserProfilePhotoImg" src="[+view.photo+]" alt="[+view.username+]" title="[+view.fullname+]" height="100" width="100"> + + + +

    No bigger than 100kb. will be resized to 100 x 100.

    + +
    + Change your password +

    Change your password
    (leave blank if you do not want to set a new password for this user).

    + + + + +
    +
    + +
    + + + +
    +
    +
    +
    + +

    &manageDeleteTpl

    +

    The Form (chunk) that will be displayed asking for confirmation of intention to delete after clicking the "Delete Profile" button for a user in type=`manager`.

    +

    Default: defaultManageDeleteTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    + Delete User Profile +

    WARNING!

    +

    You are about to delete the profile of "[+post.username+]". Are you sure you want to continue?

    +
    + +
    + + +
    +
    +
    +
    + +

    &resetTpl

    +

    The form presented when a user clicks the "Forgot Password" button. This form has only one input ("email"). They enter their email address, WebLoginPE sets a random password and key in the web_users table's cachepwd field and sends them a link to the URL of the page that this was called from with the string "?service=activate&userid=3&activationkey=kl3tW5rtDi where "3" would be the users internalKey and "kl3tW5rtDi" would be the randomly generated activation key which is a 10 character string.

    +

    Default: defaultResetFormTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    +

    Don't Worry, it happens to everyone.

    +

    Enter your email address in the field below and we will set a temporary password for your account.

    +

    This temporary password will be emailed to you with instructions on how to activate it.

    + +
    + +
    + + +
    +
    +
    +
    + +

    &activateTpl

    +

    This form is presented when the user clicks the link in the email that was sent from the &resetTpl form. It is the view for service=activate. The user is asked for the temporary password that was emailed to them and they are given the option to set a new password. WebLoginPE then checks that the temporary password and the activationkey match what was stored in the cachepwd field for the internalKey in the web_users table. If everything checks out, the new password that the user entered is activated. The default form has three input fields with the name attributes "activationpassword", "newpassword", and "newpassword.confirm".

    +

    Default: defaultActivationFormTpl

    +
    +[+wlpe.message+]
    +
    +
    +
    + + + + + + +
    + +
    + +
    +
    +
    +
    + +

    &notifyTpl

    +

    This is not a view presented to the user, but a template format for the email message that will be sent to the addresses in &notify. It uses all the placeholders that are available in the Tools > Configuration > User > Web signup email template, with the addition of [+uem+] for the user's email address. The user's password will NOT be available in this template.

    +

    Default: defaultNotifyTpl

    +
    +Hello, my name is [+ufn+] and I just signed up at [+sname+] as "[+uid+]" using WebLoginPE.
    +My email address is [+uem+].
    +P.S. This message was auto generated by WebLoginPE and PHPMailer.
    +
    + +

    &notifySubject

    +

    This is also not a view presented to the user, but a definition of the subject line for the email message that will be sent to the addresses in &notify.

    Default:

    +

    New Web User for [(site_name)].

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/index.md" new file mode 100644 index 00000000..a5c643b7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/WebloginPE/index.md" @@ -0,0 +1,4 @@ + + +

    WebLoginPE Розширене управління веб-користувачами

    +Сніпет для розширеного управління користувачами такого як реєстрація, авторизація, активація Легко управляється за допомогою шаблонів, дозволяючи отримати потрібний варіант. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..68b33fbd --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,145 @@ +Встановлення +============ + +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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/02_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/02_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" new file mode 100644 index 00000000..3567cce7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/02_\320\232\320\276\320\275\321\204\321\226\320\263\321\203\321\200\320\260\321\206\321\226\321\217.md" @@ -0,0 +1,268 @@ +Конфігурація +============= + +> 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/03_\320\234\320\276\320\262\320\275\321\226 \321\200\320\265\320\266\320\270\320\274\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/03_\320\234\320\276\320\262\320\275\321\226 \321\200\320\265\320\266\320\270\320\274\320\270.md" new file mode 100644 index 00000000..12d5a48e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/03_\320\234\320\276\320\262\320\275\321\226 \321\200\320\265\320\266\320\270\320\274\320\270.md" @@ -0,0 +1,82 @@ +Мовні режими +============== + +> 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/04_\320\234\320\276\320\262\320\275\321\226 \320\275\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/04_\320\234\320\276\320\262\320\275\321\226 \320\275\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" new file mode 100644 index 00000000..084fbf4e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/04_\320\234\320\276\320\262\320\275\321\226 \320\275\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217.md" @@ -0,0 +1,144 @@ +Мовні налаштування +================= + +> 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/05_\320\227\320\260\320\277\320\276\320\262\320\275\321\216\320\262\320\260\321\207\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/05_\320\227\320\260\320\277\320\276\320\262\320\275\321\216\320\262\320\260\321\207\321\226.md" new file mode 100644 index 00000000..e5f44ab2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/05_\320\227\320\260\320\277\320\276\320\262\320\275\321\216\320\262\320\260\321\207\321\226.md" @@ -0,0 +1,201 @@ +Заповнювачі +============ + +> 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/06_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217 (\320\272\321\200\320\276\320\272 \320\267\320\260 \320\272\321\200\320\276\320\272\320\276\320\274).md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/06_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217 (\320\272\321\200\320\276\320\272 \320\267\320\260 \320\272\321\200\320\276\320\272\320\276\320\274).md" new file mode 100644 index 00000000..cb71c716 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/06_\320\235\320\260\320\273\320\260\321\210\321\202\321\203\320\262\320\260\320\275\320\275\321\217 (\320\272\321\200\320\276\320\272 \320\267\320\260 \320\272\321\200\320\276\320\272\320\276\320\274).md" @@ -0,0 +1,174 @@ +Налаштування (крок за кроком) +===== + +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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/07_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 \321\204\321\200\320\260\320\263\320\274\320\265\320\275\321\202\320\260.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/07_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 \321\204\321\200\320\260\320\263\320\274\320\265\320\275\321\202\320\260.md" new file mode 100644 index 00000000..95a2c090 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/07_\320\222\320\270\320\272\320\276\321\200\320\270\321\201\321\202\320\260\320\275\320\275\321\217 \321\204\321\200\320\260\320\263\320\274\320\265\320\275\321\202\320\260.md" @@ -0,0 +1,139 @@ +Використання фрагмента +======= + +> 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/08_\320\242\320\265\321\205\320\275\321\226\321\207\320\275\321\226 \320\264\320\265\321\202\320\260\320\273\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/08_\320\242\320\265\321\205\320\275\321\226\321\207\320\275\321\226 \320\264\320\265\321\202\320\260\320\273\321\226.md" new file mode 100644 index 00000000..9e46ab5f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/08_\320\242\320\265\321\205\320\275\321\226\321\207\320\275\321\226 \320\264\320\265\321\202\320\260\320\273\321\226.md" @@ -0,0 +1,136 @@ +Технічні деталі +================= + +> 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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/01_YAMS + Snippets" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/01_YAMS + Snippets" new file mode 100644 index 00000000..7d4d0b37 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/02_YAMS Custom Multilingual TVs Chunks Snippets.md" new file mode 100644 index 00000000..c59adc1a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/03_YAMS Language Dependent Layout.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/03_YAMS Language Dependent Layout.md" new file mode 100644 index 00000000..bb2b6007 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/04_YAMS Language Flag List.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/04_YAMS Language Flag List.md" new file mode 100644 index 00000000..3ab386c0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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:
      ` + &repeattpl=`otherFlagItemTpl` + ¤ttpl=`currentFlagItemTpl` + &aftertpl=`@CODE:
    + + (yams_name) + + + +and "currentFlagItemTpl" is a chunk that contains an unlinked flag image: + +
  • + (yams_name) +
  • + +Flag images with the filename format (yams\_id).png should be placed in the directory "assets/images/flags/". diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/05_YAMS Language Select Landing Page.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/05_YAMS Language Select Landing Page.md" new file mode 100644 index 00000000..335b3ad4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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: + + +
  • + + (yams_name) + +
  • + + 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: + + +
      + [[YAMS? + &get=`repeat` + &repeattpl=`LandingPageRepeat` + ]] +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/06_YAMS Mime-type Dependent Alias Suffixes.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/06_YAMS Mime-type Dependent Alias Suffixes.md" new file mode 100644 index 00000000..dc4cbff7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/07_YAMS Multilingual Weblinks.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/07_YAMS Multilingual Weblinks.md" new file mode 100644 index 00000000..1730ef9a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/08_YAMS XML Sitemap.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.md/08_YAMS XML Sitemap.md" new file mode 100644 index 00000000..1b0bf065 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/09_\320\232\320\260\320\272.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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/index.md" new file mode 100644 index 00000000..45afe953 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/YAMS/index.md" @@ -0,0 +1,65 @@ +YAMS +===== +> Повна документація англійською мовою для Evolution CMS v1.4 + и v2 + + +Автор: [PMS](https://github.com/Deesen/) + +**Ліцензія:** GPL v3 + +**YAMS** - це аддон для Evo здатний налаштовуватись, який дозволяє легко створювати багатомовні веб-сайти. + +Версія PHP не нище 5.6 + +[Github] (https://github.com/Deesen/YAMS) + +В даний час реалізовані такі функції: + +* Весь контент управляється через одне дерево документів, щоб забезпечити узгоджену структуру сайту для всіх мовних варіантів. + +* Стандартні наповнювачі Evo можуть використовуватися в шаблонах документів для створення багатомовного контенту і URL-адрес. + +* Мовна розкладка з вкладками для багатомовних документів (потрібен ManagerManager) + +* Шаблони документів можуть бути налаштовані як багатомовні або одномовні. + +* Багатомовні URL-адреси, які налаштовуються. Нижче наведені приклади різних способів налаштування YAMS для посилання на мовні варіанти одного документа: + +**Багатомовні псевдоніми:** + +Http: //sitename/my-doc-en.html + +Http: //sitename/mon-doc-fr.html + +**Тільки режим ім'я сервера:** + +http://en.sitename.com/mydoc.html + +http://fr.sitename.com/mydoc.html + +**Тільки режим ім'я кореня:** + +http://sitename.com/en/mydoc.html + +http://sitename.com/fr/mydoc.html + +**Тільки режим імені кореня, з однією мовою в корені:** + +http://sitename.com/mydoc.html + +http://sitename.com/fr/mydoc.html + +**Режим імені сервера, режим кореневого імені, зрозумілі шляхи псевдонімів, багатомовні псевдоніми і багатобайтові URL:** + +http://en.sitename.com/england/folder/mydoc.html + +http://fr.sitename.com/la-france/répertoire/mon-doc.html + +* Додаткова конфігурація URL, в тому числі можливість приховувати псевдонім стартового документа сайту, SEO-дружнє перенаправлення, багатобайтові URL і суфікси, що залежать від типу вмісту. + +* Додаткові мітки-заповнювачі YAMS, що забезпечують доступ до конкретних налаштувань мови, таким як ім'я і напрямок мови. + +* Додаткові функції за допомогою виклику фрагмента YAMS, в тому числі можливість управління призначеними для користувача багатомовними фрагментами, фрагментами і змінними шаблонів для створення перемикачів мови на основі списку або списку що розкривається (тимчасово), можливість повторювати контент на декількох мовах ... + +* Розширення для Ditto, Wayfinder, Jot і eForm. + +* Можливість створення призначених для користувача багатомовних шаблонних змінних. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..78fc19c4 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/01_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,84 @@ +## Початок використання bLang ## + +#### 1. Встановлення +bLang можна встановити як з репозиторія (версія 1.0.1b), так і завантажити архів з гітхаба. + +#### 2. Налаштування .htaccess +Після встановлення необхідно в htaccess перед # For Friendly URLs додати код +```apacheconfig +RewriteRule ^([a-z]{2})$ $1/ [R=301,L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^([a-z]{2})/(.*)$ index.php?q=$2&lang=$1 [L,QSA] +``` + +#### 3. Конфігурація bLang +Після заходимо в модуль bLang на вкладку конфігурація і підганяємо конфіг під себе. + +* Вказуємо мови. +* Вказуємо суфікси полів для кожної мови. +* Вказуємо головну мову + +Інші налаштування менш важливі. + + +#### 4. Створення TV полів +Переходимо на вкладку Параметри. +Тут можна створювати багатомовні TV. +Логіка проста, ви створюєте один параметр в модулі, а bLang сам автоматично робить дубль під кожну мову з урахуванням суфікса. + +Для зручності є кнопка "Додати стандартні параметри", вона автоматом в модулі створить основні поля такі як (titl,desc,pagetitle,description). Після необхідно тільки прив'язати до шаблонів. + +#### 5. Створення вкладок. + +bLang може автоматично визначити, на яку вкладку необхідно закинути тв поле, на підставі значення з інпута "Назва вкладки". +Якщо там записано seo. [lang] - це значить, що поле titl_en додасть на вкладку seo в секцію en. +Якщо записано [lang], тв поле pagetitle_en буде на вкладці en. +Якщо записно main, тв поле незалежно від мови буде на вкладці main. + + +Якщо ви використовуєте manager, достатньо в чанк додати код +``` +$bLangModuleObj = new \bLang\bLangModule($modx,'',''); +$bLangModuleObj->getMMRules(); +``` + +Якщо використовуєте templateedit3, і вам потрібно додати вкладки після General +```php +$bLangModuleObj = new \bLang\bLangModule($modx,$modulePath,$moduleurl); +$config = $bLangModuleObj->te3AddAfter('General',$config); +``` +Якщо використовуєте templateedit3, і вам потрібно просто отримати список вкладок, які bLang згенерував +```php +$bLangModuleObj = new \bLang\bLangModule($modx,$modulePath,$moduleurl); +$bLangModuleObj->getTE3Rules(); +``` + +#### 6. Словник +Всі написи які є в шаблоні, і їх потрібно переводити необхідно додавати в словник. Він знаходиться в модулі bLang на вкладці Словник. +В колонку назви пишіть ключ, за яким будете отримувати значення в шаблоні. +В шаблоні можна отримати через. +``` +[(__name)] +``` +В сніпеті +```php +$modx->getConfig('__name'); +``` + +#### 7. Спец. змінні +Після ініціалізації bLang в $ modx-> config записує крім словника, кілька спец. полів + +[(_lang)] - ключі поточної мови +[(_root)] - префікс урла для поточної мови +[(_suffix)] - суфікс полів для поточної мови +[(_en_url)] - урл поточної сторінки для en мови + + +#### 8. Поля поточного ресурсу і урл. +ЕЯкщо включено "Автоматично підставляти поля в $ modx-> documentObject" і "Автоматично підставляти префікс (_root) для урлів", то в шаблоні, +як і зазвичай можна писати +```php +[*pagetitle*] +[~[*id*]~] +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/02_\320\241\320\275\321\226\320\277\320\265\321\202_bLang.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/02_\320\241\320\275\321\226\320\277\320\265\321\202_bLang.md" new file mode 100644 index 00000000..5457fd73 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/02_\320\241\320\275\321\226\320\277\320\265\321\202_bLang.md" @@ -0,0 +1,66 @@ +## Спіпет bLang ## + +Сніпет призначений для: +* Виведення списку мов +* Заміна сніпета switch для дрібних дій +* Для отримання суфікса +* Обгортка для DocInfo +* Заміна multiParams з action = getParamsFromTree + +Режим роботи сніпета визначається параметром `type`, за замовчуванням там switch. + +### switch + +Виведення певного значення в залежності від мови. +``` +[!bLang? +&en=`english` +&ru=`russian` +&ua=`ukrainian` +!] +``` + +Виводимо поле з урахуванням суфікса +``` +[!bLang? &f=`pagetitle`!] +``` + +виводимо плейсхолдер з урахуванням суфікса +``` +[!bLang? &pl=`title`!] +``` +Виводимо настройку з урахуванням суфікса. +``` +[!bLang? &s=`title`!] +``` + +З урахуванням суфікса означає, що якщо суфікс для полів поточного мови _en +```[!bLang? &f=`pagetitle`!] ``` - поверне поле pagetitle_en + + +### DocInfo + +В цьому режимі сніпет викличе сніпет DocInfo і передасть йому $docid і $field, але $field з урахуванням суфікса. + +### list +Даний режим виведе блок з списком мов. +``` +[!bLang? &type=`list`!] +``` + +Параметри +* outerTpl - обгортка блоку, плейсхолдери [+list+] [+active+] +* activeTpl - Шаблон рядка з активною мовою, плейсхолдери [+url+] [+title+] +* listTpl - обгортка списку мов, плейсхолдери [+wrapper+] +* listRow - Шаблон рядка мови, плейсхолдери [+classes+] [+url+] [+title+] + +За замовчуванням назва мови відповідає ключу з модуля, якщо потрібно перевизначити то, необхідно в модулі створити +під кожну мову запис. +Назва в форматі ```langKey_title``` + + ### getTreeParams + Повертає рядок вигляду || Так == yes || Ні == no для можливих значень тв поля. + Приклад: + ``` +// @EVAL return $modx->runSnippet("bLang", [ 'type'=>'getTreeParams', "parent"=>"6", 'firstEmpty'=>'1']); +``` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/03_\320\206\320\275\321\202\320\265\320\263\321\200\320\260\321\206\321\226\321\217_\320\267\321\226_\321\201\320\275\321\226\320\277\320\265\321\202\320\260\320\274\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/03_\320\206\320\275\321\202\320\265\320\263\321\200\320\260\321\206\321\226\321\217_\320\267\321\226_\321\201\320\275\321\226\320\277\320\265\321\202\320\260\320\274\320\270.md" new file mode 100644 index 00000000..4a8dac89 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/03_\320\206\320\275\321\202\320\265\320\263\321\200\320\260\321\206\321\226\321\217_\320\267\321\226_\321\201\320\275\321\226\320\277\320\265\321\202\320\260\320\274\320\270.md" @@ -0,0 +1,116 @@ +## Інтеграція bLang з іншими сніпетами ## + +### DocLister, DLcrumbs і інші сніпети які юзают контролер site_content +Для DocLister досить просто, вказати контролер lang_content, і всі поля і урл, будуть підмінені в залежності від мови. +``` +[[DocLister? &tpl=`@CODE:[+title+]` &controller=`lang_content`]] +``` +### DLMenu +``` +[[DLMenu? &controller=`lang_menu`]] +``` + +### multiTV +Створюємо конфігурацію за прикладом: +```php + array( + 'caption' => 'Title RU', + 'type' => 'text' + ), + 'title_en' => array( + 'caption' => 'Title EN', + 'type' => 'text' + ), + 'title_ua' => array( + 'caption' => 'Title UA', + 'type' => 'text' + ), +); +$settings['templates'] = array( + 'outerTpl' => '
    [+wrapper+]
    ', + 'rowTpl' => '

    [+title[(_suffix)]+]

    ' +); +``` +Тут під кожну мову, ми створюємо поле, а при виведенні використовуємо суфікс. + +```php + array( + 'caption' => 'Title RU', + 'type' => 'text' + ), + +); +$settings['templates'] = array( + 'outerTpl' => '
    [+wrapper+]
    ', + 'rowTpl' => '

    [+title+]

    ' +); + +$bLang = \bLang\bLang::GetInstance($this->modx); +$settings = $bLang->bLangChangeMultitvFields($settings,['title'],'#caption# (#lang#)',['templates']); +``` +У цьому варіанті, ми автоматично дублюємо поля під кожну мову, і автоматично підміняємо плейсхолдери в шаблонах. +Перший параметр - це як раз масив налаштувань. +Другий масив з полями, для якого потрібно робити дублі. +Третій - формат назв. +Четвертий масив груп шаблонів, в який потрібно підміняти плейсхолдери. + + +### clientSettings + +```php + 'All fields', + 'settings' => [ + 'field' => [ + 'caption' => 'Text field', + 'type' => 'text', + ], + ], +]; +$bLang = \bLang\bLang::GetInstance($modx); +return $bLang->changeClientSettingsFields($settings,['field']); + +``` +Логіка як і в multitv, метод сам зробить дублі в конфігурації. +У шаблоні використовуємо [(g_field)], значення саме зміниться в залежності від мови. + +### FormLister +1.У словнику створюємо запис FL_lexicon, і для кожної мови пишемо назви лексикону (відповідає назві папки / assets / snippets / FormLister / core / lang) +Для ru russian-UTF8, для en english. + +2. У виклик додаємо два параметри: + &lang=`[(__FL_lexicon)]` + &lexiconHandler=`\bLang\bLangLexiconHandler` + +3. Всередині форми отримати значення запису зі словника можемо +* [(__name)] +* [%name%] +* $FormLister->translate('name'); + +4. У action потрібно на початку написати [(_root)], щоб форма відправлялася на потрібну мовну версію + +### eFilter + +Тут все досить просто, назви фільтрів виносимо в словник. +І або в конфігу пише в сніпету для назви [(__name)] або в конфігу +[(__Filter_[+tv_id+])] і в словнику створюємо запис filter_41, де 41 - це id tv параметра. + +Всі параметри які потрібно міняти, в залежності від мови, необхідно винести в дерево, +кожному прописати значення для кожної мови. В можливих значень такої тв прописати +``` +@EVAL return $modx->runSnippet("bLang", [ 'type'=>'getTreeParams', "parent"=>"6", 'firstEmpty'=>'1']); +``` +bLang буде повертати в залежності від мови значення з потрібного поля. + + +### PageBuilder + +Для кожної мови створюємо свій контейнер, і PageBuilder викликаємо з потрібним контейнером. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/04_\320\220\320\262\321\202\320\276\320\277\320\265\321\200\320\265\320\272\320\273\320\260\320\264.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/04_\320\220\320\262\321\202\320\276\320\277\320\265\321\200\320\265\320\272\320\273\320\260\320\264.md" new file mode 100644 index 00000000..084d7251 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/bLang/04_\320\220\320\262\321\202\320\276\320\277\320\265\321\200\320\265\320\272\320\273\320\260\320\264.md" @@ -0,0 +1,3 @@ +## Інтеграція bLang з іншими сніпетами ## + +bLang вміє перекладати значення в словнику, поля документа, clientSettings, multiTV і PageBuilder. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/cfgTv/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/cfgTv/index.md" new file mode 100644 index 00000000..d6f606ba --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/cfgTv/index.md" @@ -0,0 +1,63 @@ + + +

    CfgTv: системні налаштування зі списку TV параметрів із вказаного документа

    +Створює системні налаштування зі списку TV параметрів із вказаного документа. +

    Багато хто любить і активно використовує налаштування сайту через [[getField? name=`tv_name` ...]]], створюючи ресурс, де всі ці налаштування зберігаються в TV. Але є проблема: кожне таке налаштування = 1 запит, а це означає більше часу на генерацію + незручно.

    +

    А що, якщо робити так само, але виклик на сторінці буде [(cfg_footer_phone)], [(cfg_icq)] і так далі? Зручно, правда?

    +

    Рішення: CfgTv

    +

    Подія: OnBeforeDocFormSave

    + +```php +/** + * CfgTv 0.1 + * Save TV as system setting from some resourse + * + * + * @category plugin + * @version 1.0.0b + * @author Bumkaka + * @internal @properties &ids=ID ресурсів налаштувань;text;347 &prefix=Префікс;text;cfg_ + * @internal @events OnBeforeDocFormSave + * @internal @modx_category Manager and Admin + */ + +event->name) { + case 'OnBeforeDocFormSave': + $list_id = explode(',', $ids); + if (!in_array($_POST['id'], $list_id)) { + return; + } + + $SQL = "SELECT * FROM " . evo()->getFullTableName('site_tmplvars') . ";"; + $result = evo()->db->query($SQL); + + while ($row = evo()->db->getRow($result)) { + $TVNAME[$row['id']] = $row['name']; + } + + foreach ($_POST as $key => $value) { + if (substr($key, 0, 2) != 'tv') { + continue; + } + $id = substr($key, 2, strlen($key)); + $name = $prefix . $TVNAME[$id]; + $settings[$name] = $value; + $SQL = "SELECT * FROM " . evo()->getFullTableName('system_settings') . " WHERE `setting_name`='" . $name . "'"; + $count = evo()->db->getRow(evo()->db->query($SQL)); + if (!empty($count['setting_name'])) { + $SQL = "UPDATE " . evo()->getFullTableName( + 'system_settings' + ) . " SET `setting_value`='" . $value . "' WHERE `setting_name`='" . $name . "'"; + evo()->db->query($SQL); + } else { + $SQL = "INSERT into " . evo()->getFullTableName( + 'system_settings' + ) . " SET `setting_name`='" . $name . "',`setting_value`='" . $value . "'"; + evo()->db->query($SQL); + } + } + break; +} +``` \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/countViews/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/countViews/index.md" new file mode 100644 index 00000000..9cb38e14 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/countViews/index.md" @@ -0,0 +1,70 @@ + + +

    Кількість переглядів сторінок для MODX Evolution

    +Кількість переглядів сторінок для MODX Evolution. +

    Встановлюємо лічильник кількості переглядів. Для цього нам потрібно буде створити додаткове поле в таблиці modx_site_content бази даних. Ось параметри нового поля – count int(20) default = 0.

    +

    Тепер створимо сніпет inc, який буде рахувати кількість відвідувань. Виклик сніпета inc потрібно встановити в самому верху шаблону матеріалів. Код сніпета:

    +
    +$table = $modx->getFullTableName("site_content");
    +$id = $modx->documentObject['id'];
    +$result = $modx->db->update("count=count+1", $table, "id=$id");
    +
    +

    І нарешті, створюємо сніпет hits, що відповідає за виведення кількості переглядів:

    +
    +$id = isset($id) ? $id : $modx->documentIdentifier;
    +return $modx->db->getValue($modx->db->select('count',$modx->getFullTableName('site_content'),'id='.$id));
    +
    +

    Давайте розглянемо ще один спосіб підрахунку кількості переглядів. Даний спосіб має одну перевагу перед попереднім - його можна використовувати в шаблоні Ditto (вихідні матеріали).

    +

    Отже, створимо TV-параметр countViews +з типом введення Text.

    +

    Далі створюємо сніпет countViews з таким змістом:

    +
    +$type = isset($type) ? $type : 'output'; 
    +$table = $modx->getFullTableName('site_tmplvar_contentvalues'); 
    +$insert = false; 
    +$lock = ($lock == '1') ? true : false; 
    +$_SESSION['countViews'] = is_array($_SESSION['countViews']) ? $_SESSION['countViews'] : array(); 
    +$countViews = (isset($_SESSION['countViews'][$id]) && $_SESSION['countViews'][$id] === true) ? true : false; 
    +$usertype = isset($_SESSION['usertype']) ? $_SESSION['usertype'] : 'user'; 
    +switch($type) { 
    +	case 'output': 
    +		$count = $modx->getTemplateVar('countViews', '*', $id); 
    +		echo ($count['value'] == '' ? '0' : $count['value']); 
    +	break; 
    +	case 'counter': 
    +		if($usertype == 'manager' || ($lock && $countViews)) {
    +			break;
    +		} 
    +		else {
    +			$tvar = $modx->db->select('value', $table, 'tmplvarid ="'.$tvid.'" and contentid="'.$id.'"'); 
    +			if($modx->db->getRecordCount($tvar) == 0) {
    +				$insert = true; $count = 0;
    +			} 
    +			else {
    +				$row = $modx->db->getRow($tvar); 
    +				$count = $row['value'];
    +			} 
    +			$count++; 
    +			$_SESSION['countViews'][$id] = true; 
    +			$fields = array('value'	=> $count, 'tmplvarid' => $tvid, 'contentid' => $id); 
    + 
    +			if($insert) {
    +				$modx->db->insert($fields, $table);
    +			} 
    +			else {
    +				$modx->db->update($fields, $table, 'tmplvarid = "'.$tvid.'" and contentid = "'.$id.'"');
    +			}
    +		} 
    +	break;
    +}
    +
    +

    На сторінках, де буде відбуватися підрахунок відвідувань, вставляємо цей код:

    +
    +[!countViews? &type=`counter` &id=`[*id*]` &tvid=`id TV-параметра countViews`!]
    +
    +

    І, нарешті, в тому місці, де Ви хочете бачити кількість переглядів, вставляємо такий код:

    +
    +[[countViews? &type=`output` &id=`[*id*]` &tvid=`id TV-параметра countViews`]] - в документі MODX
    +[[countViews? &type=`output` &id=`[+id+]` &tvid=`id TV-параметра countViews`]] - в шаблоні Ditto
    +
    +

    Зверніть увагу: перегляд сторінки авторизованим користувачем в системі MODX не враховується.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddGetMultipleField/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddGetMultipleField/index.md" new file mode 100644 index 00000000..da3222d7 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddGetMultipleField/index.md" @@ -0,0 +1,300 @@ + + +

    ddGetMultipleField Сніпет для виведення даних

    +Сніпет для виведення даних, розділених через певні роздільники. Зручно використовувати для виведення значень полів документів. +
    +

    Сніпет для виведення даних, розділених через певні роздільники. Зручно використовувати для виведення значень полів документів, сформованих віджетом mm_ddMultipleFields.

    +

    Автор: DivanDesign

    + +

    Можливості:

    +
      +
    • Отримання необхідного поля документа (і TV) по id. Параметри «inputString_docField» і «inputString_docId».
    • +
    • Виведення необхідної кількості значень за номерами рядків і і значенням. Параметри «startRow», «totalRows» і «filter».
    • +
    • Виведення необхідних значень за номерами колонок. Параметр «columns».
    • +
    • Сортування рядків за значеннями колонок перед виведенням ('ASC', 'DESC', 'RAND', 'REVERSE'), в тому числі множинне сортування. Параметри «sortDir» і «sortBy».
    • +
    • Виведення значень через роздільники рядків і колонок. Параметри «rowGlue» і «colGlue».
    • +
    • Видалення порожніх значень колонок і рядків перед виведенням. Параметри «removeEmptyRows» і «removeEmptyCols».
    • +
    • Типографіровання значень перед виведенням (використовується сніппет ddTypograph). Параметр «typography».
    • +
    • URL-кодування результату перед виведенням. Параметр «urlencode».
    • +
    • Виведення результату в JSON. Параметр «outputFormat».
    • +
    • Виведення значень за шаблонами (чанками) рядків і колонок (в шаблоні рядків також доступний плейсхолдер [+rowNumber+] з номером рядка). Параметри «rowTpl» і «colTpl».
    • +
    • Виведення результату виконання в чанк «outerTpl» з передачею додаткових даних через параметр «placeholders».
    • +
    + + +

    З пари параметрів «inputString» / «inputString_docField» необхідно передавати лише один.

    +

    Опис параметрів

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    inputString*Вихідний рядок, що містить значення з роздільниками.{separated string}
    inputString_docFieldІм'я поля документа / TV, що містить значення. У цьому випадку параметр «inputString» ігнорується, значення виходить з поля документа..{string}
    inputString_docIdID документа, значення поля яке потрібно отримати. Якщо id не заданий, береться id поточного документа.{integer}
    rowDelimiterРоздільник між рядками в вихідній стрічці.{string; regexp}'||'
    colDelimiterРоздільник між колонками в вихідній стрічці.{string; regexp}'::'
    startRowНомер рядка, починаючи з якого необхідно повертати (рядки нумеруються з 0).{integer}0
    totalRowsКількість повертаючих рядків. При значенні == 'all' будуть повернуті всі наявні рядки.{integer; 'all'}'all'
    columnsНомера колонок через кому, які потрібно повернути (колонки нумеруються з 0). При значенні == 'all' будуть повернуті всі колонки.{comma separated string; 'all'}'all'
    filterФільтр за значеннями колонок. Наприклад, при '0 :: a || 0 :: b || 1 :: 1' виведуться тільки рядки, в яких значення колонки 0 дорівнює 'a' або 'b' і значення колонки 1 дорівнює '1'.{separated string}
    removeEmptyRowsВидаляти порожні рядки{0; 1}1
    removeEmptyColsВидаляти порожні колонки{0; 1}1
    sortByНомер колонки (нумерується з нуля), по якій необхідно сортувати. Для множинного сортування параметри вказуються через кому (наприклад: '0,1')..{comma separated string}0
    sortDirНапрямок сортування рядків. При значенні == 'REVERSE' рядки будуть повернуті в зворотньому порядку.{'ASC'; 'DESC'; 'RAND'; 'REVERSE'; ''}
    typographyНомери колонок через кому, значення яких потрібно типографірувати (колонки нумеруються з 0). Якщо не задано, нічого не типографується.{comma separated string}
    outputFormatФормат, в якому повертається результат.{'html'; 'JSON'; 'array'; 'htmlarray'}'html'
    rowGlueРоздільник (об'єднувач) між рядками при виведенні. Може використовуватися спільно з шаблоном «rowTpl».{string}
    colGlueРоздільник (об'єднувач) між колонками при виведенні. Може використовуватися спільно з шаблоном «colTpl» (але не «rowTpl», зі зрозумілих причин).{string}
    rowTplШаблон для виведення рядків (параметр «outputFormat» повинен бути == 'html'). +

    Доступні плейсхолдери:

    +
      +
    • [+rowNumber+] – номер рядка, що починається з 1;
    • +
    • [+rowNumber.zeroBased+] – номер рядка, що починається з 0;
    • +
    • [+total+] – загальна кількість рядків;
    • +
    • [+resultTotal+] – кількість повертаючих рядків;
    • +
    • [+col0+], [+col1+], … – значення відповідних колонок.
    • +
    +

    Передавати код безпосередньо без чанка можна починаючи значення з «@CODE:».

    {string: chunkName|string}
    colTplСписок шаблонів для виведення колонок, через кому (параметр «outputFormat» повинен бути == 'html'). Якщо шаблонів менше, ніж колонок, для всіх відсутніх виставляється останній вказаний шаблон. Значення 'null' - без шаблону. +

    Доступні плейсхолдери:

    +
      +
    • [+val+] – значення;
    • +
    • [+rowNumber+] – номер рядка, що починається з 1;
    • +
    • [+rowNumber.zeroBased+] – номер рядка, що починається з 0.
    • +
    +

    Передавати код безпосередньо без чанка можна починаючи значення з «@CODE:».

    {comma separated string: chunkName|string; 'null'}
    outerTplШаблон зовнішньої обгортки (при «outputFormat» != 'array'). +

    Доступні плейсхолдери:

    +
      +
    • [+result+] – результат сніппета;
    • +
    • [+total+] – загальна кількість рядків;
    • +
    • [+resultTotal+] – кількість повертаючих рядків;
    • +
    • [+rowY.colX+] – значення (де «Y» - номер рядка, «X» - номер колонки).
    • +
    +

    Передавати код безпосередньо без чанка можна починаючи значення з «@CODE:».

    {string: chunkName|string}
    placeholdersДодаткові дані у вигляді query string які будуть передані в шаблони «outerTpl», «rowTpl» і «colTpl». Наприклад, «pladeholder1=value1&pagetitle=My awesome pagetitle!».{query string}
    urlencodeТреба URL-кодувати результуючий рядок (при «outputFormat»! = 'Array')? Рядок кодується згідно RFC 3986.{0; 1}0
    totalRowsToPlaceholderІм'я зовнішнього плейсхолдера, в який потрібно вивести загальну кількість рядків. Якщо параметр не заданий - не виводиться.{string}
    resultToPlaceholderІм'я зовнішнього плейсхолдера, в який потрібно зберегти результат роботи сніпета замість звичайного виведення. Якщо параметр не заданий - сніпет просто повертає реузльтат.{string}
    + +

    Приклади

    +

    Виведення зображень з описами

    +

    Вихідний рядок (нехай перебуває в TV документа «images»):

    +
    +assets/images/some_img1.jpg::Изображение 1||assets/images/some_img2.jpg::Зображення 2
    +

    Виклик сніпета в шаблоні документа:

    +
    +[[ddGetMultipleField?
    +&inputString=``
    +&rowTpl=`images_item`
    +]]
    +
    +

    Код чанка «images_item»:

    +
    +[+col1+]:
    +<img src="[+col0+]" alt="[+col1+]" />
    +
    + +

    Отримання і виведення даних з поля (TV) «prices» документа з id = 25 в вигляді таблиці, якщо щось є і нічого, якщо немає

    +

    Вихідне значення поля:

    +
    Яблука смачні::100::кг||Цвяхи звичайні::5 000::центнер||Коти::865::шт
    + +

    Виклик сніпета (де завгодно):

    +
    +[[ddGetMultipleField?
    +&inputString_docField=`prices`
    +&inputString_docId=`25`
    +&outerTpl=`prices`
    +&rowTpl=`prices_item`
    +]]
    + +

    Код чанка «prices_item»:

    +
    +<tr>
    +	<td>[+rowNumber+]</td>
    +	<td>[+col0+]</td>
    +	<td>[+col1+] руб./[+col2+]</td>
    +</tr>
    + +

    Код чанка «prices»:

    +
    +<h1>Табличка цін</h1>
    +<table>
    +	[+result+]
    +</table>
    +
    + +

    Виведення тегів документа через кому з використанням регулярного виразу в «rowDelimiter»

    +

    Нехай теги документа у нас зберігаються в TV «tags» і до цієї TV у нас застосований віджет mm_widget_tags. Користувач заповнює теги через кому, при цьому, може заповнюватися як з пробілами по краях, так і без них.

    +

    Значення TV «tags»:

    +
    +Коти, Кішки, Собаки, Ведмеді, Слони
    +

    Виклик сніпета в шаблоні документа:

    +
    +[[ddGetMultipleField?
    +&inputString=`Manager, General`
    +&rowDelimiter=`/\s*,\s*/`
    +&rowGlue=`, `
    +&rowTpl=`tags_row`
    +]]
    +
    +

    Код чанка «tags_row»:

    +
    +<a href="dlbuildmenu/kratkoe-opisanie?tags=[+col0+]">[+col0+]</a>
    + +

    Результат:

    +
    +<a href="dlbuildmenu/kratkoe-opisanie?tags=Коти">Коти</a>,
    +<a href="dlbuildmenu/kratkoe-opisanie?tags=Кішки">Кішки</a>,
    +<a href="dlbuildmenu/kratkoe-opisanie?tags=Собаки">Собаки</a>,
    +<a href="dlbuildmenu/kratkoe-opisanie?tags=Ведмеді">Ведмеді</a>,
    +<a href="dlbuildmenu/kratkoe-opisanie?tags=Слони">Слони</a>
    +
    + +

    Передача додаткових даних через параметр «placeholders»

    +
    +[[ddGetMultipleField?
    +&inputString=`Сірий::8 кг::любить м'ясо || Рудий :: 6 кг :: вегетаріанець`
    +&outerTpl=`cats`
    +&rowTpl=`cats_item`
    +&colTpl=`cats_item_color,null,null`
    +&placeholders=`kind=коти`
    +&price=`не продається.`
    +&colorTitle=`Шерсть густа, хороша`
    +]]
    +
    +

    Код чанка «cats» (замість «[+ kind]» підставляється «коти»):

    +
    <h1>Наші улюблені [+kind+], [+resultTotal+] штук.</h1>[+result+]
    +

    Код чанка «cats_item» (замість «[+price+]» підставиться «не продається.»):

    +
    [+rowNumber+]. [+col0+], важить [+col1+], [+col2+] – <i>[+price+]</i><br />
    +

    Код чанка «cats_item_color» (замість «[+colorTitle+]» підставиться «Шерсть густа, хороша»):

    +
    <span title="[+colorTitle+]">[+val+]</span>
    +

    Прикладів тут можна напридумувати безліч.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddMMEditor/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddMMEditor/index.md" new file mode 100644 index 00000000..b474fcd0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddMMEditor/index.md" @@ -0,0 +1,21 @@ + + +

    ddMMEditor Модуль для редагування файлу ManagerManager

    +Модуль для зручного редагування файлу конфігурації плагіна ManagerManager. +

    Модуль для зручного редагування файлу конфігурації плагіна ManagerManager.

    +

    Автор: DivanDesign

    +

    Можливості:

    +
      +
    • візуальне створення правил для MM;
    • +
    • застосування правил до необхідних шаблонів і ролей в два кліка;
    • +
    • autocomplete з усіма іменами полів і TV;
    • +
    • об'єднання правил у групи за змістом (групи можна називати довільними іменами);
    • +
    • згортання-розгортання груп для зручного перегляду в загальному вигляді;
    • +
    • drag'n'drop правил і груп між собою;
    • +
    • можливість «ручної» вставки довільного коду в початок і кінець конфігураційного файлу.
    • +
    +

    Встановлення

    +

    Вміст файлу module.php має бути скопійовано в поле «Код модуля» в меню створення нового модуля.

    +Інші файли повинні знаходитися в assets/modules/ddmmeditor/... (в архіві вже створена необхідна структура папок).

    +Модуль змінює файл assets/plugins/managermanager/mm_rules.inc.php плагіна ManagerManager.

    +Увага! Щоб ManagerManager використовував правила, створені модулем, параметр «Configuration Chunk» в конфігурації плагіна (вкладка «Конфігурація») повинен бути порожнім.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..34b646dd --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,47 @@ + + +

    ddTypograph: Опис параметрів

    +Опис параметрів сніпета ddTypograph для типографування тексту. +
    +

    Щоб відключити роботу типографа для фрагмента тексту, використовуйте тег <notg></notg>, текст всередині нього не типографується.

    +

    Автор: DivanDesign

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазваОписДопустимі значенняЗначення за замовчуванням
    text*Текст, який потрібно типографувати.{string}
    optAlignОптичне вирівнювання (висяча пунктуація).{0|1}0
    text_paragraphsПростановка параграфів і переносів рядків.{0|1}0
    text_autoLinksВиділення посилань з тексту (в тому числі email).{0|1}0
    etc_unicodeConvertПеретворювати html-сутності в юнікод (- замість &mdash; и т.д.).{0|1}1
    noTagsНе додавати теги. Бувають ситуації, коли використання HTML-тегів в тексті неприпустимо (наприклад, коли текст виводиться в значення атрибуту тега), для таких випадків і призначений цей параметр.{0|1}0
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..86f54554 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,22 @@ + + +

    ddTypograph: Приклади

    +Приклади сніпета ddTypograph для типографування тексту. +
    +

    Типографування анотації перед виведенням

    +
    [[ddTypograph? &text=`Snippet for text typography.`]]
    +

    Типографування анотації з автоматичною розстановкою абзаців, посилань і адрес email

    +
    +[[ddTypograph?
    +&text=`Snippet for text typography.`
    +&text_paragraphs=`1`
    +&text_autoLinks=`1`
    +]]
    +
    +

    Типографування анотації з автоматичним оптичним вирівнюванням (висячі лапки та ін.)

    +
    +[[ddTypograph?
    +&text=`Snippet for text typography.`
    +&optAlign=`1`
    +]]
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/index.md" new file mode 100644 index 00000000..9ffc1514 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/ddTypograph/index.md" @@ -0,0 +1,4 @@ + + +

    ddTypograph Типографування тексту

    +Сніпет типографує текст. Чи не використовує сторонніх сервісів, не надсилає жодних запитів, все робиться прямо у вас на сервері. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/directResize/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/directResize/index.md" new file mode 100644 index 00000000..d58b6c77 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/directResize/index.md" @@ -0,0 +1,535 @@ +

    DirectResize 0.8.3

    +

    Опис

    +

    Одним реченням

    +

    Це як Maxigallery, тільки для окремих зображень.

    +

    Докладніше

    +

    Повністю настроюється плагін для створення зменшених копій зображень (попередніх переглядів) і має ряд функцій, таких як: автоматичне створення попередніх переглядів заданого розміру, накладення водяних знаків, відкриття збільшеного зображення за допомогою AJAX (lightbox, slimbox, highslide ...), абсолютно настроюється шаблон для html-виведення, створення попередніх переглядів для WYSIWYG-редактора і т.д.

    +

    Функції

    +
      +
    • Можливість інтеграції будь-яких візуальних ява-скриптових модів: Slidebox, Lightbox v2.0, Slimbox, Highslide і т.д.
    • +
    • Водяні знаки (текст або прозоре png-зображення)
    • +
    • Налаштування плагіна через config-файл з великою кількістю параметрів
    • +
    • Повністю настроюється html-висновок
    • +
    • Можливість застосування плагіна для зображень з віддалених серверів
    • +
    • Попередній перегляд WYSIWYG-редактора (тестувалося на TinyMCE)
    • +
    • Створення попереднього перегляду строго заданого розміру з обрізанням при дотриманні пропорцій зображення
    • +
    • Нові зображення генеруються тільки в разі потреби, в інших випадках йде завантаження з кеша
    • +
    • Підтримка форматів JPG і PNG (GIF формат не підтримує)
    • +
    +

    Як це працює

    +

    В першу чергу плагін призначений для використання спільно з WYSIWYG-редактором і спочатку цільовою аудиторією користувачів плагіна є клієнти, які не мають знань в веб-розробках і html, але яким необхідно використовувати в тексті зображення з попереднім переглядом. Пояснити такій людині, що в графічному редакторі спочатку необхідно створити зменшену копію потрібного зображення, потім через редактор вставити її в документ, а після зробити гіперпосилання на збільшене зображення, було б досить непросто.

    +

    Тому дії були спрощені до мінімальних - велике зображення вставляється в текст, потім для нього задаються розміри, які повинен мати попередній перегляд. Після цього плагін, у відповідності зі своїми настройками, автоматично створить попередній перегляд і необхідні гіперпосилання.

    +

    Крім того, при відкритті документа, що містить такі зображення, в WYSIWYG-редакторі, замість великих зображень, просто стислих в розмірах, будуть так само відображатися їх попередні перегляди зі спеціальним водяним знаком. Цей водяний знак умовно говорить про те, що це зображення не просто маленька картинка, а посилання на своє збільшене зображення і дозволяє відрізняти такі зображення від дійсно маленьких картинок, які так само можуть бути присутніми в документі.

    +

    Ці попереді перегляди можна змінювати в розмірах, при наступному виклику будуть створені нові попередні перегляди в відповідності з новими розмірами.

    +

    Звичайно, можна використовувати плагін і без візуального редактора, просто вставляючи зображення у вигляді html-коду або TV-параметрів.

    +

    Встановлення

    +
      +
    • Розпакуйте архів і скопіюйте папку assets з архіву в кореневу папку вашого сайту, всі файли скопійовано в призначені їм місця
    • +
    • Виставіть права на запис на папку assets/drgalleries/
    • +
    • Створити новий плагін DirecrResize і скопіювати в нього вміст файлу directResize.plugin.txt
    • +
    • Відкрити закладку "Конфігурація" в вікні створення плагіна і в полі "Конфігурація плагіна" вставити
      + + +
    • +
    • Відкрити закладку "Системні події" і виставити галочки на події OnWebPagePrerender, OnCacheUpdate, OnBeforeDocFormSave, OnDocFormPrerender
    • +
    • Зберегти плагін
    • +
    +

    Конфігурація плагіна

    +

    На сторінці редагування плагіна у вкладці "Конфігурація" можливий вибір двох параметрів конфігурації плагіна. Параметр "Конфігурація" це назва використовуваної конфігурації, файл з таким же ім'ям і суфіксом .config.php повинен лежати в папці configs плагіна. Наявність цього параметра і відповідного файлу обов'язково, в ньому вказуються всі параметри з управління плагіном.

    +

    "Очистка кешу" - параметр, керуючий режимом очищення кеша плагіна. У кеші зберігаються згенеровані попередні перегляди з накладеними (при необхідності) водяними знаками і згенеровані (при необхідності) великі зображення. Очищення кеша плагіна відбувається при очищенні системного кеша MODx.

    +
      +
    • 0 - очистка кешу плагіна відключена
    • +
    • 1 - кеш плагіна очищається тільки для редагованого документа при його збереженні
    • +
    • 2 - кеш плагіна очищається для всіх документів (видаляються всі згенеровані зображення).
    • +
    +

    Оновлення кеша потрібно в рідкісних випадках. Наприклад, коли потрібно видалити файли зображень, посилання на які в документах вже не існують. Або при зміні зображення водяного знака. Нові зображення генеруються тільки в разі зміни їх розмірів. Тому нові водяні знаки не будуть нанесені, тому що розміри зображень залишилися колишніми. В цьому випадку потрібно оновити кеш, щоб видалити зображення і згенерувати їх заново.

    +

    В інших випадках плагін самостійно генерує нові зображення без необхідності оновлення кеша. Так що в більшості випадків параметр оновлення кеша варто тримати в значенні 0.

    +

    Стандартні пакети конфігурацій

    +

    Плагін вже має набір з декількох стандартних конфігурацій, які дозволяють відразу використовувати плагін з ефектами slimbox, slidebox, lightbox, highslide на сайті без будь-яких налаштувань. Для того щоб підключити одну з конфігурацій, необхідно в закладці конфігурації плагіна вказати назву конфігурації в поле "Конфігурація". Можливі варіанти:

    +
      +
    • slimbox
    • +
    • slidebox
    • +
    • lightboxv2
    • +
    • highslide
    • +
    +

    Додаткові налаштування проводяться в файлах з відповідними іменами в папці assets\plugins\directresize\configs. Обов'язково налаштуванні список папок, в яких дозволено обробляти зображення плагіном. За замовчуванням використовується папка assets/images.

    +

    Плагін використовує ті ж самі ява-скріптові бібліотеки, що і Maxigallery, але зі своєї папки, тому якщо ви використовуєте Maxigallery на своєму сайті з тим же ефектом відкривання зображень, що і DirectResize, використовуйте параметр $maxigallery_jscss_packs, щоб уникнути повторного підключення бібліотек.

    +

    Швидкий старт

    +
      +
    1. Встановити плагін, переконатися що в папці assets є підпапка drgalleries з встановленими правами на запис.
    2. +
    3. В налаштуваннях конфігурації плагіна прописати один з ваших улюблених стандартних пакетів конфігурації - slimbox, slidebox, lightboxv2, highslide
    4. +
    5. Переконатися, що вихідні файли зображень розташовані в папці assets / images або в її підпапках
    6. +
    7. Для того щоб в документі створювалися попередні перегляди і відкривалися зображення з обраним в ефектом, обов'язково вказувати width і / або height для тегів img такими, якого розміру потрібно створити попередній . Наприклад для зображення <img src="assets/images/image.jpg" width="120" height="60" /> буде згенеровано попередній перегляд розміру 120х60. Звичайно, оригінальне зображення image.jpg повинне перевищувати розміри 120х60 (інакше немає сенсу створювати попередній).
    8. +
    +

    Параметри

    +

    Параметри для використання в файлі імя_конфігурації.config.php. Приклад такого файлу можна знайти в папці configs плагіна.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    параметрможливі значення значення за заовчуваннямопис, приклад
    $lightbox_mode
      +
    • 1
    • +
    • 2
    • +
    1

    Режим створення великих зображень і lightbox-посилань

    +
      +
    • 1 - велике зображення і lightbox-посилання на нього створюються тільки при наявності мітки drlightbox у вихідного зображення (про мітки докладніше нижче)
    • +
    • 2 - велике зображення і lightbox-посилання створюються завжди (при дотриманні інших умов)
    • +
    +

    Незважаючи на значення параметра $lightbox_mode, при дотриманні інших умов, завжди створюються для показу зображень із застосуванням всіх сконфігурованих для попереднього перегляду дій (накладення водяного знака, обрізка і т.п.)

    $allow_from "assets/images"

    Розділений комами список папок, в яких дозволено застосування плагіна, можливо вказівку віддалених ресурсів. Всі не зазначені в цьому параметрі шляхи заборонені. Шляхи вказуються як відносні від кореня сайту, або віддалені через http://

    +

    Параметр не враховується в разі $lightbox_mode = 1

    $deny_from  

    Розділений комами список папок, в яких заборонено застосування плагіна, можливо вказівку віддалених ресурсів. Всі не зазначені в цьому параметрі шляхи дозволені. Шляхи вказуються як відносні від кореня сайту, або віддалені через http: //. Ігнорується, якщо вказано параметр $allow_from.

    +

    Параметр не враховується в разі $lightbox_mode = 1

    $allow_from_allremote
      +
    • 0
    • +
    • 1
    • +
    +
    0Дає змогу дозволити використання плагіна для всіх зображень з віддалених джерел, без необхідності перераховувати їх в параметрі $allow_from
    $resize_method
      +
    • 0
    • +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    3

    Метод зміни розміру зображення. Застосовується при генерації попереднього перегляду. У всіх випадках пропорції зображення зберігаються. Тут imgWidth і imgHeight - задані розміри в оригінальному документі.

    +
      +
    • 0 - зображення спочатку зменшується, потім обрізається так, щоб вписатися в прямокутник imgWidth х imgHeight
    • +
    • 1 - по заданій ширині imgHeight автоматично обчислюється висота зображення
    • +
    • 2 - по заданій висоті imgWidth автоматично обчислюється ширина зображення
    • +
    • 3 - зображення зменшується таким чином щоб не перевищувати задані imgWidth і imgHeight
    • +
    $big_qualityцілочисельне значення 1-10080JPG-якість великого зображення
    $thumb_qualityцілочисельне значення 1-10080JPG-якість переднього перегляду
    $wysiwyg_qualityцілочисельне значення 1-10040JPG-якість переднього перегляду в візуальному редакторі

    $big_width

    позитивне цілочисельне значення800Якщо розмір оригінального зображення перевищує задані розміри $ big_width або $ big_height , генерується пропорційно зменшене від оригінального зображення (в термінології плагіна - велике зображення) розміром, що не перевищуює $big_width і $big_height
    $big_heightпозитивне цілочисельне значення600
    $thumb_default_widthпозитивне цілочисельне значення Ширина попереднього перегляду за замовчуванням
    $thumb_default_heightпозитивне цілочисельне значення Висота попереднього перегляду за замовчуванням
    $thumb_default_sizemode
      +
    • 0
    • +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    • 4
    • +
    1

    Правило для застосування ширини і висоти попереднього прегляду за замовчуванням.

    +
      +
    • 0 - ширина и висота за замовчуванням не використовуються
    • +
    • 1 - ширина и висота попереднього прегляду встановлюються рівними ширині і висоті за замовчуванням ($thumb_default_width і $thumb_default_height), якщо у вихідного зображення не задано ні висоти, ні ширини
    • +
    • 2 - ширина преднього поперегляду встановлюються рівними ширині і висоті, якщо не задана ширина вихідного зображення
    • +
    • 3 - висота попереднього поперегляду встановлюються рівній висоті за замовчуванням, якщо не задана висота вихідного зображення
    • +
    • 4 - ширина и высота попереднього прегляду примусово встановлюються рівними ширині і висоті за замовчуванням незалежно від того, задані вони в оригінальному документі чи ні
    • +
    +

    Варто зауважити, що не дивлячись на параметри $thumb_default_width, $thumb_default_height і $thumb_default_sizemode, остаточні розміри згенерованого попереднього прегляду будуть обчислюватися в залежності від $resize_method

    +

    При використанні примусового режиму (4) спільно з візуальним редактором веде до того, вихідні width і height для кожного зображення в тексті документа будуть замінені на $thumb_default_width і $thumb_default_height з втратою попередніх значень (якщо вони були) при збереженні документа. Це необхідно для коректного відображення попередніх переглядів в візуальному режимі.

    $remote_refresh_timeпозитивне цілочисельне значення60Час в хвилинах. Періодичність, з якою перевіряються зображення на віддалених серверах. Якщо зображення на віддаленому сервері змінилося (перевірка робиться тільки на зміни по висоті або ширині), робиться його нова локальна копія і перегенеруются його зменшені копії.
    $tpl
      +
    • Ім'я чанка
    • +
    • @FILE:<шлях до файлу>
    • +
    • @CODE:<HTML код шаблона>
    • +
    assets/plugins/ directresize/templates/ lightboxv2.htmlШаблон для відображення
    $language
      +
    • english
    • +
    • russian
    • +
    englishВстановлює мову для плагіна. Відповідний мовний файл повинен лежати в папці lang плагіна.
    $headerHTML-код HTML-код, розміщується в тезі <head>. Використовується для підключення необхідних css і js файлів. Підключається тільки на тих сторінках, на яких є хоча б одне зображення, яке обробляється плагіном.
    $maxigallery_jscss_packs
      +
    • slimbox
    • +
    • slidebox
    • +
    • lightboxv2
    • +
     

    Підключає до сторінки необхідні css і js файли для відповідного скрипта з папки сніпета MaxiGallery (сніпет не обов'язково повинен бути встановлений, але його файли повинні знаходиться на FTP-сервері в assets/snippets/maxigallery)

    +

    Зручно, якщо на сайті спільно з плагіном використовується і Maxigallery. Якщо будь-які js або css файли вже підключаються викликом MaxiGallery, DirectResize повторно не підключає ці файли в секції <head>.

    +

    Далі йдуть параметри, повністю запозичені з Maxigallery, що мають такі ж можливі значення і оброблювані таким же чином.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    параметрможливі значения значення за замовчуваннямопис
    $use_ftp_commands
      +
    • 0
    • +
    • 1
    • +
    0Якщо включено, плагін використовує PHP FTP комманди для створення папок для зберігання генерованих зображень.
    $ftp_serverFTP address FTP адреса сервера
    $ftp_userusername  ім'я користувача FTP
    $ftp_passpassword  пароль на FTP
    $ftp_base_dirшлях  Шлях від кореня FTP до кореня сайту на MODx. Тобто якщо коренем FTP є папка /home/username/ і MODx встановлений в /home/username/public_html/modx/ то використовуйте значення /public_html/modx/ в параметрі ftp_base_dir.
    $ftp_portчисло 21Номер порта FTP
    $thumb_use_watermark +

     

      +
    • 0
    • +
    • 1
    • +

    0

    Використовувати водяні знаки для попередніх переглядів
    $thumb_watermark_font
      +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    • 4
    • +
    • 5
    • +
    1 Размір шрифта водяного знака
    $thumb_watermark_halign
      +
    • left
    • +
    • center
    • +
    • right
    • +
    right Вирівнювання водяного знака по горизонталі
    $thumb_watermark_img шлях assets/plugins/ directresize/ images/watermark.pngШлях до файлу зображення водяного знака. Використовуйте png-зображення з альфа-каналом.
    $thumb_watermark_txtтекст Copyright <YEAR> Текст надпису водяного знака
    $thumb_watermark_txt_color RGB шістнадцятковий форматFFFFFF Колір тексту водяного знака
    $thumb_watermark_txt_hmarginчисло (px) 2 Відступ по горизонталі для тексту
    $thumb_watermark_txt_vmargin число (px) 2 Відступ по вертикалі для тексту
    $big_use_watermark +

     

      +
    • 0
    • +
    • 1
    • +

    0

    Використовувати водяні знаки для великих зображень
    $big_watermark_font
      +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    • 4
    • +
    • 5
    • +
    1 Размір шрифта водяного знака
    $big_watermark_halign
      +
    • left
    • +
    • center
    • +
    • right
    • +
    right Вирівнювання водяного знака по горизонталі
    $big_watermark_img путь assets/plugins/directresize/ images/watermark.pngШлях до файлу зображення водяного знака. Використовуйте png-зображення з альфа-каналом.
    $big_watermark_txtтекст Copyright <YEAR> Текст надпису водяного знака
    $big_watermark_txt_color RGB шестнадцатиричный форматFFFFFF Колір тексту водяного знака
    $big_watermark_txt_hmarginчисло (px) 2 Відступ по горизонталі для тексту
    $big_watermark_txt_vmargin число (px) 2 Відступ по вертикалі для тексту
    +

    Підстановщики

    +

    Підстановщики для використання в шаблоні $tpl

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    підстановщикопис
    [+dr.id+]цифровой ідентифікатор зображення, унікальний в рамках даного документа
    [+dr.alt+]
    + [+dr.title+]
    + [+dr.class+]
    + [+dr.style+]
    + [+dr.align+]
    + [+dr.valign+]
    атрибути alt, title, class, style, align, valign вихідного зображення
    [+dr.thumbWidth+]ширина згенерованого попереднього перегляду
    [+dr.thumbHeight+]висота згенерованого попереднього перегляду
    [+dr.thumbPath+]шлях до файлу згенерованого попереднього перегляду
    [+dr.thumbFilesize+] размір файлу згенерованого попереднього перегляду
    [+dr.bigWidth+]ширина згенерованого великого зображення (якщо велике зображення не генерувалося - ширина вихідного зображення)
    [+dr.bigHeight+]висота згенерованого великого зображення (якщо велике зображення не генерувалося - висота вихідного зображення)
    [+dr.bigPath+]шлях до файлу згенерованого великого зображення (якщо велике зображення не генерувалося - шлях до файлу вихідного зображення)
    [+dr.bigFilesize+] размір файлу згенерованого великого зображення (якщо велике зображення не генерувалося - розмір файлу вихідного зображення)
    [+dr.originalWidth+]ширина вихідного зображення
    [+dr.originalHeight+]высота вихідного зображення
    [+dr.originalPath+]шлях до файлу вихідного зображення
    [+dr.originalFilesize+] размір файлу вихідного зображення
    [+dr.originalFilename+]ім'я вихідного файлу
    +

    Мітки

    +

    Мітка, в термінології даного плагіна - спеціальне слово (або частина слова), яке може зустрічатися всередині тега img в будь-якому місці: + всередині атрибутів class, alt, title і т.п. і чи поза ними і є керуючим для деяких дій над даними зображенням (і тільки над ним).

    +

    Наприклад при значенні параметра $lightbox_mode = 1 попередній з lightbox-посиланням генерується тільки для зображень з міткою drlightbox. Приклад зображень з міткою drlightbox

    +
      +
    • <img src="image.jpg" alt="drlightbox" />
    • +
    • <img src="image.jpg" class = "drlightbox_align_left" />
    • +
    • <img src="image.jpg" title = "drlightbox picture" />
    • +
    • <img src="image.jpg" style = "background: url(drlightbox_bg.gif);" />
    • +
    • <img src="assets/images/mydrlightboxpicture.jpg" />
    • +
    • и даже <img src="image.jpg" drlightbox />
    • +
    +

    Не варто переживати через можливість виникнення помилок валідації коду в разі застосування мітки в недозволеному місці. У вихідному коді всі керуючі мітки видаляються. Тому уникайте використання назв службових міток в назвах файлів зображень - частина імені файлу буде просто видалена. Увага: не використовуйте мітки поза атрибутів (останній приклад), якщо ви використовуєте візуальний редактор, тому що в цьому випадку мітки будуть видалені самим редактором як помилковий html-код.

    +

    Mітка drthumbonly. Має сенс тільки при значенні параметра $lightbox_mode = 2і вказує на те, щоб цьому зображенню примусово НЕ генерувалося велике зображення і lightbox-посилання, тільки попередній перегляд.

    +

    При значені параметра $lightbox_mode = 1 для всіх зображень без мітки drlightbox і так генеруються переднім переглядом без lightbox-посилань, тому застосування drthumbonly надлишково.

    +

    Mітка drskip. Вказує плагіну повністю пропустити обробку зображення.

    +

    В планах

    +
      +
    • phpThumb клас для операцій над зображеннями.
    • +
    • Можливість створення наборів різних конфігураційних параметрів для використання в різних документах одного сайту.
    • +
    +

    Історія версій

    +

    0.8.0b

    +

    Перший реліз

    +

    0.8.0

    +

    * Помилка коли файли мають однакові імена, але з різних папок
    + * Помилка при використанні плагіна і Maxigallery в одному документі
    + * Імена міток змінені на drlightbox і drthumbonly. Оскільки мітки видаляються з вихідного коду, назва мітки lightbox не дозволяла використовувати в шаблоні слово lightbox (наприклад rel="lightbox")
    + * Помилка "Fatal error: Call to undefined function: size() in ...assets\plugins\directresize\directResize.php on line 141"  яку викликав плагін, коли файл зображення, зазначений в оброблюваному плагіном тезі IMG не знайдений
    + * Не створюються lightbox-посилання при використанні lightbox_mode = 1 і мітки "drlightbox"
    + + Нова мітка "drskip", зображення з цією міткою не обробляються плагіном
    + * Помилка при використанні gif-зображень в документах
    + * Помилка з командами фтп
    + + додані плейсхолдери для підстановки style, align, valign вихідного зображення
    + + додана підтримка і коректна робота з абсолютними шляхами зображень
    ++ Новий параметр $allow_from_allremote дає змогу дозволити використання плагіна для всіх зображень з віддалених джерел, без необхідності перераховувати їх в параметрі $allow_from
    +* Highslide оновлений до версії0.3.6
    ++ Додані стандартні пакети конфігурацій для slimbox, slidebox, lightbox v2

    +

    0.8.0.1

    +

    * Помилка при спільному використанні $thumb_default_sizemode = 4 и метки drthumbonly
    ++ Додана секція "Швидкий старт" та інші невеликі зміни в документації

    +

    0.8.0.2

    +

    * Помилка, не створювалися передні перегляди при використанні візуального режиму TinyMCE
    + * Помилка, коли пропадали мітки при використанні візуального режиму TinyMCE
    ++ Видалення зайвих пробілів після видалення міток з вихідного коду (але тільки один пробіл видаляється до або після мітки)

    +

     

    +

    Відомі проблеми

    +

    На даний момент мені не знайомий простий спосіб перевірити наявність файлу на віддалений хост при використанні PHP & lt; 5.0. Тому якщо на сайті використовуються зображення з віддалених хостів і плагін буде намагатися обробити зображення за неіснуючим шляхом - це викличе помилку php.

    +

    Подяки

    +

    Даний плагін заснований на ідеї і розробки автора попередніх версій DirectResize - Arnaud.

    +

    В плагіні використовуються частини коду і частини документації з сніпета Maxigallery від doze.

    +

    Плагін використовує Chunkie class і PHx парсер відbS

    +

    Плагін використовує Thumbnail and Watermark Class від Emilio Rodriguez
    +

    +

    Для прикладу використовується Highslide JS + скрипт від Torstein Honsi

    +

    Дякую, друзі!

    +

    Metaller (metaller.ru@gmail.com)

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..c558bd63 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/01_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,67 @@ + + +

    DocInfo: Параметри

    +Параметри сніпетта DocInfo. +
    +
    +
    + +
    +
    +Формат: поле документа | TV-параметр
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &field=`pagetitle`
    +
    +
    +
    + +
    + +
    +
    +Формат: id документа
    +Значення за замовчуванням: Id поточного документа
    +Примітка:
    +

    Приклад:

    +
    &docid=`12`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    0 - нет +
    1 - да
    +

    Приклад:

    +
    &tv=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +

    Приклад:

    +
    &render=`1`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..510c3bf0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/02_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,11 @@ + + +

    DocInfo: Приклади

    +Приклади сніпетта DocInfo. +
    +

    Отримати заголовок документа с id=15:

    +
    [[DocInfo? &docid=`15` &field=`pagetitle`]]
    +

    Отримати значення TV-параметра tvname документа с id=10:

    +
    [[DocInfo? &docid=`10` &field=`tvname`]]
    +

    Отримати значення TV-параметра tvname документа з id = 3 і перетворити його значення відповідно до його візуальним компонентом:

    +
    [[DocInfo? &docid=`3` &field=`tvname` &render=`1`]]
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270 MODxAPI.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270 MODxAPI.md" new file mode 100644 index 00000000..f7cfd65b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270 MODxAPI.md" @@ -0,0 +1,29 @@ + + +

    Приклад DocInfo на базі modResource MODxAPI

    +Тепер сніпет DocInfo НЕ буде навантажувати сторінку повторними SQL запитами при багаторазовому отриманні значень з одного і того ж документа. +
    +

    Вміст сховища розміщується в папці /assets/lib/MODxAPI/

    +

    Створюється плагін на події OnWebPageInit, OnManagerPageInit і OnPageNotFound з кодом:

    +
    include_once(MODX_BASE_PATH."assets/lib/MODxAPI/modResource.php");
    +if(!isset($modx->doc)){
    + $modx->doc = new modResource($modx);
    +}
    + +

    Після чого створюється сніпет допустимо DocInfo

    +
    $id = isset($id) ? (int)$id : $modx->documentObject['id'];
    +$field = isset($field) ? (string)$field : 'id';
    +if($field == 'id'){
    +    $out = $id;
    +}else{
    +    if($modx->documentObject['id'] == $id){
    +        $out = isset($modx->documentObject[$field]) ? $modx->documentObject[$field] : '';
    +        if(is_array($out)){
    +           $out = isset($out[1]) ? $out[1] : '';
    +        }
    +    }else{
    +        $out = $modx->doc->edit($id)->get($field);
    +    }
    +}
    +return (string)$out;
    +

    Profit! Тепер сніпет DocInfo не буде навантажувати сторінку повторними SQL запитами при багаторазовому отриманні значень з одного і того ж документа

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/index.md" new file mode 100644 index 00000000..81de8a31 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/docInfo/index.md" @@ -0,0 +1,4 @@ + + +

    DocInfo будь-який параметр з будь-якої сторінки. Значення поля документа або його TV параметра

    +Сніпет дозволяє витягати будь-який параметр з будь-якої сторінки менше запитів в порівнянні з GetField. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/01_\320\241\320\275\321\226\320\277\320\265\321\202_eFilter.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/01_\320\241\320\275\321\226\320\277\320\265\321\202_eFilter.md" new file mode 100644 index 00000000..a8fc5a2d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/01_\320\241\320\275\321\226\320\277\320\265\321\202_eFilter.md" @@ -0,0 +1,114 @@ +## Параметри + +### js +Підключення js скриптів фільтра. Значення 0\1. За замовчуванням 1. +### css +Підключення css стилів фільтра. Значення 0\1. За замовчуванням 1. +### sliderCssJs +Підключення js скриптів і css стилів слайдер (ціна). Значення 0\1. За замовчуванням 1. +### ajax +Використовувати фільтрацію без перезагрузки сторінки. Значення 0\1. За замовчуванням 0. +### autoSubmit +Автосабміт форми при зміні її параметрів. + +### filters +Параметр для фільтрації відбіру товарів. Формат DocLister/ + +# tv_config +JSON масив із конфігурацією форми фільтрації. За замовчуванням поле tovarparamas ресурса поточного або його батьків. + +## Плейсхолдери + +### eFilter_ids +Список документів для виводу (підставляємо в DocLister, це відбувається автоматично у сніппеті getFilteredItems) +### eFilter_form +Форма виводу фільтра - вставити плейсхолдер у відповідне місце шаблону. +### eFilter_form_delete +Форма видалення встановлених фільтрів. +### docid +Id категорії для отримання товарів. За замовчуванням id поточного документа. +### cfg +Назва файла з конфігурацією html шаблона елементів форми фільтрації. За замовчуванням default. Ім’я файла має бути у форматі config.назва_конфігурації.php. + +### delete_cfg +Назва файла з конфігурацією html шаблона елементів форми для видалення вибраних параметрів фільтрації. За замовчуванням default. Ім’я файла має бдути у форматі config.delete.назва_конфігурації.php. + +### removeDisabled +Приховувати неактивні варіанти параметрів з форми. Значення 1\0. За замовчуванням 0. + +### nosortTvId +Список тв параметрів варіанти яких не потрібно сортувати. + +## Конфігурація шаблона форми +Шаблони зберігається у файлі з розширенням php у змінних. +Основні плейсхолдери: +### Для верстки форми: + * [+url+] - адрес сторінки. + * [+wrapper+] - елементи форми. +Для роботи ajax у формі має бути id eFiltr + + +### Для верстки параметра: + * [+tv_id+] id тв параметра + * [+name+] Назва тв параметра + * [+wrapper+] список вариантів. + +### Для елементів форми (не діапазон або слайдер): + * [+tv_id+] - id тв параметра. + * [+name+] якщо використовуємо checkbox, radio або dropDown List Menu поверне текстове значення варіанта параметра. + * [+value+] - значення параметра + * [+selected+] - якщо обраний варіант параметра поверне checked або selected. + * [+disabled+] - якщо обрати не можна поверне disabled + * [+count+] - доступна кількість товарів з варіантом параметра. + +### Для елементів форми діапазон або слайдер: + * [+tv_id+] - id тв параметра. + * [+name+] - якщо використовуємо checkbox, radio або dropDown List Menu поверне текстове значення варіанти параметра. + * [+value+] - значення параметра + * [+selected+] - якщо обраний варіант параметра поверне checked або selected + * [+disabled+] - якщо обрати не можна поверне disabled + * [+count+] - доступна кількість товарів з варіантом параметра + * [+minval+] - мінімальне значення обране користувачем + * [+maxval+] - максимальне значення обране користувачем + * [+minvalcurr+] - мінімальне значення + * [+maxvalcurr+] - максимальне значення + +Якщо потрібного для певног тв параметра вказати свій шаблон необхідно створити змінну в форматі ТипШаблону_НазваЗмінної. +Приклад тв параметр frameSize, обгортка tplRowCheckbox_frameSize і посилання tplOuterCheckbox_frameSize. + + +## Конфігурація шаблона форми скидання фільтрів +### tplDeleteFilterForm +Верстка форми. +Плейсхолдери: +* [+wrapper+] +### tplSliderOwner +Верстка блока для скидання варіантів фільтрації для діапазона або слайдера. +Плесхолдери: +* [+wrapper+] +* [+delete_group+] - посилання для скидання всіх варіантів фільтрації тв параметра +* [+name+] - назва тв параметра +### tplSliderInner +Шаблон виведення посилання для видалення фільтрації діапазон або слайдера +* [+link+] - посилання для скидання варіанта фільтрації +* [+min+] - мінімальне значення +* [+max+] - максимальне значення + +### plDeleteFilterOwner +верстка для інших блоків. +Плейсхолдери: +* [+wrapper+] +* [+delete_group+] - посилання для скидання всіх варіантів фільтрації тв параметра +* [+name+] - назва тв параметра + +### tplDeleteFilterInner +Виведення посилання для скидання варіанта фільтра +* [+link+] - посилання для скидання варіанта фільтрації +* [+name+] - значення варіанта + +Якщо потрібно для певного тв параметра вказати свій шаблон необхідно створити змінну у форматі ТипШаблону_НазваЗмінної. +Приклад тв параметр frameSize, обгортка tplDeleteFilterOwner_frameSize і посилання tplDeleteFilterInner_frameSize. + +Для роботи ajax при скиданні фільтрів необхідно: +* Для загальної обгортки форми скидання вказати класс .fltr_delete_wrap +* Для всіх посилань скидання вказати класс .fltr_delete_item_link diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/02_\320\241\320\275\321\226\320\277\320\265\321\202_eFilterResult.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/02_\320\241\320\275\321\226\320\277\320\265\321\202_eFilterResult.md" new file mode 100644 index 00000000..93580b8d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/02_\320\241\320\275\321\226\320\277\320\265\321\202_eFilterResult.md" @@ -0,0 +1,60 @@ + ## eFilterResult +Сніпет є версткою Doclister. Якщо немає обраних тв параметрів поводить себе як звичаний DocLister +і отримує товари в режимі idType = parents, якщо форма фільтрації не пуста то в режимі documents +отримує плейсхолдер зі списку ids від eFilter + + ## Параметр + ### lang + Мова необхідна для відмінювання. За замовчуванням ru + + ### pid + аналог parents + + Для роботи ajax необхідна наступна структура шаблону + ```` +
    +
    +
    [+dl.wrap+][+pages+]
    +
    + ```` + + Якщо для eFilter заданий параметр ajax = 1 то стандартна пагінація переоприділяється. + Верстка пагінації повинна мати клас .pagination! + ``` +&TplNextP = `@CODE: >` +&TplPrevP = `@CODE: <` +&TplPage = `@CODE: [+num+]` +&TplWrapPaginate=`@CODE:
    [+wrap+]
    ` +``` +Можна задати свої шаблони, головне замість href використовувати data-page="[+num+]" +і якщо заданий параметр id для eFilterResult в data-prefix необхідно записати id + '_' + + + ### Відмінювання слова Товар до кількості + [+параметр_id.pluarl+] Відмінювання слова Товар до кількості + для перевизначення схиляємого слова необхнідни прописати параметри: + phrase1 Товар + phrase2 Товару + phrase3 Товарів + + + ### Підвантаження товарів через ajax + Приклад html шаблону для блоку “Показати ще” + ``` + [!if? &is=`[+параметр_id.isstop+]:!=:1` &then=` + + `]] + ``` + eFilter_more_wrap Клас для верстки + eFilter_more Клас для посилання + Якщо id для eFilter не заданий data-prefix порожній + При використанні "Показати ще" в блоці з класом eFiltr_results повинні бути тільки товари + + ### Кількість товарів і схилення + Для заміни кількість товарів на сторінці і відмінюємо слова товар потрібно задати класи + + filter_display кількість товарів + filter_plural відмінюване слово + ```[+параметр_id.pages_next+]``` номер наступної сторінки diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/03_js_api.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/03_js_api.md" new file mode 100644 index 00000000..5446a53a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/03_js_api.md" @@ -0,0 +1,29 @@ +## Callback-функції JS при роботі`eFilter` + +Функції знаходяться в глобальному полі зору. +Наприклад, висновок повідомлення про завершення роботи фільтра може в шаблоні сайту виглядати так: +``` + +``` + +### afterFilterSend(msg) +... + +### afterFilterComplete(_form) + +Спрацьовує по завершенню роботи eFilter і оновленню результатів. +Можна використовувати цю подію для стилізації елементів форми або результатів. + +### beforeFilterSend(_form) +... + +## Важливо! для роботи `ajax` +Для роботи ajax форма і блок товарів не повинні бути в самому корені документа, тобто безпосередньо в . + +Не можна:`[!eFilter!][+eFilter_form+][!eFilteResult!]` + +Можна: `
    [!eFilter!][+eFilter_form+][!eFilteResult!]
    ` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/04_\320\241\320\275\321\226\320\277\320\265\321\202_evoSortBlock.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/04_\320\241\320\275\321\226\320\277\320\265\321\202_evoSortBlock.md" new file mode 100644 index 00000000..ea149eb8 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/04_\320\241\320\275\321\226\320\277\320\265\321\202_evoSortBlock.md" @@ -0,0 +1,120 @@ +Сніпет для виведення блоку з налаштувань сортування і вибору кількості товарів на сторінці. + +## evoSortBlock +Сніпет для формування блоку сортування. З приємних речей. + + + +## Параметри +1. displayConfig налаштування селекта або посилань для вказівки кількості товарів на сторінці. +Приклад: 20 || 30 || 40 || все == all. +2. 2.sortConfig налаштування посилань для вказівки поля по якому товари сортуються. +Приклад: За назву == pagetitle || За індексом == menuindex || Ціна від маленької == price: asc || Ціна від великої == price: desc +3.ajax - використовувати чи ajax за замовчуванням нуль. +4..changeSortByClickField - змінити напрямок сортування при повторному натисканні на параметру сортування. 1/0. За замовчуванням 0. +Параметр необхідний якщо у нас немає блоку для вибору напрямку, а треба змінювати напрямок при кліці вдруге за параметром поля. + +### Шаблони +#### Верстка +1. ownerTpl - Основна верстка блоку. + Плейсхолдери ```[+class+] [+display.block+] [+sort.block+] [+sort.direction+]```. + Приклад: ```
    [+display.block+][+sort.block+]
    ``` + + * class Плейсхолдер з класcами для верстки які необхідніі для роботи js, а саме sort-wrap і ajax + * display.block блок вибору кількості товарів + * sort.block блок вибору поля для сортування + * sort.direction блок вибору напрамку сортування +#### Вибір кількості товарів + displayOwnerTpl - верстка блоку для вибору кількості елементів на сторінці. + Плейсхолдери: [+class+]">[+wrapper+]  + Приклад:   + Пример: 
    [+wrapper+]
    + +2. displayRowTpl - Шаблон виведення рядка. ( option для селекту або тег a для блоку). + Плейсхолдери: ```[+value+],[+selected+],[+data+],[+class+],[+caption+] ``` + Приклад: ``` ``` + Приклад: ``` [+caption+] ``` +#### Вибір поля для сортування +1. sortOwnerTpl - обгортка блоку для вибору поля за яким елементи сортуються на сторінці. + Плейсхолдери: ```[+wrapper+]``` + Приклад: ```
      [+wrapper+]
    ``` + +2. sortRowTpl - Шаблон виведення посилання для вибору поля. + Плейсхолдери: ```[+class+],[+data+] [+caption+]``` + Приклад: ```[+caption+]``` + +#### Вибір напрямку сортування +1. sortDirectionTpl - верстка блоку вибору напрямку. + Плейсхолдери: ```[+up+][+down+]``` + up - сортування asc + down - сортування desc +2. sortDirectionUpTpl - шаблон посилання для вибору напрямку сортування asc + Плейсхолдери: ```[+class+][+data+]``` + class - css клас + data - Дата атрибут data-value в якому зберігається поточне поле а напрямок сортування asc. Приклад price: asc +3. sortDirectionDescTpl - шаблон посилання для вибору напрямку сортування desc + Плейсхолдери: ```[+class+][+data+]``` + class - css клас + data - Дата атрибут data-value в якому зберігається поточне поле а напрямок сортування asc. Приклад price: desc + + +##### Класи +1. displayActiveClass - Клас для активного пункту у виборі кількості елементів на сторінці. За замовчуванням active. +2. sortActiveClass - Клас для активного пункту в виборі поля для сортування елементів на сторінці. +3. sortUpClass - Клас для посилання вибору поля коли сортування від маленького до великого. За замовчуванням up +4. sortDownClass - Клас для посилання вибору поля коли сортування від великого до маленького. За замовчуванням down +5. sortFieldClass - Клас для посилань вибору поля і напряму сортування. За замовчуванням set-sort-field. +6. sortDirectionActiveClass - Класс для активной ссылки выбранного направления сортировки. По умолчанию active. + + +##### Значення за замовчуванням +1. displayDefault - кількість елементів на сторінці за замовчуванням +2. sortFieldDefault - поле сортування за замовчуванням +3. sortOrderDefault - напрямок сортування за замовчуванням + + +## Встановлювані плейсхолдери для роботи без eFilterResult + * sort_display - кількість товарів + * sort_field - поле для сортування + * sort_order - направление сортировки +Також якщо використовувати сніпет без eFilter необхідно підключити js файл eFilter.js вручну. +А товари обернути у верстку eFilterResult +``` +
    +
    +
    +
    +
    + ``` + + +## Логіка роботи js. +### Для вибору кількості товарів. +Обробляється клік по елементу з класом set-display-field. +Якщо це тег a (посилання) і подія click, то інформація про кількість береться з дата атрибута. +Якщо ця подія change інформація береться з атрибуту value елемента option. +Далі ajax запит з параметром sortDisplay і значенням. +Якщо ajax відключений, то оновлення сторінки. + +### Для вибору поля і напряму сортування. +Обробляється клік по елементу з класом set-sort-field. +Якщо це тег a (посилання) і подія click то інформація про поле і напрямок береться з дата атрибута. +Якщо ця подія change інформація береться з атрибуту value елмента option. +Далі ajax запит з параметром sortBy і значенням. +Якщо ajax відключений то оновлення сторінки. + + + + +##### Приклад + [!evoSortBlock? + &ownerTpl=`
    [+display.block+][+sort.block+]
    ` + &displayOwnerTpl=`
    Показывать:
    ` + &sortOwnerTpl=`
    Сортувати:
    По популярності
      [+wrapper+]
    ` + &sortRowTpl=`
  • [+caption+]
  • ` + &sortActiveClass=`is-active` + &sortConfig=`Назва==pagetitle||Дата надходження==menuindex||Ціна==price` + &ajax=`1` + !] + + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/05_\320\234\320\276\320\264\321\203\320\273\321\214_eFilter.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/05_\320\234\320\276\320\264\321\203\320\273\321\214_eFilter.md" new file mode 100644 index 00000000..f1d1833a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/05_\320\234\320\276\320\264\321\203\320\273\321\214_eFilter.md" @@ -0,0 +1,3 @@ +Модуль для зручного налаштування форм фільтрації. +Зліва дерево документів, категорії беруться за параметром шаблон категорій з налаштувань eList. +У корені повинен бути ресурс з шаблоном вказівки в параметрі обезательно. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/06_\320\234\320\276\320\264\321\203\320\273\321\214_eLists.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/06_\320\234\320\276\320\264\321\203\320\273\321\214_eLists.md" new file mode 100644 index 00000000..0938022e --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/06_\320\234\320\276\320\264\321\203\320\273\321\214_eLists.md" @@ -0,0 +1,21 @@ +Для зручного формування списків значень ТВ (щоб не захаращувати дерево і візуально зрозуміло їх редагувати) + +##Параметри модуля: + +1. ID TV параметрів товару (tovarparams) - Вкажіть тут ідентифікатор TV з ім'ям tovarparams, який створився при установці eFilter; +2. ID шаблонів товару - Вкажіть ідентифікатор шаблонів товару; +3. ID категорії параметрів - Тут потрібно вказати ідентифікатор саме категорії TV-параметрів, а не будь-якого окремого TV. Наприклад, ви можете створити категорію "Для фільтра" і поміщати туди всі параметри, які будуть брати участь в фільтрації. Після створення категорії ID можна подивитися на сторінці переглядів TV. Він буде вказано в дужках у потрібній категорії. +4. ID категорії загальних параметрів - те ж саме, що і "ID категорії параметрів", тільки TV відносяться до цієї категорії будуть прикріплюватися до будь-якого товару. Це може бути параметр, який є у всіх видів товарів, наприклад "Ціна" або країна походження. +5. Не вмикати ТБ в параметри при виведенні - Ідентифікатори TV указаннае в цьому пункті не будуть виводиться сніпетів tovarparams; +6. Ім'я чанка виведення товару - Чанк який буде використаний при виведенні сніпетів eFilterResult. Якщо при виклику вказано параметр tovarChunkName, то ігнорується; +7. Папка патернів - Папка в катором зберігаються патерни для візуального представлення в варіантах фільтра. За замовчуванням assets / images / pattern / +8. ID TV, використовуваного для зв'язки товар-категорії через tagSaver + +##Використання: +Для створення нового фільтра виконайте наступне: +1. Створіть новий TV параметр, дайте йому ім'я і виберіть тип введення; +2. Відкрийте модуль eLists і в рядку "Новий параметр" напишіть ім'я параметра (Для простоти використовуйте те ж саме ім'я, що й у створеного TV). Натисніть "Додати параметр"; +3. У таблиці "Список параметрів" натисніть "Список значень"; +4. У що з'явився таблиці "Список значень параметра" в поле "Додавання нового значення" можна додавати необхідні значення фільтра; +5. Натисніть на кнопку "Оновити" або "До списку параметрів"; +6. У таблиці "Список параметрів" в колонці "Опис (вставити в поле" можливі значення "потрібного TV)" з'явиться рядок (напр. @EVAL return $ modx-> runSnippet ("multiParams", array ("parent" => "1" ))), яку необхідно скопіювати і вставити в створений в першому пункті TV-параметр. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/index.md" new file mode 100644 index 00000000..61f1fb79 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eFilter/index.md" @@ -0,0 +1,44 @@ +Автор: [webber12](https://github.com/webber12) + +Пакет для генерації фільтра і блоку сортування товарів + +Пакет складається з компонентів: +* eLists (модуль) - Для зручного формування списків значень ТВ (щоб не захаращувати дерево і візуально зрозуміло їх редагувати) +* eFilter (сниппет) - висновок форми для фітрація +* eFilterResult (Сніпет) - виведення списку товарів (упаковка для DocLister) +* evoSortBlock (сніпет) - висновок блоку з формою сортування, а також вибору кількості товарів на сторінці +* eFilter (модуль) - удобная настройка формы для фильтрации + + +## Встановлення +Після встановлення необхідно: +1. зайти в налаштування модуля eLists і налаштувати наступні параметри: + * ID шаблонів товару + * ID категорії параметрів + * Список шаблонов категорий +2. У tv параметрі tovarparams вибрати шаблони категорій товарів. +3. Зайти в модуль eFilter і для категорій налаштувати параметри фільтрації. +4. У шаблоні вивести сниппет eFilter і eFilterResult і плейсхолдер eFilter_form + +Мінімальний виклик: +``` +[!eFilter!] +[+eFilter_form+] +[+eFilter_form_delete+] +[[eFilterResult]] + +``` + + +### Приклад 1. +Якщо потрібно вивести форму фільтра на головній а товари знаходяться в каталозі: +```[!eFilter? &docid=`32`!]``` //32 id каталогу +### Приклад 2. +Якщо для головної потрібно задати свою конфігурацію необхідно створити в модулі eFilter конфігурацію, а потім додати +параметр tv_config +```` +[!eFilter? +&docid=`32` +&tv_config=`[*tovarparams*]` +!] +```` diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..605771f2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,8 @@ + + +

    eForm: Особливості

    +Особливості сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    Сніпет eForm займається обробкою даних, які користувачі вводять в форми на сайті. Отримані дані можна надіслати електронною поштою використовуючи формат html, вкладення, автовідповідач, а також розширену обробку даних і генерацію звітів, що настроюються.

    +

    Ось деякі з можливостей сніпета:

    +

    1. Форма перевірки за допомогою потужних правил перевірки
    2. Захист прихованих полів від злому
    3. CAPTCHA підтримка
    4. Підтримує HTML
    5. Гнучка настройка
    6. Повідомлення для мобільних пристроїв < br> 7. Автоматичне відправлення пошти
    8. Підтримка CC і BCC полів

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/02_\320\236\320\261\320\276\320\262'\321\217\320\267\320\272\320\276\320\262\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/02_\320\236\320\261\320\276\320\262'\321\217\320\267\320\272\320\276\320\262\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..e7d79ec2 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/02_\320\236\320\261\320\276\320\262'\321\217\320\267\320\272\320\276\320\262\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,59 @@ + + +

    eForm: обов'язкові параметри

    +Обов'язкові параметри сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +
    +
    + +
    +
    +Формат: рядок
    +Значення за замовчуванням: нема
    +Примітка: Ідентифікатор форми використовується при відправленні даних. Цей параметр необхідний якщо на сторінці використовується більше однієї форми. Шаблон форми повинен мати приховане поле з тим же ідентифікатором:
    +
    <input type="hidden" name="formid" value="formName" />
    +або (починаючи з eForm 1.4.x)можна встановити ідентифікатор прямо в тезі форми:
    +
    <form id="formName"...>

    +

    Приклад:

    +
    &formid=`shopOrderForm`
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | документ | сніпет
    +Значення за замовчуванням: нема
    +Примітка: Ім'я чанка або ідентифікатор документа (число) для використовуваного шаблону. Можна також використовувати сніпет як джерело шаблону. При цьому ніякі параметри не передаються. Для регулярних полів форми не потрібно включати змінні, так як вони автоматично включаються eForm, крім випадків коли ви самі задаєте значення.
    +Доступні плейсхолдери:
    +
    [+validationmessage+]
    +[+postdate+]
    +[+verimageurl+]
    +[+debugText+]
    +

    Приклад:

    +
    &tpl=`OrderForm`
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | документ
    +Значення за замовчуванням: нет
    +Примітка: Ім'я чанка (не числом) або ідентифікатор документа (число) для шаблону звіту. При використанні параметра & noemail цей параметр не потрібно.
    +

    Приклад:

    +
    &report=`OrderReport`
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/03_\320\206\320\275\321\210\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/03_\320\206\320\275\321\210\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..cd695622 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/03_\320\206\320\275\321\210\321\226_\320\277\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,664 @@ + + +

    eForm: Інші параметри

    +Інші параметри сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +
    +
    + +
    +
    +Формат: email
    +Значение по умолчанию: системный адрес
    +Примітка: Можна використовувати декілька адрес розділяючи їх комою (,). Якщо не вказано, то буде використано системний адресу.
    +

    Приклад:

    +
    &to=`mail_1@ваш-домен.ru,mail_2@ваш-домен.ru`
    +
    +
    +
    + +
    + +
    +
    +Формат: email
    +Значення за замовчуванням: системний адрес
    +Примітка: Встановлює адресу відправника листа.
    +

    Приклад:

    +
    &from=`mail@ваш-домен.ru`
    +
    +
    +
    + +
    + +
    +
    +Формат: строка
    +Значення за замовчуванням: site_name
    +Примітка:
    +

    Приклад:

    +
    &fromname=`Адміністратор`
    +
    +
    +
    + +
    + +
    +
    +Формат: email
    +Значення за замовчуванням: &to
    +Примітка: Електронна адреса або поле містить адресу, який буде використаний у письмі для відповіді.
    +

    Приклад:

    +
    &replyto=`mail@ваш-домен.ru`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Включає можливість використовувати поле форми для визначення адреси, за якою буде надіслано лист.
    +

    Приклад:

    +
    &sendirect=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: email
    +Значення за замовчуванням: пусто
    +Примітка:
    +

    Приклад:

    +
    &cc=``
    +
    +
    +
    + +
    + +
    +
    +Формат: email
    +Значення за замовчуванням: пусто
    +Примітка:-
    +

    Приклад:

    +
    &bcc=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: За умовчанням встановлено в 0. eForm шукає адресу користувача в поле з назвою email.
    +

    Приклад:

    +
    &ccsender=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: строка
    +Значення за замовчуванням: пусто
    +Примітка: Тема повідомлення, яка може включати поля форми. Може включати ((поля форми)).
    +

    Приклад:

    +
    &subject=`Дякую за ваше замовлення ((firstname)) ((lastname))`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значение по умолчанию: 0
    +Примітка: 1 - не надсилати листів
    0 - включити відправку листів
    +

    Приклад:

    +
    &noemail=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: список email
    +Значення за замовчуванням: пусто
    +Примітка: Встановлюється поле форми, яке буде використовуватися при виборі єдиного адреси зі списку адрес розділених комою (,) для використання в параметрі & to. Значення поля буде визначати номер використовуваного поштової адреси. Номер 1 відповідає першому адресою і N - останньому. У формі використовується поле topic у вигляді списку. Коли користувач вибирає значення, то тим самим він визначає одну адресу, за якою будуть послані дані форми.
    +
    &to=`sales@me.com,support@me.com,billing@me.com` &mailselector=`topic`

    +

    Приклад:

    +
    &mailselector=``
    +
    +
    +
    + +
    + +
    +
    +Формат: email
    +Значення за замовчуванням: пусто
    +Примітка: Адрес почты мобильного устройства. Используется для отсылки короткого сообщения.
    +

    Приклад:

    +
    &mobile=``
    +
    +
    +
    + +
    + +
    +
    +Формат: Рядок (чутлива до регістру)
    +Значення за замовчуванням: пусто
    +Примітка: Повідомлення для відправки на мобільний пристрій. Може містити поля форми.
    +

    Приклад:

    +
    &mobiletext=`Замовлення для [+firstname+]`
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | документ
    +Значення за замовчуванням: пусто
    +Примітка: Ім'я чанка (не числом) або ідентифікатор документа (число) дляі спользуемого шаблону повідомлення виведеного користувачеві після відправки даних форми.
    +Доступні плейсхолдери:
    +
    [+validationmessage+]
    +[+postdate+]
    +[+verimageurl+]
    +[+debugText+]
    +

    +

    Приклад:

    +
    &thankyou=``
    +
    +
    +
    + +
    + +
    +
    +Формат: id документа
    +Значення за замовчуванням: пусто
    +Примітка: Ідентифікатор документа на який буде здійснений перехід після відправлення даних форми. Дивіться також &thankyou.
    +

    Приклад:

    +
    &gotoid=`34`
    +
    +
    +
    + +
    + +
    +
    +Формат: рядок | категория
    +Значення за замовчуванням: пусто
    +Примітка: Назва або ідентифікатор категорії використовуваний для категоризації eForm. Якщо категорія не знайдена, то вона автоматично буде створена. Це використовується в темі повідомлення.
    +

    Приклад:

    +
    &category=``
    +
    +
    +
    + +
    + +
    +
    +Формат: список ключових слів | список полів
    +Значення за замовчуванням: пусто
    +Примітка: Спільні коми (,) ключові слова або поле форми використовується при пошуку банку даних.
    +

    Приклад:

    +
    &keywords=`[+firstname+],[+lastname+], [+email+]`
    +
    +
    +
    + +
    + +
    +
    +Формат: email
    +Значення за замовчуванням: пусто
    +Примітка: Адреса електронної пошти, який показується при відправці повідомлення автовідповідача.
    +

    Приклад:

    +
    &autosender=`no-reply@mydomain.com`
    +
    +
    +
    + +
    + +
    +
    +Формат: строка
    +Значение по умолчанию: пусто
    +Примітка: Ім'я, яке використовується в повідомленні автовідповідача.
    +

    Приклад:

    +
    &autoSenderName=`name`
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | документ
    +Значення за замовчуванням: пусто
    +Примітка: Назва чанка (не числом) або ідентифікатор документа (число) для використовуваного шаблону в повідомленні автовідповідача. Може містити поля форми.
    +

    Приклад:

    +
    &automessage=`messageForm`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Включає використання користувачами HTML в повідомленні. 1 - включено, 0 - вимкнено. Можливі XSS атаки, наприклад якщо дозволено в чанка thankyou.
    +

    Пример:

    +
    &allowhtml=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: название языка
    +Значення за замовчуванням: english
    +Примітка: Встановлює використовуваний мову повідомлень і перевірки. Назва мов збігається з MODX.
    +

    Приклад:

    +
    &language=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Включає код перевірки. Шаблон повинен містити поле для перевірки і плейсхолдер [+vericode+].
    +

    Приклад:

    +
    &vericode=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Включає розширені повідомлення про помилки в перевірці форми. В основному для налагодження #LIST і #SELECT. 1 - включено, 0 - вимкнено.
    +

    Приклаж:

    +
    &debug=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | report, autotext, mobile
    +Значення за замовчуванням: пусто
    +Примітка: Визначає, які повідомлення будуть використовувати формат html.
    1 - всі повідомлення
    report, autotext, mobile - конкретні типи повідомлень.
    +

    Приклад:

    +
    &sendAsHtml=`report`
    +
    +
    +
    + +
    + +
    +
    +Формат: 1 | report, autotext, mobile
    +Значення за замовчуванням: пусто
    +Примітка: Визначає, які повідомлення будуть використовувати текстовий формат.
    1 - всі повідомлення
    report, autotext, mobile - конкретні типи повідомлень.
    +

    Приклад:

    +
    &sendAsText=`report`
    +
    +
    +
    + +
    + +
    +
    +Формат: список змінних сесії
    +Значення за замовчуванням: пусто
    +Примітка: Назви змінних сесії $ _SESSION, розділені комою (,). Вони будуть додані в список значень полів перш ніж можна буде форми і можуть бути використані в якості прихованих полів. Якщо ви використовуєте цей параметр, то переконаєтеся, що ви не розкриваєте важливу інформацію сесії (приховані поля не захищають інформацію!).
    +Так як eForm не виконує самостійну обробку таких значень, то вам необхідно включити їх в шаблон.
    +

    Приклад:

    +
    [!eForm &sessionVars=`jobID` ... !]
    + 

    +

    Приклад:

    +
    &sessionVars=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Використовується в комбінації з & sessionVars. Змінні сесії будуть переписані введеними в форму значеннями. При встановленні значення 1 отримані в формі дані отримують пріоритет.
    +

    Пример:

    +
    &postOverides=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: При встановленні значення `1` будуть надсилатися повідомлення на спеціальну електронну адресу якщо буде помічена спроба ін'єкції eForm (використовуйте помірно).
    +

    Приклад:

    +
    &reportAbuse=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | файл
    +Значення за замовчуванням: пусто
    +Примітка: Додає визначення стилю в область & lt; head & gt; сторінки, на якій розташовується форма або повідомлення для користувача показуване після відправки (тільки якщо параметр & thankyou встановлений). Значення можуть бути у вигляді ідентифікатора документа (число), імені чанка або посилання на таблицю стилів (відносна або абсолютна). Можна використовувати кілька значень розділяючи їх комами (,) (фактично можна комбінувати всі три види значень).
    +

    Приклад:


    +
    [!eForm &cssStyle=`assets/site/forms.css,chunkName` ... !]
    [!eForm &cssStyle=`chunkName` ... !]
    [!eForm &cssStyle=`http://saniock.com/css/forms.css` ... !]
    +Приклад. Чанкі (і документи, якщо встановлено ідентифікатор документа) можуть використовувати значення в формі:
    +1. як вбудований блок: +
    <style>: <style type="text/css">/*якісь стилі*/</style>
    +2. як посилання на таблицю стилів: +
    <link href="assets/site/forms.css" rel="stylesheet" type="text/css">
    +3. як розділений комою (,) список посилань на таблиці стилів: +
    assets/site/forms.css,assets/site/more.css,assets/site/gone_overboard.css 

    +

    Приклад:

    +
    &cssStyle=``
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | файл
    +Значення за замовчуванням: пусто
    +Примітка: Аналогічно параметру cssStyle. +
    [!eForm &jScript=`assets/site/forms.js,chunkName` ... !]
    [!eForm &jScript=`chunkName` ... !]
    [!eForm &jScript=`http://saniock.com/js/forms.js` ... !]

    +

    Приклад:

    +
    &jScript=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1 | список полей
    +Значення за замовчуванням: 1
    +Примітка:Захист форми від повторної відправки з тими ж даними. Відправка даних форми автоматично відключається після першої успішної спроби поки ключ форми є одним і тим же. Для цього використовується змінна сеансу з md5 хешем як ключ. Які поля використовуються для порівняння задається в параметрі & protectSubmit. Можливі значення:
    +0 - вимкнено
    +1 - використовуються всі поля `required`
    +Список полів - список використовуваних полів через кому.
    +Щоб гарантувати, що використовуються відповідні поля для різних форм змінна сесії заснована на &formid({formid}_hash).
    +

    Приклад:

    +
    &protectSubmit=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | хвилини
    +Значення за замовчуванням: 0
    +Примітка: Встановлює ліміт часу (в хвилинах) між відправленнями даних форми. Після першої успішної відправки даних забороняє відправку інших даних напевні час. При використанні спільно з & protectSubmit цей параметр має пріоритет, дозволяючи повторну відправку даних незалежно від установки & protectSubmit (буде скинута сесійний змінна). Як і & protectSubmit цей параметр використовує сесійний змінну засновану на & formid.
    +

    Приклад:

    +
    &submitLimit=`10`
    +
    +
    +
    + +
    + +
    +
    +Формат: CSS-класс
    +Значення за замовчуванням: пусто
    +Примітка: Назва класу. Додає клас в певні поля форми при перевірці. Існуючі класи будуть збережені.
    +Якщо ви вже визначили клас для полів або міток (label) і отримали несподівані результати, то перевірте порядок визначення класів. & RequiredClass встановлюється в початок будь-яких класів, які вже встановлені.
    +

    Пример:

    +
    &requiredClass=``
    +
    +
    +
    + +
    + +
    +
    +Формат: CSS-класс
    +Значення за замовчуванням: пусто
    +Примітка: Назва класу. Додає клас до неправильно заповненим полях форми, які виявилися під час перевірки. Існуючі класи будуть збережені.
    +

    Приклад:

    +
    &invalidClass=``
    +
    +
    +
    + +
    + +
    +
    +Формат: сніпет
    +Значення за замовчуванням: пусто
    +Примітка: Визначає ім'я сніпета. сніпет буде виконаний перед усіма обробками eForm. Один параметр & formid, буде опущений для сніпета. Будь-які повернуті значення з сніпета не враховуватимуться. Це може бути використано як альтернатива використання функцій в документі. На жаль eForm мовчки проігнорує результат роботи сніпета, так як &modx->runSnippet не повертає ніяких значень.
    +

    Приклад:

    +
    &runSnippet=``
    +
    +
    +
    + +
    + +
    +
    +Формат: шлях від папки 'assets/snippets/'
    +Значення за замовчуванням: пусто
    +Примітка: Для тих хто хоче залишити інші версії eForm активними. Тепер ви можете зберегти всі файли eForm і відповідно встановити & snipFolder. Наприклад ви можете зберегти версію 1.4.4 в папку assets/snippets/eform / 1.4.4 і встановити параметр: +
    &snipFolder=`eform/1.4.4`
    +До значенням автоматично додасться шлях 'assets/snippets/'. Не потрібно використовувати закриває слеш (/)!
    +

    Приклад:

    +
    &snipFolder=`eform/1.4.4`
    +
    +
    +
    + +
    + +
    +
    +Формат: имя поля
    +Значення за замовчуванням: пусто
    +Примітка: Имя поля формы, которое содержит список имен файлов, разделенных запятыми. Эти файлы должны быть расположены в &attachmentFolder.
    +

    Приклад:

    +
    &attachmentField=``
    +
    +
    +
    + +
    + +
    +
    +Формат: путь
    +Значення за замовчуванням: пусто
    +Примітка: Шлях до папки (щодо MODX basepath), яка містить файли, зазначені в & attachmentField. Не потрібно використовувати закриваючий слеш (/)!
    +

    Приклад:

    +
    &attachmentFolder=``
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | строка
    +Значення за замовчуванням пусто
    +Примітка: Ім'я чанка або текст, який використовується в якості шаблону для помилок. доступні плейсхолдери:
    [+ef_message_text+]
    [+ef_wrapper+]
    +

    Приклад:

    +
    &errorTpl=``
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | строка
    +Значення за замовчуванням: пусто
    +Примітка: Ім'я чанка або текст, який використовується в якості шаблону для списку необхідних полів. доступні плейсхолдери:
    [+ef_required_list+]
    +

    Приклад:

    +
    &errorRequiredTpl=``
    +
    +
    +
    + +
    + +
    +
    +Формат: чанк | строка
    +Значення за замовчуванням: пусто
    +Примітка: Ім'я чанка або текст, який використовується як роздільник між двома елементами в списку необхідних полів.
    +

    Приклад:

    +
    &errorRequiredSeparator=`, `
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/04_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270_\321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/04_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270_\321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" new file mode 100644 index 00000000..208381f1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/04_\320\237\320\273\320\265\320\271\321\201\321\205\320\276\320\273\320\264\320\265\321\200\320\270_\321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" @@ -0,0 +1,12 @@ + + +

    eForm: Плейсхолдери шаблону

    +Плейсхолдери шаблону сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    Для багатьох стандартних полів форми eFrom автоматично вставляє відповідні змінні шаблону. Також ви можете визначити їх самостійно:

    +
      +
    • [+validationmessage+] - Необхідно використовувати в якомусь місці вашого шаблону або документа. З версії 1.4.2 ця змінна шаблону зазнала змін. По-перше тепер її не обов'язково використовувати в шаблоні. Тепер ви можете розмістити її в будь-якому місці вашого документа. По-друге вам необов'язково встановлювати якісь теги навколо цієї змінної. Тепер все html оточення включається в значення $_lang[\'ef_validation_message'] у мовному файлі eForm.
    • +
    • [+vericode+] и [+verimageurl+] - необхідно якщо ви збираєтеся використовувати в формі графічну перевірку (capthca). Дивіться в прикладах як це використовувати.
    • +
    • [+postdate+] - ця змінна буде використана в звіті і повідомленні для користувача після відправки даних форми і встановить поточну дату і час.
    • +
    • [+debug+] - починаючи з версії 1.4.1, автоматично встановлюється, якщо включений режим налагодження, в формі і повідомленні для користувача після відправки. Чи не поміщається автоматично в шаблон звіту. Необхідно уникати відправку технічної інформації через сервер. Якщо ви хочете протестувати відправку листів, то можете включити цю змінну самостійно.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/05_\320\237\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\264\320\260\320\275\320\270\321\205.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/05_\320\237\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\264\320\260\320\275\320\270\321\205.md" new file mode 100644 index 00000000..c8c65b01 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/05_\320\237\320\265\321\200\320\265\320\262\321\226\321\200\320\272\320\260_\320\264\320\260\320\275\320\270\321\205.md" @@ -0,0 +1,73 @@ + + +

    eForm: Перевірка даних

    +Перевірка даних сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    Ця версія підтримує розширену перевірку на стороні сервера і фільтрацію, що використовує дуже гнучкі правила перевірки, які включаються в параметр eform. Ви можете визначити 2 додаткових параметра перевірки, повідомлення про помилку і перевірці або правило фільтру.

    +

    Наприклад:

    +
    eform="Year of Birth:integer:1:Must be between 1950 and 2002:#RANGE 1950-2002"
    + +

    Правила перевірки

    +

    #LIST - перераховані через кому можливі значення.

    +

    Наприклад:

    +
    #LIST червоний, зелений, оранжевий, синій
    +

    #RANGE - розділені комою можливий числові значення або числові діапазони. При установці діапазону порядок не має значення. 1 ~ 10 і 10 ~ 1 будуть однаково визначати числа між 1 і 10 (включно). Можна використовувати як позитивні так і негативні числа.

    +

    Наприклад:

    +
    #RANGE 1,3,-5~-15,60~82
    +

    #SELECT - визначає правильність значень, які будуть повернуті з бази при запиті. Запит повинен повертати значення тільки однієї колонки (функція перевіряє тільки першу колонку). Ви можете використовувати {\DBASE} {\PREFIX} теги. Вони будуть автоматично замінені на назву бази MODX і використовуваний префікс таблиці.

    +

    Наприклад:

    +
    #SELECT keyword FROM {\PREFIX}site_keywords
    +

    #EVAL - рядок коду PHP. Може повертати true або false. Увага! Хоча #EVAL все ще використовується в eForm 1.4, але в майбутніх версіях вони швидше за все більше не будуть підтримуватися. натомість використовуйте #FUNCTION.

    +

    #FUNCTION - назва функції. Функція повинна використовувати тільки одне значення (значення поля) і повертати TRUE або FALSE. Дивіться приклади, щоб розібратися як це діє.

    +

    Наприклад:

    +
    #FUNCTION myValidationFunction
    +

    #REGEX - регулярне вираження. синтаксис preg_match() в PHP.

    +

    Приклад:

    +
    #REGEX /^[\a-z]+ [\a-z0-9_]+/i
    +

    #FILTER - фільтри не перевіряють введених значень, але замінюють слова і значення, які відповідають критеріям. Ви можете використовувати наступні фільтри:

    +
      +
    • #FILTER #LIST
      Використовуйте дві вертикальні риси для поділу замінних і замінюють слів.
      Наприклад: +
      #FILTER #LIST badword,verybadword||goodword,verygoodword
      +
    • +
    • #FILTER #EVAL
      Например: +
      #FILTER #EVAL return myFilterFunction($value);
      +

      (звісно ви повинні бути впевнені в існуванні зазначеної функції)

      Приклади застосування фільтра:

      +
      function myFilterFunction($value){
      +	$badWords = array('scribble','coding');
      +	$goodWords = array('design','sleep');
      +	return str_replace($badWords,$goodWords,$value);
      +}
      +
    • +
    • #FILTER #REGEX
      Регулярне вираження заміни. Синтаксис preg_replace() в PHP. Пошук і вираз заміни розділяється двома вертикальними рисами (||)
    • +
    + +

    Поля select, radio и checkbox

    +

    Ці поля мають автоматичну перевірку. Всі отримані значення перевіряються на відповідність встановленими вами в шаблоні форми. Це дозволяє уникнути додавання сторонніх значень в ці поля.

    + +

    Приховані поля

    +

    За замовчуванням приховані поля присутні як захист від підробки форми при порівнянні використовуваних значень (як в полях select, radio і checkbox). Але в деяких місцях це може бути непотрібно. Наприклад якщо ви використовуєте обробку javascript, яка зберігає свої значення в прихованих полях. У цей випадку ви можете змінити цю поведінку використовуючи параметр eform (включаючи або вимикаючи перевірку).

    +

    Приховане поле приклад 1:

    +

    Вбудоване поведінку зручно, якщо ви зберігаєте в прихованому полі ідентифікатор документа і не хочете щоб він був змінений будь-ким. Поле має виглядати приблизно так:

    +
    <input type="hidden" name="docId" value="31" />
    +

    Приховане поле приклад 2:

    +

    Якщо ви використовуєте javascript, який зберігає значення в прихованих полях, то вам необхідно прибрати перевірку поля так:

    +
    <input type="hidden" name="calculatedField" value="" eform="::0::" />
    +

    Приховане поле приклад 3:

    +

    Приклад схожий на 2, але ви хочете переконатися, що повернуті значення лежать в допустимих межах чисел. Встановимо для параметра eform заголовок, числовий тип даних, обов'язковість заповнення, повідомлення про помилку і перевірку на діапазон. Це буде виглядати так:

    +
    <input type="hidden" name="calculatedField" value="" eform="Calculated Value:integer:1:Calculation out of range:#RANGE 1-10" />
    + +

    Приклад полів з перевіркою

    +

    Випадаючий список - обов'язкове поле (не потрібно перевірка)

    +
    +<select name="mySelect" eform_options="Select Country::1" /> (тип даних не визначений)
    +	<option value="en-au">Australia</option>
    +	<option value="en-us">USA</option>
    +</select>
    +
    +

    Текстове поле - обов'язкове поле і формат даних для дат.

    +
    <input type="text" name="dobDate" eform_options="Date of Birth:date:1:@EVAL return (strtotime($value)!==-1)?true:false;" />
    +

    Багато чекбоксів - обов'язкове поле, можна вибрати кілька значень.

    +
    +<input type="checkbox" name="myColors[]" value="Red" eform_options="Colors::1" /> (тип даних не визначений)
    +<input type="checkbox" name="myColors[]" value="Green" /> (тип даних не визначений)
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/06_\320\237\320\276\320\264\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/06_\320\237\320\276\320\264\321\226\321\227.md" new file mode 100644 index 00000000..b32a9680 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/06_\320\237\320\276\320\264\321\226\321\227.md" @@ -0,0 +1,86 @@ + + +

    eForm: Події для PHP функцій

    +Події PHP функцій сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +
    +
    + +
    +
    +Формат: функция
    +Значення за замовчуванням: пусто
    +Примітка: Визначає назву функції. Ця функція буде запущена після того як форма буде перевірена і перед звітом і повідомленням для користувача, а також відправкою будь-яких повідомлень. Функції передаються такі параметри: & $ fields - масив полів і значень змінних.
    +

    Приклад:

    +
    &eFormOnBeforeMailSent=``
    +
    +
    +
    + +
    + +
    +
    +Формат: функция
    +Значення за замовчуванням: пусто
    +Примітка: Визначає назву функції. Ця функція буде запущена після обробки всіх шаблонів і будь-яке повідомлення буде послано. Функції передаються такі параметри: & $ fields - масив полів і значень змінних.
    +

    Приклад:

    +
    &eFormOnMailSent=``
    +
    +
    +
    + +
    + +
    +
    +Формат: функция
    +Значення за замовчуванням: пусто
    +Примітка: Визначає назву функції. Ця функція буде запущена після завантаження шаблонів і визначення ідентифікатора форми. Функції передаються такі параметри:
    &$fields - масив полів і значень змінних.
    &$templates - масив всіх шаблонів з індексами 'tpl', 'report', 'thankyou' і 'autotext'. Останні три матимуть значення тільки після відправки форми.
    +

    Приклад:

    +
    &eformOnBeforeFormParse=``
    +
    +
    +
    + +
    + +
    +
    +Формат: функция
    +Значення за замовчуванням: пусто
    +Примітка: Визначає назву функції. Ця функція буде запущена тільки при показі форм і до визначення всіх змінних шаблону. Функції передаються такі параметри: &$fields - масив полів і значень змінних.
    +

    Приклад:

    +
    &eFormOnBeforeFormMerge=``
    +
    +
    +
    + +
    + +
    +
    +Формат: функция
    +Значення за замовчуванням: пусто
    +Примітка: Визначає назву функції. Ця функція буде запущена після перевірки даних форми. Це можна використовувати для визначення власного алгоритму обробки. Функції передаються такі параметри: +
    &$fields - масив полів і значень змінних
    +&$vMsg - числовий масив помилок перевірки даних форми
    +&$rMsg - числовий масив пропущених обов'язкових полів
    +&$rClass - асоціативний масив імен полів і класів
    +

    +

    Приклад:

    +
    &eFormOnValidate=``
    +
    +
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/07_\320\242\320\270\320\277\320\270_\321\226_\321\204\320\276\321\200\320\274\320\260\321\202\320\270_\320\264\320\260\320\275\320\270\321\205.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/07_\320\242\320\270\320\277\320\270_\321\226_\321\204\320\276\321\200\320\274\320\260\321\202\320\270_\320\264\320\260\320\275\320\270\321\205.md" new file mode 100644 index 00000000..0fb92eb3 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/07_\320\242\320\270\320\277\320\270_\321\226_\321\204\320\276\321\200\320\274\320\260\321\202\320\270_\320\264\320\260\320\275\320\270\321\205.md" @@ -0,0 +1,23 @@ + + +

    eForm: Типи і формати даних

    +Типи і формати даних сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    Формат даних

    +

    eForm має вбудований аналізатор визначає формат і тип даних з відповідною перевіркою кожного поля. Для настройки використовується додавання додаткового параметра eform в необхідні поля.

    +
    <input type="text" name="color" eform="A Color:string:1" />
    +

    Базовий вид параметру eform наступний:

    +

    [description/title]:[datatype]:[required]:[validation message]:[validation rule]

    +

    Типи даних

    +

    Ви можете встановлювати тільки ці типи даних. Інші визначаються автоматично.

    +

    Всі поля автоматично перевіряють на порожнечу значень.

    +
      +
    • string - не має спеціальної перевірки крім порожнечі і обов'язковості заповнення.
    • +
    • date - перевіряється на правильність формату дати (Ця інформація базується на функції strtotime())
    • +
    • integer - перевіряється на числове значення (не перевіряється, якщо воно ціле)
    • +
    • float - перевірка на числове значение
    • +
    • email - перевіряє правильність адреси email з використанням регулярних виразівй
    • +
    • file - (Для поля завантаження файлу) - перевіряє відповідність дозволеному розміром, на поточний момент не має перевірки типів файлів.
    • +
    • html - також як тип string тільки перенесення рядка перетвориться в тег <br/>
    • +
    +

    Випадаючі списки, чекбокси, і радіобатони не вимагають визначення типу. eForm визначає їх автоматично.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/08_\320\227\320\260\321\205\320\270\321\201\321\202_\320\262\321\226\320\264_\321\201\320\277\320\260\320\274\321\203.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/08_\320\227\320\260\321\205\320\270\321\201\321\202_\320\262\321\226\320\264_\321\201\320\277\320\260\320\274\321\203.md" new file mode 100644 index 00000000..b252c4ff --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/08_\320\227\320\260\321\205\320\270\321\201\321\202_\320\262\321\226\320\264_\321\201\320\277\320\260\320\274\321\203.md" @@ -0,0 +1,36 @@ + + +

    eForm: Захист від спаму

    +Захист від спаму в сніпеті eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    Вбудована капча не дає надійного захисту від спаму. Тому від неї має сенс або відмовитися взагалі на користь інших рішень або використовувати різні способи боротьби зі спамом одночасно. В даний момент популярно рішення, яке використовується в чанка eFeedbackForm кастомной збірці Дмитра Лук'яненко. Суть методу - додати в шаблон форми приховане поле і зробити його незаповнення обов'язковим:

    +
    <input value="" name="special" class="special" type="text" eform="Спец:date:0" style="display:none;">
    +

    Код чанку eFeedbackForm

    +
    +<p><span style="color:#900;">[+validationmessage+]</span></p>
    +<form  class="eform" method="post" action="[~[*id*]~]">
    +	<input type="hidden" name="formid" value="feedbackForm" />
    +	<input value="" name="special" class="special" type="text" eform="Спец:date:0"  style="display:none;" />
    +	<p>
    +		<input type="text" name="name" id="name" class="grid_3" value=""  eform="Ім'я:string:1"/>
    +		<label for="name">Ваше ім'я</label>
    +	</p>
    +	<p>
    +		<input type="text" name="email" id="email" class="grid_3" value="" eform="E-mail:email:1" />
    +		<label for="email">Ваш E-mail</label>
    +	</p>
    +	<p>
    +		<input type="text" name="phone" id="subject" class="grid_3" value="" eform="Номер телефону:string:1"/>
    +		<label for="subject">Номер телефону</label>
    +	</p>
    +	<p>
    +		<textarea name="comments" id="message" class="grid_6" cols="50" rows="10" eform="Текст повідомлення:string:1"></textarea>
    +	</p>
    +	<p>Введіть код с картинки: <br />
    +		<input type="text" class="ver" name="vericode" /><img class="feed" src="[+verimageurl+]" alt="Введіть код" />
    +	</p>            
    +	<p>
    +		<input type="submit" name="submit" class="subeform grid_2" value="Надіслати повідомлення"/>
    +	</p>
    +</form>
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/09_recaptcha.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/09_recaptcha.md" new file mode 100644 index 00000000..937767f6 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/09_recaptcha.md" @@ -0,0 +1,67 @@ + + +

    reCAPTCHA для eForm

    +reCAPTCHA в сніпеті eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    Встановлення

    +

    1. Перш за все потрібно отримати ключі для сайту (siteKey и secretKey) – здесь

    +

    2. Завантажуємо готову PHP бібліотеку каптчі тут: github (Clone or download, Download ZIP)

    +

    3. З архіву, витягуємо папку src, закачуємо в папку /assets/snippets і перейменовуємо цю папку в recaptcha

    +

    4. Створюємо сніпет ReCaptcha і вставляємо в нього даний код:

    +
    +<?php
    +if(!defined('MODX_BASE_PATH')) {die('What are you doing? Get out of here!');}
    +include_once MODX_BASE_PATH.'assets/snippets/recaptcha/autoload.php';
    +
    +if(!defined('siteKey')) {define('siteKey', 'siteKeyCodestring');}
    +if(!defined('secretKey')) {define('secretKey', 'secretKeyCodestring');}
    +
    +$lang = isset($lang) ? $lang : 'ru';
    +$text = isset($text) ? $text : 'Вы не подтвердили, что вы не робот!';
    +
    +unset($_SESSION['veriword']);
    +
    +$script = '<script src="//google.com/recaptcha/api.js?hl='.$lang.'"></script>';
    +$modx->regClientStartupScript($script);
    +
    +$Recaptcha = new \ReCaptcha\ReCaptcha(secretKey);
    +
    +if(isset($_REQUEST['g-recaptcha-response'])){
    +	$resp = $Recaptcha->verify($_REQUEST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
    +	if($resp->isSuccess()){
    +		$_SESSION['veriword'] = $_SESSION['eForm.VeriCode'];
    +		$_POST['vericode'] = $_SESSION['eForm.VeriCode'];
    +	} else {
    +		$response = $resp->getErrorCodes();            
    +		if(!empty($response)){
    +			$codes='';
    +			foreach ($response as $code) { $codes.= $code; }
    +			$_SESSION['veriword'] = 'ReCaptchaErrors : '.$codes;
    +		}
    +	}
    +}
    +        
    +if(!function_exists('setReCaptcha')){
    +	function setReCaptcha(&$fields){
    +		$fields['ReCaptcha']= '
    '; + return true; + } +} + +if(!function_exists('verifyReCaptcha')){ + function verifyReCaptcha(&$fields,&$vMsg,&$rMsg,&$rClass){ + if($_SESSION['veriword'] !== $_SESSION['eForm.VeriCode']){ + $vMsg[] = $text; + } + return true; + } +} +?> +
    +

    5. У темплейти eForm прописуємо плейсхолдер [+ReCaptcha+] в тому місці, де хочемо її бачити (якщо ви використовуєте в темплейт виклик veriword.php, закрийте його коментарем або видаліть)

    +

    6.Перед викликом eForm ставимо виклик сніпета ReCaptcha [[ReCaptcha]], а у виклик самого eForm додаємо параметри:

    +
    +&vericode=`1`
    +&eFormOnBeforeFormMerge=`setReCaptcha`
    +&eFormOnValidate=`verifyReCaptcha`
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/10_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/10_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..877aa8f1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/10_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,127 @@ + + +

    eForm: Приклади

    +Приклади сніпета eForm для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. +
    +

    eForm в модальному вікні

    +

    Ситуація, коли треба вивести форму в модальному вікні досить часта. Виведемо форму в модальному вікні Bootstrap 3.

    +

    Модальне вікно буде виглядати приблизно так:

    +
    +
    +
    +
    +

    Чанк tplForm:

    +
    +<form method="post" action="[~[*id*]~]" name="Form" id="Form">
    +	
    +	
    +</form>
    +
    +

    Чанк tplThank:

    +
    +
    +
    +
    +

    Ну і останній штрих, потрібно розмістити приблизно такий скрипт:

    +
    +<script>
    +	$(function(){
    +		$(document).on("submit","#Form",function(e){
    +			e.preventDefault();
    +			var m_method=$(this).attr('method');
    +			var m_action=$(this).attr('action');
    +			var m_data=$(this).serialize();
    +			$.ajax({
    +				type: m_method,
    +				url: m_action,
    +				data: m_data,
    +				resetForm: 'true',
    +				success: function(result){
    +					var data = $(result).find("#myModal_form").html();
    +					$("#myModal_form").html(data);
    +				}
    +			});
    +		});
    +	});
    +</script>
    +
    + +

    eForm Ajax Submit

    +

    Створюємо приблизно такий виклик eForm, обгорнутий у діві з id ajaxContactForm - зверніть увагу що з цього id і буде вся прив'язка.

    +

    Тут звичайно можна ставити відразу форму без виклику через eForm, її ж полюбому оброботает плагін.

    +

    [(cfg_from)], [(cfg_email)] - ТВ змінні сайту збережені в системній таблиці за допомогою плагіна CfgTv.

    +
    +
    + [!eForm? + &formid=`contactForm` + &subject=`Сообщение с сайта [(site_name)]` + &tpl=`formTpl` + &errorTpl=`errorTpl` + &report=`reportTpl` + &thankyou=`thankyouTpl` + &gotoid=`244` + &vericode=`0` + &from=`[(cfg_from)]` + &to=`[(cfg_email)]` + !] +
    +
    +

    Скрипт Ajax обробки

    +
    +
    +
    +

    Створюємо плагін наприклад AjaxSubmit який спрацьовує на подію OnPageNotFound

    +
    +switch($_GET['q']){
    +	case 'ajaxContactForm':
    +		echo $modx->runSnippet(
    +			'eForm',
    +			array(
    +				'formid' => 'contactForm',
    +				'subject' => 'Повідомлення [(site_name)]',
    +				'tpl' => 'formTpl',
    +				'report' => 'reportTpl',
    +				'thankyou' => 'thankyouTpl',
    +				'errorTpl' => 'errorTpl',
    +				'vericode' => 0,
    +				'protectSubmit' => '0',
    +				'from' => '[(cfg_from)]',
    +				'to' => '[(cfg_email)]'
    +			)
    +		);
    +		die();
    +	break;
    +}
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/index.md" new file mode 100644 index 00000000..e2a51c36 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/eForm/index.md" @@ -0,0 +1,4 @@ + + +

    eForm Сніпет зворотного зв'язку на Evolution CMS Зворотній зв'язок, замовлення дзвінка, оформлення замовлення товарів і т.д.

    +Сніпет для створення зворотного зв'язку, замовлення дзвінка, оформлення замовлення товарів на Evolution CMS. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/evoBabel/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/evoBabel/index.md" new file mode 100644 index 00000000..13f7ba97 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/evoBabel/index.md" @@ -0,0 +1,84 @@ +###evoBabel - мультимовні сайти для modx evolution (версия 0.2) +####author webber (web-ber12@yandex.ru) + +### Склад: +--------- +* 1. Папка assets/snippets/evoBabel, що містить основний снsппет snippet.evoBabel.php (створення мовних версій) і необхідний для роботи файл evoBabel.class.php +* 2. Сніпет evoBabel - для виведення результатів роботи в ТВ ресурсу +* 3. Сніпет lang - для видачі перекладу потрібною мовою на сайті +* 4. Плагін evoBabel - для правильної віддачі 404 сторінки, синхронізації значень обраних ТВ, читання в сесію актуальних перекладів +* 5. Плагін evoBabel Placeholders - для парсинга мовних плейсхолдеров парсинга мовних плейсхолдеров виду [%Головна сторінка%] замість сніпета [[lang? &a=`Головна сторінка`]] +* 6. Модуль lexicon для evoBabel (файли і текст модуля) + + +### Можливості: +--------- +* 1. створення неграніченного кількості мовних версій сайту +при цьому кожна версія зберігається в своєму дереві, що не обмежує нас ніяк +тобто структура сайту на різних мовах може відрізнятися (на відміну від YAMS), немає проблем з плейсхолдерами, іншими сніпета і т.п. +* 2. ресурси різних мовних версій пов'язані між собою - що дозволяє при навігації перемикатися на потрібну мовну версію ресурсу +* 3. Можлива синхронізація значень потрібних ТВ параметрів для різних версій ресурсу (id потрібних ТВ і id потрібних шаблонів задається в настройках плагіна evoBabel) +* 4. Переклади в окремому модулі Lexicon без перезавантаження і відразу для всіх мов. Є фільтрація, можливість додавання і видалення потрібної мови там же + +### Встановлення: +--------- +* 1. Завантажуємо архів зі сніпетів +* 2. Розміщуємо в папку assets / snippets / відповідні папки +* 3. Створюємо шаблон "Мова" і запам'ятовуємо його id - ми будемо привласнювати його кожної кореневої папці мови +* 4. Створюємо в корені сайту один (або декілька) папок для мов - наприклад RU, EN тощо з шаблоном "Мова". Аліаси даних папок будуть аліасами мов (ru, en, fr і т.п.) +* 5. Нехай у нас основною мовою буде RU, створюємо в папці RU головну сторінку (задаємо її стартовою для сайту в конфігурації MODx) +* 6. ID Сторінка вносимо в поле description нашого ресурсу RU, поле longtitle ресурсу RU пишемо слово "Русский" - там буде міститися назва нашої мови для виведення в переключалка мов +* 7 Створюємо новий TV-параметр (назвемо його relation, заголовок - Мовні версії ресурсу) з типом введення Custom Input і в поле можливі значення вписуємо код @EVAL return $modx->runSnippet("evoBabel"); +id саме цього TV і потрібно вносити в налаштування модуля як id TV, використовуваного для зберігання зв'язків. +* 8 Прикріплюємо даний TV до всіх шаблонах крім мови. +* 9. Створюємо новий сніпет evoBabel і поміщаємо в нього код з відповідного файлу в папці install +* 10. Створюємо новий сніпет lang і копіюємо код з відповідного файлу в папці install +* 11. Створюємо новий плагін evoBabel, копіюємо код з відповідного файлу в папці install +* 12. У конфігурації плагіна вставляємо +``` +&synch_TV=ids TV для синхронізації;text; &synch_template=ids шаблонів для синхронізації;text; &config=Файл шаблонів;text;assets/snippets/evoBabel/config/config.php +``` + і вказуємо потрібні id TV і шаблонів для синхронізації через кому, +* 13. Системні події для плагіна OnPageNotFound, OnDocFormSave, OnBeforeEmptyTrash, OnEmptyTrash, OnWebPageInit,OnDocDuplicate +* 15. Створюємо новий модуль evoBabelLexicon і поміщаємо в нього код з відповідного файлу в папці install +* 16. На вкладці конфігурація в режимі редагування модуля відзначаємо галочку "Включити загальні параметри" +* 17. У рядок "конфігурація модуля" на тій же вкладці "конфігурація вставляємо +``` +&lang_template_id=id шаблона мови;text; &rel_tv_id=id TV мовних зв'язківй;text; &currlang=мова за замовчуванням;text;ru &show_panel=показувати панель;text;1 &publish=Опублікувати (0 -ні, 1 - так);text;0 +``` +і вносимо в з'явилося поле потрібний нам id шаблону мови, id TV для зберігання мовних зв'язків і назва мови за замовчуванням згідно АЛІАС кореневої папки +* 18. Зберігаємо модуль і знову відкриваємо на редагування. Після чого переходимо на вкладку "Залежності" і відкриваємо посилання "Управління залежностями". На сторінці, додаємо до залежностей плагін evoBabel і сніпети evoBabel, lang. +* 19. Знову повертаємося до редагування створених фрагментів evoBabel, lang і плагіна evoBabel. На вкладці "Властивості" в випадаючому списку "Імпортувати загальні параметри модуля" вибираємо назву нашого модуля. +* 20. Створюємо плагін evoBabelPlaceholder (подія OnParseDocument) і поміщаємо в нього код з папки install для відповідного плагіна +(Даний плагін використовується для встановлення мовних плейсхолдерів [%плейсхолдер%] замість запуску сніпета lang і необов'язковий + +Налаштування адмінки завершена. Тепер в кожному ресурсі ми повинні отримати в панелі "Мовні версії" назва поточної мови і список доступних мов. +Якщо переклад вже створено - то буде кнопка "перейти", якщо ще немає - кнопка "створити". + +### Використання на сайті - тут взагалі все просто +--------- +* 1. У потрібному місці шаблону розміщуємо плейсхолдери [+activeLang+] - для окремого виведення поточної мови і [+switchLang+] - для виведення перемикача мов +* 2. Сами переводы в шаблонах и чанках получаем с помощью сніпета lang +//використання в шаблонах чанка і т.п. +// [[lang? &a=`Головна сторінка`]] - виведе переклад слів Головна сторінка для поточної мови з його чанка +// використання в сніпетах +// [[DocLister? &parents=`[[lang? &a=`Папка каталог`]]` ...інші параметри ..]] +// якщо ви встановили плагін evoBabelPlaceholder то замість виклику [[lang? &a=`Головна сторінка`]] можна використовувати мовної плейсхолдер [%Головна сторінка%] + + +### Приклад роботи +--------- +Приклад роботи + +### Попередження і обмеження: +--------- +* 1. Модуль поставляється "як є", перед установкою вивчіть інструкцію і зробіть дамп бази сайту +* 2. При запуску модуля створюється нова таблиця "префікс_lexicon" в базі даних. +* 3. Застаріло. Актуально для версії 0.1 Поле description ресурсу використовується для зберігання мовних зв'язків. Якщо ви використовуєте дане поле для інших цілей - попередньо необхідно винести інформацію з нього в інше поле або в TV параметр + +### Важливо: +--------- +якщо у вас на сторінці на головній вкладці тільки один tv-параметр і це параметр зміни мов, то через особливості modx єдиний +tv з типом введення custom input не відображається. +Для вирішення даної проблеми просто створіть ще один довільний tv наприклад з ім'ям okLang і типом текст, а потім приховайте його +через managermanager просто прописавши правило mm_hideFields ('okLang', '', ''); в чанка правил mm_rules diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" new file mode 100644 index 00000000..64d911db --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/01_\320\236\320\277\320\265\321\200\320\260\321\202\320\276\321\200\320\270.md" @@ -0,0 +1,18 @@ + + +

    if: Оператори

    +Оператор сніпета if для виведення інформації за умовою. +
    +

    is, = - дорівнює

    +

    not, != - не дорівнює

    +

    >, gt - більше

    +

    <, lt - менше

    +

    >=, gte - більше або дорівнює

    +

    lte, <= - менше або дорівнює

    +

    isempty, empty - перевірка на порожнечу

    +

    not_empty, !empty - перевірка на заповненість

    +

    null, is_null - перевірка, чи є значення змінної рівним NULL

    +

    in_array, inarray, in - наявність в масиві

    +

    not_in, !in - відсутність в масиві

    +

    contains - наявність в рядку

    +

    not_contains, !contains - відсутність в рядку

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..ee7d28b1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,82 @@ + + +

    if: Параметри

    +Параметри сніппета if для виведення інформації за умовою. +
    +
    +
    + +
    +
    +Формат: що порівнюємо: як порівнюємо: з чим порівнюємо
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &is=`[*parent*]:=:5`
    +
    +
    +
    + +
    + +
    +
    +Формат: @tpl:chunkname або будь-який html-код з тегами MODX
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &then=`@TPL:akcia`
    +
    +
    +
    + +
    + +
    +
    +Формат: @tpl:chunkname або будь-який html-код з тегами MODX
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &else=`@TPL:akcia`
    +
    +
    +
    + +
    + +
    +
    +Формат: on
    +Значення за замовчуванням: нет
    +Примітка:
    +

    Приклад:

    +
    &math=`on`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: :
    +Примітка:
    +

    Приклад:

    +
    &separator=`~`
    +
    +
    +
    + +
    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..65e065d5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/03_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" @@ -0,0 +1,24 @@ + + +

    if: Приклади

    +Приклади сніпета if для виведення інформації за умовою. +
    +
    Для роботи з зовнішніми плейсхолдерами (наприклад: [+pages+] в Ditto) – викликайте сніппет некешованим: [!if? &is… !]
    +

    1) Виводити акцію потрібно тільки в каталозі с ID = 5

    +
    [[if? &is=`[*parent*]:=:5` &then=`@TPL:akcia`]]
    +

    2) Виводити акцію потрібно тільки в каталозі з ID = 5 або в каталозі з шаблоном №7,8,9

    +
    [[if? &is=`[*parent*]:=:5:or:[*template*]:in:7,8,9` &then=`@TPL:akcia`]]
    +

    3) Виводити акцію потрібно тільки в каталозі з ID = 5 і тільки в ресурсі з шаблоном №2

    +
    [[if? &is=`[*parent*]:=:5:and:[*template*]:=:2` &then=`@TPL:akcia`]]
    +

    4) Виводити акцію потрібно тільки в каталозі з ID = 5 і тільки в ресурсі з шаблоном №2 або в інших шаблонах але з ТВ show_akcia = 1

    +
    [[if? &is=`[*parent*]:=:5:and:[*template*]:=:2:or:[*show_akcia*]:=1` &then=`@TPL:akcia`]]
    +

    5) Виводити акцію тільки для товарів з ціною в діапазоні >300$ <=700$

    +
    [[if? &is=`[*price*]:>:300:and:[*price*]:<=:700` &then=`@TPL:akcia`]]
    +

    6) Виводити при кратності запису Ditto 3

    +
    [[if? &is=`[+ditto_iteration+]+1:%:3` &then=`true` &else=`false` &math=`on`]]
    +[[if? &is=`[+ditto_index+]+1:%:3` &then=`true` &else=`false`]]
    +

    7) Виводити при кратності запису Ditto 3 але з множенням значення

    +
    [[if? &is=`[+ditto_iteration+]*2:%:3` &then=`true` &else=`false` &math=`on`]]
    +

    8) Виводити значення математичного виразу

    +
    [[if? &is=`[+ditto_iteration+]*2` &math=`on`]]
    +

    Логіка роботи: якщо умова is виконується, то виводимо вміст параметра then, якщо не виконується, то виводимо вміст параметра else.

    \ No newline at end of file diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/index.md" new file mode 100644 index 00000000..ed2eeccb --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/if/index.md" @@ -0,0 +1,104 @@ +# if + +### Сніпет виводить інформації за умовою + +#### Як працює? + +Якщо при виклику `if` умова в параметрі `is` виконується, то виведеться вміст параметра `then`, якщо ні - вміст параметра `else`. + +Якщо необхідно нічого не виводити через `then` або `else`, то можна зовсім не задавати цей параметр. + +#### Некешований виклик + +При роботі з зовнішніми плейсхолдерами необхідно викликати сніппет некешованим. + +А зовнішній плейсхолдер це, наприклад, `[+pages+]` з **Ditto**. + +#### Приклад виклику + +``` +// приклад виклику кешованого... +[[if? &is=`[*parent*]:=:5` &then=`true` &else=`false`]] + +// і некешованого if +[!if? &is=`[*parent*]:=:5` &then=`true` &else=`false`!] +``` + + +### Параметри сніппета + +Параметр|Опис|Можливі значення|По-замовчуванню +--------|--------|------------------|------------ +**is**|Оброблювана умова|що порівнюємо: як порівнюємо: з чим порівнюємо|Пусто +**then**|Вміст для виведення, якщо умова вірна|`@tpl:chunkname` або будь-який html-код з тегами MODX|Пусто +**else**|Вміст для виведення, якщо умова не вірна|`@tpl:chunkname` або будь-який html-код з тегами MODX|Пусто +**math**|Включає виконання математичних функцій в параметрі `is`|on|Пусто +**separator**|Роздільник в умові|Наприклад, `~`| `:` + +Для того щоб парсер не обробляв варіант і `then` і `else`, як це робить **PHx**, викликайте: `&then='@TPL:chunkname'` — де `chunkname` - ім'я чанка. + +У цьому випадку буде виконаний тільки результуючий чанк. + +*** + +### Оператори використовувані в умові + +**is, =** - дорівнює + +**not, !=** - не дорівнює + +**>, gt** - більше + +**<, lt** - менше + +**>=, gte** - більше або дорівнює + +**lte, <=** - менше або дорівнює + +**isempty, empty** - перевірка на порожнечу + +**not_empty, !empty** - перевірка на заповненість + +**null, is_null** - перевірка, чи є значення змінної рівним NULL + +**in_array, inarray, in** - наявність в масиві + +**not_in, !in** - відсутність в масиві + +**contains** - наявність в рядку + +**not_contains, !contains** - відсутність в рядку + +*** + +### Виконання математичних функцій: + + is=`[+id+]*10:=:30` + + +### Приклади використання + + 1) Виводити акцію потрібно тільки в каталозі з ID = 5 + [[if? &is=`[*parent*]:=:5` &then=`@TPL:akcia`]] + + 2) Виводити акцію потрібно тільки в каталозі з ID = 5 або в каталозі з шаблоном №7,8,9 + [[if? &is=`[*parent*]:=:5:or:[*template*]:in:7,8,9` &then=`@TPL:akcia`]] + + 3) Виводити акцію потрібно тільки в каталозі з ID = 5 і тільки в ресурсі з шаблоном №2 + [[if? &is=`[*parent*]:=:5:and:[*template*]:=:2` &then=`@TPL:akcia`]] + + 4) Виводити акцію потрібно тільки в каталозі з ID = 5 і тільки в ресурсі з шаблоном №2 або в інших шаблонах але з ТВ show_akcia = 1 + [[if? &is=`[*parent*]:=:5:and:[*template*]:=:2:or:[*show_akcia*]:=1` &then=`@TPL:akcia`]] + + 5) Виводити акцію тільки для товарів з ціною в діапазоні >300$ <=700$ + [[if? &is=`[*price*]:>:300:and:[*price*]:<=:700` &then=`@TPL:akcia`]] + + 6) Виводити при кратності запису Ditto 3 + [[if? &is=`[+ditto_iteration+]+1:%:3` &then=`true` &else=`false`]] + [[if? &is=`[+ditto_index+]+1:%:3` &then=`true` &else=`false`]] + + 7) Виводити при кратності запису Ditto 3 але з множенням значення + [[if? &is=`[+ditto_iteration+]*2:%:3` &then=`true` &else=`false` &math=`on`]] + + 8) Виводити значення математичного виразу + [[if? &is=`[+ditto_iteration+]*2` &math=`on`]] diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/imageCaptor/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/imageCaptor/index.md" new file mode 100644 index 00000000..a6bbdf3d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/imageCaptor/index.md" @@ -0,0 +1,95 @@ + + +

    Плагін для Modx Evo який копіює фотографії зі сторонніх сайтів

    +Невеликий плагін для Modx Evo який дозволяє автоматично при збереженні ресурсу копіювати фотографії зі сторонніх сайтів. +

    Кожному веб-майстру доводилося коли-небудь забирати контент з чужих сайтів звичайним копіпастом. І якщо з текстом проблем немає, то, ось, коли там присутні фотографії доводиться витрачати наш безцінний час на непотрібні дії. Спочатку ми по кожній фотографії натискаємо правою кнопочкою, зберігаємо в окрему папочку картинку, потім заливаємо на сервер, а потім для кожної картинки прописуємо новий шлях. Це може і не так складно якщо ми копіюємо 1-2 фотографії. А якщо ми маємо справу з сотнею сторінок де на кожній по десяток фотографій? Можна звичайно не морочитися, і залишити посилання на сторонні сайти, але це вже зовсім поганий тон.

    +

    Олексій Лібер написав невеликий плагін для Modx Evo який дозволяє автоматично при збереженні ресурсу копіювати фотографії зі сторонніх сайтів до себе на сервер і відповідно перезаписувати до них шляхи.

    +

    Створюємо плагін з назвою наприклад: imageCaptor.

    +

    Системні події: OnDocFormSave

    +
    +/*
    +Captor 1.0a - Забираємо автоматом контент з чужих сайтів
    +Подія в плагінах - OnBeforeDocFormSave
    +*/
    +
    +if(!defined('MODX_BASE_PATH')){die('Ти хто такий? Давай, до побачення!');}
    +global $tmplvars,$content;
    +define('ROOT', $modx->config['base_path']);
    +define('EX', 'jpg,png,gif,jpeg,doc,xls,zip,pdf'); // Через кому імена розширень (нижній регістр)
    +$folder=isset($folder) ? $folder : "assets/images/captor/"; // папка призначення стиреного контенту
    +if(!is_dir(MODX_BASE_PATH.$folder)) mkdir(MODX_BASE_PATH.$folder);
    +// функція трасліта
    +function rus2translit($string) {
    +    $converter = array(
    +        'а' => 'a',   'б' => 'b',   'в' => 'v',
    +        'г' => 'g',   'д' => 'd',   'е' => 'e',
    +        'ё' => 'e',   'ж' => 'zh',  'з' => 'z',
    +        'и' => 'i',   'й' => 'y',   'к' => 'k',
    +        'л' => 'l',   'м' => 'm',   'н' => 'n',
    +        'о' => 'o',   'п' => 'p',   'р' => 'r',
    +        'с' => 's',   'т' => 't',   'у' => 'u',
    +        'ф' => 'f',   'х' => 'h',   'ц' => 'c',
    +        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
    +        'ь' => '\'',  'ы' => 'y',   'ъ' => '\'',
    +        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
    +        
    +        'А' => 'A',   'Б' => 'B',   'В' => 'V',
    +        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
    +        'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',
    +        'И' => 'I',   'Й' => 'Y',   'К' => 'K',
    +        'Л' => 'L',   'М' => 'M',   'Н' => 'N',
    +        'О' => 'O',   'П' => 'P',   'Р' => 'R',
    +        'С' => 'S',   'Т' => 'T',   'У' => 'U',
    +        'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',
    +        'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',
    +        'Ь' => '\'',  'Ы' => 'Y',   'Ъ' => '\'',
    +        'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',
    +    );
    +    return strtr($string, $converter);
    +}
    +function str2url($str) {
    +    // переводимо в трансліт
    +    $str = rus2translit($str);
    +    // в нижній регістр
    +    $str = strtolower($str);
    +    // заміням все непотрібне нам на "-"
    +    $str = preg_replace('~[^-a-z0-9_]+~u', '-', $str);
    +    // видаляємо початкові і кінцеві '-'
    +    $str = trim($str, "-");
    +    return $str;
    +}
    +function clearUrl ($url){
    +	$pieces = explode("#", $url);
    +	$url=$pieces[0];
    +	$pieces = explode("?", $url);
    +	$url=$pieces[0];
    +	return end(explode(".", $url));		 
    +}
    +
    +
    +function captor($value,$folder){
    +	//Заповітна регулярка
    +	preg_match_all('#(? $val){
    +	if ($val[1]) $tmplvars[$key][1] = captor($val[1],$folder);
    +}
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" new file mode 100644 index 00000000..35558272 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/01_\320\236\321\201\320\276\320\261\320\273\320\270\320\262\320\276\321\201\321\202\321\226.md" @@ -0,0 +1,19 @@ + + +

    multiTV: Особливості

    +Пакет містить три основні частини для користувача змінна Сніпет для відображення значення Модуль редагування вмісту. +
    +

    multiTV являє собою пакет для MODX Evolution, призначений для управління контентом.

    +

    Цей пакет додає новий тип змінної шаблону (TV-параметра), що складається з мульти-елементів.

    +

    Пакет містить три основні частини

    +
      +
    • Для користувача змінна для відображення і редагування мульти-елементів - списоків або datatable
    • +
    • Сніпет для відображення значення змінної шаблону
    • +
    • Модуль редагування вмісту користувальницьких таблиць бази даних
    • +
    +

    а також деякі доповнення

    +
      +
    • Модифікатор PHx
    • +
    • Екстендер Ditto multiTvFilter
    • +
    • Сніпет для старих установок, щоб оновити вміст змінних шаблону в новий формат, введений з версії 1.4.11.
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/02_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/02_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..fe70a3fd --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/02_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,34 @@ + + +

    multiTV: Встановлення

    +Є дві можливості встановити multiTV в MODX Evo Використовуйте Менеджер Пакетів Або встановіть вручну. +
    +

    Є дві можливості встановити multiTV в MODX Evolution

    +
      +
    • Використовуйте Менеджер Пакетів и встановіть останній пакет multiTV
    • +
    • Або встановіть вручну: +
        +
      1. Загрузіть папку assets/tvs/multitv в відповідну папку у вашій установці.
      2. +
      3. Створіть новий шаблон і змінну з типом введення custom input (якщо ім'я цієї змінної буде multidemo то буде використовуватися файл конфігурації multidemo)
      4. +
      5. Вставте цей код в можливі значення @INCLUDE/assets/tvs/multitv/multitv.customtv.php
      6. +
      7. Створіть новий сніпет з назвою multiTV і помістіть в нього наступний код:
        <?php return include(MODX_BASE_PATH.'assets/tvs/multitv/multitv.snippet.php'); ?>
      8. +
      +
    • +
    +

    Сумісність

    +
      +
    1. Якщо ви хочете використовувати multiTV з ManagerManager до версії MODX 1.0.9 ви повинні виправити файл mm.inc.php и вставити case 'custom_tv': в 136 рядку перед рядком $t = 'textarea';
    2. +
    3. Якщо ви хочете використовувати multiTV з YAMS, ви повинні виправити yams.plugin.inc.php згідно з цією інструкції.
    4. +
    5. Якщо ви оновлюєте 1.4.10 і нижче можна встановити сніпет updateTV і змінити дані в вашій змінній multiTV в новий формат. Це необхідно, якщо ви хочете додати / видалити стовпці в multiTV або якщо ви хочете відсортувати результати за стовпцем.
    6. +
    7. Якщо ви хочете використовувати PHx з multiTV необхідно трохи змінити код плагіна PHx:
    8. +
    +
    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;
    +}
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/03_\320\227\320\274\321\226\320\275\320\275\321\226 \321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/03_\320\227\320\274\321\226\320\275\320\275\321\226 \321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" new file mode 100644 index 00000000..918c2f3a --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/03_\320\227\320\274\321\226\320\275\320\275\321\226 \321\210\320\260\320\261\320\273\320\276\320\275\321\203.md" @@ -0,0 +1,201 @@ + + +

    multiTV: Змінні шаблону

    +

    Всі параметри задаються в файлі конфігурації в папці 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, доданий thumb для відображення ескізів зображень)text
    elementsДля введення можливих значень змінної, наприклад, для списку всіх дочірніх документів кореневої папки сайту: @SELECT `pagetitle`, `id` FROM `modx_site_content` WHERE parent = 0 ORDER BY `menuindex` ASC-
    defaultЗначення за замовчуванням. Це значення може містити обчислення. Може містити два плейсхолдера: [+i+] - автоматично збільшується індекс, [+alias+] - псевдонім редагованого документа.-
    thumbofІм'я змінної для мініатюри зображення. Мініатюра буде відображена в цій області.-
    widthШирина поля введення (тільки якщо тип відображення полів horizontal)100
    +
    +

    Підтримувані типи полів: text, rawtext, email, number, textareamini, textarea, rawtextarea, htmlarea, richtext(спрацьовує тільки при display vertical), date, dropdown, listbox, listbox-multiple, checkbox, option, image, file, color

    +

    Параметр columns

    +

    У режимах datatable і dbtable можуть бути визначені як ключ параметри columns. Цей ключ містить масив параметрів стовпців. Кожен стовпець містить масив властивостей. Якщо властивість не задано, в ролі ключа використовується fields.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    fieldname(обов'язковий параметр) Ім'я властивості-
    captionЗаголовок стовбцяcaption параметра fields
    widthШирина стовбцяwidth параметра fields
    renderEnable rengering of the column content with this PHx capable strin-
    sortableВключити сортування по цій колонці, натиснувши на Заголовок стовпця в datatable або dbtable режимі. Активно тільки при відключеному сортуванні в інших опціяхtrue
    +
    +

    Редагування шарів

    +

    В режимах datatable і dbtable редагування вмісту шару може бути визначено в ключі form. Цей ключ містить масив параметрів вкладки form.

    +
    + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    caption(обов'язковий параметр) Заголовок вкладки form-
    content(обов'язковий параметр) Асоціативний масив параметрів полівcaption параметра fields
    +
    +

    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Заголовок для inputcaption параметра fields
    +
    +

    Шаблони за замовчуванням

    +

    Шаблони для сніпета multiTV використанні за замовчуванням, можуть бути визначені в параметрі templates

    +
    + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    rowTplШаблон виведення рядка. Може бути змінений у виклику сніпета-
    outerTplШаблон виведення зовнішнього блоку. Може бути змінений у виклику сніпета-
    +
    +

    Інші опції

    +

    Інші опції можуть бути визначені в параметрі configuration

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    enablePastemultiTV може містити посилання для вставки даних. У цьому вікні ви могли б вставити Word / HTML таблиці даних з буфера обміну, Google Docs таблиці і дані в форматі csv.true
    enableClearПосилання на видалення всіх елементів multiTVtrue
    csvseparatorРоздільник стовпчиків при вставці даних csv. Кожен рядок повинен починатися з нового рядка.,
    radioTabsTabs 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 режимі.,
    prepareФункція для обробки даних перед виведенням (викликається для кожного елемента списку)-
    prepareWrapФункція для обробки даних перед виведенням обгортки-
    +
    +

    Дивіться файл конфігурації для TV-параметра multidemo для всіх використовуваних вертикальних налаштувань і multicontent для всіх використовуваних datatable налаштувань.

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/04_\320\241\320\275\321\226\320\277\320\265\321\202.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/04_\320\241\320\275\321\226\320\277\320\265\321\202.md" new file mode 100644 index 00000000..363f85e1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/04_\320\241\320\275\321\226\320\277\320\265\321\202.md" @@ -0,0 +1,485 @@ + + +

    multiTV: Сніпет

    +Параметри і приклади використання сніпета multiTV. +
    +

    Сніпет multiTV відображає вміст змінної multiTV. Додайте приблизно такий виклик сніпета. Параметр &tvName обов'язковий. Інші параметри в разі якщо використовуються значення за замовчуванням, можуть бути видалені.

    +
    [!multiTV?
    +&tvName=`yourMultiTVname`
    +&docid=`[*id*]`
    +&tplConfig=``
    +&outerTpl=`@CODE:<ul>((wrapper))</ul>`
    +&rowTpl=`@CODE:<li>((event)), ((location)), ((price))</li>`
    +&display=`5`
    +&offset=`0`
    +&rows=`all`
    +&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=``
    +!]
    +

    Параметри

    +

    За замовчуванням шаблони для зовнішнього блоку і рядки можуть бути визначені в файлі конфігурації. Ці шаблони можуть бути перезаписані параметрами rowTpl і outerTpl у виклику сніпета.

    +
    +
    + +
    +
    +Формат: TV-параметр
    +Значення за замовчуванням: пусто
    +Примітка: Обов'язковий параметр. Імена стовпців multiTV будуть отримані з конфігураційного файлу
    +Приклад: +
    &tvName=`yourMultiTVname`
    +
    +
    +
    +
    + +
    +
    +Формат: id документа
    +Значення за замовчуванням: Id поточного документа
    +Примітка: Необхідний при виклику в шаблоні Ditto.
    +Приклад: +
    &docid=``
    +
    +
    +
    + + + + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: немає
    +Примітка: Буде з префіксом templates
    +Приклад: +
    &tplConfig=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: @CODE:
    +Примітка: Ім'я чанка, ім'я файлу (має починатися з @FILE) або код (повинно починатися з @CODE - плейсхолдери повинні бути в подвійних дужках ((і)). (Примітка 3)
    +Приклад: +
    &outerTpl=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: @CODE:
    +Примітка: Ім'я чанка, ім'я файлу (має починатися з @FILE) або код (повинно починатися з @CODE - плейсхолдери повинні бути в подвійних дужках ((і)). (Примітка 3)
    +Приклад: +
    &rowTpl=``
    +
    +
    +
    +
    + +
    +
    +Формат: число | all
    +Значення за замовчуванням: 5
    +Приміка: all - показати всі
    +Приклад: +
    &display=`all`
    +
    +
    +
    +
    + +
    +
    +Формат: число
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &offset=`5`
    +
    +
    +
    +
    + +
    +
    +Формат: число | all
    +Значення за замовчуванням: all
    +Примітка:
    +Приклад: +
    &rows=`1,2`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Відключає параметри reverse і orderBy
    +Приклад: +
    &randomize=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка: Відключає orderBy параметр
    +Приклад: +
    &reverse=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: name:type direction
    +Значення за замовчуванням: name:text asc
    +Примітка: Тип може бути text або date
    +Приклад: +
    &orderBy=``
    +
    +
    +
    +
    + +
    +
    +Формат: имя плейсхолдера
    +Значення за замовчуванням: немає
    +Примітка: Буде створено плейсхолдер з ім'ям, зазначеним в значенні параметра [+element+]. Окремі елементи виводяться плейсхолдерами, де до імені додається номер рядка [+element.1+]. Нормальний висновок сніпета пригнічується.
    +Приклад: +
    &toPlaceholder=`myPlaceholder`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &toJson=`1`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1 | 2
    +Значення за замовчуванням: 1
    +Примітка: відображати тільки multiTV з опублікованих (1), неопублікованих (0) або будь-яких (2) документів
    +Приклад: +
    &published=`2`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +Приклад: +
    &emptyOutput=`0`
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я чанка | @FILE | @CODE
    +Значення за замовчуванням: немає
    +Примітка:
    +Приклад: +
    &noResults=`noResults`
    +
    +
    +
    +
    + +
    +
    +Формат: строка
    +Значення за замовчуванням: пусто
    +Примітка:
    +Приклад: +
    &outputSeparator=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я класу
    +Значення за замовчуванням: first
    +Примітка: Вміст плейсхолдера row.class для першого елемента
    +Приклад: +
    &firstClass=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я класу
    +Значення за замовчуванням: last
    +Примітка: Вміст плейсхолдера row.class у останнього елемента
    +Приклад: +
    &lastClass=``
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я класу
    +Значення за замовчуванням: немає
    +Примітка: Вміст плейсхолдера row.class для парних елементів
    +Приклад: +
    &evenClass=`even`
    +
    +
    +
    +
    + +
    +
    +Формат: ім'я класу
    +Значення за замовчуванням: немає
    +Приміка: Вміст плейсхолдера row.class для непарних елементів
    +Приклад: +
    &oddClass=`odd`
    +
    +
    +
    +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &paginate=`1`
    +
    +
    +
    +
    + +
    +
    +Формат:
    +Значення за замовчуванням: page
    +Примітка:
    +Приклад: +
    &offsetKey=``
    +
    +
    +
    + +
    + +
    +
    +Формат: &where=``
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &where=`{"title":"Lorem ipsum"}`
    +
    +
    +
    + +
    + +
    +
    +Формат: &prepare=``
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &prepare=`prepareRow,prepareRowAgain`
    +
    +
    +
    + +
    + +
    +
    +Формат: &prepareWrap=``
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &prepareWrap=`prepareRow,prepareRowAgain`
    +
    +
    +
    + + +
    +

    Плейсхолдери 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містить посторінкове розбиття, якщо параметр включений
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" new file mode 100644 index 00000000..544e8cd0 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/05_\320\234\320\276\320\264\321\203\320\273\321\214.md" @@ -0,0 +1,259 @@ + + +

    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
    renderRender вмісту стовпця з підтримкою PHx-
    +
    +

    Редагування шарів

    +

    Вміст редагованого шару під час додавання / редагування одного рядка може бути визначено в ключі form. Цей ключ містить масив параметрів вкладки form.

    +
    + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    caption(обов'язковий параметр) Заголовок вкладки form-
    content(обов'язковий параметр) Асоціативний масив параметрів полів-
    +
    +

    Кожен параметр вкладки форми містить асоціативний масив властивостей поля (ключ містить ім'я поля в fields ). Якщо властивість поля не встановлено, використовується властивість поля в fields .

    +
    + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    captionЗаголовок для введенняЗаголовок для fields
    +
    +

    Кнопки

    +

    Кнопки для модуля Database Manager можуть бути визначені в ключі buttons. Цей ключ містить асоціативний масив конфігурації кнопок.

    +
    + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    position(обов'язковий параметр) Положення кнопок (може бути topleft, topright, bottomleft or bottom right)-
    buttons(обов'язковий параметр) Асоціативний масив конфігурації кнопок-
    +
    +

    Кожна конфігурація кнопок містить асоціативний масив параметрів кнопок.

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDescriptionDefault
    captionтекст на кнопці-
    iconіконка для кнопки, розташована в assets/tvs/multitv/css/images-
    processorім'я обробника файлу assets/tvs/multitv/processors/[key] (key contains the group config key)-
    formМасив параметрів вкладки form (див. редагування шарів)-
    +
    +

    Приклад генерації кнопки.

    +
    +"buttons": {
    +	"coupons": {
    +		"position": "topright",
    +		"buttons": {
    +			"generate": {
    +				"caption": "Generate",
    +				"icon": "wand.png",
    +				"processor": "generate",
    +				"form": [{
    +						"caption": "Coupon",
    +						"content": {
    +							"count": {},
    +							"discount": {},
    +							"validuser": {},
    +							"validgroup": {},
    +							"validuntil": {},
    +							"maxuse": {}
    +						}
    +					}
    +				]
    +			}
    +		}
    +	}
    +},
    +
    +

    Інші опції

    +

    Інші опції можуть бути визначені в ключі configuration.

    +
    + + + + + + + + + + + + + + + + + + + + + +
    ВластивістьОписЗначення за замовчуванням
    radioTabsВкладки у вигляді radio buttons. Стан кнопки зберігається в стовпці fieldTab кожного рядка таблиці (цей стовпець повинен існувати).false
    sortingСортування по колонках таблиціfalse
    sortindexІм'я стовпця, яке використовується в якості індексу сортування. Тип стовпця повинен бути цілочисельним, і він повинен містити автоінкрементний індекс (см. поля) в якості значення за замовчуванням.false
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/06_\320\224\320\276\320\264\320\260\321\202\320\272\320\276\320\262\320\276.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/06_\320\224\320\276\320\264\320\260\321\202\320\272\320\276\320\262\320\276.md" new file mode 100644 index 00000000..055d5891 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/06_\320\224\320\276\320\264\320\260\321\202\320\272\320\276\320\262\320\276.md" @@ -0,0 +1,176 @@ + + +

    multiTV: Додатково

    +Застосування multiTV в Ditto multiTvFilter екстендер Ditto PHx модифікатори. +
    +

    PHx модифікатор

    +

    Так як рядок JSON в multiTV починається з [[ і закінчується ]] (Примітка 1), ви не можете перевірити multiTV на порожнечу, тобто. [*multittvname:ne=``:then=`not empty`*].

    +

    Але ви могли б використовувати в цьому випадку PHx модифікатори з папки phx-modifier. Перемістіть два файли з цієї папки в assets/plugins/phx/modifiers.

    +

    Приклад використання:

    +
    [+phx:multitvisempty=`tvname|docid`:then=`xxx`:else=`yyy`+]
    +
    [+phx:multitvisnotempty=`tvname|docid`:then=`xxx`:else=`yyy`+]
    +

    Якщо docid не встановлено, за замовчуванням використовується поточний документ.

    +

    multiTvFilter екстендер Ditto

    +

    Для фільтрації рядків, що відображаються Ditto скористайтеся екстендером multiTvFilter.

    +
    + + + + + + + + + + + + + + +
    ПараметрОпис
    multiTvFilterBy(обов'язковий параметр) ім'я змінної multiTV
    multiTvFilterOptionsjson-масив параметрів фільтра
    +
    +

    Можуть бути використані наступні параметри фільтра

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОпис
    nameім'я поля multiTV, яке використовується для фільтрації
    typeтип вмісту поля multiTV (можливі варіанти: date, text)
    valueЗначення поля multiTV для фільтрації
    modeрежим фільтрації вмісту поля multiTV
    conjunctionЛогічний зв'язок з попереднім фільтром (AND/OR)
    +
    +

    Наступні режими можуть бути використані для поля типу text:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Тип порівнянняОпис
    containsфільтрувати, якщо хоча б одне поле містить текст критерію
    allcontainsфільтрувати, якщо всі поля містять текст критерію
    containsnotфільтрувати, якщо одне з полів не містить текст критерію
    allcontainsnotфільтрувати, якщо всі поля не містять текст критерію
    isфільтрувати якщо одне поле відповідає критерію
    allisфільтрувати якщо всі поля відповідають критерію
    isnotфільтрувати, якщо одне з полів не відповідає критерію
    allisnotфільтрувати, якщо всі поля не відповідають критерію
    +
    +

    Наступні режими можуть бути використані для поля типу date:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Тип порівнянняОпис
    beforeфільтрувати, якщо одне поле менше критерію
    beforeallфільтрувати, якщо всі поля менше критерію
    equalфільтрувати, якщо одне поле дорівнює критерію
    equalallфільтрувати, якщо всі поля рівні критерію
    afterфільтрувати, якщо одне поле більше критерію
    afterallфільтрувати, якщо всі поля більші критерію
    +
    +

    Приклади

    +

    Показати всі дочірні документи контейнерів 3, 4 і 5, у яких змінна шаблона multiTV event в стовпці title не містить Important

    +
    [[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"}]`
    +]]
    +

    Якщо ви хочете фільтрувати за кількома значеннями multiTV, додайте ще один масив в multiTvFilterOptions. У цьому прикладі відобразяться всі дочірні документи контейнерів 3, 4, і 5 у яких змінна шаблону multiTV event в стовпці title не містить Importantі всі стовпці location відповідають Outdoor.

    +
    [[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"}]`
    +]]
    +
    +

    Оновлення на новий формат даних

    +

    Версия 1.4.11 multiTV використовує новий формат даних (імена стовпців зберігаються у вигляді ключ - значення). Змінна і сніпет підтримують старий і новий формати, так що вам не доведеться оновлювати multiTVs. Але вам це потрібно, якщо ви захочете додати / видалити стовпці в multiTVs. Викличте сніпет в документі MODX наступним чином:

    +
    [!updateTV? &tvNames=`yourMultiTVname1,yourMultiTVname2`!]
    +

    Параметры

    +
    + + + + + + + + + + + +
    ПараметрОписЗначення за замовчуванням
    tvNames(обов'язково) розділений комами список імен змінних, які містять дані multiTV-
    +
    +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/07_\320\236\320\261\321\200\320\276\320\261\320\272\320\260_\320\264\320\260\320\275\320\270\321\205_\320\277\320\265\321\200\320\265\320\264_\320\262\320\270\320\272\320\273\320\270\320\272\320\276\320\274.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/07_\320\236\320\261\321\200\320\276\320\261\320\272\320\260_\320\264\320\260\320\275\320\270\321\205_\320\277\320\265\321\200\320\265\320\264_\320\262\320\270\320\272\320\273\320\270\320\272\320\276\320\274.md" new file mode 100644 index 00000000..77306232 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/07_\320\236\320\261\321\200\320\276\320\261\320\272\320\260_\320\264\320\260\320\275\320\270\321\205_\320\277\320\265\321\200\320\265\320\264_\320\262\320\270\320\272\320\273\320\270\320\272\320\276\320\274.md" @@ -0,0 +1,88 @@ +Часто виникає необхідність додаткової обробки даних перед виведенням. Для цього доступні prepare і prepareWrap - як настройки в файлі конфігурації або як параметри сніпета. + +Як значення можна вказати ім'я сніпета, ім'я функції (в файлі конфігурації також доступна можливість вказати функцію-замикання), або їх список, розділений комами, або їх масив. + +Параметри функції / сніпета наступні: + + + + + + +
    ПараметрОпис
    $dataПоточні значення
    $modxЕкземпляр класу DocumentParser
    $_multiTVЕкземпляр класу multiTV, для роботи з методами сховища
    + +Функція / сніпет завжди повинні повертати значення, навіть якщо вони не змінювалися. + +Приклади: + +```php +// в файлі конфигурації: +function prepareRowsFunction($data, $modx, $_multiTV) { + return $data; +} + +$settings['prepare'] = 'prepareRowsSnippet'; +// або +$settings['prepare'] = function($data, $modx, $_multiTV) { + return $data; +}; +// або +$settings['prepare'] = 'prepareRowsSnippet,prepareRowsFunction'; +// або +$settings['prepare'] = ['prepareRowsSnippet', 'prepareRowsFunction']; +// або +$settings['prepare'] = ['prepareRowsSnippet', function($data, $modx, $_multiTV) { + return $data; +}]; +``` + +``` +// в шаблоні +[[multiTV? &tvName=`test` &prepare=`prepareRowsSnippet,prepareRowsFunction`]] +``` + +Значення параметра `$data` функції prepare, крім значень полів, зазначених в конігураціі змінної, будуть наступними: + + + + + +
    КлючОпис
    docidІдентифікатор поточного документа
    iterationНомер поточної ітерації (починається з 1)
    rowrow.number: Номер поточної ітерації (починається з 1) + +row.total: Загальна кількість елементів
    + +Значення параметра `$data` для prepareWrap: + + + + + +
    КлючОпис
    docidІдентифікатор поточного документа
    wrapperМасив виведених елементів
    rowsrows.offset: Кількість пропущених елементів + +rows.total: Загальна кількість елементів
    + +Приклади: + +```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/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/index.md" new file mode 100644 index 00000000..c95fa91f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/multiTV/index.md" @@ -0,0 +1,4 @@ + + +

    multiTV Призначена для користувача змінна шаблону

    +Цей пакет додає новий тип змінної шаблону TV-параметра, що складається з мульти-елементів. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/optimizeJPG/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/optimizeJPG/index.md" new file mode 100644 index 00000000..0823cae5 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/optimizeJPG/index.md" @@ -0,0 +1,28 @@ + + +

    Плагін Оптимізації jpg зображень Modx Evo

    +Плагін Оптимізації jpg зображень. +

    Гугл сервіс PageSpeed Insights рекомендує «проводити базову і розширену оптимізацію всіх зображень… При розширеній оптимізації проводиться сжимання файлів JPEG і PNG (без втрат).»

    +

    PNG, які використовуються в верстці, я сжимаю сервісом tinypng, а от про сжимання JPG якось не задумувався. В PageSpeed з цієї причини написано: «Для файлів JPEG рекомендується використовувати jpegtran чи jpegoptim (доступно тількі для Linux, виконувати з параметром --strip-all).»

    +

    На хостину виявився jpegtran, і я швидко зробив такий плагін:

    +
    +$e = &$modx->event;
    +if (!function_exists('optimizeJPG')) {
    +    function optimizeJPG($file) {
    +        $ext = strtolower(end(explode('.', $file)));
    +        if ($ext == 'jpeg' || $ext == 'jpg') {
    +            $cmd = '/usr/bin/jpegtran -optimize -progressive -copy none -outfile '.escapeshellarg($file.'_').' '.escapeshellarg($file);
    +            exec($cmd, $result, $return_var);
    +            @rename($file.'_',$file);   
    +        }
    +    }
    +}
    +if ($e->name == "OnFileBrowserUpload" || $e->name == "OnFileManagerUpload") {
    +    optimizeJPG($filepath.'/'.$filename);
    +}
    +if ($e->name == "OnSimpleGalleryRefresh") {
    +    optimizeJPG(MODX_BASE_PATH.$sg_image);
    +}
    +
    +

    Для роботи плагіна потрібна наявність на сервері jpegtran і права на виконання функції exec.

    +

    Плагін виконує оптимізацію при загрузці зображень через KCFinder, управління файлами, SimpleGallery (для неї можна також оптимізувати уже завантажені зображення).

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/02_\320\236\320\277\321\206\321\226\321\227.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/02_\320\236\320\277\321\206\321\226\321\227.md" new file mode 100644 index 00000000..9d11d8bb --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/02_\320\236\320\277\321\206\321\226\321\227.md" @@ -0,0 +1,332 @@ + + +

    phpthumb: Опції

    +Опції сніпета phpthumb. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ОпціяОпис
    wмаксимальна ширина мініатюри
    hмаксимальна висота мініатюри
    wpмаксимальна ширина мініатюри для вертикальних зображень
    hpмаксимальна висота мініатюри для вертикальних зображень
    wlмаксимальна ширина мініатюри для горизонтальних зображень
    hlмаксимальна висота мініатюри для горизонтальних зображень
    wsмаксимальна ширина мініатюри для квадратних зображень
    hsмаксимальна висота мініатюри для квадратних зображень
    fвихідний Формат зображення ("jpeg", "png", "gif")
    qступінь стиснення (1=гірше, 95=краще)
    sxліва сторона вихідного прямокутник (за замовчуванням = 0) (значення 0 < sx < 1)
    syверхня сторона вихідного прямокурника (за замовчуванням = 0)(значення 0 < sy < 1)
    swширина вихідного прямокурника (за замовчуванням = fullwidth)(значення 0 < sw < 1)
    shвисота вихідного прямокутника (за замовчуванням = fullheight)(значення 0 < sh < 1)
    zcавтоматично обрізає залишки по більшій стороні так, щоб зображення заповнило задані розміри (потребує "w" і "h", відмінюється опціями "iar", "far"). Значення "1" або "C" - обрізати від центру, значення "T", "B", "L", "R", "TL", "TR", "BL", "BR" - зверху/знизу/зліва/справа і т.д.
    bgколір фону (за замовчуванням = FFFFFF)
    bcколір бордюра (за замовчуванням = 000000)
    fltr +

    фільтр. Викликається у вигляді масиву з параметрами:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    britяскравістьfltr[]=brit|<value>де <value> значення в діапазоні від -255 до 255
    contконтрастністьfltr[]=cont|<value>де <value> значення в діапазоні від -255 до 255
    gamгамма-корекціяfltr[]=gam|<value>де <value> число від 0.01 до 10 (за замовчуванням 1.0)
    satнасиченістьfltr[]=sat|<value>де <value> число в діапазоні від 0 (без змін) до -100 (повне знебарвлення = відтінки сірого), або це може будь-яке додатнє число для підвищення насиченості.
    dsзнебарвленняfltr[]=ds|<value>аналогічно "sat" але додатнє значення знебарвлюють, від'ємні - насичують кольором
    grayвідтінки сірогоfltr[]=grayприбрати кольоровість
    thпорігfltr[]=th|<value>перводить зображення у відтінки сірого, тоді всі пікселі яскравіші <value> (діапазон 0-255) робить білими, всі пікселі темніші <value> робить чорними
    rcdзменшити глибину кольоруfltr[]=rcd|<c>|<d>де <c> кількість кольорів (2-256) у вихідному зображенні, а <d> рівне "1" згладити (за замовчуванням) або "0" не зглажувати
    clrрозмалюватиfltr[]=clr|<value>|<color>де <value> число між 0 і 100 для кількості розцвічування, <color> - колір для розцвічування
    sepсепіяfltr[]=sep|<value>|<color>де <value> число між 0 і 100 для кількості розцвічування (за замовчуванням=50), і <color> колір, щоб розмалювати (за замовчуванням=A28065)
    usmнерізке маскуванняfltr[]=usm|<a>|<r>|<t>де <a> це сума (за замовчуванням = 80, діапазон 0-255), <r> це радіус (за замовчуванням = 0.5, діапазон 0.0-10.0), <t> це поріг (за замовчуванням = 3, діапазон 0-50)
    blurрозмиттяfltr[]=blur|<radius>де (0 < <radius> < 25) (за замовчуванням = 1)
    gblrгауссове розмиттяfltr[]=gblr
    sblrвибіркове розмиттяfltr[]=gblr
    smthSmoothfltr[]=smth|<value>де <value> is the weighting value for the matrix (діапазон -10 до 10, за замовчуванням 6)
    lvlрівніfltr[]=lvl|<channel>|<method>|<thresholdде <channel> може бути одним з 'r', 'g', 'b', 'a' (для Red, Green, Blue, Alpha відповідно), або '*' для всіх RGB каналів (за замовчуванням) основаних на шкалі середнього сірого
    wbбаланс білогоfltr[]=wb|<c>де <c> is the target hex color to white balance on, this color is what "should be" white, or light gray. The filter attempts to maintain brightness so any gray color can theoretically be used. If <c> is omitted the filter guesses based on brightest pixels in each of RGB OR <c> can be the percent of white clipping used to calculate auto-white-balance (default = 0.1%).
    NOTE: "wb" in default settings already gives an effect similar to "lvl", there is usually no need to use "lvl" if "wb" is already used.
    histгістограммаfltr[]=hist|<b>|<c>|<w>|<h>|<a>|<o>|<x>|<y>де
    <b> is the color band(s) to display, from back to front (one or more of "rgba*" for Red Green Blue Alpha and Grayscale respectively);
    <c> is a semicolon-seperated list of hex colors to use for each graph band (defaults to FF0000, 00FF00, 0000FF, 999999, FFFFFF respectively);
    <w> and <h> are the width and height of the overlaid histogram in pixels, or if <= 1 then percentage of source image width/height;
    <a> is the alignment (same as for "wmi" and "wmt");
    <o> is opacity from 0 (transparent) to 100 (opaque) (requires PHP v4.3.2, otherwise 100% opaque);
    <x> and <y> are the edge margin in pixels (or percent if 0 < (x|y) < 1)
    overOVERlay/underlay image overlays an image on the thumbnail, or overlays the thumbnail on another image (to create a picture frame for example)fltr[]=over|<i>|<u>|<m>|<o>где
    <i> is the image filename;
    <u> is "0" (default) for overlay the image on top of the thumbnail or "1" for overlay the thumbnail on top of the image;
    <m> is the margin - can be absolute pixels, or if < 1 is a percentage of the thumbnail size [must be < 0.5] (default is 0 for overlay and 10% for underlay);
    <o> is opacity (0 = transparent, 100 = opaque) (requires PHP v4.3.2, otherwise 100% opaque);
    wmiводяний знак у вигляді зображенняfltr[]=wmi|<f>|<a>|<o>|<x>|<y>|<r>де
    <f> накладання зображення;
    <a> вирівнювання (один з BR, BL, TR, TL, C, R, L, T, B, *) де B=низ, T=верх, L=ліво, R=право, C=центр, *=плитка)
    *або*
    абсолютна позиція в пікселях (від верхнього лівого кута полотна до верхнього лівого кута накладення) в форматі {xoffset} x {yoffset} (наприклад: "10x20")
    примітка: це центральне положення зображення, якщо <x> і <y> встановлені
    <o> прозорість від 0 (прозорий) до 100 (непрозорий);
    <x> і <y> відступ від краю (і між плиткою) в пікселях (або відсотках якщо 0 < (x|y) < 1)
    *або*
    якщо <a> в форматі абсолютного позиціонування, то <x> і <y> представляють максимальну ширину і висоту водяного знака і зображення масштабується, щоб поміститися усередині
    <r> кут повороту водяного знака
    wmtтекстовий водяний знакfltr[]=wmt|<t>|<s>|<a>|<c>|<f>|<o>|<m>|<n>|<b>|<O>|<x>де:
    <t> текст використовуваний в якості водяного знака;
    URLencoded Unicode HTMLentities must be used for characters beyond chr(127). For example, the "eighth note" character (U+266A) is represented as "♪" and then urlencoded to "%26%239834%3B"
    Any instance of metacharacters will be replacedwith their calculated value. В цей момент підтримуються:
    ^Fb = вихідне зображення файлу в байтах
    ^Fk = вихідне зображення файлу в кілобайтах
    ^Fm = вихідне зображення файлу в мегабайтах
    ^X = ширина зображення в пікселях
    ^Y = висота зображення в пікселях
    ^x = ширина піктограми в пікселях
    ^y = висота піктограми в пікселях
    ^^ = the character ^
    <s> розмір шрифту (1-5 for built-in font, or point size for TrueType fonts);
    <a> вирівнювання (один з BR, BL, TR, TL, C, R, L, T, B, * де B = внизу, T = вгорі, L = зліва, R = праворуч, C = центр, * = плитка); < br> примітка: * не працює для вбудованих шрифтів "wmt"
    * або *
    абсолютне положення в пікселях (від верхнього лівого кута полотна до верхнього лівого кута накладення) в форматі {xoffset} x {yoffset} (наприклад: "10x20")
    & lt; c & gt; колір тексту;
    & lt; f & gt; ім'я файлу TTF (опціонально, якщо опустити вбудований шрифт буде використовуватися);
    & lt; o & gt; прозорість від 0 (прозорий) до 100 (непрозорий);
    & lt; m & gt; відступ від краю (і між плиткою) в процентах;
    & lt; n & gt; кут
    & lt; b & gt; колір фону;
    & lt; O & gt; прозорість фону від 0 (прозорий) до 100 (непрозорий);
    & lt; x & gt; напрямок поширення фону (або 'x' або 'y' (або обидва, але так буде закрито всі зображення))
    Note: works with TTF fonts only, not built-in +
    flipзсув зображення по осі X або Yfltr[]=flip|x або fltr[]=flip|y
    ricскруглить кути зображення (для виведення прозорих зображень PNG) fltr[]=ric|<x>|<y>де <x> горизонтальний радіус кривої а <y> вертикальний радіус
    elipсхоже на обрізка кутів, але більш екстримальнеfltr[]=elip
    maskfltr[]=mask|filename.png|<i>greyscale values of mask are applied as the alpha channel to the main image. White is opaque, black is transparent, unless the <i> (invert) parameter is set to 1 in which case black is opaque and white is transparent
    bvlBeVeLfltr[]=bvl|<w>|<c1>|<c2>где <w> is the bevel width, <c1> is the hex color for the top and left shading, <c2> is the hex color for the bottom and right shading
    bordбордюрfltr[]=bord|<w>|<rx>|<ry>|<c>де <w> ширина в пікселях, <rx> і <ry> горизонтальні і вертикальні радіуси для заокруглених кутів, і <c> колір бордюра
    framрамка на зразок "bord" але більш настроюванаfltr[]=fram|<w1>|<w2>|<c1>|<c2>|<c3>де <w1> is the width of the main border, <w2> is the width of each side of the bevel part, <c1> is the hex color of the main border, <c2> is the highlight bevel color, <c3> is the shadow bevel color
    dropтіньfltr[]=drop|<d>|<w>|<clr>|<a>|<o>де <d> is distance from image to shadow, <w> is width of shadow fade (not yet implemented), <clr> is the hex color of the shadow, <a> is the angle of the shadow (default=225), <o> is opacity (0=transparent, 100=opaque, default=100) (not yet implemented)
    cropобрізка зображенняfltr[]=crop|<l>|<r>|<t>|<b>де
    <l> is the number of pixels to crop from the left side of the resized image;
    <r>, <t>, <b> are for right, top and bottom respectively. где (0 < x < 1) the value will be used as a percentage of width/height. Left and top crops take precedence over right and bottom values. Cropping will be limited such that at least 1 pixel of width and height always remains.
    rotповоротfltr[]=rot|<a>|<b>де
    <a> кут повороту в градусах;
    <b> колір фону. Подібно "ra" але застосовується після обробки інших фільтрів, тому ви можете обертати інші фільтри.
    sizeзміна розміруfltr[]=size|<x>|<y>|<s>де
    <x> горизонтальний розмір в пікселях,
    <y> вертикальний розмір в пікселях,
    <s> розтягнути (якщо = 1) або змінити розмір пропорційно (0, за замовчуванням) <x> і <y> будуть інтерпретуватися як відсоток від поточного розміру зображення якщо (0 < X < 1)
    Примітка: не використовуйте цей фільтр без необхідності. Саме і тільки у випадках, коли до інших фільтрів необхідно застосувати абсолютне позиціонування на основі вихідного зображення і отримане зображення повинне бути змінене після застосування інших фільтрів. Цей фільтр є менш ефективним, ніж стандартні процедури зміни розміру.
    stcSource Transparent Colorfltr[]=stc|<c>|<n>|<x>де
    <c> is the hex color of the target color to be made transparent;
    <n> is the minimum threshold in percent (all pixels within <n>% of the target color will be 100% transparent, default <n>=5);
    <x> is the maximum threshold in percent (all pixels more than <x>% from the target color will be 100% opaque, default <x>=10); pixels between the two thresholds will be partially transparent.
    +
    md5sMD5-хеш вихідного зображення
    xtoEXIF Thumbnail Only - set to only extract EXIF thumbnail and not do any additional processing
    raПоворот на кут: кут повороту в градусах позитивний = проти годинникової стрілки, негативний = за годинниковою стрілкою
    arAuto Rotate: set to "x" to use EXIF orientation stored by camera. Can also be set to "l" or "L" for landscape, or "p" or "P" for portrait. "l" and "P" rotate the image clockwise, "L" and "p" rotate the image counter-clockwise.
    sfnSource Frame Number - use this frame/page number for multi-frame/multi-page source images (GIF, TIFF, etc)
    aoeOutput Allow Enlarging - override the setting for $CONFIG['output_allow_enlarging'] (1=on, 0=off) ("far" and "iar" both override this and allow output larger than input)
    iarвідключити пропорційну зміну зображення і розтягнути його до "h" і "w" (які мають бути задані). (1=увімкнути, 0=вимкнути) (відміняє "far")
    farпропорційна зміна зображення - зображення буде пропорційно змінене до вказаних в "w" и "h" розмірів, які мають бути встановлені. Вирівнювання: L=зліва,R=зправа,T=верх,B=низ,C=по центру, а також BL,BR,TL,TR
    dpiDots Per Inch - input DPI setting when importing from vector image format such as PDF, WMF, etc
    siaSave Image As - default filename to save generated image as. Specify the base filename, the extension (eg: ".png") will be automatically added
    maxbMAXimum Byte size - output quality is auto-set to fit thumbnail into "maxb" bytes (compression quality is adjusted for JPEG, bit depth is adjusted for PNG and GIF)
    downfilename to save image to. If this is set the browser will prompt to save to this filename rather than display the image
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..de5cbbb1 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/03_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,85 @@ + +

    phpthumb: Параметри

    +Параметри сніпета phpthumb. +
    +
    +
    + +
    +
    +Формат: шлях до зображення
    +Значення за замовчуванням: assets/snippets/phpthumb/noimage.png
    +Примітка:
    +Приклад: +
    &input=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: f=jpg,q=96
    +Примітка:
    +Приклад: +
    &options=`w=150,h=76,far=C,bg=FFFFFF`
    +
    +
    +
    + + +
    + +
    +
    +Формат: шлях до зображення
    +Значення за замовчуванням: assets/snippets/phpthumb/noimage.png
    +Примітка: Цю опцію можна прописати в налаштуваннях сніпета, щоб не вказувати цей параметр у всіх викликах сніпета.
    Для цього достатньо добавити наступний код у вкладці "ВЛАСТИВОСТІ" сніпета phpthumb і натиснути кнопку "Оновити параметри":
    +
    +{
    +	"noImage": [
    +		{
    +			"label": "noImage",
    +			"type": "text",
    +			"value": "assets/templates/my_template/images/noimage.png",
    +			"default": "assets/templates/my_template/images/noimage.png",
    +			"desc": "Зображення, що буде підставлене, якщо запитуване не існує"
    +		}
    +	]
    +}
    +
    +assets/templates/my_template/images/noimage.png - зображення має бути за цим шляхом! +Приклад: +
    &noImage=`assets/templates/my_template/images/noimage.png`
    +
    +
    +
    + + +
    + +
    +
    + Формат: 0|1
    + Значення за замовчуванням: 0
    + Примітка: необхідна Evolution CMS 1.4.9+ або
    + Приклад: +
    &webp=`1`
    +
    +
    +
    + + +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/04_\320\237\321\200\320\270\320\272\320\273\320\260\320\264\320\270.md" new file mode 100644 index 00000000..e69de29b diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/index.md" new file mode 100644 index 00000000..d5b0300d --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/phpthumb/index.md" @@ -0,0 +1,4 @@ + + +

    phpthumb Створення ескізів зображень

    +Сніпет для створення ескізів зображень накладення водяних знаків заокруглення кутів зміни контрастності ступінь стиснення. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/prevNext/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/prevNext/index.md" new file mode 100644 index 00000000..e0ccc1fb --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/prevNext/index.md" @@ -0,0 +1,116 @@ + + +

    Сніпет Навігація по сусідніх документах Modx Evo

    +Сніпет виведення сусідніх документів в MODX Evolution. Наприклад, посилання «Наступна стаття», «Попередня стаття», «Попередній товар», «Наступний товар». + +

    На багатьох сайтах після тексту статті часто можна зустріти блок посилань на інші матеріали сайту. Наприклад, посилання «Наступна стаття», «Попередня стаття». Також на сторінці товару, крім самого товару, можна побачити посилання на сусідні товари з тієї ж категорії.

    +

    У Ditto, як і у Wayfinder, я такої можливості не знайшов. Тому написав простий сніпет і вирішив поділитися їм тут. Сподіваюся комусь він стане в нагоді. Сніпет, як і було сказано вище, дуже простий - відмінний приклад для тих, хто тільки починає писати свої рішення для MODX. У коді безліч коментарів, так що проблем з розумінням виникнути не повинно.

    +

    Сніпету можна передавати 4 параметра:

    +
      +
    • &tpl – чанк-шаблон для виведення списку посилань (обов'язковий параметр)
    • +
    • &prevDocs – кількість документів з меншим ID (необов'язковий параметр)
    • +
    • &nextDocs – кількість документів з великим ID (необов'язковий параметр)
    • +
    • &sortRevert – порядок сортування документів (необов'язковий параметр)
    • +
    +

    Чанк-шаблон:

    +
    +<a href="[~[+id+]~]">[+pagetitle+]</a>
    +
    +
    +<?php
    +	// визначаємо значення за замовчуванням 
    +	$prevDocs = (isset($prevDocs)) ? $prevDocs : 2; // кількість сусідніх документів з меншим ID
    +	$nextDocs = (isset($nextDocs)) ? $nextDocs : 2; // кількість сусідніх документів з великим ID
    +
    +	$sortRevert = (isset($sortRevert)) ? $sortRevert : 0; // параметр визначає порядок сортування
    +
    +	// невелика перевірка наданих в параметрах значень
    +	$prevDocs = (int) $prevDocs;
    +	$nextDocs = (int) $nextDocs;
    +	$sortRevert = (int) $sortRevert;
    +
    +	// отримуємо ID документа на якому відбувається виклик даного сніпета
    +	$id = $modx->documentIdentifier;
    +
    +	// отримуємо ID документа-батька 
    +	$parent = $modx->documentObject['parent'];
    +
    +	// перевірити чи не встановлено чанк
    +	if (!isset($tpl)) {
    +		echo "No chunk defined for siblings-snippet!";
    +		return;
    +	}
    +
    +	// перевіряємо чи існує чанк
    +	if ($modx->parseChunk($tpl,array()) === NULL) {
    +		echo "Chunk specified, but not found!";
    +		return;
    +	}
    +
    +	// отримуємо дані про сусідні документи з меншим ID
    +	$prev = $modx->db->makeArray($modx->db->select('id, pagetitle', 'modx_site_content', "id < {$id} and parent = {$parent} and published = 1", 'id DESC', $prevDocs));
    +
    +	// отримуємо дані про сусідні документи з великим ID
    +	$next = $modx->db->makeArray($modx->db->select('id, pagetitle', 'modx_site_content', "id > {$id} and parent = {$parent} and published = 1", 'id ASC', $nextDocs));
    +
    +	// об'єднуємо отримані даний в один масив
    +	$siblings = array_merge($next, $prev);
    +
    +	// визначаємо масив в якому буде зберігатися індексований масив
    +	$indexed = array();
    +
    +	// створюємо масив з індексами складеними з ID документів
    +	foreach ($siblings as $sibling) {
    +		$indexed[$sibling['id']] = $sibling;	
    +	}
    +
    +	// сортуємо
    +	if ($sortRevert === 1) {
    +		rsort($indexed);
    +	} else {
    +		sort($indexed);
    +	}
    +
    +	// формуємо html
    +	foreach($indexed as $sibling){
    +		$html .= $modx->parseChunk(
    +			$tpl,
    +			array(
    +				'id' => $sibling['id'],
    +				'pagetitle' => $sibling['pagetitle']		
    +			),
    +			'[+','+]'
    +		);
    +	}
    +	echo $html;
    +?>
    +
    +
    + +
    +<?php
    +$ID = $modx->documentIdentifier;
    +$parentId = array_pop($modx->getParentIds($modx->documentIdentifier, 1));
    +
    +$children = $modx->getActiveChildren($parentId, 'menuindex', 'ASC');
    +
    +$i=0;
    +$key = false;
    +while(!$key && $i < count($children)){
    +	$key = array_search($ID, $children[$i]);
    +	$i++;
    +}
    +
    +if(!empty($key) && count($children) > 1){
    +	$placeholders = array(
    +		'prev'=>($i-2 >= 0 ? '<a href="'.$modx->makeUrl($children[$i-2]['id']).'">« назад</a>' : ''),
    +		'next'=>($i < count($children) ? '<a href="'.$modx->makeUrl($children[$i]['id']).'">вперед »</a>' : '')
    +	);
    +	$output = $modx->parseChunk('prevnext', $placeholders, '[+', '+]');
    +}
    +return $output;
    +?>
    +
    +

    Сніпет виводить результат в чанк prevnext, в якому використовуються два плейсхолдера:

    +

    [+prev+] [+next+]

    +

    Приклад сніпетів виведення сусідніх документів

    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/sGallery/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/sGallery/index.md" new file mode 100644 index 00000000..c0b73187 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/sGallery/index.md" @@ -0,0 +1,150 @@ +## Репозиторій ## +https://github.com/Seiger/sGallery + +# sGallery для Evolution CMS +![sGallery](https://user-images.githubusercontent.com/12029039/169609394-08ea36d6-2393-4261-aff2-348f73a6103c.png) +[![Latest Stable Version](https://img.shields.io/packagist/v/seiger/sgallery?label=version)](https://packagist.org/packages/seiger/sgallery) +[![CMS Evolution](https://img.shields.io/badge/CMS-Evolution-brightgreen.svg)](https://github.com/evolution-cms/evolution) +![PHP version](https://img.shields.io/packagist/php-v/seiger/sgallery) +[![License](https://img.shields.io/packagist/l/seiger/sgallery)](https://packagist.org/packages/seiger/sgallery) +[![Issues](https://img.shields.io/github/issues/Seiger/sgallery)](https://github.com/Seiger/sgallery/issues) +[![Stars](https://img.shields.io/packagist/stars/Seiger/sgallery)](https://packagist.org/packages/seiger/sgallery) +[![Total Downloads](https://img.shields.io/packagist/dt/seiger/sgallery)](https://packagist.org/packages/seiger/sgallery) + +**sGallery** постає як універсальний та необхідний плагін, створений для Evolution CMS, +який змінює підхід до керування медіафайлами на вашому сайті. Спеціально +розроблений для адміністративної панелі Evolution CMS, цей динамічний плагін надає низку +потужних можливостей для покращення подання контенту. + +**sGallery** підтверджує прагнення Evolution CMS до надійного та зручного +керування контентом. Незалежно від того, чи ви контент-менеджер, чи адміністратор, цей плагін +дозволяє легко створювати привабливий та інтерактивний сайт. +Покращіть свій досвід роботи з медіафайлами разом із **sGallery** вже сьогодні. + +## Можливості + +- [x] Прикріплення зображень та відео +- [x] Просте завантаження медіа +- [x] Інтеграція з YouTube +- [x] Сортування позицій +- [x] Текстові поля для керування файлами +- [x] Зміна розміру зображень та конвертація у AVIF чи WEBP +- [x] Інтеграція з власними модулями +- [x] Інтеграція з **[sLang](https://github.com/Seiger/sLang)** +- [x] Підтримка кількох вкладок +- [x] Повноекранний слайдер у адмінпанелі + +## Підтримувані формати + +Наведені нижче формати зображень протестовані і підтримуються пакетом. Якщо ваша інсталяція GD/Imagick підтримує +формат, якого тут немає, швидше за все він працюватиме, але результати можуть відрізнятися. + +| Формат | GD | Imagick | +|--------|----| --- | +| jpeg | ✅ | ✅ | +| png | ✅ | ✅ | +| gif | ✅ | ✅ | +| webp | ✅ | ✅ | +| avif | ✅ | ✅ | +| heic | ❌ | ✅ | +| tiff | ❌ | ✅ | + +## Мінімальні вимоги + +- 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 + +## Встановлення через artisan package installer + +Перейдіть у теку /core/: + +```console +cd core +``` + +Виконайте команду php artisan + +```console +php artisan package:installrequire seiger/sgallery "*" +``` + +Згенеруйте конфігураційний файл у **../core/custom/config/seiger/settings** з +ім'ям **sgallery.php**. Файл повинен повертати +список шаблонів, розділених комою. + +```console +php artisan vendor:publish --provider="Seiger\sGallery\sGalleryServiceProvider" +``` + +Створіть структуру БД командою: + +```console +php artisan migrate +``` + +## Налаштування + +Шаблони для відображення вкладок галереї налаштовуються у файлі + +```console +core/custom/config/seiger/settings/sGallery.php +``` + +, де масив містить ідентифікатори шаблонів для підключення галереї. + +## Використання у blade + +Показ усіх файлів із фільтром зображень: +```php +@foreach(sGallery::collections()->get() as $item) + @if(sGallery::hasImage($item->type)) + link))href="{{$item->link}}"@endif> +
    + {{$item->alt}} +
    +
    {{$item->title}}
    +

    {{$item->description}}

    + @if(trim($item->link_text))
    {{$item->link_text}}
    @endif +
    +
    +
    + @endif +@endforeach +``` +або фільтр YouTube +```php +@foreach(sGallery::collections()->get() as $item) + @if(sGallery::hasYoutube($item->type)) +
    +
    + +
    +

    {{$item->title}}

    +
    + @endif +@endforeach +``` +або +```php +@foreach(sGallery::collections()->documentId($product->id)->itemType('product')->get() as $item) +
    + + + +
    +@endforeach +``` + +## Інтеграція в модуль продуктів + +Просто вставте цей код у ваш View: +```php +{!!sGallery::initialiseView()->viewType('section')->itemType('product')->idType('i')!!} +``` + +[Повна документація](https://seiger.github.io/sGallery/) diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" new file mode 100644 index 00000000..f010636c --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/02_\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\270.md" @@ -0,0 +1,203 @@ + + +

    tagLinks: Параметри

    +Параметри сніпета tagLinks для формування списка посилань для сортування документів за категоріями. +
    +
    + +
    + +
    +
    +Формат: id документа
    +Значення за замовчуванням: Id поточного документа
    +Примітка: При використанні в шаблоні Ditto &id=``
    +Приклад: +
    &id=``
    +
    +
    +
    + +
    + +
    +
    +Формат: TV-параметр
    +Значення за замовчуванням: ні
    +Примітка:
    +Приклад: +
    &tv=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &value=``
    +
    +
    +
    + +
    + +
    +
    +Формат: стрічка
    +Значення за замовчуванням: ,
    +Примітка:
    +Приклад: +
    &delimeter=`, `
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 0
    +Примітка:
    +Приклад: +
    &caseSensitive=`1`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: Categories:
    +Примітка:
    +Приклад: +
    &label=`Категорії:`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: порожньо
    +Примітка:
    +Приклад: +
    &separator=` | `
    +
    +
    +
    + +
    + +
    +
    +Формат: div | span | p
    +Значення за замовчуванням: div
    +Примітка:
    +Приклад: +
    &element=`span`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням: taglinks
    +Примітка:
    +Приклад: +
    &style=`links`
    +
    +
    +
    + +
    + +
    +
    +Формат: a | ul | ol
    +Значення за замовчуванням:
    +Примітка:
    +Приклад: +
    &format=``
    +
    +
    +
    + +
    + +
    +
    +Формат: 0 | 1
    +Значення за замовчуванням: 1
    +Примітка:
    +Приклад: +
    &newline=`0`
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка: Якщо шлях виглядає так: yoursite.url/blog/categories/, то як значення вкажіть &path=`blog/categories`. Альтернативний варіант - вказати id документа і він буде перетворений в шлях автоматично.
    +Приклад: +
    &path=``
    +
    +
    +
    + +
    + +
    +
    +Формат:
    +Значення за замовчуванням:
    +Примітка: Необхідний, якщо сніппет Ditto викликається з параметром &id
    +Приклад: +
    &idDitto=``
    +
    +
    +
    + +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/03_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/03_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" new file mode 100644 index 00000000..a1ec474f --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/03_\320\222\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217.md" @@ -0,0 +1,61 @@ + + +

    tagLinks: Встановлення

    +Встановлення сніппета tagLinks для створення списка посилань для сортування документів за категоріями. +
    +

    Створюємо TV-параметр tags

    +

    Створюємо TV-пареметр tags із значенням Text і вказуємо всі шаблони, для яких він буде застосовуватися.

    +

    Данний параметр буде вміщувати теги (або інакше категорії), по яких ми будемо сортувати документи. Існує декількі варіантів додавання тегів.

    +

    1. Якщо всі категорії визначені завчасно

    +

    В цьому випадку слід скористатись полем "Можливі значення", де перерахує всі категорії в такому вигляді:

    +
    Категорія1||Категорія2||Категорія3 ...
    +

    Як "Візуальний компонент" вкажіть "Delimited List" із значенням ", ".

    +

    Пам'ятайте, що MODX дозволяє зберігати ці дані в чанку або ж в файлі, котрі підключаються @CHUNK tags або ж @FILE assets/files/tags.txt

    +

    2. Якщо категорії додаються користувачами

    +

    В цьому випадку в "Можливих значень" нічого не вказуємо, і для зручності користувачів підключаємо віджет mm_widget_tags плагіна ManagerManager.

    +

    Створюємо сторінку виведення документів за заданним тегом

    +

    На даній сторінці буде відбуватись сортування документів за заданими тегами. Сортувати ми будемо за допомогою сніппета Ditto. Як псевдонім документа вкажемо main. У вмісті розмістим приблизно такий виклик Ditto:

    +
    +[!Ditto?
    +&id=`tags`
    +&tagData=`tags`
    +&tagDelimiter=`, `
    +&parents=`0`
    +&depth=`5`
    +&showInMenuOnly=`1`
    +&display=`10`
    +&tpl=`tplDoc`
    +&paginate=`1`
    +&dateSource=`pub_date`
    +&sortBy=`pub_date`
    +&dateFormat=`%d.%m.%Y`
    +&hiddenFields=`tags`!]
    +
    +<div class="pagination">[+tags_previous+] [+tags_pages+] [+tags_next+]</div> +
    +

    де:

    +
      +
    • &tagData=`tags` &tagDelimiter=`, ` - обов'язкові параметри виклику
    • +
    • &parents=`0` - список ID ресурсів через кому, в яких відбувається пошук документів з тегами, в даному випадку вибраний корінь сайта
    • +
    • &depth=`5`- глибина перегляду
    • +
    • &showInMenuOnly=`1` - показувати тільки документи в яких поставлений прапорець «Показувати в меню»
    • +
    • &display=`10` - кількість знайденних документів на сторінці
    • +
    • &tpl=`tplDoc` - шаблон виведення знайденного документа
    • +
    • &paginate=`1` - включаємо поділ по сторінках
    • +
    +

    У вас виклик Ditto може мати інші параметри и значення.

    +

    Вставляємо в шаблон виклик сніппета tagLinks

    +

    Там, де нам необхідно вивести список тегів, котрим відповідає документ, поміщаємо виклик сніппета:

    +
    [[tagLinks? &id=`424` &value=`` &separator=`, ` &element=`span` &fap=`1` &path=`main` &label=` `]]
    +

    в шаблоні для Ditto виклик буде таким:

    +
    [[tagLinks? &id=`` &value=`` &separator=`, ` &element=`span` &fap=`1` &path=`main` &label=` `]]
    +

    де:

    +
      +
    • &tagData=`tags` &tagDelimiter=`, ` - обов'язкові параметри виклику
    • +
    • &parents=`0` - список ID ресурсів через кому, в яких відбувається пошук документів з тегами, в даному випадку вибраний корінь сайта
    • +
    • &id=`424`- id документа, вміщающого теги
    • +
    • &value=`` - TV-параметр, в котрому збкрігаються теги
    • +
    • &separator=`, ` - розділювач між посиланнями
    • +
    • &element=`span` - элемент, яким обгортуємо список посилань
    • +
    • &path=`main` - шлях до сторінки з сортуванням за тегами
    • +
    diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/04_ManagerManager.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/04_ManagerManager.md" new file mode 100644 index 00000000..9de92f1b --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/04_ManagerManager.md" @@ -0,0 +1,21 @@ + + + diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/index.md" new file mode 100644 index 00000000..2ddad411 --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/tagLinks/index.md" @@ -0,0 +1,4 @@ + + +

    Навігація по сайту за допомогою тегів

    +Сніпет tagLinks призначений для створення списка посилань для сортування документів за категоріями. diff --git "a/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/thumb/index.md" "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/thumb/index.md" new file mode 100644 index 00000000..09877cea --- /dev/null +++ "b/ua/04_\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\320\270/thumb/index.md" @@ -0,0 +1,89 @@ + + +

    Проста реалізація phpThumb генератора на основі єдиного tv и заданих параметрів.

    +Проста реалізація phpThumb генератора на основі єдиного tv и заданих параметрів. + +

    Здавалося, типова задача, заповнити каталог зображень, підготувати для кожного декілька розмірів і накласти довільні фільтри, але я не можу знайти в modx потрібного, простого і зручного інструмента.

    + +

    Проста реалізація phpThumb генератора на основі одного tv и заданих параметрів.

    + +

    Приклад виклика

    +
    +[!thumb? &path=`[+thumb+]` &size=`320x240` &tpl=`thumb`!]
    +
    +

    Початкове зображення задається змінною шаблона [+thumb+]. Снипет [[thumb]]зі змінної первинного файла (наприклад image.jpg) і параметрів (320x240) формує єдине ім'я нового файла (image.320x240.jpg). При зверненні до каталогу картинок, згідно з правилом RewriteRule apache перенаправляє запит обробнику index.php, який розбиває ім'я файла назад на параметри і за допомогою phpThumb формує потрібне зображення.

    + +

    Сниппет [[thumb]]

    +//Сніпет +

    Приймає один обов'язковий і два опціональних параметра

    +

    path шлях до файла картинок

    +

    [size] розмір картинки, що генерується

    +

    [tpl]шаблон оформлення

    +

    Залежно від шаблона, сніпет або повертає оформлений згідно з шаблоном результат або рядок з кінцевим шляхом path

    +
    +<?php
    +if (!empty($path)) {
    +	$size = (empty($size)) ? $size : '320x240';
    +
    +	$path = explode('.', $path);
    +	array_splice($path, -1, 0, $size);
    +	$output = $path = implode('.', $path);
    +
    +	if (!empty($tpl)) {
    +		$params['path'] = $path;
    +		$output = $modx->parseChunk($tpl, $params, '[+', '+]');
    +	}
    +}
    +return $output;
    +?>
    +
    + +

    Чанк
    +Приймає лише єдиний плейсхолдер [+path+]

    +
    +<img src="[+path+]">
    +
    + +

    Обробник запитів index.php

    +

    Приймає адресу зображення, розбиває адресу на аргументи і відповідно до заданих параметрів генерує і повертає результат.

    +
    +<?php
    +if (!empty($_GET['path'])) {
    +	if (!file_exists($path = $_GET['path'])) {
    +		$image = explode('.', $path);
    +		$size = end(array_splice($image, -2, 1));
    +		if (in_array($size, array('100x50', '200x100', '300x150'))) {
    +			$image = implode('.', $image);
    +			if (file_exists($image)) {
    +				list($width, $height) = explode('x', $size);
    +				require('phpthumb.class.php');
    +				$phpThumb = new phpThumb();
    +				$phpThumb->setSourceFilename($image);
    +				$phpThumb->setParameter('w', $width);
    +				$phpThumb->setParameter('h', $height);
    +				$phpThumb->setParameter('zc', '1');
    +				$phpThumb->setParameter('q', '100');
    +
    +				if ($phpThumb->GenerateThumbnail()) {
    +					if ($phpThumb->RenderToFile($path)) {
    +						return header('Location: '.$path);
    +					}
    +				}
    +			}
    +		}
    +	}
    +}
    +return header("HTTP/1.0 404 Not Found");
    +?>
    +
    + +

    Правило перенаправлення apache .htaccess

    +

    Запускає процедуру обробки зображення

    +
    +<IfModule mod_rewrite.c>
    +	RewriteEngine on
    +	RewriteCond %{REQUEST_FILENAME} !-f
    +	RewriteCond %{REQUEST_FILENAME} !-d
    +	RewriteRule ^(.*)$ index.php?path=$1 [L,QSA]
    +</IfModule>
    +
    diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217_Evolution_CMS.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217_Evolution_CMS.md" new file mode 100644 index 00000000..92de84ba --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/02_\320\236\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\217_Evolution_CMS.md" @@ -0,0 +1,28 @@ +Для оновлення системи Evolution CMS вам потрібно виконати практично ті ж кроки, що і в керівництві по установці, з одним винятком: ви не повинні видаляти або перезаписувати файл config.inc.php. + + +Для оновлення версії Evolution CMS виконайте наступне: + +* Якщо Ви змінювали для своїх потреб сніпети, модулі або плагіни, перейменуйте їх, або не забудьте зняти галочки в процесі роботи майстра встановлення. Майстер встановлення за замовчуванням перезапише всі штатні сніпети або плагіни (Ditto і т.д.) до останніх версій. (Взагалі, хорошою практикою вважається перейменування сніпета або плагіна відразу ж після внесення в нього змін) + + +* Зробіть резервні копії всього що можна. По ftp скачайте всі файли Evolution з вашого сервера і за допомогою phpMyAdmin (або іншої програми управління БД) зробіть дамп всієї бази даних. +* Скачайте і розархівуйте останню версію Evolution CMS. +* Завантажте вміст розпакованого архіву на ваш сервер. Перезапишіть всі старі файли. Дистрибутив Evolution CMS не повинен містити файлу config.inc.php в папці /manager/includes/, тоді він не буде перезаписаний. +* Відкрийте браузер і зайдіть на ваш сайт в директорію /install. +* Далі дотримуйтесь інструкцій на екрані. +* Відразу після Ліцензійної угоди, переконайтеся, що обрана опція "Оновити". + +* Якщо ви видалили всі ваші старі файли перед оновленням, вам, ймовірно, буде потрібно знову виставити права доступу через CHMOD. Майстер встановлення нагадає вам зробити це, якщо буде необхідно. + +* Не забудьте зняти галочки з тих доповнень (сніпетів, плагінів), в які ви внесли зміни і не перейменували (див.пункт 1). + +* Коли перед вами виникне опція "Видалити папку /install", переконайтеся, що вона включена. + +* Після завершення роботи майстра установки переконайтеся, що папки /install не існує. Якщо це не так, видаліть її вручну. + +* Нарешті, змініть права доступу до файлу config.inc.php в папці/manager/includes на "тільки читання". Рекомендована установка через CHMOD -0444 (r--r--r--) захистить ваш сайт від можливої атаки. + +Примітка: на серверах під управлінням IIS цього робити не потрібно. + +Після того, як ви переконаєтеся, що все працює коректно, перейменуйте всі модифіковані вами сніпети або плагіни знову, якщо це необхідно. diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/03_\320\237\320\265\321\200\320\265\320\274\321\226\321\211\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203_\320\267_\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\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/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/03_\320\237\320\265\321\200\320\265\320\274\321\226\321\211\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203_\320\267_\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\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" new file mode 100644 index 00000000..a3593d4a --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/03_\320\237\320\265\321\200\320\265\320\274\321\226\321\211\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203_\320\267_\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\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" @@ -0,0 +1,68 @@ +## Підготовка +* Очистіть кеш +* В "Конфігурації" зайдіть у вкладку "Безпека" і очистіть поле "Допустимі імена хостів". + +## Створення дистрибутива ## + +### Дамп файлів ### +Всі файли з папки сайту на локальному комп'ютері запаковуємо в архів ZIP. При цьому назву файлу краще зробити простою і короткою. + +### Дамп базы даних ### + +Найпростіший спосіб зробити дамп бази - скористатися програмою phpMyAdmin. + +* Обираємо базу нашого сайту. +* Заходимо в розділ "Експорт" +* Виділяємо всі таблиці для експорту +* Можна встановити галочку "Додати видалення таблиці", щоб таблиці зі старими даними стиралися. +* Відзначаємо галочку "Відіслати", щоб зберегти дамп у вигляді файлу. + +## Розпаковуємо файли ## + +* Переходимо до папки з нашим сайтом. +* Розпаковуємо файли з архіву + +## Встановлюємо права на запис ## + +Для правильної роботи Evolution необхідно встановити права на запис для наступних папок і файлів: + +* assets/cache +* assets/cache/siteCache.idx.php +* assets/cache/sitePublishing.idx.php +* assets/images +* assets/export + +## Завантажуємо дамп в базу на хостингу ## + +Найпростіше знову скористатися phpMyAdmin. + +Якщо у вас немає бази, то потрібно її створити. Якщо є, то обираємо свою базу і переходимо у вкладку Імпорт. +Натискаємо огляд і обираємо свій файл. При цьому важливо, щоб кодування файлу дампа збігалася з вказаною. + +## Перевірка правильності перенесення даних ## + +Щоб перевірити правильність перенесених даних відкриваємо таблицю (prefix) site_content. Ця таблиця містить всі документи, тому ви повинні побачити свої тексти. Якщо текст відображається криво, то можливо ваш файл був в невірному кодуванні. + +## Налаштовуємо конфігурацію ## + +### Підключення до бази ### + +Відкриваємо файл manager/includes/config.inc.php (краще зробити копію, а не переписувати локальну версію) і коригуємо наступні дані: +``` +$database_server = 'localhost'; // Іноді на хостингу сервер бази даних знаходиться окремо, тому може виникнути необхідність вказати пряму адресу сервера +$database_user = 'MyUser'; // Вказуємо логін для доступу до бази +$database_password = ' MyPassword '; // пароль для доступу до бази +$database_connection_charset = 'utf8'; // кодування одержуваних даних з бази +``` + +### Налаштування шляхів до файлів ### + +Заходимо в систему управління. В меню обираємо "Конфігурація". Там вибираємо вкладку "Файл-менеджер" і "Файл-браузер". Потрібно натиснути "Скидання" в полях "Шлях до файлів" і "Шлях для файл-менеджера: + +## Додаткова перевірка кодування ## + +Щоб остаточно упевнитися, що все працює правильно і кодування вказані скрізь вірні, відкриваємо будь-який документ (наприклад головну, щоб далеко не йти). Там пишемо такий рядок іІшШ і зберігаємо. Йдемо на сайт і дивимося результат. Якщо все показується вірно, то перенесення зроблено вірно. + +## Оновлення сайту ## + +Якщо при перенесенні ви захопили і локальний кеш (а ви його звичайно захопили), то краще виконати очищення кешу. Для цього вибираємо пункт в меню Інструменти -> Очистити кеш. diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/04_\320\242\320\270\320\274\321\207\320\260\321\201\320\276\320\262\320\265_\320\262\321\226\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/04_\320\242\320\270\320\274\321\207\320\260\321\201\320\276\320\262\320\265_\320\262\321\226\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203.md" new file mode 100644 index 00000000..fd9ca810 --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/04_\320\242\320\270\320\274\321\207\320\260\321\201\320\276\320\262\320\265_\320\262\321\226\320\264\320\272\320\273\321\216\321\207\320\265\320\275\320\275\321\217_\321\201\320\260\320\271\321\202\321\203.md" @@ -0,0 +1,9 @@ +Може виникнути така ситуація, коли вам потрібно на певний час зробити ваш сайт недоступним для відвідувачів. Evolution CMS пропонує власнику відключити сайт і оповістити відвідувачів про причини і терміни. + +Увійдіть в інтерфейс управління сайтом користувачем, у якого є права на зміну конфігурації сайту. Перейдіть на панель управління системою (Administration -> System settings). Налаштування доступності сайту знаходяться на першій вкладці панелі управління системою. + +Поки система ідентифікує вас як Адміністратор, ви бачите свій сайт в тому ж стані, що і раніше. Це дозволяє легко відключити сайт з метою підтримки (наприклад, оновлення або додавання модулів, шаблонів і т.п.), але при цьому мати можливість бачити і тестувати внесені зміни, перш ніж це побачать рядові відвідувачі. Вони ж побачать спеціальну сторінку, якщо ви її вказали, або спеціальне повідомлення. + +Якщо не вказано, яку сторінку показувати відвідувачам поки сайт відключений, тоді система автоматично покаже повідомлення про те, що сайт недоступний. + +Джерело: MODx - Викиучебник diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\264\320\260\320\262\320\260\320\275\320\275\321\217_\320\262\320\273\320\260\321\201\320\275\320\270\321\205_\321\200\320\276\320\267\321\210\320\270\321\200\320\265\320\275\321\214_\320\262_\321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\321\226\320\271.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\264\320\260\320\262\320\260\320\275\320\275\321\217_\320\262\320\273\320\260\321\201\320\275\320\270\321\205_\321\200\320\276\320\267\321\210\320\270\321\200\320\265\320\275\321\214_\320\262_\321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\321\226\320\271.md" new file mode 100644 index 00000000..2a712cc8 --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/05_\320\224\320\276\320\264\320\260\320\262\320\260\320\275\320\275\321\217_\320\262\320\273\320\260\321\201\320\275\320\270\321\205_\321\200\320\276\320\267\321\210\320\270\321\200\320\265\320\275\321\214_\320\262_\321\200\320\265\320\277\320\276\320\267\320\270\321\202\320\276\321\200\321\226\320\271.md" @@ -0,0 +1,85 @@ +Існує можливість додати в репозиторій свої власні компоненти для швидкої установки. +** Додані компоненти будуть доступні тільки вам. Додавання в офіційний репозиторій проводиться вручну розробниками cms** + +## Навіщо мені додавати свої компоненти? ## +- Економія часу - зробивши один раз дистрибутив для установки, ви зможете ставити його в 1 клік на будь-якому сайті +- Порядок - ви завжди будете мати доступ до дистрибутиву, де б не знаходилися і який би сайт не розробляли + +## Приклад: додавання свого сніпета ## + +Припустимо, ви хочете додати свій сніпет під назвою myFavoriteSnippet. + +1. Створіть файл Snippet.myFavoriteSnippet.tpl +2. Модифікуйте код файлу наступним чином: +```php +/** +* myFavoriteSnippet +* +* Опис мого сніпета +* +* @author Автор +* @category Мої сніпети +* @version 1 +*/ +``` +3. Тепер потрібно створити папку. Ім'я довільне, але бажано уникати прогалин, спецсимволів, російських і українських літер. + +Всередині папки створіть структуру install/assets/snippets/ + +3. Скопіюйте Snippet.myFavoriteSnippet.TPL в папку snippets. + +4. Створіть zip-архів папки. + +Ви можете не робити архів, а просто помістити дистрибутив на github. У цьому випадку пункт 5 вам не потрібен - github сам сформує посилання на архів. + +5. Архів потрібно помістити в інтернет. + +6. Зайдіть в [репозиторій](http://extras.evolution-cms.com/my-repo/add-package.html), додайте цей архів у свій особистий репозиторій кнопкою "Add package". + +7. При авторизації в репозиторії всередині панелі адміністрування ви зможете встановлювати цей сніпет в один клік на будь-якому сайті. + +## ТВ, плагіни, модулі, Чанки ## +Точно таким же чином ви можете створювати компоненти для швидкої установки чанків, модулів, плагінів і створення ТВ-параметрів. + +### Створення ТВ-параметра ### +Створіть файл sitemap_priority.tpl де sitemap_priority - назва майбутнього параметра + +Помістіть його в папку install/assets/tvs/ +Для модулів це буде папка modules, плагінів - plugins, чанков - chunks. + +Код: +``` + /** + * sitemap_priority + * + * Для мапи сайта + * + * @category Категорія + * @name sitemap_priority + * @internal @caption Пріоритет сторінки + * @internal @input_type dropdown + * @internal @input_options 0.1||0.2||0.3||0.4||0.5||0.6||0.7||0.8||0.9||1 + * @internal @input_default 0.5 + * @internal @output_widget + * @internal @output_widget_params + * @internal @lock_tv 0 + * @internal @template_assignments * + * @internal @modx_category SEO + * @internal @installset sample + */ +``` + +## Створення документів ## + +На відміну від елементів, створення документів виглядає дещо інакше. +В корені папки install потрібно створити файл +```setup.data.sql``` + +Приблизний код створення нового ресурсу з ім'ям sitemap.xml, тип text/xml, вміст - виклик сніпета sitemap. + +``` +INSERT INTO `{PREFIX}site_content` (`type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `content`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`) VALUES +('document','text/xml','sitemap.xml','','','sitemap.xml','','1','0','0','0','0','','[[sitemap]]','0','0','7','1','1','1','1376384158','1','1377167369','0','0','0','1376384158','1','','0','0','0','0','1'); +``` + +Поля в цьому запиті відповідають полям в таблиці site_content. diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/index.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/index.md" new file mode 100644 index 00000000..8b423793 --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/01_\320\243\321\200\320\276\320\272\320\270/index.md" @@ -0,0 +1,90 @@ +Для тих хто тільки знайомиться з Evolution, рекомендуємо пройтися по посиланнях нижче. + +### Відеоуроки по створенню сайту на Evolution CMS + +* [Уроки Evolution CMS від Dmi3yy](https://www.youtube.com/watch?v=3YNPqkBUjO0&list=PLKTHZGrYLdtpuzPA14WaSt5krBaG72UlK) +* [Створення сайту](http://vimeo.com/29422796) +* [Шаблонізація](http://www.youtube.com/watch?v=WDBsCL9Xfx8) + +### Відео уроки з каналу Андрія Казуніна + +* [001\. Встановлення Modx Evolution на хостинг «Джино»](https://www.youtube.com/watch?v=28zlVnBOg5o " 001\. Встановлення Evolution на хостинг «Джино»") +* [002\. Початкове налаштування Modx Evolution](https://www.youtube.com/watch?v=FilCWYsiol8 " 002\. Початкове налаштування Modx Evolution") +* [003\. Ставимо шаблон сайту на систему управління Modx Evolution. Трохи DocLister'а](https://www.youtube.com/watch?v=WMzhayH_LMo "003\. Ставимо шаблон сайту на систему управління Modx Evolution. Трохи DocLister'а") +* [004\. Шаблонізация сайту. Сніпети, плагіни і модулі в Modx Evolution](https://www.youtube.com/watch?v=UU9p3LjVvGQ "004\. Шаблонізация сайту. Сніпети, плагіни і модулі в Modx Evolution") +* [005\. Шаблон сайту. Галерея Fancybox і Modx Evolution](https://www.youtube.com/watch?v=Q4K_FGuNAhI " 005\. Шаблон сайту. Галерея Fancybox і Modx Evolution") +* [006\. Шаблон сайту. Робимо FAQ і текстову сторінку на Modx Evolution](https://www.youtube.com/watch?v=DlTqvgjehQk "006\. Шаблон сайту. Робимо FAQ і текстову сторінку на Modx Evolution") +* [007\. Шаблон сайту. Робимо блог на Modx Evolution](https://www.youtube.com/watch?v=_fSxCXCG2SE "007\. Шаблон сайту. Робимо блог на Modx Evolution") +* [008\. Аякс-коментарі. Робимо блог на Modx Evolution](https://www.youtube.com/watch?v=yr7i-NlHnKc "008\. Аякс-коментарі. Робимо блог на Modx Evolution") +* [009\. Теги в блозі на Modx Evolution](https://www.youtube.com/watch?v=uoKdcGPrChI "009\. Теги в блозі на Modx Evolution") +* [010\. МАГАЗИН на Evolution. Shopkeeper, купівля товарів і кошик](https://www.youtube.com/watch?v=I1cdHKM9cRA "010\. МАГАЗИН на Evolution. Shopkeeper, покупка товарів і кошик") +* [011\. МАГАЗИН на Evolution. Форма відправки повідомлень на eForm. Базікаємо про FormLister](https://www.youtube.com/watch?v=-MdV0XNsJhU "011\. МАГАЗИН на Evolution. Форма відправки повідомлень на eForm. Базікаємо про FormLister") +* [012\. МАГАЗИН на Evolution. Shopkeeper-відправка замовлення](https://www.youtube.com/watch?v=xjIRHf6RAV0 "012\. МАГАЗИН на Evolution. Shopkeeper-відправка замовлення") +* [013\. Оновлення Modx Evolution. Прощавай Modx, Привіт Evo](https://www.youtube.com/watch?v=jp6-SsMD9kE "013\. Оновлення Modx Evolution. Прощавай Modx, Привіт Evo") +* [014\. Створюємо свій тип ТВ-параметра в EvolutionCMS(modx)](https://www.youtube.com/watch?v=JCmRU0r_Ago "014\. Створюємо свій тип ТВ-параметра в EvolutionCMS(modx)") +* [015\. Як в DocLister працювати зі своєю таблицею mysql](https://www.youtube.com/watch?v=pH2MnVJE2do "015\. Як в DocLister працювати зі своєю таблицею mysql") +* [016\. Доповнення eFilter (частина 1). Як зробити фасетний фільтр товарів в Evolution CMS](https://www.youtube.com/watch?v=vPiA4KqxuH4 "016\. Доповнення eFilter (частина 1). Як зробити фасетний фільтр товарів в Evolution CMS") +* [017\. Доповнення eFilter (частина 2). Правимо зовнішній вигляд фільтрів.](https://www.youtube.com/watch?v=F3moUvS0Bgk "017\. Доповнення eFilter (частина 2). Правимо зовнішній вигляд фільтрів.") + +### Уроки з сайту Я--гу.ру + +* [Вступ - Сайт за один день? Це реально!](http://i--gu.ru/vstuplenie "Сайт за один день? Це реально!") +* [Урок 1 - Установка локального сервера XAMPP](http://i--gu.ru/urok-1 "Установка локального сервера XAMPP") +* [Урок 2 - Установка MODx Evolution](http://i--gu.ru/urok-2 "Установка MODx Evolution") +* [Урок 3 - знайомство з MODx Evolution](http://i--gu.ru/urok-3 "Знайомство з MODx Evolution") +* [Урок 4 - Інтеграція шаблону в MODx. Розбиття на чанки](http://i--gu.ru/urok-4 "Інтеграція шаблону в MODx. Розбиття на чанки") +* [Урок 5 - Створення динамічного меню в MODx](http://i--gu.ru/urok-5 "Створення динамічного меню в MODx") +* [Урок 6 - змінюємо шапку сайту, чанк HEADER](http://i--gu.ru/urok-6 "Змінюємо шапку сайту, чанк HEADER") +* [Урок 7 - Редагуємо чанк COLUMN](http://i--gu.ru/urok-7 "Редагуємо чанк COLUMN") +* [Урок 8 - Редагуємо чанк WRAPPER і FOOTER](http://i--gu.ru/urok-8 "Редагуємо чанк WRAPPER і FOOTER") +* [Урок 9 - Виводимо галерею за допомогою сніпета Ditto](http://i--gu.ru/urok-9 "Виводимо галерею за допомогою сніпета Ditto") +* [Урок 10 - Робимо новинну стрічку](http://i--gu.ru/urok-10 "Робимо новинну стрічку") +* [Урок 11 - Налаштовуємо блог. Система коментарів DISQUS](http://i--gu.ru/urok-11 "Налаштовуємо блог. Система коментарів DISQUS") +* [Урок 12 - Форма зворотного зв'язку. Сніпет eForm](http://i--gu.ru/urok-12 "Форма зворотного зв'язку. Сніпет eForm") +* [Урок 13 - Перенесення сайту на хостинг](http://i--gu.ru/urok-13 "Перенесення сайту на хостинг") +* [Висновок - Загальні підсумки курсу . Подальші рекомендації.](http://i--gu.ru/zaklyuchenie "Загальні підсумки курсу. Подальші рекомендації.") +* [Shopkeeper - інтернет-магазин на MODx](http://i--gu.ru/shopkeeper "Інтернет-магазин на MODx") +* [phpBB і MODxBB - встановлюємо форум на MODx Evolution](http://i--gu.ru/phpbb-i-modxbb "Встановлюємо форум на MODx Evolution") +* [ManagerWelcome - змінюємо зовнішній вигляд адміністративної панелі](http://i--gu.ru/managerwelcome "Змінюємо зовнішній вигляд адміністративної панелі") +* [Сортування документів - Ditto і екстендер request](http://i--gu.ru/sortirovka-ditto "Ditto і екстендер request") +* [Корисні посилання-модулі, плагіни, сніпети](http://i--gu.ru/poleznyie-ssyilki "Модулі, плагіни, сніпети") +* [Запитували? Відповідаємо - Відповіді на поширені питання по MODx Evolution](http://i--gu.ru/sprashivali-otvechaem "Відповіді на поширені питання по MODx Evolution") + +### Уроки по створенню сайту від Віктора Єфімова + +* [Урок 1 - Вступний](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-urok1.html "Інструкція по створенню сайту на MODx. Урок 1-Вступний") +* [Урок 2 - Встановлення MODx CMS](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-urok-2.html "Інструкція по створенню сайту на MODx. Урок 2-Встановлення MODx CMS") +* [Урок 3 - Початкове налаштування системи](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-na-modx-3.html "Інструкція по створенню сайту на MODx. Урок 3-Початкове налаштування системи") +* [Урок 4 - Інтеграція дизайну в систему управління](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-na-modx-urok-4.html "Інтеграція дизайну в систему управління") +* [Урок 5 - Налаштування шаблону, розбиття на чанки](http://efimov.ws/main/develop/modx/instrukcziya-po-sozdaniyu-sajta-na-modx-urok-5.html "Налаштування шаблону, розбиття на чанки") +* [Урок 6 - Дерево документів і створення сторінок](http://efimov.ws/main/develop/modx/sajt-na-modxsozdanie-stranicz.html "Дерево документів і створення сторінок") +* [Урок 7 - Реалізація динамічного меню](http://efimov.ws/main/develop/modx/menu-wayfinder-MODx.html "Реалізація динамічного меню") +* [Урок 8 - Створення шаблонів і виведення вмісту сторінок](http://efimov.ws/main/develop/modx/instrukcziya-MODx-urok-8.html "Створення шаблонів і виведення вмісту сторінок") +* [Урок 9 - Робота зі спеціальними тегами MODx](http://efimov.ws/main/develop/modx/tags-MODx.html "Робота зі спеціальними тегами MODx") +* [Урок 10 - Робота з візуальним редактором в MODx](http://efimov.ws/main/develop/modx/tinymce-set-modx.html "Робота з візуальним редактором в MODx") +* [Урок 11 - Реалізація ланцюжка навігації "Хлібні крихти"](http://efimov.ws/main/develop/modx/breadcrumbs-MODx.html "Реалізація ланцюжка навігації \"Хлібні крихти\". Сніпет Breadcrumbs") +* [Урок 12 - Створення стрічки новин. Сніпет Ditto](http://efimov.ws/main/develop/modx/ditto-modx-newsline.html "Створення стрічки новин. Сніпет Ditto") +* [Урок 13 - Посторінкове розбиття новинної стрічки](http://efimov.ws/main/develop/modx/MODx-pagination-Ditto.html "Урок 13 - Посторінкове розбиття новинної стрічки") +* [Урок 14 - TV параметри MODx. Додавання зображень ресурсам](http://efimov.ws/main/develop/modx/MODx-TV-parametrs.html "Урок 14 - TV параметри MODx. Додавання зображень ресурсам") +* [Урок 15 - Форма зворотного зв'язку в MODx. Сніпет eForm](http://efimov.ws/main/develop/modx/eForm-MODx.html "Урок 15 - Форма зворотного зв'язку в MODx. Сніпет eForm") +* [Урок 16 - Реалізація допоміжного меню на сторінці](http://efimov.ws/main/develop/modx/modx-wayfinder.html "Урок 16 - Реалізація допоміжного меню на сторінці") +* [Урок 17 - Висновок слайд-шоу на головній сторінці за допомогою сніпета Ditto](http://efimov.ws/main/develop/modx/jQuery-gallery-with-MODx.html "Урок 17 - Висновок слайд-шоу на головній сторінці за допомогою сніпета Ditto") +* [Урок 18 - Виведення ключових слів в MODx](http://efimov.ws/main/develop/modx/meta-tags-keywords-modx.html "Урок 18 - Виведення ключових слів в MODx") +* [Урок 19 - Організація пошуку по сайту. Сніпет AjaxSearch](http://efimov.ws/main/develop/modx/snippet-ajaxsearch-modx-poisk.html "Урок 19 - Організація пошуку по сайту. Сніпет AjaxSearch") +* [Урок 19.1 - Виведення зображення, прикріпленого за допомогою TV параметра, в результатах пошуку AjaxSearch](http://efimov.ws/main/develop/modx/img-tv-parametrs-ajaxsearch.html "Урок 19.1 - Виведення зображення, прикріпленого за допомогою TV параметра, в результатах пошуку AjaxSearch") +* [Урок 20 - Карта сайту для відвідувачів і пошукових машин](http://efimov.ws/main/develop/modx/sitemap-for-modx-xml.html "Урок 20 - Карта сайту для відвідувачів і пошукових машин") +* [Урок 21 - Реалізація галереї зображень](http://efimov.ws/main/develop/modx/gallery-modx.html "Урок 21-Реалізація галереї зображень") +* [Урок 22 - Перенесення готового MODx сайту на хостинг](http://efimov.ws/main/develop/modx/hosting-modx.html "Урок 22 - Перенесення готового MODx сайту на хостинг") +* [Урок 23 - Завантажити готовий MODx сайт, відповідний веб-стандартам](http://efimov.ws/main/develop/modx/skachat-gotovyij-modx-sajt.html "Урок 23 - Завантажити готовий MODx сайт, відповідний веб-стандартам") + +### Уроки по створенню блогу від Віктора Єфімова + +* [Вступний урок](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-vstuplenie.html "Вступний урок зі створення блогу на MODx") +* [Урок 1\. Встановлення і первісна настройка системи управління](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-ustanovka.html "Встановлення і первісна настройка системи управління") +* [Урок 2\. Інтеграція дизайну в систему управління](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-iintegracziya-dizajna-v-modx.html "Урок 2\. Інтеграція дизайну в систему управління") +* [Урок 3\. Реалізація навігації та робота зі спеціальними тегами MODx](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-menu-i-tegi-modx.html "Урок 3\. Реалізація навігації та робота зі спеціальними тегами MODx") +* [Урок 4\. Висновок анонсів заміток на сторінках категорій](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-urok-4.html "Виведення анонсів заміток на сторінках категорій") +* [Урок 5\. Оформлення правої колонки: хмара тегів, випадкові замітки](http://efimov.ws/main/develop/modx/modx-urok-oblako-tegov-sluchajnie-zametki.html "Урок 5\. Оформлення правої колонки: хмара тегів, випадкові замітки") +* [Урок 6\. Пошук по сайту, контактна форма, XML і HTML карти, RSS розсилка](http://efimov.ws/main/develop/modx/modx-blog-sitemap-forma-poisk.html "Створення блогу на MODx. Урок 6 - Пошук по сайту, контактна форма, XML і HTML карти, RSS розсилка") +* [Урок 7\. Оформлення внутрішніх сторінок блогу і підключення коментарів](http://efimov.ws/main/develop/modx/modx-blog-comments-page-inside.html "Створення блогу на MODx. Урок 7 - Оформлення внутрішніх сторінок блогу і підключення коментарів") +* [Урок 8\. Усунення дублювання контенту, оформлення футера та інші налаштування](http://efimov.ws/main/develop/modx/sozdanie-bloga-na-modx-urok-8.html "Створення блогу на MODx. Урок 8 - Усунення дублювання контенту, оформлення футера та інші налаштування") diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/01_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262_MODx_\320\267\320\260_\320\264\320\260\320\275\320\270\320\274\320\270_\321\204\320\276\321\200\320\274\320\270_eForm_\320\267\320\260\321\201\321\202\320\260\321\200\321\226\320\273\320\270\320\271_\320\274\320\265\321\202\320\276\320\264.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/01_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262_MODx_\320\267\320\260_\320\264\320\260\320\275\320\270\320\274\320\270_\321\204\320\276\321\200\320\274\320\270_eForm_\320\267\320\260\321\201\321\202\320\260\321\200\321\226\320\273\320\270\320\271_\320\274\320\265\321\202\320\276\320\264.md" new file mode 100644 index 00000000..23e95d80 --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/01_\320\241\321\202\320\262\320\276\321\200\320\265\320\275\320\275\321\217_\320\264\320\276\320\272\321\203\320\274\320\265\320\275\321\202\321\226\320\262_MODx_\320\267\320\260_\320\264\320\260\320\275\320\270\320\274\320\270_\321\204\320\276\321\200\320\274\320\270_eForm_\320\267\320\260\321\201\321\202\320\260\321\200\321\226\320\273\320\270\320\271_\320\274\320\265\321\202\320\276\320\264.md" @@ -0,0 +1,100 @@ +**Це застарілий метод. Рекомендуємо для створення документів використовувати сніпет FormLister, або замінити в сніпеті виклики функцій на методи бібліотеки MODx Api. ** + +Однак, як приклад роботи з сніпетами і подіями eForm, це рішення дуже добре підходить. + +Для операцій з документами будемо використовувати спеціальну бібліотеку docmanager. Встановлюємо її в папку `assets/libs/docmanager`. + +### Створюємо форму + +Форма створюється за допомогою стандартного сніпета eForm. У нього вбудовані всі необхідні перевірки полів, а також можливість відправити нам лист про додавання нового матеріалу. + +Для прикладу зробимо таку форму в чанку Anketa: +``` +

    [+validationmessage+]

    +
    + +


    +


    +


    +
    + Правильно: "http://www.modx-cms.ru". Неправильно: "www.modx-cms.ru"

    Назва *
    +
    Аннотація *
    +

    Текст статті
    +

    +

    +
    + ``` + +### Виклик форми на сайті + +Для показу форми можна використовувати наступний виклик: +``` +[!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` +``` diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\321\226\320\262_\320\276\321\202\321\200\320\270\320\274\320\260\321\202\320\270_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\321\226.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\321\226\320\262_\320\276\321\202\321\200\320\270\320\274\320\260\321\202\320\270_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\321\226.md" new file mode 100644 index 00000000..6bc21770 --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/02_6_\321\201\320\277\320\276\321\201\320\276\320\261\321\226\320\262_\320\276\321\202\321\200\320\270\320\274\320\260\321\202\320\270_TV_\320\262_\320\277\320\273\320\260\320\263\320\270\320\275\321\226.md" @@ -0,0 +1,42 @@ +``` +$out=''; +//За допомогою DBAPI +$id = $modx->event->params['id']; +$tvid = $modx->db->getValue('select id from '.$modx->getFullTableName('site_tmplvars').' where name = "images"'); +$images = $_POST['tv'.$tvid]; + + +$out.='Image from DB - '.$tv.'
    '; + +//З POST +$out.='Image from POST - '.$_POST['tv26'].'
    '; + +//З Global +global $tmplvars; +$out.='Image from tmplvars - '.$tmplvars[26][1].'
    '; + +//За допомогою API через getTemplateVar и getTemplateVarOutput +$tvtv = $modx->getTemplateVar('images','*',$id); +$out.='Image whith out getTemplateVar - '.$tvtv['value'].'
    '; + +$tvtvo =$modx->getTemplateVarOutput('images',$id); +$out.='Image whith out getTemplateVarOutput - '.$tvtvo['images'].'
    '; + +//Через встановлення плейсхолдера +$modx->setPlaceholder('tvsp',$_POST['tv26']); +$out.='Image from placeholder - '.$modx->getPlaceholder('tvsp').'
    '; + +//За допомогою MODxAPI +include_once(MODX_BASE_PATH.'assets/lib/MODxAPI/modResource.php'); +$doc = new modResource($modx); +$im = $doc->edit($id)->get('images'); +$out.='Image from modResourse - '.$im.'
    '; + +//Через DocLister +$dl_images = $modx->runSnippet('DocLister',array('documents'=>$id,'tvPrefix'=>'','tvList'=>'images','tpl'=>'@CODE: [+images+]')); +$out.='Images from DocLister - '.$dl_images; + +echo $out; +exit(); +``` +![Вивід](https://github.com/mediakot/docs/blob/master/ru/images/gettv.jpg) diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/index.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/index.md" new file mode 100644 index 00000000..2bcbc5b1 --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/02_\320\240\321\226\321\210\320\265\320\275\320\275\321\217/index.md" @@ -0,0 +1 @@ +Різні вирішення конкретних завдань, які можна використовувати на своїх сайтах. \ No newline at end of file diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/03_\320\237\320\276\321\201\320\270\320\273\320\260\320\275\320\275\321\217/index.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/03_\320\237\320\276\321\201\320\270\320\273\320\260\320\275\320\275\321\217/index.md" new file mode 100644 index 00000000..e1778c4c --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/03_\320\237\320\276\321\201\320\270\320\273\320\260\320\275\320\275\321\217/index.md" @@ -0,0 +1,8 @@ +Корисні посилання +------------------------- + +[MODX.im](http://modx.im) - Спільнота по MODX + +[code.divandesign.ru](http://code.divandesign.ru) - Репозиторій студії "Диван.Дизайн". + +[Telegram](https://t.me/evolutioncms) - канал Evolution CMS в Телеграм diff --git "a/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/index.md" "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/index.md" new file mode 100644 index 00000000..63a3a6bd --- /dev/null +++ "b/ua/05_\320\235\320\260\320\262\321\207\320\260\320\275\320\275\321\217/index.md" @@ -0,0 +1 @@ +Тут поки немає потрібної інформації \ No newline at end of file diff --git a/ua/CONTRIBUTING.md b/ua/CONTRIBUTING.md new file mode 100644 index 00000000..8b5058ef --- /dev/null +++ b/ua/CONTRIBUTING.md @@ -0,0 +1,7 @@ +# Як внести свій вклад + +1. Для початку у вас має бути акаунт на GitHub, якщо немає - [то його дуже просто зробити](https://github.com/join). +2. Зробити форк цього проекта собі, натиснувши кнопку "Fork" праворуч вгорі. +3. Клонувати репозиторій до себе на диск і працювати з ним локально, як і всі (якщо ви розробник) +4. Якщо ви не розробник, то можете просто відредагувати файли *.md прямо на GitHub. +5. Коли ви все зробите, вам треба [зробити "Pull Request"](https://help.github.com/articles/creating-a-pull-request) і відправити ваші зміни в цей репозиторій. \ No newline at end of file diff --git a/ua/README.md b/ua/README.md new file mode 100644 index 00000000..075194e6 --- /dev/null +++ b/ua/README.md @@ -0,0 +1,8 @@ +Evolution CMS Docs +========= + +Документація по Evolution CMS + +Розробка мануала спільно через pull-requests + issues. + +Автоматичний білд після вливання в майстер на сайт. diff --git a/ua/images/gettv.jpg b/ua/images/gettv.jpg new file mode 100644 index 00000000..d683b954 Binary files /dev/null and b/ua/images/gettv.jpg differ diff --git a/ua/index.md b/ua/index.md new file mode 100644 index 00000000..1ffa8d7f --- /dev/null +++ b/ua/index.md @@ -0,0 +1,12 @@ +# Документація по Evolution CMS + +*Evolution CMS — це професійний інструмент розробки сайтів, що дозволяє управляти контентом (та й самим сайтом) абсолютно на всі 100%! Ця система з відкритим кодом (open source), і тому безкоштовна. На відміну від більшості безкоштовних CMS, на Evolution ви можете побудувати сайт будь-якої складності, практично з будь-яким набором функцій, при цьому система не буде жодним чином впливати на ваш html-код.* + + + +## Як внести свій вклад +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) і відправити ваші зміни в цей репозиторій.