/**
  * Implement getEmails($states, $subscribed, $newsletters)
  */
 function getEmails($states, $subscribed, $newsletters)
 {
     // Build conditions for active state, subscribed state and newsletter selection.
     if (isset($states['active'])) {
         $condition_active[] = SubscriberInterface::ACTIVE;
     }
     if (isset($states['inactive'])) {
         $condition_active[] = SubscriberInterface::INACTIVE;
     }
     if (isset($subscribed['subscribed'])) {
         $condition_subscribed[] = SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED;
     }
     if (isset($subscribed['unsubscribed'])) {
         $condition_subscribed[] = SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED;
     }
     if (isset($subscribed['unconfirmed'])) {
         $condition_subscribed[] = SIMPLENEWS_SUBSCRIPTION_STATUS_UNCONFIRMED;
     }
     // Get emails from the database.
     $query = \Drupal::entityQuery('simplenews_subscriber')->condition('status', $condition_active)->condition('subscriptions.status', $condition_subscribed)->condition('subscriptions.target_id', (array) $newsletters, 'IN');
     $subscriber_ids = $query->execute();
     $mails = array();
     foreach ($subscriber_ids as $id) {
         $subscriber = simplenews_subscriber_load($id);
         $mails[] = $subscriber->getMail();
     }
     // Return comma separated array of emails or empty text.
     if ($mails) {
         return implode(", ", $mails);
     }
     return t('No addresses were found.');
 }
 /**
  * {@inheritdoc}
  */
 public function buildForm(array $form, FormStateInterface $form_state, $snid = NULL, $timestamp = NULL, $hash = NULL)
 {
     $user = \Drupal::currentUser();
     if ($subscriber = simplenews_subscriber_load_by_uid($user->id())) {
         $this->setEntity($subscriber);
     } elseif ($mail = $user->getEmail()) {
         $this->setEntity(Subscriber::create(array('mail' => $mail)));
     } elseif ($snid && $timestamp && $hash) {
         $subscriber = simplenews_subscriber_load($snid);
         if ($subscriber && $hash == simplenews_generate_hash($subscriber->getMail(), 'manage', $timestamp)) {
             $this->setEntity($subscriber);
         } else {
             throw new NotFoundHttpException();
         }
     }
     return parent::buildForm($form, $form_state);
 }
 /**
  * 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.
  *
  * @see simplenews_confirm_add_form()
  * @see simplenews_confirm_removal_form()
  *
  * @param $action
  *   Either add or remove.
  * @param $snid
  *   The subscriber id.
  * @param $newsletter_id
  *   The newsletter id.
  * @param $timestamp
  *   The timestamp of the request.
  * @param $hash
  *   The confirmation hash.
  */
 function confirmSubscription($action, $snid, $newsletter_id, $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);
     if ($subscriber && $hash == simplenews_generate_hash($subscriber->getMail(), $action, $timestamp)) {
         $newsletter = simplenews_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 = array('simplenews_subscriber' => $subscriber, 'newsletter' => $newsletter);
             $token = $action == 'add' ? 'subscribe' : 'unsubscribe';
             $build = \Drupal::formBuilder()->getForm('\\Drupal\\simplenews\\Form\\RequestHashForm', $token, $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());
                 }
                 drupal_set_message(t('%user was unsubscribed from the %newsletter mailing list.', array('%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());
                 }
                 drupal_set_message(t('%user was added to the %newsletter mailing list.', array('%user' => $subscriber->getMail(), '%newsletter' => $newsletter->name)));
                 return $this->redirect('<front>');
             }
         }
     }
     throw new NotFoundHttpException();
 }