Completed
Push — master ( 7034c7...e9a56b )
by Jeroen De
03:10
created

LeafletService::getLayerDependencies()   A

Complexity

Conditions 6
Paths 3

Size

Total Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 6.1666

Importance

Changes 0
Metric Value
dl 0
loc 18
ccs 10
cts 12
cp 0.8333
rs 9.0444
c 0
b 0
f 0
cc 6
nc 3
nop 1
crap 6.1666
1
<?php
2
3
namespace Maps;
4
5
use Html;
6
use Maps\MediaWiki\ParserHooks\DisplayMapRenderer;
7
8
/**
9
 * @licence GNU GPL v2+
10
 */
11
class LeafletService extends MappingService {
12
13
	private $addedDependencies = [];
14
15 13
	public function getName(): string {
16 13
		return 'leaflet';
17
	}
18
19 20
	public function getAliases(): array {
20 20
		return [ 'leafletmaps', 'leaflet' ]; // TODO: main name should not be in here?
21
	}
22
23 1
	public function hasAlias( string $alias ): bool {
24 1
		return in_array( $alias, [ 'leafletmaps', 'leaflet' ] );
25
	}
26
27 13
	public function getParameterInfo(): array {
28 13
		global $GLOBALS;
29
30 13
		$params = [];
31
32 13
		$params['zoom'] = [
33
			'type' => 'integer',
34
			'range' => [ 0, 20 ],
35
			'default' => false,
36
			'message' => 'maps-par-zoom'
37
		];
38
39 13
		$params['defzoom'] = [
40 13
			'type' => 'integer',
41
			'range' => [ 0, 20 ],
42 13
			'default' => self::getDefaultZoom(),
43 13
			'message' => 'maps-leaflet-par-defzoom'
44
		];
45
46 13
		$params['layers'] = [
47 13
			'aliases' => 'layer',
48 13
			'type' => 'string',
49 13
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableLayers'], true, true ),
50 13
			'default' => $GLOBALS['egMapsLeafletLayers'],
51 13
			'message' => 'maps-leaflet-par-layers',
52
			'islist' => true,
53
		];
54
55 13
		$params['overlaylayers'] = [
56 13
			'type' => 'string',
57 13
			'values' => array_keys( $GLOBALS['egMapsLeafletAvailableOverlayLayers'], true, true ),
58 13
			'default' => $GLOBALS['egMapsLeafletOverlayLayers'],
59 13
			'message' => 'maps-leaflet-par-overlaylayers',
60
			'islist' => true,
61
		];
62
63 13
		$params['resizable'] = [
64 13
			'type' => 'boolean',
65 13
			'default' => $GLOBALS['egMapsResizableByDefault'],
66 13
			'message' => 'maps-par-resizable'
67
		];
68
69 13
		$params['enablefullscreen'] = [
70
			'type' => 'boolean',
71
			'default' => false,
72
			'message' => 'maps-par-enable-fullscreen',
73
		];
74
75 13
		$params['scrollwheelzoom'] = [
76
			'type' => 'boolean',
77
			'default' => true,
78
			'message' => 'maps-par-scrollwheelzoom',
79
		];
80
81 13
		$params['markercluster'] = [
82
			'type' => 'boolean',
83
			'default' => false,
84
			'message' => 'maps-par-markercluster',
85
		];
86
87 13
		$params['clustermaxzoom'] = [
88
			'type' => 'integer',
89
			'default' => 20,
90
			'message' => 'maps-par-clustermaxzoom',
91
		];
92
93 13
		$params['clusterzoomonclick'] = [
94
			'type' => 'boolean',
95
			'default' => true,
96
			'message' => 'maps-par-clusterzoomonclick',
97
		];
98
99 13
		$params['clustermaxradius'] = [
100
			'type' => 'integer',
101
			'default' => 80,
102
			'message' => 'maps-par-maxclusterradius',
103
		];
104
105 13
		$params['clusterspiderfy'] = [
106
			'type' => 'boolean',
107
			'default' => true,
108
			'message' => 'maps-leaflet-par-clusterspiderfy',
109
		];
110
111 13
		$params['geojson'] = [
112
			'type' => 'jsonfile',
113
			'default' => '',
114
			'message' => 'maps-displaymap-par-geojson',
115
		];
116
117 13
		return $params;
118
	}
119
120
	/**
121
	 * @since 3.0
122
	 */
123 13
	public function getDefaultZoom() {
124 13
		return $GLOBALS['egMapsLeafletZoom'];
125
	}
126
127 13
	public function getMapId(): string {
128 13
		static $mapsOnThisPage = 0;
129
130 13
		$mapsOnThisPage++;
131
132 13
		return 'map_leaflet_' . $mapsOnThisPage;
133
	}
134
135 13
	public function getResourceModules(): array {
136 13
		return [ 'ext.maps.leaflet', 'ext.sm.fi.leafletajax' ];
137
	}
138
139 13
	public function getDependencyHtml( array $params ): string {
140 13
		$dependencies = [];
141
142
		// Only add dependencies that have not yet been added.
143 13
		foreach ( $this->getDependencies( $params ) as $dependency ) {
144 13
			if ( !in_array( $dependency, $this->addedDependencies ) ) {
145 1
				$dependencies[] = $dependency;
146 1
				$this->addedDependencies[] = $dependency;
147
			}
148
		}
149
150
		// If there are dependencies, put them all together in a string, otherwise return false.
151 13
		return $dependencies !== [] ? implode( '', $dependencies ) : false;
152
	}
153
154 13
	private function getDependencies( array $params ): array {
155 13
		$leafletPath = $GLOBALS['wgScriptPath'] . '/extensions/Maps/resources/leaflet/leaflet';
156
157 13
		return array_merge(
158
			[
159 13
				Html::linkedStyle( "$leafletPath/leaflet.css" ),
160 13
				Html::linkedScript( "$leafletPath/leaflet.js" ),
161
			],
162 13
			$this->getLayerDependencies( $params )
163
		);
164
	}
165
166 13
	private function getLayerDependencies( array $params ) {
167 13
		global $egMapsLeafletLayerDependencies, $egMapsLeafletAvailableLayers,
168 13
			   $egMapsLeafletLayersApiKeys;
169
170 13
		$layerDependencies = [];
171
172 13
		foreach ( $params['layers'] as $layerName ) {
173 13
			if ( array_key_exists( $layerName, $egMapsLeafletAvailableLayers )
174 13
				&& $egMapsLeafletAvailableLayers[$layerName]
175 13
				&& array_key_exists( $layerName, $egMapsLeafletLayersApiKeys )
176 13
				&& array_key_exists( $layerName, $egMapsLeafletLayerDependencies ) ) {
177
				$layerDependencies[] = '<script src="' . $egMapsLeafletLayerDependencies[$layerName] .
178
					$egMapsLeafletLayersApiKeys[$layerName] . '"></script>';
179
			}
180
		}
181
182 13
		return array_unique( $layerDependencies );
183
	}
184
185
}
186