Заставляем работать формы через 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
