diff --git a/modules/recurring_events_registration/config/install/recurring_events_registration.registrant.config.yml b/modules/recurring_events_registration/config/install/recurring_events_registration.registrant.config.yml index 6f648d3d3cc2a5886512263e05c48b97c43b3ac4..2705292b6db083e099c7c6857bc914913be7ee09 100644 --- a/modules/recurring_events_registration/config/install/recurring_events_registration.registrant.config.yml +++ b/modules/recurring_events_registration/config/install/recurring_events_registration.registrant.config.yml @@ -1,6 +1,7 @@ show_capacity: true limit: 10 date_format: 'F jS, Y h:iA' +title: '[registrant:email]' email_notifications: true registration_notification_enabled: true registration_notification_enabled: true diff --git a/modules/recurring_events_registration/config/schema/recurring_events_registration.schema.yml b/modules/recurring_events_registration/config/schema/recurring_events_registration.schema.yml index 273933515d0cda603f2df6992348f76f287f6df5..dfc0a0c479e9f79421b0636bb28726a21036d6ab 100644 --- a/modules/recurring_events_registration/config/schema/recurring_events_registration.schema.yml +++ b/modules/recurring_events_registration/config/schema/recurring_events_registration.schema.yml @@ -11,6 +11,9 @@ recurring_events_registration.registrant.config: date_format: type: string label: 'The formatting of dates when displaying registrants' + title: + type: string + label: 'The title of the registrants' email_notifications: type: boolean label: 'Whether to enable email notifications' diff --git a/modules/recurring_events_registration/recurring_events_registration.install b/modules/recurring_events_registration/recurring_events_registration.install index 78d91a92ef4d9f85ab1c30c5e919bc46835b229e..bb121908b0cb89d4787b31ca641e82de8f943f59 100644 --- a/modules/recurring_events_registration/recurring_events_registration.install +++ b/modules/recurring_events_registration/recurring_events_registration.install @@ -6,6 +6,7 @@ */ use Drupal\Core\Field\BaseFieldDefinition; +use Drupal\recurring_events_registration\Plugin\Field\ComputedRegistrantTitleFieldItemList; /** * Install the schema updates for eventseries entities to add registration. @@ -31,3 +32,22 @@ function recurring_events_registration_install() { \Drupal::entityDefinitionUpdateManager() ->installFieldStorageDefinition('event_registration', 'eventseries', 'eventseries', $storage_definition); } + +/** + * Add the computed title field to registrants. + */ +function recurring_events_registration_update_8001() { + $storage_definition = BaseFieldDefinition::create('string') + ->setLabel(t('Title')) + ->setReadOnly(TRUE) + ->setComputed(TRUE) + ->setClass(ComputedRegistrantTitleFieldItemList::class); + + \Drupal::entityDefinitionUpdateManager() + ->installFieldStorageDefinition('title', 'registrant', 'registrant', $storage_definition); + + // Configure the registrants title field. + \Drupal::configFactory()->getEditable('recurring_events_registration.registrant.config') + ->set('title', '[registrant:email]') + ->save(TRUE); +} diff --git a/modules/recurring_events_registration/recurring_events_registration.services.yml b/modules/recurring_events_registration/recurring_events_registration.services.yml index 862ba2333b455222b606e908d4295d8a77a37801..121738644419547c2e40dc94976ca1655d0190b3 100644 --- a/modules/recurring_events_registration/recurring_events_registration.services.yml +++ b/modules/recurring_events_registration/recurring_events_registration.services.yml @@ -1,8 +1,8 @@ services: recurring_events_registration.creation_service: class: Drupal\recurring_events_registration\RegistrationCreationService - arguments: ['@string_translation', '@database', '@logger.factory', '@messenger', '@entity_type.manager'] + arguments: ['@string_translation', '@database', '@logger.factory', '@messenger', '@entity_type.manager', '@module_handler', '@token'] recurring_events_registration.notification_service: class: Drupal\recurring_events_registration\NotificationService - arguments: ['@string_translation', '@config.factory', '@logger.factory', '@messenger', '@token', '@module_handler'] + arguments: ['@string_translation', '@config.factory', '@logger.factory', '@messenger', '@token', '@module_handler', '@recurring_events_registration.creation_service'] \ No newline at end of file diff --git a/modules/recurring_events_registration/recurring_events_registration.tokens.inc b/modules/recurring_events_registration/recurring_events_registration.tokens.inc index f13beab19c39afc859935ca0916804f467126114..85e0b02a5672697a8df1fbf394352dd08a59ca23 100644 --- a/modules/recurring_events_registration/recurring_events_registration.tokens.inc +++ b/modules/recurring_events_registration/recurring_events_registration.tokens.inc @@ -35,6 +35,11 @@ function recurring_events_registration_token_info() { 'needs-data' => 'registrant', ]; + $registrant['email'] = [ + 'name' => t('Registrant Email'), + 'description' => t('The email of the registrant.'), + ]; + $registrant['edit_url'] = [ 'name' => t('Edit Registrant URL'), 'description' => t('The URL to edit a registrant.'), @@ -85,6 +90,10 @@ function recurring_events_registration_tokens($type, $tokens, array $data, array $registrant = $data['registrant']; foreach ($tokens as $name => $original) { switch ($name) { + case 'email': + $replacements[$original] = $registrant->email->value; + break; + case 'edit_url': $url = $registrant->toUrl('edit-form')->setAbsolute(TRUE)->toString(); if ($registrant->user_id->target_id === '0') { diff --git a/modules/recurring_events_registration/src/Entity/Registrant.php b/modules/recurring_events_registration/src/Entity/Registrant.php index a7bbe8678ddfe690136ee9c03a2dd3b11053c579..38319be24449d88df99e4cf5cb8d805c9c41b121 100644 --- a/modules/recurring_events_registration/src/Entity/Registrant.php +++ b/modules/recurring_events_registration/src/Entity/Registrant.php @@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityTypeInterface; use Drupal\user\UserInterface; use Drupal\recurring_events\Entity\EventInstance; use Drupal\recurring_events\Entity\EventSeries; +use Drupal\recurring_events_registration\Plugin\Field\ComputedRegistrantTitleFieldItemList; /** * Defines the Registrant entity. @@ -42,6 +43,7 @@ use Drupal\recurring_events\Entity\EventSeries; * "id" = "id", * "uuid" = "uuid", * "uid" = "user_id", + * "label" = "title", * }, * links = { * "canonical" = "/events/{eventinstance}/registrant/{registrant}", @@ -204,6 +206,12 @@ class Registrant extends ContentEntityBase implements RegistrantInterface { ->setLabel(t('Changed')) ->setDescription(t('The time that the entity was last edited.')); + $fields['title'] = BaseFieldDefinition::create('string') + ->setLabel(t('Title')) + ->setReadOnly(TRUE) + ->setComputed(TRUE) + ->setClass(ComputedRegistrantTitleFieldItemList::class); + return $fields; } diff --git a/modules/recurring_events_registration/src/Form/RegistrantSettingsForm.php b/modules/recurring_events_registration/src/Form/RegistrantSettingsForm.php index 1cb832e3d6395b1b235ad2278f829e7f91f39ef9..a651023b869bc64b03100c50742e3d1bc1ed9e1e 100644 --- a/modules/recurring_events_registration/src/Form/RegistrantSettingsForm.php +++ b/modules/recurring_events_registration/src/Form/RegistrantSettingsForm.php @@ -8,6 +8,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\Core\Url; use Drupal\Core\Link; use Drupal\recurring_events_registration\NotificationService; +use Drupal\recurring_events_registration\RegistrationCreationService; /** * Class RegistrantSettingsForm. @@ -23,14 +24,24 @@ class RegistrantSettingsForm extends ConfigFormBase { */ protected $notificationService; + /** + * The registration creation service. + * + * @var \Drupal\recurring_events_registration\RegistrationCreationService + */ + protected $creationService; + /** * Constructs a RegistrantSettingsForm object. * * @param \Drupal\recurring_events_registration\NotificationService $notification_service * The registration notification service. + * @param \Drupal\recurring_events_registration\RegistrationCreationService $creation_service + * The registration creation service. */ - public function __construct(NotificationService $notification_service) { + public function __construct(NotificationService $notification_service, RegistrationCreationService $creation_service) { $this->notificationService = $notification_service; + $this->creationService = $creation_service; } /** @@ -38,7 +49,8 @@ class RegistrantSettingsForm extends ConfigFormBase { */ public static function create(ContainerInterface $container) { return new static( - $container->get('recurring_events_registration.notification_service') + $container->get('recurring_events_registration.notification_service'), + $container->get('recurring_events_registration.creation_service') ); } @@ -72,6 +84,7 @@ class RegistrantSettingsForm extends ConfigFormBase { ->set('show_capacity', $form_state->getValue('show_capacity')) ->set('limit', $form_state->getValue('limit')) ->set('date_format', $form_state->getValue('date_format')) + ->set('title', $form_state->getValue('title')) ->set('email_notifications', $form_state->getValue('email_notifications')); $notification_types = []; @@ -141,6 +154,20 @@ class RegistrantSettingsForm extends ConfigFormBase { '#default_value' => $config->get('date_format'), ]; + $registrant_tokens = $this->creationService->getAvailableTokens(['registrant']); + + $form['display']['title'] = [ + '#type' => 'textfield', + '#title' => $this->t('Registrant Title'), + '#required' => TRUE, + '#description' => $this->t('Enter the format for the title field', [ + '@link' => $php_date_link->toString(), + ]), + '#default_value' => $config->get('title'), + ]; + + $form['display']['tokens'] = $registrant_tokens; + $form['notifications'] = [ '#type' => 'details', '#title' => $this->t('Email Notifications'), diff --git a/modules/recurring_events_registration/src/NotificationService.php b/modules/recurring_events_registration/src/NotificationService.php index 70e0e02c336fe5936fbdb1dcca62d6d04c521cd1..ab90e26b3d3553b5e10f82f3e7129bbfe849129e 100644 --- a/modules/recurring_events_registration/src/NotificationService.php +++ b/modules/recurring_events_registration/src/NotificationService.php @@ -57,6 +57,13 @@ class NotificationService { */ protected $moduleHandler; + /** + * The registration creation service. + * + * @var \Drupal\recurring_events_registration\RegistrationCreationService + */ + protected $creationService; + /** * The registrant entity. * @@ -121,14 +128,17 @@ class NotificationService { * The token service. * @param \Drupal\Core\Extension\ModuleHandler $module_handler * The module handler service. + * @param \Drupal\recurring_events_registration\RegistrationCreationService $creation_service + * The registration creation service. */ - public function __construct(TranslationInterface $translation, ConfigFactory $config_factory, LoggerChannelFactoryInterface $logger, Messenger $messenger, Token $token, ModuleHandler $module_handler) { + public function __construct(TranslationInterface $translation, ConfigFactory $config_factory, LoggerChannelFactoryInterface $logger, Messenger $messenger, Token $token, ModuleHandler $module_handler, RegistrationCreationService $creation_service) { $this->translation = $translation; $this->configFactory = $config_factory; $this->loggerFactory = $logger->get('recurring_events_registration'); $this->messenger = $messenger; $this->token = $token; $this->moduleHandler = $module_handler; + $this->creationService = $creation_service; $this->configName = 'recurring_events_registration.registrant.config'; } @@ -143,7 +153,7 @@ class NotificationService { $container->get('messenger'), $container->get('token'), $container->get('module_handler'), - $container->get('string_translation') + $container->get('recurring_events_registration.creation_service') ); } @@ -430,34 +440,7 @@ class NotificationService { 'registrant', ]; - if ($this->moduleHandler->moduleExists('token')) { - $token_help = [ - '#theme' => 'token_tree_link', - '#token_types' => $relevant_tokens, - ]; - } - else { - $all_tokens = $this->token->getInfo(); - $tokens = []; - foreach ($relevant_tokens as $token_prefix) { - if (!empty($all_tokens['tokens'][$token_prefix])) { - foreach ($all_tokens['tokens'][$token_prefix] as $token_key => $value) { - $tokens[] = '[' . $token_prefix . ':' . $token_key . ']'; - } - } - } - - $token_text = $this->translation->translate('Available tokens are: @tokens', [ - '@tokens' => implode(', ', $tokens), - ]); - - $token_help = [ - '#type' => 'markup', - '#markup' => $token_text->render(), - ]; - } - - return $token_help; + return $this->creationService->getAvailableTokens($relevant_tokens); } } diff --git a/modules/recurring_events_registration/src/Plugin/Field/ComputedRegistrantTitleFieldItemList.php b/modules/recurring_events_registration/src/Plugin/Field/ComputedRegistrantTitleFieldItemList.php new file mode 100644 index 0000000000000000000000000000000000000000..dbe076c29e9cbfe943fc4aca7befd2c9d61da813 --- /dev/null +++ b/modules/recurring_events_registration/src/Plugin/Field/ComputedRegistrantTitleFieldItemList.php @@ -0,0 +1,29 @@ +<?php + +namespace Drupal\recurring_events_registration\Plugin\Field; + +use Drupal\Core\Field\FieldItemList; +use Drupal\Core\TypedData\ComputedItemListTrait; + +/** + * The ComputedRegistrantTitleFieldItemList class. + */ +final class ComputedRegistrantTitleFieldItemList extends FieldItemList { + use ComputedItemListTrait; + + /** + * {@inheritdoc} + */ + protected function computeValue() { + $registrant = $this->getEntity(); + $config = \Drupal::config('recurring_events_registration.registrant.config'); + $title_config = $config->get('title'); + + $data = [ + 'registrant' => $registrant, + ]; + $title = \Drupal::service('token')->replace($title_config, $data); + $this->list[0] = $this->createItem(0, $title); + } + +} diff --git a/modules/recurring_events_registration/src/RegistrationCreationService.php b/modules/recurring_events_registration/src/RegistrationCreationService.php index ce1dd30c41dff12d137b569d60641ce1381fb287..6451c48830ff249c72f42e2b09bbafabc56b920a 100644 --- a/modules/recurring_events_registration/src/RegistrationCreationService.php +++ b/modules/recurring_events_registration/src/RegistrationCreationService.php @@ -11,6 +11,8 @@ use Drupal\recurring_events\Entity\EventSeries; use Drupal\Core\Messenger\Messenger; use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface; use Drupal\Core\Entity\EntityTypeManager; +use Drupal\Core\Extension\ModuleHandler; +use Drupal\Core\Utility\Token; /** * RegistrationCreationService class. @@ -66,6 +68,20 @@ class RegistrationCreationService { */ protected $eventSeries; + /** + * The module handler service. + * + * @var \Drupal\Core\Extension\ModuleHandler + */ + protected $moduleHandler; + + /** + * The token service. + * + * @var \Drupal\Core\Utility\Token + */ + protected $token; + /** * Class constructor. * @@ -79,13 +95,19 @@ class RegistrationCreationService { * The messenger service. * @param \Drupal\Core\Entity\EntityTypeManager $entity_type_manager * The entity type manager service. + * @param \Drupal\Core\Extension\ModuleHandler $module_handler + * The module handler service. + * @param \Drupal\Core\Utility\Token $token + * The token service. */ - public function __construct(TranslationInterface $translation, Connection $database, LoggerChannelFactoryInterface $logger, Messenger $messenger, EntityTypeManager $entity_type_manager) { + public function __construct(TranslationInterface $translation, Connection $database, LoggerChannelFactoryInterface $logger, Messenger $messenger, EntityTypeManager $entity_type_manager, ModuleHandler $module_handler, Token $token) { $this->translation = $translation; $this->database = $database; $this->loggerFactory = $logger->get('recurring_events_registration'); $this->messenger = $messenger; $this->storage = $entity_type_manager->getStorage('registrant'); + $this->moduleHandler = $module_handler; + $this->token = $token; } /** @@ -97,7 +119,9 @@ class RegistrationCreationService { $container->get('database'), $container->get('logger.factory'), $container->get('messenger'), - $container->get('entity_type.manager') + $container->get('entity_type.manager'), + $container->get('module_handler'), + $container->get('token') ); } @@ -494,4 +518,38 @@ class RegistrationCreationService { } } + /** + * Retrieve the tokens available for a registrant. + */ + public function getAvailableTokens($relevant_tokens = ['registrant']) { + if ($this->moduleHandler->moduleExists('token')) { + $token_help = [ + '#theme' => 'token_tree_link', + '#token_types' => $relevant_tokens, + ]; + } + else { + $all_tokens = $this->token->getInfo(); + $tokens = []; + foreach ($relevant_tokens as $token_prefix) { + if (!empty($all_tokens['tokens'][$token_prefix])) { + foreach ($all_tokens['tokens'][$token_prefix] as $token_key => $value) { + $tokens[] = '[' . $token_prefix . ':' . $token_key . ']'; + } + } + } + + $token_text = $this->translation->translate('Available tokens are: @tokens', [ + '@tokens' => implode(', ', $tokens), + ]); + + $token_help = [ + '#type' => 'markup', + '#markup' => $token_text->render(), + ]; + } + + return $token_help; + } + }