Для понимания, что такое AHAH, и более конкретно, что такое AHAH в Drupal, до прочтения этой части прочитайте мой пост.. В нем описывается, что вам нужно сделать в массиве $form, чтобы добавить элементы в динамическую форму. Здесь мы объясним следующие шаги в написании функции обратного вызова и обработки отправления формы без нарушений безопасности Form API.
После того как вы прикрепили аргумент # ahah к элементу формы, вам нужно сделать очень точные настройки для его наилучшего использования. Вот обзор необходимых шагов:
Большинство людей, делая первую попытку в построении формы AHAH, делают ошибку, используя обратный вызов AHAH для создания изменений в форме, например, для добавления нового элемента или изменения существующего. Это НЕ ТО, для чего предназначен обратный вызов AHAH. Обратный вызов просто находит, обрабатывает и перестраивает форму, и затем возвращает обновленную часть формы для замены первоначально представленной версии.
Итак, как же на самом деле сделать, чтобы ваша форма действительно изменилась?
"Изменить" по отношению к вашей форме означает, что форма может быть построена различными способами в зависимости от того, что находится в $ form_state. Если вы можете это понять, то вы прошли 90% пути к подключению AHAH к Drupal.
Существуют две трюка, выходящие за рамки простого создания формы, которые нужно сделать для того, чтобы AHAH работал хорошо и гладко при одновременном снижении дыр в безопасности.
Во-первых, форма, которую вы видите на экране и массив $form, который сохраняется в кеше, всегда должен быть одним и тем же. Во-вторых, функция, создающая форму, должна создавать новые элементы формы, основываясь на содержимом $form_state, которое заполняется предоставленным обработчиком формы, и воссоздавать всю форму, каждый раз основываясь только на $form_state и данных, уже существующих в базе данных. При построении формы эта функция не должна использовать данные из $ _POST или подобных массивов.
Как пример того, как должна начинаться ваша функция по созданию формы, здесь представлена небольшая выборка из верхней части функции node_form в node.pages.inc:
Хотя это кажется сложным и трудным для понимания, на самом деле это достаточно просто: мы делаем вид, что отправленные пользователем данные уже сохранены в базе данных и мы просто показываем форму, которую затем получим при редактировании ноды.
Если следовать двум вышеприведенным трюкам, возникают красивый цикл:
Этот цикл приводит к хорошему и безопасному коду, и также отвечает стандартам AHAH Zen.
Ниже приведена функция обратного вызова из poll.module* как пример того, как нужно создавать правильно AHAH.
До и после включения drupal_rebuild_form ваш код не должен изменяться. Да, это должно быть служебной функцией, и это реализовано в D7.
Следующий пример, взятый из quicktabs.module, показывает, как вышеприведенный код работает с формами, не являющимися нодами. Административная форма quicktabs позволяет создать блоки с контентом в виде закладок, выбирая или существующий блок, или представление в виде закладки. В этой форме три элемента #ahah: кнопка, позволяющая добавить дополнительную закладку на форму (по сути, дополнительный набор элементов), кнопка для удаления закладки с формы и выпадающий список, который при изменении мгновенно обновляет варианты показа списка в другом выпадающем элементе.
Ниже приведен подключенный обработчик для кнопки "Добавить закладку", создаваемый обратным вызовом AHAH для всех трех элементов AHAH:
Здесь нам не нужно для доступа к $form включать modules/node/node.pages.inc, поскольку функция, создающая форму, уже определена в самом quicktabs.module. Отметим, что изменение будет применяться к форме в приложенном обработчике (увеличивающее количество вкладок на 1), который вызывается из drupal_process_form. Чтобы это работало, функция, создающая форму, должна реагировать на $ form_state:
Опять, написав код $quicktabs = $form_state['quicktabs'] + (array)$quicktabs; мы делаем вид, что представленные пользователем данные уже сохранены.
Вот, наконец, обработчик для выпадающего списка views:
Обратите внимание, это не похоже на то, как в случае, когда изменения затрагивают всю форму – форма будет просто восстановлена, но с другими значениями в выпадающем списке, и это изменит параметры в его выводе на экран. Его обратный вызов AHAH такой же, как и у кнопки удаления, но просто используется другой задаваемый обработчик.
Одной из других тем, достойных упоминания об обратном вызове AHAH, является использование массива $javascript. Этот трюк впервые использовал Wim Leers в AHAH Helper module и он задает повторное прикрепление поведения AHAH к элементам, сгенерированных формой при помощи AHAH. Обычно функционал jQuery всегда используется повторно, если он задан внутри Drupal.behaviors, но поведение AHAH подключается только к элементам, указанным в Drupal.settings.ahah. Этот трюк не обязателен для poll.module, поскольку элементы формы сами по себе (текстовые поля для ввода результатов голосования) не имеют никакой функциональности AHAH, но в случае Quick Tabs, модуля для создания нового выпадающего списка в модуле Views, выпадающий список вставляется с каждым новым набором элементов, которые добавляются кнопкой "Добавить вкладку", и к нему нужно каждый раз подключать свойство AHAH.
Чтобы увидеть полный код примера, посетите http://drupal.org/project/quicktabs и загрузите релиз quicktabs-6.x-2.0-rc1. Для того чтобы увидеть форму в действии, щелкните здесь. Вам нужно изменить тип закладки на "View", для того чтобы увидеть, как это работает.
Код из poll.module взят из версии D7, обратный вызов ahah еще не используется в D6. Патч находится здесь.
Ничего из приведенного выше не работает с типом «файл». Все хорошо работает для добавления полей, но как только вы попытаетесь загрузить файл, любой старый броузер выдаст ошибку "HTTP error 0".
Более подробно проблема обсуждается здесь: http://drupal.org/node/399676.
В общем, представленный здесь код работает прекрасно, если только тип поля не " file "
мысли..
наверное нужно использовать конструкцию (перед
// Финальное выполнение обратного вызова.
drupal_json(array('status' => TRUE, 'data' => $output));
):
if (ВАЛИДАТОР($form_state['values'])) {
// делаем то, что хотели делать в submit();
$choice_form=drupal_get_form('success_form');
}
да?
Поясните пжлста как все это работает, я не понял
я не понял, когда именно вызывается ф-я form_submit, после ahah-функции?
просто сделал, у меня работает всё в таком плане:
аякс стоит на валидатор, после того как выполнится сабмит - загружается изначальная пустая форма. А как сделать, чтобы после удачного сабмита загрузилась другая форма.. или вообще просто текст.
ахах и добавление форм
Добрый день!
У Вас есть информация как на страницу добавлять ахахом формы?Интерисует добавление ахахом на страницу элементов с ахах функциональностью?? ПОдробно вопрос мой тут
http://www.drupal.ru/node/71492
Есть у Вас хоть какие нибудь зацепки как это реализовать?
Спасибо! :)