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

Catégories:

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.

#

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);
?>

Drupal 6.xx - 2 sites chez OVH (pro) mutualisé, 6 chez AlwaysData (Pack10go)
/////////////
www.graphisme-libre.info

#

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().

#

fort possible en effet,je vais faire le menage

Drupal 6.xx - 2 sites chez OVH (pro) mutualisé, 6 chez AlwaysData (Pack10go)
/////////////
www.graphisme-libre.info

#

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

Drupal 6.xx - 2 sites chez OVH (pro) mutualisé, 6 chez AlwaysData (Pack10go)
/////////////
www.graphisme-libre.info

#

Et ça donne quoi si tu fais un print_r($node->taxonomy) ?

Bon courage !

PS : bizarre ton nom de type de contenu :-)

#

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
        )

Drupal 6.xx - 2 sites chez OVH (pro) mutualisé, 6 chez AlwaysData (Pack10go)
/////////////
www.graphisme-libre.info

Syndiquer le contenu