【问题标题】:Drupal 6 & 7 unset Javascript from headerDrupal 6 & 7 从标头中取消设置 Javascript
【发布时间】:2011-02-04 20:10:53
【问题描述】:

编辑:我的问题适用于 Drupal 6 和 7,尽管我的代码示例是 Drupal 6。人们提供的答案对 Drupal 的两个版本都很有用。

我目前正在 Drupal 工作,为 Drupal 6 网站创建移动主题,并尝试通过我的 template.php 文件中的 preprocess_page 函数删除所有不必要的核心和模块 JavaScript 和 css。 css 文件已成功删除,但我似乎无法删除 JavaScript。这就是我所拥有的。在此示例中,除 ajax 脚本外,所有内容均已成功删除。

知道我做错了什么吗?

<?php
function mytheme_preprocess_page(&$vars) {
    //////// remove unneccesary drupal head files for mobile version
    // CSS
    $css = drupal_add_css();
       // core
    unset($css['all']['module']['modules/user/user.css']);
    unset($css['all']['module']['modules/node/node.css']);
    unset($css['all']['module']['modules/system/defaults.css']);
    unset($css['all']['module']['modules/system/system.css']);
    unset($css['all']['module']['modules/system/system-menus.css']);
       // contributed -- automatically generate the path—— just easier this way
    $rm[] = drupal_get_path('module','filefield').'/filefield.css';
    $rm[] = drupal_get_path('module','flickr').'/flickr.css';
    $rm[] = drupal_get_path('module','logintoboggan').'/logintoboggan.css';
    $rm[] = drupal_get_path('module','logintoboggan').'/logintoboggan.css';
    $rm[] = drupal_get_path('module','fieldgroup').'/fieldgroup.css';
    $rm[] = drupal_get_path('module','views').'/css/views.css';
    $rm[] = drupal_get_path('module','content').'/theme/content-module.css';
       // remove the contribs from the array
    foreach ($rm as $key => $value) {
      unset($css['all']['module'][$value]);
    }
    // JAVASCRIPT
    $scripts = drupal_add_js();

    unset($scripts['module']['sites/all/modules/ajax/ajax.js']);
    unset($scripts['module']['sites/all/modules/ajax/jquery/jquery.a_form.packed.js']);

    // recreate the tempalate variables
    $vars['styles'] = drupal_get_css($css);
    $vars['scripts'] = drupal_get_js('header', $scripts);
}
?>

ETA:这是脚本在标题中打印出来的方式:

<script type="text/javascript" src="/sites/all/modules/ajax/jquery/jquery.a_form.packed.js?P"></script>
<script type="text/javascript" src="/sites/all/modules/ajax/ajax.js?P"></script>

【问题讨论】:

    标签: drupal


    【解决方案1】:

    我为这类问题找到了一个可能更好的解决方案。我尝试了 Kerri 的方法,因为 Matt V 说它对他有用,但我真的不想编辑 template.php,如果我可以避免它并且不管它在我的环境中不起作用。我的问题是几个 JS 文件在一个特定页面上抛出错误。我所做的只是编写一个非常简单的新模块,它只在所需的页面上运行。所以-我创建了一个基本的 .info 文件,下面是 .module 代码。对我来说就像一个魅力。只需将“mysite_mymodule”替换为您为模块命名的任何内容,然后将“my-page-alias”替换为您尝试使用的任何页面别名。

    <?php
    /**
    * Implements hook_js_alter().
    */
    
    function mysite_mymodule_js_alter(&$javascript) {
      $alias = drupal_get_path_alias($_GET['q']);
      if ($alias == "my-page-alias") {
        /**
         * documentation about what I did and why I did it...
         */
        unset($javascript['sites/all/modules/dhtml_menu/dhtml_menu.js']);
        unset($javascript['sites/all/modules/apachesolr_autocomplete/apachesolr_autocomplete.js']);
      }
    }
    

    【讨论】:

      【解决方案2】:

      你可以直接在drupal 7中使用drupal header。 您可以清理不需要的其他模块 javascript

      function module_preprocess_page(&$vars) {
        // clean unnecesary script from the page
        if (arg(0) != 'admin' || !(arg(1) == 'add' && arg(2) == 'edit') || arg(0) != 'panels' || arg(0) != 'ctools') {
          $javascript = &drupal_static('drupal_add_js', array());
          unset($javascript['misc/jquery.js']);
          unset($javascript['misc/jquery.once.js']);
          drupal_static('drupal_add_js', $javascript);
        }
      }
      

      【讨论】:

      • 这是一篇非常古老的帖子,但我已经有一段时间没来这里了。我已经将原始问题编辑得更具体,因为这个问题是针对 Drupal 6 的。
      • 嗨@Kerri - 同意您提供的代码示例是Drupal 6;但是,由于已经为 Drupal 6 和 7 提供了有用的答案,并且由于这些答案在其他地方很难找到,如果我建议对您的评论进行编辑,而不会让 Drupal 7 寻求答案的人离开呢?
      • 对于查看此问题和答案的其他人,请注意在drupal.stackexchange.com/questions/39305 上有一个特定于 Drupal 7 的答案
      【解决方案3】:

      Ajax 模块uses hook_preprocess_page 添加其脚本。 Ajax 模块可能在您的模块之后执行其钩子实现。如果是这种情况,您可以adjust the weight of your module,在 Ajax 之后开火。您可以在执行取消设置之前先通过输出 $scripts 的内容(使用类似于Devel moduledpm() 函数)来检查以确保。

      更新:由于您在模板预处理函数中进行更改,我最初关于它是模块权重问题的假设不适用。我在测试站点上添加了您的模板功能,它为我删除了这两个脚本。我不得不调整路径,因为我的 ajax 模块位于 /sites/all/modules/contrib 下。这正是我碰巧保留我的 contrib 模块的地方,但您可能会仔细检查您使用的路径是否正确。

      另一件让我犹豫了几分钟的事情是,我不小心将代码添加到了错误的主题中;所以,这是另一件事要检查。此外,请检查性能页面上是否禁用了 Javascript 缓存。

      【讨论】:

      • 谢谢;这很有帮助。即使在 Devel 的帮助下,我仍然对钩子和输出方式有点傻。我实际上是在 template.php 文件中做的,而不是在模块中,我希望保持这种方式,特别是因为它只特定于两个使用的主题之一。可以这样定义重量吗?另外,有没有办法可以拦截实际的 ajax_preprocess_page() 函数?我尝试使用 mytheme_ajax_preprocess_page(),但没有奏效。就像我说的,此时处理和钩子是假的。
      • @Kerri 抱歉,我没有注意到您使用的是 tempalte_preprocess_page 并假设您使用的是 hook_preprocess 页面。有关更多信息,请参阅上面的更新答案。
      • 哦,谢谢。至少这意味着我有点知道我在做什么! ;) 我在原始帖子中添加了脚本的路径。我已经检查并仔细检查了路径(甚至可以肯定地复制/粘贴),但也许我遗漏了一些东西。我知道我将函数放在正确的模板中,因为它的一半(css 一半)有效。哦,是的,所有性能缓存都关闭了,我也一直在疯狂地刷新浏览器缓存以防万一。
      • @Kerri 完全取消设置 $scripts 怎么样,看看是否有什么不同?或者在取消设置后尝试转储 $scripts(通过 dpm 或 Drupal 获取 Firebug 的 firep 功能),以再次检查 unset 是否有效?
      【解决方案4】:

      你必须反过来做。取消设置其他 contrib 模块的文件将您的模块显式耦合到将 js 输出到标头的每个其他模块。在它破裂之前,您将无法维持太久。当更多的 js 文件被 contrib 模块添加时会发生什么?

      您最好创建一个您想要输出的路径掩码,并取消设置除这些之外的所有内容。

      Drupal 7 有一些钩子可以让你这样做,但我不记得它们了。如果你在 D6 上,你就有点卡住了。

      我确实为 Drupal 6 写了一个 dirty 解决方法,以解决与 css 文件相同的问题。这是整个模块(它只有 3 个功能)。我相信你也可以把它改编成js文件。

      创建您的掩码(将其公开给变量表)

      function destroy_mask_styles() {
        return variable_get('destroy_mask_styles', array('all/modules/mymodule', 'themes/mytheme'));
      }
      

      接下来是狡猾的部分。该函数在头文件中查找css文件的路径,如果不匹配则取消设置。

      function destroy_styles($var_styles) {
        //this is a bit dodgey. But it's probably the easiest way to implement 
        $masks = destroy_mask_styles();
        $styles = array();
        foreach(explode("\n", $var_styles) as $style) {
          foreach($masks as $mask) {
            if(strpos($style, $mask) > 0) {
              $styles[] = $style;
            }
          }
        }
        return implode("\n", $styles);
      }
      

      然后在preprocess_page中,(这可能被认为是狡猾的地方)

      function destroy_preprocess_page(&$variables) {
        //destroy some css and scripts we don't want
        $styles = destroy_styles($variables['styles']);
        $variables['styles'] = empty($styles) ? $variables['styles'] : $styles;
      }
      

      如果您想包含一个模块中的所有内容(例如),只需更改匹配的路径以包含模块根文件夹的路径。不用担心文件名。

      请记住,这不是执行此操作的理想方式。在 D6 中可能有更好的方法,但这里没有钩子所以可能没有。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 2011-06-22
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        相关资源
        最近更新 更多