пятница, 10 января 2014 г.

Битрикс. Бизнес-процессы. PHP-код.

Недавно ко мне обратился насяльника с просьбой помочь в написании бизнес-процесса (далее в статье БП) для автоматической отсылки писем клиентам, у которых подходит срок оплаты хостинга.
Для полноценной работы с дизайнером шаблонов БП потребуется администраторский доступ к корп-порталу.
Все картинки в статье кликабельны, а ссылки открываются в новом окне.

У нас на корп-портале есть список (Сервисы -- Списки) "Клиенты хостинга". У каждого элемента есть свойство PAYED, содержащее датавремя, до которого оплачен хостинг. Задача: когда текущее время больше времени PAYED, надо отсылать клиенту письмо с предупреждением, что через три дня его хостинг сдуется =)

Находим шаблоны, прикреплённые к списку клиентов хостинга.
Создаём новый Последовательный БП. Битрикс предлагает нам вполне наглядный дизайнер шаблонов БП, к особенностям которого всё-таки придётся привыкнуть (впрочем, как и ко всему, что обладает объёмным синтаксическим и семантическим функционалом).
В диалоге Параметры шаблона находим третью вкладку Переменные и создаём строковую переменную с идентификатором payed_to и с таким же именем. Чуть позже увидим зачем нам эта переменная.
Заодно отключим автоматический запуск при создании и изменении. Эти галочки можно потом проставить, а для дебага они будут мешаться.

1. Общая логика

Для начала составим у себя в голове логику действий.
  1. БП в цикле раз в сутки проверяет разницу между PAYED и текущим датавременем.
  2. Если время кончилось, заканчиваем выполнение БП, если нет - ждём следующего витка цикла.

 

2. Используемые блоки

Опишем используемые блоки и их функциональность, которую далее используем в решении задачи.

2.1 Изменение переменных

Блок позволяет присваивать переменным шаблона БП какие-то значения. Например, взятые из текущего элемента, к которому прикреплён БП.

2.2 PHP-код

Блок позволяет выполнять PHP-код (всегда ваш, капитан очевидность).

Здесь можно общаться с переменными шаблона и свойствами элемента списка с помощью двух способов.
1. Непосредственное обращение к переменной. Синтаксис обращения можете получить с помощью кнопочки с тремя точечками. Например, получим значение свойства элемента PAYED.
{=Document:PROPERTY_PAYED}
2. Спросить значение в ооп стиле. Замечу, что #ID_VARIABLE - это идентификатор переменной шаблона, а не её имя
$this->GetVariable(#ID_VARIABLE);
Задание значения переменной осуществляется при помощи функции SetVariable.

Логгирование (например, в целях дебага) можно осуществлять с помощью обращения к методу WriteToTrackingService. Вообще тут доступны два способа (документация Вывод в лог).

2.3 Цикл

Нам нужно условие типа PHP-код. Однако, следует понимать, что здесь существуют некоторые особенности.
1. Отсутствует доступ к текущему активити через $this, хотя есть доступ к некоторым методам через $ownerActivity.
2. PHP-код, добавленный в условие цикла, выполняется битриксом через eval.
3. PHP-код должен возвращать логическое значение true или false
Если код возвращает true, то цикл продолжается. При false, соответственно, прерывается.

2.4 Пауза в выполнении

Как следует из названия, блок заставляет БП приостановиться на указанное время, либо выполниться в указанное время.
Возможно задать промежуток в секундах, минутах, часах и в днях.

3. Составляем демо-шаблон

На основе того, что я знаю, составляю шаблон. Не очень понятно как получить свойство элемента внутри условия Цикла, поэтому я сначала присваиваю значение переменной payed_to, а потом получаю его в условии Цикла. Собственно говоря, для этого я и заводила эту переменную. Ну и для сопутствующего дебага, конечно.
Как перетаскивать блоки в дизайнере, я надеюсь, вы и сами разберётесь =)
3.1 Изменение переменных
3.2 PHP-код
3.3 Цикл
3.4 PHP-код. Вывод в лог.

А дальше и так понятно =)

4. Тестирование и лог

Создаём тестового клиента в списке. Запускаем для него из диалога действий требуемый БП ручками.

Если появилась надпись Бизнес-процесс по шаблону 'Уведомление об отключении' успешно запущен, значит мы уже на пути к цели =)
Возвращаемся в список наших клиентов. Смотрим в последний столбец таблицы - там список всех БП, привязанных к данному элементу.
Под именем БП есть статус, нажав на который можно попасть в лог действий для данного БП текущего элемента. 

5. Дополнение

Допустим, мы ходим отсылать за три дня до даты окончания оплаченного срока. Тогда в Цикле в условии типа PHP-код мы должны написать вот так:

$ownerActivity->GetVariable('payed_to') > (time()+86400*$ownerActivity->GetVariable('days_before'))
где days_before - это ещё одна переменная шаблона, в которой можно указать за сколько дней ДО окончания оплаченного срока надо высылать оповещение.



В моих изысканиях мне помогли следующие источники.
  1. Обработка типа условия "PHP-код"
  2. Условия в бизнес-процессах
  3. Вывод в лог

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

Отправить комментарий