在 Drupal 6 中包含特定节点的 CSS 或 Javascript 文件的最佳方法是什么?
我想在我的网站上创建一个运行了一个小 javascript 应用程序的页面,因此 CSS 和 javascript 是特定于该页面的,根本不希望包含在其他页面加载中。
在 Drupal 6 中包含特定节点的 CSS 或 Javascript 文件的最佳方法是什么?
我想在我的网站上创建一个运行了一个小 javascript 应用程序的页面,因此 CSS 和 javascript 是特定于该页面的,根本不希望包含在其他页面加载中。
我建议不要使用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();
}
}
这似乎适用于大多数情况。
PS 几乎不需要创建一个模块来解决主题问题。
干杯。
这似乎是一个很好的解决方案:
http://drupal.org/project/js_injector 和 http://drupal.org/project/css_injector
当您想将内联代码插入到技术上不是节点的东西中时,它可以工作,因此没有节点 ID 并且没有可用的 PHP 输入选项。就像我用它在几个管理页面中注入小的 jQuery 调整一样。它通过路径而不是节点 ID 工作。
到目前为止,我想出的最佳解决方案是启用 PHP 输入模式,然后在节点主体开头的 PHP 块中酌情调用drupal_add_css和drupal_add_js 。
这应该可以解决问题 - 一个快速模块,它在查看节点时使用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 输入过滤器的安全问题,并且不需要单独的节点模板文件,如果您更新了主节点模板并忘记了您的自定义模板,该文件可能会变得过时。
您可以为调用 javascript 的该节点 (node-needsjs.tpl.php) 提供自定义模板。这比在节点主体中直接使用 PHP 更简洁,并且使将来对内容的更改更容易。
编辑:我认为我在上面不是很清楚。您想将模板文件命名为 node-(nodeid).tpl.php。所以如果是节点 1,调用文件 node-1.tpl.php