LeafletService::getDefaultZoom()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace Maps;
6
7
use Html;
8
use Maps\DataAccess\ImageRepository;
9
use Maps\Map\MapData;
10
use ParamProcessor\ParameterTypes;
11
use ParamProcessor\ProcessingResult;
12
13
/**
14
 * @licence GNU GPL v2+
15
 */
16
class LeafletService implements MappingService {
17
18
	private $imageFinder;
19
20
	private $addedDependencies = [];
21
22 2
	public function __construct( ImageRepository $imageFinder ) {
23 2
		$this->imageFinder = $imageFinder;
24 2
	}
25
26 30
	public function getName(): string {
27 30
		return 'leaflet';
28
	}
29
30 27
	public function getAliases(): array {
31 27
		return [ 'leafletmaps', 'leaflet' ]; // TODO: main name should not be in here?
32
	}
33
34 22
	public function getParameterInfo(): array {
35 22
		$params = MapsFunctions::getCommonParameters();
36
37 22
		$params['zoom'] = [
38
			'type' => ParameterTypes::INTEGER,
39
			'range' => [ 0, 20 ],
40
			'default' => false,
41
			'message' => 'maps-par-zoom'
42
		];
43
44 22
		$params['defzoom'] = [
45 22
			'type' => ParameterTypes::INTEGER,
46
			'range' => [ 0, 20 ],
47 22
			'default' => self::getDefaultZoom(),
48 22
			'message' => 'maps-leaflet-par-defzoom'
49
		];
50
51 22
		$params['layers'] = [
52 22
			'aliases' => 'layer',
53 22
			'type' => 'string',
54
			'islist' => true,
55 22
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableLayers'], true, true ),
56 22
			'default' => $GLOBALS['egMapsLeafletLayers'],
57 22
			'message' => 'maps-leaflet-par-layers',
58
		];
59
60 22
		$params['image layers'] = [
61
			'aliases' => [ 'image layer', 'imagelayers', 'imagelayer' ],
62
			'type' => 'string',
63
			'islist' => true,
64
			'default' => [],
65
			'message' => 'maps-leaflet-par-image-layers',
66
		];
67
68 22
		$params['overlays'] = [
69 22
			'aliases' => [ 'overlaylayers' ],
70
			'type' => ParameterTypes::STRING,
71
			'islist' => true,
72 22
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableOverlayLayers'], true, true ),
73 22
			'default' => $GLOBALS['egMapsLeafletOverlayLayers'],
74 22
			'message' => 'maps-leaflet-par-overlaylayers',
75
		];
76
77 22
		$params['resizable'] = [
78 22
			'type' => ParameterTypes::BOOLEAN,
79 22
			'default' => $GLOBALS['egMapsResizableByDefault'],
80 22
			'message' => 'maps-par-resizable'
81
		];
82
83 22
		$params['fullscreen'] = [
84
			'aliases' => [ 'enablefullscreen' ],
85
			'type' => ParameterTypes::BOOLEAN,
86
			'default' => false,
87
			'message' => 'maps-par-enable-fullscreen',
88
		];
89
90 22
		$params['scrollwheelzoom'] = [
91
			'aliases' => [ 'scrollzoom' ],
92
			'type' => ParameterTypes::BOOLEAN,
93
			'default' => true,
94
			'message' => 'maps-par-scrollwheelzoom',
95
		];
96
97 22
		$params['cluster'] = [
98
			'aliases' => [ 'markercluster' ],
99
			'type' => ParameterTypes::BOOLEAN,
100
			'default' => false,
101
			'message' => 'maps-par-markercluster',
102
		];
103
104 22
		$params['clustermaxzoom'] = [
105
			'type' => ParameterTypes::INTEGER,
106
			'default' => 20,
107
			'message' => 'maps-par-clustermaxzoom',
108
		];
109
110 22
		$params['clusterzoomonclick'] = [
111
			'type' => ParameterTypes::BOOLEAN,
112
			'default' => true,
113
			'message' => 'maps-par-clusterzoomonclick',
114
		];
115
116 22
		$params['clustermaxradius'] = [
117
			'type' => ParameterTypes::INTEGER,
118
			'default' => 80,
119
			'message' => 'maps-par-maxclusterradius',
120
		];
121
122 22
		$params['clusterspiderfy'] = [
123
			'type' => ParameterTypes::BOOLEAN,
124
			'default' => true,
125
			'message' => 'maps-leaflet-par-clusterspiderfy',
126
		];
127
128 22
		$params['geojson'] = [
129
			'type' => ParameterTypes::STRING,
130
			'default' => '',
131
			'message' => 'maps-displaymap-par-geojson',
132
		];
133
134 22
		$params['clicktarget'] = [
135
			'type' => ParameterTypes::STRING,
136
			'default' => '',
137
			'message' => 'maps-leaflet-par-clicktarget',
138
		];
139
140 22
		return $params;
141
	}
142
143
	/**
144
	 * @since 3.0
145
	 */
146 22
	public function getDefaultZoom() {
147 22
		return $GLOBALS['egMapsLeafletZoom'];
148
	}
149
150 22
	public function newMapId(): string {
151 22
		static $mapsOnThisPage = 0;
152
153 22
		$mapsOnThisPage++;
154
155 22
		return 'map_leaflet_' . $mapsOnThisPage;
156
	}
157
158 22
	public function getResourceModules( array $params ): array {
159 22
		$modules = [];
160
161 22
		$modules[] = 'ext.maps.leaflet.loader';
162
163 22
		if ( $params['resizable'] ) {
164
			$modules[] = 'ext.maps.resizable';
165
		}
166
167 22
		if ( $params['cluster'] ) {
168
			$modules[] = 'ext.maps.leaflet.markercluster';
169
		}
170
171 22
		if ( $params['fullscreen'] ) {
172
			$modules[] = 'ext.maps.leaflet.fullscreen';
173
		}
174
175 22
		if ( array_key_exists( 'geojson', $params ) ) {
176 22
			$modules[] = 'ext.maps.leaflet.editor';
177
		}
178
179 22
		if ( array_key_exists( 'ajaxquery', $params ) && $params['ajaxquery'] !== '' ) {
180
			$modules[] = 'ext.maps.leaflet.leafletajax';
181
		}
182
183 22
		return $modules;
184
	}
185
186 22
	public function getDependencyHtml( array $params ): string {
187 22
		$dependencies = [];
188
189 22
		foreach ( $this->getDependencies( $params ) as $dependency ) {
190
			if ( !in_array( $dependency, $this->addedDependencies ) ) {
191
				$dependencies[] = $dependency;
192
				$this->addedDependencies[] = $dependency;
193
			}
194
		}
195
196 22
		return implode( '', $dependencies );
197
	}
198
199 22
	private function getDependencies( array $params ): array {
200 22
		return $this->getLayerDependencies( $params );
201
	}
202
203 22
	private function getLayerDependencies( array $params ) {
204 22
		global $egMapsLeafletLayerDependencies, $egMapsLeafletAvailableLayers,
205 22
			   $egMapsLeafletLayersApiKeys;
206
207 22
		$layerDependencies = [];
208
209 22
		foreach ( $params['layers'] as $layerName ) {
210 22
			if ( array_key_exists( $layerName, $egMapsLeafletAvailableLayers )
211 22
				&& $egMapsLeafletAvailableLayers[$layerName]
212 22
				&& array_key_exists( $layerName, $egMapsLeafletLayersApiKeys )
213 22
				&& array_key_exists( $layerName, $egMapsLeafletLayerDependencies ) ) {
214
				$layerDependencies[] = '<script src="' . $egMapsLeafletLayerDependencies[$layerName] .
215
					$egMapsLeafletLayersApiKeys[$layerName] . '"></script>';
216
			}
217
		}
218
219 22
		return array_unique( $layerDependencies );
220
	}
221
222 19
	public function newMapDataFromProcessingResult( ProcessingResult $processingResult ): MapData {
223 19
		return $this->newMapDataFromParameters( $processingResult->getParameterArray() );
224
	}
225
226 22
	public function newMapDataFromParameters( array $params ): MapData {
227 22
		if ( $params['geojson'] !== '' ) {
228 3
			$fetcher = MapsFactory::globalInstance()->newGeoJsonFetcher();
229
230 3
			$result = $fetcher->fetch( $params['geojson'] );
231
232 3
			$params['geojson'] = $result->getContent();
233 3
			$params['GeoJsonSource'] = $result->getTitleValue() === null ? null : $result->getTitleValue()->getText();
234 3
			$params['GeoJsonRevisionId'] = $result->getRevisionId();
235
		}
236
237 22
		$params['imageLayers'] = $this->getJsImageLayers( $params['image layers'] );
238
239 22
		return new MapData( $params );
240
	}
241
242 22
	private function getJsImageLayers( array $imageLayers ) {
243 22
		$jsImageLayers = [];
244
245 22
		foreach ( $imageLayers as $imageLayer ) {
246 3
			$image = $this->imageFinder->getByName( $imageLayer );
247
248 3
			if ( $image !== null ) {
249 1
				$jsImageLayers[] = [
250 1
					'name' => $imageLayer,
251 1
					'url' => $image->getUrl(),
252 1
					'width' => 100,
253 1
					'height' => $image->getHeightInPx() / $image->getWidthInPx() * 100
254
				];
255
			}
256
		}
257
258 22
		return $jsImageLayers;
259
	}
260
261
}
262