Drupal 6和7从标头取消设置Javascript

Drupal 6和7从标头取消设置Javascript,drupal,Drupal,编辑:我的问题适用于Drupal6和7,尽管我的代码示例是Drupal6。人们提供的答案对两个版本的Drupal都有用 我目前正在Drupal中为Drupal 6网站创建一个移动主题,并试图通过template.php文件中的preprocess_page函数删除所有不必要的核心和模块JavaScript和css。css文件已成功删除,但我似乎无法删除JavaScript。这是我得到的。在本例中,除了ajax脚本之外,所有内容都被成功删除 知道我做错了什么吗 <?php function

编辑:我的问题适用于Drupal6和7,尽管我的代码示例是Drupal6。人们提供的答案对两个版本的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>
Ajax模块可以添加其脚本。Ajax模块可能在您的模块之后执行其钩子实现。如果是这样的话,你可以在Ajax之后开火。您可以先检查以确保,在执行取消设置之前,使用类似于的函数输出$scripts的内容

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


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

您必须以另一种方式执行此操作。取消设置其他contrib模块的文件会将您的模块显式地耦合到将js输出到标头的每个其他模块。在它破裂之前,你无法将其维持太久。当contrib模块添加更多js文件时会发生什么

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

Drupal7有一些钩子可以让你这么做,但我记不起来了。如果你在D6上,你就有点卡住了

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

创建掩码并将其暴露到变量表中

然后是闪避部分。此函数用于查找头中css文件的路径,如果它们不匹配,则将其取消设置

然后在preprocess_页面中,这可能是危险发生的地方

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中可能有更好的方法,但这里没有挂钩,所以可能没有

祝你好运

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

<?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']);
  }
}

您可以直接在Drupal7中使用drupal头。 您可以清理不需要的其他模块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);
  }
}

谢谢这很有帮助。即使在Devel的帮助下,我仍然对钩子和输出方式有点无知。实际上,我是在template.php文件中完成的,而不是在模块中,我希望保持这种方式,特别是因为它只针对两个使用过的主题中的一个。可以这样定义重量吗?还有,有没有一种方法可以截取实际的ajax_preprocess_页面函数?我尝试使用mytheme\u ajax\u预处理页面,但没有成功。就像我说的,在处理和钩子的这一点上是虚拟的。@Kerri抱歉,我没有注意到您使用的是tempalte_预处理页面,并假设您使用的是钩子_预处理页面。更多信息请参见上面的更新答案。哦,谢谢。至少这意味着我知道我在做什么;我将脚本的路径添加到我的原始帖子中。我已经检查并再次检查了路径,甚至复制/粘贴了路径以确保,但可能我遗漏了一些东西。我知道我把函数放在了正确的模板中,因为它的一半是css的一半。哦,是的,所有的性能缓存都关闭了,我一直在痴迷地刷新浏览器缓存,以防万一。@Kerri把$scripts全部取消怎么样,看看这是否会让
有区别吗?或者,在取消设置Firebug的firep函数后,尝试通过dpm或Drupal为其转储$scripts,以再次检查取消设置是否有效?这是一篇非常古老的帖子,但我已经有一段时间没在这里了。我对原始问题进行了更具体的编辑,因为本期是针对Drupal 6的。Hi@Kerri-同意您提供的代码示例是Drupal 6;但是,由于已经为Drupal 6和7提供了有用的答案,而且这些答案在其他地方很难找到,那么我是否建议对您的评论进行编辑,以避免Drupal 7的答案寻求者离开呢?对于查看此问题和答案的其他人,请注意,在
<?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']);
  }
}
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);
  }
}