Drupal 6 и 7 сбрасывают JavaScript из заголовка - PullRequest
2 голосов
/ 04 февраля 2011

РЕДАКТИРОВАТЬ: Мой вопрос относится к Drupal 6 и 7, хотя мой пример кода Drupal 6. Люди предоставили ответы полезны для обеих версий Drupal.

В настоящее время я работаю в Drupal над созданием мобильной темы для веб-сайта Drupal 6 и пытаюсь удалить все ненужные ядра и модули JavaScript и css через функцию preprocess_page в моем файле template.php. Файлы 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>

Ответы [ 4 ]

2 голосов
/ 06 декабря 2013

Вы можете напрямую использовать заголовок drupal в drupal 7. Вы можете очистить другой модуль 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);
  }
}
2 голосов
/ 19 февраля 2012

Я нашел потенциально лучшее решение для такого рода проблем.Я попробовал подход Керри, так как Мэтт 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']);
  }
}
1 голос
/ 04 февраля 2011

Модуль Ajax использует hook_preprocess_page для добавления своих скриптов. Модуль Ajax может выполнять свою реализацию ловушки после вашего модуля. Если это так, вы можете настроить вес вашего модуля , чтобы стрелять после Ajax. Вы можете проверить сначала, чтобы удостовериться, выводя содержимое $ scripts (используя что-то вроде модуля Devel 's dpm () ), непосредственно перед тем, как выполнить сброс.

ОБНОВЛЕНИЕ : Поскольку вы вносите изменения в функцию предварительной обработки шаблона, моя первоначальная гипотеза о том, что это проблема весов модулей, не будет применима. Я добавил вашу шаблонную функцию на тестовый сайт, и он удалил эти два сценария для меня. Мне пришлось изменить путь, потому что мой ajax-модуль находился в / sites / all / modules / contrib. Именно здесь я храню свои модули contrib, но вы можете дважды проверить, что используете правильный путь.

Еще одна вещь, которая меня оттолкнула на несколько минут, это то, что я случайно добавил код в неправильную тему; так что это еще одна вещь, чтобы проверить. Также убедитесь, что на странице «Производительность» отключено кэширование Javascript.

0 голосов
/ 05 февраля 2011

Вы должны сделать это наоборот.Удаление файлов из других модулей contrib явно связывает ваш модуль со всеми модулями, которые выводят js в заголовок.Вы не сможете поддерживать это слишком долго, пока оно не сломалось.Что происходит, когда дополнительные модули js добавляются модулями contrib?

Лучше всего создать маску путей, которые вы хотите вывести, и сбросить все, кроме этих.

В Drupal 7 есть некоторые хуки,позволю тебе сделать это, но я не могу вспомнить их.Если вы находитесь на D6, вы немного застряли.

Я написал грязный обходной путь для Drupal 6 для этой же проблемы с файлами 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 есть лучший способ, но здесь нет ловушек, поэтому, вероятно, нет.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...