openlayers/modules/openlayers_cck/openlayers_cck.module, line 115
- Versions
- 6
openlayers_cck_widget(&$form, &$form_state, $field, $items, $delta = 0)
Implementation of hook_widget().
Code
<?php
function openlayers_cck_widget(&$form, &$form_state, $field, $items, $delta = 0) {
// Get field name
$fieldname = $field['field_name'];
// Only include map once per field
static $included_field = '';
if ($included_field != $fieldname) {
// Create map
$mapid = OPENLAYERS_CCK_MAP_ID_PREFIX .'-'. $fieldname;
$map['id'] = $mapid;
// Add an event to the map. When a layer is added fire the JavaScript function
// OL.EventHandler.CCKLoadValues which will load data from the CCK fields into the map.
$map['events'] = array(
'beforeBehaviors' => array('CCKLoadValues'),
);
// Define beahvoirs
$map['behaviors'] = array(
'openlayers_cck_zoom_to_layer' => array(
'id' => 'openlayers_cck_zoom_to_layer',
'type' => 'openlayers_behaviors_zoom_to_layer',
'layer' => 'openlayers_cck_vector',
),
);
// Make sure that our display projection matches the database projection
if ($field['db_storage'] == 0) {
$field['db_storage'] = '4326';
}
$map['options'] = array(
'displayProjection' => $field['db_storage'],
);
// Define a vector layer for our features
$map['layers'] = array(
'openlayers_cck_vector' => array(
'id' => 'openlayers_cck_vector',
'type' => 'Vector',
'name' => $field['widget']['label'],
'options' => array(),
'events' => array(
'featureselected' => array('CCKFeaturesSelected'),
'featureunselected' => array('CCKFeaturesUnselected'),
),
),
);
// Build control
$map['behaviors']['openlayers_cck_edit_'. $field['geo_type']] = array(
'id' => 'openlayers_cck_edit_'. $field['geo_type'],
'type' => 'openlayers_behaviors_draw_features',
'feature_type' => 'point',
'layer' => 'openlayers_cck_vector',
'featureadded_handler' => array('OL.CCK.featureAdded'),
'featuremodified_handler' => array('OL.CCK.featureAdded'),
'featureremoved_handler' => array('OL.CCK.featureAdded'),
);
// Determine type from geo type
switch ($field['geo_type']) {
case 'point':
$map['behaviors']['openlayers_cck_edit_'. $field['geo_type']]['feature_type'] = 'point';
break;
case 'linestring':
$map['behaviors']['openlayers_cck_edit_'. $field['geo_type']]['feature_type'] = 'path';
break;
case 'polygon':
$map['behaviors']['openlayers_cck_edit_'. $field['geo_type']]['feature_type'] = 'polygon';
break;
}
// Use widget settings form to create base map array
$widget_map = openlayers_convert_form_to_map($field['widget']['openlayers_cck']);
// Merge with map created for field
$map = openlayers_merge_maps($widget_map, $map);
// Render Map
$rendered_map = openlayers_render_map($map);
// Add JS
drupal_add_js(drupal_get_path('module', 'openlayers_cck') .'/js/openlayers_cck.js');
//Add CSS
drupal_add_css(drupal_get_path('module', 'openlayers_cck') .'/openlayers_cck.css', 'module');
// Put together array for JS
$openlayers_cck = array(
'openlayers_cck' => array(
'maps' => array(
$mapid => array(
'field_name' => $fieldname,
'field_data' => $field,
'field_name_js' => str_replace('_', '-', $fieldname), // Best way?
'field_map_themed' => theme('openlayers_cck_map', $field, $rendered_map),
'field_container' => str_replace('_', '-', $fieldname) .'-items', // Best way??
'field_items' => $items,
),
),
),
);
// Add JS settings
drupal_add_js($openlayers_cck, 'setting');
// Change static variable
$included_field = $fieldname;
}
// Return widget array
return array(
'#type' => $field['widget']['type'],
'#default_value' => isset($items[$delta]) ? $items[$delta] : '',
);
}
?> 