Drupal 7 содержит значительное количество модернизаций и нововведений, которые направлены на удобство программирования, расширяемость проектов и контроль над подключением и выполнением javascript-кода в Drupal.

Очередность подключения javascript в drupal 7

Функция drupal_add_js() в Drupal 7 позволяет выбрать последовательность загрузки скриптов. Помимо явного указания места в очереди существуют предопределенные константы:

  • JS_LIBRARY: библиотеки, настройки (settings), jQuery plugins.
  • JS_DEFAULT: JavaScript модулей.
  • JS_THEME: JavaScript тем

Пример:

drupal_add_js('jQuery(document).ready(function () { alert("Hello!"); });', array('type' => 'inline', 'scope' => 'footer', 'weight' => 5);

Добавление JavaScript в файл .info модуля

Если Javascript-файл должен подключаться на всех страницах, вне зависимости от темы, проще всего добавить его в .info файл модуля. Это позволяет системе управления Drupal скомпоновать итоговые Javascript файлы оптимальным образом.

Подключение внешних файлов Javascript

drupal_add_js() теперь позволяет добавлять скрипты со сторонних ресурсов.

Пример:

drupal_add_js('http://example.com/example.js', 'external');

Overriding JavaScript

hook_js_alter() дает возможность подменить скрипты ядра скриптами модуля. Так делает модуль jQuery Update, например.

function hook_js_alter(&$javascript) {
  $javascript['misc/jquery.js']['data'] = drupal_get_path('module', 'jquery_update') . '/jquery.js'; // Swap out jQuery to use an updated version of the library
}

Библиотеки JavaScript

В Drupal 7 стандартизовано добавление коллекций JavaScript и CSS. Примером может служить, например, какой-либо плагин jQuery - коллекция скриптов и стилей. Если какой-либо модуль содержит такую коллекцию, настоятельно рекомендуется имплементировать hook_library() и дать возможность другим модулям добавлять имеющиеся в распоряжении модуля коллекции через #attached['library'] или drupal_add_library().

Пример: system.module определяет библиотеку Vertical Tabs, которая содержит один файл js и один файл css:

function system_library() {
  ...
  // Vertical Tabs.
  $libraries['vertical-tabs'] = array(
    'title' => 'Vertical Tabs',
    'website' => 'http://drupal.org/node/323112',
    'version' => '1.0',
    'js' => array(
      'misc/vertical-tabs.js' => array(),
    ),
    'css' => array(
      'misc/vertical-tabs.css' => array(),
    ),
  );
  ...
  return $libraries;
}

Библиотека подключается там где требуется через drupal_add_library():

function theme_vertical_tabs($variables) {
  $element = $variables['element'];
  // Add required JavaScript and Stylesheet.
  drupal_add_library('system', 'vertical-tabs');
 
  return '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
}

Для скриптов и стилей, подключение которых реализуется через hook_library(), подключение через drupal_add_js / drupal_add_css не требуется.

Использование jQuery

Для исключения засорения глобальной области видимости и для исключения конфликтов с другими JavaScript-фреймворками jQuery вынесен в отдельное пространство имен. Теперь весь JavaScript код который должен работать с $, должен быть вынесен в контекст. Пример:

(function ($) {
  // All your code here
})(jQuery);

Если так не делать, то появится ошибка Uncaught TypeError: Property '$' of object [object DOMWindow] is not a functionили подобная.

Behaviors

Очередные изменения в behaviors Drupal 7. Вкратце:

  • attach обязателен
  • detach опционален
  • settings передаются в обработчики напрямую (были глобальными)

Было в Drupal 6:

 Drupal.behaviors.exampleModule = function (context) {
   $('.example', context).click(function () {
    $(this).next('ul').toggle('show');
  });
}

Стало в Drupal 7:

(function ($) {
 
  Drupal.behaviors.exampleModule = {
    attach: function(context, settings) {
      $('.example', context).click(function () {
        $(this).next('ul').toggle('show');
      });
    }
  };
 
})(jQuery);

Для лучшего понимания рекомендуется к знакомлению сравнительно простые примеры, например, mics/collapse.js