Completed
Push — master ( d34761...111ee6 )
by Jeroen De
03:32
created

LeafletService::getDefaultZoom()   A

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
namespace Maps;
4
5
use Html;
6
use ParamProcessor\ParameterTypes;
7
use ParamProcessor\ProcessingResult;
8
9
/**
10
 * @licence GNU GPL v2+
11
 */
12
class LeafletService implements MappingService {
13
14
	private $addedDependencies = [];
15
16 26
	public function getName(): string {
17 26
		return 'leaflet';
18
	}
19
20 24
	public function getAliases(): array {
21 24
		return [ 'leafletmaps', 'leaflet' ]; // TODO: main name should not be in here?
22
	}
23
24
	public function hasAlias( string $alias ): bool {
25
		return in_array( $alias, [ 'leafletmaps', 'leaflet' ] );
26
	}
27
28 18
	public function getParameterInfo(): array {
29 18
		$params = MapsFunctions::getCommonParameters();
30
31 18
		$params['zoom'] = [
32
			'type' => ParameterTypes::INTEGER,
33
			'range' => [ 0, 20 ],
34
			'default' => false,
35
			'message' => 'maps-par-zoom'
36
		];
37
38 18
		$params['defzoom'] = [
39 18
			'type' => ParameterTypes::INTEGER,
40
			'range' => [ 0, 20 ],
41 18
			'default' => self::getDefaultZoom(),
42 18
			'message' => 'maps-leaflet-par-defzoom'
43
		];
44
45 18
		$params['layers'] = [
46 18
			'aliases' => 'layer',
47 18
			'type' => 'string',
48 18
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableLayers'], true, true ),
49 18
			'default' => $GLOBALS['egMapsLeafletLayers'],
50 18
			'message' => 'maps-leaflet-par-layers',
51
			'islist' => true,
52
		];
53
54 18
		$params['overlays'] = [
55 18
			'aliases' => [ 'overlaylayers' ],
56
			'type' => ParameterTypes::STRING,
57 18
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableOverlayLayers'], true, true ),
58 18
			'default' => $GLOBALS['egMapsLeafletOverlayLayers'],
59 18
			'message' => 'maps-leaflet-par-overlaylayers',
60
			'islist' => true,
61
		];
62
63 18
		$params['resizable'] = [
64 18
			'type' => ParameterTypes::BOOLEAN,
65 18
			'default' => $GLOBALS['egMapsResizableByDefault'],
66 18
			'message' => 'maps-par-resizable'
67
		];
68
69 18
		$params['fullscreen'] = [
70
			'aliases' => [ 'enablefullscreen' ],
71
			'type' => ParameterTypes::BOOLEAN,
72
			'default' => false,
73
			'message' => 'maps-par-enable-fullscreen',
74
		];
75
76 18
		$params['scrollwheelzoom'] = [
77
			'aliases' => [ 'scrollzoom' ],
78
			'type' => ParameterTypes::BOOLEAN,
79
			'default' => true,
80
			'message' => 'maps-par-scrollwheelzoom',
81
		];
82
83 18
		$params['cluster'] = [
84
			'aliases' => [ 'markercluster' ],
85
			'type' => ParameterTypes::BOOLEAN,
86
			'default' => false,
87
			'message' => 'maps-par-markercluster',
88
		];
89
90 18
		$params['clustermaxzoom'] = [
91
			'type' => ParameterTypes::INTEGER,
92
			'default' => 20,
93
			'message' => 'maps-par-clustermaxzoom',
94
		];
95
96 18
		$params['clusterzoomonclick'] = [
97
			'type' => ParameterTypes::BOOLEAN,
98
			'default' => true,
99
			'message' => 'maps-par-clusterzoomonclick',
100
		];
101
102 18
		$params['clustermaxradius'] = [
103
			'type' => ParameterTypes::INTEGER,
104
			'default' => 80,
105
			'message' => 'maps-par-maxclusterradius',
106
		];
107
108 18
		$params['clusterspiderfy'] = [
109
			'type' => ParameterTypes::BOOLEAN,
110
			'default' => true,
111
			'message' => 'maps-leaflet-par-clusterspiderfy',
112
		];
113
114 18
		$params['geojson'] = [
115
			'type' => ParameterTypes::STRING,
116
			'default' => '',
117
			'message' => 'maps-displaymap-par-geojson',
118
		];
119
120 18
		$params['clicktarget'] = [
121
			'type' => ParameterTypes::STRING,
122
			'default' => '',
123
			'message' => 'maps-leaflet-par-clicktarget',
124
		];
125
126 18
		return $params;
127
	}
128
129
	/**
130
	 * @since 3.0
131
	 */
132 18
	public function getDefaultZoom() {
133 18
		return $GLOBALS['egMapsLeafletZoom'];
134
	}
135
136 18
	public function newMapId(): string {
137 18
		static $mapsOnThisPage = 0;
138
139 18
		$mapsOnThisPage++;
140
141 18
		return 'map_leaflet_' . $mapsOnThisPage;
142
	}
143
144 18
	public function getResourceModules( array $params ): array {
145 18
		$modules = [];
146
147 18
		if ( $params['resizable'] ) {
148
			$modules[] = 'ext.maps.resizable';
149
		}
150
151 18
		if ( $params['cluster'] ) {
152
			$modules[] = 'ext.maps.leaflet.markercluster';
153
		}
154
155 18
		if ( $params['fullscreen'] ) {
156
			$modules[] = 'ext.maps.leaflet.fullscreen';
157
		}
158
159 18
		if ( array_key_exists( 'geojson', $params ) ) {
160 18
			$modules[] = 'ext.maps.leaflet.editor';
161
		}
162
163 18
		$modules[] = 'ext.maps.leaflet.loader';
164
165 18
		if ( array_key_exists( 'ajaxquery', $params ) && $params['ajaxquery'] !== '' ) {
166
			$modules[] = 'ext.maps.leaflet.leafletajax';
167
		}
168
169 18
		return $modules;
170
	}
171
172 18
	public function getDependencyHtml( array $params ): string {
173 18
		$dependencies = [];
174
175
		// Only add dependencies that have not yet been added.
176 18
		foreach ( $this->getDependencies( $params ) as $dependency ) {
177 18
			if ( !in_array( $dependency, $this->addedDependencies ) ) {
178 17
				$dependencies[] = $dependency;
179 17
				$this->addedDependencies[] = $dependency;
180
			}
181
		}
182
183
		// If there are dependencies, put them all together in a string, otherwise return false.
184 18
		return $dependencies !== [] ? implode( '', $dependencies ) : false;
185
	}
186
187 18
	private function getDependencies( array $params ): array {
188 18
		$leafletPath = $GLOBALS['wgScriptPath'] . '/extensions/Maps/resources/lib/leaflet';
189
190 18
		return array_merge(
191
			[
192 18
				Html::linkedStyle( "$leafletPath/leaflet.css" ),
193 18
				Html::linkedScript( "$leafletPath/leaflet.js" ),
194
			],
195 18
			$this->getLayerDependencies( $params )
196
		);
197
	}
198
199 18
	private function getLayerDependencies( array $params ) {
200 18
		global $egMapsLeafletLayerDependencies, $egMapsLeafletAvailableLayers,
201 18
			   $egMapsLeafletLayersApiKeys;
202
203 18
		$layerDependencies = [];
204
205 18
		foreach ( $params['layers'] as $layerName ) {
206 18
			if ( array_key_exists( $layerName, $egMapsLeafletAvailableLayers )
207 18
				&& $egMapsLeafletAvailableLayers[$layerName]
208 18
				&& array_key_exists( $layerName, $egMapsLeafletLayersApiKeys )
209 18
				&& array_key_exists( $layerName, $egMapsLeafletLayerDependencies ) ) {
210
				$layerDependencies[] = '<script src="' . $egMapsLeafletLayerDependencies[$layerName] .
211
					$egMapsLeafletLayersApiKeys[$layerName] . '"></script>';
212
			}
213
		}
214
215 18
		return array_unique( $layerDependencies );
216
	}
217
218 16
	public function processingResultToMapParams( ProcessingResult $processingResult ): array {
219 16
		return $this->processedParamsToMapParams( $processingResult->getParameterArray() );
220
	}
221
222 18
	public function processedParamsToMapParams( array $params ): array {
223 18
		if ( $params['geojson'] !== '' ) {
224 3
			$fetcher = MapsFactory::newDefault()->newGeoJsonFetcher();
225
226 3
			$result = $fetcher->fetch( $params['geojson'] );
227
228 3
			$params['geojson'] = $result->getContent();
229 3
			$params['GeoJsonSource'] = $result->getTitleValue() === null ? null : $result->getTitleValue()->getText();
230 3
			$params['GeoJsonRevisionId'] = $result->getRevisionId();
231
		}
232
233 18
		return $params;
234
	}
235
236
}
237