Мені потрібно змінити код JavaScript модуля "Webform AJAX". Чи можливо це без злому модуля та ризикуючи втратити все це при оновленнях модуля?
Мені потрібно змінити код JavaScript модуля "Webform AJAX". Чи можливо це без злому модуля та ризикуючи втратити все це при оновленнях модуля?
Відповіді:
Ви можете використовувати mock_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;
}
}
}
В якості альтернативи, якщо вам потрібно змінити бібліотеку, реалізовану модулем, ви можете реалізувати прив'язку_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';
}
}
Це справедливо і для коду JavaScript, який використовується ядром Drupal, оскільки для цих файлів JavaScript модуль системи реалізує moka_library () . (Див. System_library () .)
hook_js_alter()
може використовуватися для будь-якого файлу / коду JavaScript, навіть для файлів, що використовуються ядром Drupal. Між hook_js_alter()
і hook_library_alter()
, бажано реалізовувати останнє, коли файли JavaScript піддаються впливу бібліотеки.