recurring_events-2.0.x-dev/modules/recurring_events_registration/modules/recurring_events_reminders/recurring_events_reminders.module

modules/recurring_events_registration/modules/recurring_events_reminders/recurring_events_reminders.module
<?php

/**
 * @file
 * Primary module hooks for Recurring Events Registration Reminders module.
 */

declare(strict_types=1);

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;

/**
 * Implements hook_entity_base_field_info_alter().
 */
function recurring_events_reminders_entity_base_field_info_alter(&$fields, EntityTypeInterface $entity_type) {

  $entity_type_id = $entity_type->id();

  if ($entity_type_id === 'eventseries') {
    $fields['registration_reminders'] = BaseFieldDefinition::create('registration_reminders')
      ->setName('registration_reminders')
      ->setLabel(t('Event Registration Reminders'))
      ->setDescription('The event registration reminders configuration.')
      ->setDisplayConfigurable('form', TRUE)
      ->setDisplayConfigurable('view', TRUE)
      ->setRevisionable(TRUE)
      ->setTranslatable(FALSE)
      ->setCardinality(1)
      ->setRequired(FALSE)
      ->setTargetEntityTypeId($entity_type->id())
      ->setDisplayOptions('form', [
        'type' => 'registration_reminders',
        'weight' => 10,
      ]);
  }

  if ($entity_type_id === 'eventinstance') {
    $fields['reminder_date'] = BaseFieldDefinition::create('timestamp')
      ->setName('reminder_date')
      ->setLabel(t('Reminder Date'))
      ->setDescription('The date that reminders should be sent.')
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE)
      ->setRevisionable(FALSE)
      ->setTranslatable(FALSE)
      ->setTargetEntityTypeId($entity_type_id)
      ->setCardinality(1)
      ->setRequired(FALSE);

    $fields['reminder_sent'] = BaseFieldDefinition::create('timestamp')
      ->setName('reminder_sent')
      ->setLabel(t('Reminder Sent'))
      ->setDescription('The date that reminders were sent.')
      ->setDisplayConfigurable('form', FALSE)
      ->setDisplayConfigurable('view', FALSE)
      ->setRevisionable(FALSE)
      ->setTranslatable(FALSE)
      ->setTargetEntityTypeId($entity_type_id)
      ->setCardinality(1)
      ->setRequired(FALSE);
  }
}

/**
 * Implements hook_ENTITY_TYPE_insert().
 *
 * Set the reminder date for all instances in this series.
 */
function recurring_events_reminders_eventseries_insert(EntityInterface $entity) {
  if (\Drupal::isConfigSyncing()) {
    return;
  }
  if ($entity->registration_reminders->reminder) {
    $amount = $entity->registration_reminders->reminder_amount;
    $units = $entity->registration_reminders->reminder_units;
    $instances = $entity->event_instances->referencedEntities();
    if (!empty($instances)) {
      foreach ($instances as $instance) {
        $instance_date = $instance->date->start_date->getTimestamp();
        $reminder_date = strtotime('-' . $amount . ' ' . $units, $instance_date);
        $instance->set('reminder_date', $reminder_date);
        $instance->setNewRevision(FALSE);
        $instance->save();
      }
    }
  }

}

/**
 * Implements hook_ENTITY_TYPE_update().
 *
 * Set the reminder date for all instances in this series.
 */
function recurring_events_reminders_eventseries_update(EntityInterface $entity) {
  $original = $entity->original;
  if ($entity->registration_reminders->reminder) {
    $entity = $entity->load($entity->id());

    if ($original->registration_reminders->reminder_amount !== $entity->registration_reminders->reminder_amount
      || $original->registration_reminders->reminder_units !== $entity->registration_reminders->reminder_units
    ) {
      $amount = $entity->registration_reminders->reminder_amount;
      $units = $entity->registration_reminders->reminder_units;
      $instances = $entity->event_instances->referencedEntities();
      if (!empty($instances)) {
        foreach ($instances as $instance) {
          $instance_date = $instance->date->start_date->getTimestamp();
          $reminder_date = strtotime('-' . $amount . ' ' . $units, $instance_date);
          $instance->set('reminder_date', $reminder_date);
          $instance->set('reminder_sent', NULL);
          $instance->setNewRevision(FALSE);
          $instance->save();
        }
      }
    }
  }
  // If reminders have been disabled, then set the reminder_date to NULL.
  elseif ($original->registration_reminders->reminder !== $entity->registration_reminders->reminder) {
    $instances = $entity->event_instances->referencedEntities();
    if (!empty($instances)) {
      foreach ($instances as $instance) {
        $instance->set('reminder_date', NULL);
        $instance->setNewRevision(FALSE);
        $instance->save();
      }
    }
  }
}

/**
 * Implements hook_cron().
 */
function recurring_events_reminders_cron() {
  $query = \Drupal::entityTypeManager()->getStorage('eventinstance')->getQuery();
  $event_instances = $query
    ->condition('reminder_date', NULL, 'IS NOT NULL')
    ->condition('reminder_sent', NULL, 'IS NULL')
    ->condition('reminder_date', time(), '<=')
    ->accessCheck(FALSE)
    ->execute();

  if (!empty($event_instances)) {
    $instances = \Drupal::entityTypeManager()->getStorage('eventinstance')->loadMultiple($event_instances);

    /** @var \Drupal\recurring_events\Entity\EventInstance */
    foreach ($instances as $instance) {
      $instance->set('reminder_sent', time());
      $instance->setNewRevision(FALSE);
      $instance->save();

      /** @var \Drupal\recurring_events_registration\RegistrationCreationService */
      $registration_creation_service = \Drupal::service('recurring_events_registration.creation_service');
      $registration_creation_service->setEventInstance($instance);

      $registrants = $registration_creation_service->retrieveRegisteredParties(TRUE, FALSE);

      if (empty($registrants)) {
        return;
      }

      $key = 'registration_reminder';

      $config = \Drupal::config('recurring_events_registration.registrant.config');
      $queue_is_enabled = $config->get('email_notifications_queue');

      // Send an email to all registrants.
      foreach ($registrants as $registrant) {
        if ($queue_is_enabled) {
          // Add each notification to be sent to the queue.
          \Drupal::service('recurring_events_registration.notification_service')->addEmailNotificationToQueue($key, $registrant);
        }
        else {
          // If the queue is not enabled, send this notification immediately.
          recurring_events_registration_send_notification($key, $registrant);
        }
      }
    }
  }
}

/**
 * Implements hook_recurring_events_registration_notification_types_alter().
 */
function recurring_events_reminders_recurring_events_registration_notification_types_alter(array &$notification_types) {
  $notification_types += [
    'registration_reminder' => [
      'name' => t('Registration Reminder'),
      'description' => t('Send an email to remind registrants about upcoming events? Note: The event series must be configured to send reminders.'),
    ],
  ];
}

/**
 * Implements hook_config_schema_info_alter().
 */
function recurring_events_reminders_config_schema_info_alter(&$definitions) {
  $definitions['recurring_events_registration.registrant.config']['mapping']['registration_reminder_enabled'] = [
    'type' => 'boolean',
    'label' => 'Whether to enable email reminders for upcoming events',
  ];
  $definitions['recurring_events_registration.registrant.config']['mapping']['registration_reminder_subject'] = [
    'type' => 'string',
    'label' => 'The email subject for the reminder emails',
  ];
  $definitions['recurring_events_registration.registrant.config']['mapping']['registration_reminder_body'] = [
    'type' => 'string',
    'label' => 'The email body for the reminder emails',
  ];
}

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

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