Drupal → Добавляем возможность использовать токены в адресе получателя контактной формы

27.11.2020

Скоро будет 12 лет, как на drupal.org весит незакрытое ишью с просьбой добавить возможность использовать токены в контактных формах, но воз и ныне там. По традиции фиксим самостоятельно:

// MODULENAME.module

/**
 * Implements hook_form_BASE_FORM_ID_alter(): contact_form_form.
 */
function MODULENAME_form_contact_form_form_alter(array &$form, FormStateInterface $form_state) {
  $form['recipients_new'] = [
    '#type' => 'textfield',
    '#title' => $form['recipients']['#title'],
    '#description' => $form['recipients']['#description'],
    '#default_value' => $form['recipients']['#default_value'],
    '#required' => TRUE,
    '#weight' => 0.001,
  ];
  $form['recipients']['#default_value'] = 'dummy@dummy.dummy';
  $form['recipients']['#access'] = FALSE;

  $form['#entity_builders'][] = 'MODULENAME_contact_form_entity_builder';
}

/**
 * Contact form #entity_builders callback.
 */
function MODULENAME_contact_form_entity_builder(string $entity_type, ContactFormInterface $contact_form, array &$form, FormStateInterface $form_state) {
  $recipients = array_map('trim', explode(',', $form_state->getValue('recipients_new')));
  $contact_form->setRecipients($recipients);
}

/**
 * Implements hook_mail_alter().
 */
function MODULENAME_mail_alter(array &$message) {
  if ($message['id'] == 'contact_page_mail') {
    $message['to'] = \Drupal::token()->replace($message['to']);
  }
}

После этого можно делать так:

Написанное актуально для
Drupal 8+
Похожие записи

Комментарии

Если хотите чтобы у поля была подсказка по токенам, как это обычно бывает, чутка дополните код.

Пример:

  $form['recipients_new_tokens'] = [
    '#theme' => 'token_tree_link',
    '#token_types' => ['site', 'contact_message'],
    '#weight' => 0.002,
  ];

Данный элемент добавит ссылку с кнопкой обзора доступных токенов в модальном окне и их вставкой, чтобы не пришлось вспоминать токены и ползать за ними по другим страницам.

'#token_types' => ['site', 'contact_message'], — типы токенов доступные для использования. site — общие токены, а contact_message — это сущность контактов как раз. Например, можно будет взять значение из поля email формы, и тоже вставить сюда (чтобы письмо ушло и отправителю).

Вы также можете добавить валидацию введённым токенам в данное поле, что они валидны и допустимых типов. Чтобы условные [node:title] там нельзя было использовать.

  $form['recipients_new'] = [
    '#type' => 'textfield',
    '#title' => $form['recipients']['#title'],
    '#description' => $form['recipients']['#description'],
    '#default_value' => $form['recipients']['#default_value'],
    '#required' => TRUE,
    '#weight' => 0.001,
    '#element_validate' => ['token_element_validate'],
    '#token_types' => ['site', 'contact_message'],
];

Добавить комментарий