web-dev-qa-db-ja.com

モデレート状態のユーザーのセットを選択するためにメールを送信する方法は?

コンテンツの管理には、以下のモジュールを使用しています。現在、コンテンツ承認者の役割を持つ5人がいて、状態遷移が発生すると、全員にメールが送信されます。 5人の承認者のうちの2人だけに承認が必要な特定のコンテンツタイプについて、モデレーションの移行に関する電子メールアラートを送信する必要があります。

モデレート状態を変更するときに、選択したユーザーのセットにメールを送信するにはどうすればよいですか?

推測される結果:

コンテンツエディターは、レビューの準備ができているページにマークを付けると、役割に関係なく、1人以上のユーザーを手動で選択して電子メールアラートを送信できます。

有効なモジュール:

  1. Workbench v8.x-1.
  2. Workbench Email v8.x-1.0-alpha7
1
usernameabc

@Matoeilの回答によれば、おそらくルールでこれを行うことができます。

エンティティ参照フィールドを5つの値(または必要に応じてそれ以上)に制限して追加し、ビューを使用して、役割に基づいて使用可能なオプション(ユーザー)を制限できます。次に、ルールを使用して、参照先のユーザーにメールを送信できます。

0
mediaashley

あなたはおそらくルールモジュールを使うことができます

あるいは、カスタムモジュールを作成し、これからインスパイアできます。これは、コアコンテンツ管理モジュールで使用されます。

use  \Drupal\user\Entity\User;

/**
 *
 *
 * Envoie de mail en fonction des transitions le modération de contenu.
 *
 * @param \Drupal\Core\Entity\EntityInterface $entity
 */
function my_module_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {
  if ($entity->getEntityTypeId() !== 'content_moderation_state') {
    return;
  }

  $article_id = $entity->get('content_entity_id')->getString();
  $article = \Drupal\node\Entity\Node::load($article_id);
  if ($article->bundle() !== 'article') {
    return;
  }

  global $base_url;

  $article_title = $article->get('title')->getString();
  $article_url = $base_url . "/node/" . $article->get('nid')->getString();

  $author_name = $article->getOwner()->get('field_cn_ldap')->getString();
  $author_email = $article->getOwner()->getEmail();
  $current_user_uid = \Drupal::currentUser()->id();
  $current_user_name = \Drupal\user\Entity\User::load($current_user_uid)
    ->get('field_cn_ldap')
    ->getString();
  $is_author = ($current_user_name == $author_name);    

  $uids = \Drupal::entityQuery('user')
    ->condition('status', 1)
    ->condition('roles', 'redacteur_en_chef')
    ->execute();
  ;
  $users = User::loadMultiple($uids);

  $emails_redacteur_en_chef = [];
  foreach ($users as $user) {
    $emails_redacteur_en_chef[] = $user->getEmail();
  }
  $emails_redacteur_en_chef = implode(',', $emails_redacteur_en_chef);

  $moderation_state = $entity->get('moderation_state')->getString();
  $moderation_state_original = '';
  if ($entity->original) {
    $moderation_state_original = $entity->original->get('moderation_state')
      ->getString();
  }
  $is_transition_change = ($moderation_state !== $moderation_state_original);

  include 'includes/notification/messages.php';
  include 'includes/notification/titles.php';
  $send_to = $author_email;
  $params['node_title'] = $title_mod;
  $params['message'] = $message_same_state;
  $send = FALSE;

  switch ($moderation_state) {
    case 'draft':
      if (!$is_transition_change && !$is_author) {
        $send = TRUE;
      }
      break;

    case 'relecture':
      if (!$is_transition_change && !$is_author) {
        $send = TRUE;
      }
      elseif ($is_transition_change) {        
        $send_to = "[email protected]";
        $params['node_title'] = $title_prop;
        $params['message'] = $message_prop;
        $send = TRUE;
      }
      break;

    case 'relecture1':
      if (!$is_transition_change && !$is_author) {
        $send = TRUE;
      }
      elseif ($is_transition_change) {     
        $send_to = "[email protected]";
        $params['node_title'] = $title_relec1;
        $params['message'] = $message_relec1;
        $send = TRUE;
      }
      break;

    case 'relecture2':
      $send_to = $emails_redacteur_en_chef;
      $params['node_title'] = $title_relec2;
      $params['message'] = $message_relec2;
      $send = TRUE;
      break;

    case 'published':
      if (!$is_transition_change) {
        $send_to .= ',';
        $send_to .= $emails_redacteur_en_chef;
        $send = TRUE;
      }
      else {

        $send_to = "[email protected]";
        $params['node_title'] = $title_pub;
        $params['message'] = $message_pub;
        $send = TRUE;
      }
      break;

    case 'maj':     
      $send_to = "[email protected]";
      $params['node_title'] = $title_maj;
      $params['message'] = $message_maj;
      $send = TRUE;
      break;

    default:
      break;
  }

  if ($send) {
    $mailManager = \Drupal::service('plugin.manager.mail');
    $module = "amu_dud_rules";
    $key = 'state_changed_action';
    $to = $send_to;

    $langcode = \Drupal::currentUser()->getPreferredLangcode();

    $result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);

    if ($result['result'] !== TRUE) {
      drupal_set_message(t('There was a problem sending notifications.'), 'error');
    }
    else {
      drupal_set_message(t("A notification has been sent to $to"));
    }
  }
}

/**
 * Implements hook_mail().
 */
function my_module_mail($key, &$message, $params) {
  $options = [
    'langcode' => $message['langcode'],
  ];
  switch ($key) {
    case 'state_changed_action':
      //$message['from'] = \Drupal::config('system.site')->get('mail');
      $from = '[email protected]';

      $message['from'] = $from;
      $message['headers']['From'] = $from;
      $message['headers']['Sender'] = $from;
      $message['headers']['Return-Path'] = $from;
      $message['subject'] = t('@title', ['@title' => $params['node_title']], $options);
      $message['body'][] = $params['message'];
      break;
  }
}
1
Matoeil