| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 | <?php/** * @file * Module file for geocoder module. */ include_once('geocoder.widget.inc');include_once('geocoder.services.inc');/** * The Geocode API call. * @example: *    geocoder('google','4925 Gair Ave, Terrace, BC'); *    geocoder('google','New York City',array('geometry_type' => 'bounds')); */function geocoder($handler, $data, $options = array()) {  ctools_include('plugins');    $processor = ctools_get_plugins('geocoder', 'geocoder_handler', $handler);  return call_user_func($processor['callback'], $data, $options);}/** * Implements hook_menu(). */function  geocoder_menu() {  // Admin settings for the site.  $items['admin/config/content/geocoder'] = array(    'title' => 'Geocoder settings',    'description' => 'Configuration for API keys.',    'page callback' => 'drupal_get_form',    'page arguments' => array('geocoder_admin_settings'),    'file' => 'geocoder.admin.inc',    'access arguments' => array('administer site configuration'),    'type' => MENU_NORMAL_ITEM, // optional  );  $items['geocoder/service/%'] = array(    'title' => 'AJAX / AJAJ geocoding service',    'description' => 'Provides basic callback for geocoding using JavaScript',    'page callback' => 'geocoder_service_callback',    'page arguments' => array(2),    'type' => MENU_CALLBACK,    'access arguments' => array(arg(2)),    'access callback' => 'geocoder_service_check_perms',  );  return $items;}/** * Geocoder Handler Information *  * Return a list of all handlers that might geocode something for you. * Optionally you may pass a field-type and get back a list of  * handlers that are compatible with that field. */function geocoder_handler_info($field_type = NULL) {  ctools_include('plugins');  static $handlers;  if (!$handlers) {    $handlers = ctools_get_plugins('geocoder', 'geocoder_handler');  }  if ($field_type) {    $field_handlers = $handlers;    foreach ($field_handlers as $i => $handler) {      if (!isset($handler['field_types']) || !in_array($field_type, $handler['field_types'])) {        unset($field_handlers[$i]);      }    }    return $field_handlers;  }  return $handlers;}/** * Fetch geocoder handler *  * Given a name, fetch the full handler definition */function geocoder_get_handler($handler_name) {  $handlers = geocoder_handler_info();  if (isset($handlers[$handler_name])) {    return $handlers[$handler_name];  }  else return FALSE;}/** * Get supported field types *  * Get a list of supported field types along with the processors that support them */function geocoder_supported_field_types() {  $supported = array();  $processors = geocoder_handler_info();  foreach ($processors as $processor) {    if (isset($processor['field_types'])) {      foreach ($processor['field_types'] as $field_type) {        $supported[$field_type][] = $processor['name'];      }    }  }    return $supported;}/** * Implementation of hook_ctools_plugin_api(). */function geocoder_ctools_plugin_api() {  return array('version' => 1);}/** * Implementation of hook_ctools_plugin_dierctory() to let the system know * we implement plugins. */function geocoder_ctools_plugin_directory($module, $plugin) {  return 'plugins/' . $plugin;}/** * Implements hook_ctools_plugin_type */function geocoder_ctools_plugin_type() {  return array(    'geocoder_handler' => array(),  );}// These functions have to do with providing AJAX / AHAH // service functionality so that users can make use of// geocoder interactively via JavaScript./** * Implements hook_permission(). *  * We define permissions for accessing geocoder over AJAX / services.  * There is one global permission which gives access to everything,  * and one permission per handler. The site-administrator can therefore * fine tune which handlers are accessible. Note that to use AJAX with * geocoder these permissions need to be set. */function geocoder_permission() {  $handler_info = geocoder_handler_info();  $perms = array(    'geocoder_service_all_handlers' =>  array(      'title' => t('Can use all Geocoder handlers through AJAX / service'),    ),  );  foreach ($handler_info as $name => $handler) {    $perms['geocoder_service_handler_' . $name] = array(      'title' => t('Can geocode using @handler through AJAX / service', array('@handler' => $handler['title'])),    );  }  return $perms;}/** * Geocoder service check permissions *  * Given a handler, check to see if the user has * permission to execute it via AJAX / services */ function geocoder_service_check_perms($handler) {  return (user_access('geocoder_service_all_handlers') || user_access('geocoder_service_handler_' . $handler));}/** * Page callback for AJAX / Geocoder service *  * This service can be accessed at /geocoder/service/<handler> * and takes the query-parameter "data". Optinally a "output" * paramater may also be passed. "output" corresponds to * geoPHP output formats. *  * Some examples: * /geocoder/service/google?data=4925 Gair Ave, Terrace, BC * /geocoder/service/wkt?data=POINT(10 10) * /geocoder/service/yahoo?data=94112&output=wkt  */ function geocoder_service_callback($handler) {  if (!isset($_GET['data'])) {    throw new Exception(t('No data parameter found'));    exit();  }    $format = isset($_GET['output']) ?  $_GET['output'] : 'json';    geophp_load();  geocoder_service_check_request($handler, $format);  $geom = geocoder($handler, $_GET['data']);    header('Content-Type: ' . geocoder_service_get_content_type($format));  print $geom->out($format);  exit();}/** * Get Content-Type for an output format *  * Given an output format, this helper function passes * a compatible HTTP content-type to be placed in the * header.  */ function geocoder_service_get_content_type($format) {  $types = array(    'json' => 'application/json',    'kml' => 'application/xml',    'georss' => 'application/xml',    'gpx' => 'application/xml',    'wkt' => 'text/plain',    'wkb' => 'text/plain',    'google_geocode' => 'text/plain',  );  return $types[$format];}/** * Geocoder Service Check Request *  * Check to make sure the request to the service is valid. This * checks to make sure the handler and the format exists, and  * also checks permission */ function geocoder_service_check_request($handler, $format, $check_ac = TRUE) {  if (!geocoder_get_handler($handler)) {    drupal_set_message(t('Could not find handler @handler', array('@handler' => $handler)), 'error');    drupal_not_found();    exit();  }  if (($format && $format != 'default') && !in_array($format, array_keys(geoPHP::getAdapterMap()))) {    throw new Exception(t('Could not find output-format @format', array('@format' => $format)), 'error');    exit();  }  if (!geocoder_service_check_perms($handler)) {    drupal_access_denied();    exit();  }}
 |