Аватар пользователя Dima

Доклад по Drupal.ajax framework

В этой статье хочу выложить материалы с нашего общего доклада с Анатолием Поляковым на тему Drupal AJAX Framework, котрый состоялся 16 января 2014 года на киевском друпал кафе.
Drupal AJAX Framework это встроенный в Drupal 7 набор инструментов позволящий создавать и обрабатывать без особых усилий со стороны разработчика страницы с асинхронной загрузкой контента.
Для того чтобы добавить на страницу AJAX запросы и их обрабоку, не обязательно быть глубоко обознанным в javascript и AJAX технологии в частности. В Drupal 7 сделать простой AJAX функционал досточно просто.

Например, мы хотим предоставить пользователю административную ссылку по клику на которой произойдут определеные действия на сервере и также мы должны вернуть пользователю результат обработки. Самый простой вариант будет выглядеть так (пример с реального проекта):

  1. /**
  2.  * Menu callback.
  3.  *
  4.  * Rebuild sitemap.
  5.  */
  6. function site_studio_sitemap_settings() {
  7. $build['info'] = array(
  8. '#type' => 'item',
  9. '#markup' => t('Press this link to rebuild the sitemap.')
  10. );
  11.  
  12. $build['link'] = array(
  13. '#type' => 'link',
  14. '#title' => t('Rebuild sitemap'),
  15. '#href' => 'ajax/ss-sitemap-rebuild',
  16. '#attributes' => array(
  17. 'class' => array('use-ajax'),
  18. ),
  19. '#options' => array(
  20. 'query' => array('secret' => site_STUDIO_SITEMAP_REBUILD_SECRET),
  21. ),
  22. '#attached' => array(
  23. 'library' => array(
  24. 'system',
  25. 'drupal.ajax'
  26. )
  27. ),
  28. ),
  29. );
  30. return $build;
  31. }
  32.  
  33. /**
  34.  * Menu, ajax callback.
  35.  *
  36.  * Rebuilds sitemap file.
  37.  */
  38. function site_studio_sitemap_rebuild() {
  39. // Do some basic check for request.
  40. $commands = array();
  41.  
  42. if (empty($_GET['secret'])) {
  43. return;
  44. }
  45.  
  46. if ($_GET['secret'] != SITE_STUDIO_SITEMAP_REBUILD_SECRET) {
  47. return;
  48. }
  49.  
  50. $success = _site_studio_sitemap_cron();
  51.  
  52. if ($success) {
  53. $commands[] = ajax_command_alert(t('The sitemap file was successfully rebuilt'));
  54. }
  55. else {
  56. $commands[] = ajax_command_alert(t('Problem detected while rebuild xml sitemap for site studio. Please contact dev team'));
  57. }
  58.  
  59. print ajax_render($commands);
  60. drupal_exit();
  61. }

Что мы можем увидеть в этом простом примере?

  1. Для того чтобы добавить уведомить друпал о том что ссылка будет иметь ajax обработчик достаточно добавить ей класс 'use-ajax'.
  2. Друпал автоматически добавляет ajax.js только в случае если ajax элемент присутвует в форме и объявлен с помощью параметра '#ajax' => array(...). Поэтому мы должны добавить библиотеку самостоятельно:
    #attached' => array(
          'library' => array(
            array(
              'system',
              'drupal.ajax'
            )
          ),
        ),
  3. Использование простой встроенной ajax команды:
    ajax_command_alert('...').
    AJAX комманда на стороне php не что иное как массив с обязательным ключом 'command' который должен содержать имя команды выполянемой на стороне javascript.
    Массив ajax комманд нужно отдавать (print, echo) через Drupal функцию ajax_render(). В этом случае PHP массив будет корректно преобразован в JSON массив.
    Имя коммадны должно совпадать с одной из объявленных комманд в Drupal.ajax.prototype.commands.

Более подробно о том как использовать Drupal AJAX Framework включая создание собсвенной ajax комманды, запуск и создание Drupal.ajax объекта на стороне javascrip смотрите в перезентации либо в видео записи доклада.

Видео: