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

Eva*_*van 23 preprocessor drupal

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

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

Inf*_*ris 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");
  }
}
Run Code Online (Sandbox Code Playgroud)

或主题:

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

首先,不要忘记清除缓存.

在节点为主题之前调用这些函数.指定js/css允许采用级联方法:您可以在模块中使用通用/基本内容,并在主题中提供增强或特定功能.


小智 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

干杯.


Eva*_*van 3

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

  • 这可能是最简单的解决方案,但很快就会变得难以维护,因为将 PHP 代码存储在数据库中很难调试,并且版本控制几乎不可能。Inferis 的上述解决方案是一种更简洁的方法。 (4认同)