Лучшее решение, которое я предложил до сих пор, состоит в том, чтобы включить режим ввода PHP, и затем звонить drupal_add_css и drupal_add_js как соответствующий в блоке PHP в запуске тела Вашего узла.
Я отговорил бы от использования hook_nodeapi
для этого. Добавление CSS и JavaScript связано с расположением, таким образом hook_nodeapi
не место для него: используйте themeing. Таким образом, Вы можете переопределение те файлы, когда Вы собираетесь разработать новую тему. Выполнение этого с подходом 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");
}
}
не забывают очищать кэш, сначала.
Эти функции вызваны, прежде чем узел тематический. Specifing 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. Существует едва, любой когда-либо должен создавать модуль для решения theming проблемы.
Аплодисменты.
Это должно добиться цели - беглый модуль, который использует 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 и не требует отдельного шаблонного файла узла, который мог стать устаревшим, если бы Вы обновили основной шаблон узла и забыли о Вашем пользовательском.
У Вас может быть пользовательский шаблон для того узла (узел-needsjs.tpl.php), который называет JavaScript. Это немного более чисто, чем использование PHP прямо в теле узла и вносит изменения для удовлетворения легче в будущем.
РЕДАКТИРОВАНИЕ: я не думаю, что был очень ясен выше. Вы хотите назвать шаблонный узел файла - (идентификатор узла) .tpl.php. Таким образом, если это был Узел 1, назовите узел-1.tpl.php файла
Это кажется хорошим решением:
http://drupal.org/project/js_injector а также http://drupal.org/project/css_injector
Это работает, когда вы хотите вставить встроенный код в нечто иное, чем технически узел, поэтому нет идентификатора узла и недоступны параметры ввода PHP. Как будто я использовал его для внедрения небольших настроек jQuery на пару страниц администрирования. Он работает по пути, а не по идентификатору узла.