Созонов Алексей

Веб-разработчик

Заставляем работать формы через ajax drupal

09.08.2015

1) Создаем модуль с названием ajax_forms

2) Добавляем в ajax_forms.module

<?php
/**
 * Implements hook_menu().
 */
function ajax_forms_menu() {
  $items = array();

  $items['ajax_forms_ajax'] = array(
    'page callback' => 'ajax_forms_ajax_callback',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
    'delivery callback' => 'ajax_deliver', // функция, которая вызывает набор результатов для страницы и отдает её браузеру
    'theme callback' => 'ajax_base_page_theme',
  );

  return $items;
}

3) Повесим на кнопку выполнения ajax

/**
 * Implements hook_form_alter().
 */
function ajax_forms_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_register_form') {

    // Добавляем div, куда будем ложить сообщения, в самый верх формы
    $form['messages'] = array(
      '#markup' => '<div id="ajax-forms-messages"></div>',
      '#weight' => -50,
    );

    // Включаем ajax для кнопки
    $form['actions']['submit']['#ajax'] = array(
      'path' => 'ajax_forms_ajax',
    );
  }
}

4) Последняя функция - непосредственно работа самого ajax'a

/**
 * Provides ajax callback for form submit
 */
function ajax_forms_ajax_callback() {

  // Подключаем файл из модуля user.
  // В данной ситуации без него работать не будет, но
  // вообще он не нужен. Надо подключать только те файлы,
  // без которых форма не сможет корректно отработать.
  // Во многих случаях вообще ничего подключать не надо.
  module_load_include('pages.inc', 'user');

  // Получаем данные о форме и её состоянии
  list($form, $form_state) = ajax_get_form();

  // Заставляем выполниться все действия формы, то есть
  // выполняем все validate и submit функции для этой формы.
  drupal_process_form($form['#form_id'], $form, $form_state);

  // Собираем сообщения, которые вылезли в процессе выполнения формы
  $commands = array();
  $commands[] = ajax_command_html('#ajax-forms-messages', theme('status_messages'));

  /**
  * Если нужен редирект
  * ctools_include('ajax');
  * ctools_add_js('ajax-responder');
  * $commands[] = ctools_ajax_command_redirect('node/1');
  */

  // Записываем сообщение в div, который был добавлен вверху формы
  return array('#type' => 'ajax', '#commands' => $commands);
}
#Drupal