Уменьшение количества css и javascript файлов при агрегации в Drupal 7

В друпал 7 при включении агрегации для css и javascript файлов образуется сразу по несколько css и javascript файлов. Это происходит потому, что файлы разделяются на группы. Css файлы имеют три группы : CSS_SYSTEM, CSS_DEFAULT и CSS_THEME. Javascript файлы также делятся на три группы : JS_LIBRARY, JS_DEFAULT и JS_THEME. Это нужно для того, чтобы вначале подключались все системные файлы, потом все файлы модулей и затем файлы, подключаемые в теме.

Но при необходимости конечно же можно объединить все группы в одну и уменьшить количество подключаемых файлов. Сделать это можно используя hook_css_alter() и hook_js_alter().

И при объединении нужно не забывать про правильную сортировку файлов, т.е. чтобы все файлы как и в группах подключались по порядку: системные файлы, файлы модулей и файлы тем. Также не стоит исключать непредвиденных последствий, вызванных этим объединением.

Объединяем css файлы, имплементируя hook_css_alter() в модуле или в template.php файле темы:


/**
 * Implements hook_css_alter().
 */
function MYMODULE_css_alter(&$css) {
  // Сортируем файлы функцией drupal_sort_css_js().
  uasort($css, 'drupal_sort_css_js');
  $i = 0;
  foreach ($css as $name => $style) {
    $css[$name]['weight'] = $i++;
    // Все файлы помещаем в группу CSS_DEFAULT
    $css[$name]['group'] = CSS_DEFAULT;
    $css[$name]['every_page'] = FALSE;
  }
}

Объединяем javascript файлы, имплементируя hook_js_alter() в модуле или в template.php файле темы:


/**
 * Implements hook_js_alter().
 */
function MYMODULE_js_alter(&$javascript) {
  // Сортируем файлы функцией drupal_sort_css_js().
  uasort($javascript, 'drupal_sort_css_js');
  $i = 0;
  foreach ($javascript as $name => $script) {
    $javascript[$name]['weight'] = $i++;
    // Все файлы помещаем в группу JS_DEFAULT
    $javascript[$name]['group'] = JS_DEFAULT;
    $javascript[$name]['every_page'] = FALSE;
  }
}

Подобный функционал в числе прочего реализует и контрибный модуль AdvAgg.