在Drupal 6中包含特定节点的CSS或者Javascript文件
在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起作用。