You are here

function jqp_rebuild_cache in jQuery Plugin Handler (JQP) 6.2

Rebuilds the javascript libraries cache.

It registers both all libraries defined in library info files, as well as libraries defined in hook_jqp.

Parameters

$reset: If true, all javascript libraries are completely reindexed. Otherwise only libraries which havent been costumized by administrators are reindexed.

2 calls to jqp_rebuild_cache()
jqp_confirm_form_submit in ./jqp.admin.inc
Submit handler for jqp_confirm_form().
jqp_status_page in ./jqp.admin.inc
Page callback for admin/build/jqp.

File

./jqp.module, line 373
Used to register and load javascript libraries and plugins from a cetral point

Code

function jqp_rebuild_cache($reset = FALSE) {
  cache_clear_all('jqp', 'cache');

  // Set defaults for library info
  $defaults = array(
    'description' => '',
    'version' => NULL,
  );

  // The following code is merely copied from drupal_system_listing.
  // Added the file_directory to be a possible location for the library directory.
  $profile = variable_get('install_profile', 'default');
  $directory = 'js_libraries';
  $config = conf_path();
  $file_dir = file_directory_path();
  $js_libraries = array();
  $searchdir = array(
    "{$directory}",
    "sites/all/{$directory}",
    "profiles/{$profile}/{$directory}",
    "{$config}/{$directory}",
    "{$file_dir}/{$directory}",
  );

  // Get current list of libraries registerd by dot-info files
  foreach ($searchdir as $dir) {
    if (file_exists($dir)) {
      $js_libraries = array_merge($js_libraries, file_scan_directory($dir, '\\.info$', array(
        '.',
        '..',
        'CVS',
      ), 0, TRUE, 'name', 0));
    }
  }

  // Get all libraries registerd by modules
  $module_libraries = module_invoke_all('jqp');
  if (is_array($module_libraries)) {
    foreach ($module_libraries as $module_library_name => $module_library) {
      $js_libraries[$module_library_name] = (object) ($module_library + array(
        'type' => 'javascript library',
      ));
    }
  }

  // Extract current files from database.
  system_get_files_database($js_libraries, 'javascript library');
  ksort($js_libraries);
  foreach ($js_libraries as $name => $library) {
    $versions_changed = array();

    // Look for the info file.
    $library->info = drupal_parse_info_file(dirname($library->filename) . '/' . $library->name . '.info');

    // If the library doesn't provide info, we're dealing with an module registered library.
    // We'll create the info manually.
    if (empty($library->info)) {
      $info = clone $library;
      unset($info->type, $info->info, $js_libraries[$name]->scripts, $js_libraries[$name]->styles);
      $js_libraries[$name]->info = (array) $info;
      $js_libraries[$name]->name = $name;
      $js_libraries[$name]->filename = "{$name}-module-jqp";
    }

    // Merge in defaults and save.
    $js_libraries[$name]->info = $library->info + $defaults;

    // Used to merge saved data with loaded data
    $old_library = js_library_load($name);

    // Loop trough each file type
    foreach (array(
      'stylesheets',
      'scripts',
    ) as $type) {

      // Continue if no data is found for this file type
      if (empty($js_libraries[$name]->info[$type])) {
        continue;
      }
      $files = array();

      // Get the data of each file type per version
      foreach ($js_libraries[$name]->info[$type] as $version => $data) {

        // Check whether this version have been madified and saved before
        if (isset($old_library->info[$type][$version]['changed']) && $reset === FALSE) {
          $versions_changed[] = $version;
        }
        foreach ($data as $file_name) {
          $dirname = file_exists($js_libraries[$name]->filename) ? dirname($js_libraries[$name]->filename) : '';
          $files[$version][$file_name] = $dirname ? "{$dirname}/{$file_name}" : $file_name;

          // Let's store the basepath of the dot-info file
          $library->info['base'] = $dirname ? $dirname : NULL;
        }
      }
      $js_libraries[$name]->info[$type] = $files;
    }
    if (!empty($versions_changed)) {
      foreach ($versions_changed as $version_changed) {
        if (isset($js_libraries[$name]->info['scripts'][$version_changed])) {
          $js_libraries[$name]->info['scripts'][$version_changed] = $old_library->info['scripts'][$version_changed];
        }
        if (isset($js_libraries[$name]->info['stylesheets'][$version_changed])) {
          $js_libraries[$name]->info['stylesheets'][$version_changed] = $old_library->info['stylesheets'][$version_changed];
        }
      }
    }

    // Invoke hook_system_info_alter() to give installed modules a chance to
    // modify the data in the .info files if necessary.
    drupal_alter('system_info', $js_libraries[$name]->info, $js_libraries[$name]);

    // Update the contents of the system table:
    if (isset($library->status) || isset($library->old_filename) && $library->old_filename != $library->filename) {
      db_query("UPDATE {system} SET info = '%s', name = '%s', filename = '%s', bootstrap = %d WHERE filename = '%s'", serialize($js_libraries[$name]->info), $library->name, $library->filename, $bootstrap, $library->old_filename);
    }
    else {

      // This is a new library.
      db_query("INSERT INTO {system} (name, info, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $name, serialize($js_libraries[$name]->info), 'javascript library', $js_libraries[$name]->filename, 0, 0, $bootstrap);
    }
  }
  return $js_libraries;
}