Note sur les boucles et balises

J'ai été confronté à de nombreux problèmes lors du développement des boucles et balises de ce plugin. Ça marche, mais la façon dont c'est codé n'est peut-êter pas très orthodoxe par rapport au fonctionnement interne de SPIP que j'ai découvert peu à peu.

Pour les balises, ça va à peu près, c'est pour les boucles que ma façon de faire est surtout "limite".

Boucles

Les boucles de SPIP doivent forcément s'apputer sur des tables SQL déclarées. Dans le cas de GMap, il y a deux boucles : GEOPOINTS et GEOTEST.

GEOPOINTS

la boucle GEOPOINTS correspond effectivement à une requête SQL sur la table gmap_points.

Une correspondance est déclarée dans la fonction gmap_declarer_tables_interfaces du fichier base/gmap_tables.php :

$interface['table_des_tables']['gmap_points'] = 'gmap_points';
$interface['table_des_tables']['geopoints'] = 'gmap_points';

Au-delà du fonctionnement de base, j'ai seulement ajouté deux critères {visible} et {meilleur} pour, respectivement, ne récupérer que les points dont le type est noté visible et ne récupérer que le meilleur point par objet en se basant sur le champs priorite du type de points.

GEOTEST

Le cas de la boucle GEOTEST est plus problématique car elle n'est pas forcément liée à une requête SQL sur la table des points, en tout cas ce n'est pas l'option que j'ai choisi car je voulais avoir les main libre sur le traitement effectué.

C'est également une boucle particulière car elle ne doit s'exécuter qu'un fois : soit le code est exécuté une fois soit il n'est pas exécuté du tout.

 

Cette boucle se rapprocherait des boucle POUR et CONDITION proposées par le plugin SPIP-Bonux. Pour ces boucles, SPIP-Bonux déclare une table virtuelle sur un serveur de base de données virtuel. Je n'ai pas voulu adopter cette solution car je la trouvais trop lourde.

 

Heureusement, je pouvais tout de même logiquement relié la boucle GEOTEST à la table gmap_points : in fine, si le code de l aboucle fait d'autres traitement, ça aboutira à une ou plusieurs requête sur cette table.

Donc, une correspondance est également déclarée dans la fonction gmap_declarer_tables_interfaces du fichier base/gmap_tables.php :

$interface['table_des_tables']['geotest'] = 'gmap_points_liens';

Mais le code de la balise est totalement surchargé dans la fonction boucle_GEOTEST_dist du fichier boucle/gmap_boucles.php. Et c'est là que ça se complique car je n'ai pas pu me reposer sur des fonctions de SPIP pour générer le code de la boucle et décoder les paramètres. Ce code est donc très fragile par rapport aux évolutions de SPIP.

 

Je suis ouvert à toute critique à ce sujet du moment qu'elle sera constructive.

Balises

Il y a moins de problème avec les balises car j'ai pu les intégrer à un fonctionnement standard de SPIP.

J'ai utilisé la plupart du temps le principe des balises dynamique qui offre un moyen pratique d'accéder aux paramètres de la balise et au contenu des boucles englobantes.

Pour les boucles plus simples, j'ai utilisé la fonction interprete_argument_balise pour accéder aux arguments.