УрокЗаставляем любую форму выполняться через AJAX в Drupal 7
Абсолютно любую форму в Друпале можно заставить работать с помощью аякса. Для этого достаточно написать совсем маленький модуль, который это реализует. Назовём модуль, например, ajax_forms. Итак, поехали потихонечку.
Создаём страницу для ajax запроса
С помощью создаём страницу, которая будет принимать ajax запрос из формы:
/** * 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; }
Здесь стоит обратить внимание на delivery callback. Значение этого параметра - функция, которая будет вызывать набор результатов для страницы и отдавать её браузеру. По умолчанию это , однако в нашем случае - это , который умеет коррентно обрабатывать запросы и ответы 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', ); } }
Пока вроде бы ничего сложного. Теперь последняя функция - непосредственно работа самого 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')); // Записываем сообщение в div, который был добавлен вверху формы return array('#type' => 'ajax', '#commands' => $commands); }
Ну вот, собственно, и всё. Все комменты в коде.
Я попробовал прикрутить это к редактированию / добавлению ноды. Заработало. Пруф:
- SplasH
- 05.01.2012
- 2483

Комментарии
Евгений, здравствуйте. Давно читаю ваши статьи. Но очень жаль, что для Д6 перестали писать. В связи с этим вопрос - есть ли способ прикрутить этот метод для шестой версии?
Для шестёрки ещё проще. Скачиваете модуль . После чего в хуке hook_form_alter() у формы указываете так:
Всё, аякс будет работать. Более подробно можно почитать .
По поводу шестёрки - она устаревает. Да и работа с аяксом в семёрки на порядок выше и лучше.
Спасибо. Шестерка может и стареет, но несколько сайтов уже сделаны и переносит их на 7-ку долго. Еще раз спасибо за ответ
Ищу давно способ вывода формы комментариев черех quick tabs с аякс но пока безуспешно
Тут думать надо и кодить) Задача не совсем тривиальная, надо какое-то время потратить на неё. Сначала требуется точное тз - что и как вы хотите выводить.
На странице продукта выводить вкладки
(Обо всем views) (Характеристики vews) (комментарии их содержимое и форма добавления комментариев)
Все то подргружать через ajax
Комментарии и форма добавления комментариев - это одна вкладка, или разные?
Да это одна вкладка.
ПОнял. Это не сложно. Думаю завтра приду домой и напишу вам решение.
В node.tpl.php темы:
А в 6ке наверно по сложнее ?
Нет, по сути тоже самое, только закидывать этот код надо в другой шаблон, вот и всё.
а в какой другой ?
в comment-wrapper.tpl.php
пробую.
'vid' => 'АЙДИ_ВЬЮХИ', я взял название вьюхи
'display' => 'ВИД_ВЬЮХИ', я так понял это defaults
'args' => 'АРГУМЕНТЫ_ЕСЛИ_НАДО', %1
$quicktabs['qtid'] = 'my-quicktabs-unique-id'; взял из quicktabs Machine-readable name:
вставляю весь этот код в comment-wrapper.tpl.php Но получаю ошибку
Покажите весь код, которым вы пытаетесь это сделать.
не
'args' => '%1', а то, что должно передаваться в качестве аргумента. Например, nid материала или что-то ещё.без аргументов тоже не работает, появляются пункты если убрать
появляются пункты но пишет
You are not authorized to access this content.
подскажите еще какие то варианты может попробовать?
Вообще должно всё верно выводиться. Если вы сидите под админом, то ошибка You are not authorized to access this content. не может быть из-за ошибок доступа. Значит, что-то вы делаете несовсем правильно.
Могу показать на примере только нет у вас личных сообщений )
Зато у меня есть форма контактов)
добрый вечер, можете помочь мне? делаю для drupal 7 такую фичу, хочу чтобы форма добавления ноды выполнялась через аякс, сделал как у вас (айдишку формы поменял на свою, "reviews_node_form"), но получаю ошибку
"Возникла AJAX HTTP ошибка.
Полученный код HTTP: 200
Следует отладочная информация.
Путь: /ajax_forms_ajax
СтатусТекстом
ОтветТекстом:
Fatal error: Call to undefined function node_form_validate() in /home/xxx/xxx/xx/public_html/includes/form.inc on line 1432"
нашел эту (node_form_validate()) функцию в файле "node.pages.inc" подключал его в этой строчке module_load_include('pages.inc', 'user'); но всетаки получаю ошибку ((
добавьте при создании формы:
А потом где-нибудь в этом же файле:
спасибо, но пока ошибка все еще есть ((
вот весь мой код:
поставил
$form['#process'][] = 'reviews_form_process';в функцию "ajax_forms_form_alter" какие еще могут быть варианты? вот http://ivyshka.vin-life.com/reviews страница, для которой я это делаюЛогично. Вам надо не
а так:
Вы же должны подключить node.pages.inc :)
большое спасибо, все работает :)
еше такой вопрос, Вы не подскажете где можно поменять сообщение которое выводиться после создания материала. Я нашел пока только вариант в переводах поменять, но такой вариант заменит сообщение для всех типов материала, а хотелось бы только для одного типа материала, может можно это сделать и в этом модуле?
Привет! Сделал все как написано, но форму изначально оборачиваю в fancybox:
Получается при нажатии субмита все аякс не работает, страница перегружается.
Все, интерес к теме исчерпан?
После получения формы вызови Drupal.attachBehaviors();
Комментировать