Разработчиков часто смущает понятие AHAH в Drupal. Это сокращение обычно относят к подмножеству функциональных возможностей AJAX. В то время как AJAX обычно возвращает документ в формате XML, который затем нужно проанализировать, в AHAH вы получаете уже готовый HTML, который можно сразу загрузить в нужный элемент DOM.

В Drupal, однако, AHAH имеет особое значение. Все началось с модуля AHAH Forms Framework для Drupal 5, целью которого было позволить разработчикам добавлять новые элементы формы в саму форме без перезагрузки страницы. Добавляя свойство ‘#ahah’, определяющее функцию обратного вызова и создающее новые элементы, желаемый эффект (fade или slide) и само событие, в ответ на которое ваш вызов должен произойти (по умолчанию ‘click’), к элементу формы, скажем, к кнопке, нажатие на нее будет сразу создавать новые элементы без необходимости написать даже одну строчку кода на JavaScript.

Позже эта функциональность была встроена в Drupal 6, вот почему термин AHAH сейчас относится исключительно к динамической обработке элементов формы в Drupal. Если вы просто хотите динамически загрузить некоторый контент (а не элементы формы), то AHAH, в смысле Drupal, не является правильным инструментом. На самом деле разница, которая вначале привела к созданию термина AHAH как не использующего XML, в то время как AJAX его использует, больше не рассматривается как существенная и сейчас почти все называют это AJAX.

Для особого случая, подобном AHAH в Drupal, несмотря на то, что встроенные функции исключают необходимость писать собственный JavaScript для получения динамически загружаемых элементов, существует ряд важных шагов, которые могут быть довольно сложными. Наиболее важной является функция обратного вызова, которая обсуждается в подразделе Drupal и AHAH: добавление элементов в форму. Для лучшего понимания основные шаги лучше всего объяснить на примере, поэтому давайте посмотрим, как это делается в модуле Poll. Модуль создает форму опроса, которая имеет кнопку “More choices”;, нажав на которую, мы динамически добавляем новый набор полей опроса (одно поле для текста и одно поле для первоначального количества голосов). Вот как это делает AHAH:

<?php
  // следующий код взят из функции poll_form() в poll.module

   // Добавляем  оболочку кнопки “choices and more”.
   $form['choice_wrapper']  = array(
   '#tree' => FALSE,
   '#weight' => -4,
   '#prefix' => '<div class="clear-block"  id="poll-choice-wrapper">',
   '#suffix' => '</div>',
   );

   // Контейнер только для выборов полей опроса.
   $form['choice_wrapper']['choice'] = array(
   '#prefix' => '<div id="poll-choices">',
   '#suffix' => '</div>',
   '#theme' => 'poll_choices',
   );

   // Добавляем текущие поля опроса к форме.
   for ($delta = 0; $delta < $choice_count; $delta++) {
   $text = isset($node->choice[$delta]['chtext']) ? $node->choice[$delta]['chtext']  : '';
   $votes = isset($node->choice[$delta]['chvotes']) ? $node->choice[$delta]['chvotes']  : 0;

   $form['choice_wrapper']['choice'][$delta] = _poll_choice_form($delta,  $text, $votes);
   }

   // Мы называем нашу кнопку 'poll_more' для того чтобы избежать конфликтов с другими модулями, использующими  
   // кнопки для AHAH с id='more'.
   $form['choice_wrapper']['poll_more'] = array(
   '#type' => 'submit',
   '#value' => t('More choices'),
   '#description' => t("If the amount of boxes above  isn't enough, click here to add more choices."),
   '#weight' => 1,
  '#submit' => array('poll_more_choices_submit'), // If no  javascript action.
   '#ahah' => array(
   'path' => 'poll/js',
   'wrapper' => 'poll-choices',
   'method' => 'replace',
   'effect' => 'fade',
   ),
   );
  ?>

Вначале создается оборачивающий элемент, содержащий все элементы AHAH, в том числе и кнопку. Затем создается специальная оболочка только для полей опроса, и все существующие поля добавляются в нее. Затем создается ссылка на эту оболочку в свойстве #ahah кнопки ($form[‘choice_wrapper’][‘poll_more’]). На самом деле свойство #ahah сообщает здесь «Когда пользователь нажмет меня (не забываем, что мы используем событие по умолчанию ‘click’), из пути ‘poll/js’ будет извлечен новый элемент, вставлен в div с id=‘poll-choices’, замещая существующий контент (как альтернатива к его добавлению, что является другой опцией), и при замене использует эффект ‘fade’. Другой опцией было бы, например, использование вместо ‘fade’ иного эффекта или замена события вызова на другое. В этом случае вам нужно было бы добавить параметр ‘event’ к вашему свойству ‘#ahah’ и установить его значение на ‘change’.

Код в misc/ahah.js на стороне jQuery подключает заданное поведение к вашему элементу и создает запрос AJAX к обратному вызову. Теперь вам нужно создать собственную функцию обратного вызова, обработчик подтверждения отправки формы и убедиться, что все встроенные функции встроены правильно. Для объяснения того, как избежать многих ловушек, в которые вы можете попасть, смотрите пост Drupal и AHAH: добавление элементов в форму.

Комментарии

comments powered by Disqus