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

Планируем действия. Rules Scheduler

Rules Scheduler

Модуль Rules - очень мощный.

Наверное поэтому у него есть свой планировщик.

В этом посте я расскажу как использовать планировщик правил (Rules Scheduler) и выполнять компоненты по расписанию (при выполнении регулярных процедур Cron).

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

Ранее я рассказывал о том как можно массово обновить материалы по Cron с помощью Views Bulk Operations.

Шаг 1. Подготовка

Если еще не установлен - качаем, устанавливаем и включаем модуль Rules.

Включаем модули Rules, Rules UI и Rules Scheduler.

Настраиваем на сервере или у хостера Cron на выполнение через нужный интервал. Допустим, каждый час.

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

Шаг 2. Создание компонента

Для начала нам нужно создать компонент, который будет выполнятся через нужные нам интервалы времени. Для этого переходим на страницу добавления компонента (admin/config/workflow/rules/components/add).

Плагин компонента - "Правило", жмем "Далее".

  • Имя - "Снятие статьи с главной страницы"
  • Машинное имя - "remove_article_from_frontpage"

Добавляем переменную материала:

  • Тип данных - "Материал"
  • Метка - "Материал"
  • Машинное имя - "node"
  • Использование - "Параметр"

Скриншот настроек.

Добавляем новое действие

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

Из списка доступных действий выбираем "Удалить материал с главной страницы".

Выбор действия

В селекторе выбора содержимого выбираем "node" и сохраняем действие.

Селектор данных

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

Шаг 3. Создание правила

Добавить новое правило можно по ссылке "admin/config/workflow/rules/reaction/add".

  • Имя - "Публикация новой статьи"
  • Машинное имя - "add_new_article"
  • Реакция на событие - "После добавления материала"
  • Ограничить по тип - "Статья"

Скриншот страницы добавления правила.

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

Для этого добавим действие "Вывести материал на главную страницу":

Добавить действие
Вывести материал на главную страницу

В селекторе данных выбираем наш материал ("node").

Настройка действия

Следующим шагом запланируем выполнение ранее созданного компонента.

Добавляем действие и выбираем "Запланировать выполнение компонента":

Запланировать выполнение компонента

Выбираем наш компонент:

Выбор компонента

В блоке "Планирование даты выполнения" указываем значение "+12 hours", и добавляем идентификатор компонента (Важно делать их уникальными, поэтому я советую использовать понятный идентификатор с ID ноды, которая должна быть обработана) - "delete_node_from_frontpage_[node:nid]".

[node:nid] - это токен ID материала, значение будет подставлено автоматически при выполнении правила. Список доступных токенов можно найти в филдсете "Подстановочные шаблоны".

В качестве материала выбираем "node".

Скриншот настройки действия.

Больше нам ничего добавлять не нужно. Главное чтоб выполнялся Cron, а Rules Scheduler позаботится о віполнении правила. Скриншот готового правила.

Для проверки можете добавить новую статью и посмотреть добавилось ли в расписание Ваше правило, на странице "admin/config/workflow/rules/schedule":

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

Комментарии

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

Да. Добавляйте планирование выполнения компонента внутри него же, в качестве даты "+1 year".

Советую добавлять условие - стоит ли материал на главной.

Спасибо

я использую модули "]]>https://www.drupal.org/project/scheduler"]]> и Rules, по вашему мнению это не избыточно ли? Эти модули не взаимозаменяемые ли ? Может можно первый заменить на Rules Scheduler?

По моему мнению использование обоих модулей (вместе и по отдельности) является избыточным. Но раз нужно...

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

В описании модуля Scheduler есть ответ на Ваш вопрос:

Scheduler only does publishing and unpublishing of nodes. If you want to schedule any other activity check out Workflow, Rules, Actions and Job Scheduler.

Спасибо за пост.

Подскажите, можно ли с помощью "Компонента" правил или просто правилами сравнить email пользователя (анонима) и уже имеющиеся email (тех юзеров, чьи комментарии уже одобрены админом)

Спасибо!

Отличный вопрос!

Да, можно. Необходимо:

  • добавить правило с реакцией "После сохранения нового комментария"
  • добавить действие "Извлечь сущность по свойству", свойством выбрать "Email", сравнивать с E-mail'ом нового коммента
  • добавить условное действие (модуль) и условие, где сравнивать почту из первого значения загруженной сущности и почту добавленного коммента.

Правда для комментариев не припомню действий в правилах. Но можно добавить выполнение PHP.

К сожалению не виду у себя экшена "Извлечь сущность по свойству", так еще и новый модуль доставлять надо.

а через списки компонентов это можно сделать?

Спасибо!

"Извлечь сущность по свойству" работает со включенным Entity API.

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

Спасибо, все верно, есть "Извлечь сущность по свойству" (извиняюсь не туда посмотрел).

А как лучше сделать, путем передачи параметра из правила в компонент со списком email или с помощью loop в самом правиле?

А как у вас в блоге работает фильтрация комментов от спама?

Спасибо

Вам нужно сравнить E-mail'ы, это или Conditional Rules, или передавая их в компонент для сравнения.

Можно Loop'ом, если нужно проверять все значения. Более правильно передать список в компонент, но можно и в цикле его вызывать.

Здесь для защиты все сам писал, частично можете найти здесь.

Извиняюсь может я что то недопонимаю (первый раз делаю с использованием рулсового компонента)

в моем случае есть новый коммент в котором аноним указал email и есть уже проверенные комменты, в некоторых из которых тоже указаны email.

Тут вижу какой алгоритм,
1) в рулсе беру email анонима (который только что написал) и аргументом передаю его компоненту ("Ограничение счетчика результатов" ставлю 1)
2) в рулсе так же извлекаю уже имеющиеся email, но вот тут их может быть много как быть? Что указать в "Ограничение счетчика результатов" и не будет ли тут большой нагрузки?

Дальше в компоненте сравниваю и если TRUE, то одобряю коммент

Или я в чем то не прав?

Все верно.

Нагрузка может быть, и будет, если E-mail встречается во многих комментариях. От того, в изначальном примере, я советовал проверять только 1-е значение (соответственно и загружать только 1 сущность).

Если же нужно проверять все - то без нагрузки не обойтись.

Если нагрузка ОООЧЕНЬ большая, можно проделывать это все по CRON'у, если еще больше - с использованием очередей.