'map/user', 'type' => MENU_NORMAL_ITEM, 'title' => t('User locations'), 'access' => user_access('show user map'), 'callback' => 'gmap_location_user_page', ); $items[] = array( 'path' => 'map/user/load', 'type' => MENU_CALLBACK, 'access' => user_access('show user map'), 'callback' => 'gmap_location_user_point', ); $items[] = array( 'path' => 'map/node', 'type' => MENU_NORMAL_ITEM, 'title' => t('Node locations'), 'access' => user_access('show node map'), 'callback' => 'gmap_location_node_page', ); $items[] = array( 'path' => 'map/node/load', 'type' => MENU_CALLBACK, 'access' => user_access('show node map'), 'callback' => 'gmap_location_node_point', ); $items[] = array( 'path' => 'admin/settings/gmap_location', 'type' => MENU_NORMAL_ITEM, 'title' => t('GMap Location'), 'access' => user_access('administer site configuration'), 'callback' => 'drupal_get_form', 'callback arguments' => array('gmap_location_admin_settings'), 'description' => t('Configure GMap Location settings.'), ); } return $items; } /** * Draws a page with a google map that has all of the site users. */ function gmap_location_user_page() { global $user; $locationbyuser = array(); $output ='
'. t(variable_get('gmap_user_map_header', 'This map illustrates the extent of users of this website. Each marker indicates a user that has entered their locations.')) ."
\n"; // Find default marker $default_marker = variable_get('gmap_user_map_marker', 'drupal'); // Determine if any roles override default setting $roles = user_roles(TRUE); $roles_override = array(); foreach ($roles as $rid => $role) { if (variable_get("gmap_role_map_marker_$rid", $default_marker) != $default_marker) { $roles_override[$rid] = $role; } } $thismap = array_merge( gmap_defaults(), gmap_parse_macro(variable_get('gmap_user_map', '[gmap|id=usermap|center=30,0|zoom=2|width=100%|height=400px]')) ); $result=db_query("SELECT * FROM {location} WHERE (longitude !=0 OR latitude !=0) AND type='user'"); $mode = $thismap['markermode']; while ($u=db_fetch_object($result)) { $account = user_load(array('uid' => $u->eid)); $dupes = array_intersect($account->roles, $roles_override); if (empty($dupes)) { $marker = $default_marker; } else { $key = key($dupes); $marker = variable_get("gmap_role_map_marker_$key", $default_marker); } if (user_access('user locations')) { if ($mode==1) { $newmarker['text'] = theme('gmap_location_user_html', $account); } else if ($mode == 2) { $newmarker['link'] = url('user/'. $account->uid); } $newmarker['latitude'] = $u->latitude; $newmarker['longitude'] = $u->longitude; $newmarker['markername'] = $marker; $newmarker['opts']['title'] = check_plain($account->name); $locationbyuser[$u->eid] = array('latitude' => $u->latitude, 'longitude' => $u->longitude); } else { $newmarker['latitude']= $u->latitude; $newmarker['longitude']= $u->longitude; $newmarker['markername'] = $marker; } $thismap['markers'][]=$newmarker; } if (user_access('user locations') && function_exists('buddylist_get_buddies') && count($locationbyuser)>0) { //create lines for buddies if (!isset($thismap['shapes'])) { $thismap['shapes']=array(); } ksort($locationbyuser); foreach ($locationbyuser as $key => $value) { $buddies= buddylist_get_buddies($key); foreach ($buddies as $bkey => $bvalue) { if ($bkey > $key && isset($locationbyuser[$bkey])) { $thismap['shape'][] = array( 'points' => array($locationbyuser[$key], $locationbyuser[$bkey]), 'type' => 'line' ); } } } } $element = array( '#type' => 'gmap', '#map' => $thismap['id'], '#settings' => $thismap, ); $output .= theme('gmap', $element); if ($user->uid > 0) { $output .= ''. t('To add/change your location to the user map, edit your location.', array('@url' => url('user/'. $user->uid .'/edit/gmap_user'))) .'
'; } return $output; } /** * AHAH callback for getting the contents of a user point popup. */ function gmap_location_user_point() { $uid = arg(3); if (is_numeric($uid) && $account = user_load(array('uid' => $uid))) { echo theme('gmap_location_user_html', $account); exit(); } } /** * Theme function for displaying the user page. */ function theme_gmap_location_user_page($header, $map, $footer) { $output = "$header
\n$map
\n$footer
"; return $output; } /** * Draws a page with a google map with the node on it, or if no node is set all of the nodes on it. * * @param $nn * The node nid to draw on the map. If this is not set, or is null then all of the nodes will be drawn. */ function gmap_location_node_page($nid = NULL) { $nodemap = variable_get('gmap_node_map', array()); $markertypes = variable_get('gmap_node_markers', array()); $map = array_merge( gmap_defaults(), gmap_parse_macro($nodemap['macro'])); $mode = $map['markermode']; $map['rmtcallback'] = url('map/node/load'); if (!is_array($map['markers'])) { $map['markers'] = array(); } $add_sql = (is_numeric($nid) && $nid > 0) ? ' AND n.nid = %d' : ''; $result = db_query(db_rewrite_sql(" SELECT n.nid, n.type, n.title, l.latitude, l.longitude FROM {node} n INNER JOIN {location} l ON n.vid = l.eid WHERE l.type = '%s' AND (l.latitude != 0 OR l.longitude != 0) ". $add_sql), 'node', $nid); $count = 0; while ($row = db_fetch_object($result)) { $count++; $newmarker = array(); if ($mode == 1) { // Popup $newmarker['rmt'] = $row->nid; } elseif ($mode == 2) { // Link $newmarker['link'] = url('node/'. $row->nid); } $newmarker['latitude'] = $row->latitude; $newmarker['longitude'] = $row->longitude; $newmarker['markername'] = isset($markertypes[$row->type]) ? $markertypes[$row->type] : 'drupal'; $newmarker['opts']['title'] = $row->title; $map['markers'][] = $newmarker; } // Special stuff for single marker if ($count == 1) { // Center map on only marker. $map['latitude'] = $map['markers'][0]['latitude']; $map['longitude'] = $map['markers'][0]['longitude']; // Autoclick in single marker case. if ($mode == 1) { $map['markers'][0]['autoclick'] = TRUE; } } // Special cases for single node view. if (is_numeric($nid) && $node = node_load($nid)) { if (user_access('user locations') && $node->type == 'og') { // An OG is displayed as a map of the users who belong to the group. $rolemarkers = variable_get('gmap_role_markers', array()); $map['markers'] = array(); // Reset markers. $result = db_query(" SELECT MAX(r.rid) as role, l.eid as uid, l.latitude, l.longitude FROM {og_uid} o INNER JOIN {location} l ON o.uid = l.eid LEFT JOIN {users_roles} r ON l.eid = r.uid WHERE o.nid = %d AND o.is_active >= 1 AND l.type = '%s' AND (l.latitude != 0 OR l.longitude != 0) GROUP BY o.uid", $nid, 'user'); while ($row = db_fetch_object($result)) { $newmarker = array(); $newmarker['rmt'] = $nid .'/'. $row->uid; // Determine marker type to show. $newmarker['markername'] = $markertypes[DRUPAL_AUTHENTICATED_RID]; if ($row->role && isset($rolemarkers[$row->role])) { $newmarker['markername'] = $rolemarkers[$row->role]; } $newmarker['latitude'] = $row->latitude; $newmarker['longitude'] = $row->longitude; $map['markers'][] = $newmarker; } } } elseif ($count == 0) { // No results return drupal_not_found(); } return theme('gmap_location_node_page', $count, $nodemap['header'], theme('gmap', array('#settings' => $map)), $nodemap['footer'] ); } /** * AHAH callback for getting the contents of a node point popup. */ function gmap_location_node_point() { $nid = arg(3); $opt = arg(4); if (is_numeric($nid) && $node = node_load($nid)) { $output = ''; $type = strtr($node->type, '-', '_'); $output = theme($type .'_gmapnodelabel', $node, $opt); if (empty($output)) { $output = theme('gmapnodelabel', $node, $opt); } echo $output; exit(); } } /** * For OG nodes, we are passing a nid/uid pair. */ function theme_og_gmapnodelabel($node, $opt) { if (is_numeric($opt) && $account = user_load(array('uid' => $opt))) { $output = theme('user_picture', $account); $output .= theme('username', $account); echo $output; exit(); } } /** * Theme function for displaying the node page. */ function theme_gmap_location_node_page($count, $header, $map, $footer) { $output = "$header
\n$map
\n$footer
"; return $output; } /** * Admin Settings Page * */ function gmap_location_admin_settings() { $form['geocoding'] = array( '#type' => 'fieldset', '#title' => t('Geocode Locations'), ); $form['geocoding']['gmap_geocode'] = array( '#type' => 'radios', '#title' => t('Enable the Google Map API geocoding'), '#default_value' => variable_get('gmap_geocode', 1), '#options' => array(1 => 'Enabled', 0 => 'Disabled'), ); /////////////// @@@ User location stuff to move later $form['userloc'] = array( '#type' => 'fieldset', '#title' => t('Location settings for users'), ); $form['userloc']['gmap_user'] = array( '#type' => 'checkbox', '#title' => t('Profile map'), '#default_value' => variable_get('gmap_user', TRUE), '#description' => t('Let users set/edit their location in their profile.'), ); $form['userloc']['gmap_user_profile_category'] = array( '#type' => 'textfield', '#title' => t('Profile category title'), '#default_value' => variable_get('gmap_user_profile_category', "Location map"), '#size' => 50, '#maxlength' => 50, '#description' => t('Let users set/edit their location in their profile.'), ); /////////////// @@@ END User location stuff to move later $form['user'] = array( '#type' => 'fieldset', '#title' => t('User settings'), ); // gmap_user_map defaults $temp = variable_get('gmap_user_map', array( 'macro' => '[gmap |id=usermap|center=40,0|zoom=3|width=100%|height=400px]', 'header' => 'This map illustrates the extent of users of this website. Each marker indicates a user that has entered their locations.', 'footer' => '', )); $form['user']['gmap_user_map'] = array( '#type' => 'fieldset', '#title' => t('User Map (map/users)'), '#tree' => TRUE, ); $form['user']['gmap_user_map']['macro'] = array( '#type' => 'textfield', '#title' => t('Macro'), '#default_value' => $temp['macro'], '#size' => 50, '#maxlength' => 500, '#description' => t('The gmap macro where the user information will be diplayed on.'), ); $form['user']['gmap_user_map']['header'] = array( '#type' => 'textarea', '#title' => t('Page header'), '#description' => t('Text at the top of the user map.', array('@url' => url('map/users'))), '#default_value' => $temp['header'], '#cols' => 50, '#rows' => 6, ); $form['user']['gmap_user_map']['footer'] = array( '#type' => 'textarea', '#title' => t('Page footer'), '#description' => t('Text at the bottom of the user map.'), '#default_value' => $temp['footer'], '#cols' => 50, '#rows' => 6, ); // Option to use a different marker for each role $form['user']['gmap_role_markers'] = array( '#type' => 'fieldset', '#title' => t('Markers per role'), '#description' => t('Choose a marker to represent each user role on the user map. If a user belongs to multiple roles, the marker for the highest Role ID will be used.'), '#tree' => TRUE, ); // Retrieve and sort list of roles, sans anonymous user $roles = user_roles(TRUE); //asort($roles); $defaults = variable_get('gmap_role_markers', array()); // Create a selection box per role foreach ($roles as $rid => $role) { $form['user']['gmap_role_markers'][$rid] = array( '#type' => 'gmap_markerchooser', '#title' => t('%role (Role ID: %rid)', array('%role' => $role, '%rid' => $rid)), '#default_value' => isset($defaults[$rid]) ? $defaults[$rid] : 'drupal', ); } $form['node'] = array( '#type' => 'fieldset', '#title' => t('Node settings'), ); // gmap_node_map defaults $temp = variable_get('gmap_node_map', array( 'macro' => '[gmap |id=nodemap|center=40,0|zoom=3|width=100%|height=400px]', 'header' => 'This map illustrates the locations of the nodes on this website. Each marker indicates a node associated with a specific location.', 'footer' => '', )); $form['node']['gmap_node_map'] = array( '#type' => 'fieldset', '#title' => t('Node Map (map/nodes)'), '#tree' => TRUE, ); $form['node']['gmap_node_map']['macro'] = array( '#type' => 'textfield', '#title' => t('Macro'), '#default_value' => $temp['macro'], '#size' => 50, '#maxlength' => 500, '#description' => t('The gmap macro where the node information will be diplayed on.'), ); $form['node']['gmap_node_map']['header'] = array( '#type' => 'textarea', '#title' => t('Page header'), '#description' => t('Text at the top of the node map.'), '#default_value' => $temp['header'], '#cols' => 50, '#rows' => 6, ); $form['node']['gmap_node_map']['footer'] = array( '#type' => 'textarea', '#title' => t('Page footer'), '#description' => t('Text at the bottom of the node map.'), '#default_value' => $temp['footer'], '#cols' => 50, '#rows' => 6, ); // Option to use a different marker for each content type. $form['node']['gmap_node_markers'] = array( '#type' => 'fieldset', '#title' => t('Markers per content type'), '#description' => t('Choose a marker to represent each type of content on the node map.'), '#tree' => TRUE, ); $ntypes = node_get_types(); $defaults = variable_get('gmap_node_markers', array()); foreach ($ntypes as $key => $value) { $form['node']['gmap_node_markers'][$key] = array( '#type' => 'gmap_markerchooser', '#title' => t('Marker for '. $value->name), '#default_value' => isset($defaults[$key]) ? $defaults[$key] : 'drupal', ); if (intval(variable_get('location_maxnum_'. $key, 0)) === 0) { $form['node']['gmap_node_markers'][$key]['#description'] = t('This content type is not currently Location enabled.'); } } return system_settings_form($form); } /** * Draw block of location for current node. */ function gmap_location_block($op = 'list', $delta = 0, $edit = array()) { switch ($op) { case 'list': $blocks[0]['info'] = t('Location map'); $blocks[1]['info'] = t('Author map'); return $blocks; case 'configure': $form = array(); if ($delta == 0) { $form['gmap_location_block_macro'] = array( '#type' => 'textfield', '#title' => t('Map Macro'), '#size' => 60, '#maxlength' => 500, '#description' => t('A macro to be used as a base map for the location block. This map will be recentered on the location, so the center is not that important.Alternate base map macros can be entered for a specific node type below.'), '#default_value' => variable_get('gmap_location_block_macro', '[gmap |id=block0 |zoom=10 |width=100% |height=200px |control=Small |type=Map |behavior=+notype] '), ); $ntypes=node_get_types(); foreach ($ntypes as $key => $value) { if (variable_get('location_maxnum_'. $key, 0)) { $form['gmap_location_block_macro_'. $key] = array( '#type' => 'textfield', '#title' => t('Map Macro for '. $value->name), '#size' => 60, '#maxlength' => 500, '#default_value' => variable_get('gmap_location_block_macro_'. $key, ''), ); } } } elseif ($delta == 1) { $form['gmap_location_author_block_macro'] = array( '#type' => 'textfield', '#title' => t('Map Macro'), '#size' => 60, '#maxlength' => 500, '#description' => t('A macro to be used as a base map for the location block author. This map will be recentered on the location, so the center is not that important.'), '#default_value' => variable_get('gmap_location_author_block_macro', '[gmap |zoom=10 |width=100% |height=200px |control=Small |type=Map |behavior=+notype] '), ); $ntypes = node_get_types(); foreach ($ntypes as $key => $type) { $form['gmap_location_author_block_'. $key] = array( '#type' => 'checkbox', '#title' => t('Author block enabled for %type content type', array('%type' => $type->name)), '#default_value' => variable_get('gmap_location_author_block_'. $key, 0), ); } } return $form; case 'save': if ($delta == 0) { // Have Drupal save the string to the database. variable_set('gmap_location_block_macro', $edit['gmap_location_block_macro']); $ntypes = node_get_types(); foreach ($ntypes as $key => $value) { if (variable_get('location_maxnum_'. $key, 0)) { variable_set('gmap_location_block_macro_'. $key, $edit['gmap_location_block_macro_'. $key]); } } } elseif ($delta == 1) { // Have Drupal save the string to the database. variable_set('gmap_location_author_block_macro', $edit['gmap_location_author_block_macro']); $ntypes = node_get_types(); foreach ($ntypes as $key => $value) { variable_set('gmap_location_author_block_'. $key, $edit['gmap_location_author_block_'. $key]); } } return; case 'view': switch ($delta) { case 0: if (arg(0)=='node' && is_numeric(arg(1))) { return gmap_location_block_view(arg(1)); } break; case 1: if (arg(0)=='node' && is_numeric(arg(1))) { return gmap_location_author_block_view(arg(1)); } break; } } } function _gmap_location_getlatlon($node) { if (isset($node->location['latitude']) && isset($node->location['longitude'])) { return $node->location; } return false; } function gmap_location_block_view($nid) { $block = array(); $node = node_load($nid); if ($node->locations) { $markertypes = variable_get('gmap_node_markers', array()); $markers = array(); foreach ($node->locations as $loc) { // @@@ Todo: Client side geocoding if ($loc['latitude'] || $loc['longitude']) { $markers[] = array( 'latitude' => $loc['latitude'], 'longitude' => $loc['longitude'], 'markername' => isset($markertypes[$row->type]) ? $markertypes[$row->type] : 'drupal', ); } } if (!empty($markers)) { if (strlen(variable_get('gmap_location_block_macro_'. $node->type, '')) > 0) { $macro = variable_get('gmap_location_block_macro_'. $node->type, ''); } else { $macro = variable_get('gmap_location_block_macro', '[gmap |id=block0 |zoom=10 |width=100% |height=200px |control=Small |type=Map |behavior=+autozoom,+notype] '); } $map = gmap_parse_macro($macro); $map['markers'] = $markers; // @@@ $map['behavior']['autozoom'] = true; $map['behavior']['notype'] = true; $map['controltype'] = 'None'; $block['subject'] = t('Location'); $block['content'] = theme('gmap', array('#settings' => $map)); } } return $block; } function gmap_location_author_block_view($nid) { $block = array(); $node = node_load($nid); if (variable_get('gmap_location_author_block_'. $node->type, FALSE)) { $result = db_fetch_array(db_query("SELECT latitude, longitude FROM {location} WHERE eid = %d AND type = 'user'", $node->uid)); if (!$result) { return; } $macro = variable_get('gmap_location_block_macro_'. $node->type, FALSE); if (!$macro) { $macro = variable_get('gmap_location_block_macro', '[gmap |zoom=10 |width=100% |height=200px |control=Small |type=Map]'); } $map = array( '#map' => 'gmap_location_authorblock', '#settings' => gmap_parse_macro($macro), ); $map['#settings']['behavior']['notype'] = TRUE; $map['#settings']['markers'] = array(); $map['#settings']['markers'][] = array( 'latitude' => $result['latitude'], 'longitude' => $result['longitude'], 'markername' => variable_get('gmap_user_map_marker', 'drupal'), 'label' => check_plain($node->name), ); $map['#settings']['latitude'] = $result['latitude']; $map['#settings']['longitude'] = $result['longitude']; $block['subject'] = t('Author Location'); $block['content'] = theme('gmap', $map); } return $block; } function gmap_location_map_add_node($basemap, $node, $label='') { $location = _gmap_location_getlatlon($node); if (empty($basemap['markers'])) { $thismap['markers']=array(); } $newmarker['latitude'] = $location['latitude']; $newmarker['longitude'] = $location['longitude']; $newmarker['markername'] = variable_get('gmap_node_marker_'. $node->type, ''); $newmarker['label'] = $label; $basemap['markers'][] = $newmarker; $basemap['latitude'] = $location['latitude']; $basemap['longitude'] = $location['longitude']; return $basemap; } //Any module can create a default theme for the display of nodes of the node type by //creating a function theme_hook_gmapnodelabel a theme could then further specify it //by creating a mytheme_nodetype_gmapnodelabel or could simply create a default //node type by creating a mytheme_gmapnodelabel function theme_acidfree_gmapnodelabel($n) { $out = strtr(theme_acidfree_print_thumb_photo($n), "'\n", '" '); //