' . t('About') . '';
$output .= '
' . t('The Leaflet module provides integration with Leaflet, the modern open-source JavaScript library for mobile-friendly interactive maps.') . '
';
$output .= '' . t('The module provides a field formatter that can show a map for fields that contain geospatial data. It includes Views integration that plots data on a map (using the sub module Leaflet Views) and an API for displaying data on a map. For more information, see the online documentation for the Leaflet module.', array('@leaflet' => 'http://drupal.org/node/1645460')) . '
';
$output .= '' . t('Uses') . '
';
$output .= '';
$output .= '- ' . t('Field Formatter') . '
';
$output .= '- ' . t('Leaflet includes a field formatter that makes it possible to show geospatial data (for example longitude and latitude) on a map. You can use tokens instead of static text for Popups that use the Leaflet field formatter.') . '
';
$output .= '- ' . t('Views Integration') . '
';
$output .= '- ' . t('You can have maps on node displays and maps on views displays, thanks to Views integration. The process is very similar to adding and setting up a plugin on Views. To render a map using Views, enable the included module Leaflet_views.') . '
';
$output .= '- ' . t('Leaflet API') . '
';
$output .= '- ' . t('Rendering a map is as simple as calling a single method, leaflet_render_map(), which takes 3 parameters $map, $features, and $height.') . '
';
return $output;
}
}
/**
* Implements hook_theme().
*/
function leaflet_theme($existing, $type, $theme, $path) {
return array(
'leaflet_map' => array(
'arguments' => array('map_id' => NULL, 'height' => '400px'),
'template' => 'leaflet_map',
),
);
}
/**
* Implements hook_libraries_info().
*/
function leaflet_libraries_info() {
$libraries['leaflet'] = array(
// Only used in administrative UI of Libraries API.
'name' => 'Leaflet JavaScript Library',
'vendor url' => 'http://leafletjs.com/',
'download url' => 'http://cdn.leafletjs.com/leaflet/v1.0.2/leaflet.zip',
'version arguments' => array(
'file' => 'leaflet.js',
// Handle patterns like version: "1.0.2+4bbb16c"
'pattern' => '/version[=: ]*[\'"]([\d+\.]+[\-a-z\.\d]*)[\'"]/',
),
'files' => array(
'js' => array(
// This setting is needed in order to properly render market images.
'leaflet_root_url' => array(
'type' => 'inline',
'data' => 'L_ROOT_URL = "' . base_path() . libraries_get_path('leaflet') . '/";',
'group' => JS_LIBRARY,
),
'leaflet.js' => array(
'type' => 'file',
'group' => JS_LIBRARY,
),
// For AdvAgg module. See [#2294639] This runs after leaflet.js.
'leaflet_imagepath' => array(
'type' => 'inline',
// Note: ends with "/"
'data' => 'L.Icon.Default.imagePath = "' . base_path() . libraries_get_path('leaflet') . '/images/";',
),
),
'css' => array(
'leaflet.css' => array(
'type' => 'file',
'media' => 'all',
),
'leaflet.ie.css' => array(
'browsers' => array(
'IE' => 'lte IE 8',
'!IE' => FALSE,
),
),
),
),
'integration files' => array(
'leaflet' => array(
'js' => array('leaflet.drupal.js'),
),
),
);
return $libraries;
}
/**
* Attach Leaflet-required client files and return renderable array for a map.
*
* @param array $map
* Map definition as returned my leaflet_map_get_info();
* @param array $features
* Associative array of map features.
* @param string $height
* The height of the map.
*
* @return array
* A renderable array.
*/
function leaflet_build_map($map, $features = array(), $height = '400px') {
// [#2777321] With two maps on 1 page, drupal_html_id() sometimes fails to
// return a unique id. Make it so.
$map_id = drupal_html_id('leaflet_map') . '-' . rand();
$build = array(
'#theme' => 'html_tag',
'#tag' => 'div',
'#value' => '',
'#attributes' => array(
'id' => $map_id,
'style' => 'height: ' . $height,
),
);
// Allow map definitions to provide a default icon:
if (isset($map['icon']['iconUrl'])) {
foreach ($features as &$feature) {
if (!isset($feature['icon'])) {
$feature['icon'] = $map['icon'];
}
}
}
$settings = array(
'mapId' => $map_id,
'map' => $map,
'features' => $features,
);
drupal_alter('leaflet_map_prebuild', $settings);
$build['#attached']['js'][] = array(
'data' => array('leaflet' => array($settings)),
'type' => 'setting',
);
$build['#attached']['css'][] = array(
'data' => drupal_get_path('module', 'leaflet') . '/leaflet_extras.css',
);
// Load the leaflet library, which includes integration files.
// libraries_load('leaflet');
// See [2460643]
$build['#attached']['libraries_load'][] = array('leaflet');
// Let other modules properly attach libraries as well [#2567387]
drupal_alter('leaflet_build_map', $build);
return $build;
}
/**
* DEPRECATED. Use leaflet_build_map() instead.
*
* Load all Leaflet required client files and return markup for a map.
*
* @param array $map
* Map definition as returned my leaflet_map_get_info();
* @param array $features
* Associative array of map features.
* @param string $height
* The height of the map.
*
* @return string
* map markup
*/
function leaflet_render_map($map, $features = array(), $height = '400px') {
$build = leaflet_build_map($map, $features, $height);
return render($build);
}
/**
* Get all available Leaflet map definitions.
*
* @string $map
* The name of the map defined in hook_leaflet_map_get_info().
*/
function leaflet_map_get_info($map = NULL) {
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
$drupal_static_fast['leaflet_map_info'] = &drupal_static(__FUNCTION__);
}
$map_info = &$drupal_static_fast['leaflet_map_info'];
if (empty($map_info)) {
if ($cache = cache_get("leaflet_map_info")) {
$map_info = $cache->data;
}
else {
$map_info = module_invoke_all('leaflet_map_info');
// Let other modules alter the map info.
drupal_alter('leaflet_map_info', $map_info);
cache_set("leaflet_map_info", $map_info);
}
}
if (empty($map)) {
return $map_info;
}
elseif (isset($map_info[$map])) {
return $map_info[$map];
}
}
/**
* Implements hook_leaflet_map_info().
*
* Return a default map for the module.
*/
function leaflet_leaflet_map_info() {
return array(
'OSM Mapnik' =>
array(
'label' => 'OSM Mapnik',
'description' => t('Leaflet default map.'),
// 'center' is used when map contains no features, or every time the map
// is loaded if "force" is TRUE. Otherwise, the map will center itself
// intelligently based on the features in the map.
// RdB: bad things happen when 'center' is specified and Leaflet
// MarkerCluster is used, see https://drupal.org/node/2144935
// Also, a hard-coded center is not a great idea.
//'center' => array(
// 'lat' => 45.526513,
// 'lon' => -122.674833,
// 'force' => FALSE,
//),
'settings' => array(
// Setting "zoom" forces a zoom level on every map load.
//'zoom' => 17,
// The "zoomDefault" is only used when no features are present.
'zoomDefault' => 10,
'minZoom' => 0,
'maxZoom' => 18,
'dragging' => TRUE,
'touchZoom' => TRUE,
'scrollWheelZoom' => TRUE,
'doubleClickZoom' => TRUE,
'zoomControl' => TRUE,
'attributionControl' => TRUE,
'trackResize' => TRUE,
'fadeAnimation' => TRUE,
'zoomAnimation' => TRUE,
'closePopupOnClick' => TRUE,
),
'layers' => array(
'earth' => array(
'urlTemplate' => '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
'options' => array(
'attribution' => 'OSM Mapnik',
),
),
),
),
);
}