मैं मॉड्यूल के जावास्क्रिप्ट को कैसे बदल सकता हूं?


11

मुझे "Webform AJAX" मॉड्यूल के जावास्क्रिप्ट कोड को बदलना होगा। क्या मॉड्यूल को हैक किए बिना यह संभव है, और मॉड्यूल अपडेट पर यह सब खोना जोखिम में है?

जवाबों:


19

आप एक मॉड्यूल में hook_js_alter () का उपयोग कर सकते हैं । उदाहरण के लिए, यह कोड jupery_update निर्देशिका में मौजूद फ़ाइल के साथ Drupal द्वारा उपयोग किए जाने वाले jQuery लाइब्रेरी की जगह लेता है।

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

इनलाइन जावास्क्रिप्ट कोड के लिए भी यही किया जा सकता है। अंतर हैं:

  • इसके बजाय 'misc/jquery.js', पहला सूचकांक एक संख्या है
  • $javascript[$index]['data'] जावास्क्रिप्ट कोड शामिल होंगे

इसका मतलब यह है कि पहले आपको जावास्क्रिप्ट कोड को बदलने के लिए प्रविष्टि ढूंढनी होगी, और फिर इसे बदलना होगा। इस मामले में निम्नलिखित कोड काम करना चाहिए।

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 अपडेट मॉड्यूल के नवीनतम संस्करण द्वारा लागू किया गया कोड है ।

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

यह Drupal कोर द्वारा उपयोग किए गए जावास्क्रिप्ट कोड के लिए भी मान्य है, क्योंकि उन जावास्क्रिप्ट फ़ाइलों के लिए, सिस्टम मॉड्यूल हुक_लॉउड () को लागू करता है । (देखें system_library () )

hook_js_alter()किसी भी जावास्क्रिप्ट फ़ाइल / कोड के लिए इस्तेमाल किया जा सकता है, यहां तक ​​कि Drupal कोर द्वारा उपयोग की जाने वाली फ़ाइलों के लिए भी। बीच hook_js_alter()और hook_library_alter(), यह, बाद लागू करने के लिए जब JavaScript फ़ाइलों को पुस्तकालय के रूप में संपर्क में हैं बेहतर है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.