Polyhiérarchie

Ce plugin permet de rattacher un article ou une rubrique à plusieurs rubriques parentes.

Hiérarchie unique ou multiple ? les deux !

Une unique rubrique, sinon c’est le bazar !
Par défaut, SPIP ne permet qu’une hiérarchie simple, qui consiste à associer chaque élément éditorial à un unique parent. Ceci résulte d’une volonté de contraindre le webmestre à structurer son site sainement.

En effet, le besoin de faire apparaître un contenu à deux endroits du site relève souvent d’une classification pas aboutie et d’une navigation mal pensée. Contraindre le webmestre à choisir une unique rubrique l’oblige donc à un minimum de réflexion sur l’arborescence du site, et évite la tentation des liens transverses multiples qui conduisent rapidement au capharnaüm.

Ainsi par défaut, SPIP ne permet de fabriquer que des sites bien rangés, avec une arborescence dont la hiérarchie stricte permet de ne pas se perdre.

Mais la polyhierarchie, c’est bien utile...
On parle de polyhierarchie [1] dès lors qu’un contenu est rattaché à plusieurs parents.

Il est parfois impossible de classer certaines données en arborescence, tel que le propose SPIP, sans perdre beaucoup en terme de compréhension ou de navigation. Pour illustrer un tel besoin, on peut lire les discussions sur la catégorisation hiérarchique dans Wikipedia qui en arrive à la conclusion que les liens hiérarchiques n’ont pas leur place dans une encyclopédie digne de ce nom, ou apprécier le cas, plus trivial, du classement de recettes de cuisine qui sont liées chacune à plusieurs ingrédients, à plusieurs type de plat, etc.

Dans ces cas-là, l’arborescence stricte imposée par SPIP est une limite gênante et les contournements habituellement utilisés (article virtuel, alias d’article, recopie de l’article) sont plus ou moins adaptés, plus ou moins pratiques et souvent lourds à l’usage.

Principe du plugin polyhierarchie

Le plugin permet de créer des liens hiérarchiques transversaux en rattachant articles et rubriques à plusieurs rubriques.

Dans la base de données, chaque article et rubrique conserve son unique parent principal, ce qui permet de désinstaller le plugin sans dommages pour le site.

Les liens secondaires vers les autres rubriques sont stockés dans une table annexe. Ils sont utilisables via des critères de boucle spécifiques.

On peut donc parler, pour chaque objet

  • d’une arborescence principale, qui permet d’accéder le plus directement au contenu. On appellera “liens directs” les liens qui constituent cette arborescence principale. Ce sont les liens en trait continus sur l’exemple ci-dessus.
  • d’une ou plusieurs arborescences complémentaires ou secondaires qui permettent d’accéder au contenu de façon indirecte. On parlera de liens indirects. Ce sont les liens en traits pointillés sur l’exemple ci-dessus.

Les termes « direct » et « indirect » seront utilisés dans les critères pour distinguer les deux types de liens pour les parents et les enfants.

En résumé, on peut retenir que les liens directs constituent l’arborescence principale de SPIP, qui est maintenue, même en l’absence du plugin. Les chemins secondaires constitués des liens indirects sont des navigations complémentaires ou transversales, qui ne seront utilisables que si le plugin est actif.

Utilisation dans l’espace privé

Dans l’espace privé, l’arborescence principale reste la référence. Mais les liens indirects permettent des navigations transversales utiles pour l’organisation du site.

Édition d’un article ou une rubrique
Lors de l’édition d’un article ou d’une rubrique, le sélecteur de rubrique par défaut est remplacé par un système de sélection multiples.

La première rubrique de la liste est celle de l’arborescence principale. Les suivantes constituent l’arborescence secondaire. Il est possible de changer l’ordre des rubriques par simple glisser-déplacer pour modifier la rubrique parente directe.

Le lien « ajouter » permet de faire apparaitre le navigateur de rubrique pour sélectionner une rubrique supplémentaire.

Il suffit de cliquer sur le « + » en regard d’une rubrique pour l’ajouter aux parents sélectionnés.

Le champ « Ajout rapide » permet d’indiquer un id_rubrique pour l’ajouter sans chercher dans l’arborescence. Il suffit d’entrer rubX (où X est l’id_rubrique) dans le champ et de cliquer sur Ajouter.

Chemins secondaires
Lorsqu’un article a plusieurs parents, le chemin affiché en haut est celui qui constitue l’arborescence principale. Les parents indirects sont également listés après la mention « Egalement dans les rubriques ».

Les liens permettent d’aller vers ces rubriques parents secondaires.

Contenus secondaires d’une rubrique
Dans une rubrique qui contient des enfants indirects, ceux-ci sont listés dans la marge latérale.

Comme précédemment, les liens permettent de naviguer vers ces contenus secondaires pour les modifier.

Utilisation dans les squelettes

L’utilisation de la polyhierarchie suppose que les squelettes soient conçus pour gérer les possibilités de navigation transversales. Pour cela, le plugin mets à disposition du webmestre plusieurs critères permettant de naviguer dans les arborescences multiples.

La boucle HIERARCHIE
La boucle HIERARCHIE n’est pas modifiée. Elle permet donc de dérouler le chemin principal d’une rubrique.

Le critère {branche}
Le critère {branche} est étendu. Il englobe par défaut les éléments liés indirectement aux rubriques de la branche, mais sans parcourir les rubriques enfants indirectes.

Dans une boucle RUBRIQUES, les rubriques rattachées indirectement à la branche directe seront donc inclues, mais pas parcourues (leurs enfants ne seront donc pas inclus)

<ul>
<BOUCLE_branche2(RUBRIQUES){branche #ID_RUBRIQUE}>
	<li>#ID_RUBRIQUE-#TITRE</li>
</BOUCLE_branche2>
</ul>
branche
branche

Appliqué à la rubrique d' du schéma ci-dessus, le critère {branche} donnerait donc la liste b, g', f', h, e

Dans une boucle ARTICLES, les articles rattachés indirectement sont inclus, mais pas les articles enfants d’une rubrique rattachée indirectement.

Par ailleurs, l’écriture {branche #ID_RUBRIQUE} est acceptée.

Le critère {branche_complete}
Le critère {branche} est donc complété par un critère {branche_complete} qui inclut cette fois tous les contenus trouvés en parcourant toutes les branches principales et secondaires.

<ul>
<BOUCLE_branche_complete3(ARTICLES){branche_complete #ID_RUBRIQUE}>
	<li>#ID_ARTICLE-#TITRE</li>
</BOUCLE_branche_complete3>
</ul>
branche complete
branche complete

Appliqué à la rubrique d' du schema ci-dessus, le critère {branche_complete} donnerait donc la liste b, g',a, c, f', h, e

L’écriture {branche_complete #ID_RUBRIQUE} est acceptée.

Le critère {branche_principale}
Symétriquement, le critère {branche_principale} permet de réduire la sélection aux éléments de l’arborescence principale uniquement. Ce critère permet donc de retrouver les enfants de la branche principale classique de SPIP.

branche principale
branche principale

Appliqué à la rubrique d' du schéma ci-dessus, le critère {branche_principale} donnerait donc la liste g', f', h, e

Le critère {enfants}
Il permet de sélectionner les enfants d’une rubrique. Il peut s’utiliser sur une boucle RUBRIQUES, ARTICLES, ou tout autre boucle contenant un champ id_rubrique, même si la polyhierarchie ne s’y applique pas.

Il peut s’écrire {enfants} et prendra alors l’#ID_RUBRIQUE dans le contexte ou dans la boucle englobante, ou explicitement {enfants #ID_RUBRIQUE} ou encore {enfants #LISTE{12,23,36}} pour cibler plusieurs rubriques.

enfants
enfants

Appliqué à la rubrique d' du schéma ci-dessus, le critère {enfants} donnerait donc la liste b, g'

Le critère {enfants_directs}
Il fonctionne comme le critère {enfants}, mais permet de restreindre la sélection aux enfants directs.

enfants directs
enfants directs

Appliqué à la rubrique d' du schéma ci-dessus, le critère {enfants_directs} donnerait un seul résultat g'

Le critère {enfants_indirects}
Il fonctionne comme le critère {enfants}, mais permet de restreindre la sélection aux enfants indirects.

enfants indirects
enfants indirects

Appliqué à la rubrique d' du schéma ci-dessus, le critère {enfants_indirects} donnerait un seul résultat b

Le critère {parents}
Il permet de sélectionner les parents d’une rubrique, d’un article, ou de tout autre contenu. Il ne peut s’utiliser que sur une boucle RUBRIQUES.

Il ne peut s’écrire que {parents} et fait référence à l’élément de la boucle englobante.

parents
parents

Appliqué à la rubrique b du schéma ci-dessus, le critère {parents} donnerait donc la liste d, d'

Le critère {parents_directs}
Il fonctionne comme le critère {parents}, mais permet de restreindre la sélection aux parents directs (un seul dans la pratique !)

parents directs
parents directs

Appliqué à la rubrique b du schéma ci-dessus, le critère {parents_directs} donnerait donc la liste d

Le critère {parents_indirects}
Il fonctionne comme le critère {parents}, mais permet de restreindre la sélection aux parents indirects.

parents indirects
parents indirects

Appliqué à la rubrique b du schéma ci-dessus, le critère {parents_indirects} donnerait donc la liste d'

Publication des rubriques

Par défaut, dans SPIP, une rubrique n’est visible dans l’espace public et dans les boucles que si elle contient des objets publiés.

Avec polyhiérarchie, à partir de la version 0.3.0 du plugin, si une rubrique ne contient aucun contenu direct, mais des articles ou rubriques indirects publiés, la rubrique sera alors publiée et visible dans l’espace public.

Pour résumer

Le plugin met a disposition tous les outils pour concevoir et développer avec SPIP des sites faisant appel à la polyhiérarchie.

Cela peut aller de simples cas où les articles sont ponctuellement présent dans une seconde rubrique, à des cas complexes faisant un usage avancé de la polyhierarchie.

Dans tous les cas, il convient de bien réfléchir préalablement à la classification des données du site, et de ne pas se précipiter dans une organisation approximative au prétexte que le plugin permet ensuite de faire des liens transversaux.

Le plugin met a disposition des outils et des possibilités, mais c’est au webmestre de veiller ensuite à l’usage qui en sera fait !

Et après ?

Cette première version du plugin a pour but d’évaluer le concept et les limites qu’il faudra lui poser éventuellement.

En fonction des usages il pourra être utile d’enrichir le plugin avec des possibilités de configuration (par exemple pour ne permettre la polyhierarchie que sur les articles), ou des contrôles de sécurité (par exemple ne pas mettre un contenu dans une rubrique et dans sa parente, ne pas créer de navigation circulaire ...).

Footnotes

[1La définition du terme est disponible dans la version allemande de Wikipedia (polyhierarchie), tandis que ce terme brille par son absence dans la version française de l’encyclopédie malgré un usage certain dans la langue française!

Ce plugin nécessite SPIP Bonux

updated on 2 October 2019

Discussion

86 discussions

  • Pour garder une trace d’IRC.

    Je suis tombé sur un problème avec polyhiérarchie, un peu particulier. Cela concerne (au moins) les critères {parents ID}.

    Le problème surgit lorsqu’on veut afficher les différentes rubriques d’un objet (un article en l’occurrence), mais que la boucle ayant le critère {parents ID} n’est pas directement dans la boucle de l’objet, et particulièrement si elle descend d’une rubrique.

    Le critère teste actuellement

    $boucle = &$boucles[$idb];
    $boucle_parent = $boucles[$boucle->id_parent];$boucle_parent->type_requete == 'rubriques' ? 'id_parent' : 'id_rubrique'in_array($boucle_parent->type_requete,)

    Cela fonctionne donc uniquement si la boucle parente est du même type que l’identifiant ID que l’on passe au critère. Du coup, dans certains cas ça va pas :

    Exemple

    <BOUCLE_article(ARTICLES){id_article}>
    <BOUCLE_rub_principale(RUBRIQUES){id_rubrique}>
    <BOUCLE_rubs_secondaires(RUBRIQUES){parents_indirects #_article:ID_RUBRIQUE}>
    … Ici c'est pas bon ! …
    </BOUCLE_rubs_secondaires>
    </BOUCLE_rub_principale>
    </BOUCLE_article>

    Cet exemple fonctionne si on enlève la boucle «_rub_principale».

    C’était juste pour le signaler :)

    Reply to this message

  • 1

    Bonjour,

    Super plugin que j’utilise très souvent.

    Question : Est-il possible d’avoir les critères “branche_directe” et “branche_indirecte” ?

    Merci

    Robert

    Reply to this message

  • 1

    “Mysql utilise bien la clé primaire sur la table spip_rubriques_liens, mais pour la partie spip_rubriques, c’est un scan complet de la table à chaque fois. Ca n’a l’air de rien, mais quand c’est fait plusieurs fois par seconde sur un gros site, ça impacte pas mal” peut-on lire en 2009 sur une liste de discussion spip.net au sujet de ce plugin (http://comments.gmane.org/gmane.comp.web.spip.zone/14165).

    Je rencontre ce même problème “d’optimisation des requêtes mysql” avec donc des “slow logs” nombreux sur les boucles faisant appel à la polyhiérarchie. Avec le version 2.0.4 du plugin et spip 3.0.5.

    Cédric, le problème mis en avant par Simon en 2009 (http://permalink.gmane.org/gmane.comp.web.spip.zone/14585) n’aura donc pas été résolu?

    Quelqu’un aurait-il trouvé une solution pour utiliser la polyhérarchie sur un gros site sans faire exploser son serveur?

    • C’est un point faible connu du plugin, en effet. J’avais en projet une amélioration à base de Closure Table mais pas eu le temps (ni encore le besoin) d’explorer cette solution (qui demande certainement des adaptations pour fonctionner en polyhierarche).

      J’ai un site en production avec ce plugin qui a beaucoup de trafic, sans problème critique de performance, mais je pense que c’est lié aussi à la volumétrie de la base qui est assez raisonable dans mon cas.

    Reply to this message

  • 1

    Bonjour,

    Tout d’abord, toutes mes félicitations pour cet excellent plugin.

    J’aimerais savoir s’il est possible d’appliquer la polyhiérarchie à un site référencé afin qu’un même site référencé puisse être associé à plusieurs rubriques (afin de ne pas créer x fois le même site référencé lorsque l’on souhaite qu’il apparaisse dans plusieurs rubriques).

    Si le plugin actuel ne le permet pas, est-ce qu’une évolution en ce sens du plugin est prévue prochainement ?

    • Bonjour,

      N’ayant pas eu de réponses à mon précédent message, je me permets de vous solliciter à nouveau pour savoir si certains d’entre vous ont réussi à appliquer, grâce à cet excellent plugin, la polyhiérarchie sur les sites référencés ?

      Merci d’avance pour vos retours.

    Reply to this message

  • 1

    Deux bugs curieux, avec la version pour SPIP 3 du jour :

    <BOUCLE_autre_secteur(RUBRIQUES){parents_indirects}{logo}>

    produit Fatal error: Call to undefined function BOUCLE_autre_secteurhtml_a66e316f9ceba89ce9f3de8f8be91225() in /Users/maieul/Sites/SPIP/ecrire/public/composer.php(76)

    de même que

    <BOUCLE_autre_secteur(RUBRIQUES){parents_indirects}{racine}>

    (je voulais selectionné les rubriques situés à la racine et qui étaients parentes de la rubrique courante)

    • autant pour moi, il semblerait que cela soit du tout betement au fait qu’il faille mettre cela dans une boucle rubrique engloblante (pas capable de prendre le #ID_RUBRIQUE dans l’environnement)

    Reply to this message

  • 1

    Fantastique plugin !

    J’essaie une chose. Et bien sûr n’y arrive pas.

    Je veux afficher l’indication pour un article de son parent direct, puis de son parent indirect.

    J’ai essayé la successions de boucles suivantes :

    <BOUCLE_direct(RUBRIQUES){id_rubrique}{parents_directs}><a href="#URL_RUBRIQUE">#TITRE</a></BOUCLE_direct>
    
    <BOUCLE_indirect(RUBRIQUES){id_rubrique}{parents_indirects}><a href="#URL_RUBRIQUE">#TITRE</a></BOUCLE_indirect>

    Mais seule la rubrique directe s’affiche.

    Une idée ?

    Merci

    Reply to this message

  • Est-ce qu’il est possible de classer dans le selecteur les titres par ordre alphabétique ?

    Reply to this message

  • joseph-tux

    Et les brèves ?

    Bonjour
    Une idée et une réalisation vraiment très utile.

    Y aurait-il un obstacle à appliquer ce principe aux “brèves”, ( qui permettent, par exemple, d’appliquer une annonce sans surcharger les menus ) ?
    Sinon, peut-on espérer voir cette fonctionalité dans une prochaine version ?

    Encore bravo, et surtout merci.

    ( cf dans cette page , la liste des articles constitue l’essentiel, et en dessous, la liste des brèves, que j’aimerais pouvoir reproduire ainsi très simplement dans les autres pages des rubriques. )

    Reply to this message

  • tom.nageur

    Bonjour
    J’utilise menu babibel. Comment faire pour que la polyhérarcie soit afficher dans le menu déroulant?

    Reply to this message

  • 2
    Figoolu

    Bonjour,

    Est-ce que une version du plugin pour spip3 est prévue, ou en cours de réalisation?
    Ce plugin m’est très utile et j’aimerai pouvoir passer à la nouvelle version de spip.

    • Oui, ce plugin sera-t-il rendu compatible avec la version 3 de spip??

    • Je viens de mettre l’article à jour avec la version du plugin pour SPIP 3.0

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom