web-dev-qa-db-ja.com

ノードの更新後にユーザーにメールを送信する

私はこの構成でコンテンツタイプ「部屋」を持っています:

  • 題名
  • field_comments(コメント)
  • field_members(ユーザーエンティティ参照)

ルームを作成すると、hook_entity_insert()を使用して、ユーザーにルームに追加するメールを送信します

しかし、私の問題は、この部屋を編集して、新しいメンバーを追加するときに、新しい人にのみメールを送信したいことです。

私は、hook_entity_updateを使用してカスタムモジュールでこのコードを試してみます。

notify.module
/**
* Implements hook_entity_update().
*/
function notify_entity_update(Drupal\Core\Entity\EntityInterface $entity) {
 if ($entity->getEntityTypeId() !== 'node' || ($entity->getEntityTypeId() === 'node' && $entity->bundle() !== 'room')) {
   return;
 }
 $mailManager = \Drupal::service('plugin.manager.mail');
 $module = ‘notify’;
 $key = 'new_notif';


 //send to all members in room 
 $members = $entity->get('field_members')->getValue();
    $tos = [];
    foreach ( $members as $member ) {
        if ($member['target_id'] !== '1') {
            $tid = intval($member['target_id']);
            $user = \Drupal\user\Entity\User::load( $tid );
            $tos[] = $user->getEmail();
        }
    }

 $membersTo = implode (', ', $tos);

 $to = $membersTo;

 $params['message'] = 'You access to the room';

 $params['node_title'] = $entity->label();
 $langcode = \Drupal::currentUser()->getPreferredLangcode();
 $send = true;
 $result = $mailManager->mail($module, $key, $to, $langcode, $params, NULL, $send);
 if ($result['result'] !== true) {
   drupal_set_message(t('There was a problem sending your message and it was not sent.'), 'error');
 }
 else {
   drupal_set_message(t('Your message has been sent.'));
 }
}

編集後に古いメンバーを除外し、新しいメンバーを追加して部屋を保存する方法がわかりません。

2
Kipmag

しかし、私の問題は、この部屋を編集して、新しいメンバーを追加するときに、新しい人にのみメールを送信したいことです。

hook_entity_update について

$ entity-> originalから元のエンティティオブジェクトを取得します。

$entity->originalを使用すると、更新前の値にアクセスできます。

つまり、元のメンバーと更新されたメンバーを比較して、新しいメンバーが誰であるかを確認するだけです。

$og_members = array();
$og_members = $entity->original->get('field_members')->getValue();

$up_members = array();
$up_members = $entity->get('field_members')->getValue();

$new_members = array();
// use array_diff() to find the difference.
$new_members = array_diff($up_members, $og_members);
2
No Sssweat

ここにオプションがあります...

オプション1、(ハード)ノードがリビジョン可能である場合...最後のリビジョンと新しく追加された値の間の差異チェックを行うことができます...

オプション2(簡単)

ノードを編集するときに、field_members_to_add(ユーザーエンティティ参照)という新しいフィールドを作成し、新しいフィールドに新しいユーザーを配置します。次に、「hook_entity_update」で、このフィールドの値を取得できます。メールを送信、更新新しい値を持つ通常の "field_members" ..次に、 "field_members_to_add"をnullに設定して、次に新しい人を追加したときに空になるようにします。

だからそれは...

  $new_members = $entity->get('field_members_to_add')->getValue();
  // send email ...then later... 
  $entity->set('field_members_to_add', NULL);
  $old_members = $entity->get('field_members')->getValue();
  // merge values. 
  $all_members = array_merge($old_members,$new_members);
  $entity->set('field_members', $all_members);
  // Party.
0
Taggart Jensen