23

在 Drupal 6 中包含特定节点的 CSS 或 Javascript 文件的最佳方法是什么?

我想在我的网站上创建一个运行了一个小 javascript 应用程序的页面,因此 CSS 和 javascript 是特定于该页面的,根本不希望包含在其他页面加载中。

4

6 回答 6

14

我建议不要使用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 允许级联方法:您可以在模块中拥有通用/基本的东西,并在主题中提供增强或特定的功能。

于 2008-09-15T23:21:37.383 回答
5

我使用预处理函数,但这有一些问题。$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();
  }
}

这似乎适用于大多数情况。

PS 几乎不需要创建一个模块来解决主题问题。

干杯。

于 2009-03-10T02:17:53.413 回答
4

这似乎是一个很好的解决方案:

http://drupal.org/project/js_injectorhttp://drupal.org/project/css_injector

当您想将内联代码插入到技术上不是节点的东西中时,它可以工作,因此没有节点 ID 并且没有可用的 PHP 输入选项。就像我用它在几个管理页面中注入小的 jQuery 调整一样。它通过路径而不是节点 ID 工作。

于 2010-06-10T11:40:04.860 回答
3

到目前为止,我想出的最佳解决方案是启用 PHP 输入模式,然后在节点主体开头的 PHP 块中酌情调用drupal_add_cssdrupal_add_js 。

于 2008-09-15T00:00:15.100 回答
2

这应该可以解决问题 - 一个快速模块,它在查看节点时使用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 输入过滤器的安全问题,并且不需要单独的节点模板文件,如果您更新了主节点模板并忘记了您的自定义模板,该文件可能会变得过时。

于 2008-09-15T02:09:30.157 回答
0

您可以为调用 javascript 的该节点 (node-needsjs.tpl.php) 提供自定义模板。这比在节点主体中直接使用 PHP 更简洁,并且使将来对内容的更改更容易。

编辑:我认为我在上面不是很清楚。您想将模板文件命名为 node-(nodeid).tpl.php。所以如果是节点 1,调用文件 node-1.tpl.php

于 2008-09-15T00:07:33.507 回答