La idea
Digamos que a menudo utilizas la misma lista de valores en el criterio IN de un bucle. Por ejemplo, el siguiente :
<BOUCLE_art(ARTICLES){id_article IN 12,13,14,25}>
<h1>#TITRE</h1>
</BOUCLE_art>
El bucle precedente lista los artículos con ID 12, 13, 14 o 25.
Una solución para compartir tu lista en un mismo esqueleto
Una opción para comparti rsta lista es cargarla en un arreglo estático (mira este artículo. Podemos usarlo varias veces sobre el mismo esqueleto (lo que facilita el mantenimiento). Por ejemplo :
[(#SET{miarreglo,#ARRAY{0,12,1,13,2,14,3,25}})]
<BOUCLE_art1(ARTICLES){id_article IN #GET{miarreglo}|sinon{0}}{par hasard}>
<h1>#TITRE</h1>
</BOUCLE_art1>
<BOUCLE_art2(ARTICLES){id_article IN #GET{miarreglo}|sinon{0}}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art2>
Una solución para todos los esqueletos
Ahora imaginemos que usas esa lista en varios esqueletos. Aquí hay una manera de compartirla :
Puedes crear un simple esqueleto que sólo contiene una cadena formada con la lista de valores separados por un caracter raramente usado (la barra vertical ’|’ es una buena idea).
Por ejemplo, yo creé el esqueleto milista.html con este contenido :
12 | 13 | 14 | 25
y el esqueleto miprueba.html
#CACHE{0}
<BOUCLE_art(ARTICLES){id_article IN #INCLURE{fond=milista}|explode{'|'}}>
<h1>#TITRE</h1>
</BOUCLE_art>
El filtro "explode es una función php que separa la cadena pasada como parámetro y llena una matriz con valores. La función toma como primer parámetro el carácter utilizado para la separación ... y ¡voilá ! Es como si el esqueleto incluído pasara una matriz como parámetro.
Cómo lograr bucles “imposibles”
Aquí hay un ejemplo para hacer un bucle normalmente imposible con SPIP 1.9.2 : obtener la lista de artículos en la secciones marcadas con la palabra clave con ID 15.
Una de las posibilidades de los arreglos dinámicos sería hacer el siguiente esqueleto (mira también el plugin SPIP Bonux para construir arreglos dinámicos) :
#CACHE{0}
#SET{miarreglo, #ARRAY{}}
<BOUCLE_rub(RUBRIQUES){id_mot=15}>
[(#SET{miarreglo,
#GET{miarreglo}|push{#ID_RUBRIQUE}
})]
</BOUCLE_rub>
<BOUCLE_art(ARTICLES){id_rubrique IN #GET{miarreglo}|sinon{0}}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art>
Esta solución funciona perfectamente, pero requiere reescribir parte del código en cada esqueleto donde se usa.
Aquí está la solución donde compartimos la primer parte :
Creamos un archivo list-rubriques.html que genera la lista de identificadores separados por barras verticales
<BOUCLE_rub(RUBRIQUES){id_mot?}{id_groupe?}{'|'}>#ID_RUBRIQUE</BOUCLE_rub>
Puedes usar este « sub-bucle » en todos los otros esqueletos. Por ejemplo, puede usar para el siguiente bucle en otro esqueleto :
<BOUCLE_art(ARTICLES){id_rubrique IN #INCLURE{fond=list-rubriques}{id_mot=15}|explode{'|'}|sinon{0}}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art>
Compatibilidad :
Probado con SPIP 2.0.9, pero también debería funcionar con SPIP 1.9.2.
Una técnica (mucho) más eficiente con SPIP 2.0.x
Con la versión 2.0 llegaron las composiciónes automáticas (ver este artículo en el sitio programmer.spip.org). Podemos usar el siguiente bucle para obtener el mismo resultado :
<BOUCLE_art(ARTICLES mots_rubriques){id_mot=15}{par titre}>
<h1>#TITRE</h1>
</BOUCLE_art>
Las ventajas :
- No hay inclusiones
- Todo el trabajo de composición lo realiza la base de datos, lo que implica mayor eficiencia.
Para mayor evidencia, aquí está la consulta provista por el modo debug (?var_mode=debug) :
SELECT articles.titre, articles.lang
FROM <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWFiYXNlPC9jb2RlPg=="></span>.spip_articles
AS <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+YXJ0aWNsZXM8L2NvZGU+"></span>
INNER JOIN <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bWFiYXNlPC9jb2RlPg=="></span>.spip_mots_rubriques
AS L1 ON ( L1.id_rubrique = articles.id_rubrique )
WHERE (articles.statut = 'publie')
AND (articles.date < '9999-12-31')
AND (L1.id_mot = 15)
GROUP BY articles.id_article
ORDER BY articles.titre
Discussions par date d’activité
Une discussion
Definitivamente de SPIP solo conozco un 1% jejeje sigue el estudio...
Cada día confirmo que la elección de SPIP es la correcta...
Répondre à ce message
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 : |