2 votes

Ajouter une classe au corps de Drupal

Comment puis-je ajouter l'identifiant de tous les termes liés à un nœud à la classe de corps de ce nœud dans un site Drupal ?

Par exemple, un nœud nommé stackoverflow est assorti de quatre termes

term1
term2
term3
term4
term5

Je veux ajouter ces classes à la classe du corps du nœud...

article-term-(term1tid) 
article-term-(term2tid)
article-term-(term3tid) 
article-term-(term4tid)
article-term-(term5tid)

Ce sont les pages dont je veux changer les noms de classe :

2voto

koivo Points 448

Comme @P1ratRuleZZZ l'a déjà souligné template_preprocess_html (mis en œuvre à partir de votre sous-thème template.php ) est la fonction permettant d'ajouter des classes de corps.

Le problème est que, dans cette fonction, vous devez d'abord charger l'objet nœud réel, puis obtenir les valeurs du champ de référence du terme, pour enfin les ajouter en tant que classes à la balise body.

Remplacer MYTHEME y field_MYFIELD avec vos noms.

/**
 * Implements template_preprocess_html().
 */
function MYTHEME_preprocess_html(&$variables) {

  // Get the node.
  if ($node = menu_get_object()) {

    // Check node type.
    if ($node->type === 'article') {

      // Get taxonomy terms.
      $terms = field_get_items('node', $node, 'field_MYFIELD');

      foreach ($terms as $term) {
        // Add body class.
        $variables['classes_array'][] = 'article-term-' . $term['tid'];
      }
    }        
  }
}

2voto

user1290329 Points 116

Leymannx code est vraiment complet et bien.

mais il ne contient pas tous les termes d'un noeud.

J'ai moi-même écrit ce code et j'espère qu'il vous sera utile.

function YOURTHEME_preprocess_html(&$variables) {

    if (arg(0) == 'node' && is_numeric(arg(1))) {
        $node    = node_load(arg(1));
        $results = stackoverflow_taxonomy_node_get_terms($node);
        if (is_array($results)) {
            foreach ($results as $item) {
                $variables['classes_array'][] = "article-term-" . $item->tid;
            }
        }
    }

}

Il existe une fonction nommée ""stackoverflow_taxonomy_node_get_terms"" qui renvoie tous les termes attachés à un nœud.

function stackoverflow_taxonomy_node_get_terms($node, $key = 'tid'){
    static $terms;
    if (!isset($terms[$node->vid][$key])) {
        $query   = db_select('taxonomy_index', 'r');
        $t_alias = $query->join('taxonomy_term_data', 't', 'r.tid = t.tid');
        $v_alias = $query->join('taxonomy_vocabulary', 'v', 't.vid = v.vid');
        $query->fields($t_alias);
        $query->condition("r.nid", $node->nid);
        $result                  = $query->execute();
        $terms[$node->vid][$key] = array();
        foreach ($result as $term) {
            $terms[$node->vid][$key][$term->$key] = $term;
        }
    }
    return $terms[$node->vid][$key];
}

Je souhaite que ce code soit le meilleur.

écrivez tous ces codes dans le fichier template.php de votre thème.

si vous voulez que seuls certains noeuds aient un nom de classe, remplacez cette partie du code.

> if (arg(0) == 'node' && is_numeric(arg(1)) && ( arg(1)==X || arg(1)==Y
> )  ) {

0voto

P1ratRuleZZZ Points 44

Essayez d'utiliser template_preprocess_html()

dans le fichier template.php de votre thème :

YOURTHEMENAME_preprocess_html(&$variables) {
  $term_id = arg(1); // For example, or use some &drupal_static() to store a value while preprocessing from module
  $variables['classes_array'][] = 'article-term-' . $term_id;
}

Comme vous pouvez le voir, vous devez d'abord remplacer le modèle par votre nom de thème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X