You are here

public function CampaignMonitorListSettingsForm::buildForm in Campaign Monitor 8.2

Same name and namespace in other branches
  1. 8 src/Form/CampaignMonitorListSettingsForm.php \Drupal\campaignmonitor\Form\CampaignMonitorListSettingsForm::buildForm()

Form constructor.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

array The form structure.

Overrides ConfigFormBase::buildForm

File

src/Form/CampaignMonitorListSettingsForm.php, line 106

Class

CampaignMonitorListSettingsForm
Configure campaignmonitor settings for this site.

Namespace

Drupal\campaignmonitor\Form

Code

public function buildForm(array $form, FormStateInterface $form_state, $list_id = NULL) {
  $form = [
    '#tree' => TRUE,
  ];

  // Reset lists so that we can make changes with this form.
  // This will ensure that settings come direct from CM and not cache.
  $this->campaignMonitorManager
    ->getLists([], TRUE);
  $defaults = $this->campaignMonitorManager
    ->getListSettings($list_id);
  $list = $this->campaignMonitorManager
    ->getExtendedList($list_id);

  // Add list id to the form.
  $form['listId'] = [
    '#type' => 'hidden',
    '#value' => $list_id,
  ];

  // Set this form name (index).
  $form_key = 'campaignmonitor_list_' . $list_id;
  $form[$form_key]['status'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('Enable list'),
    '#description' => $this
      ->t('Enable the list to configure it and use it on the site.'),
    '#collapsible' => FALSE,
    '#collapsed' => FALSE,
  ];
  $form[$form_key]['status']['enabled'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Enable'),
    '#default_value' => isset($defaults['status']['enabled']) ? $defaults['status']['enabled'] : 0,
    '#attributes' => [
      'class' => [
        'enabled-list-checkbox',
      ],
    ],
  ];
  $form[$form_key]['options'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('List options'),
    '#description' => $this
      ->t('Changing the values will result in an update of the values on the Campaign Monitor homepage.'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#states' => [
      'visible' => [
        '.enabled-list-checkbox' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $form[$form_key]['options']['listname'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('List name'),
    '#default_value' => $list['name'],
    '#required' => TRUE,
    '#states' => [
      'visible' => [
        ':input[name="status[enabled]"]' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $form[$form_key]['options']['UnsubscribePage'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Unsubscribe page'),
    '#default_value' => $list['details']['UnsubscribePage'],
  ];
  $form[$form_key]['options']['ConfirmationSuccessPage'] = [
    '#type' => 'textfield',
    '#title' => $this
      ->t('Confirmation success page'),
    '#default_value' => $list['details']['ConfirmationSuccessPage'],
  ];
  $form[$form_key]['options']['ConfirmedOptIn'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Confirmed Opt In'),
    '#description' => $this
      ->t('Selecting this will mean that subscribers will need to confirm their email each time they
      subscribe to the list'),
    '#default_value' => $list['details']['ConfirmedOptIn'],
  ];
  $form[$form_key]['display'] = [
    '#type' => 'fieldset',
    '#title' => $this
      ->t('Display options'),
    '#collapsible' => TRUE,
    '#collapsed' => FALSE,
    '#states' => [
      'visible' => [
        '.enabled-list-checkbox' => [
          'checked' => TRUE,
        ],
      ],
    ],
  ];
  $form[$form_key]['display']['name'] = [
    '#type' => 'checkbox',
    '#title' => $this
      ->t('Display Name field'),
    '#description' => $this
      ->t('Whether the Name field should be displayed when subscribing.'),
    '#default_value' => isset($defaults['display']['name']) ? $defaults['display']['name'] : 0,
    '#attributes' => [
      'class' => [
        'tokenable',
        'tokenable-name',
      ],
    ],
  ];
  $form[$form_key]['display']['description'] = [
    '#type' => 'textarea',
    '#title' => $this
      ->t('Description'),
    '#description' => $this
      ->t('A description to accompany the list in forms.'),
    '#default_value' => isset($defaults['display']['description']) ? $defaults['display']['description'] : '',
    '#attributes' => [
      'class' => [
        'tokenable',
        'tokenable-description',
      ],
    ],
  ];
  $field_map = $this->entityFieldManager
    ->getFieldMap();
  $user_field_map = $field_map['user'];
  $user_fields = array_keys($user_field_map);
  array_unshift($user_fields, 'None');
  foreach ($user_fields as $key => $user_field) {
    unset($user_fields[$key]);
    $user_fields[$user_field] = $user_field;
  }
  if (!empty($list['CustomFields'])) {
    $options = [];
    foreach ($list['CustomFields'] as $key => $field) {

      // Form API can't handle keys with [] in all cases.
      $token_form_key = str_replace([
        '[',
        ']',
      ], '', $key);
      $user_fields[$token_form_key] = 'Custom Field: ' . $field['FieldName'];
    }
  }
  $form[$form_key]['display']['fname_field'] = [
    '#type' => 'select',
    '#options' => $user_fields,
    '#title' => $this
      ->t('First name field'),
    '#description' => $this
      ->t('The name that will be used by Campaign Monitor as a salutation in emails sent out. If using custom fields, they will not appear unless selected in custom field config below.'),
    '#default_value' => isset($defaults['display']['fname_field']) ? $defaults['display']['fname_field'] : 0,
  ];
  $form[$form_key]['display']['lname_field'] = [
    '#type' => 'select',
    '#options' => $user_fields,
    '#title' => $this
      ->t('Last name field'),
    '#description' => $this
      ->t('The name that will be used by Campaign Monitor as a salutation in emails sent out. If using custom fields, they will not appear unless selected in custom field config below or none to leave empty.'),
    '#default_value' => isset($defaults['display']['lname_field']) ? $defaults['display']['lname_field'] : 0,
  ];

  // List custom fields.
  if (!empty($list['CustomFields'])) {
    $options = [];
    foreach ($list['CustomFields'] as $key => $field) {

      // Form API can't handle keys with [] in all cases.
      $token_form_key = str_replace([
        '[',
        ']',
      ], '', $key);
      $options[$token_form_key] = $field['FieldName'];
    }
    $form[$form_key]['CustomFields'] = [
      '#type' => 'table',
      '#caption' => $this
        ->t('Custom fields - drag to arrange order'),
      '#header' => [
        $this
          ->t('Include'),
        $this
          ->t('Require'),
        $this
          ->t('Weight'),
      ],
      '#empty' => $this
        ->t('No items.'),
      '#tableselect' => FALSE,
      '#tabledrag' => [
        [
          'action' => 'order',
          'relationship' => 'sibling',
          'group' => 'group-order-weight',
        ],
      ],
      '#states' => [
        'visible' => [
          '.enabled-list-checkbox' => [
            'checked' => TRUE,
          ],
        ],
      ],
    ];

    // Use defaults if exists to get the order correct.
    if (isset($defaults['CustomFields'])) {
      $new_options = [];
      foreach ($defaults['CustomFields'] as $key => $values) {
        $new_options[$key] = $options[$key];
      }
      $options = $new_options;
    }
    foreach ($options as $key => $option) {
      $form[$form_key]['CustomFields'][$key]['#attributes']['class'][] = 'draggable';
      $form[$form_key]['CustomFields'][$key]['#weight'] = $defaults['CustomFields'][$key]['weight'];
      $form[$form_key]['CustomFields'][$key]['selected'] = [
        '#type' => 'checkbox',
        '#title' => $option,
        '#default_value' => isset($defaults['CustomFields'][$key]['selected']) ? $defaults['CustomFields'][$key]['selected'] : 0,
        '#attributes' => [
          'class' => [
            'tokenable',
            'tokenable-custom-fields',
          ],
        ],
      ];
      $form[$form_key]['CustomFields'][$key]['required'] = [
        '#type' => 'checkbox',
        '#title' => $option,
        '#default_value' => isset($defaults['CustomFields'][$key]['required']) ? $defaults['CustomFields'][$key]['required'] : 0,
      ];
      $form[$form_key]['CustomFields'][$key]['weight'] = [
        '#type' => 'weight',
        '#title' => $this
          ->t('Weight for @title', [
          '@title' => $option,
        ]),
        '#title_display' => 'invisible',
        '#default_value' => isset($defaults['CustomFields'][$key]['weight']) ? $defaults['CustomFields'][$key]['weight'] : 0,
        '#attributes' => [
          'class' => [
            'group-order-weight',
          ],
        ],
      ];
    }
  }
  return parent::buildForm($form, $form_state);
}