Включить файл CSS или Javascript для определенного узла в Drupal 6
-
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