Làm cách nào để thay đổi JavaScript của mô-đun?


11

Tôi cần thay đổi mã JavaScript của mô-đun "Webform AJAX". Điều này có thể xảy ra mà không cần hack mô-đun và có nguy cơ mất tất cả khi cập nhật mô-đun không?

Câu trả lời:


19

Bạn có thể sử dụng hook_js_alter () trong một mô-đun. Ví dụ, mã này thay thế thư viện jQuery được sử dụng bởi Drupal với tệp có trong thư mục 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';
} 

Điều tương tự có thể được thực hiện cho mã JavaScript nội tuyến. Sự khác biệt là:

  • Thay vì 'misc/jquery.js', chỉ số đầu tiên là một con số
  • $javascript[$index]['data'] sẽ chứa mã JavaScript

Điều này có nghĩa là trước tiên bạn phải tìm mục nhập cho mã JavaScript để thay thế và sau đó thay đổi nó. Các mã sau đây nên làm việc trong trường hợp này.

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

Thay vào đó, nếu bạn cần thay đổi thư viện được thực hiện bởi một mô-đun, bạn có thể triển khai hook_l Library_alter () . Ví dụ, đây là mã được triển khai bởi phiên bản mới nhất của mô-đun Cập nhật 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';
  }
}

Điều này cũng hợp lệ đối với mã JavaScript được sử dụng bởi lõi Drupal, vì đối với các tệp JavaScript đó, mô-đun Hệ thống thực hiện hook_l Library () . (Xem system_l Library () .)

hook_js_alter()có thể được sử dụng cho bất kỳ tệp / mã JavaScript nào, ngay cả đối với các tệp được sử dụng bởi lõi Drupal. Giữa hook_js_alter()hook_library_alter(), tốt hơn là thực hiện cái sau, khi các tệp JavaScript được hiển thị dưới dạng thư viện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.