calendar_event_notifications-1.0.0/calendar_event_notifications.module

calendar_event_notifications.module
<?php

/**
 * @file
 * Contains functions related to send email notifications after node operations.
 */

use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Entity\Node;
use Drupal\views\ViewExecutable;

/**
 * Implements hook_help().
 */
function calendar_event_notifications_help($route_name) {
  switch ($route_name) {
    // Main module help for the calendar_event_notifications module.
    case 'help.page.calendar_event_notifications':
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
      $output .= '<p>' . t('This module gives feature to send reminder emails for an upcoming event before x days of the event based on the admin configuration..') . '</p>';
      return $output;

    default:
  }
}

/**
 * Implements hook_views_pre_render().
 */
function calendar_event_notifications_views_pre_render(ViewExecutable $view) {
  if (isset($view) && ($view->storage->id() == 'calendar_event_notification')) {
    $view->element['#attached']['library'][] = 'calendar_event_notifications/cen';
    $create = \Drupal::currentUser()->hasPermission('create calendar_event_notification content');

    $view->element['#attached']['drupalSettings']['calendar_event_notifications'] = [
      'event_create' => $create,

    ];
  }
}

/**
 * Implements hook_ENTITY_TYPE_predelete() for node entities.
 */
function calendar_event_notifications_node_predelete(EntityInterface $entity) {
  // Check if the entity is of the "calendar_event_notification" type.
  if ($entity->getType() == 'calendar_event_notification') {
    // Handle deleted event.
    calendar_event_notifications_send_deleted_event_notification_email($entity);
  }
}

/**
 * Implements hook_ENTITY_TYPE_presave() for node entities.
 */
function calendar_event_notifications_node_presave(EntityInterface $entity) {
  // Check if the entity is of the "calendar_event_notification" type and has the required field.
  if ($entity->getType() == 'calendar_event_notification' && $entity->hasField('field_notify_mail')) {
    // Check if it's a new event or an update.
    if ($entity->isNew() && $entity->get('field_notify_mail')->value) {
      // Handle new event.
      calendar_event_notifications_send_event_notification_email($entity);
    }
    elseif (!$entity->isNew() && $entity->get('field_notify_mail')->value) {
      // Handle updated event.
      calendar_event_notifications_send_updated_event_notification_email($entity);
    }
  }
}

/**
 * Custom function to send email notification for a new event.
 */
function calendar_event_notifications_send_event_notification_email($event) {
  // Check if the field_start_date and field_end_date fields exist or not.
  if ($event->hasField('field_event_date') && !$event->get('field_event_date')->isEmpty()) {
    // Get the referenced user.
    if ($event->hasField('field_user') && !$event->get('field_user')->isEmpty()) {
      $user = $event->get('field_user')->entity;
      // Check if the user has an email address.
      if ($user && $user->getEmail()) {
        // Get the event date range values.
        $event_date_range = $event->get('field_event_date')->getValue();
        // Check if the date range values are set.
        if (!empty($event_date_range[0]['value']) && !empty($event_date_range[0]['end_value'])) {
          $start_date = $event_date_range[0]['value'];
          $end_date = $event_date_range[0]['end_value'];

          // Build the email parameters.
          $params = [
            'subject' => t('New Event Notification'),
            'body' => t('A new event has been created. Event title: @title,Event
              start date: @startdate,
              Event end date: @enddate', [
                '@title' => $event->label(),
                '@startdate' => $start_date,
                '@enddate' => $end_date,
              ]
            ),
          ];

          // Send the email using dependency injection.
          \Drupal::service('plugin.manager.mail')->mail(
            'calendar_event_notifications',
            'event_notifications',
            $user->getEmail(),
            $user->getPreferredLangcode(),
            $params
          );
        }
      }
    }
  }
}

/**
 * Custom function to send email notification for an updated event.
 */
function calendar_event_notifications_send_updated_event_notification_email($event) {
  // Check if the field_start_date and field_end_date fields exist or not.
  if ($event->hasField('field_event_date') && !$event->get('field_event_date')->isEmpty()) {
    // Get the referenced user.
    if ($event->hasField('field_user') && !$event->get('field_user')->isEmpty()) {
      $user = $event->get('field_user')->entity;

      // Check if the user has an email address.
      if ($user && $user->getEmail()) {
        // Get the event date range values.
        $event_date_range = $event->get('field_event_date')->getValue();
        // Check if the date range values are set.
        if (!empty($event_date_range[0]['value']) && !empty($event_date_range[0]['end_value'])) {
          $start_date = $event_date_range[0]['value'];
          $end_date = $event_date_range[0]['end_value'];

          // Build the email parameters.
          $params = [
            'subject' => t('Updated Event Notification'),
            'body' => t('An event has been updated. Event title: @title, Event start date: @startdate, Event end date: @enddate', [
              '@title' => $event->label(),
              '@startdate' => $start_date,
              '@enddate' => $end_date,
            ]),
          ];

          // Send the email using dependency injection.
          \Drupal::service('plugin.manager.mail')->mail(
            'calendar_event_notifications',
            'event_notifications',
            $user->getEmail(),
            $user->getPreferredLangcode(),
            $params
          );
        }
      }
    }
  }
}

/**
 * Custom function to send email notification for a deleted event.
 */
function calendar_event_notifications_send_deleted_event_notification_email($event) {
  // Check if the 'field_user' exists and has a value.
  if ($event->hasField('field_user') && !$event->get('field_user')->isEmpty()) {
    // Get the referenced user.
    $user = $event->get('field_user')->entity;

    // Check if the user has an email address.
    if ($user && $user->getEmail()) {
      // Check if the field 'field_event_date' is present and not null.
      if ($event->hasField('field_event_date')) {
        $event_date_field = $event->get('field_event_date');

        if (!$event_date_field->isEmpty()) {
          // Get the start and end date of the deleted event.
          $start_date = $event_date_field->start_date->getTimestamp();
          $end_date = $event_date_field->end_date->getTimestamp();

          // Get the current date and time.
          $current_time = \Drupal::time()->getRequestTime();

          // Check if the event is in the future.
          if ($start_date >= $current_time) {
            // Build the email parameters.
            $params = [
              'subject' => t('Deleted Event Notification'),
              'body' => t('An event has been deleted. Deleted details: Event from @start_date to @end_date', [
                '@start_date' => date('Y-m-d H:i
:s
', $start_date),
                '@end_date' => date('Y-m-d H:i
:s
', $end_date),
              ]),
            ];

            // Send the email.
            \Drupal::service('plugin.manager.mail')->mail(
              'calendar_event_notifications',
              'event_notifications',
              $user->getEmail(),
              $user->getPreferredLangcode(),
              $params
            );
          }
        }
      }
    }
  }
}

/**
 * Implements hook_mail().
 */
function calendar_event_notifications_mail($key, &$message, $params) {

  switch ($key) {
    case 'event_notification':
      $message['subject'] = $params['subject'];
      $message['body'][] = $params['body'];
      break;

  }

}

/**
 * Implements hook_cron().
 */
function calendar_event_notifications_cron() {
  // Fetch upcoming calendar_event_notification.
  $upcoming_events = calendar_event_notifications_get_upcoming_events();
  // Check if the cron has already run for these events.
  foreach ($upcoming_events as $event) {

    $node = $event['node'];

    // Check if the cron has run for this event.
    if (!$node->get('field_cron_run_once')->value) {
      $config = \Drupal::config('calendar_event_notifications.settings');
      $subject = $config->get('email_subject');
      $body = $config->get('email_body');
      $days = $config->get('days_before_event');
      $timezone_string = \Drupal::config('system.date')->get('timezone')['default'];

      // Create a DateTimeZone object from the timezone string.
      $timezone = new DateTimeZone($timezone_string);

      // Create a DateTime object using the DateTimeZone.
      $current_date = new DateTime('now', $timezone);
      $target_date = clone $current_date;
      $modified_date = $target_date->modify('+' . $days . ' days');
      $target_date_formatted = $modified_date->format('d');

      $date = date_create($event['start_date']);
      if (date_format($date, "d") == $target_date_formatted) {
        calendar_event_notifications_send_notification_email($event, $subject, $body);

      }
    }
  }
}

/**
 * Custom function to send email notification for upcoming events.
 */
function calendar_event_notifications_get_upcoming_events() {
  $config = \Drupal::config('calendar_event_notifications.settings');
  $days = $config->get('days_before_event');
  if ($days) {
    $timezone_string = \Drupal::config('system.date')->get('timezone')['default'];

    // Create a DateTimeZone object from the timezone string.
    $timezone = new DateTimeZone($timezone_string);

    // Create a DateTime object using the DateTimeZone.
    $current_date = new DateTime('now', $timezone);

    $target_date = clone $current_date;

    // Modify the cloned date.
    $modified_date = $target_date->modify('+ ' . $days . ' day');

    // Check if modification was successful.
    if ($modified_date !== FALSE) {
      // Format the modified date.
      $target_date_formatted = $modified_date->format('Y-m-d');

      // Query upcoming events.
      $query = \Drupal::entityQuery('node')
        ->condition('type', 'calendar_event_notification')
        ->condition('field_event_date', $target_date_formatted, '>=')
      // Updated condition.
        ->condition('field_cron_run_once', [0, NULL], 'IN')
        ->accessCheck(TRUE)
        ->sort('field_event_date');

      $nids = $query->execute();
      $events = [];

      foreach ($nids as $nid) {
        $event = Node::load($nid);

        // Assuming 'field_user' is the reference field to the user entity.
        $event->get('field_user')->referencedEntities();

        $event_date_range = $event->get('field_event_date')->getValue();
        $start_date = '';
        $end_date = '';
        if (!empty($event_date_range[0]['value']) && !empty($event_date_range[0]['end_value'])) {
          $start_date = $event_date_range[0]['value'];
          $end_date = $event_date_range[0]['end_value'];
        }
        $events[] = [
          'event_title' => $event->getTitle(),
          'start_date' => $start_date,
          'end_date' => $end_date,
          'node' => $event,
        ];
      }

      return $events;
    }
    else {
      // Handle the case where modification fails.
      \Drupal::logger('calendar_event_notifications')->error('Failed to modify date.');
      return [];
    }
  }
  else {
    // Handle the case where modification fails.
    \Drupal::logger('calendar_event_notifications')->error('Configuration is not set in config form for calendar_event_notification module.');
    return [];
  }
}

/**
 * Send notification emails for upcoming events.
 */
function calendar_event_notifications_send_notification_email($event) {
  $config = \Drupal::config('calendar_event_notifications.settings');

  $email_subject = $config->get('email_subject');
  $email_body = $config->get('email_body');
  // Get the referenced users.
  $user_reference_items = $event['node']->get('field_user')->referencedEntities();
  foreach ($user_reference_items as $key => $referenced_user) {
    // Ensure that the recipient email address is not null.
    if ($referenced_user && $referenced_user->id() > 0) {
      $to = $referenced_user->getEmail();

      if ($to) {
        // Replace tokens in the email body.
        $token_data = [
          'node' => $event['node'],
          'user' => $referenced_user,
        ];
        $langcode = ($event['node'] && $event['node']->language) ? $event['node']->language : 'en';
        $token_options = [
          'langcode' => $langcode,
          'callback' => 'user_mail_tokens',
          'clear' => TRUE,
        ];

        // Use Drupal's token service for replacement.
        $token_service = \Drupal::token();
        $email_body_after_replace = $token_service->replace($email_body, $token_data, $token_options);
        $mail_subject = $token_service->replace($email_subject, $token_data, $token_options);
        // Build the email.
        // Use the modified email body.
        $params = [
          'message' => $email_body_after_replace,
          'subject' => $mail_subject,
        ];
        // Use Drupal's mail system.
        $mailManager = \Drupal::service('plugin.manager.mail');
        // Replace with your module's machine name.
        $module = 'calendar_event_notifications';
        $key = 'notifications_email';
        $langcode = \Drupal::currentUser()->getPreferredLangcode();
        // Send the email.
        $result = $mailManager->mail($module, $key, $to, $langcode, $params);

        if ($result['result'] !== TRUE) {
          // Handle error.
          \Drupal::logger('calendar_event_notifications')->error('Error sending email to user @user for event @event: @error', [
            '@user' => $referenced_user->getAccountName(),
            '@error' => $result['result'],
            '@event' => $event['node']->getTitle(),
          ]);
        }
        else {
          // Mark the event as cron has run for it.
          \Drupal::logger('calendar_event_notifications')->error('Successfully send email to user @user for event @event: @error', [
            '@user' => $referenced_user->getAccountName(),
            '@error' => $result['result'],
            '@event' => $event['node']->getTitle(),
          ]);
          $event['node']->set('field_cron_run_once', 1);
          $event['node']->save();

        }
      }

    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc