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.

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.


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



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.