Critères : jointures automatiques
Comme l’explique bien l’article de Programmer
Lorsque dans une boucle il est demandé un critère qui n’appartient pas à la table de la boucle, SPIP essaie automatiquement de trouver une table liée qui contient le champ demandé.
Dans l’exemple donné, la jointure se fait automatiquement entre les tables spip_documents et spip_documents_liens à laquelle appartient le champ “vu” :
<BOUCLE_doc(DOCUMENTS){0,10}{vu=oui}>
- #FICHIER<br />
</BOUCLE_doc>
Attention : la jointure automatique ne concerne que les critères, pas les balises : dans l’exemple ci-dessus, on ne pourrait pas utiliser #VU dans le corps de la boucle !
Critères : forcer une jointure
Dans l’exemple cité plus haut, on aurait pu forcer la jointure en spécifiant la table à utiliser, de la manière suivante :
<BOUCLE_doc(DOCUMENTS){0,10}{documents_liens.vu=oui}>
- #FICHIER<br />
</BOUCLE_doc>
Une autre manière de faire, moins recommandée (moins générique, et nécessite une déclaration), est d’utiliser une exception de jointure. On la déclare par exemple dans le pipeline declarer_tables_interfaces
par :
$interface['exceptions_des_jointures']['vu_documents'] = array('spip_documents_liens', 'vu');
puis on l’utilise dans la boucle
<BOUCLE_doc(DOCUMENTS){0,10}{vu_documents=oui}>
- #FICHIER<br />
</BOUCLE_doc>
Attention : dans ce cas également, la jointure ne fonctionne que pour les critères, pas les balises ! Voir par exemple http://permalink.gmane.org/gmane.comp.web.spip.devel/60476.
Balises : forcer la jointure
Pour utiliser les balises d’une autre table que la table de la boucle, il faut absolument forcer la jointure dans le squelette de manière explicite. Par exemple, pour afficher la valeur du champ vu
grâce à la balise #VU
:
<BOUCLE_doc(DOCUMENTS spip_documents_liens){0,10}{vu=oui}>
- #FICHIER (#VU)<br />
</BOUCLE_doc>
Cette manière de forcer explicitement la jointure permet aussi de faire fonctionner le critère {vu=oui}
.
Attention : la déclaration d’exception de jointure décrite plus haut ne sert pas à fabriquer de nouvelles balises. Dans l’exemple associé “vu_documents” n’est qu’un alias pour les critères !
Balises : champs homonymes
Dans le cas particulier où on veut afficher un champ de la table jointe ayant le même nom qu’un champ de la table de la boucle, il est nécessaire d’utiliser deux boucles. Par exemple, les tables spip_documents et spip_articles ont toutes les deux un champ titre
. Dans une boucle de documents, pour afficher le nom du fichier et le titre de l’article associé, il faut faire :
<BOUCLE_image(DOCUMENTS){id_article}>
<BOUCLE_article(ARTICLES){id_article}>
#_image:FICHIER - #_article:TITRE
</BOUCLE_article>
</BOUCLE_image>
ou plus simplement (à l’écriture, parce qu’une deuxième requête sera créée de toute manière) :
<BOUCLE_image(DOCUMENTS){id_article}>
#FICHIER - #INFO_TITRE{article, #ID_ARTICLE}
</BOUCLE_image>
Pour information, la boucle suivante afficherait le titre du document, et pas de l’article
<BOUCLE_image(DOCUMENTS){id_article}>
#FICHIER - #TITRE
</BOUCLE_image>
En effet, SPIP calcule une balise :
- premièrement en cherchant le champ correspondant dans la table principale de la boucle où elle se trouve,
- puis, si aucun champ n’est trouvé, dans les tables jointes.
A noter : dans SPIP, pour les balises, il n’existe pas de notation du type #articles.TITRE
comme on pourrait le voir en SQL, ou comme on peut le faire pour les critères (voir plus haut).
Déclaration des jointures
Pour déclarer une jointure dans la déclaration d’une table, il faut que les champs de la jointure soient insérés :
- dans
'key'
, qui liste les clés (primaire et autres), - ou dans
'join'
, qui liste les champs pour les jointures.
Par exemple, dans le pipeline trucs_declarer_tables_principales
d’un objet appelé truc
, le code suivant déclare id_truc
comme clé primaire, ce qui permettra les jointures sur ce champ :
$tables_principales['spip_trucs']['key'] = array("PRIMARY KEY" => "id_truc");
et le code suivant déclare que les deux champs id_auteur
et id_traducteur
de la table utiliseront le champ id_auteur
de l’autre table en cas de jointure :
$tables_principales['spip_trucs']['join'] = array("id_auteur" => "id_auteur", "id_traducteur" => "id_auteur");
A noter : ces mêmes déclarations peuvent être faites dans le fichier mes_options.php
par :
$GLOBALS['tables_principales']['spip_trucs']['key'] = array("PRIMARY KEY" => "id_truc");
$GLOBALS['tables_principales']['spip_trucs']['join'] = array("id_auteur" => "id_auteur", "id_traducteur" => "id_auteur");
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |