View source
<?php
namespace Drupal\campaignmonitor\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Component\Utility\SafeMarkup;
use Drupal\user\Entity\User;
class CampaignMonitorSubscribeForm extends FormBase {
private $formId = 'campaignmonitor_subscribe';
private $fieldInstance;
private $fieldFormatter;
public function getFormId() {
return $this->formId;
}
public function setFormId($formId) {
$this->formId = $formId;
}
protected function getEditableConfigNames() {
return [
'campaignmonitor.subscribe',
];
}
public function buildForm(array $form, FormStateInterface $form_state, $config = []) {
if (\Drupal::currentUser()
->id() != 0) {
$account = User::load(\Drupal::currentUser()
->id());
$email = $account
->get('mail')
->getValue()[0]['value'];
}
$form['email'] = [
'#type' => 'textfield',
'#title' => t('Email'),
'#required' => TRUE,
'#maxlength' => 200,
'#default_value' => isset($email) ? $email : '',
];
switch ($config['list']) {
case 'single':
$form += $this
->singleSubscribeForm($form, $form_state, $config);
$this
->setFormID($this->formId . '_single');
break;
default:
$form += $this
->userSelectSubscribeForm($form, $form_state, $config);
}
$form['submit'] = [
'#type' => 'submit',
'#value' => t('Subscribe'),
];
$form['config'] = [
'#type' => 'hidden',
'#value' => serialize($config),
];
return $form;
}
protected function singleSubscribeForm(array $form, FormStateInterface $form_state, $config = []) {
$list_id = $config['list_id'];
$current_user = \Drupal::currentUser();
$list = campaignmonitor_get_extended_list_settings($list_id);
$list_options = campaignmonitor_get_list_settings($list_id);
$form = [
'#tree' => TRUE,
'#attributes' => [
'class' => [
'campaignmonitor-subscribe-form',
'campaignmonitor-subscribe-form-' . str_replace(' ', '-', strtolower($list['name'])),
],
],
];
if ($config['list_id_text'] != '') {
$text = str_replace('@name', $list['name'], $config['list_id_text']);
$form['selection'] = [
'#markup' => $text,
];
}
if (isset($list_options['display']['name']) && $list_options['display']['name']) {
if (isset($list_options['tokens']['name']) && \Drupal::moduleHandler()
->moduleExists('token') && $current_user
->id() > 0) {
$name = \Drupal::token()
->replace($list_options['tokens']['name'], [
'user' => User::load($current_user
->id()),
], [
'clear' => TRUE,
]);
}
if (!empty($email) && campaignmonitor_is_subscribed($list_id, $email)) {
$subscriber = campaignmonitor_get_subscriber($list_id, $email);
$name = isset($subscriber['Name']) ? $subscriber['Name'] : $name;
}
$form['name'] = [
'#type' => 'email',
'#title' => t('Name'),
'#required' => TRUE,
'#maxlength' => 200,
'#default_value' => isset($name) ? $name : '',
];
}
if (isset($list['CustomFields'])) {
foreach ($list['CustomFields'] as $key => $field) {
$form_key = str_replace([
'[',
']',
], '', $key);
if (isset($list_options['CustomFields']) && !$list_options['CustomFields']['selected'][$form_key]) {
continue;
}
$token = '';
if (\Drupal::moduleHandler()
->moduleExists('token') && isset($list_options['tokens'][$form_key])) {
$token_user = $current_user
->id() > 0 ? User::load($current_user
->id()) : NULL;
$token = \Drupal::token()
->replace($list_options['tokens'][$form_key], [
'user' => $token_user,
], [
'clear' => TRUE,
]);
}
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;
}
$cm_default = isset($subscriber['CustomFields'][$field['FieldName']]) ? $subscriber['CustomFields'][$field['FieldName']] : [];
$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':
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;
}
protected function userSelectSubscribeForm(array $form, FormStateInterface $form_state, $config = []) {
$form = [];
$form = [
'#tree' => TRUE,
'#attributes' => [
'class' => [
'campaignmonitor-subscribe-form',
'campaignmonitor-subscribe-form-all-lists',
],
],
];
$lists = campaignmonitor_get_lists();
$options = [];
foreach ($lists as $list_id => $list) {
$options[$list_id] = $list['name'];
}
$form['selection'] = [
'#type' => 'checkboxes',
'#options' => $options,
'#title' => t('Lists'),
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$lists = campaignmonitor_get_lists();
$values = $form_state
->getValues();
$config = $form_state
->getValue('config');
$config = unserialize($config);
switch ($config['list']) {
case 'single':
$selection = [
$form_state
->getValue('list_id'),
];
break;
default:
$selection = $form_state
->getValue('selection');
}
$name = isset($values['name']) ? SafeMarkup::checkPlain($values['name'])
->__toString() : NULL;
$email = SafeMarkup::checkPlain($values['email'])
->__toString();
$custom_fields = NULL;
if (isset($values['CustomFields'])) {
$custom_fields = $values['CustomFields'];
foreach ($custom_fields as $key => $value) {
if ($form['CustomFields'][$key]['#type'] == 'textfield') {
$custom_fields[$key] = SafeMarkup::checkPlain($value)
->__toString();
}
}
}
foreach ($selection as $list_id) {
if ($list_id === 0) {
continue;
}
if (campaignmonitor_subscribe($list_id, $email, $name, $custom_fields, [], FALSE, 'html', FALSE)) {
$settings = $this
->config('campaignmonitor.settings');
$message = $settings
->get('subscription_confirmation_text') ? $settings
->get('subscription_confirmation_text') : 'You are subscribed to the @name list.';
drupal_set_message(t($message, [
'@name' => html_entity_decode($lists[$list_id]['name']),
]));
}
else {
drupal_set_message(t('You were not subscribed to the list, please try again.'));
}
}
}
}