miércoles, 12 de mayo de 2010

SPIP: Moviendo el esqueleto (II)

Continúo ejercitando en el tema de los esqueletos de Spip. Resumiendo lo visto en el artículo anterior sobre este tema: había probado cómo hacer para mostrar el título de un artículo específico de los que se encuentran en la base de datos, luego el título y el texto, después una cantidad dada de títulos de distintos artículos. Más adelante, probamos hacer que esos títulos fueran vínculos a las páginas de los artículos completos y, finalmente, vimos cómo mostrar los títulos de los artículos de una sección dada.

En la presente entrada intentaré hacer una especie de resumen de los artículos Bucles y balizas, La sintaxis de los bucles y La sintaxis de las balizas SPIP. Es altamente recomendable que se lean esos artículos originales.

Cómo escribir un bucle

Para entender un poco más lo ejercitado en el artículo anterior sobre Spip, veamos cómo se escribe un BOUCLE. La sintexis del mismo es la siguiente:

<BOUCLEn(TYPE){criterio1}{criterio2}...{criteriox}>
* Código HTML + balizas SPIP
</BOUCLEn>

Todos los bucles de Spip comienzan con la instrucción BOUCLE. Luego viene el nombre del bucle (n) que es a elección del administrador: puede ser un número (BOUCLE6) o una(s) palabra(s). En el caso de usar palabras, es necesario anteponer un guión bajo, por ejemplo:

<BOUCLE_subsecciones...>
...
</BOUCLE_subsecciones>

Después del nombre del bucle, corresponde colocar el tipo de bucle (TYPE). Este elemento es muy importante: indica qué tipo de elementos se desea recuperar de la base de datos. El TYPE se indica entre paréntesis (sin espacios), en mayúsculas, y debe corresponder obligatoriamente a uno de los tipos admitidos por SPIP: ARTICLES, RUBRIQUES, AUTEURS, BREVES, etc. Por ejemplo:

<BOUCLE_subsecciones(RUBRIQUES)...>
...
</BOUCLE_subsecciones>

Los criterios ({criterio1}{criterio2}...{criteriox}) indican simultáneamente:

  • según qué criterios se desea seleccionar los elementos de la base de datos,

  • la manera en la cual se clasificarán o seleccionarán los elementos (por ejemplo: según su fecha, según su título... publicar solamente los tres primeros artículos, mostrar la mitad de los artículos...).

Como los criterios se pueden combinar, es posible generar muy fácilmente peticiones muy potentes a la base de datos. Por ejemplo, para mostrar la lista de los 5 artículos más recientes escritos por tal autor:

<BOUCLE_mismo_autor(ARTICLES){id_auteur}{par date}{inverse}{0,5}>
...
</BOUCLE_mismo_autor>

Algunos criterios funcionan con todos los tipos de bucle, otros son específicos para ciertos bucles.

¿Qué hacer si no hay resultados?

Ante cualquiera de estas consultas hechas en un bucle, puede pasar que no haya resultados. Veamos cómo le decimos a Spip que queremos que haga en este caso:

<B1>
Esta secci&oacute;n contiene los elementos siguientes:
<ul>
<BOUCLE1(ARTICLES){id_rubrique}>
<li>#TITRE</li>
</BOUCLE1>
</ul>
</B1>
Esta secci&oacute;n no contiene art&iacute;culos.
<//B1>

El código opcional anterior (el precedido por <Bn>, en este caso Esta secci&oacute;n contiene los elementos siguientes: <ul>) y el código opcional posterior (el que termina en </Bn>, en este caso </ul>) se ubican antes y después del bucle propiamente dicho y solo se muestran si el bucle extrae por lo menos una respuesta.

El código alternativo (que acaba por <//Bn>) se muestra en el lugar del bucle (y remplazando también los códigos opcionales anterior y posterior) si el bucle no encontró ningún resultado.

Criterios de entorno en cascada

Cada bucle realiza la selección de los elementos extraídos de la base de datos en función de criterios que corresponden al entorno en el cual se encuentra el bucle.

Este entorno se puede definir:

  • por el URL

    Generalmente para acceder a una página de un sitio Spip, junto con la dirección del sitio se debe(n) escribir una(s) variable(s). Por ejemplo: spip.php?page=tutorial&id_rubrique=7.

    Estas variables definen así un primer entorno: el bucle que podríamos llamar "Mostrar cierta página con la información de esta sección" debe entenderse entonces como la "Mostrar la página tutorial, con la información de la sección 7".

  • El entorno proporcionado por los demás bucles.

    Dentro de un bucle, el entorno se modifica para cada elemento del mismo. Al colocar bucles unos en el interior de otros, se heredan así entornos unos a otros.

En suma, mediante el anidamiento de bucles, se obtienen bucles distintos, incluidos unos en otros, que dependen de los resultados de los bucles en los que están situados. Y finalmente, el bucle inicial (el que contiene a todos los demás) depende de un parámetro fijado en la dirección de la página.

También se pueden definir los bucles uno a continuación del otro (y no dentro del otro como en el ejemplo anterior) de manera que bucles sucesivos no se influyan unos sobre otros.

Las balizas

Cada tipo de bucle permite seleccionar cierto tipo de elementos de la base de datos de Spip (artículos, secciones, breves, etc). A su vez, estos elementos están compuestos por otros elementos: título, fecha, texto, etc. Para poder identificar estos elementos dentro de un bucle, es preciso utilizar las balizas.

En un código Spip, a una baliza siempre le precede el signo de numeral (#). Por ejemplo: #TITRE.

Para la siguiente prueba, necesitaremos que en la base de datos algunos artículos tengan colgado o antetítulo (baliza #SURTITRE). Para ello (si no se había hecho antes ya) en el Espacio Privado hay que ir a Configuración del sitio / Contenido del sitio y en el apartado Contenido de los artículos hay que marcar la opción Antetítulo y Validar. Luego hay que ir a editar algunos de los artículos y agregarles antetítulo.

Hecho esto, podríamos modificar el archivo tutorial.html de la siguente manera:

<ul>
<BOUCLE_secciones(RUBRIQUES){id_rubrique}>
<BOUCLE_articulos(ARTICLES){id_rubrique}>
<li>#_secciones:TITRE [<ul><li>[(#SURTITRE*|majuscules)<br>]<a href=#URL_ARTICLE>(#TITRE*)</a></li></ul>]</li>
</BOUCLE_articulos>
</BOUCLE_secciones>
</ul>

El resultado de llamar a la sección 7 en el navegador web (http://www.tusitio.net/spip.php?page=tutorial&id_rubrique=7), se vería así:

Analicemos el código precedente, que es un poquito más complejo que los vistos hasta ahora:

  • El código empieza y termina con las etiquetas de html: <ul> y </ul>, que lo que hacen es abrir y cerrar, respectivamente, la lista desordenada principal.

  • Con <BOUCLE_secciones(RUBRIQUES){id_rubrique}> y </BOUCLE_secciones>, se abre y cierra, respectivamente, el bucle que, en este caso, lleva como nombre secciones. Con esto se selecciona de la base de datos de Spip la sección (RUBRIQUES) que, en este caso y gracias a la variable de entorno proporcionada por la url (id_rubrique=7) corresponde, como ya habíamos establecido, a la sección "Octubre".

  • A continuación, y con <BOUCLE_articulos(ARTICLES){id_rubrique}> y </BOUCLE_articulos>, se abre y cierra, respectivamente, un nuevo bucle, incluido en el anterior, de nombre artículos. Este bucle selecciona de la base de datos todos los artículos de la sección "Octubre".

  • Finalmente, la línea que hace el trabajo interesante: <li>#_secciones:TITRE [<ul><li>[(#SURTITRE*|majuscules)<br>]<a href=#URL_ARTICLE>(#TITRE*)</a></li></ul>]</li>

    • Comienza con <li> y termina con </li>. Con esto se logra que por cada artículo de la sección elegida, se muestre un ítem de la lista desordenada principal abierta desde la primera línea del código.

    • El contenido de cada ítem de la lista se divide en dos partes:
      la primera es la baliza #_secciones:TITRE. Esta baliza hace referenia al título (TITRE) de la sección. Se escribe de esta manera para poder mostrar dentro del bucle incluido en otro, una baliza del bucle de nivel superior. Esto es, si aquí se escribiera la baliza solo como #TITRE, estaría llamando a los títulos de los artículos, ya que estamos dentro del bucle <BOUCLE_articulos(ARTICLES)...>. Entonces, para llamar a los títulos de la sección (que fue invocada en el bucle en el que está incluido el bucle actual) hay que avisarle al bucle que lo que queremos son los títulos cargados en el bucle anterior, por eso se escribe de esta manera: #_bucle:BALIZA, donde _bucle es el nombre del bucle de nivel superior y BALIZA es el nombre de la baliza perteneciente a ese bucle que queremos mostrar.

    • La segunda parte del contenido de cada ítem de la lista se encuentra entre corchetes rectos: [ ... ]. Esto quiere decir que estamos ante un código opcional. Dentro de este par de corchetes se encuentra una baliza entre paréntesis (en este caso #TITRE*).

      El asterisco es para eliminar las transformaciones tipográficas que, por defecto, hace Spip (por ejemplo, espacios insacables antes de las comas, los dos puntos, etc., que se utilizan en la gramática francesa).

      Spip procesa el código opcional y si existe contenido devuelto por la baliza (en este caso, si existe algún artículo en la sección, carga el título y no le aplica las transformaciones por defecto), muestra el código opcional anterior (lo que está entre el corchete recto de apertura y la baliza), el contenido de la baliza (el título del articulo) y el contenido opcional posterior (lo que está entre la baliza y el corchete recto de cierre). De esta manera, en este ejemplo, por cada artículo que encuentre Spip en la sección, generará una nueva lista desordenada con un único elemento (<li> ... </li>) que tendrá el título del artículo como vínculo (<a href=#URL_ARTICLE> ... </a>) a la página del artículo completo.

      Además, como ya deben haber notado, dentro del código opcional anterior aparece, a su vez, otro código opcional: [(#SURTITRE*|majuscules)<br>]. Este código opcional se analiza si el código en el que está incluido dio previamente algún resultado (o sea, para que analice si la baliza #SUSTITRE -colgado o antetítulo- tiene contenido), Spip primero debió haber encontrado el título correspondiente. Además, al antetítulo se le aplica el filtro majuscules, que, como pueden inducir, hace que el texto del antetítulo se muestre todo en mayúsculas.

No hay comentarios.:

Publicar un comentario

Lo que escriba a continuación será revisado antes de publicarse.
Gracias por tus comentarios.