Рейтинг:0

Отправлять электронное письмо автору, когда контент публикуется через планировщик

флаг rs

я использовал Планировщик модуль с интеграция с модерацией контента публиковать контент автоматически. Он отлично работает с модулем. Теперь я хочу добавить функцию, согласно которой после публикации контента через cron автору этого конкретного контента будет отправлено электронное письмо.

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

  1. Если я удалю код публикации узла и оставлю только код отправки почты, почта будет запущена.
  2. Если я удалю код отправки почты и оставлю только код публикации узла, узел будет опубликован.
  3. Если я держу оба, отправляется только почта, контент не публикуется.

Ссылка: https://git.drupalcode.org/project/scheduler/blob/8.x-1.x/scheduler.api.php

Код ниже предназначен только для публикации контента, а не для отправки электронной почты.

функция MYMODULE_scheduler_publish_action (NodeInterface $ node) {
  // состояние модерации узла будет "опубликовано"
  $node->set('moderation_state', 'опубликовано');
  $узел->сохранить();

  // письмо отправить автору
  $mail_params = массив(
    'mail_subject' => 'запустить cron',
    'mail_body' => '<p>узел опубликован с помощью планировщика</p>',
    'mail_to' => '[email protected]'
  );

  \Drupal::service('MYMODULE.common_service')->FunctionToSendEmail($mail_params);
}

Ниже код только отправляет электронную почту, а не публикует контент.

функция MYMODULE_scheduler_publish_action (NodeInterface $ node) {  
  // письмо отправить автору
  $mail_params = массив(
  'mail_subject' => 'запустить cron',
  'mail_body' => '<p>узел опубликован с помощью планировщика</p>',
  'mail_to' => '[email protected]'
  );
  
  \Drupal::service('MYMODULE.common_service')->FunctionToSendEmail($mail_params);
  
  // состояние модерации узла будет "опубликовано"
  $node->set('moderation_state', 'опубликовано');
  $узел->сохранить();
}

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

Теперь мой вопрос: как я буду выполнять несколько действий, используя этот хук, или есть ли какая-либо другая процедура для этого?

Пожалуйста, помоги мне. Заранее спасибо.

Рейтинг:0
флаг cn

Модуль планировщика сам по себе предоставляет некоторые события, какое из них ПУБЛИКОВАТЬ. Таким образом, вы можете создать подписчика событий в своем модуле и прослушивать событие публикации следующим образом:

class YourSchedulerEventSubscriber реализует EventSubscriberInterface {
  публичная функция publishAndSendMail (SchedulerEvent $event) {
  /** @var \Drupal\node\Entity\Node $node */
  $node = $event->getNode();
  $node->set('moderation_state', $node->publish_state->getValue());

  $событие->setNode($node);

  $mail_params = массив(
  'mail_subject' => 'запустить cron',
  'mail_body' => '<p>узел опубликован с помощью планировщика</p>',
  'mail_to' => '[email protected]'
  );
  \Drupal::service('MYMODULE.common_service')->FunctionToSendEmail($mail_params); //Лучше отправлять как служебные аргументы
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция getSubscribedEvents() {
    // Значения в массивах дают указанные выше имена функций.
    $events[SchedulerEvents::PUBLISH][] = ['publishAndSendMail'];
    вернуть $события;
  }
}
Souvik Das avatar
флаг rs
Спасибо за вашу помощь. В понедельник обязательно попробую. Не могли бы вы предоставить мне ссылку или что-то еще, где я могу получить полный список событий, таких как «ПУБЛИКАЦИЯ», предоставляемых этим модулем планировщика? Еще раз спасибо.
Souvik Das avatar
флаг rs
Кроме того, как мне отправить несколько параметров в виде массива в методе `\Drupal::service`, когда параметры службы будут динамическими в зависимости от сценария публикации узла? Ключ mail_to будет иметь разные идентификаторы электронной почты, которые мне нужно отправить через службу. Согласно этой ссылке, службы https://drupal.stackexchange.com/questions/237353/how-do-i-pass-parameters-to-a-service не подходят в случаях, когда мне нужно передать параметры из вызова службы .
Alireza Tabatabaeian avatar
флаг cn
чтобы ответить на ваш первый вопрос, вы можете перейти к модулю планировщика в src/SchedulerEvents.php, вы можете найти список событий
Alireza Tabatabaeian avatar
флаг cn
когда вы хотите создать службу, и вам нужно больше служб, таких как MYMODULE.common_service, в качестве входных данных, вы можете добавить их в качестве аргумента в свой файл services.yml (ему нужно, чтобы @ считался службой), тогда, если вам нужно больше параметров, которые не типа сервисов, то в случае eventsubscriber вам нужно получить их из $event, например, чтобы получить автора узла, вы можете получить его из $event->node->getoWNER()
Souvik Das avatar
флаг rs
Получение той же проблемы с вашим решением. Электронное письмо отправлено, но узел не опубликован. Как только я удаляю код отправки почты, node публикуется.
Christophe CARON avatar
флаг in
Чтобы ответить Соувику Дасу, я нашел это в модуле: * Шесть возможных событий планировщика: * SchedulerEvents::PRE_PUBLISH * SchedulerEvents::ПУБЛИКАЦИЯ * SchedulerEvents::PRE_UNPUBLISH * SchedulerEvents::UNPUBLISH * SchedulerEvents::PRE_PUBLISH_IMMEDIATELY * SchedulerEvents::PUBLISH_IMMEDIATELY.

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

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