Jump to content

Map Marker Map


ryan

Recommended Posts

MarkupGoogleMap is going to attempt to fit to all the markers you add to it. So the zoom, lat, lng settings you send to it are only going to matter if you only send it 0 or 1 markers in $items. For instance, if you replace "$items" with "new PageArray()" then you should see your zoom, lat and lng options working. 

Link to comment
Share on other sites

I just wanted to bring to your attention that having an apostrophe in the title creates an error.  

Whenever I tried to create a map with locations where the title had an apostrophe in it (such as God's River, Manitoba) I would get an  "Uncaught SyntaxError: Unexpected identifier" and the map wouldn't display.  

I changed line 191 in MarkupGoogleMap.module from: 

$out .= "$id.addMarker($marker->lat, $marker->lng, '$url', '$title', ''); ";

to:

$out .= "$id.addMarker($marker->lat, $marker->lng, '$url', \"$title\", ''); "; 

and that seems to have fixed it. 

Link to comment
Share on other sites

MarkupGoogleMap is going to attempt to fit to all the markers you add to it. So the zoom, lat, lng settings you send to it are only going to matter if you only send it 0 or 1 markers in $items. For instance, if you replace "$items" with "new PageArray()" then you should see your zoom, lat and lng options working. 

The options are working alright but no markers show up. Do you mean it will only work with one marker? If so then how to get the markers from a 'find' show up on the map? Basically just like in the 'skyscrapers' website. As far as I can tell you've done it totally different there.

Link to comment
Share on other sites

I just wanted to bring to your attention that having an apostrophe in the title creates an error.  

This module assumes that you have entity encoding turned on for your title field. (See Setup > Fields > title > details > Text formatters). This is something you should always have enabled when using ProcessWire for any kind of HTML-driven output. Changing the quote style in the JS would not be an alternative to entity encoding, because you'd run into the same exact problem if one of the page titles happened to have quotes in it. 

Though you could use something like Markdown or Textile too, but I'm honestly not sure if those entity encode apostrophes or not. If not, the only solution may be an str_replace(array("'", '"'), array('"', '&apos'), $page->title); ahead of time. 

The options are working alright but no markers show up. Do you mean it will only work with one marker? If so then how to get the markers from a 'find' show up on the map? Basically just like in the 'skyscrapers' website. As far as I can tell you've done it totally different there.

This module can accept a single Page or a PageArray. If given a PageArray it'll map them all and fit the map to the markers. If given a single page, it should still map the marker and use the zoom setting from that marker. However, you may need to modify the module to suit your needs. In the instances where I'm using it, I typically modify it. Though the skyscrapers profile was made long before this module, so it is using something quite a bit older and not a module at all. 

Link to comment
Share on other sites

If using the 'new PageArray()' where or how do I tell it to show the markers that I want?

echo $map->render(new PageArray($pages->find("template=bfd_places, MapMarker!=''")), 'MapMarker', array('height' => '400px', 'zoom' => '2', 'lat' => '50.923813', 'lng' => '4.431493'));

It's probably obvious for seasoned programmers but I can't find any reasonable or understandable examples or explanation. (Hints or directions towards sources are welcome)

Link to comment
Share on other sites

This is an amazing module! I've only scraped the surface but just from reading through this thread it seems very powerful.

I was wondering if there was a quick way to hide the businesses that show up on the map. I'm using this to make a restaurant site and I'm trying to avoid having other restaurants (but businesses in general) pop up on the map.

Link to comment
Share on other sites

If using the 'new PageArray()' where or how do I tell it to show the markers that I want?

You should give it a PageArray of pages that each have a 'map' field. Each of those pages (that has a 'map' field) will be considered a marker. You specify the name of your map field as the second argument. i.e. 

$places = $pages->find("template=bfd_places"); 
$options = array('width' => '100%', 'height' => '400px');  
// "map" below is the name of the FieldtypeMapMarker field in PW
echo $map->render($places, 'map', $options); 

Also wanted to mention I found a JS error in the last version that corresponds with the error you were seeing before where no marker would appear. In fact, a marker should have been appearing, but there was a small JS error in there, which has now been fixed. Grab the latest to see if it resolves the issue you were having before?

I was wondering if there was a quick way to hide the businesses that show up on the map. I'm using this to make a restaurant site and I'm trying to avoid having other restaurants (but businesses in general) pop up on the map.

I've actually not seen businesses show up on the map before? :) At least, we aren't specifying any options to make it do so. Can you post a screenshot, just in case I'm misunderstanding what you are talking about? I'm wondering if it might somehow be picking up some google-specific setting associated with your Google account. 

Link to comment
Share on other sites

Some new $options have been added to MarkupGoogleMap: 

'icon' => 'http://domain.com/path/to/icon.png', 

Full URL to icon file to use for markers. Blank=use default Google marker icon. 
 
'useHoverBox' => false
Use hover box? When true, shows a tooltip-type box when you hover the marker, that is populated with the markerTitleField. This is often more useful than the default presentation google maps uses.
 
'hoverBoxMarkup' => "<div> (see below) </div>"
When useHoverBox is true, you can specify the markup used for it. Use the following (which is the default) as your starting point:
<div 
  data-top='-10' <!-- offset from top of marker (in pixels) -->
  data-left='15' <!-- offset from left of marker (in pixels) -->
  style='        <!-- inline styles, or specify your own class attribute -->
    background: #000; 
    color: #fff; 
    padding: 0.25em 0.5em; 
    border-radius: 3px;
  '>
</div>
 
 
 
  • Like 3
  • Thanks 1
Link to comment
Share on other sites

One other thing to add: if you use the 'useHoverBox' option and either don't see the hover box working, or see it showing up in the wrong place, you'll want to put your map in a container that has position=relative or position=absolute

echo "<div style='position: relative;'>" . $map->render($items, 'map', $options) . "</div>";
Link to comment
Share on other sites

You should give it a PageArray of pages that each have a 'map' field. Each of those pages (that has a 'map' field) will be considered a marker. You specify the name of your map field as the second argument. i.e. 

$places = $pages->find("template=bfd_places"); 
$options = array('width' => '100%', 'height' => '400px');  
// "map" below is the name of the FieldtypeMapMarker field in PW
echo $map->render($places, 'map', $options); 

Also wanted to mention I found a JS error in the last version that corresponds with the error you were seeing before where no marker would appear. In fact, a marker should have been appearing, but there was a small JS error in there, which has now been fixed. Grab the latest to see if it resolves the issue you were having before?

The markers now fit the map better, no more two Alaskas showing. Still, only the height option works with the solution above.

When generating three maps on the same page, the first and third are exactly the same apart from height. In the second zoom and coordinates work but no markers.

	<?php 
	$map = $modules->get('MarkupGoogleMap'); 
	$places = $pages->find("template=bfd_places, MapMarker!='', sort=title"); 
	echo $map->render($places, 'MapMarker', array('height' => '400px')); 
    ?>
    <hr>
    <?php 
	echo $map->render(new PageArray($pages->find("template=bfd_places")), 'MapMarker', array('height' => '400px', 'zoom' => '5', 'lat' => '50.923813', 'lng' => '4.431493')); 
    ?>
    <hr>
    <?php
    $places = $pages->find("template=bfd_places"); 
	$options = array('width' => '100%', 'height' => '300px',  'zoom' => '5',  'lat' => '50.923813', 'lng' => '4.431493');  
	echo $map->render($places, 'MapMarker', $options); 
	?>

See result here: http://www.birthfactdeathcalendar.net/bfd_processwire/places/

Entering an address or coordinates in the MapMarker address field doesn't keep the info yet upon publishing the page either. It still needs to be entered twice. Once in a while, when fiddling with zoom or moving the marker on the map before publishing the page it keeps the input properly.

Using the new version and will try out the new icon and hover options soon. Thank you for that.

Link to comment
Share on other sites

I've actually not seen businesses show up on the map before? :) At least, we aren't specifying any options to make it do so. Can you post a screenshot, just in case I'm misunderstanding what you are talking about? I'm wondering if it might somehow be picking up some google-specific setting associated with your Google account. 

I'm attaching a screenshot. Timeless Nails, Tango Palace, etc. I hear they're called POI (points of interest) but I am unsure how to add any settings for disabling these with the module. Thanks!

post-466-0-17219900-1384292206_thumb.png

Link to comment
Share on other sites

I'm attaching a screenshot. Timeless Nails, Tango Palace, etc. I hear they're called POI (points of interest) but I am unsure how to add any settings for disabling these with the module. Thanks!

If you set your map to satellite view these 'points of interest' don't show up. Well, only parks and some official buildings do but no business stuff. When zooming in, street names are all visible and people can even switch to street view to actually see the place you're 'marking'.

Link to comment
Share on other sites

This config option should disable the POI for you:

 [ { featureType: "poi", elementType: "labels", stylers: [ { visibility: "off" } ] } ]

Obviously this is not a module setting, but rather a setting you need to add to the javascript that loads the map on the frontend.

Hope that helps.

  • Like 1
Link to comment
Share on other sites

This config option should disable the POI for you:

 [ { featureType: "poi", elementType: "labels", stylers: [ { visibility: "off" } ] } ]

Obviously this is not a module setting, but rather a setting you need to add to the javascript that loads the map on the frontend.

Hope that helps.

Thanks but this is the code I have:

In the head:

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?sensor=false"></script>

And then in the body:

<?php // Render the map

				$map = $modules->get('MarkupGoogleMap');
				echo $map->render($page, 'address_map', array('type' => 'ROADMAP'));
			?>

Where would I put the code you suggest?

Link to comment
Share on other sites

Hi tina,

Sorry for the limited answer - was in a hurry.

Actually looking at this module a little more, I realize that I have never used the built-in render, but rather just used it as a way to enter addresses in the admin. I have been using Ryan's RCDmap class: http://processwire.com/talk/topic/690-map-marker-fieldtype/?p=10667

Although I actually haven't hidden the poi in any PW sites yet, so I don't have a final code snippet for you. However, this is the code that I used on a mobile site I developed that made use of: https://code.google.com/p/jquery-ui-map/

var myStyles =[
    {
        featureType: "poi",
        elementType: "labels",
        stylers: [
              { visibility: "off" }
        ]
    }
];

$('#map_canvas').gmap('option', 'styles', myStyles);
 

I wouldn't necessarily recommend jquery-ui-map - I thought it might be worth trying, but mostly just seemed to add another layer of complexity. I think I would stick with the standard gmaps api.

Here is a relevant POI link from google: https://developers.google.com/maps/documentation/javascript/reference#MapTypeStyleFeatureType

Hope that helps.

  • Like 1
Link to comment
Share on other sites

Hi tina,

Sorry for the limited answer - was in a hurry.

Actually looking at this module a little more, I realize that I have never used the built-in render, but rather just used it as a way to enter addresses in the admin. I have been using Ryan's RCDmap class: http://processwire.com/talk/topic/690-map-marker-fieldtype/?p=10667

Although I actually haven't hidden the poi in any PW sites yet, so I don't have a final code snippet for you. However, this is the code that I used on a mobile site I developed that made use of: https://code.google.com/p/jquery-ui-map/

var myStyles =[
    {
        featureType: "poi",
        elementType: "labels",
        stylers: [
              { visibility: "off" }
        ]
    }
];

$('#map_canvas').gmap('option', 'styles', myStyles);
 

I wouldn't necessarily recommend jquery-ui-map - I thought it might be worth trying, but mostly just seemed to add another layer of complexity. I think I would stick with the standard gmaps api.

Here is a relevant POI link from google: https://developers.google.com/maps/documentation/javascript/reference#MapTypeStyleFeatureType

Hope that helps.

Thanks Adrian, I decided to just use the Google Maps API and the values created by the ProcessWire module to assist in that. I used the visibility: off for the POI and that worked. Thanks.

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Trying to get multiple markers on a map. All found MapMarker entries show up in the list, but only the last one from the list shows up on the map. How do I get them all to show up on the map?

$features = $pages->find("parent=/events/, bfd_day.name=$todayday, bfd_month.name=$todaymonth, sort=bfd_year");
foreach($features as $feature) {
$placepage = $feature->bfd_events_places_id_list;
echo "{$placepage->MapMarker}";
};

$map = $modules->get('MarkupGoogleMap'); 
$options = array('width' => '100%', 'height' => '400px');
echo $map->render($placepage, 'MapMarker', $options); 
Link to comment
Share on other sites

When passing $features there is no map at all....

The MapMarker field is called into 'events' by a matching id, 'bfd_events_places_id_list' is the page id of a 'place' page. A 'place' page can be used for more than one event. When the id matches the fields from the 'place' page (name, street, city, state, country, MapMarker) are shown on the 'event' page, with the correct map.

echo "{$placepage->MapMarker}"; shows the individual 'MapMarker' data in the foreach list but I can't find how to enter it in the $map->render(), except that it only shows the last marker.

Link to comment
Share on other sites

The $map->render() requires either a Page with a 'MapMarker' field or a PageArray with multiple pages, each containing a 'MapMarker' field. If you are giving it a PageArray of multiple pages, and it's only showing a marker for 1 of them, then chances are that only one of the pages you gave it has a 'MapMarker' field. Keep in mind the field must be named consistently with what you tell it. Meaning, if you are calling $map->render($features, 'MapMarker', $options); then every one of the pages in $features must literally have a map marker field named 'MapMarker'. If they don't, then chances are that $features is not the group of pages you really want to send to render(). But $placepage clearly isn't either, since that's just 1 page (which is only going to print 1 marker). Based on looking at your code, I'm guessing this might be what you want?

$features = $pages->find("parent=/events/, bfd_day.name=$todayday, bfd_month.name=$todaymonth, sort=bfd_year");
$markers = new PageArray();
foreach($features as $feature) {
  $markers->add($feature->bfd_events_places_id_list); 
}
$map = $modules->get('MarkupGoogleMap'); 
$options = array('width' => '100%', 'height' => '400px');
echo $map->render($markers, 'MapMarker', $options); 
  • Like 1
Link to comment
Share on other sites

	$features = $pages->find("parent=/events/, bfd_month.name=$month, bfd_day.name=$day, sort=bfd_day, sort=bfd_year, sort=name");
	$markers = new PageArray();
	foreach($features as $feature) {
	$markers->add($feature->bfd_events_places_id_list); 
	}
	if ($markers && $feature->bfd_day) {
	$map = $modules->get('MarkupGoogleMap'); 
	$options = array('width' => '100%', 'height' => '500px', 'zoom' => '4');
	echo $map->render($markers, 'MapMarker', $options);
	}
	else {
	echo "";
	};

When there are two identical markers (two events happening on the same day in the same place in above example), the map is not rendered.

Link to comment
Share on other sites

Hello all,

I would like to add a standard Gmaps info window (the white balloon type with shadow) to my marker.

I have a single marker on the map and use standard $map->render function.

From the Gmaps API documentation about info windows I see that I somehow have to add something like

  var infowindow = new google.maps.InfoWindow({
      content: contentString
  });

How would I go about that, can I create something like a hook event to extend the standard render function from the module or can I just add a piece of JS to the page?

Any enlightenment would be much appreciated.

Cheers

gerhard

Link to comment
Share on other sites

I've installed this module for the first time locally, on PW 2.3.8 dev.

The backend looks fine - except a notice at the bottom: Geocode OFF

Anybody knows why?

In my map template, I have just this:

// head:
<script type='text/javascript' src='https://maps.googleapis.com/maps/api/js?sensor=false'></script>

// body:
<?php
echo $page->marker->address . '<hr>'; 	// outputs the address you entered
echo $page->marker->lat . '<hr>'; 	// outputs the latitude
echo $page->marker->lng . '<hr>'; 	// outputs the longitude

$map = $modules->get('MarkupGoogleMap');
echo $map->render($page, 'map');
?>

What I actually see in the rendered frontend, is just this:

<div id='mgmap1' class='MarkupGoogleMap' style='width: 100%; height: 300px;'></div><script type='text/javascript'>if(typeof google === 'undefined' || typeof google.maps === 'undefined') { alert('MarkupGoogleMap Error: Please add the maps.googleapis.com script in your document head.'); } else { var mgmap1 = new MarkupGoogleMap(); mgmap1.setOption('zoom', 18); mgmap1.setOption('mapTypeId', google.maps.MapTypeId.HYBRID); mgmap1.init('mgmap1', 0.000000, 0.000000); mgmap1.addMarker(0.000000, 0.000000, '/path/to/google-map-test/', 'Google Map Test', ''); }</script>

No map is shown, no address or lat/lng are shown either.

Is it necessary to add your own GM API key somewhere?

Is it known to simply not work from localhost / 127.0.0.1?

Or do I have to change the GM JS URL or add parameters? (v3)?

Thanks in advance for tips and pointers.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...