Подключение js и css файлов в блоке через #attached

Подключение css и js файлов, js settings выглядит следующим образом.
В файле MYMODULE.module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {
  // Выводим содержимое блока.
  $block['content']['#markup'] = 'block content';
 
  // Получаем путь до модуля.
  $path_to_module = drupal_get_path('module', 'MYMODULE');
 
  // Подключаем css файл.
  $block['content']['#attached']['css'][] = $path_to_module . '/css/MYMODULE.css';
 
  // Настройки которые мы передадим в js.
  $js_settings = array(
    'parameter_1' => 1,
    'parameter_2' => 2,
  );
 
  // Подключаем js файл и js settings.
  $block['content']['#attached']['js'][] = $path_to_module . '/js/MYMODULE.js';
  $block['content']['#attached']['js'][] = array(
    'data' => array($delta => $js_settings),
    'type' => 'setting',
  );
 
  // Подключаем библиотеку.
  $block['content']['#attached']['library'][] = array('system', 'ui.dialog');
}

Также можно использовать drupal_add_js(), drupal_add_css(), но приведенный пример выше является более правильным, т.к. позволяет удобно альтерить подключенные js и css файлы через hook_form_FORM_ID_alter() и hook_form_alter(). Содержимое массива #attached при рендере будет обработано функцией drupal_process_attached() и в конечном итоге файлы css, js будут подключены через функции drupal_add_css(), drupal_add_js() соответственно. Конечно, можно альтерить подключенные скрипты через hook_js_alter(), но в этом случае необходимо будет плодить больше логики для замены скриптов, чем с hook_form_FORM_ID_alter().
Еще один важный аспект в пользу #attached - подключение файлов при кешировании. Если вы подключаете файлы через функции drupal_add_js(), drupal_add_css() в закешированный блок, то данные функции отработают только 1 раз после сброса кеша. При дальнейшем отображении блока они не сработают, т.к. для кешированного блока hook_block_vew() не будет вызван.

6 Comments

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

А как же самое главное?

А как же самое главное? Почему приведённый пример подключения является "более правильным"? В чём преимущество перед вызовами функций drupal_add_*()?

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

Вау, да ты крут! :) Кроме

Вау, да ты крут! :) Кроме возможностей для альтера хочу добавить ещё один аспект - кэш. Например, если включено кэширование блоков (и твой кастомный блок закэширован - а мы хотим, чтобы он кэшировался), то hook_block_view() для него не будет вызван - и соостветственно, если в нём были вызовы drupal_add_js/css(), то они не выполнятся, и блок будет выглядеть работать совсем не так, как планировалось.

Аватар пользователя Алексей

А не просветите, как

А не просветите, как подключить в друпал 8 библиотеку jquery-ui непосредственно в теле ноды?
Раньше, в 7-ке использовали drupal_add_library(), в 8 -к эту убрали, а куда ['#attached'] добавить - не соображу ((((.