在Drupal 6中为特定节点包含CSS或Javascript文件

23

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

我想在我的网站上创建一个包含小型JavaScript应用程序的页面,因此CSS和JavaScript只适用于该页面,并且不希望在其他页面中加载。

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放在那里允许采用级联方法:您可以在模块中拥有通用/基本内容并在主题中提供增强或特定功能。


稍作更正:当您在主题中添加CSS时,在drupal_add_css调用之后,您必须更新styles变量,例如$variables ['styles'] = drupal_get_css(); - Pianosaurus

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();
  }
}

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

P.S. 几乎没有必要创建一个模块来解决主题问题。

干杯。


4
这似乎是一个不错的解决方案: http://drupal.org/project/js_injectorhttp://drupal.org/project/css_injector。当你想在除了节点之外的其他地方插入内联代码时,这个模块非常有用,因为没有节点 ID 和 PHP 输入选项可用。比如我用它来将一些小的 jQuery 调整注入到几个管理页面中。它通过路径而不是节点 ID 来工作。

请查看 https://www.drupal.org/project/asset_injector 获取 Drupal 8+ 相关信息。 - bryanbraun

3

到目前为止,我想到的最好的解决方案是启用PHP输入模式,然后在节点正文开头的PHP块中根据需要调用drupal_add_cssdrupal_add_js


我在Drupal 5中一遍又一遍地使用了这种技术。例如,此网站首页上的“俱乐部日历”就是通过这种方式实现的。http://www.chesmontastro.org/ - Mike Heinz
4
这可能是最简单的解决方案,但很快就会变得难以维护,因为在数据库中存储PHP代码非常难以调试,并且几乎不可能进行修订控制。Inferis上面提供的解决方案更加清晰简洁。 - jhedstrom

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输入过滤器时出现的安全问题,并且不需要单独的节点模板文件。如果您更新了主节点模板但忘记了自定义模板,则可能会过时。请注意保留HTML标签。

0

你可以为该节点(node-needsjs.tpl.php)设置自定义模板,调用JavaScript。这比直接在节点正文中使用PHP更加清晰,并且使未来对内容的更改更加容易。

编辑:我认为我上面表述得不够清楚。你需要将模板文件命名为node-(nodeid).tpl.php。所以如果它是Node 1,则将文件命名为node-1.tpl.php。


我真的应该更好地考虑这个答案——使用自定义模板文件的另一个好处是可以通过template.php中的template_preprocess_page函数强制其他节点使用该模板。 - MattBelanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接