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

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

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

Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Разработка Drupal и AngularJS: Идеальное сочетание для вашей веб-стратегии
Один опытный веб-разработчик назвал комбинацию Drupal и AngularJS "сочетанием, созданным на небесах". Почему так? Потому что вместе они могут создать...
23
0
21 949
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

Я использовал эту технику снова и снова в Drupal 5. Например, «Клубный календарь» на главной странице этого сайта был реализован таким образом. chesmontastro.org

Mike Heinz 10.03.2009 20:44

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

jhedstrom 11.06.2010 00:08

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

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

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

MattBelanger 15.09.2008 04:14

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

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

Небольшое исправление: когда вы добавляете CSS в тему, вам необходимо обновить переменную стилей после вызова drupal_add_css, например $ переменные ['стили'] = drupal_get_css ();

Pianosaurus 30.11.2010 14:10

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

См. drupal.org/project/asset_injector для Drupal 8+

bryanbraun 03.01.2020 02:02

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