You are here

public function ConfirmationController::confirmCombined in Simplenews 8

Same name and namespace in other branches
  1. 8.2 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

$snid: The subscriber id.

$timestamp: The timestamp of the request.

$hash: The confirmation hash.

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 30

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 = array(
    array(
      '#tag' => 'meta',
      '#attributes' => array(
        'name' => 'robots',
        'content' => 'noindex',
      ),
    ),
    'simplenews-noindex',
  );
  $subscriber = simplenews_subscriber_load($snid);

  // Redirect and display message if no changes are available.
  if ($subscriber && !$subscriber
    ->getChanges()) {
    $this
      ->messenger()
      ->addMessage(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 = array(
        '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(array());
      $subscriber
        ->save();
      $this
        ->messenger()
        ->addMessage(t('Subscription changes confirmed for %user.', array(
        '%user' => $subscriber
          ->getMail(),
      )));
      return $this
        ->redirect('<front>');
    }
  }
  throw new NotFoundHttpException();
}