Включите файл CSS или Javascript для определенного узла в Drupal 6 - PullRequest
23 голосов
/ 15 сентября 2008

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

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

Ответы [ 6 ]

14 голосов
/ 16 сентября 2008

Я бы посоветовал не использовать 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 позволяет использовать каскадный подход: в модуле можно использовать общие / базовые элементы и предоставлять расширенные или специальные функции в теме.

5 голосов
/ 10 марта 2009

Я использую функции предварительной обработки, но у этого есть некоторые проблемы. $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. Вряд ли когда-нибудь потребуется создать модуль для решения тематической проблемы.

Приветствие.

4 голосов
/ 10 июня 2010

Это похоже на хорошее решение:

http://drupal.org/project/js_injector а также http://drupal.org/project/css_injector

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

3 голосов
/ 15 сентября 2008

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

2 голосов
/ 15 сентября 2008

Это должно сработать - модуль быстрого доступа, который использует 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 и не требует отдельного файла шаблона узла, который может устареть, если вы обновили шаблон основного узла и забыли о своем пользовательском.

0 голосов
/ 15 сентября 2008

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

РЕДАКТИРОВАТЬ: Я не думаю, что я был очень ясно выше. Вы хотите назвать файл шаблона node- (nodeid) .tpl.php. Поэтому, если это был Node 1, вызовите файл node-1.tpl.php

...