web-dev-qa-db-fra.com

Envoyer un e-mail aux utilisateurs après la mise à jour du nœud

J'ai un type de contenu "chambre" avec cette configuration:

  • Titre
  • Corps
  • field_Comments (commentaires)
  • field_Members (référence d'entité d'utilisateurs)

Quand je crée une pièce que j'envoie avec Hook_entity_insert () un email aux utilisateurs Ajouter à la chambre

Mais mon problème est quand je modifierai cette salle et j'ajoute de nouveaux membres, je veux envoyer un email uniquement pour nouveau.

J'essaie avec ce code dans le module personnalisé avec Hook_entery_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.'));
 }
}

Je ne sais pas comment exclure les anciens membres après la modification, ajouter de nouveaux membres et sauver une chambre.

2
Kipmag

Mais mon problème est quand je modifierai cette salle et j'ajoute de nouveaux membres, je veux envoyer un email uniquement pour nouveau.

AS Hook_entity_update mentionne

Obtenez l'objet d'entité d'origine à partir de $ entity-> Original .

$entity->original vous donne accès aux valeurs avant la mise à jour.

Donc, tout ce que vous devez faire est de comparer les membres d'origine aux membres mis à jour pour savoir qui sont les nouveaux membres.

$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

Ok vous avez des options ici ...

Option1, (plus difficile) Si le nœud Revisionable ... Vous pouvez faire une vérification de différence entre la dernière révision et les valeurs nouvellement ajoutées ...

Option 2 (facile)

fabriquez un nouveau champ appelé field_members_to_add (référence d'entité d'utilisateurs) lorsque vous modifiez le nœud, vous mettriez les nouvelles personnes sur le nouveau champ ... puis dans votre "Hook_entity_Update", vous pouvez obtenir les valeurs de ce champ .. Envoyer les courriels, la mise à jour Les "champs_members" normaux avec les nouvelles valeurs .. Ensuite, définissez "field_members_to_add" sur NULL afin qu'il soit vide la prochaine fois que vous ajoutez de nouvelles personnes.

alors ce serait ...

  $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