Подтвердить что ты не робот

Добавьте файл CSS или Javascript для определенного node в Drupal 6

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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");
  }
}

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

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

Ответ 3

Я использую функции препроцесса, но у этого есть некоторые проблемы. $variables['styles'] обычно устанавливается перед вызовом функции node preprocess. Другими словами, 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

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

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

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

Ответ 5

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

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

Ответ 6

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

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