Inclusion d'une version jQuery différente uniquement sur une page spécifique

16

Le module de mise à jour jQuery inclut ce script.

<script type="text/javascript" src="/sites/all/modules/jquery_update/replace/jquery.min.js?6"></script>

J'ai besoin de cela sur chaque page, à l'exception d'un certain fichier de modèle que j'utilise dans une boîte fantaisie, et j'ai besoin d'une version ultérieure de jQuery.

J'ai besoin d'exclure la mise à jour jQuery de mettre le script ci-dessus dans la $scriptsvariable UNIQUEMENT sur page-media-photos.tpl.php. Comment puis-je atteindre cet objectif?

albo
la source

Réponses:

10

Voici vos options:

  • Utilisez jQuery Multi , comme mentionné dans une autre réponse. Il peut être configuré pour charger la version supérieure de jQuery uniquement sur cette page et uniquement pour la boîte de fantaisie. Il n'interférera pas avec jQuery de Drupal ou avec jQuery de jquery_update.
  • Dans Drupal 7, vous pouvez utiliser hook_js_alter () , qui vous permettra d'échanger la version de jquery_update avec ce que vous voulez.
  • Dans Drupal 6 avec jQuery Update , il fournit un crochet qui vous permet de modifier le JS une fois qu'il a fait son travail. Vous pouvez consulter le code jQuery Multi 6.x pour voir comment il utilise ce hook .
  • Dans Drupal 6 sans mise à jour jQuery , vous pouvez le faire en utilisant un hook preprocess_page. La $scriptsvariable y sera disponible et vous pourrez la modifier. Cela peut devenir un peu délicat. Vous pouvez également voir comment qmulti y parvient . jQuery Update procède également de la même manière.

N'oubliez pas que le passage à une version jQuery supérieure peut casser certaines choses dans Drupal core et contrib, ce qui résout le problème jQuery Multi. Donc, si vous faites cela, assurez-vous de ne rien casser. L'avantage ici est que vous chargez simplement la jQuery dont vous avez besoin, tandis qu'avec jQuery Multi, vous chargez les deux.

Goron
la source
Remarque, hook_js_alter n'est pas disponible en D6
David Thomas
2
Modification de la réponse pour avoir également des informations sur D6.
Goron
Je suis d'accord avec l'utilisation de jQuery multi si vous souhaitez exécuter plusieurs versions de jQuery. Je ne recommanderais la mise à jour jquery que si vous souhaitez exécuter la nouvelle version pour l'ensemble de votre site. De plus, d'après mon expérience, la mise à jour de jquery pour jquery 1.7 et 1.8 est toujours en buggy pour être utilisée en production.
rooby
3

Il existe un module jQuery multi . Ce module vous permet d'avoir multiple versions of jQuery run parallelsur votre instance drupal. Il fournit un aliaspour chaque instance que vous pouvez utiliser pour appeler cette version de jquery.

Gokul NK
la source
3

Si vous avez des problèmes avec jqueryupdate et que vous affichez les pages d'administration (par exemple), essayez d'installer la version Dev de ctools et tout ira bien, venez de me tester.

Molfar
la source
3

Veuillez trouver ce code peut être utile, placez ce code dans votre template.php

function MYTHEME_preprocess_page(&$vars) {
  $scripts = drupal_add_js();
  if (in_array('page-media-photos', $vars['template_files'])) {
    unset($scripts['all']['module']['PATH_OF_JS_NEED_TO_REMOVE']);
  }
  $vars['scripts'] = drupal_get_js('header', $scripts);
}

PATH_OF_JS_NEED_TO_REMOVE donne le chemin de js pour ex: sites / all / modules / og / og.js

Ramesh Babu TB
la source
fonction phptemplate_preprocess_page (& $ vars) {$ scripts = drupal_add_js (); if (in_array ('page-media-photos', $ vars ['template_files'])) unset ($ scripts ['all'] ['module'] ['/ sites / all / modules / jquery_update / replace / jquery. min.js ']); $ vars ['scripts'] = drupal_get_js ('header', $ scripts); } cela n'a pas semblé fonctionner
albo
J'ai voté positivement mais cela ne fonctionne pas
albo
J'ai mis à jour le code pour indiquer que vous devez remplacer MYTHEME par le nom de votre thème au lieu d'utiliser "phptemplate". De plus, je ne recommanderais pas d'utiliser ce type d'approche pour supprimer une bibliothèque dont dépendent d'autres js, comme jQuery, car cela ne prend pas en compte l'ordre de chargement de js et vous pourriez vous retrouver avec jquery si des erreurs non définies se produisent si d'autres Les plugins jQuery sont chargés avant une version de jQuery. De plus, le fonctionnement de la mise à jour jQuery est plus complexe que la simple suppression d'un fichier js.
rooby
2

Drupal 7

Vous pouvez appeler jquery_update_jquery_replace()sur une page spécifique (par exemple dans hook_library_alter()) comme démontré ici par drupalmoff :

<?php
/**
 * Implements hook_module_implements_alter().
 */
function your_module_module_implements_alter(&$implementations, $hook){
  if( $hook == 'library_alter' ){
    $group = $implementations ['your_module'];
    unset($implementations ['your_module']);
    $implementations ['your_module'] = $group;
  }
}

/**
 * Implements hook_library_alter().
 */
function your_module_library_alter(&$javascript, $module) {
  if( $module === 'system' && current_path() == 'path/to/page' ) {
    // 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');
    $path = drupal_get_path('module', 'jquery_update');

    $version = '1.7';

    jquery_update_jquery_replace($javascript, $cdn, $path, $min, $version);
  }
}
?>

Drupal 6

Ma solution était de changer de JQUERY_UPDATE_REPLACE_PATHconstante avant de la jquery_updatecharger:

<?php
/**
 * Replace jQuery files on specified paths (fix for IE 6&7 - jQuery bug: bugs.jquery.com/ticket/6498)
 */
// if (array_search($_GET['q'], array('my_page')) !== FALSE) {
if (arg(0) == 'node' && arg(1) == '123') {
  define('JQUERY_UPDATE_REPLACE_PATH', 'sites/all/libraries/jquery/1.5.2');
}
?>

Il peut donc être ajouté au tout début du fichier .module (qui est chargé auparavant jquery_update, ou essayer dans le fichier de paramètres.

Kenorb
la source
Ne pas détourner votre réponse, mais peut-être souhaitez-vous également en ajouter la variante D8?
Pierre.Vriens
Je n'ai pas trop joué à 8, donc je ne sais pas quelle serait la solution pour D8, désolé. N'hésitez pas à suggérer de modifier ou à publier une réponse. Ou il peut être utile de créer une autre question spécifiquement pour D8.
kenorb