[PayAndSee] - Версия 2.0

[PayAndSee] — реализует закрытый контент на MODX Revolution. Создание контента и тарифов, клиентов и подписок на контент, подписка на контент через оплату любым методом [miniShop2], а так же через в админку сайта.

Особенности:
  • работа только с новым miniShop2 (version =>2.4.0-beta2)
  • сниппет для вывода контента pas.content
  • сниппет оформления заказа pas.order
  • сниппет вывода оформленного заказа pas.get.order
  • сниппет вывода подписок pas.subscription
Все сниппеты компонента работают при помощи [pdoTools] и рассчитывают на использование [Fenom] в чанках.
Подписка возможна на любой ресурс, товар, тикет и тд.

Демо: PayAndSee
Доки: Документация PayAndSee
Обзор: Обзор компонента PayAndSee от OpenModx



[Установка]
Для работы вам нужен MODX не ниже 2.3 и PHP не ниже 5.4.
— Установите pdoTools — это библиотека для быстрой работы с БД и оформлением, необходима для многих компонентов
— Установите miniShop2 — это магазин на основе которого реализован функционал заказов и оплаты
— Установите Theme.Bootstrap — это тема оформления Twitter Bootstrap для MODX, под неё заточены стандартные чанки
— Установите PayAndSee

[Обновление]
Компонент полностью переписан,ни о каком обновлении со старой версии не может быть и речи.
У кого стоит предыдущая версия, деинсталлируем и устанавливаем/ настраиваем новую.

[Основное]
Основная панель управления находятся в отдельном разделе сайта, доступном через меню.
Содержит следующие вкладки:

[Контент]
Вкладка, на которой собран контент. Доступна сортировка по статусу контента и поиск.

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

[Тарифы]
Вкладка, на которой собраны тарифы контента. Доступна сортировка по контенту, сроку действия тарифа и поиск.

Для создании тарифа необходимо указать стоимость, контент к которому он будет привязан и срок подписки.

[Клиенты]
Вкладка, на которой собраны клиенты. Доступна сортировка по статусу и поиск.

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

[Подписки]
Вкладка, на которой собраны подписки. Доступна сортировка по клиенту, контенту, статусу и поиск.

Для создании подписки необходимо выбрать контент и пользователя сайта. Указать дату начала и окончания подписки.
Доступен для редактирования контент, клиент, статус подписки. Можно скорректировать срок подписки.

[Статусы]
Вкладка, на которой собраны статусы. Доступна сортировка по классу.

Для создании статусы необходимо задать название и выбрать класс. Указать флаг активности и разрешения.
Дефолтные статусы:

* новый — задается при создании
* активен — характеризует активность
* неактивен — характеризует неактивность

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

[Оповещения]
Вкладка, на которой собраны оповещения. Доступна сортировка по классу и поиск.

Оповещение срабатывает в момент смены статуса сущности.
Для создании оповещения необходимо указать класс и статус. Задать почту, тему и тело сообщения.

Для каждой сущности определены методы getClientEmails и getManagerEmails
Результат набивается в переменные:

* $client_email — почта клиента
* $manager_email — почта менеджера

Таким образом вы можете просто указать $client_email|join и для сущности клиент это будет почта клиента, для сущности контент это будет почта всех клиентов с активной подпиской на данный контент и тп.

[Настройки]
Настройки PayAndSee расположены в Системные настройки > PayAndSee

[Основные]
Содержит основные настройки:

* working_templates — активные шаблоны. Список id шаблонов через запятую, для которых нужно активировать функционал.
* front_css — файл с css для подключения на фронте.
* front_js — файл с javascript для подключения на фронте.
* client_groups — группы регистрации клиентов, через запятую.
* email_manager — почтовые адреса менеджеров, через запятую.

[Заказ]
Содержит настройки необходимые для заказа:

* order_handler_class — имя класса, который реализует логику оформления заказа.
* order_delivery_id — идентификатор способа доставки [miniShop2], который используется при оформлении заказа.
* order_resource_id — идентификатор страницы заказа, на которой происходит оформление заказа.

[Службы]
Покупка и оформление заказа реализовано своим классом, в конечном счете заказ будет
сформирован и его можно будет увидеть в интерфейсе заказов [miniShop2]


[Заказ]
Процессом оформления заказа занимается специальный класс PasOrderHandler, который реализует интерфейс PasOrderInterface.
Конечно, вы можете подключить собственный класс для заказа и указать его в системной настройке order_handler_class

[Корзина]
Не реализован.

[Доставка]
Никак не используется, нужен только для задания обязательный полей заказа и наименования доставки в заказе.

[Оплата]
Стандартный [miniShop2]

Пример оформления и покупки можно увидеть тут pas.vgrish.ru/kupit.html?content=1

[События]
Актуальный список доступен в документации docs.modx.pro/components/payandsee/development/events

[Доступ]
Доступ определяется наличием разрешающих статусов у [контент], [клиента], [подписки]
Подписка также имеет дату начала/окончания действия что тоже учитывается при определении доступа.

Для проверки доступа добавлены два модификатора:

* pas_content_access — проверка доступа к контенту. Синоним pascaccess
* pas_resource_access — проверка доступа к ресурсу. Синоним pasraccess

1 параметр — значение по дефолту
2 параметр — идентификатор контента / ресурса. По умолчанию текущий ресурс.
3 параметр — идентификатор клиента. По умолчанию текущий клиент.

[Примеры]

— Закрыть свободный доступ для поля content
{$content|pasraccess}

— Закрыть свободный доступ для поля content и вывести форму покупки платного контента
{$content|pasraccess:('pas.content'|snippet:['resource'=>$id])}

— Проверить наличие доступа у текущего клиента к ресурсу 15 и записать в переменную
{set $access = 1|pasraccess:0:15}

{* далее можно использовать для проверки доступа переменную $access *}

{if $access}
Есть доступ
{else}
Нет доступа
{/if}

[Демо сайт]
Доступен демо сайт pas.vgrish.ru
Логин и пароль для входа в test

[Цена]
[PayAndSee] теперь стоит 1490 рублей. Старые покупатели получают новую версию бесплатно.
Компонент в магазине modstore.pro/packages/ecommerce/payandsee

P.S. Всем спасибо за внимание!)
Володя
30 августа 2017, 08:09
modx.pro
2
4 445
+6
Поблагодарить автора Отправить деньги

Комментарии: 51

Владимир
30 августа 2017, 11:52
0
Ааааааа!!! Бегу обновлять, как раз ждал. Спасибо.
    Володя
    30 августа 2017, 11:59
    0
    Пожалуйста!)
    Василий Столейков
    30 августа 2017, 11:54
    0
    Здорово, спасибо!
    А вопрос: можно с помощью этого пакета реализовать платную подписку на услуги, и потом проверять их по всему сайту? В прошлой версии я делал это костылями, подписывал на скрытый ресурс, и потом отдельным сниппетом проверял по базе подписан на него пользователь или нет.
    Пример такой реализации: подписка на Премиум-аккаунт, открывающий различные возможности на сайте.
      Володя
      30 августа 2017, 12:02
      0
      а почему нет? Можно вполне, реализаций может быть несколько.
      Пример для VIP клиента имеющего доступ ко всему контенту сразу github.com/vgrish/Docs-1/blob/master/ru/01_%D0%9A%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B/22_PayAndSee/03_%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/03_%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%B8%D1%8F.md
      реализуется просто отдельным статусом
        Василий Столейков
        30 августа 2017, 12:09
        0
        Супер, да, пример проверки доступа даже в последнем примере описан.
        Спасибо, будем осторожно обновляться…
          Володя
          30 августа 2017, 12:13
          0
          Спасибо, будем осторожно обновляться…
          Не, не… обновление не прокатит! Только с нуля.
          Сейчас добавлю это в описание.
            Василий Столейков
            30 августа 2017, 12:16
            1
            0
            Ок, я так и думал. Просто вводит в заблуждение эта фраза:
            Старые покупатели обновляются бесплатно.
            :)
              Володя
              30 августа 2017, 12:18
              +2
              уже понял, тоже поправил чтобы не вводить в заблуждение.
              Спасибо!
                Владимир
                30 августа 2017, 12:26
                0
                А старый компонент еще таблицы свои не удалял, я зачистил вручную перед установкой нового (если, конечно, это не лишняя перестраховка).
                  Володя
                  30 августа 2017, 12:41
                  +1
                  (если, конечно, это не лишняя перестраховка).
                  Вполне разумно если эти данные тебе не нужны
      Прохор
      30 августа 2017, 20:43
      0
      Здравствуйте Владимир! Есть ли какая то статейка или гайд как правильно съехать со старого компонента на новый? Пользуемся старым компонентом с 6000 подписанных юзеров. Трудозатратно ли обновится на новый?
        Володя
        30 августа 2017, 21:30
        0
        Добрый вечер. Нет никакого подобного гайда нет.
        Необходимо выполнение следующих условий
        — новая версия minishop2
        — шаблонизатор fenon
        Далее установить новую версию компонента.
        Клиенты могут быть созданы в главной панели, надо просто нажать на кнопку обновления. А вот контент и подписки потребуется набросать скрипт для переноса из старых таблиц в новые.
        Так же нужно будет изменить чанки вывода и покупки подписок.
        Вероятно проще сделать бекап сайта и все это спокойно выполнить на нем…
          Прохор
          31 августа 2017, 09:11
          0
          Если в доках будет небольшая инструкция по переезду это облегчит жизнь) Спасибо за компонент!
            Володя
            31 августа 2017, 10:13
            0
            Пока что мне этого не приходилось делать. А писать просто теоретически нет никакого желания. Если представится такой случай то инструкция появится.
            Спасибо за понимание!
        Алексей Федоров
        01 сентября 2017, 15:57
        +1
        Спасибо! Удалил, установил, пошел читать доки, а то, вроде, следил за процессом в трелло, но выход новой версии стал неожиданностью)) Приятной, конечно.
          Володя
          01 сентября 2017, 16:13
          0
          Пожалуйста!)
          Сергей
          03 сентября 2017, 05:44
          -1
          Мдя, знал бы не обновлял.
          В описании ни чего не написано, что все глобально переделывать надо.
          И поддержки нет (
            Илья Уткин
            03 сентября 2017, 07:41
            0
            То есть, по этой фразе было непонятно, что «всё глобально переделывать надо»?

            [Обновление]
            Компонент полностью переписан, ни о каком обновлении со старой версии не может быть и речи.
            У кого стоит предыдущая версия, деинсталлируем и устанавливаем/ настраиваем новую.
              Сергей
              03 сентября 2017, 07:58
              -1
              Не прочел это пояснение и обновил. Пришлось откат делать. И вероятно нужен будет скрипт писать на перенос. В принцыпе это новое дополнение. Не помню, чтоб после обновления нужно было глобально все переписывать.
            Алексей Федоров
            11 сентября 2017, 15:51
            0
            Заметил, что появилась версия 2.0.6 и происходит что-то необычное) При обновлении пакет дублируется, при этом кнопка «обновить» остается активной. Думал, так и нужно, удалил не обновленный вариант, но перестала отображаться страница компонента (при переходе через меню). Выдает:
            Could not find action file at: controllers/default/index.php
            Опять установил версию 2.0.0, перезагрузил права доступа — все вернулось на круги своя. Удалил версию 2.0.6, снова попытался обновить, повторно два пакета висят. Опасаюсь чего-то испортить. Это нормально, так и должно быть?
              Володя
              11 сентября 2017, 15:58
              +1
              Заметил, что появилась версия 2.0.6 и происходит что-то необычное)

              это необычное никак не связано в пакетом. Обновляйте, чистите кеш…
              Опасаюсь чего-то испортить.
              Понятно что удалять ничего не надо.
              Это нормально, так и должно быть?
              нет конечно, это не нормально. Но я на данное поведение повлиять не могу.
              Возможно кто-то прояснит ситуацию…
                Алексей Федоров
                11 сентября 2017, 16:01
                0
                Тогда подожду пока) Кеш чистил. Из-за разницы в названии такого случиться не могло? В смысле, с указанием цены в скобках и без него?
                  Володя
                  11 сентября 2017, 16:06
                  +1
                  Из-за разницы в названии такого случиться не могло? В смысле, с указанием цены в скобках и без него?
                  я не пишу нигде никаких цен… название формируется с репозитория магазина.
                  Тогда подожду пока)

                  Попробуй деинсталируй все версии пакета и затем установи последнюю.
                    Алексей Федоров
                    11 сентября 2017, 16:16
                    0
                    Туплю(( Очевидное же решение. Да, так все получилось. Пакет один в установленных, работает все отлично
                      Володя
                      11 сентября 2017, 16:33
                      0
                      Хорошо что разобрались. Спасибо!
              Юрий Венедиктович
              16 октября 2017, 08:44
              0
              Володя привет, подскажи куда копать

              мне нужно ограничить список разделов в форме создания тикета
              т.е. вывести только те на которые есть активная подписка у пользователя
              пытаюсь это сделать указав в параметрах снипета ticketForm &where предварительно загрузив модель &loadModels=`payandsee`, не могу сообразить какие поля подцеплять
              ведь надо получить ид пользователя и выдернуть по его ид статус подписки
              а потом в select отобрать только с активным статусом

              подскажи в правильном ли направлении думаю
              заранее Спасибо!
                Володя
                16 октября 2017, 09:59
                0
                Привет.
                {'!TicketForm'|snippet:[
                'tplSectionRow' => '@INLINE <option value="{$id}" {$selected} {""|pasraccess:"disabled":$id}>{$pagetitle}</option>'
                ]}
                  Юрий Венедиктович
                  16 октября 2017, 13:03
                  0
                  Спасибо дружище.

                  уже второй день изучаю эти запросы голова кругом
                  поэтому забыл уточнить, что у меня 2 одинаковых раздела
                  в один подписываются в другой пишут
                  вот поэтому то я попросил помощи в том как можно организовать выборку и возможно ли это используя сниппет ticketForm
                  [[!TicketForm?
                      &parents=`7`
                      &loadModels=`payandsee`
                      &leftJoin=`{
                                  "contents":{
                                          "class" : "TicketsSection",
                                          "on" : "ticket.id = "(таблица payandsee_contents).resource",
                                          },
                  		"subscribe":{
                  				"class":"payandsee",
                  				"on" : " payandsee.client ="{$_modx->user.id}"
                  			}
                                  }`
                      &where=`{"subscribe.status.2"}`
                  ]]
                  вот как-то так я думаю

                  Спасибо за терпение :)
                    Володя
                    16 октября 2017, 13:33
                    0
                    Пожалуйста!
                    поэтому забыл уточнить...
                    Пишите в ТП с указанием доступов к админке сайта и ссылкой на форму вызова.
                    Так будет проще и понятнее.
                    Спасибо!
                      Юрий Венедиктович
                      16 октября 2017, 13:50
                      0
                      я покупал компонент в 15 году и тока сейчас он понадобился :), поэтому не могу написать в ТП
                      Володя
                      16 октября 2017, 17:29
                      0
                      просто приджойнить не получится, там много всего…
                      — таблица контента
                      — таблица клиента
                      — таблица подписок
                      — статусы ко всем этим сущностям
                      все это определяет наличие доступа.
                        Юрий Венедиктович
                        16 октября 2017, 18:00
                        0
                        да я уже смотрел все таблицы компонента payandsee
                        вроде даже понятна логика того что мне нужно но как реализовать не знаю, знаний не хватает
                        с джойнами то я бы еще справился но написать сниппет мне пока не под силу

                        в любом случае Спасибо дружище!
                  Володя
                  12 января 2018, 10:57
                  +3
                  Добавлена ссылка на обзор компонента PayAndSee от OpenModx.
                  От себя хочу сказать Modstore и OpenModx за обзор — большое спасибо!!!
                    Олег Захаров
                    04 февраля 2018, 02:53
                    1
                    0
                    Привет!
                    На сайте хотим сделать 3 варианта оплаты — за 1 урок, за конкретный месяц (в нем несколько уроков) и за годовой доступ ко всем урокам. 9 учебных месяцев в курсе. Как лучше логику отстроить.
                    Пока сообразил проверку через вложенные
                    {If} {else} {/if}
                    .
                    Подскажите как вывести форму оплаты за годовой доступ?
                    Пока сообразил так:
                    ...
                    {set $parrentmounth = $_modx->resource.parent}
                    {set $parrentmounthObject = $modx->getObject('modResource',$parrentmounth)}
                    {set $parrentyear = $parrentmounthObject ->get('parent')}
                    {set $accessyear = ''|pasraccess:0:$parrentyear}
                    {if !$accessyear}
                    	Вы можете оплатить курс за год по цене 
                    	<p class="bg-danger"> Оплатить доступ</p>
                    	{getContentId($parrentyear, 10, $cache)|pasraccess:('pas.content'|snippet:['resource'=>$parrentyear])}
                    {else}
                    	Год оплачен {$parrentyear}
                    {/if}
                    {set $accessmounth = $parrentmounth|pasraccess:0:$parrentmounth}
                    {if !$accessmounth}
                    	<pre class="alert alert-info">  
                    	Нет оплаты к курсу [[!pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`2`]] 
                    	</pre>
                    	<!--  как вывести форму оплаты за месяц? -->
                    	{getContentId($parrentmounth, 10, $cache)|pasraccess:('pas.content'|snippet:['resource'=>$parrentmounth])}
                    {else}
                    	<!-- для тестирования вывожу номера ресурсов -->
                    	У вас активная подписка ко всем урокам месяца ({$parrentmounth}) "[[!pdoField? &id=`[[*id]]` 		&field=`pagetitle` &top=`1` ]]" курса ({$parrentyear}) [[!pdoField? &id=`[[*id]]` &field=`pagetitle` &top=`2` ]]
                    {/if}
                    <!--смотрим доступ к уроку -->
                    {set $access = $_modx->resource.id|pasraccess:0}
                    <!--Если вообще никакого доступа нет то выводим форму оплаты за урок-->
                    {if !$access and !$accessmounth and !$accessyear}
                    	<p class="bg-danger"> Оплатить доступ</p>
                    	{$_modx->resource.content|pasraccess:('pas.content'|snippet:['resource'=>''])}
                    {else}
                    	<div id="lessonvideo" data-video-1080="тут полезный платный контент"></div>
                    {/if}
                    то есть вывод формы оплаты сделал так:
                    {getContentId($parrentyear, 10, $cache)|pasraccess:('pas.content'|snippet:['resource'=>$parrentyear])}
                    что значит параметр 10 сам не понял, взял из документации расширения, вроде сработало. Где лежит код функции getContentId?
                    Прикол в том что в 1 уроке все норм работает, а в следующих (входящем в месяц 1) не работает.
                    Контент и тарифы зада на годовой курс (он корневой ресурс), на месяцы (они включают в себя уроки) и на сами уроки.
                      Володя
                      04 февраля 2018, 10:13
                      +1
                      сам не понял
                      я из всего вышеизложенного ничего не понял, извини.
                        Олег Захаров
                        04 февраля 2018, 14:19
                        0
                        я понял почему в 1 уроке форма выводится а в остальных не выводились. Оказалось что я ресурсы оставил на другие уроки в статусе «Неопубликовано». Проставил везде опубликовано и все заработало.
                      Олег Захаров
                      04 февраля 2018, 03:07
                      0
                      и еще как можно сделать одно выпадающее окно выбора подписки для разных ресурсов (контентов)?
                      И как можно повесить на свою кнопку?
                        Олег Захаров
                        04 февраля 2018, 03:19
                        0
                        и еще вопрос не совсем понятно как работает настройка контента «Активен для потомков». Можно ли сделать логику что если оплатили доступ к родительскому ресурсу, то доступы к дочерним автоматически добавлялись (сделать бы доп. настройку для выбора схемы подчиненности?)?
                          Олег Захаров
                          04 февраля 2018, 04:57
                          0
                          Еще бы добавить возможность использовать тариф для разных контентов. А то когда много страниц — тяжело добавлять и менять вручную цены на десятки ресурсов. Было бы круто прописывать например переменную из clientconfig.
                            Володя
                            04 февраля 2018, 10:16
                            +1
                            Можно ли сделать логику что если оплатили доступ к родительскому ресурсу, то доступы к дочерним автоматически добавлялись (сделать бы доп. настройку для выбора схемы подчиненности?)?
                            docs.modx.pro/components/payandsee/development/extensions
                            написать кастомный
                            getResourceAccess
                              Олег Захаров
                              04 февраля 2018, 14:21
                              0
                              я посмотрел пример расширения. Сделал по своемому как в посте выше в выше и все заработало.
                              В описании расширения для примеров не указаны какие параметры задавать надо — где их посмотреть я не нашел. Можете документацию дополнить описанием параметров?
                              $cid = $PayAndSee->getContentId($rid, 10, $cache);
                              — вот тут второй параметр из документации — почему 10?
                              $access = $PayAndSee->getContentAccess($cid, $uid, $cache);
                              — я так понимаю этим способом можно присвоить доступ? $uid как подхватывается? Из примера не понял как он присваивается переменной, вроде задана пустая? Это id клиента (скорее всего) или пользователя?
                              $PayAndSee->addStore('access', $key, $access);
                              — это мы добавляем по ключу я так понимаю доступ?
                              $cache — что за переменная? Надо ее как-то задавать?
                              $PayAndSee->getStore('access', $key)) — это я так понимаю можно считать доступ к ресурсу для любого ресурса?
                                Олег Захаров
                                04 февраля 2018, 14:32
                                0
                                getPls — в каком виде данные получаются?
                                Извините, что вопросов много задаю :) PayAndSee супер вещь, но многое не понятно.
                            Володя
                            04 февраля 2018, 10:14
                            +1
                            и еще как можно сделать одно выпадающее окно выбора подписки для разных ресурсов (контентов)?
                            как тут pas.vgrish.ru/katalog/?

                            И как можно повесить на свою кнопку?
                            написать какой то обработчик на нажание своей кнопки.
                            Олег Захаров
                            04 февраля 2018, 15:02
                            0
                            Посмотрите пожалуйста пост выше — наверное не заметили — про Активен для потомков?
                              Володя
                              04 февраля 2018, 15:08
                              +1
                              там же и дан ответ — modx.pro/components/13202/#comment-93716
                              Олег не нужно бомбить тут вопросами, посмотри демо, почитай описание
                              docs.modx.pro/search?query=%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%B5%D0%BD+%D0%B4%D0%BB%D1%8F+%D0%BF%D0%BE%D1%82%D0%BE%D0%BC%D0%BA%D0%BE%D0%B2
                              подумай…
                              Так или иначе ответы на твои вопросы есть.
                              Спасибо!
                                Олег Захаров
                                04 февраля 2018, 18:08
                                0
                                Спасибо за обратную связь!
                                Вопрос сюда пишу потому что в других ветках вижу люди также делятся наработками.
                                Мне пришлось делать треххуровневый доступ с разными тарифами оплаты.
                                Несколько бессонных дней и ночей уже делаю сайт, многое не сразу стало понятно, но разобрался вроде. Ваше приложение очень крутое, сильно выручило!
                              Олег Захаров
                              12 февраля 2018, 11:13
                              0
                              Предлагаю добавить во вкладку Тарифы возможность указывать цену используя некий шаблонный тариф — который был бы не привязан только к одному контенту, а чтобы его можно было привязать к нескольким разным контентам. И если мне понадобилось поднять цену сразу для всех контентов. Это сильно упростит жизнь если нам вдруг надо будет везде поменять цену — меняем в одном месте, а не в сотне разных мест.
                              Или еще как вариант используя плейсхолдеры ClientConfig. Для этого надо добавить возможность прописывать их в поле цены — сейчас плейсхолдер ClientConfig туда не вставишь :).
                                Олег Захаров
                                07 марта 2018, 00:14
                                0
                                А что за изменения в новой версии?
                                2.0.12-beta (23.02.2018)
                                — Add «checkStat» [PayAndSee]
                                — Change «Order.submit» [js]
                                  Олег Захаров
                                  13 мая 2018, 17:05
                                  0
                                  Автора прошу сделать нормальную документацию, до много приходится додумывать как пользоваться (без претензии, это просьба).
                                  Что за изменения в последних версиях?
                                    Володя
                                    13 мая 2018, 17:11
                                    +1
                                    Все основны моменты изложены в документации.
                                    Не нужно ичего додумывать, если у вас какие либо сложности стоит писать в ТП.

                                    Какие либо новшества будут документированы после обкатки…
                                    Спасибо.
                                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                  51