Intereting Posts

Drupal 7 переопределяет jquery js-файл в пользовательской теме

Возможно ли переписать / переопределить jQuery Drupal 7.26 по умолчанию, используемый в переменной настраиваемых шаблонов шаблонов?

Я имею в виду один из js-файлов:

<script type="text/javascript" src="http://drupal.dev/misc/jquery.js?v=1.4.4"></script>

одним из которых является пользовательская тема?

Я пробовал это на sites/all/MYTPL/template.php но это не работает:

$scripts['misc/jquery.js']['data'] = $base_theme . '/js/packages/jquery-2.1.0.min.js';

Я хотел бы знать, удалось ли кому-то управлять этим без использования каких-либо модулей, таких как jQuery Update ?

=== ОБНОВЛЕНО ===

Фактически я решил это с помощью принятого ответа с некоторыми изменениями, основанными на ответе @cojomojo:

 function THEMEname_js_alter(&$javascript) { // Swap out jQuery to use an updated version of the library. $javascript['misc/jquery.js']['data'] = drupal_get_path('theme', 'THEMEname') . '/js/packages/jquery-2.1.0.min.js'; } 

Используйте этот код внутри файла template.php вашей темы, в hook_js_alter .

 function [YOUR_THEME]_js_alter(&$js) { $jqKey = "my-new-jquery"; // a key for new jquery file entry $js[$jqKey] = $js['misc/jquery.js']; // copy the default jquery settings, so you don't have to re-type them. $js[$jqKey]['data'] = "https://code.jquery.com/jquery-2.1.0.min.js"; // the path for new jquery file. $js[$jqKey]['version'] = '2.1.0'; // your jquery version. unset($js['misc/jquery.js']); // delete drupal's default jquery file. } не function [YOUR_THEME]_js_alter(&$js) { $jqKey = "my-new-jquery"; // a key for new jquery file entry $js[$jqKey] = $js['misc/jquery.js']; // copy the default jquery settings, so you don't have to re-type them. $js[$jqKey]['data'] = "https://code.jquery.com/jquery-2.1.0.min.js"; // the path for new jquery file. $js[$jqKey]['version'] = '2.1.0'; // your jquery version. unset($js['misc/jquery.js']); // delete drupal's default jquery file. } 

Таким образом, у вас есть несколько вариантов для этого. Вот они:

Вы можете использовать hook_js_alter так:

 <?php function hook_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'; } ?> 

Или, чтобы избежать поломки, как упомянуто 2pha, вы можете запускать две версии jquery бок о бок. jQuery уже имеет функциональные возможности для выполнения другой версии jQuery (или, действительно, вдоль любой другой библиотеки JavaScript, которая использует символ $ как функцию или переменную). Это функция noConflict (). Вы можете просмотреть страницу API здесь: http://api.jquery.com/jQuery.noConflict/

Чтобы использовать эту функциональность в своем проекте, просто сообщите обозревателю о вашей новой библиотеке jQuery и о том, что вы будете ссылаться на нее с помощью пользовательского идентификатора noConflict. Вот пример того, как вы реализуете это в пользовательской теме.

MyTheme / page.tpl.php

 <head> <title><?php print $head_title; ?></title> <?php print $head; ?> <?php print $styles; ?> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> <script type="text/javascript"> var $jq = jQuery.noConflict(); </script> <?php print $scripts; ?> </head> 

Другим возможным методом является обмен jQuery с страницей предварительной обработки следующим образом:

 <?php function yourModuleOrThemeName_preprocess_page(&$variables) { // exclude backend pages to avoid core js not working anymore // you could also just use a backend theme to avoid this if (arg(0) != 'admin' || !(arg(1) == 'add' && arg(2) == 'edit') || arg(0) != 'panels' || arg(0) != 'ctools') { $scripts = drupal_add_js(); $new_jquery = array(drupal_get_path('theme', 'YOURTHEME') . '/js/jquery-1.7.1.min.js' => $scripts['core']['misc/jquery.js']); $scripts['core'] = array_merge($new_jquery, $scripts['core']); unset($scripts['core']['misc/jquery.js']); $variables['scripts'] = drupal_get_js('header', $scripts); } } ?> не <?php function yourModuleOrThemeName_preprocess_page(&$variables) { // exclude backend pages to avoid core js not working anymore // you could also just use a backend theme to avoid this if (arg(0) != 'admin' || !(arg(1) == 'add' && arg(2) == 'edit') || arg(0) != 'panels' || arg(0) != 'ctools') { $scripts = drupal_add_js(); $new_jquery = array(drupal_get_path('theme', 'YOURTHEME') . '/js/jquery-1.7.1.min.js' => $scripts['core']['misc/jquery.js']); $scripts['core'] = array_merge($new_jquery, $scripts['core']); unset($scripts['core']['misc/jquery.js']); $variables['scripts'] = drupal_get_js('header', $scripts); } } ?> 

Для меня лучшим методом было бы либо запустить две версии jQuery бок о бок (версия, которую Drupal 7 использует по умолчанию, так и независимо от вашей темы) или обмен jQuery с страницей предварительной обработки. У hook_js_alter есть потенциал для взлома чего угодно, что требует другой версии jQuery. Все возможные способы сделать то, что вы просите здесь: https://drupal.org/node/1058168

Возможно, используйте hook_js_alter .
Имейте в виду, что другие модули будут зависеть от jQuery, и если они будут использовать что-то, что изменилось между версиями, вы можете столкнуться с проблемами.