Відправка даних з форм асинхронно – це вже не «фіча» а «маст хев». В Drupal є чудовий модуль ASAF (ajax submit for any form), котрий дозволяє будь-яку форму Drupal зробити асинхронною.
Але часто, окрім відправки даних, необхідно зробити ще будь-які дії після успішного відправлення. Наприклад оновити перелік елементів, відобразити/сховати певний блок, вивести повідомлення.
Згідно документації ASAF, розробнику доступні наступні хукі:
HOOK_asaf_form_ajax_commands_alter HOOK_asaf_form_FORM_ID_ajax_commands_alter
Тобто пост-обробка всіх запитів або тількі певної форми.
Практика J
Завдання: після відправки форми ASAF замість форми вивести повідомлення.
Створюємо новий або в існуючим модулі додаємо хук:
function MYMODULE_asaf_form_ajax_commands_alter($commands, $form, $form_state) { ...... }
В масиві $commands будуть власно команди Drupal, які ми доповнемо нашими, $form_state[‘values’] – масив надісланих даних.
По-перше, якщо ми реалізуємо через перших хук, треба переконатися що саме потрибна форма зараз була надіслана:
if ( $form[‘#id’] == “OUR_FORM_ID” ) { ........ }
По-друге додаємо нову команду:
function MYMODULE_asaf_form_ajax_commands_alter($commands, $form, $form_state) { if ( $form["#id"] == "OUR_FORM_ID" ) { $message = “Our message for user for replace form”; $commands[] = ajax_command_html(‘.form-wrapper-class’, $message); } }
Профіт )
Таким чином ми можемо після відправки зробити будь-які дії на front-end. Детальніше про вбудовані в ядро функції тут.