function leaflet_widget_field_widget_form in Leaflet Widget for Geofield 7.2
Same name and namespace in other branches
- 7 leaflet_widget.module \leaflet_widget_field_widget_form()
Implements hook_field_widget_form().
File
- ./
leaflet_widget.module, line 132 - Leaflet widget module for Geofield.
Code
function leaflet_widget_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$settings = $instance['widget']['settings'];
$element['#type'] = 'fieldset';
// $element['input_format'] is not a db field, but we use it determine how to
// parse/calculate values in our widget.
$element['input_format'] = array(
'#type' => 'value',
'#attributes' => array(
'class' => array(
'geofield_input_format',
),
),
'#value' => GEOFIELD_INPUT_AUTO_DISCOVER,
);
switch ($instance['widget']['type']) {
case 'leaflet_widget_widget':
$id = 'leaflet-widget_' . drupal_html_id(str_replace('_', '-', $instance['field_name']));
$class = 'leaflet-widget';
$style = 'height: 300px;';
$settings['map']['widget'] = array();
$settings['map']['widget']['attach'] = "{$id}-input";
$settings['map']['widget']['multiple'] = FALSE;
$settings['map']['widget']['autoCenter'] = $settings['map']['auto_center'];
if ($field['cardinality'] != 1) {
$settings['map']['widget']['multiple'] = TRUE;
// Leaflet.widget treats multiple == true && !cardinality as
// 'unlimited'.
$settings['map']['widget']['cardinality'] = $field['cardinality'] > 0 ? $field['cardinality'] : 0;
}
// Provide container markup for map form element.
$container = "<div id=\"{$id}\" class=\"{$class}\" style=\"{$style}\"></div>";
$element['leaflet_widget'] = array(
'#markup' => $container,
);
$element['input_format']['#value'] = GEOFIELD_INPUT_GEOJSON;
// Overriding Geofield's validation handler.
$element['#element_validate'] = array(
'leaflet_widget_widget_validate',
);
// Prepare existing field values to be rendered in widget.
$geom_type = 'wkt';
if (!empty($form_state['process_input'])) {
// If the input was processed it ran through
// leaflet_widget_process_geojson() which uses geofield_compute_values()
// and this function returns wkb format. So adjust our parsing to avoid
// nasty sideeffects.
$geom_type = 'wkb';
}
$collection = leaflet_widget_widget_prepare_items($items, $geom_type);
$element['geom'] = array(
'#type' => 'hidden',
'#title' => check_plain($instance['label']),
'#description' => check_plain($instance['description']),
'#default_value' => drupal_json_encode($collection),
'#required' => $instance['required'],
);
$element['geom']['#attributes']['id'] = $settings['map']['widget']['attach'];
// Include javascript.
$element['#attached']['library'][] = array(
'leaflet_widget',
'widget',
);
// Settings and geo-data are passed to the widget keyed by field id.
$element['#attached']['js'][] = array(
'type' => 'setting',
'data' => array(
'leaflet_widget_widget' => array(
$id => $settings,
),
),
);
// If geocoder is enabled add geocoder field.
if (!empty($settings['geocoder']['enabled']) && module_exists('geocoder')) {
$geocoder_handler = geocoder_get_handler($settings['geocoder']['handler']);
$element['geocoder'] = array(
'#type' => 'textfield',
'#title' => t('Geo-Coding'),
'#description' => t('Enter an address and click "Add" to insert it as marker on the map.'),
'#attributes' => array(
'class' => array(
'geocoder',
),
),
'#field_suffix' => '<a href="#" class="geocoder-submit">' . t('Add') . '</a>',
);
}
break;
}
return $element;
}