Подключение js и css файлов в блоке через #attached
Опубликовано чт, 28/08/2014 - 00:20
Подключение 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 - пт, 18/09/2015 - 18:48
А как же самое главное?
А как же самое главное? Почему приведённый пример подключения является "более правильным"? В чём преимущество перед вызовами функций drupal_add_*()?
nightdevel - сб, 19/09/2015 - 17:00
Вопрос вполне резонный,
Вопрос вполне резонный, спасибо. Обновил статью.
duozersk - пт, 23/10/2015 - 11:45
Вау, да ты крут! :) Кроме
Вау, да ты крут! :) Кроме возможностей для альтера хочу добавить ещё один аспект - кэш. Например, если включено кэширование блоков (и твой кастомный блок закэширован - а мы хотим, чтобы он кэшировался), то hook_block_view() для него не будет вызван - и соостветственно, если в нём были вызовы drupal_add_js/css(), то они не выполнятся, и блок будет выглядеть работать совсем не так, как планировалось.
nightdevel - пт, 23/10/2015 - 18:22
К чему ирония? А вот за
К чему ирония? А вот за дополнение спасибо, упустил этот момент. Дополнил статью.
Алексей - ср, 26/04/2017 - 23:06
А не просветите, как
А не просветите, как подключить в друпал 8 библиотеку jquery-ui непосредственно в теле ноды?
Раньше, в 7-ке использовали drupal_add_library(), в 8 -к эту убрали, а куда ['#attached'] добавить - не соображу ((((.
nightdevel - пт, 28/04/2017 - 00:13
ответ на вопрос здесь
ответ на вопрос здесь