geo/modules/geo_field/geo_field.module, line 56
- Versions
- 6
geo_field_settings($op, $field)
Implementation of hook_field_settings().
Code
<?php
function geo_field_settings($op, $field) {
$field_name = $field['field_name'];
switch ($op) {
case 'form':
$form = array();
// Force 'multiple' in order to guarantee a separate storage table.
$form['multiple'] = array('#type' => 'value', '#value' => 1);
// Store the geometry type for this field.
$form['geo_type'] = array(
'#type' => 'select',
'#title' => t('Data type'),
'#options' => geo('supported_types'),
'#default_value' => $field['geo_type'],
'#description' => t('Choose the datatype that best describes the information you are storing. "Point" is suitable for addresses and other fixed points, but you may also choose "Linestring" for lines or tracks, and "Polygon" for shapes and areas.'),
'#disabled' => !empty($field['geo_type']),
);
if (!isset($field['geo_enabled'])) $field['geo_enabled'] = false;
$form['geo_enabled'] = array('#type' => 'value', '#value' => $field['geo_enabled']);
// TODO pick the SRID for this column
if (!isset($field['srid'])) $field['srid'] = GEO_SRID_DEFAULT;
$form['srid'] = array('#type' => 'value', '#value' => $field['srid']);
return $form;
case 'save':
return array('srid', 'geo_enabled', 'geo_type');
case 'database columns':
// Use a well-known-text column for each field.
// We'll add a geospatial field separately, which will mirror this value.
$spec = array(
'wkt' => array(
'type' => 'text',
'size' => 'big',
'not null' => FALSE,
'description' => t('Well-known-text format'),
),
'geo' => array(
'type' => 'blob', // This column will be replaced in _geo_field_init.
'geo_type' => $field['geo_type'],
'not null' => TRUE,
'description' => t('Geometry field'),
),
);
// Add lat/lon values for point fields ( or centroid for others ).
$spec['lat'] = array(
'type' => 'float',
'size' => 'big',
'description' => t('Latitude'),
);
$spec['lon'] = array(
'type' => 'float',
'size' => 'big',
'description' => t('Longitude'),
);
return $spec;
case 'views data':
// Start with default views data, as constructed by CCK.
$data = content_views_field_views_data($field);
$table = content_views_tablename($field);
// Copy the wkt item to geo, and add handlers for the geospatial field.
$wkt = $field['field_name'] .'_wkt';
$geo = $field['field_name'] .'_geo';
$dst = $field['field_name'] .'_dst';
$data[$table][$geo] = $data[$table][$dst] = $data[$table][$wkt];
unset($data[$table][$wkt]);
// Set field handler to our own.
$data[$table][$geo]['field']['field'] = $geo;
$data[$table][$geo]['field']['handler'] = 'views_handler_field_geo_field';
$data[$table][$geo]['field']['geo_type'] = $field['geo_type'];
// Add a field handler for distance.
$data[$table][$dst]['field']['title'] .= ' - '. t('Distance');
$data[$table][$dst]['field']['field'] = $geo;
$data[$table][$dst]['field']['handler'] = 'views_handler_field_geo_distance';
$data[$table][$dst]['field']['float'] = TRUE;
$data[$table][$dst]['field']['click sortable'] = TRUE;
$data[$table][$dst]['filter']['title'] .= ' - '. t('Distance');
$data[$table][$dst]['filter']['handler'] = 'views_handler_filter_geo_distance';
$data[$table][$dst]['filter']['field'] = $geo;
$data[$table][$dst]['sort']['handler'] = 'views_handler_sort_geo_distance';
$data[$table][$dst]['sort']['field'] = $geo;
$data[$table][$dst]['field']['geo_type'] = $field['geo_type'];
// Set filter handler to Geo's built-in geo filters.
$data[$table][$geo]['filter']['field'] = $geo;
$data[$table][$geo]['filter']['handler'] = 'views_handler_filter_geo';
$data[$table][$geo]['filter']['geo_type'] = $field['geo_type'];
return $data;
}
}
?> 