You are here

public function ConfirmationController::confirmSubscription in Simplenews 3.x

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

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.

Parameters

string $action: Either add or remove.

int $snid: The subscriber id.

int $newsletter_id: The newsletter id.

int $timestamp: The timestamp of the request.

string $hash: The confirmation hash.

bool $immediate: Perform the action immediately if TRUE.

See also

simplenews_confirm_add_form()

simplenews_confirm_removal_form()

1 string reference to 'ConfirmationController::confirmSubscription'
simplenews.routing.yml in ./simplenews.routing.yml
simplenews.routing.yml

File

src/Controller/ConfirmationController.php, line 141

Class

ConfirmationController
Returns responses for confirmation and subscriber routes.

Namespace

Drupal\simplenews\Controller

Code

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();
}