Completed
Push — master ( 4d0076...81538e )
by Jeroen De
26s queued 11s
created

LeafletService::processedParamsToMapParams()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 3

Importance

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