Commit 5fe9be01 authored by Ariel Barreiro's avatar Ariel Barreiro
Browse files

Don't double optin if already subscribed

Also:

- Filter out empty mergevars, so that if empty, they don't overwrite data on
  mailchimp
- Refactored dependency injection into Setter injection so that it's more
  update-proof.
- Add proper dependency format for mailchimp module on info file
parent a2bb6a4f
Loading
Loading
Loading
Loading
+24 −22
Original line number Diff line number Diff line
@@ -2,16 +2,13 @@

namespace Drupal\webform_mailchimp\Plugin\WebformHandler;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\WebformSubmissionInterface;
use Drupal\webform\WebformSubmissionConditionsValidatorInterface;
use Drupal\webform\WebformTokenManagerInterface;
use Mailchimp\MailchimpLists;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
@@ -31,32 +28,29 @@ class WebformMailChimpHandler extends WebformHandlerBase {
  /**
   * The token manager.
   *
   * @var \Drupal\webform\WebformTranslationManagerInterface
   * @var \Drupal\webform\WebformTokenManagerInterface
   */
  protected $token_manager;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerChannelFactoryInterface $logger_factory, ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager, WebformSubmissionConditionsValidatorInterface $conditions_validator, WebformTokenManagerInterface $token_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $logger_factory, $config_factory, $entity_type_manager, $conditions_validator);
    $this->tokenManager = $token_manager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
    $instance = parent::create(
      $container,
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('logger.factory'),
      $container->get('config.factory'),
      $container->get('entity_type.manager'),
      $container->get('webform_submission.conditions_validator'),
      $container->get('webform.token_manager')
      $plugin_definition
    );
    $instance->setTokenManager($container->get('webform.token_manager'));
    return $instance;
  }

  /**
   * Set Token Manager dependency
   */
  protected function setTokenManager(WebformTokenManagerInterface $token_manager) {
    $this->tokenManager = $token_manager;
  }

  /**
@@ -183,7 +177,7 @@ class WebformMailChimpHandler extends WebformHandlerBase {
      '#mode' => 'yaml',
      '#title' => $this->t('Merge vars'),
      '#default_value' => $this->configuration['mergevars'],
      '#description' => $this->t('Enter the mergevars that will be sent to mailchimp, each line a <em>margevar: \'value\'</em>. You may use tokens.'),
      '#description' => $this->t('Enter the mergevars that will be sent to mailchimp, each line a <em>margevar: \'value\'</em>. You may use tokens. Empty mergevars will not be sent.'),
    ];

    $form['mailchimp']['interest_groups'] = [
@@ -315,7 +309,15 @@ class WebformMailChimpHandler extends WebformHandlerBase {
    ];

    if (!empty($configuration['list']) && !empty($email)) {
      mailchimp_subscribe($configuration['list'], $email, $mergevars, $configuration['interest_groups'], $configuration['double_optin']);
      $member_data = mailchimp_get_memberinfo($configuration['list'], $email, TRUE);

      // If the user is already subscribed, do not set it back to pending
      $double_optin = $configuration['double_optin'];
      if (!empty($member_data->status) && $member_data->status == MailchimpLists::MEMBER_STATUS_SUBSCRIBED) {
        $double_optin = FALSE;
      }

      mailchimp_subscribe($configuration['list'], $email, array_filter($mergevars, 'strlen'), $configuration['interest_groups'], $double_optin);
    }
    else {
      if (empty($configuration['list'])) {
+1 −1
Original line number Diff line number Diff line
@@ -5,4 +5,4 @@ package: 'Webform'
core: 8.x
dependencies:
  - webform:webform
  - mailchimp
  - mailchimp:mailchimp