You are here

protected function CampaignMonitorIcsForm::singleSubscribeForm in Campaign Monitor 8

1 call to CampaignMonitorIcsForm::singleSubscribeForm()
CampaignMonitorIcsForm::buildForm in modules/campaignmonitor_ics/src/Form/CampaignMonitorIcsForm.php
Form constructor.

File

modules/campaignmonitor_ics/src/Form/CampaignMonitorIcsForm.php, line 104

Class

CampaignMonitorIcsForm
Subscribe to a campaignmonitor list.

Namespace

Drupal\campaignmonitor_ics\Form

Code

protected function singleSubscribeForm(array $form, FormStateInterface $form_state, $config = []) {
  $form = [];
  $list_id = $config['list_id'];
  $list = campaignmonitor_get_extended_list_settings($list_id);
  $list_options = campaignmonitor_get_list_settings($list_id);

  // Set options for the form.
  $form = [
    '#tree' => TRUE,
    '#attributes' => [
      'class' => [
        'campaignmonitor-subscribe-form',
        'campaignmonitor-subscribe-form-' . str_replace(' ', '-', strtolower($list['name'])),
      ],
    ],
  ];
  $text = str_replace('@name', $list['name'], $config['list_id_text']);
  $form['selection'] = [
    '#markup' => $text,
  ];

  // Should the name field be displayed for this user.
  if (isset($list_options['display']['name']) && $list_options['display']['name']) {

    // Token replace if the token module is present.
    if (isset($list_options['tokens']['name']) && \Drupal::moduleHandler()
      ->moduleExists('token') && $user->uid != 0) {
      $name = \Drupal::token()
        ->replace($list_options['tokens']['name'], [], [
        'clear' => TRUE,
      ]);
    }

    // Check if the user is subscribed and get name from Campaign Monitor.
    if (!empty($email) && $cm
      ->isSubscribed($list_id, $email)) {

      // If subscribed, get her/his name from Campaign Monitor.
      $subscriber = $cm
        ->getSubscriber($list_id, $email);
      $name = isset($subscriber['Name']) ? $subscriber['Name'] : $name;
    }
    $form['name'] = [
      '#type' => 'textfield',
      '#title' => t('Name'),
      '#required' => TRUE,
      '#maxlength' => 200,
      '#default_value' => isset($name) ? $name : '',
    ];
  }
  if (isset($list['CustomFields'])) {
    foreach ($list['CustomFields'] as $key => $field) {

      // Form API can't handle keys with [] in all cases.
      $form_key = str_replace([
        '[',
        ']',
      ], '', $key);

      // Check if field should be displayed.
      if (isset($list_options['CustomFields']) && !$list_options['CustomFields']['selected'][$form_key]) {

        // Field is not selected, so continue.
        continue;
      }

      // Token replace default value, if the token module is present.
      $token = '';
      if (\Drupal::moduleHandler()
        ->moduleExists('token') && isset($list_options['tokens'][$form_key])) {
        $token = \Drupal::token()
          ->replace($list_options['tokens'][$form_key]);
      }
      switch ($field['DataType']) {
        case 'Text':
          $form['CustomFields'][$form_key] = [
            '#type' => 'textfield',
            '#title' => SafeMarkup::checkPlain($field['FieldName']),
            '#maxlength' => 200,
            '#default_value' => isset($subscriber['CustomFields'][$field['FieldName']]) ? $subscriber['CustomFields'][$field['FieldName']] : $token,
          ];
          break;
        case 'MultiSelectOne':
          $options = [];
          foreach ($field['FieldOptions'] as $option) {
            $options[$option] = $option;
          }
          $form['CustomFields'][$form_key] = [
            '#type' => 'select',
            '#title' => SafeMarkup::checkPlain($field['FieldName']),
            '#options' => $options,
            '#default_value' => isset($subscriber['CustomFields'][$field['FieldName']]) ? $subscriber['CustomFields'][$field['FieldName']] : $token,
          ];
          break;
        case 'MultiSelectMany':
          $options = [];
          foreach ($field['FieldOptions'] as $option) {
            $options[$option] = $option;
          }

          // If one value was selected, default is a string else an array.
          $cm_default = isset($subscriber['CustomFields'][$field['FieldName']]) ? $subscriber['CustomFields'][$field['FieldName']] : [];

          // Exspensive.
          $is_array = is_array($cm_default);
          $default = [];
          foreach ($options as $value) {
            if ($is_array) {
              if (in_array($value, $cm_default)) {
                $default[$value] = $value;
              }
            }
            elseif ($cm_default == $value) {
              $default[$cm_default] = $cm_default;
            }
            else {
              $default[$value] = 0;
            }
          }
          $form['CustomFields'][$form_key] = [
            '#type' => 'checkboxes',
            '#title' => SafeMarkup::checkPlain($field['FieldName']),
            '#options' => $options,
            '#default_value' => $default,
          ];
          break;
        case 'Number':
          $form['CustomFields'][$form_key] = [
            '#type' => 'textfield',
            '#title' => SafeMarkup::checkPlain($field['FieldName']),
            '#default_value' => isset($subscriber['CustomFields'][$field['FieldName']]) ? $subscriber['CustomFields'][$field['FieldName']] : $token,
          ];
          break;
        case 'Date':

          // Load jQuery datepicker to ensure the right date format.
          drupal_add_library('system', 'ui.datepicker');
          $form['CustomFields'][$form_key] = [
            '#type' => 'date_popup',
            '#title' => SafeMarkup::checkPlain($field['FieldName']),
            '#default_value' => isset($subscriber['CustomFields'][$field['FieldName']]) ? $subscriber['CustomFields'][$field['FieldName']] : $token,
            '#attributes' => [
              'class' => [
                'campaignmonitor-date',
              ],
            ],
          ];
          break;
      }
    }
  }
  $form['list_id'] = [
    '#type' => 'hidden',
    '#default_value' => $list_id,
  ];
  return $form;
}