Sección Avanzada sobre SPIP

Artículos de esta sección

  • Avanzando con SPIP - Índice

    Avanzando con SPIP - Índice

     1) Instalación de plugins en SPIP 1.9
     2) Intercambio de variables entre SPIP y PHP
     3) La base de datos de SPIP
     4) SPIP Add-ons
     5) Esqueleto para descargar

  • La base de datos de spip

    Como sabemos SPIP usa una base de datos MySQL para guardar los distintos artículos, secciones, autores, etc. La base de datos tiene una serie de tablas con nombres del tipo spip_articles, spip_auteurs, etc.

    Disponemos de información sobre algunos de los campos en los artículos de spip.net:

     La structure de la base de données
     Estructura de la base de datos

    El artículo original (en francés) se encuentra desactualizado (y por tanto la traducción), no obstante y aunque no están todos los campos, en los anteriores artículos se explica para qué sirven los principales campos.

    Además se puede ver un esquema general de la base de datos en:
     doc.spip.org (observa el fichero pdf).

    Si tienes servidor propio, o bien aceso al servidor donde está alojada tu base de datos de spip, puedes consultarla usando sentencias de MySQL o mediante el programa PhpMyAdmin. Para más información mira los artículos: Instalando MySQL y PHPMyAdmin.
    Si no recuerdas el nombre de tu base de datos, puedes obtenerlo (además de la contraseña) del fichero: ecrire/inc_connect.php.

    Si NO tienes servidor propio o no puedes acceder mediante mysql a tu base de datos, aquí tienes la estructura de la base en una instalación de spip versión 1.91:

    En primer lugar veamos las tablas disponibles:

    mysql> show tables;

    Tables_in_spip191
    spip_ajax_fonc
    spip_articles
    spip_auteurs
    spip_auteurs_articles
    spip_auteurs_messages
    spip_auteurs_rubriques
    spip_breves
    spip_caches
    spip_documents
    spip_documents_articles
    spip_documents_breves
    spip_documents_rubriques
    spip_forum
    spip_groupes_mots
    spip_index
    spip_index_dico
    spip_messages
    spip_meta
    spip_mots
    spip_mots_articles
    spip_mots_breves
    spip_mots_documents
    spip_mots_forum
    spip_mots_rubriques
    spip_mots_syndic
    spip_ortho_cache
    spip_ortho_dico
    spip_petitions
    spip_recherches
    spip_referers
    spip_referers_articles
    spip_rubriques
    spip_signatures
    spip_syndic
    spip_syndic_articles
    spip_test
    spip_types_documents
    spip_types_tables
    spip_versions
    spip_versions_fragments
    spip_visites
    spip_visites_articles

    42 rows in set (0.00 sec)

    Veamos ahora la estructura de algunas de las tablas:

    mysql> describe spip_articles;

    Field Type Null Key Default Extra
    id_article bigint(21) PRI NULL auto_increment
    surtitre text
    titre text
    soustitre text
    id_rubrique bigint(21) MUL 0
    descriptif text
    chapo mediumtext
    texte longblob
    ps mediumtext
    date datetime 0000-00-00 00:00:00
    statut varchar(10) MUL 0
    id_secteur bigint(21) MUL 0
    maj timestamp(14) YES NULL
    export varchar(10) YES oui
    date_redac datetime 0000-00-00 00:00:00
    visites int(11) 0
    referers int(11) 0
    popularite double 0
    accepter_forum char(3)
    date_modif datetime MUL 0000-00-00 00:00:00
    lang varchar(10) MUL
    langue_choisie char(3) YES non
    id_trad bigint(21) MUL 0
    extra longblob YES NULL
    idx enum(’’,’1’,’non’,’oui’,’idx’) MUL
    id_version int(10) unsigned 0
    nom_site tinytext
    url_site varchar(255) MUL
    url_propre varchar(255) MUL

    29 rows in set (0.00 sec)

    mysql> describe spip_auteurs;

    Field Type Null Key Default Extra
    id_auteur bigint(21) PRI NULL auto_increment
    nom text
    bio text
    email tinytext
    nom_site tinytext
    url_site text
    login varchar(255) binary MUL
    pass tinytext
    low_sec tinytext
    statut varchar(255) MUL
    maj timestamp(14) YES NULL
    pgp blob
    htpass tinyblob
    en_ligne datetime MUL 0000-00-00 00:00:00
    imessage char(3)
    messagerie char(3)
    alea_actuel tinytext
    alea_futur tinytext
    prefs tinytext
    cookie_oubli tinytext
    source varchar(10) spip
    lang varchar(10) MUL
    idx enum(’’,’1’,’non’,’oui’,’idx’) MUL
    url_propre varchar(255) MUL
    extra longblob YES NULL

    25 rows in set (0.00 sec)

    mysql> describe spip_breves;

    Field Type Null Key Default Extra
    id_breve bigint(21) PRI NULL auto_increment
    date_heure datetime 0000-00-00 00:00:00
    titre text
    texte longblob
    lien_titre text
    lien_url text
    statut varchar(6)
    id_rubrique bigint(21) MUL 0
    lang varchar(10)
    langue_choisie char(3) YES non
    maj timestamp(14) YES NULL
    idx enum(’’,’1’,’non’,’oui’,’idx’) MUL
    extra longblob YES NULL
    url_propre varchar(255) MUL

    14 rows in set (0.00 sec)

    mysql> describe spip_documents;

    Field Type Null Key Default Extra
    id_document bigint(21) PRI NULL auto_increment
    id_vignette bigint(21) MUL 0
    id_type bigint(21) MUL 0
    titre text
    date datetime 0000-00-00 00:00:00
    descriptif text
    fichier varchar(255)
    taille int(11) 0
    largeur int(11) 0
    hauteur int(11) 0
    mode enum(’vignette’,’document’) MUL vignette
    distant char(3) YES non
    idx enum(’’,’1’,’non’,’oui’,’idx’)
    maj timestamp(14) YES NULL

    14 rows in set (0.00 sec)

    mysql> describe spip_forum;

    Field Type Null Key Default Extra
    id_forum bigint(21) PRI NULL auto_increment
    id_parent bigint(21) MUL 0
    id_thread bigint(21) 0
    id_rubrique bigint(21) MUL 0
    id_article bigint(21) MUL 0
    id_breve bigint(21) MUL 0
    date_heure datetime 0000-00-00 00:00:00
    titre text
    texte mediumtext
    auteur text
    email_auteur text
    nom_site text
    url_site text
    statut varchar(8) MUL
    idx enum(’’,’1’,’non’,’oui’,’idx’) MUL
    ip varchar(16) YES NULL
    maj timestamp(14) YES NULL
    id_auteur bigint(20) 0
    id_message bigint(21) MUL 0
    id_syndic bigint(21) MUL 0

    20 rows in set (0.00 sec)

    mysql> describe spip_mots;

    Field Type Null Key Default Extra
    id_mot bigint(21) PRI NULL auto_increment
    titre text
    descriptif text
    texte longblob
    id_groupe bigint(21) 0
    type text
    extra longblob YES NULL
    idx enum(’’,’1’,’non’,’oui’,’idx’) MUL
    url_propre varchar(255) MUL
    maj timestamp(14) YES NULL

    10 rows in set (0.00 sec)

    mysql> describe spip_rubriques;

    Field Type Null Key Default Extra
    id_rubrique bigint(21) PRI NULL auto_increment
    id_parent bigint(21) MUL 0
    titre text
    descriptif text
    texte longblob
    id_secteur bigint(21) 0
    maj timestamp(14) YES NULL
    export varchar(10) YES oui
    id_import bigint(20) YES 0
    statut varchar(10)
    date datetime 0000-00-00 00:00:00
    lang varchar(10) MUL
    langue_choisie char(3) YES non
    idx enum(’’,’1’,’non’,’oui’,’idx’) MUL
    extra longblob YES NULL
    url_propre varchar(255) MUL
    statut_tmp varchar(10)
    date_tmp datetime 0000-00-00 00:00:00

    18 rows in set (0.00 sec)

    Existen algunas tablas que se usan como unión entre otras. Por ejemplo la tabla spip_auteurs_articles relaciona autores con artículos

    mysql> describe spip_auteurs_articles;

    Field Type Null Key Default Extra
    id_auteur bigint(21) PRI 0
    id_article bigint(21) PRI 0

    2 rows in set (0.00 sec)

  • 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
  • Instalación de plugins en SPIP 1.9

    Los Plugins son pequeños programas añadidos a un programa principal para aportarle alguna nueva funcionalidad.
    Con la versión 1.9 de SPIP llegaron los plugins (no los había en versiones anteriores) y ya tenemos una gran cantidad para elegir (muchos de ellos en una versión estable). La filosofía no es instalar todos los que veamos, sino sólo aquel (aquellos) que necesitemos.

    La instalación de plugins en spip es muy sencilla:

     Creamos una carpeta llamada /plugins en la raíz de nuestro sitio
     Descargarnos el plugin a instalar, que suele venir en un fichero comprimido
     Descomprimimos el fichero y dará lugar a una sóla carpeta que contiene ficheros y subcarpetas
     Copiamos la carpeta obtenida dentro de /plugins
     Entramos en el espacio privado y veremos una nueva opción: Gestión de los plugins dentro del menú Configuración del sitio
     Activamos los plugins que necesitemos

    Ejemplo: plugins recherche_extendue_1_9

    Vamos a instalar el plugins recherche_extendue_1_9 que, entre otras cosas, nos permitirá forzar una indexación muy útil cuando hemos actualizado desde una versión anterior (y como suele ser habitual hemos perdido las búsquedas).

    El caso más habitual es, como dije antes, cuando acabamos de actualizar a la versión 1.9 final (válido también si actualizamos desde una beta de la 1.9). Los pasos a seguir son:

     Descargar el plugin de http://zone.spip.org/files/spip-zone/

     Descomprimimos el fichero recherche_extendue_1_9.zip y la carpeta resultante (/recherche_extendue_1_9) la ponemos dentro de /plugins

     Vaciamos la cache (Opción dentro del menú Configuración del sitio) en el espacio privado. Esta opción es imprescindible trás una actualización y es uno de los motivos frecuentes por el que algunos usuarios no consiguen recuperar sus búsquedas

     Activamos el plugin con Gestión de los plugins dentro del menú Configuración del sitio

     Entramos en el menú del plugin Gestion de l’indexation

     Observamos el menú que aparece

     Purgamos las tablas de indexación y Reseteamos los parámetros de indexación (las dos últimas opciones del menú: hay que realizar ambas)

     El motor de búsqueda debe quedar vacío

    Motor de búsqueda vacío


     Vuelve a vaciar la caché, aunque ya lo hiciste antes. Es por si has hecho alguna búsqueda probando y ha quedado almacenada

     Retorna al menú del plugin y comprueba que el motor de búsqueda sigue vacío (si ves algo que no es cero vuelve a purgar las tablas). Ten en cuenta que tu sitio puede estar siendo visitado en esos momentos por otras personas (o le pueden quedar operaciones por hacer al spip_cron)

     Ahora comenzamos la indexación pulsando sobre Forcer l’indexation du site

     Si tienes muchos artículos no basta con pulsar una sóla vez, mira si el motor de búsqueda está lleno.

    Motro ed búsqueda aún sin completar
    Hay que seguir forzando la indexación hasta completar


     Puedes acelerar la indexación eligiendo pasos más grandes (aunque creo que debiera ser mejor poco a poco). Para ello fíjate en la url (cuando haces clic en Forzar indexación):
    http://misitio.es/ecrire/?exec=admin_index&forcer_indexation=20
    Puedes ponerle, en lugar de 20, 40, 80, etc.

     Cuando el motor esté totalmente lleno, puedes comprobar el vocabulario indexado (Voir le vocabulire index) y verás una tabla con todas tus palabras indexadas ordenadas por puntuación.

    Ahora ya puedes ir al espacio público y probar las búsquedas