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

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

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

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

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

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

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 peut s’écrire {parents} et fait référence à l’élément de la boucle englobante, ou {parents #GET{id_rubrique}} et fait référence à la valeur passée, ou {parents #LISTE{12,23,36}} .

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

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

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 ...).

Notes

[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

Discussion

97 discussions

  • raphaailes

    Bonjour à tous,

    J’ai installé ce plugin, qui semble absolument génial. Mais problème ...
    Une fois plusieurs rubriques appliquées à un même article dans l’espace privé, tout semble fonctionner dans l’espace privé, mais strictement rien ne se passe dans l’espace public. Mon article reste uniquement dans la première rubrique spécifiée. Si j’intervertis la rubrique n°1 mon article change de place c’est tout, mais n’apparait pas dans les 2.

    N’étant pas programmateur confirmé, je me demande si installer le plugin suffit ou si je dois inclure des morceaux de code quelquepart...

    Merci de votre aide

    le site en question : http://lascalaphe.free.fr/

    Répondre à ce message

  • Tout d’abord bonjour et félicitations à Cédric pour ce plugin qui me rend bien service :)

    J’ai une question : dans la vue ?exec=articles_tous, les articles « dupliqués via Polyhiérarchie » (ceux qu’on a référencé dans N rubriques) n’apparaissent qu’une fois, dans leur rubrique d’origine.

    Est-ce volontaire ? (pour des raisons techniques peut être)

    Répondre à ce message

  • 2

    Bonjour, J’ai installé le plugin en local et il fonctionne parfaitement ; lorsque je transfert le site en ligne j’obtiens les 3 erreurs suivante

    Erreur SQL 1146
    Table ’reseaum.spip_rubriques_liens’ doesn’t exist SELECT id_parent FROM reseaum.spip_rubriques_liens WHERE (id_objet=21) AND objet=’rubrique’
    SELECT id_parent FROM spip_rubriques_liens WHERE (id_objet=21) AND objet=’rubrique’

    Erreur SQL 1146
    Table ’reseaum.spip_rubriques_liens’ doesn’t exist SELECT rubriques.titre, rubriques.id_rubrique, rubriques.lang FROM reseaum.spip_rubriques AS rubriques WHERE (rubriques.id_rubrique IN ( SELECT rl.id_objet FROM reseaum.spip_rubriques_liens as rl WHERE rl.id_parent=21 AND objet=’rubrique’)) ORDER BY rubriques.titre
    SELECT rubriques.titre, rubriques.id_rubrique, rubriques.lang FROM spip_rubriques AS rubriques WHERE (rubriques.id_rubrique IN ( SELECT rl.id_objet FROM spipcont.spip_rubriques_liens as rl WHERE rl.id_parent=21 AND objet=’rubrique’)) ORDER BY rubriques.titre

    Erreur SQL 1146
    Table ’reseaum.spip_rubriques_liens’ doesn’t exist SELECT articles.date, articles.id_article, articles.statut, articles.id_rubrique, articles.titre, articles.lang FROM reseaum.spip_articles AS articles WHERE (articles.id_article IN ( SELECT rl.id_objet FROM reseaum.spip_rubriques_liens as rl WHERE rl.id_parent=21 AND objet=’article’)) ORDER BY articles.date DESC
    SELECT articles.date, articles.id_article, articles.statut, articles.id_rubrique, articles.titre, articles.lang FROM spip_articles AS articles WHERE (articles.id_article IN ( SELECT rl.id_objet FROM spipcont.spip_rubriques_liens as rl WHERE rl.id_parent=21 AND objet=’article’)) ORDER BY articles.date DESC

    J’avoue etre bien démunie...
    merci pour votre aide !

    • Bonjour,

      je pense que le plugin est mal installé sur ton serveur. Cela peut venir du fait que tu l’avais installé en local, et que tu as transféré un dump en ligne alors que le plugin n’etait pas encore installé. Pour réparer cela, désinstalle le plugin (il faut cliquer sur le lien « désinstaller » qui apparait au survol et non juste décocher la checkbox), puis réactive le afin qu’il se ré-installe proprement.

      Tu pourras ensuite ré-importer ton dump du site local.

    • merci Cedric ! il s’agissait bien de celà !

      J’en profite pour t’adresser toute ma reconnaissance pour toutes tes contribtions sans lesquelles je n’avancerai pas !

      Cordialement
      Jo

    Répondre à ce message

  • Olivier

    Bonjour,
    Je viens d’installer le plugins. Je vois les liens dans l’espace privé mais pas dans l’espace public.
    J’ai vidé le cache sans succès.
    N’étant pas programmateur ni administrateur confirmé, je me demande si je dois inclure les morceaux de code citer dans l’article dans un fichier particulier.
    Merci de votre aide

    Répondre à ce message

  • Benoît Labourdette

    Comment faire la mise à jour du plugin ?

    Pour faire la mise à jour de ce plugin, faut-il écraser le dossier avec la nouvelle version, comme on le fait pour la mise à jour de SPIP ?
    Car la désinstallation + réinstallation d’une nouvelle version du plugin ne marche pas très fort. En effet, la désinstallation efface toutes les informations polyhiérarchiques. Donc, après réinstallation de la nouvelle version, on a tout perdu...

    Répondre à ce message

  • 2

    Bonjour,

    j’ai utilisé avec succès ce plug in, du moins tant qu’un article est publié dans une rubrique : si je crée une rubrique qui ne contient que des articles issus de « polyhierarchisation » la rubrique est invisible par id_parent=12 (par exemple).

    Si j’ai une rubrique qui contient elle même plusieurs rubriques contenant des articles polyhierarchisés comment faire pour les lister ???

    Merci de votre aide,

    Alex

    • Les rubriques ne contenant que des enfants indirects n’etaient pas publiées.
      C’est maintenant pris en compte avec la version 0.3.0 du plugin !

      Pour corriger une rubrique non publiée à tort, il suffit d’aller sur un article indirect, et de le dépublier/republier, ou de l’enlever de la rubrique et de l’y remettre.

    • Génial ! Parfait même :-), merci !

    Répondre à ce message

  • 1

    Bonjour,

    Ce plugin est génial. Par contre, un « bug » sur une install tout en utf-8 :

    Si le nom de la rubrique contient un apostrophe à la word ’ on ne peut pas l’ajouter. L’apostrophe dans le code, est transformée en ’ sans antislash et ça coupe la chaine du titre sur le jQuery(this).item_pick

    Si l’apostrophe est un apostrophe ’, ça fonctionne, y a un antislash qui se met dans la chaine devant lui.

    Répondre à ce message

  • Exactement ce qu’il me faut !

    Je pense utiliser ce plugin dans le cadre d’une association sportive (échecs, mais bon).

    Je vais créer des rubriques par saison (compétitions 2009/2010, vie du club 2009/2010, ...) et une rubrique secondaire (Compétition, Vie du club, ...) qui pointera sur la rubrique équivalente de la saison courante (à changer chaque année).
    Ca m’évitera de déplacer chaque année des tonnes d’articles en perdant le rubriquage.

    le plugin « Menus » ne fonctionne pas sur les rubriques secondaires (il semble que remplacer id_parent=#getid_rubrique par enfants #ID_RUBRIQUE soit suffisant).

    Répondre à ce message

  • Animoodia

    Bonjour,

    Je souhaiterais utilisé ce plugin mais etant débutante dans spip, je ne sais pas ou placer la boucle...

    J’ai SPIP 2.07 et j’utilise le squelette de simple magazine.

    Voici le code de la rubrique où apparait les articles :

    <div class="left" id="main-left">
    <div class="post">
    <INCLURE{fond=inc/inc-rub}{ajax}{env}>	
    </div>
    </div>

    qui, si j’ai bien compris appelle ce code contenu dans inc-rub

    <B_art>
    				  #ANCRE_PAGINATION
    				  <BOUCLE_art(ARTICLES){id_rubrique}{par date}{inverse}{pagination 10}>
                     <div style="float: left; padding:0 10px 10px 10px;">  [<a href="#">(#LOGO_ARTICLE||reduire_image{150})</a>] </div>
    					<div class="post-title"><h2><a href="#URL_ARTICLE">#TITRE</a></h2></div>
    					<div class="post-date">
    					<BOUCLE_rub(HIERARCHIE){id_article}>
    					 - Dans  <a href="#URL_RUBRIQUE">#TITRE</a>
    					 </BOUCLE_rub>
                             <B_comment>
    					 #TOTAL_BOUCLE
    					<BOUCLE_comment(FORUMS){id_article}{plat}>
    					</BOUCLE_comment>					</div>
    					<div class="post-body">
                        <p>[(#TEXTE|couper{250})]</p>
    					<a href="#URL_ARTICLE" class="more">En savoir plus &#187;</a>
    					<div class="clearer">&nbsp;</div>
    			        </div>
    				<div class="content-separator"></div>
    			        </BOUCLE_art>
                       [<p class="pagination">(#PAGINATION)</p>]
    			       </B_art>

    Pouvez vous m’indiquer où placer la boucle ??

    Merci d’avance

    Répondre à ce message

  • 5

    J’ajoute que ça le marche pas.
    Grâce à la Polyhiérarchie, j’ai placé la sous rubrique « Sacs Bretelles liasses » créé dans la rubrique « Sacs et sachets plastiques » dans la rubrique « Test »
    Comme vous pouvez le voir sur les captures d’écran nada dans « test »

    Le code de mon menu dépliant :

    <div id='nav-container'>
    <B_rubriques>
    <ul id="nav">
    	<ul>
    	<BOUCLE_rubriques(RUBRIQUES) {racine} {par num titre, titre}>
    		<li>
    			<a href="#URL_RUBRIQUE" class="intitule">[(#TITRE|supprimer_numero|couper{80})]</a>
    
    		<B_sous_rubriques>
    		<ul>
                    <BOUCLE_branche2(RUBRIQUES){branche #ID_RUBRIQUE}>
    					<li>
    					<a href="#URL_RUBRIQUE" <BOUCLE_test_sousrub(RUBRIQUES){id_parent}{0,1}>class='daddy'</BOUCLE_test_sousrub>>[(#TITRE|supprimer_numero|couper{80})]</a><BOUCLE_re(BOUCLE_sous_rubriques)></BOUCLE_re>	
                        </li>
                    </BOUCLE_branche2>
    		</ul>
    		</B_sous_rubriques>
    		</li>
    	</BOUCLE_rubriques>
    	</ul>
    </ul>
    </B_rubriques>
    </div>

    Quelqu’un à une idée ?????

    • As tu re-calculé ton squelette ou vidé le cache de SPIP après l’installation du plugin ? Car le critère branche est redéfini, mais il faut que SPIP reconstruise le squelette avec ce nouveau critère pour que cela prenne effet.

    • Pour l’instant je teste la navigation que sur la page sommaire.
      Le vidage du cache n’y change rien.
      Qu’entends-tu par recalculé le squelette ?

      De plus, en essayant de mettre en place le plugin j’obtiens :

      Warning : strstr() expects parameter 1 to be string, array given in C :\Program Files\EasyPHP-5.3.2\www\regieemballge\ecrire\inc\texte.php408 on line

      Au dessus de la zone de gestion de la Polyhiérarchie.
       ?????????????

    • Re calculer = cliquer sur le bouton « Calcul » puis a nouveau lorsqu’il porte le label « Recalcul »

      Pour le warning, c’est un problème de compatibilité SPIP avec PHP 5.3.2. Une release 2.0.11 doit sortir très bientôt, mais sinon tu peux mettre à jour ton site avec http://files.spip.org/spip/dev/SPIP-branche-2.0.zip

    • Le bouton « Recalculer la page » ?
      J’ai fait mais marche pas

    • Ça marche toujours pas je doit être un gros mauvais...

      J’ai créé 3 rubriques et trois sous-rubriques.
      Les rubriques 1 et 2 sont accessibles par la navigation gauche et la rubrique 3 par la navigation droite.
      Je veux pouvoir accéder à la sous-rubrique 2, qui appartient à la rubrique 2, dans la rubrique 3 par la Polyhiérarchie pour ne pas la recréer.

      Quel est le process à suivre pour y parvenir.
      Puis-je transmettre mon site à quelqu’un pour qu’il me dise ou je me plante ?

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom