Aggregate CSS/JS files, putting them in the files directory.

Paramètres

$type: js or css

$files: An array of JS files to aggregate and compress into one file.

$query_string: (optional) Query string to add on to the file if bundle isn't ready.

$counter: (optional) Counter value.

$force: (optional) Rebuild even if file already exists.

$md5: (optional) Bundle's machine name.

Return value

array with the filepath as the key and prefix and suffix in another array.

Voir aussi

drupal_build_js_cache()

drupal_build_css_cache()

3 calls to advagg_css_js_file_builder()
advagg_process_css dans includes/css.inc
Returns a themed representation of all stylesheets that should be attached to the page.
advagg_process_js dans ./advagg.module
Returns a themed presentation of all JavaScript code for the current page.
advagg_rebuild_bundle dans ./advagg.module
Rebuild a bundle.

Fichier

./advagg.module, line 2155

Code

function advagg_css_js_file_builder($type, $files, $query_string = '', $counter = FALSE, $force = FALSE, $md5 = '') {
    global $_advagg, $base_path;
    $data = '';
    // Try cache first. When ever the counter changes this cache gets reset.
    $schema = advagg_get_server_schema();
    $cached_data_key = 'advagg_file_builder_' . md5($schema . implode('', array_filter(array_unique($files))));
    if (!$force) {
        // Try cache first; cache table is cache_advagg_bundle_reuse.
        $cached_data = advagg_cached_bundle_get($cached_data_key, 'file_builder_cache_object');
        if (!empty($cached_data)) {
            foreach ($cached_data as $filepath => $values) {
                // Ping cache.
                advagg_bundle_built($filepath);
            }
            return $cached_data;
        }
    }
    list($css_path, $js_path) = advagg_get_root_files_dir();
    if ($type == 'js') {
        $file_type_path = $js_path[0];
    }
    if ($type == 'css') {
        $file_type_path = $css_path[0];
    }
    // Send $files, get filename back
    $filenames = advagg_get_filename($files, $type, $counter, $md5);
    if (empty($filenames)) {
        return FALSE;
    }
    // Debugging.
    if (variable_get('advagg_debug', ADVAGG_DEBUG)) {
        $_advagg['debug']['file_builder_get_filenames'][] = array(
            'key' => $cached_data_key,
            'filenames' => $filenames,
        );
    }
    $output = array();
    $locks = array();
    $cacheable = TRUE;
    $files_used = array();
    foreach ($filenames as $info) {
        $filename = $info['filename'];
        $files = $info['files'];
        $bundle_md5 = $info['bundle_md5'];
        $prefix = '';
        $suffix = '';
        $filepath = $file_type_path . '/' . $filename;
        // Invoke hook_advagg_js_extra_alter() or hook_advagg_css_extra_alter to
        // give installed modules a chance to modify the prefix or suffix for a
        // given filename.
        $values = array(
            $filename,
            $bundle_md5,
            $prefix,
            $suffix,
        );
        drupal_alter('advagg_' . $type . '_extra', $values);
        list($filename, $bundle_md5, $prefix, $suffix) = $values;
        // Check that the file exists & filesize is not zero
        $built = advagg_bundle_built($filepath);
        if (!$built || $force) {
            // Generate on request?
            if (variable_get('advagg_async_generation', ADVAGG_ASYNC_GENERATION) && !$force && empty($_GET['generator'])) {
                // Build request.
                $redirect_counter = isset($_GET['redirect_counter']) ? intval($_GET['redirect_counter']) : 0;
                $url = _advagg_build_url($filepath . '?generator=1&redirect_counter=' . $redirect_counter);
                $headers = array(
                    'Host' => $_SERVER['HTTP_HOST'],
                    'Connection' => 'close',
                );
                // Request file.
                if (function_exists('stream_socket_client') && function_exists('stream_select')) {
                    advagg_async_connect_http_request($url, array(
                        'headers' => $headers,
                    ));
                }
                else {
                    // Set timeout.
                    $socket_timeout = ini_set('default_socket_timeout', variable_get('advagg_socket_timeout', ADVAGG_SOCKET_TIMEOUT));
                    drupal_http_request($url, array(
                        'headers' => $headers,
                    ));
                    ini_set('default_socket_timeout', $socket_timeout);
                }
                // Return filepath if we are going to wait for the bundle to be
                // generated or if the bundle already exists.
                if (variable_get('advagg_aggregate_mode', ADVAGG_AGGREGATE_MODE) < 2 || advagg_bundle_built($filepath)) {
                    $output[$filepath] = array(
                        'prefix' => $prefix,
                        'suffix' => $suffix,
                        'files' => array_map('advagg_return_true', array_flip($files)),
                    );
                }
                else {
                    // Aggregate isn't built yet, send back the files that where going to
                    // be in it.
                    foreach ($files as $file) {
                        $output[$file . $query_string] = array(
                            'prefix' => '',
                            'suffix' => '',
                            'files' => array(
                                $file . $query_string => TRUE,
                            ),
                        );
                    }
                    $cacheable = FALSE;
                    advagg_disable_page_cache();
                }
                continue;
            }
            // Only generate once.
            $lock_name = 'advagg_' . $filename;
            if (!lock_acquire($lock_name)) {
                if (variable_get('advagg_aggregate_mode', ADVAGG_AGGREGATE_MODE) == 0) {
                    $locks[] = array(
                        $lock_name => $filepath,
                    );
                    $output[$filepath] = array(
                        'prefix' => $prefix,
                        'suffix' => $suffix,
                        'files' => array_map('advagg_return_true', array_flip($files)),
                    );
                }
                else {
                    // Aggregate isn't built yet, send back the files that where going
                    // to be in it.
                    foreach ($files as $file) {
                        $output[$file . $query_string] = array(
                            'prefix' => '',
                            'suffix' => '',
                            'files' => array(
                                $file . $query_string => TRUE,
                            ),
                        );
                    }
                    $cacheable = FALSE;
                    advagg_disable_page_cache();
                }
                continue;
            }
            if ($type == 'css') {
                $data = advagg_build_css_bundle($files);
            }
            elseif ($type == 'js') {
                $data = advagg_build_js_bundle($files);
            }
            // Invoke hook_advagg_js_alter() or hook_advagg_css_alter to give
            // installed modules a chance to modify the data in the bundle if
            // necessary.
            drupal_alter('advagg_' . $type, $data, $files, $bundle_md5);
            $files_used = array_merge($files_used, $files);
            // If data is empty then do not include this bundle in the final output.
            if (empty($data) && !$force) {
                lock_release($lock_name);
                continue;
            }
            // Create the advagg_$type/ within the files folder.
            file_prepare_directory($file_type_path, FILE_CREATE_DIRECTORY);
            // Write file. default function called: advagg_file_saver
            $function = variable_get('advagg_file_save_function', ADVAGG_FILE_SAVE_FUNCTION);
            $good = $function($data, $filepath, $force, $type);
            // Release lock.
            lock_release($lock_name);
            // If file save was not good then downgrade to non aggregated mode.
            if (!$good) {
                $output[$filepath] = FALSE;
                $cacheable = FALSE;
                continue;
            }
        }
        else {
            $files_used = array_merge($files_used, $files);
        }
        $output[$filepath] = array(
            'prefix' => $prefix,
            'suffix' => $suffix,
            'files' => array_map('advagg_return_true', array_flip($files)),
        );
    }
    // Wait for all locks before returning.
    if (!empty($locks)) {
        foreach ($locks as $lock_name => $filepath) {
            lock_wait($lock_name);
            if (!advagg_bundle_built($filepath)) {
                $output[$filepath] = FALSE;
            }
        }
    }
    if (empty($output)) {
        $output[] = FALSE;
        return $output;
    }
    // Cache the output
    if (!$force && $cacheable) {
        $new_cached_data_key = 'advagg_file_builder_' . md5($schema . implode('', array_filter(array_unique($files_used))));
        // Verify the files in equals the files out.
        if ($new_cached_data_key == $cached_data_key) {
            cache_set($cached_data_key, $output, 'cache_advagg_bundle_reuse', CACHE_TEMPORARY);
        }
    }
    return $output;
}