ฉันจะเปลี่ยนจาวาสคริปต์ของโมดูลได้อย่างไร?


11

ฉันต้องเปลี่ยนรหัส JavaScript ของโมดูล "Webform AJAX" เป็นไปได้โดยไม่แฮ็คโมดูลและเสี่ยงที่จะสูญเสียมันทั้งหมดเมื่ออัปเดตโมดูล?

คำตอบ:


19

คุณสามารถใช้hook_js_alter ()ในโมดูล ตัวอย่างเช่นโค้ดนี้แทนที่ไลบรารี jQuery ที่ใช้โดย Drupal ด้วยไฟล์ที่มีอยู่ในไดเร็กทอรี 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';
} 

สามารถทำได้เช่นเดียวกันสำหรับโค้ด JavaScript แบบอินไลน์ ความแตกต่างคือ:

  • แทนที่จะ'misc/jquery.js'เป็นดัชนีแรกคือตัวเลข
  • $javascript[$index]['data'] จะมีรหัส JavaScript

ซึ่งหมายความว่าก่อนอื่นคุณต้องค้นหารายการสำหรับรหัส JavaScript เพื่อแทนที่แล้วจึงแก้ไข รหัสต่อไปนี้ควรใช้งานได้ในกรณีนี้

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

เป็นทางเลือกถ้าคุณต้องการที่จะปรับเปลี่ยนห้องสมุดดำเนินการโดยโมดูลคุณสามารถใช้hook_library_alter () ตัวอย่างเช่นนี่คือรหัสที่ใช้โดยโมดูล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';
  }
}

นี่คือที่ถูกต้องนอกจากนี้สำหรับโค้ด JavaScript ใช้โดย Drupal หลักตั้งแต่ไฟล์ JavaScript เหล่านั้นดำเนินการโมดูลระบบhook_library () (ดูsystem_library () )

hook_js_alter()สามารถใช้สำหรับไฟล์ / รหัส JavaScript ใด ๆ แม้แต่ไฟล์ที่ใช้โดย Drupal core ระหว่างhook_js_alter()และhook_library_alter()เป็นที่ต้องการใช้งานส่วนหลังเมื่อไฟล์ JavaScript ถูกเปิดเผยเป็นไลบรารี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.