<?php
// récupération de la première valeur d'url :
// on teste si c'est "node" ou "taxonomy", sinon on sort
//
$v = arg( 0 );
if( $v != "node" && $v != "taxonomy" ) return;
// création de variables de base
//
$nid = -1;
$tid = -1;
$mode = "";
// si la valeur est "node", on récupère l'argument 1 en tant que "nid"
// sinon on teste si l'argument 1 est "term" et on récupère l'argument 2
// sinon on sort
//
if( $v == "node" )
{
$nid = arg( 1 );
$mode = "node";
}
else if( $v == "taxonomy" && arg( 1 ) == "term" )
{
$tid = arg( 2 );
$mode = "taxonomy";
}
else return;
// récupération de l'arbre taxonomique des rubriques
// et mise en variable du nombre d'élément
// *********
// ATTENTION : seule valeur en dur : 1 correspond au "vid" de mon vocabulaire
// *********
//
$a = taxonomy_get_tree( 1 );
// si le mode est un "node"
// alors on est sur une page ("page") ou un article ("story")
//
if( $mode == "node" )
{
// récupération du premier terme (tid) disponible pour ce node
//
$tid = db_result( db_query( "select t.tid from term_data t
inner join term_node tn on t.tid = tn.tid where tn.nid = %d limit 1", $nid ) );
}
// pour le mode taxonomy, rien à changer, on passe le nid tel quel
// 1. tout d'abord, on récupère le parent de niveau 0 pour savoir quel est la
// "rubrique à prendre en compte pour la récupération du menu
// 2. ensuite, on affiche les termes via la méthode getTermsHierarchy
//
$roottid = getParentFromSelectedDepth( $a, $tid );
echo getTermsHierarchy( $a, $roottid, $mode, $tid );
function getParentFromSelectedDepth( $taxonomy, $tid )
{
// récupération de la longueur du node
// et inversion du tableau pour retrouver le parent de l'élément
//
$n = count( $taxonomy );
$new_taxonomy = array_reverse( $taxonomy );
// initialisation de variables :
// flag permet de savoir quand on doit enregistrer les données ou pas
// depth est la profondeur de départ à retrouver
//
$flag = false;
$depth = 0;
// itération sur les différents termes disponibles dans la rubrique sélectionnée
//
for( $i = 0; $i < $n; $i++ )
{
$term = $new_taxonomy[$i];
// si la page correspond au terme en cours, on passe flag à vrai
//
if( $term->tid == $tid ) $flag = true;
// sinon je teste si flag = vrai et que la profondeur du terme est plus grande que 0
if( $flag == true && $term->depth >= 0 )
if( $term->depth == $depth )
return $term->tid;
}
return -1;
}
function getTermsHierarchy( $taxonomy, $roottid, $mode, $tid )
{
$n = count( $taxonomy );
// initialisation de variables :
// flag permet de savoir quand on doit enregistrer les données ou pas
// s correspond à la chaine de caractères contenant le menu
// depth est la profondeur de départ
//
$flag = false;
$s = "";
$depth = 0;
// itération sur les différents termes disponibles dans la rubrique sélectionnée
//
for( $i = 0; $i < $n; $i++ )
{
$term = $taxonomy[$i];
// si la page correspond au terme en cours, on passe flag à vrai
// puis on passera au suivant (car on ne veut pas le premier niveau )
//
if( $term->tid == $roottid ) $flag = true;
// sinon je teste si flag = vrai et que la profondeur
// du terme est plus grande que 0
else if( $flag == true && $term->depth > 0 )
{
// si la profondeur est différente de la précédente,
// alors ouverture ou fermeture de la balise UL
//
if( $depth != $term->depth )
{
if( $depth < $term->depth ) $s .= "
- ";
else $s .= "
";
$depth = $term->depth;
}
// création du lien
//
$s .= "
// si c'est le mode "node", alors on le met en lien
//
if( $mode == "node" )
$s .= "" . $term->name . "";
else if( $mode == "taxonomy" )
{
// si c'est le mode "taxonomy", alors on le met en lien
// uniquement si il n'est pas sélectionné
//
if( $term->tid == $tid )
$s .= "" . $term->name . "";
else
$s .= "" . $term->name . "";
}
$s .= "
";
}
// si on est arrivé à la profondeur 0, ça veut dire
// qu'on a passé à une nouvelle hiérarchie, donc à s'arrête
//
else $flag = false;
}
// on termine la chaine avec le dernier /UL
// et on la retourne
//
$s .= "
";
return $s;
}
?>
Voici comment ça fonctionne :
Je choisi les contenus qui seront en primary link comme conseillé, mais sans les créer...
accueil
blog
ressources
contact
Je crée d'abord un vocabulaire "rubriques" avec le premier niveau concernant mes pages. donc le premier niveau contient les termes accueil, blog et ressources (pas contact, car c'est une page automatique...).
Puis je crée ensuite la hiérarchie en dessous comme je le désire avec les termes.
ensuite, je crée pour chacune des termes de premier niveau une page statique (mis à part les pages automatiques style contact, par exemple) et j'attribue à chacune le terme correspondant de premier niveau.
Actuellement, j'ai donc 4 pages dont 3 sont statiques, et sont associées à leur terme du vocabulaire "rubriques"
Une fois ceci fait, je récupère le "vid" (l'identifiant) de mon vocabulaire, que je vais insérer dans mon script ou il y a les petites étoiles, en paramètre de la fonction taxonomy_get_tree.
Puis je crée mon bloc comme tu le préconise, et j'insère le script dedans :)
Ce dernier me permet les choses suivantes :
1. Lorsque je clique sur un des liens primaires (de type node) (accueil, blog et ressources), il m'affiche la hiérarchie des vocabulaires correspondants sous forme de lien.
2. Lorsque je clique sur un de ces liens, il me redirige vers "taxonomy/term/$id" ou $id correspond à l'id du terme. Je suis redirigé vers la page de listing des articles de ce terme.
3. Lorsque je clique sur un article (type node à nouveau) je récupère le premier terme associé à cet article que je trouve, et je peux remonter la hiérarchie, trouver son parent de niveau 1 et afficher tous ses descendants.
En gros dynamisme total :)
J'ai par contre 1 seul problème qui peut être réglé de manière assez simple, mais je préfèrerai que ça soit réglé de manière correcte :
Lorsque je clique sur blog, j'arrive sur /blog (url réécrite), mon menu m'affiche des liens avec /taxonomy/term/xyz.
Lorsque je clique sur un élément du menu, le menu résultant m'affiche toujours /taxonomy/term/xyz pour les liens.
Par contre, si maintenant je clique sur un article, j'arrive sur /node/xyz et là dans mon menu, les liens sont sous forme /node/taxonomy/term/xyz. Un peu génant...
Bon, il peut être simple de résoudre le problème en utilisant la réécriture d'url pour renommer l'article en "mon-article-a-moi" par exemple, mais comme expliqué, je préfèrerai régler correctement plutot que par des hacks de ce genre, ça demanderai une certaine vigilance de la part des rédacteurs...
Je n'ai par contre pas utilisé le module Views, j'ai directement redirigé vers /taxonomy/term/ :)


Poster un nouveau commentaire