Façon propre de créer un navigateur de taxonomie simple d'une profondeur arbitraire

23

J'ai passé des jours à essayer de déterminer une manière propre de procéder comme suit:

  1. Afficher une liste de tous les termes de niveau supérieur dans un vocabulaire avec des liens vers leurs termes enfants
  2. En cliquant sur un lien, accédez à une liste des enfants de ces termes.
  3. Ad infinitum jusqu'au terme de niveau le plus bas, pour lequel une liste de nœuds marqués avec ce terme sera affichée.

Cela semble être une fonctionnalité assez courante, mais je ne trouve aucune solution capable de gérer une profondeur arbitraire, en particulier si tous les arbres de termes ne descendent pas à la même profondeur.

Une solution idéale serait celle qui utilise Views 3, Contexts, EntityFieldQueries ou tout autre élément bien pris en charge dans Drupal 7.

Je suis capable de faire presque exactement ce que je veux en créant une vue simple avec trois nœuds: les relations de terme (terme, parent du terme et parent du terme) et les utiliser pour des filtres contextuels séquentiels. Le seul problème avec cela est que s'il y a un nœud avec un chemin de terme trop peu profond, il est répertorié comme "non catégorisé" et génère un lien mort. Au lieu de faire cela, j'aimerais qu'il soit lié au prochain terme enfant disponible.

beth
la source

Réponses:

23

J'ai trouvé un moyen de le faire avec uniquement le module Views. Ce n'est pas parfait - cela ne génère pas une URL agréable et un fil d'Ariane avec la lignée taxonomique comme le ferait ma solution pour une taxonomie d'une seule profondeur.

Navigateur de profondeur statique

Pour une taxonomie de profondeur statique (où tous les termes ont la même profondeur de termes enfants), vous feriez ce qui suit:

  1. Créer une vue des nœuds
  2. Ajouter une relation au terme de taxonomie (Terme)
  3. Ajouter une relation au terme de taxonomie parent, accessible via Term (Parent)
  4. Ajouter une relation au terme de taxonomie parent, accessible via Parent (Parent Parent)
  5. Répétez l'étape 4 autant de fois que nécessaire pour la profondeur de votre taxonomie.
  6. Ajoutez des filtres contextuels pour chacun et assurez-vous qu'ils sont dans le bon ordre. Définissez pour afficher un résumé lorsque le filtre n'est pas dans l'URL.
  7. Vous voudrez probablement remplacer le fil d'Ariane et le titre de chaque filtre.
  8. ???
  9. PROFIT

Navigateur à profondeur variable

Pour une taxonomie de profondeur variable (où certains arbres à terme ont des niveaux d'imbrication plus profonds que d'autres), c'est un peu plus complexe:

  1. Ajoutez un nouveau terme de niveau supérieur (Foo) à votre vocabulaire et mettez tous les autres termes en dessous.
  2. Créer une vue des termes avec une page qui affiche les noms des termes
  3. Ajouter un filtre contextuel: Terme de taxonomie: Terme parent
  4. Lorsque la valeur par défaut n'est pas dans l'URL, indiquez la valeur par défaut
  5. Définissez la valeur par défaut sur votre nom de terme de niveau supérieur (Foo)
  6. Spécifiez les critères de validation
    • Validateur: terme de taxonomie
    • Critères: votre nom de vocabulaire
    • Type de valeur de filtre: nom du terme converti en ID de terme
  7. Cliquez sur le bouton "+ Ajouter" en haut du panneau Vues pour ajouter une pièce jointe à la vue.
  8. Ajouter à cette pièce jointe uniquement (remplacer) Relation: Terme de taxonomie: Contenu avec le terme
  9. Ajouter à cette pièce jointe uniquement (remplacer) affichage: champs: titres des nœuds liés aux nœuds, et supprimer (de cette pièce jointe uniquement!) Affichage: champs: nom du terme
  10. Ajouter à cette pièce jointe uniquement (remplacer) filtre contextuel: Terme de taxonomie: Nom
  11. Lorsque la valeur du filtre n'est pas disponible, indiquez la valeur par défaut: Valeur brute de l'URL: Composant de chemin: 2 (ou plus si votre chemin de page a> 1 composant)
  12. Paramètres des pièces jointes: Joindre à: [nom de la page que vous venez de créer]
  13. ???
  14. PROFIT

Captures d'écran de l'interface utilisateur de Views pour référence: entrez la description de l'image ici

beth
la source
Bien fait! Voter à la fois la question et votre réponse - cela semble être une chose assez courante à faire et votre solution est meilleure que tout ce que j'ai trouvé lors de la première tentative de réponse.
aendrew
8
  1. Créer une vue du type Taxonomie
  2. Ajouter un filtre contextuel du type Terme de taxonomie: Terme parent
  3. Définissez Fournir la valeur par défaut et conservez-la comme fixe. donne l'ID de terme du terme parent supérieur
  4. Ajouter un ID de terme de taxonomie en tant que champ et l'exclure de l'affichage
  5. Ajouter un nom de terme de taxonomie cliquez sur mettre ce champ en lien; donnez le lien comme "chemin-vous-définissez-en-vue / [tid]"
    Remarque: Vous devez décocher "Lier ce champ à sa page de termes de taxonomie"

Lorsque vous visitez la page de visualisation, vous voyez les enfants du parent supérieur; selon l'exemple que vous obtiendrez:

  • term1
  • term2

Lorsque vous cliquez sur term1, vous obtenez les enfants. Jusqu'à ce que vous atteigniez le terme 1.1.1. Vous n'obtiendrez aucun résultat si vous cliquez sur term1.1.1 pour le moment. Pour y parvenir, nous devons créer un bloc de vue supplémentaire dans la vue ci-dessus.

  1. Ajouter un bloc
  2. Retirez le filtre contextuel existant et champ
    Remarque: Lorsque vous les supprimiez assurez-vous de sélectionner le contenu de cette page (Over Ride) dans la liste déroulante en haut à côté d' autres sages les champs et les filtres contextuels vous avez créé dans la page serait également parti .
  3. Ajouter un nouveau filtre contextuel Terme de taxonomie: ID de terme
  4. Ajouter une relation Terme de taxonomie: Contenu avec terme
  5. Ajoutez le titre du contenu et vous utilisez la relation dans le menu déroulant en haut.
  6. Enregistrez la vue et revenez à la page que nous créons (c'est important, sinon vous ne pourriez pas terminer l'étape suivante
  7. Ajouter un champ dans FOOTER OU HEADER
  8. Sélectionnez "Global: Zone d' affichage " dans la liste et sélectionnez le bloc que nous avons créé dans la liste déroulante Vue à insérer pendant que vous y êtes cochez Hériter les filtres contextuels afin que nous puissions également transmettre la valeur de cette vue au bloc
  9. Cochez Afficher même si la vue n'a pas de résultat afin que lorsque cette vue n'affiche pas le résultat, le bloc soit toujours affiché

Enregistrez la vue et vous avez terminé.

Mohammed Shameem
la source
J'ai suivi l'explication claire de Mohammed Shameem. Merci, fonctionne parfaitement !!
Steven
3

Je pense que ce que vous voulez, c'est Views Tree , un module contrib qui utilise Views pour construire un arbre de termes de taxonomie.

(Donnez-moi une seconde et je vous écrirai un rapide guide d'utilisation des champs fiscaux)

Apparemment, ce module a un problème qui l' empêche de travailler avec des termes de taxonomie. Huer.

Cela dit, j'ai trouvé le code suivant qui semble faire ce que vous voulez (vous pouvez le faire afficher / masquer des éléments via un code jQuery assez rudimentaire):

<?php

// The ID of the taxonomy vocabulary for which you'd like to create a nested list
$vid = 10;

$depth = 0;
$num_at_depth = 0;
$tree = taxonomy_get_tree($vid);

print "<ul class=\"menu\">\n<li>";
foreach ($tree as $term) {
  $diffdepth = 0;
  if ($term->depth > $depth) {
    print "\n<ul>\n<li>";
    $depth = $term->depth;
    $num_at_depth = 0;
  }
  if ($term->depth < $depth) {
    $diffdepth = $depth - $term->depth;
    while ($diffdepth > 0) {
      print "</li>\n</ul>\n";
      $diffdepth--;
    }
    $depth = $term->depth;
  }
  if (($term->depth == $depth) && ($num_at_depth > 0)) {
    print "</li>\n<li>";
  }
  print l($term->name, 'taxonomy/term/' . $term->tid);
  $num_at_depth++;
}
print "</li>\n</ul>\n";

Via " Listes de catégories imbriquées avec liens vers des pages ".

aendrew
la source
J'ai activé ce module et essayé de l'expérimenter et j'ai deux problèmes: 1. Je soupçonne qu'il vous donne juste une liste plate, pas une expérience de navigation multi-pages et 2. Je ne peux pas le faire fonctionner. Un guide serait très utile.
beth
Réponse mise à jour. Excuses, apparemment Views Tree a un problème ouvert concernant l'utilisation des termes taxonomiques. Réponse alternative publiée.
aendrew
Cela semble donner une simple liste imbriquée plutôt qu'un navigateur séquentiellement paginé.
beth
@beth - Cela suffirait-il si j'écrivais une requête jQuery qui affiche / masque les éléments de cette liste lorsque les éléments parent / enfant sont cliqués?
aendrew
Je ne veux pas que cela dépende de JavaScript.
beth
0

Si vous voulez simplement avoir un ensemble de pages dynamiques de navigation dans la taxonomie, alors j'irais de la manière suivante, nécessitant 3 vues + module d' affichage de taxonomie qui vous permet d'utiliser des vues pour afficher le contenu des taxonomy/term/%pages:

  1. Termes de niveau supérieur - liste les termes dont le parent est nul
  2. Termes de niveau intermédiaire - liste les termes dont le parent n'est PAS nul. Aucun résultat: afficher la vue n ° 3
  3. Nœuds avec termes - liste des nœuds balisés avec des termes.

Comme les vues 1 et 2 auront probablement un thème similaire, vous pouvez envisager de les fusionner en tant qu'écrans dans une seule vue - ce serait plus facile à gérer.

J'ai utilisé avec succès cette approche pour ma taxonomie. Heureusement, il était homogène à chaque niveau - une branche donnée se terminait par des feuilles (nœuds) ou des branches (termes), mais pas les deux. S'il s'agit d'une limitation, veuillez d'abord la tester.

Il s'agit bien sûr d'un "pseudo-code". Vous voudriez mettre en place des validations et des filtres, ainsi qu'un joli motif de pathauto d'aspect logique pour refléter la structure.

Artur
la source