taxonomy terms + nodes associés dans un block en dhtml

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 tourne en rond depuis des heures et je n'ai toujours pas trouvé ce que je cherche. Je vous explique mon problème.

Je souhaite avoir un block nommé "menu" dans lequel on trouve toute la hiérarchie des vocabulaires et des termes, et pour chaque terme, on lui liste ses nodes. Je ne veux avoir à faire qu'activer le module une fois, puis configurer le block et il se débrouille tout seul.

En fait je veux une hiérarchie complète dans un block à part, et qu'une fois que tout sera configuré, on pourra ajouter des vocabulaires/termes/nodes, le menu se mettra à jour tout seul.

Une contrainte supplémentaire : j'utilise dhtml menu, et j'aimerais que celui-ci soit utilisé pour le block généré ci-dessus.

J'ai testé :
* taxonomy menu : ne gère pas les nodes ET pas dans un block à part. On peut déplacer à la mano, mais il est hors de question que ce soit le cas.
* taxonomy dhtml : euh, le block ne contient quasiment rien
* taxonomy context : ajout d'un block pour chaque vocabulaire... a la main + pas de dhtml
* directory : ... incompréhension de son utilité
* sitemenu : la page est exactement ce que je veux, mais le block est insuffisant.
* taxonomy block : choix manuel des termes, donc pas d'automatisme.
* l'ajout manuel en tant qu'entrée de menu de chaque article, ajout impératif du nom de l'entrée, donc redondance de saisie du titre de l'article.

Je pense qu'une bonne boucle PHP ferait l'affaire, mais je ne maîtrise pas du tout l'api drupal (encore), donc ne connait pas l'utilisation des boucles taxonomy_get_tree and co, sans parler de la gestion optimale du cache car se serait pas mal que l'on ne recalcule pas tout à chaque fois (ça suivrait car le nombre de termes ne dépassera pas 20 et il y aura moins de 100 articles par ans.

Je pose la question ici car il me semble invraisemblable que ça n'existe pas déjà, et en même temps, j'ai passé des heures en recherche donc :s.

Merci d'avance de m'avoir lu jusqu'ici, et merci +1 si quelqu'un a une solution à me proposer.

Cordialement,

Bastien

ps : en lisant des articles sur ce forum, j'ai découvert que drupalfr(+ance) avait aidé à réaliser rue89. J'ignorais qu'il était fait avec Drupal, mais en tout cas félicitations aux dévs/chef de projet/maitre d'ouvrage etc.

ps 2 : pas sur d'avoir posté au bon endroit. Mes excuses aux modérateurs si c'est le cas.

Version de Drupal : 

Peut-être une solution,
tu peux te servir du menu primary-links (en utilisant taxonomy menu), ensuite tu peux mettre ton menu dans un bloc, et grace au module sliced menu tu peux mettre chaque niveau du menu dans des blocs différents.
Je ne sais pas si j'ai répondu à ta question (ou à une partie), j'espère!

merci de ta réponse cac.

Mais avec cette solution j'ai l'impression qu'on perds l'automatisme. Par exemple avec SPIP j'ai fait le menu de ce site : http://www.hsc-bgv.com/ . J'ai défini quelles catégories je ne voulais pas qu'il prenne en compte et derrière rouler jeunesse tout se fait tout seul.

Pour faire très très crade, mais vite, je viens de coder ceci :

<?php $vocabularies = taxonomy_get_vocabularies();
echo
"<ul class='menu dhtml_menu'>";

// array des vid a ne pas prendre en compte
$exclude = array();

$i=200;
foreach (
$vocabularies as $vocabulary) {
  if (!
in_array($vocabulary->vid,$exclude))
   {
      echo
"<li id='menu-sub$i' class='menutitle expanded'>".l($vocabulary->name, "",array("style"=>'padding-left: 2em; margin-left: -2em; z-index: 2;'));
      
$tree = taxonomy_get_tree($vocabulary->vid);
        echo
"<div class='submenu' id='sub$i'>";
       echo
"<ul class='menu dhtml_menu'>";
    
$i++;
 
       foreach (
$tree as $term) {
        
// we're just fetching node titles and a few other fields here.
          
echo "<li id='menu-sub$i' class='menutitle expanded'>".l($term->name, "taxonomy/term/".$term->tid,array("style"=>'padding-left: 2em; margin-left: -2em; z-index: 2;'));
        
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid = '. $term->tid .' AND n.status = 1 ORDER BY n.changed';
           
$result = db_query(db_rewrite_sql($sql));
          echo
"<div class='submenu' id='sub$i'>";
          
$i++;
     
           echo
"<ul class='menu dhtml_menu'>";
         while (
$node = db_fetch_object($result)) {
             echo
"<li class='leaf'>".l($node->title, "node/".$node->nid)."</li>";  
         }
          echo
"</ul></div></li>";
       }
      echo
'</ul></div></li>';
   }
 
}
echo
"</ul>";
?>

L'avantage c'est que ça fait ce que je souhaite. L'inconvénient, c'est que je manque encore de pratique du coup :
* l'id à partir de 200, j'ai mi ça au hasard car je sais pas récupérer le numéro en cours.
* ce n'est pas sous forme de module (encore), donc ça reste du php moche dans un block
* je ne choisis pas encore les exclus, mais ça va être super simple ça.
* à mon avis, il y a des lourdeurs...
* j'utilise dhtml_menu à la mano donc en nommant comme il faut les boucles. J'ignore s'il y a une API dhtml qui me permet de faire ça automatiquement.
* tout est ouvert par défaut, pas certain que ça va m'aller longtemps.
* la position ouverte/fermée de l'arbre n'est pas sauvegardée.

Si des experts passent par là et peuvent me nettoyer tout ça, ce serait adorable de leur part

Nouvelle proposition : seul les term déroulent, les vocabulaires sont des titres h2.

<?php $vocabularies = taxonomy_get_vocabularies();

// array des vid a ne pas prendre en compte
$exclude = array(3);

$i=200;
foreach (
$vocabularies as $vocabulary) {
    if (!
in_array($vocabulary->vid,$exclude))
   {
     
$tree = taxonomy_get_tree($vocabulary->vid);

       // titre de la rubrique
       
echo "<h2 class='menu_perso'>".$vocabulary->name."</h2>";
        
          
      
// parcours des sous-rubriques
    
echo "<ul class='menu dhtml_menu'>";
     foreach (
$tree as $term) {
        
// we're just fetching node titles and a few other fields here.
          
echo "<li id='menu-sub$i' class='menutitle expanded'>".l($term->name, "taxonomy/term/".$term->tid,array("style"=>'padding-left: 2em; margin-left: -2em; z-index: 2;'));
        
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid = '. $term->tid .' AND n.status = 1 ORDER BY n.changed';
           
$result = db_query(db_rewrite_sql($sql));
          echo
"<div class='submenu' id='sub$i'>";
          
$i++;
     
           echo
"<ul class='menu dhtml_menu'>";
         while (
$node = db_fetch_object($result)) {
             echo
"<li class='leaf'>".l($node->title, "node/".$node->nid)."</li>";  
         }
          echo
"</ul></div></li>";
       }
      echo
'</ul>';
  }
 
}
?>

arg désolé... Pas fait exprès mais c'est vrai que quand j'ai lu l'info sur rue89, ce n'était pas du tout le but de mes recherhes.

Donc félicitations drupalfrance.

Mais... tu penses quoi de mon script ?