You are here

public function Notification::sendNotification in Content Moderation Notifications 8.3

Same name and namespace in other branches
  1. 8.2 src/Notification.php \Drupal\content_moderation_notifications\Notification::sendNotification()

Send notifications for a given entity and set of notifications.

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity we may be moderating.

\Drupal\content_moderation_notifications\ContentModerationNotificationInterface[] $notifications: List of content moderation notification entities.

Return value

bool TRUE if this entity is moderated, FALSE otherwise.

Overrides NotificationInterface::sendNotification

1 call to Notification::sendNotification()
Notification::processEntity in src/Notification.php
Processes a given entity in transition.

File

src/Notification.php, line 99

Class

Notification
General service for moderation-related questions about Entity API.

Namespace

Drupal\content_moderation_notifications

Code

public function sendNotification(EntityInterface $entity, array $notifications) {

  /** @var \Drupal\content_moderation_notifications\ContentModerationNotificationInterface $notification */
  foreach ($notifications as $notification) {
    $data['langcode'] = $this->currentUser
      ->getPreferredLangcode();
    $data['notification'] = $notification;

    // Setup the email subject and body content.
    $data['params']['subject'] = $notification
      ->getSubject();
    $data['params']['message'] = check_markup($notification
      ->getMessage(), $notification
      ->getMessageFormat());

    // Add the entity as context to aid in token replacement.
    if ($this->tokenEntityMapper) {
      $data['params']['context'] = [
        'entity' => $entity,
        'user' => $this->currentUser,
        $this->tokenEntityMapper
          ->getTokenTypeForEntityType($entity
          ->getEntityTypeId()) => $entity,
      ];
    }
    else {
      $data['params']['context'] = [
        'entity' => $entity,
        'user' => $this->currentUser,
        $entity
          ->getEntityTypeId() => $entity,
      ];
    }

    // Figure out who the email should be going to.
    $data['to'] = [];

    // Authors.
    if ($notification->author and $entity instanceof EntityOwnerInterface) {
      $data['to'][] = $entity
        ->getOwner()
        ->getEmail();
    }

    // Roles.
    foreach ($notification
      ->getRoleIds() as $role) {

      /** @var \Drupal\Core\Entity\EntityStorageInterface $user_storage */
      $user_storage = $this->entityTypeManager
        ->getStorage('user');
      if ($role === RoleInterface::AUTHENTICATED_ID) {
        $uids = \Drupal::entityQuery('user')
          ->condition('status', 1)
          ->accessCheck(FALSE)
          ->execute();

        /** @var \Drupal\user\UserInterface[] $role_users */
        $role_users = $user_storage
          ->loadMultiple(array_filter($uids));
      }
      else {

        /** @var \Drupal\user\UserInterface[] $role_users */
        $role_users = $user_storage
          ->loadByProperties([
          'roles' => $role,
        ]);
      }
      foreach ($role_users as $role_user) {
        $data['to'][] = $role_user
          ->getEmail();
      }
    }

    // Adhoc emails.
    $adhoc_emails = array_map('trim', explode(',', preg_replace("/((\r?\n)|(\r\n?))/", ',', $notification
      ->getEmails())));
    foreach ($adhoc_emails as $email) {
      $data['to'][] = $email;
    }

    // Let other modules to alter the email data.
    $this->moduleHandler
      ->alter('content_moderation_notification_mail_data', $entity, $data);

    // Remove any null values that have crept in.
    $data['to'] = array_filter($data['to']);

    // Remove any duplicates.
    $data['to'] = array_unique($data['to']);

    // Force to BCC.
    $data['params']['headers']['Bcc'] = implode(',', $data['to']);
    $recipient = '';
    if (!$notification
      ->disableSiteMail()) {
      $recipient = \Drupal::config('system.site')
        ->get('mail');
    }
    if (!empty($data['params']['headers']['Bcc'])) {
      $this->mailManager
        ->mail('content_moderation_notifications', 'content_moderation_notification', $recipient, $data['langcode'], $data['params'], NULL, TRUE);
    }
  }
}