Commit 7a740f5f authored by Eleo Basili's avatar Eleo Basili
Browse files

Issue #3276126 by eleonel: Add support of mailchimp

parent e7a953e7
Loading
Loading
Loading
Loading
+70 −0
Original line number Diff line number Diff line
CONTENTS OF THIS FILE
---------------------

 * Introduction
 * Requirements
 * Recommended modules
 * Installation
 * Configuration
 * Troubleshooting
 * Maintainers


INTRODUCTION
------------

The Enricher Mailchimp is a submodule of Enricher. Enricher Mailchimp
provides an implementation of an EnricherDatasource plugin to allow Enricher
to interface with Mailchimp's API.

REQUIREMENTS
------------

This module requires the following modules:

 * [Mailchimp](https://www.drupal.org/project/mailchimp):


INSTALLATION
------------

 * Install as you would normally install a contributed Drupal module. Visit
   https://www.drupal.org/node/1897420 for further information.


CONFIGURATION
-------------

 * Configure the user permissions in Administration » People » Permissions:

   - Administer enrichers

     Users with this permission will see the webservices > enrichers
     configuration list page. From here they can add, configure, delete, enable
     and disabled enrichers.

     Warning: Give to trusted roles only; this permission has security
     implications. Allows full administration access to create and edit
     enrichers.

TROUBLESHOOTING
---------------

 * If you are not receiving data back for your user.

   - Check the recent log messages report for exception messages.


MAINTAINERS
-----------

Current maintainers:
 * Eleo Basili (eleonel) - https://www.drupal.org/u/eleonel
 * Naveen Valecha (naveenvalecha) - https://www.drupal.org/u/naveenvalecha

This project has been sponsored by:
 * Morpht Pty Ltd
   We are a team of dedicated and enthusiastic designers, programmers and site
   builders who know how to get the most from Drupal.
   We work for a variety of clients in government, education, media and
   pharmaceutical sectors.
+7 −0
Original line number Diff line number Diff line
convivial_enricher.datasource.mailchimp:
  type: mapping
  label: 'Mailchimp'
  mapping:
    mailchimp_list:
      label: 'Mailchimp list ID'
      type: string
+8 −0
Original line number Diff line number Diff line
name: Convivial Enricher Mailchimp
type: module
description: Provides integration of Mailchimp API with Enricher.
package: Convivial
core_version_requirement: ^9
dependencies:
  - drupal:convivial_enricher
  - drupal:mailchimp
+21 −0
Original line number Diff line number Diff line
<?php

/**
 * @file
 * Implements the Convivial Enricher Mailchimp module.
 */

use Drupal\Core\Routing\RouteMatchInterface;

/**
 * Implements hook_help().
 */
function convivial_enricher_mailchimp_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    case 'help.page.convivial_enricher_mailchimp':
      $output = '';
      $output .= '<h3>' . t('Convivial Enricher Mailchimp') . '</h3>';
      $output .= '<p>' . t('Provides integration of Mailchimp API with Enricher') . '</p>';
      return $output;
  }
}
+149 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\convivial_enricher_mailchimp\Plugin\EnricherDatasource;

use Drupal\convivial_enricher\EnricherDatasourceBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Utility\Error;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\mailchimp\ClientFactory;

/**
 * Plugin implementation of the datasource.
 *
 * @EnricherDatasource(
 *   id = "mailchimp",
 *   label = @Translation("Mailchimp"),
 *   description = @Translation("Mailchimp datasource for enricher."),
 * )
 */
class MailchimpEnricherDatasource extends EnricherDatasourceBase implements ContainerFactoryPluginInterface {

  /**
   * Mailchimp API client.
   *
   * @var null|\Mailchimp\Mailchimp
   */
  private $mailchimpApiClient;

  /**
   * An object representing a Mailchimp list member.
   *
   * @var object
   */
  private $listMember;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, LoggerInterface $logger, ClientFactory $mailchimp_client_factory) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $logger);
    $this->mailchimpApiClient = $mailchimp_client_factory->getByClassNameOrNull('MailchimpLists');
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('logger.factory')->get('convivial_enricher'),
      $container->get('mailchimp.client_factory'),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function getSummary() {
    $summary = parent::getSummary();
    return $summary;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return parent::defaultConfiguration() + [
      'mailchimp_list' => NULL,
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['mailchimp_list'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Mailchimp list ID'),
      '#description' => $this->t('The Mailchimp list ID.'),
      '#default_value' => $this->configuration['mailchimp_list'],
      '#required' => TRUE,
    ];
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    parent::submitConfigurationForm($form, $form_state);
    $this->configuration['mailchimp_list'] = $form_state->getValue('mailchimp_list');
  }

  /**
   * {@inheritdoc}
   */
  public function processIncomingPath(&$path, $endpoint_path) {
    return $path;
  }

  /**
   * {@inheritdoc}
   */
  public function fetchAndProcessData($key) {
    $output = [];
    $return_cookies = [];

    try {
      $list_id = $this->configuration['mailchimp_list'];
      $this->listMember = $this->getListMemberInfoById($list_id, $key);
    }
    catch (\Exception $exception) {
      $variables = Error::decodeException($exception);
      $this->logger->warning('%type: @message in %function (line %line of %file).', $variables);
    }

    if (!empty((array) $this->listMember)) {
      $output += (array) $this->listMember;
    }

    // Create the cookies of all the output fields.
    foreach ($output as $cookie_name => $cookie_value) {
      $return_cookies[] = $this->createCookie($cookie_name, $cookie_value);
    }
    return $return_cookies;
  }

  /**
   * Gets information about a member of a Mailchimp list.
   *
   * @param string $list_id
   *   The ID of the list.
   * @param string $uniqid
   *   The member's unique ID (UNIQID).
   *
   * @return null|object
   *   An object representing a Mailchimp list member or NULL if not found.
   */
  protected function getListMemberInfoById($list_id, $uniqid) {
    if (isset($this->mailchimpApiClient)) {
      return $this->mailchimpApiClient->getMemberInfoById($list_id, $uniqid);
    }
  }

}