You are here

function leaflet_widget_field_widget_form in Leaflet Widget for Geofield 7.2

Same name and namespace in other branches
  1. 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;
}