Avanzando con SPIP [2]
Intercambio de variables entre SPIP y PHP
Pasar variables PHP a SPIP
Una de las ventajas (para mí la principal) de spip respecto a otros cms es su sitema de caché que evita generar las páginas dinámicamente a cada petición de un usuario, lo que le da una mayor (con diferencia) velocidad de carga de páginas.
Sin embargo esto presenta algunos problemas a los administradores de web con spip, sobre todo cuando quieren aplicar sus conocimientos de php e insertar variables php dentro de bucles.
Cuando hacemos la primera vez:
<?php
$var = "valor";
?>
<BOUCLE_articulos(ARTICLES) {id_rubrique} {criterio=<?php echo $var; ?>}>
#TITRE
</BOUCLE_articulos>
Vemos que no funciona. El motivo es que:
SPIP calcula primero los boucles, balizas y demas y después el código php
Con lo cual no filtrará por
criterio="valor"
sino que filtrará por
criterio="<?php echo $var; ?>"
por tanto no ejecutará el código php.
La única forma de pasarle variables php a SPIP es mediante los métodos _GET y _POST, es decir mediante la url o mediante campos (que pueden ser también ocultos) de formularios.
SPIP recogeá esas variables con la baliza #ENV
Ejemplo:
En una determinada sección queremos que el usuario pueda ver sólo los artículos de un determinado mes (a elegir por el usuario).
Supongamos que es la sección 5, entonces la url será (spip 1.9.x):
http://miservidor.org/spip.php?rubrique5
En el código tendremos algo así:
Seleccione mes <br>
<ul>
<li><a href="#URL_RUBRIQUE&mes=1">Enero</a></li>
<li><a href="#URL_RUBRIQUE&mes=2">Febrero</a></li>
...
<li><a href="#URL_RUBRIQUE&mes=12">Diciembre</a></li>
</ul>
Le estamos pasando la variable ’mes’.
Ahora recogemos con SPIP esa variable: en el mismo fichero anterior tendremos:
<BOUCLE_articulos(ARTICLES) {id_rubrique} {mois=#ENV{mes}}>
#TITRE
</BOUCLE_articulos>
Si hacemos clic sobre Enero (mes=1) el criterio que tomará SPIP será {mois=1}
Pasar variables de SPIP a PHP
Esta parte es mucho más fácil:
<?php
$mi_var = '#BALIZA';
?>
Pasar variables de SPIP a SPIP
A partir de SPIP 1.9.1 podemos enviar variables con la baliza #SET y recogerlas con la baliza #GET
La sintaxis es:
#SET{variable,valor}
#GET{variable}
Ejemplo:
<B_articulos>
#SET{art_total, #TOTAL_BOUCLE}
<BOUCLE_articulos(ARTICLES) {id_rubrique} {par date} {inverse}>
#TITRE
</BOUCLE_articulos>
</B_articulos>
...
más código
...
En la actual sección, compuesta de #GET{art_toal} artículos bla bla bla ...
Explicación:
Con la baliza #TOTAL_BOUCLE obtenemos el total de elementos de un bucle, pero tenemos que ponerla dentro del bucle, NO la podemos usar fuera del bucle.
Con #SET{art_total, #TOTAL_BOUCLE} asignamos a la variable ’art_total’ el valor #TOTAL_BOUCLE
Con #GET{art_total} rescatamos el valor de la variable ’art_total’
En el ejemplo anterior quizás no veamos la importancia de #SET y #GET pues se podía haber pasado el #TOTAL_BOUCLE a una variable PHP y después usarla con PHP. Pero .. ¿y si después necesitamos usarla en otro bucle de spip? podríamos hacerlo pasándola por url y recogiéndola con #ENV (pero necesitaríamos recargar la página).
CONCLUSIÓN FINAL
Como aplicación de lo aprendido y como prueba de que se entiende el funcionamiento de spip, el intercambio de variables entre spip y php y las nuevas balizas #SET y #GET</html< dejo al lector que intente resolver el siguiente problema (yo lo he resuelto usando parte de lo explicado, pero quizás tu solución sea mejor):
Se trata de que en una web con spip (en la portada por ejemplo) necesitas obtener el número de artículos de cada mes (pongamos sólo del año 2006).
El resultado que visualizaría el visitante sería algo así:
Artículos del año 2006
Enero: 5
Febrero: 6
...
Agosto: 9
Septiembre: 4
Octubre: 0
Noviembre: 0
Diciembre: 0