Des layers dynamiques avec Drupal et Openlayers

J'ai eu besoin de créer des layers dynamiquement avec Openlayers en fonction de termes de taxonomie. Un peu d'astuce avec Views et voilà le travail !

  1. Créez une vue Openlayers.
  2. Ajouter un display pour le premier terme.
  3. Créez un filtre sur le premier terme.
  4. Exportez la vue en code.

Ensuite, éditez la vue pour créer un display par terme :
/**
* Implements hook_views_default_views().
*/
function MYMODULE_views_default_views() {
$vocabulary = taxonomy_vocabulary_machine_name_load('VOCABULARY_NAME');
$terms = taxonomy_get_tree($vocabulary->vid);
// Your view code for the master display...
foreach($terms as $term) {
$handler = $view->new_display('openlayers', $term->name, 'layer_' . $term->tid);
// The display code...
$handler->display->display_options['filters']['tid']['value'] = array(
$term->tid => $term->tid,
);
}
// Remaining code...
}

De même pour la map :
/**
* Implements hook_openlayers_maps().
*/
function MYMODULE_openlayers_maps() {
$vocabulary = taxonomy_vocabulary_machine_name_load('VOCABULARY_NAME');
$terms = taxonomy_get_tree($vocabulary->vid);
// Your code for the map...
foreach($terms as $term) {
$name = 'MAP_NAME_layer_' . $term->tid;
$openlayers_maps->data['layers'][$name] = $name;
$openlayers_maps->data['layer_activated'][$name] = $name;
$openlayers_maps->data['behaviors']['openlayers_behavior_popup'][$name] = $name;
}
// Remaining code...
}

Enfin, pour mettre à jour la vue lors de l'ajout / modification / suppression d'un terme :
/**
* Implements hook_taxonomy_term_insert().
*/
function MYMODULE_taxonomy_term_insert($term) {
$vocabulary = taxonomy_vocabulary_machine_name_load('VOCABULARY_NAME');
if ($term->vid == $vocabulary->vid) {
views_invalidate_cache();
}
}
 
/**
* Implements hook_taxonomy_term_update().
*/
function MYMODULE_taxonomy_term_update($term) {
MYMODULE_taxonomy_term_insert($term);
}
 
/**
* Implements hook_taxonomy_term_delete().
*/
function MYMODULE_taxonomy_term_delete($term) {
MYMODULE_taxonomy_term_insert($term);
}

Et voilà !