Criterios : junturas automáticas
Como está bien explicado en el artículo de Programar
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é.
o sea
Cuando, en un bucle, está especificado un criterio que no pertenece a la tabla del bucle, SPIP prueba automáticamente de encontrar una tabla relacionada que contiene el campo pedido.
En el ejemplo dado, la juntura se hace automáticamente entre las tablas spip_documents y spip_documents_liens que contiene el campo “vu” :
<BOUCLE_doc(DOCUMENTS){0,10}{vu=oui}>
- #FICHIER<br />
</BOUCLE_doc>
OjO : la juntura automática solo concierne los criterios, no las balizas : en el ejemplo de arriba, no se podría utilizar #VU en el cuerpo del bucle !
Criterios : forzar una juntura
En el ejemplo de arriba, se hubiera podido forzar la juntura especificando la tabla a utilizar, de la manera siguiente :
<BOUCLE_doc(DOCUMENTS){0,10}{documents_liens.vu=oui}>
- #FICHIER<br />
</BOUCLE_doc>
Una otra manera de hacer, menos recomendable (menos general, y necesita una declaración), es de utilizar una excepción de juntura. Se declara por ejemplo en el pipeline declarer_tables_interfaces
por :
$interface['exceptions_des_jointures']['vu_documents'] = array('spip_documents_liens', 'vu');
y luego se utiliza en el bucle
<BOUCLE_doc(DOCUMENTS){0,10}{vu_documents=oui}>
- #FICHIER<br />
</BOUCLE_doc>
OjO : en este caso también, la juntura solo funciona para los criterios, y no sirve para las balizas ! Ver por ejemplo http://permalink.gmane.org/gmane.comp.web.spip.devel/60476.
Balizas : forzar la juntura
Para utilizar las balizas de una otra tabla que la tabla del bucle, se necesita si o si forzar la juntura en el esqueleto de manera explicita. Por ejemplo, para mostrar el valor del campo vu
utilizando la baliza #VU
:
<BOUCLE_doc(DOCUMENTS spip_documents_liens){0,10}{vu=oui}>
- #FICHIER (#VU)<br />
</BOUCLE_doc>
Está manera de forzar explícitamente la juntura permite también de hacer funcionar el criterio {vu=oui}
.
OjO : la declaración de excepción de juntura descrita más arriba no permite de declarar nuevas balizas. En el ejemplo asociado “vu_documents” solo es un alias para los criterios !
Balizas : campos homónimos
En el caso particular donde se quiere mostrar un campo de la tabla junta que tiene el mismo nombre de un campo de la tabla del bucle, es necesario utilizar dos bucles. Por ejemplo, las dos tablas spip_documents y spip_articles tienen un campo titre
. En un bucle de documentos, para mostrar el nombre de un archivo y el título del artículo asociado, hay que hacer :
<BOUCLE_image(DOCUMENTS){id_article}>
<BOUCLE_article(ARTICLES){id_article}>
#_image:FICHIER - #_article:TITRE
</BOUCLE_article>
</BOUCLE_image>
o de manera más simple (en la escritura, porque una segunda pedida SQL estará creada de toda manera) :
<BOUCLE_image(DOCUMENTS){id_article}>
#FICHIER - #INFO_TITRE{article, #ID_ARTICLE}
</BOUCLE_image>
Para información, el bucle siguiente mostraría el título del documento, no del artículo :
<BOUCLE_image(DOCUMENTS){id_article}>
#FICHIER - #TITRE
</BOUCLE_image>
En efecto, SPIP calcula una baliza :
- en un primer tiempo buscando el campo que corresponde en la tabla principal del bucle donde se encuentra,
- luego, si ningún campo fue encontrado, en las tablas juntas.
A notar : en SPIP, para las balizas, no existe una notación del tipo #articles.TITRE
como se podría ver en SQL, o como se puede hacer para los criterios (ver más arriba).
Declaración de junturas
Para declarar una juntura en la declaración de una tabla, los campos de la juntura tienen que estar insertados :
- en
'key'
, que lista las llaves (primaria y otras), - o en
'join'
, que lista los campos para las junturas.
Por ejemplo, en el pipeline trucs_declarer_tables_principales
de un objeto llamado truc
, el código siguiente declara id_truc
como llave primaria, lo que permitirá las junturas sobre este campo :
$tables_principales['spip_trucs']['key'] = array("PRIMARY KEY" => "id_truc");
y el código siguiente declara que los dos campos id_auteur
y id_traducteur
de la tabla utilizaran el campo id_auteur
de la otra tabla en caso de juntura :
$tables_principales['spip_trucs']['join'] = array("id_auteur" => "id_auteur", "id_traducteur" => "id_auteur");
A notar : estas mismas declaraciones pueden estar hechas en el archivo mes_options.php
por :
$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 : |