Le point sur l'API de Parenté : RIP Polyhiérarchie ⚰️ ?

Bonjour à toutes et à tous,

TL;DR
J’utilise les nouvelles facultés du core pour les déclarations de parenté des objets. Je m’interroge sur l’utilisation optimale de cette API pour créer une navigation cohérente, notamment en ce qui concerne la boucle Hiérarchie. Le potentiel semble immense, ouvrant un débat sur le plugin Polyhiérarchie versus l’API de parenté et le besoin d’une hiérarchie principale pour certains usages comme la création d’urls arborescentes. Comment exploiter au mieux ces fonctionnalités ? Mes exemples de déclaration de parents sont-ils valides ? Est-on en train finalement d’intégrer un Polyhiérarchie générique dans le core de SPIP ?

Je viens de tester, avec joie, la capacité native de SPIP à permettre via l’API d’édition d’objets de déclarer des parents pouvant être d’autres types d’objets.

Dans mon cas 3 objets s’emboîtent : région > département > ville
En jouant avec les options des urls_etendues j’obtiens même des urls arborescentes parfaites pour chacun de mes objets :

$GLOBALS['url_arbo_parents']=array(
	'departement'	=> array('id_region', 'region'),
	'ville'			=> array('id_departement', 'departement')
);

C’est le paradis ! Ca ouvre le champ des possibles !
Mais que puis-je encore faire avec cette nouvelle API de parenté ?

La boucle hiérarchie

La boucle Hiérarchie s’attaque aux arborescences de rubriques, soit. Mais dans le cadre d’objets variés parents ou enfants les uns des autres, elle devient de fait inopérante.

Sur le public, on peut toujours recoder des fils d’ariane à la main selon les différents cas de parentés connus, mais pour le privé que préconisez-vous : faut-il surcharger dans ses plugins objets via …/prive/echafaudage/hierarchie/objet.sans_rubrique.html ?

En même temps, quand je vois mes urls arborescentes apparaître (via urls_etendues), j’ai comme l’impression que le travail est déjà fait quelque part : urls_etendues étant bien capable de retracer toute une lignée de parenté avec n’importe quels objets pour produire une url arborescente.

Ne pourrait-on pas mutualiser/utiliser ce qui a déjà été fait sur url_étendues pour reproduire des lignées complètes (fils d’ariane) multi-objets ?

La Polyhiérarchie VS l’API de parenté

Pour d’autres objets éditoriaux, j’utilise abondamment les capacités de Polyhiérarchie pour classer des objets comme des « personnes » ou des « objets » dans des rubriques multiples.

Dans le cas de l’API de parenté, le besoin couvert est le même que pour les Polyhiérarchies, mais ici on est agnostique de tout concept de rubrique, donc générique.

En me basant sur le ticket Documenter l’API de parenté et ses sources référencées, je (crois) comprendre plusieurs choses :

  1. la déclaration de parent sur l’API objet est un tableau de tableau, elle permet donc de déclarer plusieurs types de parents possibles pour un même objet.

  2. on lit aussi dans la merge request 71 que l’API « intègre la gestion des tables de liens en parenté »
    => je comprends que l’on peut s’affranchir d’une colonne id_clefétrangère sur la table d’un objet et plutôt aller taper dans une table de liens générique (avec un couple objet | id_objet et optionnellement une condition spécifique comme un rôle par exemple) pour retrouver les parents de l’objet.

  3. autre corollaire, on pourrait donc pour déterminer le parent d’un objet soit :

  • se baser sur une clef étrangère présente sur la table de l’objet, c’est le cas le plus simple
    ex. : id_race sur mon objet Chien avec dans la déclaration de l’objet :
$tables['spip_chiens']['parent']  = array(

	'type' => 'couleur_robe',
	'champ' => 'id_couleur_robe',

);
  • se baser sur une table de liens (+ une condition optionnelle)
    ex. : une table spip_chiens_liens

id_chien (18) | objet (« couleur_robe ») | id_objet (3) | role (« parent »)
id_chien (18) | objet ( « centres_spa » ) | id_objet (6) | role (« parent »)

Avec dans la déclaration de l’objet :

$tables['spip_chiens']['parent']  = array(

	'table' => 'spip_chiens_liens',
	'source_champ' => 'id_objet',
	'champ_type' => 'objet'
	'table_condition' => 'role="parent"',

);

Permettant à la fois d’indiquer à la fois que le Chien 18 a pour parent la couleur de robe n°3 ainsi que le centre SPA n°6.

  • se baser à la fois sur une clef étrangère ET sur une table de liens :
$tables['spip_chiens']['parent']  = array(

	# Parenté sur clef étrangère depuis table objet
	'type' => 'race',
	'champ' => 'id_race',

	# Parenté depuis table de liaison :
	'table' => 'spip_chiens_liens',
	'source_champ' => 'id_objet',
	'champ_type' => 'objet'
	'table_condition' => 'role="parent"' // Condition optionnelle de parenté

);

Permettant d’obtenir les parentés :
a) race > chien
b) couleur de robe > chien
c) centre SPA > chien

N’aurait-on pas créé une Polyhiérarchie ici !?

Avant de s’enflammer, quelqu’un saurait-il confirmer ou infirmer mon raisonnement et la validité des exemples de déclarations données ?

Enfin,

Pour qu’il puisse y avoir un fil d’Ariane principal, il faut déterminer une parenté principale…

Je soulève un autre sujet qui est lui aussi adressé par Polyhiérarchie : la hiérarchie principale est déterminée par l’id_rubrique/id_parent directement présent sur la table de l’objet traité. Et les liaisons secondaires sont traitées sur la table de liens spip_rubriques_liens.

En remontant les tickets liées à l’API de parenté, je comprends que ce sujet a lui aussi été débattu et je crois comprendre que la parenté principale est aujourd’hui « simplement » le premier éléments de parenté rencontré par l’API, donc celui que l’on déclare en premier dans l’API des objets éditoriaux ?

J’ai comme la forte impression que la parenté principale aurait pu être déterminée directement au niveau de l’objet, c’est partial certes, mais aussi simple et justifiable, car la parenté forte est logiquement au plus proche de l’objet.

Mais mon cœur balance pour plus de souplesse, et je me demande s’il n’aurait pas été possible de « simplement » ajouter une propriété « parenté principale » dans la déclaration de l’objet ou encore de disposer de deux tableaux distincts de parenté ; principale et secondaire ?

Exemple :

$tables['spip_chiens']['parent']  = array(

		
	'parent_principal' => array(
		
		# Parenté sur clef étrangère depuis table objet
		'type' => 'race',
		'champ' => 'id_race'),
			
	'parents_secondaires' => array(

		# Parenté depuis table de liaison :
		'table' => 'spip_chiens_liens',
		'source_champ' => 'id_objet',
		'champ_type' => 'objet'
		'table_condition' => 'role="parent"' // condition optionnelle de parenté
	
	)

);

Ne serait-on pas proche ici d’intégrer complètement au core de SPIP l’approche de Polyhiérarchie de manière 100% générique ?

Je passe ici sur toutes les fonctionnalités de Polyhiérarchie liées à la découverte des parents/enfants directs/indirects et du calcul des branches par profondeur, ou encore des sélecteurs génériques pour lier tous ces objets entre-eux, etc. Mais, ne serait-ce pas déjà un énorme pas de franchis ?

Bravo aux valeureuses et valeureux qui sont arrivés au bout. Au plaisir d’échanger avec vous autour de cette API passionnante et de ses perspectives futures.

Bien à vous,

Pierre-Jean

PS : désolé Polyhiérarchie, je ne veux pas ta mort mais ta mue, tu as toujours fait partie de mes préférés, il est maintenant temps de jouer dans la cours des grands.

2 « J'aime »

Bonjour,

Je n’utilise pas Polyhiérarchie.
Mais je trouve ton questionnement intéresssant.

Peut-être que @rastapopoulos aurait des choses à dire ?

1 « J'aime »

@Pierre_Jean poly parenté c’est pas pareil que poly hiérarchie :slight_smile:

Tu peux déclarer autant de parents possibles que tu veux, c’est une chose. Mais polyhiérarchie ça gère surtout… la hiérarchie avec, et donc forcément sur un objet unique (les rubriques en l’occurrence) pour pouvoir ensuite sortir en masse :

  • tous les parents d’un contenu
  • tous les enfants d’une branche entière d’un parent donné
  • tous les enfants de toutes les branches possibles d’un parent donné etc

L’intérêt de polyhiérarchie ce sont surtout tous les critères possibles pour parcourir les arbres.

2 « J'aime »

Merci pour le rebond @RealET , je me sentais seul ici :wink:

test

Pour utiliser maintenant l’API de parenté avec un peu plus de recul, j’y vois maintenant plus clair :

  1. La première parenté remontée par la fonction objet_lister_parents(), par exemple en faisant :
    #VAL{collaborateur}|objet_lister_parents{#ID_COLLABORATEUR} est aussi la première déclarée dans le tableau « parent » de l’API des objets éditoriaux.

Quand on sait ça, on peut donc déterminer que l’élément 0 du tableau retourné est le parent principal à défaut de pouvoir typer le lien de parenté dans l’API des objets. Mais ça serait bien : on rajoute une entrée type_parente/role permettant de déterminer au besoin si on a affaire à une parenté principale qui pourrait servir de hiérarchie « forte » (fil d’ariane, urls arborescentes, etc) ou bien autre chose (des sujets associés, des objets pour « explorer davantage » …) !

Dans l’un de mes cas d’usage, où je manipule des « artistes » j’ai toujours besoin d’une parenté « forte » pour déterminer mon fil d’Ariane et mon url arborescente : mes artistes sont géolocalisés avec des objets région/département/ville/nom_de_l_artiste mais j’ai aussi besoin de pouvoir établir une parenté « complémentaire » pour ne pas dire secondaire de mon objet Artiste que je veux présent dans ses Collectifs d’Artistes (un autre objet) ou encore dans ses Courants Artistiques associés (encore un autre objet).

J’imagine qu’il pourrait y avoir encore d’autres cas d’usage justifiant un typage, mais sans faire une usine à gaz, savoir à minima à quel lien de parenté se fier pour produire un fil d’Ariane me semble être un besoin très commun et important à couvrir.

  1. Ce qui manquerait ensuite, c’est de transposer les fonctions de Polyhiérarchie (calcul des branches, parents, enfants…). Ca serait sans doute plus complexe car on ne manipulerait pas uniquement des rubriques, mais une grande variété d’objets imbricables.

Je vais réaliser un nouveau fil pour aborder d’autres sujets sans plus s’égarer ici autour de l’API de Parenté et de Polyhiérarchie. …

1 « J'aime »

Bonjour @rastapopoulos ,

je n’avais pas vu ta réponse avant de poster !

Oui, c’est bien mon point :wink: Mais je ne suis pas au cœur du réacteur, et si cela me semble faisable, je ne mesure pas la complexité que cela pourrait représenter de manipuler des objets très divers (autres que des rubriques) pour aller chercher leurs parents ou enfants directs ou indirects…

C’est exactement le fond de mon interrogation, ce sont ces critères qui font toute l’ingéniosité de Polyhiérarchie et dont je ne saurais me passer sans que cela soit transposable en mode « multi-objet ».

1 « J'aime »