Tout d'abord j'active les modules path, cck et views, et j'active également la réécriture d'url (admin/settings/clean-urls) puis je crée autant de vocabulaires que j'aurai besoin de menus.
Par exemple : mon site :
accueil
blog
ressources
expérimentations
contact
Tout d'abord, je vais créer 3 nouveaux type de contenus, pour chaque catégorie d'article... ça me permettra de les customiser via cck et de gérer finement les droits des utilisateurs à pouvoir créer tel ou tel type d'article. mes 3 types seront : billet de blog, ressource et expérimentation (j'en ai fait un 4ème pour billet de blog média, en prévision d'intégrer une galerie d'image ou une vidéo)
j'ai besoin de catégories pour rédiger des articles dans blog, ressources et expérimentations. Je crée donc 3 vocabulaires multiples (pour avoir une hiérarchie de termes). A chaque vocabulaire, je vais associer le type de contenu adéquat (blog = billet de blog (+ média), ressources = ressource et expérimentations = expérimentation)
Je crée ensuite directement les termes dans chaque vocabulaire, exemple :
vocabulaire blog :
- développement
-- Flash
-- PHP
- graphisme
- divers
vocabulaire ressources :
- Flash
- PHP
- Graphisme
etc...
Je crée ensuite mes "pages" :
- Accueil sera une page (page statique avec path view/home sans spécification de menu pour le moment)
- Contact sera créé avec les formulaires de contact, avec l'adresse "contact" tout simplement
- pour les pages d'accueil blog, ressources et expérimentations, cette fois, je vais utiliser le module "views". je crée 3 vues, et graces à elles, je vais pouvoir affecter un texte d'en-tête, puis ensuite un filtre sur "taxonomy/term of ***" (ou ** correspond au vocabulaire à affecter à la vue) en spécifiant "is one of" et en sélectionnant tous les éléments de la liste, puis en ordrant les éléments pour les avoir en ordre ascendant. pour chacune de ces pages, je valorise le path avec view/***
Je crée ensuite mon menu, dans les liens primaires. Pour chaque lien, j'affecte le chemin nécessaire : dans l'ordre :
- Accueil = view/home
- Blog = view/blog
- Ressources = view/ressources
- Expérimentations = view/experiments
- Contact = contact
Enfin, je crée un bloc dans la section appropriée, dans lequel j'affecte le code suivant :
<?php
// récupération de la première valeur d'url :
// on teste si c'est "node", "view" ou "taxonomy", sinon on sort
//
// si c'est node, ça veut dire qu'on est sur un article
// si c'est view, ça veut dire qu'on est sur une page de garde
// si c'est taxonomy, ça veut dire qu'on est sur une page de listing
//
$mode = arg( 0 );
if( $mode != "view" && $mode != "taxonomy" && $mode != "node" ) return;
// création de variables de base
//
$nid = -1;
$tid = -1;
// si la valeur est "node" ou "view", 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( $mode == "node" ) $nid = arg( 1 );
else if( $mode == "view" ) $nid = arg( 1 );
else if( $mode == "taxonomy" && arg( 1 ) == "term" ) $tid = arg( 2 );
else return;
//$a = taxonomy_get_tree( 1 );
// si le mode est un "node"
// alors on est sur un article,
// on récupère le vocabulaire associé au premier terme
// qu'on va trouver qui est lié à l'article
//
if( $mode == "node" )
{
// récupération du premier terme (tid) disponible pour ce node
//
$vid = db_result( db_query( "select t.vid from term_data t
inner join term_node tn on t.tid = tn.tid where tn.nid = %d limit 1", $nid ) );
}
// si le mode est une "view"
// alors on est sur une page de garde,
// on récupère le vocabulaire associé à la page
// via le tableau $assoc
//
else if ( $mode == "view" )
{
// création d'un tableau de données pour les pages
// ayant un vocabulaire spécifique à afficher
// l'identifiant doit correspondre à l'argument passé dans l'url (view/arguement)
// la valeur doit correspondre au vocabulaire associé à la page
//
$assoc = array(
"blog" => 1,
"ressources" => 2,
"experiments" => 3
);
if( ! isset( $assoc[$nid] ) ) return;
else $vid = $assoc[$nid];
}
// si le mode est "taxonomy"
// alors on est sur une page de listing,
// on récupère le vocabulaire associé au listing
// via l'identifiant du terme en argument dans l'url
//
else if ( $mode == "taxonomy" )
{
$vid = db_result( db_query( "select t.vid from term_data t where t.tid = %d", $tid ) );
}
// on récupère l'arbre de données
// via la méthode du module taxonomy
//
$a = taxonomy_get_tree( $vid );
// enfin, on appelle la méthode getTermsHierarchy,
// qui s'occupe simplement de formater les éléments
// de l'arbre de données en omettant le premier
//
echo getTermsHierarchy( $a, $mode, $tid );
function getTermsHierarchy( $taxonomy, $mode, $tid )
{
$n = count( $taxonomy );
// initialisation de variables :
// s correspond à la chaine de caractères contenant le menu
// depth est la profondeur de départ
//
$s = "";
$depth = -1;
// itération sur les différents termes disponibles dans la rubrique sélectionnée
// en omettant le premier
//
for( $i = 0; $i < $n; $i++ )
{
$term = $taxonomy[$i];
// 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" ou "view", alors on le met en lien
//
if( $mode == "node" || $mode == "view" )
$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 .= "
";
}
// on termine la chaine avec le dernier /UL
// et on la retourne
//
$s .= "
";
return $s;
}
?>
(Attention, il va falloir modifier le tableau $assoc pour le faire correspondre à vos identifiants de pages et de vocabulaires.)
Cette dernière action va permettre de lister les terme du vocabulaire associé à chaque page.
3 options comme la dernière fois :
1. soit on est sur une des pages de base (accueil, blog, etc... les pages ayant dans leur chemin view/) et là on récupère le vocabulaire associé à la page via le tableau $assoc, si on trouve l'élément.
2. soit on est sur une page de listing (taxonomy/term/xyz), et cette fois on récupère l'identifiant du terme (xyz), on recherche dans la base de données à quel vocabulaire il est associé.
3. soit on est sur un article (node/xyz). Dans ce cas, on recherche le premier terme disponible associé à cet article dans la base de données, ce qui nous permet de récupérer le vocabulaire du terme
A partir de là, on récupère simplement le vocabulaire via la méthode taxonomy_get_tree du module taxonomy et on le formate pour l'affichage.
Voilà. J'imagine qu'on peut étendre le truc avec les vues, par exemple avec le système d'onglet qu'a démontré patchak (c'est justement ce que j'aimerai essayer) mais actuellement, je me pose + la question quant à l'intégration du design dans le site, quel est le moyen de faire pour bien faire...
Et j'ai pas mal de problèmes dès que je tente de réécrire des urls (par exemple dans mes menus) car si je tappe dans l'url taxonomy/term/xyz/recents alors mon menu est rechargé avec chaque lien contenant taxonomy/term/xyz/abc ou xyz est l'identifiant du node et abc vient remplacer "recent" alors qu'il devrai remplacer xyz...
Bref, encore bien des recherches en perspectives :)


Poster un nouveau commentaire