Включить файл CSS или Javascript для определенного узла в Drupal 6

Каков наилучший способ включения файла CSS или Javascript для определенного узла в Drupal 6.

Я хочу создать страницу на своем сайте, на которой запущено небольшое приложение javascript, поэтому CSS и javascript специфичны для этой страницы и вообще не хотят включаться в другие загрузки страниц.


person Evan    schedule 14.09.2008    source источник


Ответы (6)


Я бы не советовал использовать для этого hook_nodeapi. Добавление CSS и Javascript связано с макетом, поэтому hook_nodeapi не место для этого: используйте темы. Таким образом, вы можете переопределить эти файлы при разработке новой темы. Сделать это с подходом nodeapi будет немного сложнее (вам придется искать файлы в списке js/css, удалять их и заменять своими).

В любом случае: вам нужно добавить функцию предварительной обработки узла, которая добавляет эти файлы для вас. Вы можете сделать это либо в модуле, либо в пользовательской теме. Для модуля это будет:

function mymodule_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(drupal_get_path('module', 'mymodule') . "/file.js", "module");
    drupal_add_css(drupal_get_path('module', 'mymodule') . "/file.css", "module");
  }
}

или по теме:

function mytheme_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(path_to_theme() . "/file.js", "theme");
    drupal_add_css(path_to_theme(). "/file.css", "theme");
  }
}

Не забудьте сначала очистить кеш.

Эти функции вызываются перед оформлением узла. Указание js/css позволяет использовать каскадный подход: вы можете иметь общие/базовые вещи в модуле и предоставлять расширенные или специальные функции в теме.

person Inferis    schedule 15.09.2008
comment
Небольшое исправление: когда вы добавляете CSS в тему, вы должны обновить переменную стилей после вызова drupal_add_css, например. $variables['styles'] = drupal_get_css(); - person Pianosaurus; 30.11.2010

Я использую функции предварительной обработки, но у этого есть некоторые проблемы. $variables['styles'] обычно устанавливается перед вызовом функции предварительной обработки узла. Другими словами, drupal_get_css уже вызван, что делает ваш вызов drupal_add_css бесполезным. То же самое касается drupal_add_js. Я работаю над этим, сбрасывая значение $variables['styles'].

function mytheme_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(path_to_theme() . "/file.js", "theme");
    drupal_add_css(path_to_theme(). "/file.css", "theme");
    $variables['styles'] = drupal_get_css();
    $variables['script'] = drupal_get_js();
  }
}

Кажется, это работает для большинства случаев.

P.S. Вряд ли когда-либо понадобится создавать модуль для решения проблемы с темами.

Ваше здоровье.

person canen    schedule 10.03.2009

Это кажется хорошим решением:

http://drupal.org/project/js_injector и http://drupal.org/project/css_injector

Это работает, когда вы хотите вставить встроенный код во что-то, кроме технически узла, поэтому нет идентификатора узла и нет доступной опции ввода PHP. Например, я использовал его для внедрения небольших настроек jQuery на пару страниц администратора. Он работает по пути, а не по идентификатору узла.

person ninusik    schedule 10.06.2010
comment
См. drupal.org/project/asset_injector для Drupal 8+. - person bryanbraun; 03.01.2020

Лучшее решение, которое я придумал, — это включить режим ввода PHP, а затем вызвать drupal_add_css и drupal_add_js в блоке PHP в начале тело вашего узла.

person Evan    schedule 15.09.2008
comment
Я использовал эту технику снова и снова в Drupal 5. Например, клубный календарь на главной странице этого сайта был реализован таким образом. chesmontastro.org - person Mike Heinz; 10.03.2009
comment
Это может быть самым простым решением, но быстро становится непригодным для сопровождения, так как хранение PHP-кода в базе данных очень сложно отлаживать, а контроль версий практически невозможен. Приведенное выше решение Inferis — гораздо более чистый подход. - person jhedstrom; 11.06.2010

Это должно сработать — быстрый модуль, который использует hook_nodeapi для вставки JS/CSS при просмотре узла.

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  // the node ID of the node you want to modify
  $node_to_modify = 6;

  // do it!
  if($op == 'view' && $node->nid == $node_to_modify) {
    drupal_add_js(drupal_get_path('module', 'mymodule') . '/mymodule.js');
    drupal_add_css(drupal_get_path('module', 'mymodule') . '/mymodule.css');
  }
}

Это позволяет избежать проблем с безопасностью при включении входного фильтра PHP и не требует отдельного файла шаблона узла, который может устареть, если вы обновили основной шаблон узла и забыли о своем пользовательском.

person ceejayoz    schedule 15.09.2008

У вас может быть собственный шаблон для этого узла (node-needsjs.tpl.php), который вызывает javascript. Это немного чище, чем использование PHP прямо в теле узла, и упрощает внесение изменений в содержимое в будущем.

EDIT: я не думаю, что я был очень ясным выше. Вы хотите назвать файл шаблона node-(nodeid).tpl.php. Итак, если это был узел 1, вызовите файл node-1.tpl.php.

person MattBelanger    schedule 15.09.2008
comment
Я действительно должен был лучше обдумать этот ответ - еще одним преимуществом использования пользовательского файла шаблона является возможность заставить другие узлы использовать шаблон с помощью функции template_preprocess_page в template.php. - person MattBelanger; 15.09.2008