Comment ajouter dynamiquement des classes à la balise BODY en fonction du chemin / de la profondeur de la page?

22

Comment ajouter dynamiquement des classes à la balise body comme cet exemple ci-dessous?

-Home
-Villes      
--Melbourne       <body class="melbourne">
--- Parcs à thèmes       <body class="melbourne theme_parks">
--- Restaurants       <body class="melbourne restaurants">
--Nouveaux York       <body class="new_york">
--- Parcs à thèmes       <body class="new_york theme_parks">
--- Restaurants       <body class="new_york restaurants">
-Contactez - nous       <body class="contact_us">

Débutant Drupal ici et sans fond de programmation. Par conséquent, j'apprécierais beaucoup que vous puissiez être aussi détaillé que possible lors du partage d'une solution.

kyooriouskoala
la source

Réponses:

37

Pour exposer la réponse de Nikhil Mohan, vous pouvez implémenter à l' template_preprocess_html()intérieur du fichier template.php de votre thème. Lisez la documentation sur Remplacer la sortie de Themable pour comprendre les bases de ce qui se passe ici.

Dans cette fonction, vous avez accès à la variable $vars['classes_array'], qui contient une liste de classes qui seront appliquées à la <body>balise HTML sur la page.

Malheureusement, les informations sur l'emplacement de la page actuelle dans le menu ne sont pas immédiatement disponibles. Vous pouvez utiliser menu_get_item()et ensuite menu_get_ancestors()obtenir ces informations, mais cela représente beaucoup de puissance de traitement pour quelque chose que nous pouvons probablement obtenir avec une approche simpiler.

En supposant que vous utilisez le module pathauto pour créer automatiquement des chemins sémantiques pour vos pages de contenu en fonction du chemin du menu (c'est-à-dire que votre page Melbourne Theme Parks aurait le chemin 'melbourne / theme_parks'), vous pouvez utiliser le chemin de la page pour créer les classes que vous sont en train de chercher:

function THEMENAME_preprocess_html(&$vars) {
  $path = drupal_get_path_alias();
  $aliases = explode('/', $path);

  foreach($aliases as $alias) {
    $vars['classes_array'][] = drupal_clean_css_identifier($alias);
  } 
}

C'est ça. Drupal va maintenant regarder l'alias de chemin de la page actuelle et ajouter une classe à la <body>balise pour chaque morceau de l'alias de chemin.

sheena_d
la source
1
Si les chemins ne fonctionnent pas, l'analyse du menu_get_active_breadcrumb est également une option. Il est probablement dans le staticcache à ce stade, donc presque pas de surcharge.
mpdonadio
3
Merci à tous, en particulier @sheena_d pour l'explication ainsi que le code! J'ai dû faire un peu de recherche sur la façon de le faire fonctionner sur le thème Omega et j'ai réussi à le faire fonctionner: D Voici la ligne pour le faire fonctionner sur le thème Omega: $vars['attributes_array']['class'][] = drupal_clean_css_identifier($alias);
kyooriouskoala
1

Vous pouvez utiliser les template_preprocess_htmlvariables de prétraitement pour html.tpl.php

Voir aussi html.tpl.php

Implémentation du thème par défaut pour afficher la structure html de base d'une seule page Drupal

niksmac
la source
1

Voici le module pour ajouter des classes sur la balise body en fonction du rôle ou des pages.

Classe de corps commun

Thakur Sanjay Singh Chauhan
la source
0

Création du module Drupal Body Classes pour vous aider. N'hésitez pas à créer des problèmes pour ajouter plus de points d'intégration de classe de corps.

RobLoach
la source