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()" > -
- +
= $this->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));
+ }
+});