El criterio {doublons}
se vuelve rápidamente indispensable en los esqueletos, una vez descubierto [1]. Si se utiliza de forma un poco original, permite selecciones muy interesantes que sin embargo no aparecen inmediatamente cuando se lee la documentación de base de Spip.net que nos dice:
El criterio {doublons}
o {unique}
[2]:
permite impedir la visualización de los resultados ya mostrados en otros bucles que utilicen este criterio. Estos dos criterios son rigurosamente idénticos.
¿Idénticos? ¡En absoluto! A lo largo de las versiones de SPIP, el criterio "doublons" se ha enriquecido con posibilidades adicionales:
- Se pueden nombrar los "doublons", de forma que se pueda hacer que coexistan varios en el mismo código.
- También permite hacer algunas piruetas en SPIP con anti-doublons.
Utilización básica: no mostrar elementos ya tratados en la página
Un ejemplo se nos da en el esqueleto sommaire de dist [3]
<BOUCLE_articulos_recientes(ARTICLES) {par date}{inverse} {0,2} {doublons}>
elementos a mostrar, por ejemplo #TITRE
</BOUCLE_articulos_recientes>
<BOUCLE_otros_articulos(ARTICLES) {par date}{inverse} {doublons} >
elementos a mostrar, por ejemplo #TITRE
</BOUCLE_otros_articulos>
Muestra los artículos del sitio por orden cronológico inverso Y reservando a los dos últimos artículos publicados un tratamiento particular. Como se puede ver, los bucles "_articulos_recientes" y "_otros_articulos" se construyen de la misma forma. Lógicamente, ellos deberían devolver la misma lista de artículos.
Es gracias al trabajo del criterio "doublons" que los 2 artículos más recientes, ya tratados en el primer bucle, no se reencontrarán en la lista visualizada con el bucle "_otros_articulos".
Otro uso corriente: Excluir elementos
Nuestro gran clásico: excluir a partir de una palabra clave
En la lista spip-users aparecen regularmente mensajes con este tipo de problema:
"No consigo excluir elementos en función de su palabra clave. Yo intento lo siguiente:
<BOUCLE_rubriques(RUBRIQUES) {racine} {titre_mot!=invisible}{par num titre, titre}>
pero eso no funciona"
¡Y con razón!
Lo que quiere el usuario aquí es seleccionar todas las secciones que no han recibido la palabra clave "invisible". Por tanto, lo que entiende la base de datos con {titre_mot != invisible}
, es que tiene que seleccionar todas las secciones que TIENEN una palabra clave Y que esa palabra clave es diferente de "invisible".
Y eso lo cambia todo. Porque en el resultado figurará por ejemplo una sección afectada por la palabra clave "cosita", que es diferente de "invisible" (¡OK!), incluido si la sección está ligada a la palabra clave "invisible" (¡Argh!) y no figurarán las secciones que no tengan ninguna palabra clave (¡al revés del resultado deseado!). [4]
La solución: encadenar un bucle vacío que selecciona según la palabra clave y otro bucle que devuelva los resultados utilizando el criterio {doublons}
.
Volviendo a nuestro ejemplo anterior, esto nos da lo siguiente:
<BOUCLE_exclure(RUBRIQUES) {racine} {titre_mot=invisible}{doublons}>
</BOUCLE_exclure>
Este bucle selecciona todas las secciones que tienen la palabra clave "invisible" , pero no muestra nada.
<BOUCLE_rubriques(RUBRIQUES) {racine}{par num titre, titre} {doublons}>
{efectuar el tratamiento aquí}
</BOUCLE_rubriques>
Este segundo bucle va a seleccionar gracias al criterio "doublons" todas las otras secciones y les aplicará el tratamiento elegido.
Nombrar los "doublons" para utilizar varios en el mismo archivo
Objetivo: Generar en una página de inicio la visualización de enlaces hacia los artículos y hacia los comunicados. La presentación de los dos últimos artículos publicados y de los dos últimos comunicados es diferente de los otros.
Para el ejemplo, encontramos aquí el mismo esquema ya visto con los bucles de la DIST. Aquí se trata simplemente de hacer convivir sin conflictos bucles muy parecidos. Nombrar los "doublons" evitará que las selecciones de uno interfieran en las selecciones del otro.
<BOUCLE_communiques_recents(ARTICLES) {!par date}{id_mot=1} {0,2} {doublons com}>
elementos a mostrar, por ejemplo #TITRE
</BOUCLE_communiques_recents>
<BOUCLE_autres_communiques(ARTICLES) {!par date}{id_mot=1} {doublons com} >
elementos a mostrar, por ejemplo #TITRE
</BOUCLE_autres_communiques>
<BOUCLE_articles_recents(ARTICLES) {!par date} {0,2} {doublons art}>
elementos a mostrar, por ejemplo #TITRE
</BOUCLE_articles_recents>
<BOUCLE_autres_articles(ARTICLES) {!par date} {doublons art} >
elementos a mostrar, por ejemplo #TITRE
</BOUCLE_articles>
De forma general, nombrar los "doublons" es una buena práctica para evitar cualquier confusión actual, pero también en el futuro (los esqueletos evolucionan). Es también un elemento que da legibilidad a nuestro código.
En el marco de un uso avanzado, se puede probar a utilizar balizas SPIP. Por ejemplo: {doublons #TITRE}
o incluso {doublons #_mabouboucle:TITRE}
o también {doublons (#_mabouboucle:TITRE|supprimer_numero)}
.
Utilización avanzada: anti-doublons o como constituir una pila de datos para tratar
Mecánica del anti-doublons
Aquí "doublons" va a permitir agrupar los resultados de varios bucles utilizando diferentes criterios, y "!doublons" permitirá aplicar a este conjunto de elementos el tratamiento deseado.
El esquema de utilización es el siguiente:
Se selecciona una primera serie de artículos (sin mostrar nada)...
<BOUCLE0(ARTICLES){id_mot=2}{doublons A}></BOUCLE0>
...más una segunda serie de artículos (no se muestra nada todavía)...
<BOUCLE1(ARTICLES){id_auteur=1}{doublons A}></BOUCLE1>
... se selecciona según lo que se necesite y se muestra todo gracias al anti-doublons.
<BOUCLE2(ARTICLES){par date}{!doublons A}>#TITRE<br></BOUCLE2>
Un ejemplo de anti-doublons
Objetivo: hacer un bucle que recupere los artículos de todas las secciones a excepción de las secciones 2 y 3, Y para los artículos de la sección 4, sólo los de menos de 60 días.
La solución: nos hace falta un primer bucle que buscará todos los artículos a excepción de los de las secciones 2 y 3, y también de la 4...
<BOUCLE0(ARTICLES) {id_rubrique !IN 2,3,4}{doublons tri1}></BOUCLE0>
... ya que hace falta dedicar a esta sección un segundo bucle...
<BOUCLE1(ARTICLES) {id_rubrique=4}{age<60}{doublons tri1}></BOUCLE1>
... y es en un último bucle en el que se muestra gracias al anti-doublons los artículos seleccionados con los criterios de nuestra elección.
<BOUCLE2(ARTICLES){par date}{!doublons tri1}>#TITRE<br></BOUCLE2>