| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- <?php
- /**
- * @file
- * Provides FormAPI element callbacks for geofield_latlon and geofield_proximity.
- */
- /**
- * Diameter of the Earth in kilometers.
- */
- define('GEOFIELD_KILOMETERS', 6371);
- /**
- * Diameter of the Earth in meters.
- */
- define('GEOFIELD_METERS', 6371000);
- /**
- * Diameter of the Earth in miles.
- */
- define('GEOFIELD_MILES', 3959);
- /**
- * Diameter of the Earth in yards.
- */
- define('GEOFIELD_YARDS', 6975175);
- /**
- * Diameter of the Earth in feet.
- */
- define('GEOFIELD_FEET', 20925525);
- /**
- * Diameter of the Earth in nautical miles.
- */
- define('GEOFIELD_NAUTICAL_MILES', 3444);
- /**
- * Implements hook_element_info().
- */
- function geofield_element_info() {
- return array(
- 'geofield_latlon' => array(
- '#input' => TRUE,
- '#process' => array('geofield_latlon_element_process'),
- '#element_validate' => array('geofield_latlon_element_validate'),
- '#theme' => array('geofield_latlon'),
- '#theme_wrappers' => array('fieldset'),
- ),
- 'geofield_bounds' => array(
- '#input' => TRUE,
- '#process' => array('geofield_bounds_element_process'),
- '#element_validate' => array('geofield_bounds_element_validate'),
- '#theme' => array('geofield_bounds'),
- '#theme_wrappers' => array('fieldset'),
- ),
- 'geofield_proximity' => array(
- '#input' => FALSE,
- '#tree' => TRUE,
- '#theme_wrappers' => array('geofield_proximity'),
- '#process' => array('geofield_proximity_element_process'),
- ),
- );
- }
- /**
- * Process function for geofield_latlon.
- */
- function geofield_latlon_element_process($element, &$form_values) {
- $element['#tree'] = TRUE;
- $element['#input'] = TRUE;
- $element['lat'] = array(
- '#type' => 'textfield',
- '#title' => t('Latitude'),
- '#required' => (!empty($element['#required'])) ? $element['#required'] : FALSE,
- '#default_value' => (!empty($element['#default_value']['lat'])) ? $element['#default_value']['lat'] : '',
- '#attributes' => array(
- 'class' => array('geofield-lat'),
- ),
- );
- $element['lon'] = array(
- '#type' => 'textfield',
- '#title' => t('Longitude'),
- '#required' => (!empty($element['#required'])) ? $element['#required'] : FALSE,
- '#default_value' => (!empty($element['#default_value']['lon'])) ? $element['#default_value']['lon'] : '',
- '#attributes' => array(
- 'class' => array('geofield-lon'),
- ),
- );
- unset($element['#value']);
- // Set this to false always to prevent notices.
- $element['#required'] = FALSE;
- if (!empty($element['#geolocation']) && $element['#geolocation'] == TRUE) {
- $element['#attached']['js'][] = drupal_get_path('module', 'geofield') . '/js/geolocation.js';
- $element['geocode'] = array(
- '#type' => 'button',
- '#value' => t('Find my location'),
- '#name' => 'geofield-html5-geocode-button',
- );
- $element['#attributes']['class'] = array('auto-geocode');
- }
- return $element;
- }
- /**
- * Element validation function for geofield_latlon.
- */
- function geofield_latlon_element_validate($element, &$form_values) {
- $components = array(
- 'lat' => array(
- 'title' => 'Latitude',
- 'range' => 90,
- ),
- 'lon' => array(
- 'title' => 'Longitude',
- 'range' => 180,
- ),
- );
- $allFilled = TRUE;
- $anyFilled = FALSE;
- foreach ($components as $key => $component) {
- if (!empty($element[$key]['#value'])) {
- if (!is_numeric($element[$key]['#value'])) {
- form_error($element[$key], t('@title: @component_title is not numeric.', array('@title' => $element['#title'], '@component_title' => $component['title'])));
- }
- elseif (abs($element[$key]['#value']) > $component['range']) {
- form_error($element[$key], t('@title: @component_title is out of bounds.', array('@title' => $element['#title'], '@component_title' => $component['title'])));
- }
- }
- if ($element[$key]['#value'] == '') {
- $allFilled = FALSE;
- }
- else {
- $anyFilled = TRUE;
- }
- }
- if ($anyFilled && !$allFilled) {
- foreach ($components as $key => $component) {
- if ($element[$key]['#value'] == '') {
- form_error($element[$key], t('@title: @component_title must be filled too.', array('@title' => $element['#title'], '@component_title' => $component['title'])));
- }
- }
- }
- }
- /**
- * Process function for geofield_bounds.
- */
- function geofield_bounds_element_process($element, &$form_values) {
- $element['#tree'] = TRUE;
- $element['top'] = array(
- '#type' => 'textfield',
- '#title' => t('Top'),
- '#required' => (!empty($element['#required'])) ? $element['#required'] : FALSE,
- '#default_value' => (!empty($element['#default_value']['top'])) ? $element['#default_value']['top'] : '',
- '#attributes' => array(
- 'class' => array('geofield-top'),
- ),
- );
- $element['right'] = array(
- '#type' => 'textfield',
- '#title' => t('Right'),
- '#required' => (!empty($element['#required'])) ? $element['#required'] : FALSE,
- '#default_value' => (!empty($element['#default_value']['right'])) ? $element['#default_value']['right'] : '',
- '#attributes' => array(
- 'class' => array('geofield-right'),
- ),
- );
- $element['bottom'] = array(
- '#type' => 'textfield',
- '#title' => t('Bottom'),
- '#required' => (!empty($element['#required'])) ? $element['#required'] : FALSE,
- '#default_value' => (!empty($element['#default_value']['bottom'])) ? $element['#default_value']['bottom'] : '',
- '#attributes' => array(
- 'class' => array('geofield-bottom'),
- ),
- );
- $element['left'] = array(
- '#type' => 'textfield',
- '#title' => t('Left'),
- '#required' => (!empty($element['#required'])) ? $element['#required'] : FALSE,
- '#default_value' => (!empty($element['#default_value']['left'])) ? $element['#default_value']['left'] : '',
- '#attributes' => array(
- 'class' => array('geofield-left'),
- ),
- );
- unset($element['#value']);
- // Set this to false always to prevent notices.
- $element['#required'] = FALSE;
- return $element;
- }
- /**
- * Element validation function for geofield_latlon.
- */
- function geofield_bounds_element_validate($element, &$form_values) {
- $components = array(
- 'top' => array(
- 'title' => 'Top',
- 'range' => 90,
- ),
- 'right' => array(
- 'title' => 'Right',
- 'range' => 180,
- ),
- 'bottom' => array(
- 'title' => 'Bottom',
- 'range' => 90,
- ),
- 'left' => array(
- 'title' => 'Left',
- 'range' => 180,
- ),
- );
- $allFilled = TRUE;
- $anyFilled = FALSE;
- foreach ($components as $key => $component) {
- if (!empty($element[$key]['#value'])) {
- if (!is_numeric($element[$key]['#value'])) {
- form_error($element[$key], t('@title: @component_title is not numeric.', array('@title' => $element['#title'], '@component_title' => $component['title'])));
- }
- elseif (abs($element[$key]['#value']) > $component['range']) {
- form_error($element[$key], t('@title: @component_title is out of bounds.', array('@title' => $element['#title'], '@component_title' => $component['title'])));
- }
- }
- if ($element[$key]['#value'] == '') {
- $allFilled = FALSE;
- }
- else {
- $anyFilled = TRUE;
- }
- }
- if ($anyFilled && !$allFilled) {
- foreach ($components as $key => $component) {
- if ($element[$key]['#value'] == '') {
- form_error($element[$key], t('@title: @component_title must be filled too.', array('@title' => $element['#title'], '@component_title' => $component['title'])));
- }
- }
- }
- }
- /**
- * Process function for the proximity form element
- */
- function geofield_proximity_element_process($element, &$form_state, $form) {
- $element['#attributes'] = array('class' => array('clearfix'));
- $element['#tree'] = TRUE;
- $element['#attached']['css'] = array(drupal_get_path('module', 'geofield') . '/css/proximity-element.css');
- //Create the textfield for distance
- $element['distance'] = array(
- '#type' => 'textfield',
- '#title' => t('Distance'),
- '#default_value' => !empty($element['#default_value']['distance']) ? $element['#default_value']['distance'] : '',
- '#title_display' => 'invisible',
- // Allow decimal numbers as distances
- '#element_validate' => array('element_validate_number'),
- );
- // If #geofield_range is TRUE, create second option for range.
- if (!empty($element['#geofield_range']) && $element['#geofield_range'] == TRUE) {
- $element['distance2'] = array(
- '#type' => 'textfield',
- '#title' => t('Distance End'),
- '#default_value' => !empty($element['#default_value']['distance2']) ? $element['#default_value']['distance2'] : '',
- '#title_display' => 'invisible',
- '#element_validate' => array('element_validate_number'),
- );
- }
- //Create dropdown for units
- $element['unit'] = array(
- '#type' => 'select',
- '#options' => geofield_radius_options(),
- '#title' => t('Unit'),
- '#default_value' => !empty($element['#default_value']['unit']) ? $element['#default_value']['unit'] : GEOFIELD_KILOMETERS,
- '#title_display' => 'invisible',
- );
- //Create textfield for geocoded input
- $element['origin'] = array(
- '#type' => (!empty($element['#origin_element'])) ? $element['#origin_element'] : 'textfield',
- '#title' => t('Origin'),
- '#prefix' => '<span class="geofield-proximity-origin-from">' . t('from') . '</span>',
- '#title_display' => 'invisible',
- '#required' => !empty($element['#required']) ? $element['#required'] : FALSE,
- '#default_value' => !empty($element['#default_value']['origin']) ? $element['#default_value']['origin'] : FALSE,
- );
- if (!empty($element['#origin_options'])) {
- $element['origin'] = array_merge($element['origin'], $element['#origin_options']);
- }
- if (isset($element['#element_validate'])) {
- array_push($element['#element_validate'], 'goefield_proximity_search_validate');
- }
- else {
- $element['#element_validate'] = array('geofield_proximity_search_validate');
- }
- return $element;
- }
- /**
- * Validate the geofield proximity search form item
- */
- function geofield_proximity_search_validate($element, &$form_state) {
- //If the origin is set, ensure the distance is set as well
- if (!empty($element['origin']['#value']) && trim($element['origin']['#value']) != '' && empty($element['distance']['#value']))
- form_set_error(implode('][', $element['#array_parents']) . '][distance', t('@title must be set when @origin is specified.', array('@title' => $element['distance']['#title'], '@origin' => $element['origin']['#title'])));
- }
- function geofield_theme($existing, $type, $theme, $path) {
- return array(
- 'geofield_latlon' => array(
- 'arguments' => array('element' => NULL),
- 'render element' => 'element',
- ),
- 'geofield_proximity' => array(
- 'render element' => 'element',
- ),
- );
- }
- /**
- * Theme wrapper for form item
- */
- function theme_geofield_proximity($vars) {
- $element = $vars['element'];
- $attributes = !empty($element['#wrapper_attributes']) ? $element['#wrapper_attributes'] : array('class' => array());
- $attributes['class'][] = 'geofield-proximity-field-wrapper';
- $attributes['class'][] = 'clearfix';
- $wrapper_attributes = array();
- $wrapper_attributes['class'][] = 'clearfix';
- if (isset($element['#children']))
- $element['#children'] = '<div id="' . $element['#id'] . '" ' . drupal_attributes($wrapper_attributes) . '>' . $element['#children'] . '</div>';
- $output = '<div ' . drupal_attributes($attributes) . '>' . theme('form_element', $element) . '</div>';
- return $output;
- }
- function theme_geofield_latlon($vars) {
- return drupal_render($vars['element']['lat']) . drupal_render($vars['element']['lon']) . drupal_render($vars['element']['geocode']);
- }
- /**
- * Returns options for radius of the Earth.
- */
- function geofield_radius_options() {
- return array(
- GEOFIELD_KILOMETERS => t('Kilometers'),
- GEOFIELD_METERS => t('Meters'),
- GEOFIELD_MILES => t('Miles'),
- GEOFIELD_YARDS => t('Yards'),
- GEOFIELD_FEET => t('Feet'),
- GEOFIELD_NAUTICAL_MILES => t('Nautical Miles'),
- );
- }
|