From e9613668697f238d78984bf50d38b4064fc26ad0 Mon Sep 17 00:00:00 2001 From: crschmidt Date: Mon, 17 Sep 2007 03:47:57 +0000 Subject: [PATCH] "New permalink code maintains existing parameters ... including the lat/lon/zoom/layers." Reported by bobkare (thx, bobkare!) with a patch by same, rewritten by Schuyler, reviewed by me -- and I'm committing because Schuyler's whitespace was bad. (RC1, here we come!) git-svn-id: http://svn.openlayers.org/trunk/openlayers@4345 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- lib/OpenLayers/Control/Permalink.js | 35 ++++++++++++----------------- tests/Control/test_Permalink.html | 24 +++++++++++++++----- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/lib/OpenLayers/Control/Permalink.js b/lib/OpenLayers/Control/Permalink.js index 1db58309dd..0a372f8205 100644 --- a/lib/OpenLayers/Control/Permalink.js +++ b/lib/OpenLayers/Control/Permalink.js @@ -109,37 +109,30 @@ OpenLayers.Control.Permalink = OpenLayers.Class(OpenLayers.Control, { if (!center) { return; } - - var zoom = "zoom=" + this.map.getZoom(); - var lat = "lat=" + Math.round(center.lat*100000)/100000; - var lon = "lon=" + Math.round(center.lon*100000)/100000; - var layers = "layers="; + var params = OpenLayers.Util.getParameters(this.base); + + params.zoom = this.map.getZoom(); + params.lat = Math.round(center.lat*100000)/100000; + params.lon = Math.round(center.lon*100000)/100000; + + params.layers = ''; for(var i=0; i< this.map.layers.length; i++) { var layer = this.map.layers[i]; if (layer.isBaseLayer) { - layers += (layer == this.map.baseLayer) ? "B" : "0"; + params.layers += (layer == this.map.baseLayer) ? "B" : "0"; } else { - layers += (layer.getVisibility()) ? "T" : "F"; + params.layers += (layer.getVisibility()) ? "T" : "F"; } } - + var href = this.base; - var paramsString = lat + "&" + lon + "&" + zoom + "&" + layers; - - var lastServerChar = href.charAt(href.length - 1); - if ((lastServerChar == "&") || (lastServerChar == "?")) { - href += paramsString; - } else { - if (href.indexOf('?') == -1) { - //serverPath has no ? -- add one - href += '?' + paramsString; - } else { - //serverPath contains ?, so must already have paramsString at the end - href += '&' + paramsString; - } + if( href.indexOf('?') != -1 ){ + href = href.substring( 0, href.indexOf('?') ); } + + href += '?' + OpenLayers.Util.getParameterString(params); this.element.href = href; }, diff --git a/tests/Control/test_Permalink.html b/tests/Control/test_Permalink.html index 5b9342c136..d31b044c28 100644 --- a/tests/Control/test_Permalink.html +++ b/tests/Control/test_Permalink.html @@ -39,11 +39,11 @@ if (!map.getCenter()) map.zoomToMaxExtent(); map.addControl(control); map.pan(5, 0); - t.ok(OpenLayers.Util.isEquivalentUrl(OpenLayers.Util.getElement('permalink').href, location+"?lat=0&lon=1.75781&zoom=2&layers=BT"), 'pan sets permalink'); + t.ok(OpenLayers.Util.isEquivalentUrl(OpenLayers.Util.getElement('permalink').href, location+"?zoom=2&lat=0&lon=1.75781&layers=BT"), 'pan sets permalink'); map.layers[1].setVisibility(false); - t.ok(OpenLayers.Util.isEquivalentUrl(OpenLayers.Util.getElement('permalink').href, location+"?lat=0&lon=1.75781&zoom=2&layers=BF"), 'setVisibility sets permalink'); + t.ok(OpenLayers.Util.isEquivalentUrl(OpenLayers.Util.getElement('permalink').href, location+"?zoom=2&lat=0&lon=1.75781&layers=BF"), 'setVisibility sets permalink'); } function test_03_Control_Permalink_updateLinksBase (t) { t.plan( 2 ); @@ -56,7 +56,7 @@ if (!map.getCenter()) map.zoomToMaxExtent(); map.addControl(control); map.pan(5, 0); - OpenLayers.Util.getElement('edit_permalink').href = './edit.html?lat=0&lon=1.75781&zoom=2&layers=B'; + OpenLayers.Util.getElement('edit_permalink').href = './edit.html?zoom=2&lat=0&lon=1.75781&layers=B'; t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base"); } function test_04_Control_Permalink_noElement (t) { @@ -77,7 +77,7 @@ if (!map.getCenter()) map.zoomToMaxExtent(); map.addControl(control); map.pan(5, 0); - OpenLayers.Util.getElement('edit_permalink').href = './edit.html?foo=bar&lat=0&lon=1.75781&zoom=2&layers=B'; + OpenLayers.Util.getElement('edit_permalink').href = './edit.html?foo=bar&zoom=2&lat=0&lon=1.75781&layers=B'; t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base and querystring"); control = new OpenLayers.Control.Permalink('permalink', "./edit.html?foo=bar&" ); @@ -86,7 +86,7 @@ t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base and querystring ending with '&'"); control = new OpenLayers.Control.Permalink('permalink', "./edit.html?" ); - OpenLayers.Util.getElement('edit_permalink').href = './edit.html?lat=0&lon=1.75781&zoom=2&layers=B'; + OpenLayers.Util.getElement('edit_permalink').href = './edit.html?zoom=2&lat=0&lon=1.75781&layers=B'; map.addControl(control); map.pan(5, 0); map.pan(-5, 0); @@ -94,6 +94,20 @@ } + function test_06_Control_Permalink_nonRepeating (t) { + t.plan( 2 ); + + control = new OpenLayers.Control.Permalink('permalink', "./edit.html?zoom=3" ); + t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" ); + map = new OpenLayers.Map('map'); + layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}); + map.addLayer(layer); + if (!map.getCenter()) map.zoomToMaxExtent(); + map.addControl(control); + map.pan(5, 0); + OpenLayers.Util.getElement('edit_permalink').href = './edit.html?zoom=2&lat=0&lon=1.75781&layers=B'; + t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with existing zoom in base"); + }