Comment afficher le nom d'un type de contenu et une taxonomie précise dans node.tpl.php

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Je ré-écris l'affichage de mes types de contenus et, pour avoir le nom des variables, j'ai regardé le fichier de base node.tpl.php et /modules/nodes/node.tpl.php.

Cependant je n'ai pas trouvé comment afficher le nom d'un type de contenu (et non pas son type qui est accessible par $type) ? Dans une vue c'est facile mais là je n'ai pas trouvé.

D'autre part, j'aurai voulu savoir comment afficher dans cet article les tags d'une taxonomie. Pour un type de contenu, j'ai par exemple une taxonomie "ville" contenant toutes les villes et une taxonomie "action" représentant des actions faites. Si j'utilise la variable $terms je récupère tous les tags, "ville" et "action" hors je souhaite récupérer uniquement "ville". Savez-vous comment le faire ?

Merci d'avance et bon week.

Forum : 

Alors pour la première question il suffit d'utiliser la fonction node_get_types() de cette manière:

<?php print node_get_types('name', $node->type); ?>

Pour la seconde question il faut créer une fonction spécifique dans votre fichier template.php en remplaçant "montheme" par le nom de votre thème.

<?php
/**
 * Imprimer des termes présent sur un noeud d'un vocabulaire
 * spécifique.
 *
 * @param object $node
 *   Le noeud en cours de visualisation.
 * @param integer $vid
 *   L'id du vocabulaire que l'on souhaite imprimer.
 *  
 * @return string $output
 *   La taxonomy présente sur le noeud correspondant à ce vocabulaire.
 */
function montheme_taxonomy_specifique($node, $vid) {
 
$output = '';
 
  if (
count($node->taxonomy)) {
   
$taxonomys = array();
    foreach (
$node->taxonomy as $taxo) {
      if (
$taxo->vid == $vid) {
       
$taxonomys[] = array('title' => $taxo->name, 'href' => taxonomy_term_path($taxo));
      }
    }
   
    if (
$taxonomys) {
      foreach (
$taxonomys as $taxonomy) {
       
$output .= l($taxonomys['title'], $taxonomys['href']);
      }
    }
  }
  
  return
$output;
}
?>

Et il suffira dans votre fichier tpl.php d'appelée la fonction par exemple si votre vocabulaire à un id de 2 :

<?php print montheme_taxonomy_specifique($node, 2); ?>

Je suis un peu dégouté, car j'ai passé la journée à chercher comment le faire. Du coup, voilà ce que j'ai trouvé

1-

<?php
 node_get_types
('name',$vars['node']);  
?>

2-

<?php
 
function musculation_getVocabularyFromNode($taxonomy=null, $vocabulary_vid=0)
{
  
$output = "";
    if (
$taxonomy && $vocabulary_vid)
  {
     
///-- Cette fonction est un copié-collé de la fonction /modules/taxonomy/taxonomy.module "taxonomy_link"
    
foreach($taxonomy as $term) {
          if (
$term->vid == $vocabulary_vid) {//print_r($term->name);
              //$output .= $term->name . $separator;
             
if (is_object($term)) {
                   
$links['taxonomy_term_'. $term->tid] = array(
                            
'title' => $term->name,
                               
'href' => taxonomy_term_path($term),
                             
'attributes' => array('rel' => 'tag', 'title' => strip_tags($term->description)));
             }
              else {
               foreach (
$term as $free_typed) {
                
$typed_terms = drupal_explode_tags($free_typed);
                   foreach (
$typed_terms as $typed_term) {
                       
$links['taxonomy_preview_term_'. $typed_term] = array('title' => $typed_term,  );
                   }
                }
                }
             
drupal_alter('link', $links, $node);             
           }
      }
     
//-- Affiche sous forme de lien les tags
      
$output .= theme_links($links, array('class' => 'tags_content_type')) ;
 }
  return
$output;
}
?>

J'ai repompé le code et modifié de la fonction taxonomy_link.

Tu en penses quoi par rapport à ton code ?

Pour le 1 on à la même chose, cependant pour la 2 il est plus économique d'utilisée la snippet que je vous ai donnée car celle-ci ne fait pas appelle à drupal_alter() qui à déjà été appelée une fois avant l'affichage du noeud mais sinon c'est à peu près la même chose.

Par rapport à votre réflexion, j'ai supprimé la ligne

<?php
 drupal_alter
('link', $links, $node);   
?>

et ça fonctionne quand même.

Dans la doc, il est écrit au sujet de cette fonction This dispatch function hands off structured Drupal arrays to type-specific *_alter implementations. It ensures a consistent interface for all altering operations.

Je ne comprends pas, à quoi sert cette fonction ?

Merci d'avance

@takeova j'ai pris ton code, mais la taxonomie ne s'affiche pas,j'ai pourtant la bonne vid..j'utilise par ailleurs un autre code pour styler la taxonomie, mais dans ce node j'ai un tpl spécifique qui ne l'utilise pas, voici le code qui me permet de styler,peut etre peut on utiliser ce style sur ton code aussi:

<?php
// permet de trier la taxonomie
function monTheme_print_terms($node, $vid = NULL, $ordered_list = TRUE) {
    
$vocabularies = taxonomy_get_vocabularies();
     if (
$ordered_list) $output .= '<ul>'; //checks to see if you want an ordered list
    
if ($vid) { //checks to see if you've passed a number with vid, prints just that vid
       
$output = '<div class=tags-'. $vid . '>';
        foreach(
$vocabularies as $vocabulary) {
         if (
$vocabulary->vid == $vid) {
          
$terms = taxonomy_node_get_terms_by_vocabulary($node, $vocabulary->vid);
           if (
$terms) {
            
$links = array();
            
$output .= '<span class=only-vocabulary-'. $vocabulary->vid . '>';
             if (
$ordered_list) $output .= '<li class=vocabulary-'. $vocabulary->vid . '>' . $vocabulary->name . ': ';
             foreach (
$terms as $term) {
              
$links[] = '<span class="term-' . $term->tid . '">' . l($term->name, taxonomy_term_path($term), array('rel' => 'tag', 'title' => strip_tags($term->description))) .'</span>';
             }
            
$output .= implode(', ', $links);
             if (
$ordered_list) $output .= '</li>';
            
$output .= '</span>';
           }
         }
       }
     }
     else {
      
$output = '<div class="tags">';
       foreach(
$vocabularies as $vocabulary) {
         if (
$vocabularies) {
          
$terms = taxonomy_node_get_terms_by_vocabulary($node, $vocabulary->vid);
           if (
$terms) {
            
$links = array();
            
$output .= '<ul class=vocabulary-'. $vocabulary->vid . '>';
             if (
$ordered_list) $output .= '<li class=vocabulary-'. $vocabulary->vid . '>' . $vocabulary->name . ': ';
             foreach (
$terms as $term) {
              
$links[] = '<span class="term-' . $term->tid . '">' . l($term->name, taxonomy_term_path($term), array('rel' => 'tag', 'title' => strip_tags($term->description))) .'</span>';
             }
            
$output .= implode(', ', $links);
             if (
$ordered_list) $output .= '</li>';
            
$output .= '</ul>';
           }
         }
       }
     }
     if (
$ordered_list) $output .= '</ul>';
    
$output .= '</div>';
     return
$output;
}
?>

et dans le node.tpl j'ai :

<?php
 
print monTheme_print_terms($node);
?>

Je comprend pas quel est le problème que tu cherche à résoudre cependant dans ton code je pense que tu fais appel à des fonction dont tu n'as pas besoin et qui peuvent laisser une empreinte plus importante sur la mémoire du genre taxonomy_node_get_terms_by_vocabulary().

remontée de sujet d'outre tombe :)
car j'ai fait un emodif sur mon page.tpl et je n'arrive plus à afficher ma taxo..

j'ai remplacé

<?php
 
//print $content;
?>

par

<?php
 
print $node->content['body']['#value']
?>

du coup je dois modifier le code d'origine, mais je ne sais pas comment, voila ce que j'essai sans succés:

<?php
 
print Cyrano_PF_print_terms($node->taxonomy[0]]['view']);
?>

si quelqu'un passe par la ;) merci

voici le resultat:

[44] => stdClass Object
        (
            [tid] => 44
            [vid] => 3
            [name] => Bac Technologique
            [description] =>
            [weight] => 0
        )

    [30] => stdClass Object
        (
            [tid] => 30
            [vid] => 2
            [name] => Célony
            [description] =>
            [weight] => 0
        )