Des requetes SQL aux Boucles SPIP

  raccrocher la syntaxe SPIP à vos pratiques SQL

SPIP utilise, comme beaucoup de CMS et de programmes Web, un système de gabarits pour la présentation des donnée.

Sa particularité est d’éviter toute insertion d’instructions php dans ces fichiers, avec plusieurs avantages :
- aucun risque de modification php des programmes exécutables
- une visualisation directe des structures de contrôle et des requetes de balayage de la base de données
- une souplesse de modification et de cache optimisant le serveur
- une sécurisation avancée (y compris face aux erreurs des webmestres).

En particulier, ces expressions de boucles sont directement comparables aux instructions SELECT SQL (généralement utilisées en fonctions php mysql_query()..) : nous allons détailler l’analogie.


 Requete simple

Pour afficher des données d’une table SQL, on doit indiquer plusieurs paramètres :
- FROM identifie la table utilisée (par son nom),
- SELECT spécifie les champs voulus dans l’affichage (il faut les lister),
- WHERE indique les critères de sélection (par des opérations logiques)
- ORDER BY précise les tris successifs,
- LIMIT restreint le nombre d’occurrences en réponse.
Et la boucle d’exploration est lancée.....

Pour un squelette SPIP (ou une noisette, c’est a dire une partie de squelette), la syntaxe SPIP s’insere dans du HTML avec une syntaxe analogue :
- l’instruction <BOUCLE__xx(...){..}..{.}> va recevoir successivement les trois paramètres de :

  • la table concernée (nom avec/sans préfixe) : mis entre parenthèse,
  • les critères de sélection (conditions logiques, implicitement coordonnées par des AND) : chaque expression est mise entre accolades
  • les critères de tri (egalement avec la syntaxe de critère) : mot-code par suivi d’une liste de champs
  • le nombre critère d’étendue (également en critère) : [1]

- le contenu de la boucle (avant l’instruction de fin </BOUCLE__xx>) va décrire en HTML la présentation des données affichées, essentiellement les valeurs de champ avec des balise de champ. : la syntaxe utilisée est le nom du champ en majuscules, précédé d’un #.
Et c’est tout !

Ainsi SELECT 'id_article', 'titre', 'id_rubrique','date_redac' FROM 'ARTICLES' WHERE 'id_secteur' = 33 AND 'id_rubrique' > 30 ORDER BY 'id_article','titre' LIMIT 50 ; s’écrit en SPIP dans une partie de squelette HTML :

  1. <BOUCLE_simple(ARTICLES){id_secteur=33}
  2.                                      {id_rubrique>30}
  3.                                      {par id_article, titre}{0,50}>
  4.           #ID_ARTICLE, #TITRE , #ID_RUBRIQUE <br />
  5. </BOUCLE_simple>        

Télécharger

Pour revoir cela en application, Balises, critères et filtres :les spécialistes d’XML apprécieront !

 Requete multi-table

C’est à peine plus complexe si vous voulez utiliser plusieurs tables ; soit vous imbriquez les boucles de parcours, soit vous construisez une jointure implicite en declarant plusieurs tables dans la partie entre parenthèses -sans autre séparateur que l’espace), et vous indiquerez un critère de jointure avec des champs des deux tables, s’ils ont des noms différents [2] .

Personnellement je n’ai pas souvenir d’avoir vu un langage aussi simple dans ma vie d’informaticien, même avec BO !

Bon, il y a quelques limites par rapport au SQL :
- la plus evidente, les opérations ensemblistes d’UNION (correspondant à des filtres OR logiques) ne sont pas directement accessibles [3]
- d’autres opérations complexes SQL (Des boucles de regroupementsont aussi complexes à gérer en SPIP....

Mais vous pouvez toujours préparer un CREATE VIEW sql (si vous avez la main sur votre SGBD) et l’appeler comme une table SPIP !
Oui, petit oubli, mais pas des moindres facilités : vous n’avez aucune déclaration a faire a SPIP pour lui faire lire une table non SPIP, ou meme pour lire dans une seconde base de données [4]


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

[1Un système de pagination automatique peut etre introduit comme critère supplémentaire pour parcourir une longue table, a afficher par paquets..

[2Si le champ de jointure a le meme nom dans les deux tables, SPIP s’occupe de tout !

[3Il faudra jouer de listes doublons...

[4Juste déclarer la La Connexion SPIP - BDD, avec un moteur connu de SPIP, dans un connect.php secondaire en Maintenance !


Liens A2A visibles seulement pour les inscrits.
Liens visibles seulement pour les inscrits.

Article publié le 11 avril 2014, et actualisé en février 2019 .

Répondre à cet article