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



Лучшее решение, которое я придумал до сих пор, - включить режим ввода PHP, а затем вызвать drupal_add_css и drupal_add_js, если это необходимо, в блоке PHP в начале тела вашего узла.
Это может быть самое простое решение, но быстро становится невозможным для обслуживания, поскольку сохранение кода PHP в базе данных очень сложно отлаживать, а контроль версий практически невозможен. Вышеупомянутое решение Inferis - гораздо более чистый подход.
У вас может быть собственный шаблон для этого узла (node-needsjs.tpl.php), который вызывает javascript. Это немного чище, чем использование PHP прямо в теле узла, и упрощает внесение изменений в контент в будущем.
Обновлено: Не думаю, что я был очень ясен выше. Вы хотите назвать файл шаблона node- (nodeid) .tpl.php. Итак, если это был Узел 1, назовите файл node-1.tpl.php
Мне действительно следовало подумать над этим ответом лучше - еще одним преимуществом использования пользовательского файла шаблона является возможность заставить другие узлы использовать шаблон с помощью функции template_preprocess_page в template.php.
Это должно помочь - быстрый модуль, который использует 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 ();
Я использую функции предварительной обработки, но здесь есть некоторые проблемы. $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+
Я использовал эту технику снова и снова в Drupal 5. Например, «Клубный календарь» на главной странице этого сайта был реализован таким образом. chesmontastro.org