openlayers_cck_widget

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] : '',
  );
}
?>