/**
  * Tests that fields are synchronized using the Subscriber form.
  */
 public function testSubscriberFormFieldSync()
 {
     // Create a subscriber for the user.
     $subscriber = Subscriber::create(array('uid' => $this->user->id(), 'mail' => '*****@*****.**'));
     $subscriber->save();
     // Edit subscriber field and assert user field is changed accordingly.
     $this->drupalLogin($this->user);
     $this->drupalGet('admin/people/simplenews/edit/' . $subscriber->id());
     $this->assertField('field_shared[0][value]');
     $this->assertRaw($this->user->field_shared->value);
     $new_value = $this->randomMachineName();
     $this->drupalPostForm(NULL, array('field_shared[0][value]' => $new_value), t('Save'));
     $this->drupalGet('admin/people/simplenews/edit/' . $subscriber->id());
     $this->assertRaw($new_value);
     $this->user = User::load($this->user->id());
     $this->assertEqual($this->user->field_shared->value, $new_value);
     // Unset the sync setting and assert field is not synced.
     $this->drupalPostForm('admin/config/people/simplenews/settings/subscriber', array('simplenews_sync_fields' => FALSE), t('Save configuration'));
     $unsynced_value = $this->randomMachineName();
     $this->drupalPostForm('admin/people/simplenews/edit/' . $subscriber->id(), array('field_shared[0][value]' => $unsynced_value), t('Save'));
     $this->drupalGet('admin/people/simplenews/edit/' . $subscriber->id());
     $this->assertRaw($unsynced_value);
     $this->user = User::load($this->user->id());
     $this->assertEqual($this->user->field_shared->value, $new_value);
     $this->assertNotEqual($this->user->field_shared->value, $unsynced_value);
 }
 /**
  * {@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);
 }
 /**
  * Unsets the sync setting and asserts that fields are not synced.
  */
 public function testDisableSync()
 {
     // Disable sync.
     $this->config('simplenews.settings')->set('subscriber.sync_fields', FALSE)->save();
     // Create and attach a field to both.
     $this->addField('string', 'field_on_both', 'simplenews_subscriber');
     $this->addField('string', 'field_on_both', 'user');
     // Create a user with a value for the field.
     $user = User::create(array('name' => 'user', 'field_on_both' => 'foo', 'mail' => '*****@*****.**'));
     $user->save();
     // Create a subscriber.
     $subscriber = Subscriber::create(array('mail' => '*****@*****.**'));
     // Assert that the shared field does not get the value from the user.
     $this->assertNull($subscriber->get('field_on_both')->value);
     // Update the subscriber and assert that it is not synced to the user.
     $subscriber->set('field_on_both', 'bar');
     $subscriber->save();
     $user = User::load($user->id());
     $this->assertEqual($user->get('field_on_both')->value, 'foo');
     // Create a subscriber with a value for the field.
     $subscriber = Subscriber::create(array('field_on_both' => 'foo', 'mail' => '*****@*****.**'));
     $subscriber->save();
     // Create a user.
     $user = User::create(array('name' => 'user2', 'mail' => '*****@*****.**'));
     // Assert that the shared field does not get the value from the subscriber.
     $this->assertNull($user->get('field_on_both')->value);
     // Update the user and assert that it is not synced to the subscriber.
     $user->set('field_on_both', 'bar');
     $user->save();
     $subscriber = Subscriber::load($subscriber->id());
     $this->assertEqual($subscriber->get('field_on_both')->value, 'foo');
 }
 /**
  * {@inheritdoc}
  */
 public function sendConfirmations()
 {
     foreach ($this->confirmations as $mail => $changes) {
         $subscriber = simplenews_subscriber_load_by_mail($mail);
         if (!$subscriber) {
             $subscriber = Subscriber::create(array());
             $subscriber->setMail($mail);
             $subscriber->setLangcode($this->languageManager->getCurrentLanguage());
             $subscriber->save();
         }
         $subscriber->setChanges($changes);
         $this->mailer->sendCombinedConfirmation($subscriber);
         // Save the changes in the subscriber if there is a real subscriber object.
         if ($subscriber && $subscriber->id()) {
             $subscriber->save();
         }
     }
     $sent = !empty($this->confirmations);
     $this->confirmations = array();
     return $sent;
 }
 /**
  * Returns the last created Subscriber.
  *
  * @return \Drupal\simplenews\Entity\Subscriber|null
  *   The Subscriber entity, or NULL if there is none.
  */
 protected function getLatestSubscriber()
 {
     $snids = \Drupal::entityQuery('simplenews_subscriber')->sort('created', 'DESC')->range(0, 1)->execute();
     return empty($snids) ? NULL : Subscriber::load(array_shift($snids));
 }
 /**
  * {@inheritdoc}
  */
 public function build()
 {
     /** @var \Drupal\simplenews\Form\SubscriptionsBlockForm $form_object */
     $form_object = \Drupal::entityManager()->getFormObject('simplenews_subscriber', 'block');
     $form_object->setUniqueId($this->configuration['unique_id']);
     $form_object->setNewsletterIds($this->configuration['newsletters']);
     $form_object->message = $this->configuration['message'];
     // Set the entity on the form.
     if ($user = \Drupal::currentUser()) {
         if ($subscriber = simplenews_subscriber_load_by_uid($user->id())) {
             $form_object->setEntity($subscriber);
         } else {
             $form_object->setEntity(Subscriber::create(array('mail' => $user->getEmail())));
         }
     } else {
         $form_object->setEntity(Subscriber::create());
     }
     return $this->formBuilder->getForm($form_object);
 }
Example #7
0
 /**
  * {@inheritdoc}
  */
 public function sendTest(NodeInterface $node, array $test_addresses)
 {
     // Force the current user to anonymous to ensure consistent permissions.
     $this->accountSwitcher->switchTo(new AnonymousUserSession());
     // Send the test newsletter to the test address(es) specified in the node.
     // Build array of test email addresses.
     // Send newsletter to test addresses.
     // Emails are send direct, not using the spool.
     $recipients = array('anonymous' => array(), 'user' => array());
     foreach ($test_addresses as $mail) {
         $mail = trim($mail);
         if (!empty($mail)) {
             $subscriber = simplenews_subscriber_load_by_mail($mail);
             if (!$subscriber) {
                 // @todo: Find a cleaner way to do this.
                 $subscriber = Subscriber::create(array());
                 $subscriber->setUserId(0);
                 $subscriber->setMail($mail);
                 $subscriber->setLangcode(\Drupal::languageManager()->getCurrentLanguage());
             }
             if ($subscriber->getUserId()) {
                 $account = $subscriber->uid->entity;
                 $recipients['user'][] = $account->getUserName() . ' <' . $mail . '>';
             } else {
                 $recipients['anonymous'][] = $mail;
             }
             $mail = new MailEntity($node, $subscriber, \Drupal::service('simplenews.mail_cache'));
             $mail->setKey('test');
             $this->sendMail($mail);
         }
     }
     if (count($recipients['user'])) {
         $recipients_txt = implode(', ', $recipients['user']);
         drupal_set_message(t('Test newsletter sent to user %recipient.', array('%recipient' => $recipients_txt)));
     }
     if (count($recipients['anonymous'])) {
         $recipients_txt = implode(', ', $recipients['anonymous']);
         drupal_set_message(t('Test newsletter sent to anonymous %recipient.', array('%recipient' => $recipients_txt)));
     }
     $this->accountSwitcher->switchBack();
 }
 /**
  * Test content subscription status filter in subscriber view.
  */
 function testSubscriberStatusFilter()
 {
     // Make sure subscription overview can't be accessed without permission.
     $this->drupalGet('admin/people/simplenews');
     $this->assertResponse(403);
     $admin_user = $this->drupalCreateUser(array('administer newsletters', 'create simplenews_issue content', 'administer nodes', 'administer simplenews subscriptions'));
     $this->drupalLogin($admin_user);
     $subscribers = array();
     // Create some subscribers.
     for ($i = 0; $i < 3; $i++) {
         $subscribers[] = Subscriber::create(array('mail' => $this->randomEmail()));
     }
     foreach ($subscribers as $subscriber) {
         $subscriber->setStatus(SubscriberInterface::ACTIVE);
     }
     // Subscribe to the default newsletter and set subscriber status.
     $subscribers[0]->subscribe('default', SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED);
     $subscribers[1]->subscribe('default', SIMPLENEWS_SUBSCRIPTION_STATUS_UNCONFIRMED);
     $subscribers[2]->subscribe('default', SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED);
     foreach ($subscribers as $subscriber) {
         $subscriber->save();
     }
     $newsletters = simplenews_newsletter_get_all();
     // Filter out subscribers by their subscription status and assert the output.
     $this->drupalGet('admin/people/simplenews', array('query' => array('subscriptions_status' => SIMPLENEWS_SUBSCRIPTION_STATUS_SUBSCRIBED)));
     $row = $this->xpath('//tbody/tr');
     $this->assertEqual(1, count($row));
     $this->assertEqual($subscribers[0]->getMail(), trim((string) $row[0]->td[0]));
     $this->drupalGet('admin/people/simplenews', array('query' => array('subscriptions_status' => SIMPLENEWS_SUBSCRIPTION_STATUS_UNCONFIRMED)));
     $row = $this->xpath('//tbody/tr');
     $this->assertEqual(1, count($row));
     $this->assertEqual($subscribers[1]->getMail(), trim((string) $row[0]->td[0]));
     $this->assertText($newsletters['default']->name . ' (' . t('Unconfirmed') . ')');
     $this->drupalGet('admin/people/simplenews', array('query' => array('subscriptions_status' => SIMPLENEWS_SUBSCRIPTION_STATUS_UNSUBSCRIBED)));
     $row = $this->xpath('//tbody/tr');
     $this->assertEqual(1, count($row));
     $this->assertEqual($subscribers[2]->getMail(), trim((string) $row[0]->td[0]));
     $this->assertText($newsletters['default']->name . ' (' . t('Unsubscribed') . ')');
 }