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();
}
}
这似乎适用于大多数情况。
P.S. 几乎没有必要创建一个模块来解决主题问题。
干杯。
到目前为止,我想到的最好的解决方案是启用PHP输入模式,然后在节点正文开头的PHP块中根据需要调用drupal_add_css和drupal_add_js。
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');
}
}
你可以为该节点(node-needsjs.tpl.php)设置自定义模板,调用JavaScript。这比直接在节点正文中使用PHP更加清晰,并且使未来对内容的更改更加容易。
编辑:我认为我上面表述得不够清楚。你需要将模板文件命名为node-(nodeid).tpl.php。所以如果它是Node 1,则将文件命名为node-1.tpl.php。