diff --git a/src/GeocodeWidget.php b/src/GeocodeWidget.php index db83885..dcf76fb 100644 --- a/src/GeocodeWidget.php +++ b/src/GeocodeWidget.php @@ -94,6 +94,7 @@ class GeocodeWidget extends \Widget 'id' => $this->strId, 'attributes' => $this->getAttributes(), 'wizard' => $this->wizard, + 'label' => $this->strLabel ] ); diff --git a/src/Resources/contao/languages/de/default.php b/src/Resources/contao/languages/de/default.php index 656648b..4cf55ef 100644 --- a/src/Resources/contao/languages/de/default.php +++ b/src/Resources/contao/languages/de/default.php @@ -9,3 +9,5 @@ */ $GLOBALS['TL_LANG']['ERR']['leaflet_invalid_coordinate'] = 'Die angegebenen Koordinaten sind ungültig.'; +$GLOBALS['TL_LANG']['MSC']['leafletSearchPositionLabel'] = 'Suchen'; +$GLOBALS['TL_LANG']['MSC']['leafletApplyPositionLabel'] = 'Übernehmen'; diff --git a/src/Resources/contao/templates/be_widget_leaflet_geocode.html5 b/src/Resources/contao/templates/be_widget_leaflet_geocode.html5 index ac7e6e2..da831af 100644 --- a/src/Resources/contao/templates/be_widget_leaflet_geocode.html5 +++ b/src/Resources/contao/templates/be_widget_leaflet_geocode.html5 @@ -4,7 +4,8 @@ $GLOBALS['TL_CSS'][] = 'assets/leaflet/libs/leaflet/leaflet.css'; $GLOBALS['TL_CSS'][] = 'assets/leaflet/libs/control-geocoder/Control.Geocoder.css'; $GLOBALS['TL_JAVASCRIPT'][] = 'assets/leaflet/libs/leaflet/leaflet.js'; -$GLOBALS['TL_JAVASCRIPT'][] = 'assets/leaflet/libs/control-geocoder/Control.Geocoder.js'; +$GLOBALS['TL_JAVASCRIPT'][] = 'assets/leaflet/libs/control-geocoder/Control.Geocoder.js'; +$GLOBALS['TL_JAVASCRIPT'][] = 'bundles/leafletgeocodewidget/js/geocode.widget.js'; ?> @@ -16,64 +17,14 @@ $GLOBALS['TL_JAVASCRIPT'][] = 'assets/leaflet/libs/control-geocoder/Control.Geoc onfocus="Backend.getScrollOffset()" > -
- + wizard ?> + diff --git a/src/Resources/public/img/map.png b/src/Resources/public/img/map.png new file mode 100644 index 0000000..034783b Binary files /dev/null and b/src/Resources/public/img/map.png differ diff --git a/src/Resources/public/js/geocode.widget.js b/src/Resources/public/js/geocode.widget.js new file mode 100644 index 0000000..292b2c9 --- /dev/null +++ b/src/Resources/public/js/geocode.widget.js @@ -0,0 +1,101 @@ +var LeafletGeocodeWidget = L.Class.extend({ + options: { + mapTemplate: '
', + modalWidth: 800, + modalTitle: 'Choose coordinates', + searchPositionLabel: 'Search', + applyPositionLabel: 'Apply' + }, + initialize: function (options) { + L.Util.setOptions(this, options); + + this.element = $(this.options.id); + this.toggle = $(this.options.id + '_toggle'); + this.toggle.addEvent('click', this._showMap.bind(this)); + }, + _showMap: function () { + var content, modal; + + // Create modal window. + content = L.Util.template(this.options.mapTemplate, this.options); + modal = this._createModal(); + + modal.show({'title': this.options.modalTitle, 'contents': content}); + + // Initialize map after showing modal so element exists. + this._createMap(modal); + }, + _createModal: function () { + return new SimpleModal({ + 'width': this.options.modalWidth, + 'hideFooter': true, + 'draggable': false, + 'overlayOpacity': .5, + 'onShow': function() { document.body.setStyle('overflow', 'hidden'); }, + 'onHide': function() { document.body.setStyle('overflow', 'auto'); } + }); + }, + _createMap: function (modal) { + var map = L.map('leaflet_geocode_widget_map_' + this.options.id).setView([0, 0], 2); + + L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors' + }).addTo(map); + + var geoCoder = L.Control.geocoder({ + defaultMarkGeocode: false, + collapsed: false, + placeholder: this.options.searchPositionLabel + }).addTo(map); + + geoCoder.on('markgeocode', function (event) { + this._handleGeoCode.call(this, modal, map, event); + }.bind(this)); + + if (this.element.value) { + var value = this.element.value.split(/,/); + this._createMarker(value, map); + + map.setZoom(16); + map.panTo(value); + } + + return map; + }, + _handleGeoCode: function (modal, map, event) { + var container = document.createElement('div'); + var link = document.createElement('button'); + var result = event.geocode; + + link.set('style', 'margin-left: 10px;'); + link.appendText(this.options.applyPositionLabel); + link.addEvent('click', function(e) { + e.stop(); + + this.element.set('value', result.center.lat + ',' + result.center.lng); + modal.hide(); + }.bind(this)); + + container.appendHTML(result.html || result.name); + container.appendChild(link); + + if (this._geocodeMarker) { + map.removeLayer(this._geocodeMarker); + } + + map.fitBounds(result.bbox, { padding: [0, 70]}); + map.panTo(result.center); + + this._createMarker(result.center, map); + this._geocodeMarker.bindPopup(container, { + keepInView: true, + autoPanPaddingTopLeft: [0, 70] + }).openPopup(); + }, + _createMarker: function (position, map) { + this._geocodeMarker = L.marker(position, {draggable: true}).addTo(map); + this._geocodeMarker.on('dragend', function (event) { + this.element.set('value', event.target._latlng.lat + ',' + event.target._latlng.lng); + }.bind(this)); + } +});