Implements hook_advagg_changed_files().

If the color module is enabled regenerate color module css when it changes. If a responsive file inside an adaptive theme has changed, regenerate it.

Sujets associés

Fichier

./advagg.advagg.inc, line 377

Code

function advagg_advagg_changed_files(array $files, array $types) {
    // * @param array $files
    // *   List of files that have changed.
    // * @param array $types
    // *   Array with the css and or the js key.
    if (module_exists('locale')) {
        _advagg_locale_changed_files($files, $types);
    }
    // Keep track of what themes have been done.
    static $themes_done;
    if (!isset($themes_done)) {
        $themes_done = array();
    }
    // Skip if no css changed.
    if (empty($types['css'])) {
        return;
    }
    foreach ($files as $filename => $meta_data) {
        // Only care about css files.
        $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
        if ($ext !== 'css') {
            continue;
        }
        advagg_advagg_scan_for_changes($filename, TRUE);
    }
    // Save error states and clear them.
    $errors_before = drupal_static('form_set_error', array());
    form_clear_error();
    // See if the css file is used the theme.
    $themes = list_themes();
    $changed_files = array_keys($files);
    $submit_ran = FALSE;
    foreach ($themes as $theme_name => $theme_values) {
        $files_in_theme = array();
        foreach ($changed_files as $css_file) {
            // Skip if we already did a form submit for this theme.
            if (!empty($themes_done[$theme_name])) {
                continue;
            }
            // Skip if the file that was changed is not in this themes directory.
            $theme_path = drupal_get_path('theme', $theme_name);
            if (!empty($theme_path) && strpos($css_file, $theme_path) !== 0) {
                continue;
            }
            $files_in_theme[] = $css_file;
        }
        // Skip the theme if none of the changed files live in here.
        if (empty($files_in_theme)) {
            continue;
        }
        // Get the form for this theme.
        $router_item = menu_get_item('admin/appearance/settings/' . $theme_name);
        if ($router_item['include_file']) {
            require_once DRUPAL_ROOT . '/' . $router_item['include_file'];
        }
        $form = drupal_get_form('system_theme_settings', $theme_name);
        // Get the form defaults.
        $defaults = array();
        advagg_get_defaults_from_form($defaults, $form);
        $rebuild = FALSE;
        if (isset($defaults['atcore_version_test'])) {
            // Rebuild if the theme is an adaptive theme.
            $rebuild = TRUE;
        }
        if (!$rebuild && module_exists('color')) {
            foreach ($files_in_theme as $css_file) {
                if (isset($form['color'])) {
                    // Rebuild if the file that was changed is a color module file.
                    foreach ($defaults['info']['css'] as $theme_file) {
                        if ($theme_path . '/' . $theme_file === $css_file) {
                            $rebuild = TRUE;
                            break 2;
                        }
                    }
                }
            }
        }
        // Skip if themes css does not need to be generated dynamically.
        if (empty($rebuild)) {
            continue;
        }
        // Build the palette value.
        $palette = array();
        if (isset($form['color'])) {
            foreach (element_children($form['color']['palette']) as $key) {
                $palette[$key] = $form['color']['palette'][$key]['#value'];
            }
        }
        // Build the form state array.
        $form_state = array(
            'values' => array(
                'palette' => $palette,
            ),
            'build_info' => array(
                'args' => array(
                    0 => $theme_name,
                ),
            ),
        );
        $form_state['values'] += $defaults;
        if (isset($defaults['atcore_version_test'])) {
            // Validate form.
            at_core_settings_validate($form, $form_state);
            $errors = form_set_error();
            if (empty($errors)) {
                // Only submit if no errors.
                at_core_settings_submit($form, $form_state);
                $themes_done[$theme_name] = TRUE;
                $submit_ran = TRUE;
            }
        }
        elseif (isset($form['color'])) {
            // Validate form.
            color_scheme_form_validate($form, $form_state);
            $errors = form_set_error();
            if (empty($errors)) {
                // Only submit if no errors.
                color_scheme_form_submit($form, $form_state);
                $themes_done[$theme_name] = TRUE;
                $submit_ran = TRUE;
            }
        }
        // Reset form errors.
        form_clear_error();
    }
    // Save error states back.
    $form_set_error =& drupal_static('form_set_error', array());
    $form_set_error = $errors_before;
    // Rescan again as the submit will generate new files in the css dir.
    if ($submit_ran) {
        advagg_push_new_changes();
    }
}