代码之家  ›  专栏  ›  技术社区  ›  Evan

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

  •  23
  • Evan  · 技术社区  · 16 年前

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

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

    6 回复  |  直到 15 年前
        1
  •  14
  •   Inferis    16 年前

    我建议不要使用 hook_nodeapi 为此。添加CSS和Javascript与布局相关,因此 不是它的地方:使用主题。这边,你

    无论如何:您需要做的是添加一个节点预处理函数,为您添加这些文件。您可以在模块或自定义主题中执行此操作。对于模块,这将是:

    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允许采用级联方法:您可以在模块中使用通用/基本的内容,并在主题中提供增强的或特定的功能。

        2
  •  5
  •   canen    16 年前

    我使用预处理函数,但这有一些问题。 $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();
      }
    }
    

    另外,几乎不需要创建模块来解决主题问题。

        3
  •  4
  •   ninusik    15 年前
        4
  •  3
  •   Evan    16 年前

    到目前为止,我提出的最佳解决方案是启用PHP输入模式,然后调用 drupal_add_css drupal_add_js 在节点主体开始处的PHP块中。

        5
  •  2
  •   ceejayoz    16 年前

    这应该可以做到——一个使用 hook_nodeapi

    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输入过滤器时的安全问题,并且不需要单独的节点模板文件,如果更新了主节点模板而忘记了自定义模板,则该文件可能会过时。

        6
  •  0
  •   MattBelanger    16 年前

    您可以为该节点(node needsjs.tpl.php)创建一个自定义模板,该模板调用javascript。这比直接在节点体中使用PHP要干净一些,并且使将来对内容的更改更容易。

    编辑: