모듈의 JavaScript를 어떻게 변경합니까?


11

"Webform AJAX"모듈의 JavaScript 코드를 변경해야합니다. 모듈을 해킹하지 않고 모듈 업데이트시 모듈을 모두 잃을 위험이 없는가?

답변:


19

모듈에서 hook_js_alter () 를 사용할 수 있습니다 . 예를 들어이 코드는 Drupal에서 사용하는 jQuery 라이브러리를 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';
  }
}

이는 Drupal 코어에서 사용하는 JavaScript 코드에도 유효합니다. JavaScript 파일의 경우 시스템 모듈이 hook_library ()를 구현하기 때문 입니다. ( system_library ()를 참조하십시오 .)

hook_js_alter()Drupal 코어에서 사용하는 파일이라도 모든 JavaScript 파일 / 코드에 사용할 수 있습니다. hook_js_alter()와 사이 hook_library_alter()에서 JavaScript 파일이 라이브러리로 노출 될 때 후자를 구현하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.