You are here

public function ConfirmationController::confirmCombined in Simplenews 8.2

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

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.

Parameters

int $snid: The subscriber id.

int $timestamp: The timestamp of the request.

bool $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::confirmCombined'
simplenews.routing.yml in ./simplenews.routing.yml
simplenews.routing.yml

File

src/Controller/ConfirmationController.php, line 34

Class

ConfirmationController
Returns responses for confirmation routes.

Namespace

Drupal\simplenews\Controller

Code

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