El criteri {doublons}
un cop descobert esdevé ràpidament indispensable pels vostres esquelets [1]. Tot i que és d’un ús un pèl curiós, permet seleccions molt interessants però que no apareixen immediatament a la lectura de la documentació de base que hi ha a Spip.net que ens diu:
El criteri {doublons}
o {unique}
[2]:
permet impedir la visualització de resultats ja mostrats en altres bucles utilitzant aquest criteri. Aquests dos criteris són rigorosament idèntics.
Idèntics? No del tot! Al llarg de les versions d’SPIP, doublons s’ha enriquit de possibilitats suplementàries:
- permet posar noms als vostres doublons, i, per tant, fer-ne coexistir diversos en un mateix codi,
- permet també fer algunes piruetes "spipiennes" amb l’anti-doublons!
Utilització de base: no tornar a trobar elements ja tractats a la pàgina
Se’ns dóna un exemple a l’esquelet sumari de la dist [3]
<BOUCLE_articles_recents(ARTICLES) {par date}{inverse} {0,2} {doublons}>
elements a mostrar, per exemple #TITRE
</BOUCLE_articles_recents>
<BOUCLE_autres_articles(ARTICLES) {par date}{inverse} {doublons} >
elements a mostrar, per exemple #TITRE
</BOUCLE_articles>
Es tracta de llistar els articles del lloc per ordre cronològic invers I de reservar als dos últims articles publicats un tractament particular. Com podeu veure, els bucles "_articles_recents" i "_autres_articles" estan construïts de la mateixa manera. Per tant, en tota lògica, han de retornar la mateixa llista d’articles.
És gràcies al treball del criteri "doublons" que els 2 articles més recents, ja tractats en el primer bucle, no els trobarem a la llista mostrada amb el bucle "_autres_articles" .
Un altre ús corrent: exclure elements
El nostre gran clàssic: exclure després d’una paraula clau
Es pot veure regularment a la llista d’usuaris d’SPIP aquest tipus de problema:
"No arribo a excloure elements en funció de la seva paraula clau. Jo provo:
<BOUCLE_rubriques(RUBRIQUES) {racine} {titre_mot!=invisible}{par num titre, titre}>
però això no funciona"
I per quina causa!
Aquí, el que vol l’usuari és seleccionar totes les seccions que no han rebut la paraula clau "invisible". Ara bé, el que comprèn la base de dades amb {titre_mot != invisible}
, és que ha de seleccionar totes les seccions que TENEN una paraula clau I que l’esmentada paraula clau sigui diferent d’"invisible".
I això ho varia tot, ja que en el resultat figurarà, per exemple, una secció a la que s’hi hagi assignat una paraula clau "bidule", per tant diferent d’"invisible" (ok!), fins i tot si la secció està lligada a la paraula clau "invisible" (arg !) i, no hi figurarà una secció que no tingui cap paraula clau (al revés del resultat desitjat!). [4]
La solució: encadenar un bucle buit que seleccioni segons la paraula clau i un altre bucle que retorni els resultats utilitzant el criteri {doublons}
.
Reprenent el nostre exemple de més amunt tindrem:
<BOUCLE_exclure(RUBRIQUES) {racine} {titre_mot=invisible}{doublons}>
</BOUCLE_exclure>
Aquest bucle selecciona totes les seccions que tenen la paraula clau "invisible" , però no mostra res.
<BOUCLE_rubriques(RUBRIQUES) {racine}{par num titre, titre} {doublons}>
{el tractament a efectuar aquí}
</BOUCLE_rubriques>
Aquest segon bucle seleccionarà gràcies al criteri doublons totes les altres seccions i els hi aplicarà el tractament escollit.
Anomenar els doublons per utilitzar-ne diversos en el mateix fitxer
Objectiu: gestionar en una pàgina d’inici la visualització d’enllaços cap a articles i cap a comunicats. La presentació dels dos últims articles publicats i dels dos darrers comunicats és diferent dels altres.
Per l’exemple, retrobem aquí el mateix esquema ja vist amb els bucles de la DIST. Es tracta simplement aquí de fer cohabitar sense conflicte bucles molt pròxims. Anomenar els doublons evitarà que les seleccions d’una interfereixin en les seleccions de l’altre.
<BOUCLE_communiques_recents(ARTICLES) {!par date}{id_mot=1} {0,2} {doublons com}>
elements a mostrar, per exemple #TITRE
</BOUCLE_communiques_recents>
<BOUCLE_autres_communiques(ARTICLES) {!par date}{id_mot=1} {doublons com} >
elements a mostrar, per exemple #TITRE
</BOUCLE_autres_communiques>
<BOUCLE_articles_recents(ARTICLES) {!par date} {0,2} {doublons art}>
elements a mostrar, per exemple #TITRE
</BOUCLE_articles_recents>
<BOUCLE_autres_articles(ARTICLES) {!par date} {doublons art} >
elements a mostrar, per exemple #TITRE
</BOUCLE_articles>
De manera general, anomenar els seus doublons és una bona pràctica per evitar tota topada actual però també en un futur (dels esquelets que evolucionen). També és un element que dóna més claredat al codi.
En el marc d’un ús avançat, podeu provar l’ús d’etiquetes SPIP. Per exemple: {doublons #TITRE}
o {doublons #_mabouboucle:TITRE}
i fins i tot {doublons (#_mabouboucle:TITRE|supprimer_numero)}
.
Ús avançat: anti-doublons o com construir una pila de dades a tractar
Mecànica de l’anti-doublons
Aquí "doublons" permetrà reunir els resultats de diversos bucles amb diferents criteris i "!doublons" aplicar a aquesta pila d’ítems els tractaments desitjats.
L’esquema d’ús és el següent:
Es selecciona una primera sèrie d’articles (no es mostra res)...
<BOUCLE0(ARTICLES){id_mot=2}{doublons A}></BOUCLE0>
...després una segona sèrie d’articles (no es mostra encara res)....
<BOUCLE1(ARTICLES){id_auteur=1}{doublons A}></BOUCLE1>
... es selecciona segons les necessitats i es visualitza tot gràcies a l’anti-doublons.
<BOUCLE2(ARTICLES){par date}{!doublons A}>#TITRE<br></BOUCLE2>
Un Exemple d’anti-doublons
Objectiu: fer un bucle que recuperi els articles de totes les seccions excepte les seccions 2 i 3, I pel que fa referència als articles de la secció 4, només aquells que tinguin menys de 60 dies.
La solució: necessitem un primer bucle que anirà a buscar tots els articles excloent els de les seccions 2, 3 però també la 4...
<BOUCLE0(ARTICLES) {id_rubrique !IN 2,3,4}{doublons tri1}></BOUCLE0>
....ja que fa falta dedicar a aquesta secció un segon bucle...
<BOUCLE1(ARTICLES) {id_rubrique=4}{age<60}{doublons tri1}></BOUCLE1>
...i és en un darrer bucle que es mostra, gràcies a l’anti-doublons, els articles seleccionats ordenats amb els criteris de la nostra elecció.
<BOUCLE2(ARTICLES){par date}{!doublons tri1}>#TITRE<br></BOUCLE2>