Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
516 lines (472 sloc) 15.3 KB
<?php
// $Id: openlayers.install,v 1.12.2.10 2010/09/11 19:08:34 zzolo Exp $
/**
* @file
* This file holds the functions for the installing
* and enabling of the openlayers module.
*
* @ingroup openlayers
*/
/**
* Implementation of hook_install().
*/
function openlayers_install() {
// Create tables
drupal_install_schema('openlayers');
}
/**
* Implementation of hook_uninstall().
*/
function openlayers_uninstall() {
// Remove tables
drupal_uninstall_schema('openlayers');
// Get module variables
$results = db_query("SELECT v.name FROM {variable} AS v WHERE v.name LIKE '%s%%'", 'openlayers_');
// Remove variables
while ($row = db_fetch_array($results)) {
variable_del($row['name']);
}
}
/**
* Implementation of hook_schema().
*/
function openlayers_schema() {
$schema = array();
// Maps table (ctools extras)
$schema['openlayers_map_presets'] = array(
'description' => 'Storage for User defined OpenLayers map presets.',
'export' => array(
'key' => 'name',
'identifier' => 'openlayers_presets',
'default hook' => 'openlayers_presets',
'api' => array(
'owner' => 'openlayers',
'api' => 'openlayers_presets',
'minimum_version' => 1,
'current_version' => 1,
),
),
'fields' => array(
'name' => array(
'description' => t('The primary identifier for the preset.'),
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
),
'title' => array(
'description' => t('The title of the preset.'),
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
),
'description' => array(
'description' => t('The description of the preset.'),
'type' => 'text',
'not null' => TRUE,
),
'data' => array(
'description' => t('The serialized map.'),
'type' => 'text',
'not null' => TRUE,
'serialize' => TRUE,
),
),
'primary key' => array('name'),
);
// Layer table (ctools extras)
$schema['openlayers_layers'] = array(
'description' => 'Storage for user defined OpenLayers layers.',
'export' => array(
'key' => 'name',
'identifier' => 'openlayers_layers',
'default hook' => 'openlayers_layers',
'api' => array(
'owner' => 'openlayers',
'api' => 'openlayers_layers',
'minimum_version' => 1,
'current_version' => 1,
),
),
'fields' => array(
'name' => array(
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
'description' => 'Layer name.',
),
'title' => array(
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
'description' => 'Layer title.',
),
'description' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Layer description.',
),
'data' => array(
'type' => 'text',
'not null' => FALSE,
'description' => 'Layer data serialized.',
'serialize' => TRUE,
),
),
'primary key' => array('name'),
'indexes' => array(
'name' => array('name'),
),
);
// Styles table (ctools extras)
$schema['openlayers_styles'] = array(
'description' => 'Storage for user defined OpenLayers styles.',
'export' => array(
'key' => 'name',
'identifier' => 'openlayers_styles',
'default hook' => 'openlayers_styles',
'api' => array(
'owner' => 'openlayers',
'api' => 'openlayers_styles',
'minimum_version' => 1,
'current_version' => 1,
),
),
'fields' => array(
'name' => array(
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
'description' => 'Style name.',
),
'title' => array(
'type' => 'varchar',
'length' => '255',
'not null' => TRUE,
'default' => '',
'description' => 'Style title.',
),
'description' => array(
'type' => 'text',
'not null' => TRUE,
'description' => 'Style description.',
),
'data' => array(
'type' => 'text',
'not null' => FALSE,
'description' => 'Style data serialized.',
'serialize' => TRUE,
),
),
'primary key' => array('name'),
'indexes' => array(
'name' => array('name'),
),
);
return $schema;
}
/**
* Implementation of hook_update_N().
*/
function openlayers_update_6200(&$sandbox) {
$ret = array();
// Because we already have two different versions of this
// module that are not meant to be compatible, we have to
// check what version we are coming from and do the correct
// update. Unfortunately Drupal will not tell us what schema
// we are coming from, so we have set a variable in the 1.x
// modules.
$openlayers_version = variable_get('openlayers_schema_version', NULL);
if (!empty($openlayers_version) && $openlayers_version >= 6100 && $openlayers_version < 6200) {
// 1.x to 2.x upgrade.
$ret = _openlayers_upgrade_1xto2x();
}
return $ret;
}
/**
* Implementation of hook_update_N().
*/
function openlayers_update_6201(&$sandbox) {
$message = 'Did not alter OpenLayers source.';
// Due to some changes in the OpenLayers JS in
// version 2.10, errors crop up, so we will
// manually set to 2.9. Assume change if
// not set or set to http://openlayers.org/api/OpenLayers.js
$current = variable_get('openlayers_source', FALSE);
if (!$current || $current == 'http://openlayers.org/api/OpenLayers.js') {
variable_set('openlayers_source', 'http://openlayers.org/api/2.9/OpenLayers.js');
$message = 'Set OpenLayers source to hosted 2.9 version.';
}
// Add simple note
$ret[] = array(
'success' => TRUE,
'query' => $message,
);
return $ret;
}
/**
* Function to handle upgrading from 1.x to 2.x
*
* @return
* Valid return array for Drupal update functions
*/
function _openlayers_upgrade_1xto2x() {
$ret = array();
// Add simple note
$ret[] = array(
'success' => TRUE,
'query' => 'Upgrading OpenLayers from 1.x to 2.x',
);
// Update preset table
db_drop_field($ret, 'openlayers_map_presets', 'preset_id');
db_change_field($ret, 'openlayers_map_presets', 'preset_name', 'name',
array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
array('primary key' => array('name'))
);
db_change_field($ret, 'openlayers_map_presets', 'preset_title', 'title',
array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
array()
);
db_change_field($ret, 'openlayers_map_presets', 'preset_description', 'description',
array('type' => 'text', 'not null' => TRUE),
array()
);
db_change_field($ret, 'openlayers_map_presets', 'preset_data', 'data',
array('type' => 'text', 'not null' => TRUE),
array()
);
// Add new tables
$schema = drupal_get_schema_unprocessed('openlayers');
foreach ($schema as $name => $table) {
if (!db_table_exists($name)) {
db_create_table($ret, $name, $table);
}
}
// The only thing we can really do in the upgrade process
// is to attempt to automate the conversion of the
// changes in the map preset/array to the new version,
// and we can only do this for presets in the database,
// so get all the presets currently in the database.
$results = db_query("SELECT * FROM {openlayers_map_presets}");
while ($row = db_fetch_array($results)) {
$new_map = unserialize($row['data']);
// Process map parts.
_openlayers_upgrade_1xto2x_convert_general($new_map, $ret);
_openlayers_upgrade_1xto2x_convert_layers($new_map, $ret);
_openlayers_upgrade_1xto2x_convert_behaviors($new_map, $ret);
_openlayers_upgrade_1xto2x_convert_styles($new_map, $ret);
// Save new Map back into the database.
$result = db_query("UPDATE {openlayers_map_presets} SET data='%s' WHERE name='%s'", serialize($new_map), $row['name']);
// Debug map array
// $ret[] = array('success' => TRUE, 'query' => '<pre>' . var_export($new_map, TRUE) . '</pre>');
// Add some output to user.
$ret[] = array(
'success' => $result,
'query' => 'Updated preset: ' . $row['name'] . '. Please ensure to read handbook pages on Drupal.org for manual changes when upgrading.',
'rows' => 1,
);
}
return $ret;
}
/**
* Converting general map propoerties for the
* upgrade from 1.x to 2.x
*
* @param $map
* Reference to map array
* @param $ret
* Reference to return array
*/
function _openlayers_upgrade_1xto2x_convert_general(&$map = array(), &$ret = array()) {
// Change center
if (isset($map['center']) && is_array($map['center'])) {
$map['center'] = array(
'initial' => array(
'centerpoint' => $map['center']['lat'] . ',' . $map['center']['lon'],
'zoom' => $map['center']['zoom'],
),
);
}
// Options
if (isset($map['options']) && is_array($map['options'])) {
// maxExtent
// Is this a requirement for 2.x?
if (isset($map['options']['maxExtent']) && is_array($map['options']['maxExtent'])) {
$map['options']['maxExtent'] = array(
$map['options']['maxExtent']['left'],
$map['options']['maxExtent']['bottom'],
$map['options']['maxExtent']['right'],
$map['options']['maxExtent']['top'],
);
}
}
}
/**
* Converting layer arrays for the
* upgrade from 1.x to 2.x
*
* @param $map
* Reference to map array
* @param $ret
* Reference to return array
*/
function _openlayers_upgrade_1xto2x_convert_layers(&$map = array(), &$ret = array()) {
// Array to associate named layers to 2.x
$layer_convert = array(
'openlayers_default_wms',
'openlayers_layers_nasa_global_mosaic' => '',
'openlayers_layers_nasa_daily_planet' => '',
'openlayers_layers_nasa_global_mosaic' => '',
'openlayers_layers_nasa_daily_planet' => '',
'openlayers_layers_nasa_blue_marble' => '',
'openlayers_layers_open_aerial' => '',
'openlayers_layers_google_street' => 'google_normal',
'openlayers_layers_google_satellite' => 'google_satellite',
'openlayers_layers_google_hybrid' => 'google_hybrid',
'openlayers_layers_google_physical' => 'google_physical',
'openlayers_layers_yahoo_street' => 'yahoo_street',
'openlayers_layers_yahoo_satellite' => 'yahoo_satellite',
'openlayers_layers_yahoo_hybrid' => 'yahoo_hybrid',
'openlayers_layers_virtual_earth_street' => 'virtualearth_street',
'openlayers_layers_virtual_earth_satellite' => 'virtualearth_satellite',
'openlayers_layers_virtual_earth_hybrid' => 'virtualearth_hybrid',
'openlayers_layers_osm_mapnik' => 'osm_mapnik',
'openlayers_layers_osm_tah' => 'osm_tah',
'openlayers_layers_osm_cycle' => 'osm_cycle',
'openlayers_layers_osm_4326_hybrid' => 'osm_4326_hybrid',
'openlayers_layers_cloudmade' => '',
'openlayers_default_wms' => 'wms_default',
);
// Array to associate layer types to 2.x
$layer_type_convert = array(
'WMS' => 'openlayers_layer_type_wms',
'Vector' => '', // ??
'KML' => 'openlayers_layer_type_kml',
'XYZ' => 'openlayers_layer_type_xyz',
'Google' => 'openlayers_layer_type_google',
'VirtualEarth' => 'openlayers_layer_type_virtualearth',
'Yahoo' => 'openlayers_layer_type_yahoo',
'Cloudmade' => 'openlayers_layer_type_cloudmade',
);
// Check that there are layers
if (isset($map['layers']) && is_array($map['layers'])) {
// Go through layers
foreach ($map['layers'] as $id => $layer) {
// Convert named layers
if (is_string($layer)) {
if (!empty($layer_convert[$layer])) {
unset($map['layers'][$id]);
$map['layers'][$layer_convert[$layer]] = $layer_convert[$layer];
}
// What to do with named layers that dont translate ??
}
elseif (is_array($layer)) {
// Save new layer in DB, then map to preset
}
}
}
// Check default layer
if (!empty($map['default_layer']) && is_string($map['default_layer']) && !empty($layer_convert[$map['default_layer']])) {
$map['default_layer'] = $layer_convert[$map['default_layer']];
// Ensure that layer is in layer array
if (empty($map['layers'][$map['default_layer']])) {
$map['layers'][$map['default_layer']] = $map['default_layer'];
}
}
}
/**
* Converting behaviors for the
* upgrade from 1.x to 2.x
*
* @param $map
* Reference to map array
* @param $ret
* Reference to return array
*/
function _openlayers_upgrade_1xto2x_convert_behaviors(&$map = array(), &$ret = array()) {
// Control behavior conversion array
$control_convert = array(
'LayerSwitcher' => 'openlayers_behavior_layerswitcher',
'Navigation' => 'openlayers_behavior_navigation',
'PanZoomBar' => 'openlayers_behavior_panzoombar',
'MousePosition' => 'openlayers_behavior_mouseposition',
'Attribution' => 'openlayers_behavior_attribution',
'KeyboardDefaults' => 'openlayers_behavior_keyboarddefaults',
'Permalink' => 'openlayers_behavior_permalink',
'ScaleLine' => 'openlayers_behavior_scaleline',
'ZoomBox' => 'openlayers_behavior_zoombox',
'ZoomToMaxExtent' => 'openlayers_behavior_zoomtomaxextent',
);
// Convert controls
if (isset($map['controls']) && is_array($map['controls'])) {
foreach ($map['controls'] as $control => $enabled) {
if ($enabled && !empty($control_convert[$control])) {
$map['behaviors'][$control_convert[$control]] = array();
}
// Get rid of controls array
unset($map['controls']);
}
}
// Go through behaviors
if (isset($map['behaviors']) && is_array($map['behaviors'])) {
foreach ($map['behaviors'] as $id => $behavior) {
// Full screen
if ($behavior['type'] == 'openlayers_behaviors_fullscreen') {
$map['behaviors']['openlayers_behavior_fullscreen'] = array();
unset($map['behaviors'][$id]);
}
// Zoom to Layer
if ($behavior['type'] == 'openlayers_behaviors_zoom_to_layer' && !empty($behavior['layer'])) {
$map['behaviors']['openlayers_behaviors_zoomtolayer'] = array(
'zoomtolayer' => $behavior['layer'],
);
unset($map['beahviors'][$id]);
}
// Cluster
// Zoom to Feature
// Tooltip
// Popup
// Draw Features
// Declutter
}
}
}
/**
* Converting styles for the
* upgrade from 1.x to 2.x
*
* @param $map
* Reference to map array
* @param $ret
* Reference to return array
*/
function _openlayers_upgrade_1xto2x_convert_styles(&$map = array(), &$ret = array()) {
// Go through styles
if (isset($map['styles']) && is_array($map['style'])) {
foreach ($map['styles'] as $id => $style) {
// Named styles are the same
// Convert style arrays and store in DB
if (is_array($style)) {
// Create new object
$new_style = new stdClass();
$new_style->api_version = 1;
$new_style->name = $id;
$new_style->title = ucwords(str_replace('_', ' ', $id));
$new_style->description = ucwords(str_replace('_', ' ', $id));
$new_style->data = $style;
// Save new style object
$success = drupal_write_record('openlayers_styles', $style);
$ret[] = array(
'success' => ($success) ? TRUE : FALSE,
'query' => 'Attempt to save style: ' . $id,
);
// Now put back in map array
if ($success) {
$map['style'][$id] = $id;
}
}
}
}
}
Something went wrong with that request. Please try again.