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

StackOverflow https://stackoverflow.com/questions/61735

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение 4

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

Другие советы

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top