Como es sabido, SPIP permite asociar un esqueleto específico a una sección específica. Esto permite tener diferentes vistas para distintas secciones. Hasta ahí todo va bien. Pero el problema surge cuando:

  • Se crea una nueva sección: hay que crear (aunque sea copiando) un esqueleto específico para ella.
  • Se realiza mantenimiento: hay que tener en mente el número de cada sección (y su significado en la estructura de contenidos).

Para evitar estos inconvenientes, una opción es tener un solo esqueleto rubrique.html y en él un estructura condicional (tipo if) controlada por palabras clave, de manera que asociando una determinada palabra clave a una sección se ejecute una parte del esqueleto u otra.

La sintaxis básica de un if de este tipo sería esta:

<BOUCLE_a(MOTS){id_rubrique}{titre=palabra_a}>
  [(#REM) - Código que se ejecuta
  si la sección tiene asociada la palabra "palabra_a"]
</BOUCLE_a>
</B_a>
  [(#REM) - Código que se ejecuta en cualquir otro caso ]
<//B_a>

A continuación un ejemplo de la vida real, por partes.

Primero, un bucle que lista las subsecciones de una sección, poniendo un código HTML <ul> y </ul> antes y después de los <li>:

  <B_lista_secciones>
    <h2>Art&iacute;culos en esta secci&oacute;n:</h2>
    <ul>
    <BOUCLE_lista_secciones(RUBRIQUES){id_parent}{par date}{inverse}>
      <li><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></li>
    </BOUCLE_lista_secciones>
    </ul>
  <//B_lista_secciones>

Segundo, un bucle similar que lista los artículos de una sección:

  <B_lista_articulos>
    <h2>Art&iacute;culos en esta secci&oacute;n:</h2>
    <ul>
    <BOUCLE_lista_articulos(ARTICLES){id_rubrique}{exclus}{par date}{inverse}>
      <li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
    </BOUCLE_lista_articulos>
    </ul>
  <//B_lista_articulos>

Tercero, todo junto en una estructura if controlada por palabras clave. Si la sección tiene asociada la palabra clave “tipo_artículo” se listan sus subsecciones (como si fueran artículos) y si no, se listan sus artículos propiamente dichos:

[(#REM) - Lista las subsecciones como si fueran articulos si la palabra clave de la rubrique es = tipo_articulo ]
<BOUCLE_tipo_articulo(MOTS){id_rubrique}{titre=tipo_articulo}>
  <B_lista_secciones>
    <h2>Art&iacute;culos en esta secci&oacute;n:</h2>
    <ul>
    <BOUCLE_lista_secciones(RUBRIQUES){id_parent}{par date}{inverse}>
      <li><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]</a></li>
    </BOUCLE_lista_secciones>
    </ul>
  <//B_lista_secciones>
</BOUCLE_tipo_articulo>
</B_tipo_articulo>

[(#REM) - Sino, lista los articulos de la sección]
  <B_lista_articulos>
    <h2>Art&iacute;culos en esta secci&oacute;n:</h2>
    <ul>
    <BOUCLE_lista_articulos(ARTICLES){id_rubrique}{exclus}{par date}{inverse}>
      <li><a href="#URL_ARTICLE">[(#TITRE|supprimer_numero)]</a></li>
    </BOUCLE_lista_articulos>
    </ul>
  <//B_lista_articulos>
<//B_tipo_articulo>

En otro artículo vamos a pner un ejemplo más complejo, con dos if anidados:

if
else
  if
  else
  fin
fin

Si, mientras lo ponemos, quieren ir haciendo sus propias conjeturas… ;-)

 

El problema era el siguiente:

En un esqueleto de RUBRIQUE, una opción habitual es mostrar una lista con el título de los artículos de la sección seguido de un breve texto con las primeras líneas del artículo y un enlace a “Continuar”. El problema es que en el sitio multilingüe de International Netwok for Peace algunos artículos no están traducidos, por lo que el texto del artículo es algo así como “Este artículo todavía no está traducido”. En ese caso, no tiene sentido mostrar el enlace “Continuar”, puesto que ya se está viendo todo el texto del artículo.

Para solucionar este problema se planteó la siguiente condición:

Si el texto del artículo tiene más de 300 caracteres se muestran los primeros 300 caracteres del texto y el enlace “Continuar”. En otro caso se muestra el texto completo y no se muestra el enlace “Continuar”.

Para calcular esta condición se necesita código PHP:

<BOUCLE_articles_rubrique(ARTICLES) {branche} {par num titre} {!par date}>
  <?php
/* determination de la longitud del texto */
/* observemos que strlen es un función PHP */
    $A=[(#TEXTE|textebrut|strlen)];
/* eleccion de la longitud maxima para no cortar */
    $b=300;
    if ($A>$b){
  ?>
/* salimos de PHP para no tener que escapar todos los caracteres
especiales y así simplificar mucho la notación */
/* observemos la notación "if" en SPIP: si hay #DESCRIPTIF mostrarlo,
y si no mostrar el #TEXTE */
(#DESCRIPTIF|sinon{[(#CHAPO|sinon{[(#TEXTE|couper{300})]})]})
&nbsp;<b class="separateur">& &nbspgt;</b>&nbsp;<a  class="suite"
href="#URL_SITE_SPIP/#URL_ARTICLE" title="...<:suite:>" ><:suite:></a>
/* volvemos a entrar en PHP */
  <?php
    }else{
  ?>
  #TEXTE
  <?php
  }
  ?>
</BOUCLE_articles_rubrique>

El resultado puede verse en la siguiente imagen:

Y también en International Network for Peace.

Si este caso resulta demasiado complicado, puede verse un caso mucho más sencillo en Variables PHP en SPIP, caso sencillo

 

Veamos un caso muy sencillo de cómo usar variables PHP en SPIP.

En un sitio multilingüe queríamos mostrar una lista con las últimas noticias en todos los idiomas del sitio, pero destacando en azul las noticias del idioma en el que se está viendo la página y atenuando en gris las noticias en el resto de los idiomas.

Para ello necesitamos manejar dos variables de idioma: la del sitio y la del artículo. Ambas las ofrece SPIP con la baliza #LANG, dependiendo de dónde se coloque la baliza. Si es dentro de un bucle ARTICLES la baliza #LANG se refiere al idioma del artículo y si es fuera de cualquier bucle se refiere al idioma de la página. Es por ello que necesitamos una variable PHP para almacenar el valor del idioma de la página.

Empezamos.

Al inicio del esqueleto, dentro de <body>, creamos la variable SPIP $lang y almacenamos el valor del idioma de la página (#LANG):

<?php
  $lang="#LANG";
?>

Ya dentro del bucle ARTICLES, la utilizamos:

<BOUCLE_news_art(ARTICLES) {par date} {inverse} {titre_mot=News}>
<?php
if ($lang!=="#LANG") {$color="gray";} else {$color="";}
?>
<?php
echo "<a href=\"#URL_ARTICLE\" title=\"#DESCRIPTIF\"
style=\"color: $color\">#TITRE</a>";
?>
</BOUCLE_news_art>

Observemos cómo dentro del echo hay que escapar las comillas con la barra antiinclinada (\).

El color azul se toma de la hoja de estilo. De ahí que hagamos:

else {$color="";

El resultado puede verse en la columna derecha de  International Network for Peace

Como este caso es muy sencillo, en Código PHP en SPIP mostramos otro caso de uso de código PHP en SPIP más complicado.

Blog de Dabne || Web de Dabne Suffusion theme by Sayontan Sinha