Drupal Ajax: расширяем команды

Відправка даних з форм асинхронно – це вже не «фіча» а «маст хев». В Drupal є чудовий модуль ASAF (ajax submit for any form), котрий дозволяє будь-яку форму Drupal зробити асинхронною.

Але часто, окрім відправки даних, необхідно зробити ще будь-які дії після успішного відправлення. Наприклад оновити перелік елементів, відобразити/сховати певний блок, вивести повідомлення.

Згідно документації ASAF, розробнику доступні наступні хукі:

  1. HOOK_asaf_form_ajax_commands_alter
  2. HOOK_asaf_form_FORM_ID_ajax_commands_alter

Тобто пост-обробка всіх запитів або тількі певної форми.

Практика J

Завдання: після відправки форми ASAF замість форми вивести повідомлення.

Створюємо новий або в існуючим модулі додаємо хук:

  1. function MYMODULE_asaf_form_ajax_commands_alter($commands, $form, $form_state) {
  2. ......
  3. }

В масиві $commands будуть власно команди Drupal, які ми доповнемо нашими, $form_state[‘values’] – масив надісланих даних.

По-перше, якщо ми реалізуємо через перших хук, треба переконатися що саме потрибна форма зараз була надіслана:

  1. if ( $form[#id’] == “OUR_FORM_ID” ) {
  2. ........
  3. }

По-друге додаємо нову команду:

  1. function MYMODULE_asaf_form_ajax_commands_alter($commands, $form, $form_state) {
  2. if ( $form["#id"] == "OUR_FORM_ID" ) {
  3. $message = “Our message for user for replace form”;
  4. $commands[] = ajax_command_html(.form-wrapper-class, $message);
  5. }
  6. }

Профіт )

Таким чином ми можемо після відправки зробити будь-які дії на front-end. Детальніше про вбудовані в ядро функції тут