Una funzione per modificare in Drupal la versione di jQuery e jQuery UI utilizzata nel tema

Praticamente in ogni progetto Drupal su cui lavoro, tendo ad utilizzare lato tema l'ultima versione disponibile di jQuery e jQuery UI. Ora non è detto che questa sia una pratica ottimale, soprattutto se si utilizzano moduli Drupal per integrare librerie Javascript con specifiche dipendenze su jQuery e jQuery UI. Tuttavia, se si preferisce configurare tutto a mano, ad esempio integrando il plugin JS e configurando una vista od un code field di Display Suite per creare il markup necessario al plugin, tale pratica in genere non dovrebbe creare grossi problemi.

Effettivamente non so se la seguente sia la soluzione migliore, soprattutto in termini di performance, ma teoricamente Drupal dovrebbe cachare tutto.

Quello che faccio è semplicemente aggiungere il seguente codice in template.php. La funzione non fa altro che sostituire le versioni di jQuery caricate da Drupal con quelle che ho specificato, utilizzando l'hook_js_alter. Si noti che converrebbe effettuare la stessa operazione anche per quel che riguarda i CSS utilizzando l'hook_css_alter() (questa cosa la potremmo sfruttare ad esempio per utilizzare un tema custom di jQuery UI). Il tutto funziona solo su Drupal 7.

<?php
/* ---------------------------------------- *
 * A function to change jQuery UI version
 * implementation of hook_js_alter
 * ---------------------------------------- */
function mythemename_js_alter(&$scripts) {
  $theme_path = drupal_get_path('theme','mythemename');
  // dpm($scripts, 'BEFORE');
  foreach ($scripts as $path => $lib) {
    // dpm ($lib, $path);
    if ($path === 'misc/jquery.js') {
      // In jQuery 1.9 has been removed $.browser. Lot of modules
      // have js code that use $.browser (panels for example),
      // so it's better to stay in the branch 1.8
      $new_path = $theme_path . '/js/misc/jquery-1.8.3.min.js';
      $scripts[$path]['version'] = '1.8.3';
      $scripts[$path]['data'] = $new_path;
      continue;
    }
      // Upgrade jquery.form.js for 1.7+ jquery compatibility
      // You can find an updated version of jquery.form.js in
      // jquery_update module (http://drupal.org/project/jquery_update)
      elseif ($path === 'misc/jquery.form.js') 
    {
      $new_path = $theme_path . '/js/misc/jquery.form.min.js';
      $scripts[$path]['version'] = '2.69';
      $scripts[$path]['data'] = $new_path;
      continue;
    }
      // Here I upgrade jQuery UI
      elseif (strstr($path, 'misc/ui/jquery.ui')) 
    { 
      $new_path = str_replace('misc', $theme_path . '/js', $path);
      $scripts[$new_path] = $scripts[$path];
      $scripts[$new_path]['version'] = '1.8.24';
      $scripts[$new_path]['data'] = $new_path;
      unset($scripts[$path]);
      continue;
    }
    elseif (strstr($path, 'misc/ui/jquery.effects')) 
    {
      // dpm ($lib, $path);
      $new_path = str_replace('misc', $theme_path . '/js', $path);
      $scripts[$new_path] = $scripts[$path];
      $scripts[$new_path]['version'] = '1.8.24';
      $scripts[$new_path]['data'] = $new_path;
      unset($scripts[$path]);
      continue;
    }
  }
  // dpm($scripts, 'AFTER');
}

/* ---------------------------------------- *
 * A function to upgrade jQuery UI CSS
 * implementation of hook_css_alter
 * ---------------------------------------- */
function mythemename_css_alter(&$css) {
  $theme_path = drupal_get_path('theme','mythemename');
  foreach ($css as $path => $lib) {
    if (strstr($path, 'misc/ui/jquery.ui')) {
      $new_path = str_replace('misc', $theme_path . '/css', $path);
      $css[$new_path] = $css[$path];
      $css[$new_path]['version'] = '1.8.24';
      $css[$new_path]['data'] = $new_path;
      unset($css[$path]);
    }
  }
}

?>

Questa soluzione risulta comoda in quanto posso continuare ad utilizzare nei moduli funzioni quali drupal_add_library('system','ui.tabs') senza preoccuparmi di quale versione andrò a caricare, dato che la sostituzione verrà fatta a livello di preprocess nel tema.

Ad esempio, se nel template.php volessi aggiungere ui.tabs basterebbe scrivere (è chiaro che qui l'ordine in cui sono chiamate le funzioni ha la sua importanza):

<?php
function mythemename_preprocess_html(&$vars, $hook) {
  drupal_add_library('system', 'ui.tabs');
  mythemename_js_alter($javascript);  
}
?>

In effetti ci sarebbe bisogno di qualche ulteriore aggiustatina al codice di cui sopra se volessimo utilizzare l'attuale (al momento di scrivere) versione 1.9 di jQuery UI dove oltre ad essere stati introdotti introdotti nuovi plugin rispetto alla 1.8, sono stati rinominati i file degli effetti che utilizzano il nuovo pattern jquery.ui.*.js.