Категория:
Опубликовано:

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

Rules Loop

Rules, как мы знаем - штука не заменимая.

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

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

В этом посте будет раскрыта тема "Циклов", и как их можно использовать в правилах.

Что такое "Цикл"?

С помощью циклов можно выполнять одно и то же действие для каждого из элементов списка.

Допустим, стоит задача отправить сообщение каждому пользователю. Алгоритм отправки сообщения примерно следующий:

  • Извлечение данных пользователя
    • Получение данных пользователя
    • Отправка сообщения
  • Извлечение данных пользователя
    • Получение данных пользователя
    • Отправка сообщения
  • Извлечение данных пользователя
    • Получение данных пользователя
    • Отправка сообщения
  • ...
  • И так с каждым пользователем.

В правилах, для этого нужно каждый раз выполнять одно и то же действие для каждого отдельного пользователя. И каждый раз выбирать пользователя отдельно.

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

В этом случае алгоритм будет выглядеть следующим образом:

  • Получаем список пользователей
  • Производим выполнение действий в цикле
    • Получение данных пользователя
    • Отправка сообщения

Выглядит гораздо проще, правда?

Более детально о циклах можно почитать на Wiki.

Использование циклов в Rules

Добавить цикл в правило достаточно просто:

Добавить цикл

Главное условие - нужен список. Это может быть абсолютно любой список, поддерживаемый Drupal'ом.

Для примера я выберу список, из параметров компонента (в следующем разделе более подробно рассказано о возможных источниках списков для правил):

Настройки списка

Цикл добавлен.

Цикл

Теперь в него можно добавлять любые действия, по аналогии с добавлением условий "OR" и "AND":

Добавить действие в цикл

Ограничений по действиям нет. Для выполнения действий доступны переменные текущего элемента списка:

Текущий элемент списка.png

Примеры списков для цикла

Как я уже писал выше, источником (списком) для правил может являться абсолютно любой список Drupal.

Давайте рассмотрим несколько вариантов на конкретных примерах:

Поле с множесвенным значением

Легенда примера - будем создавать SMS-рассылки. В примере будет использоваться действие из этого модуля. При добавлении материала будет осуществляться рассылка сообщения с помощью правила. Конечно же циклом по списку.

Добавляем тип материала "Рассылка", и к нему текстовое поле "Получатель".

В настройках поля указываем обязательность заполнения поля и параметр "Количество значений" ставим "Не ограничено". Скриншот настройки поля.

Поле "Body" будет служить нам текстом сообщения. Поэтому его тоже сделаем обязательным, количество строк 2-3 (на Ваше усмотрение) отключим ввод тизера и форматирование текста. Скриншот настройки поля.

Теперь добавим правило "СМС-рассылка", с триггером на добавление нашего материала:

  • Имя - "СМС-рассылка"
  • Машинное имя - "sms_sender"
  • Реакция на событие - "После добавления материала"
  • Тип материала - "Рассылка"

Скриншот настройки правила.

Добавляем цикл, и в его настройках выбираем в качестве списка наше поле "Получатель" (node:field-recipient):

Список получателей

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

Отправить 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, кроме действий.

Действия добавляем следующие:

  1. Загрузить список id сущностей из VBO View, в настройках выбираем представление VBO созданное ранее.
  2. Добавляем цикл по списку извлеченных сущностей.
Loop

Сначала нам нужно извлечь пользователя, для этого, в цикл добавляем действие "Извлечь сущность по ID":

  • Тип сущности - Пользователь

В настройках переключаем поле "Идентификатор" в режим селектора данных, и выбираем там текущий элемент списка - "list-item". Скриншот настроек действия.

Далее добавляем в цикл действие, в котором выполняем созданный ранее компонент "Отправка сообщения".

В настройках выполнения компонента, параметр "Пользователь" - устанавливаем извлеченного в предыдущем шаге пользователя. А сообщением выбираем текст нашего материала (предварительно переведя в режим селектора данных). Скриншот настроек действия.

Скриншот готового правила.

Список как параметр Rules

Напоследок, рассмотрим еще один простенький пример с циклом.

Добавляем компонент, с 2-мя переменными:

  1. Список из текста: Метка - Список, Машинное имя - list
  2. Текст: Метка - Сообщение, Машинное имя - message

Скриншот компонента.

Теперь просто добавляем цикл, в качестве списка выбираем список из параметров компонента.

И добавляем действие в цикл, в котором отправляем SMS по номеру текущего элемента списка, с текстом из параметра "Сообщение".

Скриншот готового компонента.

Для выполнения правила переходим на страницу компонентов (admin/config/workflow/rules/components), и нажимаем кнопку "выполнить":

Выполнить компонент

Добавляем список номеров (по одному на строку), и сообщение. Смотрим как правило выполняется.

Это лишь небольшая часть возможностей Rules и Loop. Все ограничивается Вашей фантазией, но чаще ТЗ ))

Если остались вопросы - задавайте в комментариях.

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

Комментарии

Как мало таких сайтов с действительно ценной информацией. Жаль. Это клад.

Добрый день! Делал все как тут написано, в итоге ничего( В журнале ошибок: Unable to load user with id "". Подскажите где копать?

Вероятно, каким-то образом в цикл передавался пользователь с пустым ID'шником. Проверьте настройки.
Настройки всего. Вам нужно определить почему UID пустой.
Добавить комментарий