Les jointures dans SPIP

Encore un article sur les jointures…

Forcer les jointures

En complément de l’article https://programmer.spip.net/Forcer-des-jointures
je me note ceci (discuté sur IRC avec Marcimat)

Le problème

Dans l’utilisation du plugin Contacts & Organisation, je voulais pouvoir faire une boucle du type

  1. <BOUCLE_test(ORGANISATIONS){…}{id_mot?}>

Mais cela ne marche pas, ceci malgré le fait que le plugin Mots (à l’instar des objets Auteurs et Documents) propose un mécanisme de jointure automatique avec tous les objets.
(voir à ce propos https://zone.spip.org/trac/spip-zone/browser/_core_/plugins/mots/base/mots.php#L195)

Mais qu’est ce que le plugin Contacts & Organisation a de spécial pour que ce critère, finalement assez courant, ne passe pas ?

Why ?

Ce plugin Contacts & Organisation contient de nombreuses liaisons.

Et les déclarations de jointures faite dans ce plugin (voir https://zone.spip.org/trac/spip-zone/browser/_plugins_/contacts_et_organisations/trunk/base/contacts.php#L156 pour la table Organisations) shuntent le mécanisme de jointure automatique proposé par le plugin Mots.

Et c’est une bonne chose, car il pourrait y avoir des confusions si on utilise des critères comme objet ?id_objet ? .

Bref, je cite :

on sait que lorsqu’il y a plusieurs tables de liens réciproques, il faut préciser l’objet de destination…

The soluce au problème

Dans le cas cité plus haut la solution était donc la suivante :

  1. <BOUCLE_test(ORGANISATIONS){…}{mots_liens.id_mot?}>

En général

Vous êtes tombé sur cet article, mais cela ne résout peut être pas votre problème.

Alors, comment savoir si l’objet sur lequel vous faite une boucle à de nombreuses liaisons ?
En général, un objet est un plugin (sauf les Articles, Auteurs et Rubriques, les trois objets natifs de SPIP).
Il suffit alors de jeter un œil dans prefixe_plugin/base/prefixe_plugin.php. Si à la ligne ’tables_jointures’ vous voyez des déclarations, et bien il y a des chances que les liaisons soient automatiques pour les objets déclarés, et plus compliqués pour les autres.