Bagaimana saya bisa mengubah JavaScript modul?


11

Saya perlu mengubah kode JavaScript modul "Webform AJAX". Apakah ini mungkin tanpa meretas modul, dan berisiko kehilangan semuanya setelah pembaruan modul?

Jawaban:


19

Anda dapat menggunakan hook_js_alter () dalam sebuah modul. Misalnya, kode ini menggantikan pustaka jQuery yang digunakan oleh Drupal dengan file yang ada di direktori 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';
} 

Hal yang sama dapat dilakukan untuk kode JavaScript sebaris. Perbedaannya adalah:

  • Alih-alih 'misc/jquery.js', indeks pertama adalah angka
  • $javascript[$index]['data'] akan berisi kode JavaScript

Ini berarti bahwa pertama Anda harus menemukan entri untuk mengganti kode JavaScript, dan kemudian mengubahnya. Kode berikut harus berfungsi dalam hal ini.

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;
    }
  }
}

Sebagai alternatif, jika Anda perlu mengubah perpustakaan diimplementasikan oleh modul, Anda dapat menerapkan hook_library_alter () . Misalnya, ini adalah kode yang diterapkan oleh versi terbaru dari modul Pembaruan jQuery .

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';
  }
}

Ini juga berlaku untuk kode JavaScript yang digunakan oleh Drupal core, karena untuk file JavaScript itu, modul Sistem mengimplementasikan hook_library () . (Lihat system_library () .)

hook_js_alter()dapat digunakan untuk semua file / kode JavaScript, bahkan untuk file yang digunakan oleh inti Drupal. Antara hook_js_alter()dan hook_library_alter(), lebih baik menerapkan yang terakhir, ketika file JavaScript diekspos sebagai pustaka.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.