Interroger d’autres tables

Pour utiliser SPIP comme gestionnaire d’interrogation de tables applicatives externes, il faut écrire des squelettes de boucles SPIP, appliqués aux tables externes, qu’il suffit de signaler à SPIP.


Prenons par exemple une table nommée ACTEURS , créée par l’instruction SQL ci-dessous :

  1.  
  2. DROP TABLE IF EXISTS `acteurs`;
  3. CREATE TABLE `acteurs` (
  4. `id_acteur` BIGINT(20) NOT NULL AUTO_INCREMENT,
  5. `nom_acteur` VARCHAR(200) CHARACTER SET utf8 NOT NULL,
  6. `adresse` VARCHAR(250) CHARACTER SET utf8 NOT NULL COMMENT ’adresse’,
  7. `code_postal` VARCHAR(10) CHARACTER SET utf8 NOT NULL,
  8. `ville` VARCHAR(200) CHARACTER SET utf8 NOT NULL,
  9. `mobile` tinytext CHARACTER SET utf8 NOT NULL COMMENT ’mobile’,
  10. `role` text CHARACTER SET utf8 NOT NULL COMMENT ’ROLE,
  11. `email` VARCHAR(250) CHARACTER SET utf8 NOT NULL COMMENT ’mail’,
  12. `maj` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  13. PRIMARY KEY (`id_acteur`)
  14. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Télécharger

Cette table est donc connue sous le nom physique de acteurs [1].

Les explications de cette page seront limitées à des tables non-SPIP, mais présentes dans la même base de données utilisée par le SPIP courant, pour éviter les complexités introduites par de multiples fichiers de connexion.
Pour simplifier, on supposera aussi (cf.ci-dessous) que ces tables utilisent le prefix courant spip_ du SPIP installé.

Sans même déclarer la structure de votre table à SPIP, vous pouvez utiliser le mécanisme de squelettes pour visualiser le contenu par une boucle SQL : [2]

 Visualiser une table externe

Vous pouvez tout simplement afficher un balayage de votre table en rajoutant la noisette suivante dans un squelette :

  1. <BOUCLE_simple(acteurs) {par nom_acteur} {!nom_acteur} >
  2. #ID_ACTEUR - <b>#NOM_ACTEUR</b> : #ADRESSE #MOBILE.<br />
  3. </BOUCLE_simple>

Télécharger

Dans ce code, nous avons spécifié le nom physique [3] de la table, et affiché quelques champs simplement en donnant leurs noms de balise de champ (écrit en Majuscules, précédés d’un dièse).
La seule particularité introduite, est d’avoir spécifié un critère de tri {par ....} portant ici sur le champ #NOM_ACTEUR pour obtenir une liste alphabétique, suivi d’un critère filtrant conditionnel, refusant les noms "vides" à null ou blanc.

 Intégration au site

Intégrer une telle nouvelle page à votre site est facile, surtout si vous avec choisi de
TRAVAILLER en mode Z (ZPIP et Z-core) et le plugin Skeleditor :
- il suffit de créer un squelette limité au contenu voulu, fichier texte que nous créons avec le nom ./contenu/page-acteurs.html dans le sous-répertoire homonyme des squelettes.
- pour faciliter l’utilisation, on peut déjà profiter des facilités de pagination et de tri [4], et rajouter une indentation de liste [5], avec un test de table vide, et meme prévoir un lien vers un squelette d’écran-formulaire de visualisation détaillée, à créer sous le nom ./contenu/page-acteur_edit.htmlnommé .

PNG - 36.5 ko
Une noisette complète pour visualiser une table ACTEURS

 Déclarer des tables externes

Si vous avez essayé d’appliquer le code présenté ci-dessus, il faut remarquer une différence avec notre première boucle, en plus du changement de nom : cette fois-ci la table sur laquelle porte la boucle est écrite en MAJUSCULES, et sans le prefix physique qui caractérisait le nom ; c’est d’ailleurs la syntaxe classique de SPIP, qui permet de prendre en compte automatiquement le préfixe du jeu de tables.

Pour qu’une écriture de boucle puisse utiliser cette syntaxe logique, il faut déclarer la table à SPIP, soit lors de la création d’un plugin [6], ou très simplement en rajoutant une ligne dans mes_options : exemple.

code class="php"> <?php

//   squelettes/mes_options.php



// déclarer la table  $prefix_acteurs  
$GLOBALS['table_des_tables']['acteurs']='acteurs';

// donner priorité à un dossier ./themes/perso
$GLOBALS['dossier_squelettes'] = 'themes/perso:squelettes';

// rajouter l'usage d'un dossier squelettes spécifique aux pages publiques
if (!_DIR_RACINE)  {
  
$GLOBALS['dossier_squelettes'] .= ':squelettes/plng.sklt';
}
?>
Cette déclaration suppose une table physique nommée spip_acteurs utilisant le prefix courant, par défaut à spip_.

N.B. Les deux autres instructions sont utilisées (réellement) pour
- imposer un thème d’habillage graphique
- et dédier les pages écrites dans cette gestion dans un sous-dossier spécifique des squelettes...

 En pratique

Pour utiliser facilement l’affichage de tables externes, en plus de créer les squelettes (ou noisettes) voulus, il vous suffira donc de
- donner le nom physique dans la zone de la BOUCLE
- ou donner le nom logique en Majuscules,
en déclarant la table dans $GLOBALS['table_des_tables']['nom_logique'] = 'nom_physique_sans prefixe';.
La syntaxe est utilisée par trouver_table()
avec

        if (isset($table_des_tables[$nom])) {
                $nom = $table_des_tables[$nom];
                $nom = "spip_$nom";

exprimant que la clé symbolique du nom logique est utilisée pour donner le nom physique avant préfixe.

Si vous passez par l’utilisation d’un plugin, la meme syntaxe est applicable, en déclarant vos nouvelles tables par une fonction (à déclarer dans le paquet.xmlpour le pipeline) dans la variable locale $table_des_tables reçue, et retournée par votre fonction, au lieu d’appeler les $GLOBALS.

Donc résumons : pour utiliser une autre table dans la meme base de données, soit :
- donner dans la boucle, le nom physique de la table (réel, complet) en minuscules
- indiquer un nom logique de table, en majuscules, à condition d’avoir déclaré
cette table logique dans la tale des tables...


Merci de nous signaler les coquilles ou erreurs qui figureraient dans cette page.

[1Noter que le nom de cette table ne comporte pas de prefix à spip_, au contraire des tables traditionnelles de notre CMS favori..

[2Voyez aussi l’usage de Vertebres (limité aux Webmestres, et aux tables de la base contenant SPIP et ayant le même préfixe courant.

[3Remarquez que le nom "physique" est écrit en minuscules entre parenthèses !

[4L’usage du mot-clé tri à la place de par dans un critère de boucle permet de proposer des liens cliquables de modification du tri en paramètre : voir cette balise #TRI.

[5Liste à puce définie en HTML par les balises <ul> <li>..</li></ul>.

[6Amplement documenté par ailleurs..


Liens visibles seulement pour les inscrits.

Article publié le 11 janvier 2013, et actualisé en septembre 2014 .

Répondre à cet article