/**
  * Tests retrieval of mergevars for a set of lists.
  */
 function testGetMergevars()
 {
     $list_ids = array(DrupalMailchimpLists::TEST_LIST_A);
     $lists = mailchimp_get_mergevars($list_ids);
     $this->assertTrue(is_array($lists), 'Tested valid lists array returned.');
     $this->assertTrue(!empty($lists), 'Tested valid lists returned.');
     foreach ($lists as $list) {
         $this->assertTrue(in_array($list['id'], $list_ids), 'Tested valid list ID retrieved: ' . $list['id']);
         $this->assertTrue(is_array($list['merge_vars']), 'Tested list contains merge vars array.');
         foreach ($list['merge_vars'] as $merge_var) {
             $this->assertTrue(isset($merge_var['name']), 'Tested valid merge var.');
         }
     }
 }
 /**
  * {@inheritdoc}
  */
 public function fieldSettingsForm(array $form, FormStateInterface $form_state)
 {
     $element = parent::fieldSettingsForm($form, $form_state);
     $mc_list_id = $this->getFieldDefinition()->getSetting('mc_list_id');
     if (empty($mc_list_id)) {
         drupal_set_message(t('Select a list to sync with on the Field Settings tab before configuring the field instance.'), 'error');
         return $element;
     }
     $this->definition;
     $instance_settings = $this->definition->getSettings();
     $element['show_interest_groups'] = array('#title' => "Enable Interest Groups", '#type' => "checkbox", '#default_value' => $instance_settings['show_interest_groups']);
     $element['interest_groups_label'] = array('#title' => "Interest Groups Label", '#type' => "textfield", '#default_value' => !empty($instance_settings['show_interest_groups']) ? $instance_settings['show_interest_groups'] : 'Interest Groups');
     $element['merge_fields'] = array('#type' => 'fieldset', '#title' => t('Merge Fields'), '#description' => t('Multi-value fields will only sync their first value to Mailchimp, as Mailchimp does not support multi-value fields.'), '#tree' => TRUE);
     $element['unsubscribe_on_delete'] = array('#title' => "Unsubscribe on deletion", '#type' => "checkbox", '#description' => t('Unsubscribe entities from this list when they are deleted.'), '#default_value' => $instance_settings['unsubscribe_on_delete']);
     $mv_defaults = $instance_settings['merge_fields'];
     $mergevars = mailchimp_get_mergevars(array($mc_list_id));
     $fields = $this->getFieldmapOptions($this->getFieldDefinition()->entity_type, $this->getFieldDefinition()->bundle);
     $required_fields = $this->getFieldmapOptions($this->getFieldDefinition()->entity_type, $this->getFieldDefinition()->bundle, TRUE);
     // Prevent this subscription field appearing as a merge field option.
     $field_name = $this->getFieldDefinition()->getName();
     unset($fields[$field_name]);
     $fields_flat = OptGroup::flattenOptions($fields);
     foreach ($mergevars[$mc_list_id]['merge_vars'] as $mergevar) {
         $default_value = isset($mv_defaults[$mergevar['tag']]) ? $mv_defaults[$mergevar['tag']] : -1;
         $element['merge_fields'][$mergevar['tag']] = array('#type' => 'select', '#title' => SafeMarkup::checkPlain($mergevar['name']), '#default_value' => array_key_exists($default_value, $fields_flat) ? $default_value : '', '#required' => $mergevar['req']);
         if (!$mergevar['req'] || $mergevar['tag'] === 'EMAIL') {
             $element['merge_fields'][$mergevar['tag']]['#options'] = $fields;
             if ($mergevar['tag'] === 'EMAIL') {
                 $element['merge_fields'][$mergevar['tag']]['#description'] = t('Any entity with an empty or invalid email address field value will simply be ignored by the Mailchimp subscription system. <em>This is why the Email field is the only required merge field which can sync to non-required fields.</em>');
             }
         } else {
             $element['merge_fields'][$mergevar['tag']]['#options'] = $required_fields;
             $element['merge_fields'][$mergevar['tag']]['#description'] = t("Only 'required' and 'calculated' fields are allowed to be synced with Mailchimp 'required' merge fields.");
         }
     }
     return $element;
 }
 private function getMergevarOptions(array $mc_lists)
 {
     $mergevar_settings = mailchimp_get_mergevars(array_filter($mc_lists));
     $mergevar_options = array();
     foreach ($mergevar_settings as $list_mergevars) {
         foreach ($list_mergevars['merge_vars'] as $mergevar) {
             if ($mergevar['public']) {
                 $mergevar_options[$mergevar['tag']] = $mergevar;
             }
         }
     }
     return $mergevar_options;
 }
 /**
  * {@inheritdoc}
  */
 public function form(array $form, FormStateInterface $form_state)
 {
     $form = parent::form($form, $form_state);
     $site_config = \Drupal::config('system.site');
     // Attach campaign JS and CSS.
     $form['#attached']['library'][] = 'mailchimp_campaign/campaign-form';
     /* @var $campaign \Drupal\mailchimp_campaign\Entity\MailchimpCampaign */
     $campaign = $this->entity;
     $form_state->set('campaign', $campaign);
     $form['title'] = array('#type' => 'textfield', '#title' => t('Title'), '#description' => t('An internal name to use for this campaign. By default, the campaign subject will be used.'), '#required' => FALSE, '#default_value' => $campaign ? $campaign->mc_data['title'] : '');
     $form['subject'] = array('#type' => 'textfield', '#title' => t('Subject'), '#required' => TRUE, '#default_value' => $campaign ? $campaign->mc_data['subject'] : '');
     $mailchimp_lists = mailchimp_get_lists();
     $form['list_id'] = array('#type' => 'select', '#title' => t('List'), '#description' => t('Select the list this campaign should be sent to.'), '#options' => $this->buildOptionList($mailchimp_lists), '#default_value' => $campaign ? $campaign->mc_data['list_id'] : -1, '#required' => TRUE, '#ajax' => array('callback' => 'Drupal\\mailchimp_campaign\\Form\\MailchimpCampaignForm::listSegmentCallback'));
     if (!empty($form_state->getValue('list_id'))) {
         $list_id = $form_state->getValue('list_id');
     } elseif ($campaign && $campaign->mc_data) {
         $list_id = $campaign->mc_data['list_id'];
         if (isset($campaign->mc_data['saved_segment']['id'])) {
             $segment_id = $campaign->mc_data['saved_segment']['id'];
         }
     }
     $list_segments = array();
     if (isset($list_id)) {
         $list_segments = mailchimp_campaign_get_list_segments($list_id, 'saved');
     }
     if (!empty($list_segments)) {
         $form['list_segment_id'] = array('#type' => 'select', '#title' => t('List Segment'), '#description' => t('Select the list segment this campaign should be sent to.'), '#options' => $this->buildOptionList($list_segments, '-- Entire list --'), '#default_value' => isset($segment_id) ? $segment_id : '');
     } else {
         $form['list_segment_id'] = array();
     }
     $form['list_segment_id']['#prefix'] = '<div id="list-segments-wrapper">';
     $form['list_segment_id']['#suffix'] = '</div>';
     $form['from_email'] = array('#type' => 'textfield', '#title' => t('From Email'), '#description' => t('the From: email address for your campaign message.'), '#default_value' => !empty($campaign->mc_data) ? $campaign->mc_data['from_email'] : $site_config->get('mail'), '#size' => 40, '#maxlength' => 255, '#required' => TRUE);
     $form['from_name'] = array('#type' => 'textfield', '#title' => t('From Name'), '#description' => t('the From: name for your campaign message (not an email address)'), '#default_value' => !empty($campaign->mc_data) ? $campaign->mc_data['from_name'] : $site_config->get('name'), '#size' => 40, '#maxlength' => 255, '#required' => TRUE);
     $template_type_labels = array('user' => 'My Custom Templates', 'basic' => 'Basic Templates', 'gallery' => 'Themes');
     $form['template_id'] = array('#type' => 'select', '#title' => t('Template'), '#description' => t('Select a MailChimp user template to use. Due to a limitation in the API, only templates that do not contain repeating sections are available. If empty, the default template will be applied.'), '#options' => $this->buildOptionList(mailchimp_campaign_list_templates(), '-- Select --', $template_type_labels), '#default_value' => $campaign ? $campaign->mc_data['template_id'] : -1, '#ajax' => array('callback' => 'Drupal\\mailchimp_campaign\\Form\\MailchimpCampaignForm::templateCallback'));
     $form['content'] = array('#id' => 'content-sections', '#type' => 'fieldset', '#title' => t('Content sections'), '#description' => t('The HTML content or, if a template is selected, the content for each section.'), '#tree' => TRUE);
     $mc_template = NULL;
     if (!empty($form_state->getValue('template_id'))) {
         $mc_template = mailchimp_campaign_get_template($form_state->getValue('template_id'));
     } else {
         if ($campaign && $campaign->mc_template) {
             $mc_template = $campaign->mc_template;
         }
     }
     if (isset($list_id)) {
         $merge_vars_list = mailchimp_get_mergevars(array($list_id));
         $merge_vars = $merge_vars_list[$list_id]['merge_vars'];
     } else {
         $merge_vars = array();
     }
     $campaign_template = $campaign->getTemplate();
     $campaign_content = $form_state->getValue('content');
     $entity_type = NULL;
     if ($mc_template) {
         if (strpos($mc_template['info']['source'], 'mc:repeatable')) {
             drupal_set_message(t('WARNING: This template has repeating sections, which are not supported. You may want to select a different template.'), 'warning');
         }
         foreach ($mc_template['info']['default_content'] as $section => $content) {
             // Set the default value and text format to either saved campaign values
             // or defaults coming from the MailChimp template.
             $default_value = $content;
             $format = 'mailchimp_campaign';
             if ($campaign_template != NULL && isset($campaign_template[$section])) {
                 $default_value = $campaign_template[$section]['value'];
                 $format = $campaign_template[$section]['format'];
             }
             $form['content'][$section . '_wrapper'] = array('#type' => 'details', '#title' => SafeMarkup::checkPlain(ucfirst($section)), '#open' => FALSE);
             $form['content'][$section . '_wrapper'][$section] = array('#type' => 'text_format', '#format' => $format, '#title' => SafeMarkup::checkPlain(ucfirst($section)), '#default_value' => $default_value);
             if (isset($campaign_content[$section . '_wrapper']['entity_import']['entity_type'])) {
                 $entity_type = $campaign_content[$section . '_wrapper']['entity_import']['entity_type'];
             }
             $form['content'][$section . '_wrapper'] += $this->getEntityImportFormElements($entity_type, $section);
             if (!empty($list_id)) {
                 $form['content'][$section . '_wrapper'] += $this->getMergeVarsFormElements($merge_vars, $mailchimp_lists[$list_id]['name']);
             }
         }
     } else {
         $section = 'html';
         $form['content']['html_wrapper'] = array('#type' => 'details', '#title' => t('Content'), '#open' => FALSE);
         $form['content']['html_wrapper']['html'] = array('#type' => 'text_format', '#format' => $campaign_template != NULL ? $campaign_template['html']['format'] : 'mailchimp_campaign', '#title' => t('Content'), '#description' => t('The HTML content of the campaign.'), '#access' => empty($form_state->getValue('template_id')), '#default_value' => $campaign_template != NULL ? $campaign_template['html']['value'] : '');
         if (isset($campaign_content[$section . '_wrapper']['entity_import']['entity_type'])) {
             $entity_type = $campaign_content[$section . '_wrapper']['entity_import']['entity_type'];
         }
         $form['content'][$section . '_wrapper'] += $this->getEntityImportFormElements($entity_type, $section);
         $list_name = !empty($list_id) ? $mailchimp_lists[$list_id]['name'] : '';
         $form['content'][$section . '_wrapper'] += $this->getMergeVarsFormElements($merge_vars, $list_name);
     }
     // Message preview:
     if (!empty($form_state->getValue('mailchimp_campaign_campaign_preview'))) {
         $form['preview_wrapper'] = array('#title' => t('Campaign content preview'), '#type' => 'details', '#open' => TRUE);
         $form['preview_wrapper']['preview'] = array('#markup' => $form_state->getValue('mailchimp_campaign_campaign_preview'));
     }
     return $form;
 }