web-dev-qa-db-fra.com

Ajout d'une classe à "body"

Comment puis-je modifier ou prétraiter la balise <body> pour ajouter le corps de la classe? Je ne veux pas créer un fichier html.tpl.php complet, juste pour ajouter une classe.

33
Chris Muench

Dans le fichier template.php de votre thème, utilisez le hook preprocess_html:

function mytheme_preprocess_html(&$vars) {
  $vars['classes_array'][] = 'new-class';
}

N'oubliez pas de vider les caches une fois que vous avez implémenté le hook ou que Drupal ne le détecte pas.

50
Clive

La documentation du modèle html.tpl.php documente les variables $classes en tant que Chaîne de classes pouvant être utilisées pour un style contextuel via CSS. Si vous examinez le code du modèle, cette variable est utilisée dans les attributs de classe de l'élément body produit:

<body class="<?php print $classes; ?>" <?php print $attributes;?>>

Les variables $classes sont en fait déjà définies par template_process() pour tout fichier de modèle et sont construites à partir du contenu de la variable $classes_array.

Donc, pour ajouter une classe au corps de votre page, vous devez ajouter cette classe à la valeur $classes_array à partir de l'implémentation de hook_preprocess_html() de votre thème (ou module):

function THEME_preprocess_html(&$variables) {
  $variables['classes_array'][] = 'new-class';
}

Comme il s'agit du modèle et de la fonction de processus définis par core, tout thème qui se comporte bien doit réutiliser les mêmes variables.

8
Pierre Buyle

J'ai dû utiliser différentes clés de tableau dans le même crochet pour que cela fonctionne:

function THEME_preprocess_html(&$vars) {
  $vars['attributes_array']['class'][] = 'foo2';
}
3
Hannes Kirsman

Le module Context vous permet également d'ajouter une classe à la balise body.

Cela peut être utile si vous avez besoin d'ajouter la classe sous certaines conditions.

Vous trouvez ces options sous la réaction "Thème HTML":

Theme HTML option in Context UI

2
batigolix

Common Body Class module permet aux utilisateurs d’ajouter des classes à n’importe quelle page via une interface . L’interface dispose d’options pour sélectionner plusieurs rôles d’utilisateur ainsi que des pages sur lesquelles la classe peut être rendue.

Example

La réponse semble dépendre du contexte. Voici ce que j'ai trouvé par essais et erreurs:

Si votre hook_preprocess_html () est dans un module , utilisez $ vars ['classes_array'] [].

S'il s'agit d'un theme , utilisez $ vars ['attributs_array'] ['classe'] [].

1
jaskho

J'ai appliqué cette technique sur un site que quelqu'un d'autre a construit. Cela n'a pas fonctionné au début, mais a ensuite creusé plus profondément et a constaté que la variable $ classes n'était pas sortie dans le fichier tpl. Donc, si ça ne marche pas, vérifiez ça.

0
user2390505