Comment puis-je modifier le JavaScript d'un module?


11

J'ai besoin de modifier le code JavaScript du module "Webform AJAX". Est-ce possible sans pirater le module et risquer de tout perdre lors des mises à jour du module?

Réponses:


19

Vous pouvez utiliser hook_js_alter () dans un module. Par exemple, ce code remplace la bibliothèque jQuery utilisée par Drupal par le fichier présent dans le répertoire jquery_update.

function jquery_update_js_alter(&$javascript) {
  // Swap out jQuery to use an updated version of the library.
  $javascript['misc/jquery.js']['data'] = drupal_get_path('module', 'jquery_update') . '/jquery.js';
} 

La même chose peut être faite pour le code JavaScript en ligne. Les différences sont les suivantes:

  • Au lieu de 'misc/jquery.js', le premier index est un nombre
  • $javascript[$index]['data'] contiendra le code JavaScript

Cela signifie que vous devez d'abord trouver l'entrée du code JavaScript à remplacer, puis la modifier. Le code suivant devrait fonctionner dans ce cas.

function mymodule_js_alter(&$javascript) {
  $old_code = 'The code to alter';
  $new_code = 'The new code';

  foreach ($javascript as $index => $info) {
    if (is_numeric($index) && $info['data'] == $old_code) {
      $javascript[$index]['data'] = $new_code;
      break;
    }
  }
}

Comme alternative, si vous devez modifier la bibliothèque implémentée par un module, vous pouvez implémenter hook_library_alter () . Par exemple, il s'agit du code implémenté par la dernière version du module jQuery Update .

function jquery_update_library_alter(&$javascript, $module) {

  // We are updating just the system module. For all other cases we return.
  if ($module != 'system') {
    return;
  }

  $path = drupal_get_path('module', 'jquery_update');

  // Make sure we inject either the minified or uncompressed version as desired.
  $min = variable_get('jquery_update_compression_type', 'min') == 'none' ? '' : '.min';
  $cdn = variable_get('jquery_update_jquery_cdn', 'none');

  // Replace jQuery with the latest version.
  $version = variable_get('jquery_update_jquery_version', '1.5');
  jquery_update_jquery_replace($javascript, $cdn, $path, $min, $version);

  // Replace jQuery UI with CDN or local files. If from a CDN include all of jQuery UI.
  jquery_update_jqueryui_replace($javascript, $cdn, $path, $min);

  // Replace the jQuery Cookie plugin.
  $javascript['cookie']['js']['misc/jquery.cookie.js']['data'] = $path . '/replace/ui/external/jquery.cookie.js';
  // Noting the version based on git commit as no version number is available.
  $javascript['cookie']['version'] = '67fb34f6a866c40d0570';

  // Replace jQuery Form plugin.
  $javascript['jquery.form']['js']['misc/jquery.form.js']['data'] = $path . '/replace/misc/jquery.form' . $min . '.js';
  $javascript['jquery.form']['version'] = '2.69';

  // Replace files for jQuery 1.7 and up
  if (version_compare($version, '1.7', '>=')) {
    $javascript['drupal.states']['js']['misc/states.js']['data'] = $path . '/replace/misc/1.7/states.js';
  }
}

Ceci est également valable pour le code JavaScript utilisé par le noyau Drupal, car pour ces fichiers JavaScript, le module Système implémente hook_library () . (Voir system_library () .)

hook_js_alter()peut être utilisé pour n'importe quel fichier / code JavaScript, même pour les fichiers utilisés par Drupal core. Entre hook_js_alter()et hook_library_alter(), il est préférable d'implémenter cette dernière, lorsque les fichiers JavaScript sont exposés en bibliothèque.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.