Déclarations relatives à la BDD

Description de l’API php/bdd

L’API base de données s’appuie sur les librairies stockées dans ecrire/base et s’appuie sur des tableaux associatifs php de portée globale.

  • $tables_principales,
  • $tables_auxiliaires,
  • $tables_images,
  • $tables_sequences,
  • $tables_documents,
  • $tables_mime

et des tableaux supplémentaires :

  • $tables_jointures,
  • $exceptions_des_jointures,
  • $table_date,
  • $exceptions_des_tables,
  • $table_des_tables,
  • $table_des_traitements,
  • $tables_des_serveurs_sql

La structure par défaut de la base de données SPIP est définie par le fichier ecrire/base/serial.php

Si un fichier ajoute des éléments à l’un de ces tableaux et qu’on fait appel à la fonction creer_base() ou à maj_tables(), on modifie la base de données pour la mettre en conformité avec la déclaration. De même, les fonctions d’export et d’import s’appuient sur ces tableaux pour effectuer sauvegardes et restaurations.

Une règle générale :
- données éditoriales utilisée dans les boucles : tables principales
- données techniques de jointure ou autre : tables_auxiliaires

tables_interfaces (que l’on récupère en paramètre dans le pipeline _declarer_tables_interfaces) est un tableau
qui contient entre autres :
- tables_des_tables
- table_des_traitements
- tables_xxxx (toutes )

$tables_principales

Syntaxe

Explication

Indique la structure d’une table

  • field tableau des champs et de leur nature SQL
    • array('champ' => 'nature SQL')
    • pour déclarer un champ grand texte :champ => 'TEXT NOT NULL'
    • pour déclarer un champ texte :champ => 'VARCHAR(255) NOT NULL'
    • pour déclarer un champ numérique :champ => 'BIGINT(21) NOT NULL'
  • key tableau des clefs primaires ou index de la table
    • pour déclarer un clef primaire : 'PRIMARY KEY' => champ
    • pour declarer une clef : 'KEY' => champ

$table_des_jointures

Syntaxe

Explication

Elle sert à SPIP pour relier automatiquement 2 tables, ce qui fait que si on fait une boucle <boucle_(TABLE1)>#CHAMP_TABLE_2</boucle_>, SPIP fera automatiquement la liaison entre les 2 tables, sur le principe qu’elles aient une colonne de table identique, par exemple "id_rubrique" toutes les deux.

$table_des_tables

Syntaxe

Explication

Elle sert à SPIP pour le nom des boucles. Si la table "spip_toto" n’est pas déclarée avec $table_des_tables[’toto’]=’toto’ ; alors il sera impossible de faire <boucle_(TOTO) />, mais seulement <boucle_(SPIP_TOTO) /> ou <boucle_(spip_toto) /> ce qui a le grand inconvénient d’être dépendant du préfixe des tables de SPIP.

En le déclarant, SPIP gère donc le préfixe de table dans les noms des boucles, ce qui permet des <boucle_(TOTO) />.

A préciser :

Tout ce qui concerne les "foreign keys" ( c’est à dire des relations entre tableaux (« table ») voir le cours de Frédéric Brouard section FOREIGN KEY).

$exceptions_des_tables

Syntaxe

Explication

En prenant l’exemple de code précédent, on devrait dire au compilateur : avec une boucle sur les evenements qui fait appel à id_rubrique (valable aussi pour branche donc), il faut faire une jointure entre spip_evenements et spip_articles et que tu utilise spip_articles.id_rubrique

Exemple 1 : faire une jointure automatique dans une BOUCLE avec des tables SPIP

But : on souhaite récupérer des informations sur les auteurs dans les tables spip_auteurs (table des auteurs de spip) et spip_auteurs_elargis (table créée par le plugin inscription2) avec une seule boucle.

Syntaxe :

<BOUCLE_toto(auteurs auteurs_elargis)>
    id_auteur = #ID_AUTEUR
    <br />nom = #NOM
    <br/>adresse = #ADRESSE
    <br/>code postal = #CODE_POSTAL
</BOUCLE_toto>

Explication :

La syntaxe à utiliser pour ce genre de jointure est extrêmement pointilleuse :

  • les noms de table doivent êtres en minuscules (
    <BOUCLE_toto(AUTEURS AUTEURS_ELARGIS)...

    ne fonctionnera pas.

  • l’ordre dans lequel on appelle les tables n’est pas quelconque :
    <BOUCLE_toto(auteurs_elargis auteurs)...

    ne fonctionnera pas. Il semblerait qu’il soit préférable de commencer par les tables "dist" (nativement dans spip) : dans tous les cas, si vous obtenez une erreur essayez systématiquement de changer l’ordre avant de vous arracher les cheveux !

  • bien évidemment ces jointures ne sont possibles que si toutes les tables concernées sont correctement déclarées dans les GLOBALES $table_des_tables, $tables_principales ou $tables_auxilliaires et $tables_jointures !

Exemple 2 : faire une jointure automatique dans une BOUCLE avec des tables externes (non-SPIP)

Rappel : lorsque l’on dispose d’une connexion à une base supplémentaire (cf paragraphe "Compléments d’installation" de http://www.spip.net/fr_article3681.html), il est possible de BOUCLEr sur des tables non-SPIP avec la syntaxe suivante :

<BOUCLE_toto(nom_base:table_externe)>
    contenu champ truc = #CHAMP_TRUC <br />
</BOUCLE_toto>

Syntaxe : pour extraire des informations de 2 tables de la base externe en réalisant une jointure "automatique", on utilisera la syntaxe suivante :

<BOUCLE_toto(nom_base:table_externe_un table_externe_deux )>
    contenu champ truc (table_externe_un) = #CHAMP_TRUC
    contenu champ bidule (table_externe_deux) = #CHAMP_BIDULE
    <br />
</BOUCLE_toto>

Notez bien qu’il ne faut pas répéter le préfixe nom_de_la_base : pour la deuxième table (celle sur laquelle portera la jointure)...