Suppression de feuilles de styles ou de scripts d'un thème Drupal

Un problème classique sous Drupal, chaque module pouvant potentiellement ajouter ses feuilles de style et ses javascript, comment imposer la suppression d'un ensemble de feuilles ou scripts qui posent problème au sein du thème en front ?

Ce peu par exemple se révéler utile lorsque l'on a besoin d'utiliser un jQuery dernière génération non dispo dans Jquery Update ou encore pour virer les feuilles de style de coeur de drupal qui implique trop de modifications sur les feuilles du thème.

Suppression d'un script

Le principe de base est de regénérer la variable de template $script. Ce n'est pas idéal car cela oblige Drupal à effectuer deux fois un traitement mais c'est le mieux que j'ai pu trouver jusqu'à maintenant.

function mon_theme_preprocess_page(&$variables) {
    // Récupération du tableau de scripts. Ce tableau a comme première clef le domaine (code, module, settings, theme, etc..) et comme seconde clef, le nom du fichier JS.  
    $scripts = drupal_add_js();

    // Ici on supprime tous les scripts émis par le coeur de drupal
    $scripts['core'] = array();

    // Regénération du code XHTML d'insertion des scripts (cela comprend la passe de l'optimisateur)
    $variables['scripts'] = drupal_get_js('header', $scripts);
}
A placer dans le template.php du thème à altérer

Bien évidement il est possible de rendre tout ceci conditionnel, par exemple sur un chemin donné.

Suppression de styles

Même principe que pour les scripts, mais cette fois sur la variable de template $styles :

function mon_theme_preprocess_page(&$variables) {
    // On récupère le tableau des feuilles de styles déclarées
    $stylesheets=drupal_add_css();

    // Et on en supprime certaines
    unset($stylesheets['all']['module']['modules/system/defaults.css']);
    unset($stylesheets['all']['module']['modules/system/system.css']);
    unset($stylesheets['all']['module']['modules/system/system-menus.css']);

    // Regénération du code XHTML d'insertion des feuilles de style (cela comprend la passe de l'optimisateur)
    $variables['styles']=drupal_get_css($stylesheets);
}
A placer dans le template.php du thème à altérer

Julien (non vérifié), le mer, 22/09/2010 - 10:54

Génial, merci.

Yoran, le mer, 22/09/2010 - 11:29

You're welcome ! J'ai décidé de vider mon gros stock de snippets en espérant que cela puisse être utile, il semble donc que ce soit le cas :-)

Johann (non vérifié), le sam, 25/09/2010 - 21:34

C'est vraiment avec plaisir de lire tous tes articles.

Merci beaucoup de partager ton savoir.

cyprien (non vérifié), le lun, 27/09/2010 - 13:40

Il y a aussi un autre moyen pour un thème de supprimer un un fichier css (et un .js aussi je crois) :
- Ajouter dans le fichier .info : stylesheets[all][] = defaults.css
- Mettre un fichier un fichier vide du même nom dans le thème : defaults.css
++

Yoran, le lun, 27/09/2010 - 19:00

oui cette technique fonctionne pas mal mais je la trouve un peu plus moche (le coup du fichier vide).

PS: désolé pour la relecture, mais je me suis fait déchirer mes plannings depuis un mois :/ C'est toujours d'actualité ?

opi (non vérifié), le mer, 24/11/2010 - 19:20

Merci yoran pour l'astuce.

Dans mon theme, j'ai fais un peu le bourrin, pour virer automatiquement toutes les css par defaut des modules du core. Voila le bout de code:

$css = drupal_add_css();
foreach($css['all']['module'] as $k => $v) {
  if (strpos($k, 'modules/') === 0) {
    unset($css['all']['module'][$k]);
  }
}
$vars['styles'] = drupal_get_css($css);

Si ca peut servir a d'autres... Je ne sais pas si c'est la meilleure methode, mais j'ai pas trouvé mieux pour l'instant.

opi

sebastien (non vérifié), le jeu, 07/06/2012 - 21:54

Et pour le faire dans Drupal 7, on a un hook_css_alter et un hook_js_alter à mettre dans un module.
Ex :

function monmodule_css_alter(&$css) {
unset($css[drupal_get_path('module', 'system') . '/defaults.css']);
unset($css[drupal_get_path('module', 'system') . '/system.css']);
unset($css[drupal_get_path('module', 'system') . '/system.menus.css']);
unset($css[drupal_get_path('module', 'comment') . '/comment.css']);
unset($css[drupal_get_path('module', 'user') . '/user.css']);
unset($css[drupal_get_path('module', 'field') . '/theme/field.css']);
unset($css[drupal_get_path('module', 'node') . '/node.css']);
}

Source :
http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_css_alter/7
http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_js_alter/7

Yoran, le ven, 08/06/2012 - 01:23

Merci pour cette mise à jour :)

Tu as aussi une astuce de bourrin qui marche pas mal et encore plus simple que cela qui marche en D7 comme D6. Il s'agit simplement d'ajouter les feuilles à virer dans le .info de ton thème.. Le thème gagnant sur tout le reste dans ce domaine, si la feuille n'existe pas, l'entrée sera retirée, tout simplement...

Publier un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
  • Les adresses de pages web et de courriels sont transformées en liens automatiquement.
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plus d'informations sur les options de formatage

CAPTCHA
Cette question est là pour déterminer si vous êtes humain ou pas...