Ajout d’une implémentation de carte

Couche d'abstraction propriétaire

Le plugin a été conçu pour permettre l'ajout d'implémentation de carte. Le mécanisme a été testé lors de l'ajout d'une implémentation en Google Maps V3 alors que le plugin a initialement été développé en Google Maps V2.

 

Le mécanisme est assez simple : tous les fichiers spécifiques à une implémentation sont regroupés dans un dossier spécial et un pipeline permet de déclarer une nouvelle implémentation.

Pourquoi ne pas utiliser une librairie existante ?

Tout d'abord par ce que je n'en connaissais aucune quand j'ai commencé ce plugin ! Ensuite parce que ce n'est pas forcément une bonne idée.

Par exemple, il y a la librairie Mapstraction (utilisée par le plugin GIS2). Elle permet d'afficher des cartes Google Maps, Open Layers, Yahoo, Bing. Il est sûr que l'ajout d'une implémentation Mapstraction à GMap lui donnerait plus de possibilités.

Cependant :

  • La conception d'une couche d'abstraction prend toujours le plus petit dénominateur commun des possibilités des implémentations sous-jacentes. En clair : la couche d'abstraction ne rajoute aucune fonctionnalité. C'est aussi vrai pour une librairie du commerce que pour une couche propriétaire, mais dans une couche propriétaire on peut fouiller plus profondément les points utiles (par exemple en cherchant des plugin qui comblent les lacunes) et laisser tomber tout ce qui ne sert pas dans le but du développement.
  • Le développeur de la couche doit faire des arbitrages spécifiques à telle ou telle utilisation. En développant une couche propriétaire, on doit également faire des arbitrages, mais on les prend dans la direction la mieux adaptée au but de développement.
  • On peut ajouter une implémentation générique comme Mapstraction sur une couche d'abstraction propriétaire, on peut plus difficilement modifier le code de la couche générique.
  • Après tout, est-ce si important d'utiliser Yahoo Maps, Bing Maps ou Google Maps ? Je laisse délibérement de côté Open Layers pour lequel il pourrait y avoir une position idéologique.

Où se trouvent les fichiers d'implémentation ?

Les implémentations sont regroupées dans le dossier mapimpl/ situé à la racine du plugin.

De nouvelles implémentations peuvent être ajoutées soit dans ce dossier, soit dans un dossier squelettes/mapimpl/, soit encore dans le dossier mapimpl/ d'un plugin.

Les implémentations sont identifiées par un code qui sert de nom de dossier pour les fichiers. GMap inclut une implémentation Google Maps V2 identifiée par gma2 et une implémentation Google Maps V3 identifiée par gma3. On trouve donc des dossiers mapimpl/gma2 et mapimpl/gma3.

Sous ces dossiers, les fichiers sont encore regroupés selon leur fonction :

  • javascript : le fichier principal de l'implémentation, en javascript.
  • prive : les fichiers PHP utilisés dans la partie privée.
  • public : les fichiers PHP utilisés dans la partie publique.
  • style : les feuilles de styles spécifiques.

D'autres implémentations ?

Le plus urgent est certainement de développer une implémentation OpenLayers.

Ajouter une implémentation Mapstraction pourrait ouvrir les possibilités sur Yahoo et Bing à moindres frais.

Détails de l'ajout d'une implémentation

Déclaration de l'implémentation

Le plugin utilise un pipeline nommé gmap_implementations pour récupérer la liste des implémentations.

Le pipeline reçoit en paramètre un tableau indexé dont la clef est le code de l'implémentation.

La fonction qui traite le pipeline devrait faire être de la forme suivante :

function myplug_gmap_implementations($apis)
{
  $apis['code'] = array( 'name' => "nom de l'implémentation", 'explic' => "explications affichées sur la page de paramétrage");
  return $apis;
}

 

Grâce à cette déclaration, GMap sait qu'une implémentation "code" existe, il va donc la proposer dans les pages de paramétrage et utiliser les fichier du dossier mapimpl/code/.

Le script d'implémentation

Le script principal de l'implémentation est une classe MapWrapper (autant que javascript permet de faire des "classes") qui implémente les méthodes utilisées par GMap.

Il y a certainement des progrès à faire pour faciliter l'implémentation des fonctions. Actuellement, le plus simple est de partir d'un fichier existant et de recoder toutes les fonctions qui ne sont pas préfixées par un "_".

Les fonctions PHP pour la partie publique

Le dossier public/ doit contenir :

  • Une fonction mapimpl_code_public_script_init_dist dans un fichier script_init.php : elle renvoie le code à insérer dans le header des pages de la partie publique et de la partie privée.
  • Une fonction mapimpl_code_public_test_actif_dist dans un fichier test_actif.php : elle renvoie true si l'implémentation est correctement paramétrée, false sinon.
  • Une fonction mapimpl_code_public_capabilities_dist dans un fichier capabilities.php : qui teste si l'implémentation est capable de fournir un service dont le code est passé en paramètre.
  • Une fonction mapimpl_code_public_parametre_carte_dist dans un fichier parametre_carte.php : qui renvoie un bout de code javascript utilisé pour paramétrer la carte (selon les paramétrages par défaut ou les paramètres de la balise #GEOMAP).

Les pages de paramétrage (partie privée)

Le dossier prive/ contient les fonctions PHP utilisées pour initialiser, afficher et traité les paramètres spécifiques à l'implémentation.

Actuellement, les paramètres sont regroupés en trois blocs :

  • api : obligatoire, paramètres de l'API apparaissant sur la page système (version, codes d'activation, etc.)
  • map_defaults : obligatoire, paramètre par défaut de la carte, y compris latitude et longitude par déafut du site.
  • markers_behavior : comportement des marqueurs, par exemple la taille des info-bulles, et la fonction de regroupement des info-bulles.

 

Pour chaque bloc de paramètres, il faut trois fonctions :

  • Une fonction mapimpl_code_prive_init_nom-du-bloc_dist dans un fichier init_nom-du-bloc.php, chargée d'initialiser les paramètres à l'installation du plugin.
  • Une fonction mapimpl_code_prive_show_nom-du-bloc_dist dans un fichier show_nom-du-bloc.php, chargée d'afficher l'interface de modification des paramètres qui sera affichée depuis les pages de paramétrage de GMap.
  • Une fonction mapimpl_code_prive_faire_nom-du-bloc_dist dans un fichier faire_nom-du-bloc.php, chargée de récupérer les données de formulaire et de sauvegarder le paramétrage.