You are here

class ConfirmationController in Simplenews 3.x

Same name and namespace in other branches
  1. 8.2 src/Controller/ConfirmationController.php \Drupal\simplenews\Controller\ConfirmationController
  2. 8 src/Controller/ConfirmationController.php \Drupal\simplenews\Controller\ConfirmationController

Returns responses for confirmation and subscriber routes.

Hierarchy

Expanded class hierarchy of ConfirmationController

File

src/Controller/ConfirmationController.php, line 14

Namespace

Drupal\simplenews\Controller
View source
class ConfirmationController extends ControllerBase {

  /**
   * Menu callback: confirm a combined confirmation request.
   *
   * This function is called by clicking the confirm link in the confirmation
   * email. It handles both subscription addition and subscription removal.
   *
   * @param int $snid
   *   The subscriber id.
   * @param int $timestamp
   *   The timestamp of the request.
   * @param bool $hash
   *   The confirmation hash.
   * @param bool $immediate
   *   Perform the action immediately if TRUE.
   *
   * @see simplenews_confirm_add_form()
   * @see simplenews_confirm_removal_form()
   */
  public function confirmCombined($snid, $timestamp, $hash, $immediate = FALSE) {
    $config = \Drupal::config('simplenews.settings');

    // Prevent search engines from indexing this page.
    $html_head = [
      [
        '#tag' => 'meta',
        '#attributes' => [
          'name' => 'robots',
          'content' => 'noindex',
        ],
      ],
      'simplenews-noindex',
    ];
    $subscriber = Subscriber::load($snid);

    // Redirect and display message if no changes are available.
    if ($subscriber && !$subscriber
      ->getChanges()) {
      $this
        ->messenger()
        ->addMessage($this
        ->t('All changes to your subscriptions where already applied. No changes made.'));
      return $this
        ->redirect('<front>');
    }
    if ($subscriber && $hash == simplenews_generate_hash($subscriber
      ->getMail(), 'combined' . serialize($subscriber
      ->getChanges()), $timestamp)) {

      // If the hash is valid but timestamp is too old, display form to request
      // a new hash.
      if ($timestamp < REQUEST_TIME - $config
        ->get('hash_expiration')) {
        $context = [
          'simplenews_subscriber' => $subscriber,
        ];
        $build = \Drupal::formBuilder()
          ->getForm('\\Drupal\\simplenews\\Form\\RequestHashForm', 'subscribe_combined', $context);
        $build['#attached']['html_head'][] = $html_head;
        return $build;
      }

      // When not called with immediate parameter the user will be directed to
      // the (un)subscribe confirmation page.
      if (!$immediate) {
        $build = \Drupal::formBuilder()
          ->getForm('\\Drupal\\simplenews\\Form\\ConfirmMultiForm', $subscriber);
        $build['#attached']['html_head'][] = $html_head;
        return $build;
      }
      else {

        /** @var \Drupal\simplenews\Subscription\SubscriptionManagerInterface $subscription_manager */
        $subscription_manager = \Drupal::service('simplenews.subscription_manager');

        // Redirect and display message if no changes are available.
        foreach ($subscriber
          ->getChanges() as $newsletter_id => $action) {
          if ($action == 'subscribe') {
            $subscription_manager
              ->subscribe($subscriber
              ->getMail(), $newsletter_id, FALSE, 'website');
          }
          elseif ($action == 'unsubscribe') {
            $subscription_manager
              ->unsubscribe($subscriber
              ->getMail(), $newsletter_id, FALSE, 'website');
          }
        }

        // Clear changes.
        $subscriber
          ->setChanges([]);
        $subscriber
          ->save();
        $this
          ->messenger()
          ->addMessage($this
          ->t('Subscription changes confirmed for %user.', [
          '%user' => $subscriber
            ->getMail(),
        ]));
        return $this
          ->redirect('<front>');
      }
    }
    throw new NotFoundHttpException();
  }

  /**
   * Menu callback: confirm the user's (un)subscription request.
   *
   * This function is called by clicking the confirm link in the confirmation
   * email or the unsubscribe link in the footer of the newsletter. It handles
   * both subscription addition and subscription removal.
   *
   * Calling URLs are:
   * newsletter/confirm/add
   * newsletter/confirm/add/$HASH
   * newsletter/confirm/remove
   * newsletter/confirm/remove/$HASH
   *
   * @see simplenews_confirm_add_form()
   * @see simplenews_confirm_removal_form()
   */

  /**
   * Menu callback: confirm the user's (un)subscription request.
   *
   * This function is called by clicking the confirm link in the confirmation
   * email or the unsubscribe link in the footer of the newsletter. It handles
   * both subscription addition and subscription removal.
   *
   * @param string $action
   *   Either add or remove.
   * @param int $snid
   *   The subscriber id.
   * @param int $newsletter_id
   *   The newsletter id.
   * @param int $timestamp
   *   The timestamp of the request.
   * @param string $hash
   *   The confirmation hash.
   * @param bool $immediate
   *   Perform the action immediately if TRUE.
   *
   * @see simplenews_confirm_add_form()
   * @see simplenews_confirm_removal_form()
   */
  public function confirmSubscription($action, $snid, $newsletter_id, $timestamp, $hash, $immediate = FALSE) {
    $config = \Drupal::config('simplenews.settings');

    // Prevent search engines from indexing this page.
    $html_head = [
      [
        '#tag' => 'meta',
        '#attributes' => [
          'name' => 'robots',
          'content' => 'noindex',
        ],
      ],
      'simplenews-noindex',
    ];
    $subscriber = Subscriber::load($snid);
    if ($subscriber && $hash == simplenews_generate_hash($subscriber
      ->getMail(), $action, $timestamp)) {
      $newsletter = Newsletter::load($newsletter_id);

      // If the hash is valid but timestamp is too old, display form to request
      // a new hash.
      if ($timestamp < REQUEST_TIME - $config
        ->get('hash_expiration')) {
        $context = [
          'simplenews_subscriber' => $subscriber,
          'newsletter' => $newsletter,
        ];
        $key = $action == 'add' ? 'subscribe_combined' : 'validate';
        $build = \Drupal::formBuilder()
          ->getForm('\\Drupal\\simplenews\\Form\\RequestHashForm', $key, $context);
        $build['#attached']['html_head'][] = $html_head;
        return $build;
      }

      // When called with additional arguments the user will be directed to the
      // (un)subscribe confirmation page. The additional arguments will be
      // passed on to the confirmation page.
      if (!$immediate) {
        if ($action == 'remove') {
          $build = \Drupal::formBuilder()
            ->getForm('\\Drupal\\simplenews\\Form\\ConfirmRemovalForm', $subscriber
            ->getMail(), $newsletter);
          $build['#attached']['html_head'][] = $html_head;
          return $build;
        }
        elseif ($action == 'add') {
          $build = \Drupal::formBuilder()
            ->getForm('\\Drupal\\simplenews\\Form\\ConfirmAddForm', $subscriber
            ->getMail(), $newsletter);
          $build['#attached']['html_head'][] = $html_head;
          return $build;
        }
      }
      else {

        /** @var \Drupal\simplenews\Subscription\SubscriptionManagerInterface $subscription_manager */
        $subscription_manager = \Drupal::service('simplenews.subscription_manager');
        if ($action == 'remove') {
          $subscription_manager
            ->unsubscribe($subscriber
            ->getMail(), $newsletter_id, FALSE, 'website');
          if ($path = $config
            ->get('subscription.confirm_unsubscribe_page')) {
            return $this
              ->redirect(Url::fromUri("internal:{$path}")
              ->getRouteName());
          }
          $this
            ->messenger()
            ->addMessage($this
            ->t('%user was unsubscribed from the %newsletter mailing list.', [
            '%user' => $subscriber
              ->getMail(),
            '%newsletter' => $newsletter->name,
          ]));
          return $this
            ->redirect('<front>');
        }
        elseif ($action == 'add') {
          $subscription_manager
            ->subscribe($subscriber
            ->getMail(), $newsletter_id, FALSE, 'website');
          if ($path = $config
            ->get('subscription.confirm_subscribe_page')) {
            return $this
              ->redirect(Url::fromUri("internal:{$path}")
              ->getRouteName());
          }
          $this
            ->messenger()
            ->addMessage($this
            ->t('%user was added to the %newsletter mailing list.', [
            '%user' => $subscriber
              ->getMail(),
            '%newsletter' => $newsletter->name,
          ]));
          return $this
            ->redirect('<front>');
        }
      }
    }
    throw new NotFoundHttpException();
  }

  /**
   * Redirects subscribers to the appropriate page.
   *
   * Redirect to the 'Newsletters' tab for authenticated users or the 'Access
   * your subscriptions' page otherwise.
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   Returns a redirect to the correct page.
   */
  public function subscriptionsPage() {
    $user = $this
      ->currentUser();
    if ($user
      ->isAuthenticated()) {
      return $this
        ->redirect('simplenews.newsletter_subscriptions_user', [
        'user' => $user
          ->id(),
      ]);
    }
    return $this
      ->redirect('simplenews.newsletter_validate');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ConfirmationController::confirmCombined public function Menu callback: confirm a combined confirmation request.
ConfirmationController::confirmSubscription public function Menu callback: confirm the user's (un)subscription request.
ConfirmationController::subscriptionsPage public function Redirects subscribers to the appropriate page.
ControllerBase::$configFactory protected property The configuration factory.
ControllerBase::$currentUser protected property The current user service. 1
ControllerBase::$entityFormBuilder protected property The entity form builder.
ControllerBase::$entityTypeManager protected property The entity type manager.
ControllerBase::$formBuilder protected property The form builder. 2
ControllerBase::$keyValue protected property The key-value storage. 1
ControllerBase::$languageManager protected property The language manager. 1
ControllerBase::$moduleHandler protected property The module handler. 2
ControllerBase::$stateService protected property The state service.
ControllerBase::cache protected function Returns the requested cache bin.
ControllerBase::config protected function Retrieves a configuration object.
ControllerBase::container private function Returns the service container.
ControllerBase::create public static function Instantiates a new instance of this class. Overrides ContainerInjectionInterface::create 46
ControllerBase::currentUser protected function Returns the current user. 1
ControllerBase::entityFormBuilder protected function Retrieves the entity form builder.
ControllerBase::entityTypeManager protected function Retrieves the entity type manager.
ControllerBase::formBuilder protected function Returns the form builder service. 2
ControllerBase::keyValue protected function Returns a key/value storage collection. 1
ControllerBase::languageManager protected function Returns the language manager service. 1
ControllerBase::moduleHandler protected function Returns the module handler. 2
ControllerBase::redirect protected function Returns a redirect response object for the specified route.
ControllerBase::state protected function Returns the state storage service.
LoggerChannelTrait::$loggerFactory protected property The logger channel factory service.
LoggerChannelTrait::getLogger protected function Gets the logger for a specific channel.
LoggerChannelTrait::setLoggerFactory public function Injects the logger channel factory.
MessengerTrait::$messenger protected property The messenger. 27
MessengerTrait::messenger public function Gets the messenger. 27
MessengerTrait::setMessenger public function Sets the messenger.
RedirectDestinationTrait::$redirectDestination protected property The redirect destination service. 1
RedirectDestinationTrait::getDestinationArray protected function Prepares a 'destination' URL query parameter for use with \Drupal\Core\Url.
RedirectDestinationTrait::getRedirectDestination protected function Returns the redirect destination service.
RedirectDestinationTrait::setRedirectDestination public function Sets the redirect destination service.
StringTranslationTrait::$stringTranslation protected property The string translation service. 4
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.