В Drupal часто возникает проблема дублирования сообщений после отправки формы. Это происходит, когда пользователь нажимает на кнопку «Submit» (субмит) несколько раз, и каждое нажатие вызывает повторную отправку запроса на сервер. В результате на странице отображается несколько одинаковых сообщений.

Чтобы решить эту проблему, можно использовать следующий код в кастомном модуле или шаблоне Drupal:

$form['#attributes']['class'][] = 'disable-submit-button';

$form['actions']['submit']['#attributes']['onclick'][] = "this.disabled=true; this.form.submit();";

В приведенном коде мы добавляем класс «disable-submit-button» к форме, чтобы отключить кнопку сабмита при первом нажатии. А также, мы добавляем атрибут «onclick» к кнопке сабмита, чтобы при нажатии она становилась неактивной и форма отправлялась только один раз.

Пример использования кода

function mymodule_form_alter(&$form, \&$form_state, $form_id) {
  if ($form_id == 'my_form_id') {
    $form['#attributes']['class'][] = 'disable-submit-button';

    $form['actions']['submit']['#attributes']['onclick'][] = "this.disabled=true; this.form.submit();";
  }
}

Из примера выше видно, что мы используем хук mymodule_form_alter() для изменения формы с ID ‘my_form_id’.

Дополнительные вопросы

1. Как проверить, отправилась ли форма успешно?

Для проверки успешной отправки формы в Drupal вы можете использовать следующий код:

if ($form_state->get('executed')) {
  // Форма успешно отправлена.
}

2. Как изменить сообщение об успешной отправке формы?

Чтобы изменить сообщение об успешной отправке формы в Drupal, вы можете использовать следующий код:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'my_form_id') {
    // Изменение сообщения об успешной отправке формы.
    $form['#submit'][] = 'mymodule_custom_submit_handler';
  }
}

function mymodule_custom_submit_handler($form, \&$form_state) {
  $form_state->set('executed', TRUE);
  drupal_set_message('Ваша форма успешно отправлена.');
}

3. Как добавить валидацию на форму?

Чтобы добавить валидацию на форму в Drupal, вы можете использовать следующий код:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'my_form_id') {
    $form['#validate'][] = 'mymodule_custom_validate_handler';
  }
}

function mymodule_custom_validate_handler($form, \&$form_state) {
  $value = $form_state->getValue('field_name');

  if ($value == 'custom_value') {
    $form_state->setErrorByName('field_name', t('Ошибка валидации. Пожалуйста, введите корректное значение.'));
  }
}

В приведенном коде мы добавляем функцию mymodule_custom_validate_handler в массив $form['#validate'] для валидации поля с именем ‘field_name’. Если значение поля равно ‘custom_value’, то устанавливаем ошибку с помощью $form_state->setErrorByName().