Ответ 1
Лучшее решение, к которому я придумал, - включить режим ввода PHP, а затем вызвать drupal_add_css и drupal_add_js соответственно в блоке PHP в начале тела вашего node.
Каков наилучший способ включения файла CSS или Javascript для определенного node в Drupal 6.
Я хочу создать страницу на моем сайте, на которой работает небольшое javascript-приложение, поэтому CSS и javascript относятся к этой странице и не хотят вообще включаться в другие загрузки страницы.
Лучшее решение, к которому я придумал, - включить режим ввода PHP, а затем вызвать drupal_add_css и drupal_add_js соответственно в блоке PHP в начале тела вашего node.
Я бы посоветовал использовать hook_nodeapi
для этого. Добавление CSS и Javascript связано с компоновкой, поэтому hook_nodeapi
не подходит для этого: используйте тему. Таким образом, вы можете переопределить эти файлы, когда собираетесь разрабатывать новую тему. Выполнение этого с помощью подхода nodeapi было бы немного сложнее (вам пришлось бы искать список js/css для файлов, удалять их и заменять их собственными).
В любом случае: вам нужно добавить функцию preprocess node, которая добавит эти файлы для вас. Вы можете сделать это либо в модуле, либо в специальной теме. Для модуля это будет:
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");
}
}
Не забудьте сначала очистить кеш.
Эти функции вызывается до того, как объект node задан. Спецификация js/css позволяет использовать каскадный подход: вы можете иметь общий/основной материал в модуле и предоставлять расширенные или конкретные функции в теме.
Я использую функции препроцесса, но у этого есть некоторые проблемы. $variables['styles']
обычно устанавливается перед вызовом функции node preprocess. Другими словами, 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
Он работает, если вы хотите вставить встроенный код в нечто иное, чем технически node, так что там нет node id и не существует опции ввода PHP. Как я использовал его, чтобы ввести небольшие jQuery твики в пару админ-страниц. Он работает по пути, а не node id.
Это должно сделать трюк - модуль quickie, который использует hook_nodeapi для вставки JS/CSS, когда node рассматривается.
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, который может устареть, если вы обновили основной шаблон node и забыли о своем пользовательском.
У вас может быть собственный шаблон для node (node -needsjs.tpl.php), который вызывает javascript. Это немного чище, чем использование PHP прямо в теле node, и в будущем облегчит внесение изменений в контент.
EDIT: Я не думаю, что я был очень ясен выше. Вы хотите назвать файл шаблона node - (nodeid).tpl.php. Поэтому, если это было node 1, вызовите файл node -1.tpl.php