function search_by_proximity_hook($hook, $type, $return, $params) { $query = $params['query']; $coords = elgg_geocode_location($query); if (!$coords) { return $return; } $registered_entities = elgg_get_config('registered_entities'); $options = array('types' => array('object', 'user', 'group'), 'subtypes' => array_merge($registered_entities['object'], $registered_entities['user'], $registered_entities['group']), 'limit' => get_input('limit', 20), 'offset' => get_input('proximity_offset', 0), 'offset_key' => 'proximity_offset', 'count' => true); $options = add_order_by_proximity_clauses($options, $coords['lat'], $coords['long']); $options = add_distance_constraint_clauses($options, $coords['lat'], $coords['long'], SEARCH_RADIUS); $count = elgg_get_entities($options); if ($count) { $options['count'] = false; $entities = elgg_get_entities($options); } if ($entities) { foreach ($entities as $entity) { $name = search_get_highlighted_relevant_substrings(isset($entity->name) ? $entity->name : $entity->title, $query); $entity->setVolatileData('search_matched_title', $name); $location = search_get_highlighted_relevant_substrings($entity->getLocation(), $query); $entity->setVolatileData('search_matched_location', $location); $distance = get_distance($entity->getLatitude(), $entity->getLongitude(), $coords['lat'], $coords['long']); // distance in metres $distance = round($distance / 1000, 2); // distance in km $distance_str = elgg_echo('geo:search:proximity', array($query, $distance)); $entity->setVolatileData('search_proximity', $distance_str); } } return array('entities' => $entities, 'count' => $count); }
/** * Set session geopositioning * Cache geocode along the way * * @param string $location * @param float $latitude * @param float $longitude * @return void */ function set_geopositioning($location = '', $latitude = 0, $longitude = 0) { $location = sanitize_string($location); $lat = (double) $latitude; $long = (double) $longitude; $latlong = elgg_geocode_location($location); if ($latlong) { $latitude = elgg_extract('lat', $latlong); $longitude = elgg_extract('long', $latlong); } else { if ($location && $latitude && $longitude) { $dbprefix = elgg_get_config('dbprefix'); $query = "INSERT INTO {$dbprefix}geocode_cache\n\t\t\t\t(location, lat, `long`) VALUES ('{$location}', '{$lat}', '{$long}')\n\t\t\t\tON DUPLICATE KEY UPDATE lat='{$lat}', `long`='{$long}'"; insert_data($query); } } $_SESSION['geopositioning'] = array('location' => $location, 'latitude' => (double) $latitude, 'longitude' => (double) $longitude); }
/** * Set session geopositioning * Cache geocode along the way * * @param string $location * @param float $latitude * @param float $longitude * @return void */ function set_geopositioning($location = '', $latitude = 0, $longitude = 0) { $location = sanitize_string($location); $lat = (double) $latitude; $long = (double) $longitude; if (!$lat && !$long) { $latlong = elgg_geocode_location($location); if ($latlong) { $latitude = elgg_extract('lat', $latlong); $longitude = elgg_extract('long', $latlong); } } $_SESSION['geopositioning'] = array('location' => $location, 'latitude' => (double) $latitude, 'longitude' => (double) $longitude); }
/** * Geocode entity location and set latitude and longitude when 'location' metadata is created/updated * * @param type $event * @param type $type * @param type $metadata */ function hj_framework_geocode_location_metadata($event, $type, $metadata) { if ($metadata->name != 'location') { return true; } switch ($event) { case 'create': case 'update': $location = $metadata->value; if (is_array($location)) { $location = implode(', ', $location); } $coordinates = elgg_geocode_location($metadata->value); if ($coordinates) { $entity = get_entity($metadata->entity_guid); $entity->setLatLong($coordinates['lat'], $coordinates['long']); } else { register_error(elgg_echo('hj:framework:geocode:error')); } break; default: return true; break; } }