CSS / JSファイルは、さまざまな方法でDrupalに追加されます。7つの方法のうち5つを使用すると、ファイルを集約できます。それらがページに追加されると、drupalはそれらのhtmlマークアップをレンダリングし、template_process_html()内でマークアップを作成/使用します。
集約がどのように構築されるかを調べる関数は、drupal_build_js_cache()およびdrupal_build_css_cache()です。これらの関数の内部では、ファイル名のリストを取得し、それらのハッシュを作成します。これはルックアップであり、ファイルがすでに作成されているかどうかを確認します。
$map = variable_get('drupal_js_cache_files', array());
// Create a new array so that only the file names are used to create the hash.
// This prevents new aggregates from being created unnecessarily.
$js_data = array();
foreach ($files as $file) {
$js_data[] = $file['data'];
}
$key = hash('sha256', serialize($js_data));
if (isset($map[$key])) {
$uri = $map[$key];
}
$ file ['data']情報の順序や内容が原因で、以前に作成されていない場合は、すべてのファイルの内容が結合された新しい集合体が作成されます。
if (empty($uri) || !file_exists($uri)) {
// Build aggregate JS file.
foreach ($files as $path => $info) {
if ($info['preprocess']) {
// Append a ';' and a newline after each JS file.
$contents .= file_get_contents($path) . ";\n";
}
}
// Prefix filename to prevent blocking by firewalls which reject files
// starting with "ad*".
$filename = 'js_' . drupal_hash_base64($contents) . '.js';
// Create the js/ within the files folder.
$jspath = 'public://js';
$uri = $jspath . '/' . $filename;
...
$map[$key] = $uri;
variable_set('drupal_js_cache_files', $map);
}
return $uri;
ファイルは2つの変数drupal_js_cache_files
との内部で追跡されますdrupal_css_cache_files
。Drupalはまた、使用前にファイルが存在することを確認します。集計はURLとは関係ありません。変数がデータベースに格納されているため、4つのWebヘッドはこれらの集計を利用します。
注:AdvAggはこれに似ていますが、2つの変数の代わりにいくつかのデータベーステーブルを使用します。AdvAggは、主に並行variable_setの問題を修正し、高度なグループ化ロジックを可能にするいくつかの理由でこれを行います。