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

时间:2020-03-05 18:53:07  来源:igfitidea点击:

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

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

解决方案

回答

到目前为止,我想出的最好的解决方案是启用PHP输入模式,然后在节点正文的开始的PHP块中适当地调用drupal_add_css和drupal_add_js。

回答

我们可以为调用javascript的节点创建一个自定义模板(node-needsjs.tpl.php)。与在节点主体中直接使用PHP相比,这稍微干净了一点,并且使将来对内容的更改更加容易。

编辑:我不认为我在上面很清楚。我们要命名模板文件node-(nodeid).tpl.php。因此,如果它是节点1,则调用文件node-1.tpl.php

回答

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

回答

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

回答

我使用预处理功能,但这有一些问题。 $ 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.几乎不需要创建模块来解决主题问题。

干杯。

回答

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

http://drupal.org/project/js_injector

http://drupal.org/project/css_injector

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