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