danse_moderation_notifications-1.0.x-dev/src/Tokens.php
src/Tokens.php
<?php namespace Drupal\danse_moderation_notifications; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Entity\ContentEntityInterface; use Drupal\Core\Render\BubbleableMetadata; use Drupal\Core\Render\Markup; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\Utility\Token; use Drupal\danse\Plugin\PushFrameworkSource\DanseNotification; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Token generation and information class. */ class Tokens implements ContainerInjectionInterface { use StringTranslationTrait; /** * The notification information service. * * @var \Drupal\danse_moderation_notifications\NotificationInformationInterface */ protected $notificationInformation; /** * The token service. * * @var \Drupal\Core\Utility\Token */ protected Token $token; /** * Constructs the token generation object. * * @param \Drupal\danse_moderation_notifications\NotificationInformationInterface $notification_information * The notification information service. * @param \Drupal\Core\Utility\Token $token * The token service. */ public function __construct(NotificationInformationInterface $notification_information, Token $token) { $this->notificationInformation = $notification_information; $this->token = $token; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('danse_moderation_notifications.notification_information'), $container->get('token') ); } /** * Token information. * * @see \danse_moderation_notifications_token_info() */ public static function info() { $type = [ 'name' => t('Content moderation states'), 'description' => t('Content moderation state transition tokens.'), 'needs-data' => 'entity', ]; $tokens['workflow'] = [ 'name' => t('Workflow'), 'description' => t('The name of the corresponding workflow.'), ]; $tokens['from-state'] = [ 'name' => t('Old moderation state'), 'description' => t('The previous state of the moderated content.'), ]; $tokens['to-state'] = [ 'name' => t('Current moderation state'), 'description' => t('The new/current state of the moderated content.'), ]; $tokens['notification-subject'] = [ 'name' => t('Notification Subject'), 'description' => t('The email notification subject line used for push framework.'), ]; $tokens['notification-message'] = [ 'name' => t('Notification Message'), 'description' => t('The email notification body used for push framework.'), ]; return [ 'types' => ['danse_moderation_notifications' => $type], 'tokens' => [ 'danse_moderation_notifications' => $tokens, ], ]; } /** * Generate tokens. * * @param string $type * The machine-readable name of the type (group) of token being replaced, * such as 'node', 'user', or another type defined by a hook_token_info() * implementation. * @param array $tokens * An array of tokens to be replaced. The keys are the machine-readable * token names, and the values are the raw [type:token] strings that * appeared in the original text. * @param array $data * An associative array of data objects to be used when generating * replacement values, as supplied in the $data parameter to * \Drupal\Core\Utility\Token::replace(). * @param array $options * An associative array of options for token replacement; see * \Drupal\Core\Utility\Token::replace() for possible values. * @param \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata * Bubbleable metadata. * * @return array * An associative array of replacement values, keyed by the raw [type:token] * strings from the original text. The returned values must be either plain * text strings, or an object implementing MarkupInterface if they are * HTML-formatted. * * @see \danse_moderation_notifications_tokens() */ public function getTokens($type, array $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) { $replacements = []; if ($type === 'danse_moderation_notifications' && isset($data['entity']) && $data['entity'] instanceof ContentEntityInterface) { $entity = $data['entity']; if ($this->notificationInformation->isModeratedEntity($entity)) { foreach ($tokens as $name => $original) { switch ($name) { case 'workflow': $workflow = $this->notificationInformation ->getWorkflow($entity) ->label(); $replacements[$original] = $workflow; $bubbleable_metadata->addCacheableDependency($workflow); break; case 'from-state': if ($transition = $this->notificationInformation->getTransition($entity)) { $replacements[$original] = $this->notificationInformation->getPreviousState($entity)->label(); $bubbleable_metadata->addCacheableDependency($transition); } break; case 'to-state': if ($transition = $this->notificationInformation->getTransition($entity)) { $replacements[$original] = $transition->to()->label(); $bubbleable_metadata->addCacheableDependency($transition); } break; } } } } // Replace tokens in push framework context. if ($type === 'danse_moderation_notifications' && !empty($data['push_framework_source_plugin']) && !empty($data['push_framework_source_id'])) { $source_plugin = $data['push_framework_source_plugin']; $source_id = $data['push_framework_source_id']; if ($source_plugin instanceof DanseNotification) { $entity = $source_plugin->getObjectAsEntity($source_id); $notifications = $this->notificationInformation->getNotifications($entity); // We are assuming the latest notification is the only one returned. $notification = reset($notifications); if ($notification instanceof DanseModerationNotificationsInterface) { $token_data = [ 'node' => $entity, ]; foreach ($tokens as $name => $original) { switch ($name) { case 'notification-subject': $replacement = $this->token->replace($notification->getSubject(), $token_data, ['clear' => TRUE]); $replacements[$original] = Markup::create($replacement); $bubbleable_metadata->addCacheableDependency($notification); break; case 'notification-message': $replacement = $this->token->replace($notification->getMessage(), $token_data, ['clear' => TRUE]); $replacements[$original] = Markup::create($replacement); $bubbleable_metadata->addCacheableDependency($notification); break; } } } } } return $replacements; } }