Rules Loop. Выполняем правила циклично

Rules, как мы знаем - штука не заменимая.
С помощью правил, программистами могут себя почувствовать те, кто никогда в жизни не имел дел с языками программирования.
Но что за программист, не умеющий выполнять действия в цикле?
В этом посте будет раскрыта тема "Циклов", и как их можно использовать в правилах.
Что такое "Цикл"?
С помощью циклов можно выполнять одно и то же действие для каждого из элементов списка.
Допустим, стоит задача отправить сообщение каждому пользователю. Алгоритм отправки сообщения примерно следующий:
- Извлечение данных пользователя
- Получение данных пользователя
- Отправка сообщения
- Извлечение данных пользователя
- Получение данных пользователя
- Отправка сообщения
- Извлечение данных пользователя
- Получение данных пользователя
- Отправка сообщения
- ...
- И так с каждым пользователем.
В правилах, для этого нужно каждый раз выполнять одно и то же действие для каждого отдельного пользователя. И каждый раз выбирать пользователя отдельно.
Благодаря циклам можно значительно упростить конструкцию данного алгоритма и использовать список всех пользователей которым необходимо произвести отправку письма.
В этом случае алгоритм будет выглядеть следующим образом:
- Получаем список пользователей
- Производим выполнение действий в цикле
- Получение данных пользователя
- Отправка сообщения
Выглядит гораздо проще, правда?
Более детально о циклах можно почитать на Wiki.
Использование циклов в Rules
Добавить цикл в правило достаточно просто:
Главное условие - нужен список. Это может быть абсолютно любой список, поддерживаемый Drupal'ом.
Для примера я выберу список, из параметров компонента (в следующем разделе более подробно рассказано о возможных источниках списков для правил):
Цикл добавлен.
Теперь в него можно добавлять любые действия, по аналогии с добавлением условий "OR" и "AND":
Ограничений по действиям нет. Для выполнения действий доступны переменные текущего элемента списка:
Примеры списков для цикла
Как я уже писал выше, источником (списком) для правил может являться абсолютно любой список Drupal.
Давайте рассмотрим несколько вариантов на конкретных примерах:
Поле с множесвенным значением
Легенда примера - будем создавать SMS-рассылки. В примере будет использоваться действие из этого модуля. При добавлении материала будет осуществляться рассылка сообщения с помощью правила. Конечно же циклом по списку.
Добавляем тип материала "Рассылка", и к нему текстовое поле "Получатель".
В настройках поля указываем обязательность заполнения поля и параметр "Количество значений" ставим "Не ограничено". Скриншот настройки поля.
Поле "Body" будет служить нам текстом сообщения. Поэтому его тоже сделаем обязательным, количество строк 2-3 (на Ваше усмотрение) отключим ввод тизера и форматирование текста. Скриншот настройки поля.
Теперь добавим правило "СМС-рассылка", с триггером на добавление нашего материала:
- Имя - "СМС-рассылка"
- Машинное имя - "sms_sender"
- Реакция на событие - "После добавления материала"
- Тип материала - "Рассылка"
Скриншот настройки правила.
Добавляем цикл, и в его настройках выбираем в качестве списка наше поле "Получатель" (node:field-recipient):

Далее, добавляем в цикл действие "Отправить SMS":

В настройках действия переводим все текстовые поля в режим отображения селектора данных:

Теперь выбираем "Номер телефона" - "list-item"

А для сообщения текст нашего материала ("node:body:value"):

Остальные параметры можно на Ваше усмотрение. Скриншот настройки действия.
Рассылка готова. Теперь при создании материалов типа "Рассылка" будет отправляться SMS-сообщения всем получателям из списка. Скриншот готового правила.
Поле типа "Список"
Рассмотрим еще один пример, по похожей легенде, но со следующими изменениями:
Теперь у нас есть стандартный список номеров получателей, и нам нужно выбирать те, которым отправлять сообщение при создании материала. Если сложно, вот раскрытый пример:
Есть некий список сотрудников, мы будем оповещать некоторых из них о необходимости выхода на работу посредством СМС.
В наш тип материала рассылка добавляем поле типа "Список (текст)" и виджетом "Флажки/переключатели".В список добавим нескольких сотрудников в формате "телефон|имя":
- Ключ - номер телефона
- Значение - имя
Делаем поле обязательным и количество неограниченным. Скриншот настройки поля.
Добавляем правило, все как и в предыдущем примере, добавляем цикл, но теперь списком выбираем наше поле с сотрудниками.
Действие абсолютно соответствует прошлому примеру.
При сохранении новой рассылки отмеченные сотрудники будут оповещены SMS'ками.
Список материалов из Views
Усложняем задачу. По легенде, нам нужно рассылать сообщения с текстом добавленного материала пользователям, в профиле у которых стоит отметка о необходимости оповещения.
При этом, пользователи сами будут ставить эту отметку в своем профиле, в удобное им время. Контролировать их никто не будет.
Для выполнения этого примера нам понадобится установить и включить модуль Views Bulk Operations.
Приступим.
Для начала добавим поля к профилю пользователя (admin/config/people/accounts/fields). Нам нужно поле в котором пользователь будет указывать свой номер - для примера, подойдет обычное - текстовое. И поле которое пользователь будет отмечать для получения рассылки - логическое поле с одиночным флагом.
Далее нужно создать представление VBO, в котором вывести всех пользователей у которых отмечена необходимость получить рассылку.
Перейдем на страницу добавления представлений (admin/structure/views/add), и создадим представление со следующими параметрами:
- Имя представления - Пользователи с отметкой
- Машинное имя - marked_users
- Показать - Пользователи, без сортировки
Блоки и страницы не создаем, переходим к редактированию представления. Скриншот настройки представления.
Отображаем все результаты, без пагинаторов и исключений.
Добавляем фильтр по полю в котором пользователи отмечают необходимость получить рассылку. Можно еще добавить фильтр по номеру телефона, в котором исключить пустые значения, если поле не является обязательным.
И добавляем поле с массовыми операциями.
Сохраняем представление. Скриншот готового представления.
Теперь нужно создать компонент, который будет выполнять действие. Перейдем на страницу добавления компонента (/admin/config/workflow/rules/components/add), и добавим новый компонент "Правило":
- Имя - "Отправка сообщения"
- Машинное имя - send_sms
- Переменные: 1. Пользователь (Метка - Пользователь, Машинное имя - user), 2. Текст (Метка - Сообщение, Машинное имя - message)
Скриншот настройки компонента.
И добавляем действие "Отправить SMS", которое настраиваем следующим образом:
- Номер телефона - "user:field-phone"
- Сообщение - "message"
Теперь добавляем правило, все аналогично с примерами 1 и 2, кроме действий.
Действия добавляем следующие:
- Загрузить список id сущностей из VBO View, в настройках выбираем представление VBO созданное ранее.
- Добавляем цикл по списку извлеченных сущностей.
Сначала нам нужно извлечь пользователя, для этого, в цикл добавляем действие "Извлечь сущность по ID":
- Тип сущности - Пользователь
В настройках переключаем поле "Идентификатор" в режим селектора данных, и выбираем там текущий элемент списка - "list-item". Скриншот настроек действия.
Далее добавляем в цикл действие, в котором выполняем созданный ранее компонент "Отправка сообщения".
В настройках выполнения компонента, параметр "Пользователь" - устанавливаем извлеченного в предыдущем шаге пользователя. А сообщением выбираем текст нашего материала (предварительно переведя в режим селектора данных). Скриншот настроек действия.
Скриншот готового правила.
Список как параметр Rules
Напоследок, рассмотрим еще один простенький пример с циклом.
Добавляем компонент, с 2-мя переменными:
- Список из текста: Метка - Список, Машинное имя - list
- Текст: Метка - Сообщение, Машинное имя - message
Скриншот компонента.
Теперь просто добавляем цикл, в качестве списка выбираем список из параметров компонента.
И добавляем действие в цикл, в котором отправляем SMS по номеру текущего элемента списка, с текстом из параметра "Сообщение".
Скриншот готового компонента.
Для выполнения правила переходим на страницу компонентов (admin/config/workflow/rules/components), и нажимаем кнопку "выполнить":
Добавляем список номеров (по одному на строку), и сообщение. Смотрим как правило выполняется.
Это лишь небольшая часть возможностей Rules и Loop. Все ограничивается Вашей фантазией, но чаще ТЗ ))
Если остались вопросы - задавайте в комментариях.
Комментарии
Как мало таких сайтов с действительно ценной информацией. Жаль. Это клад.
Добрый день! Делал все как тут написано, в итоге ничего( В журнале ошибок: Unable to load user with id "". Подскажите где копать?
настройки чего?