Мне нужно изменить код JavaScript модуля "Webform AJAX". Возможно ли это, не взломав модуль и не рискуя потерять его при обновлении модуля?
источник
Мне нужно изменить код JavaScript модуля "Webform AJAX". Возможно ли это, не взломав модуль и не рискуя потерять его при обновлении модуля?
Вы можете использовать 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 модуль System реализует hook_library () . (См. System_library () .)
hook_js_alter()
может использоваться для любого файла / кода JavaScript, даже для файлов, используемых ядром Drupal. Между hook_js_alter()
и hook_library_alter()
, предпочтительно, чтобы реализовать последний, когда файлы JavaScript представлены в виде библиотеки.