init(); $this->apiKey = $apiKey ?? $this->providerConfig('key'); } /** * Provider unique key * @return string */ public function providerKey(): string { return 'google'; } /** * Provider title * @return string */ public function providerTitle(): string { return 'Google Maps'; } /** * Config settings form * @param Form $form */ public function providerSettingsForm($form) { $form->text($this->providerConfigKey('key'), _t('geo', 'API key'), '', false) ->htmlAfter(_t('geo', 'Get API key [a]here[/a]', ['a' => '', '/a' => ''])) ->visibleIf('geo.maps.provider', $this->providerKey()) ->sysAdmin($this->providerConfigKey('key')); } /** * Map JavaScript API URL * @param array $opts * @return string|string[] */ public function scripts(array $opts = []) { $query = $this->defaults($opts['query'] ?? [], [ 'v' => $this->providerConfig('version', '3'), 'key' => $this->apiKey, ]); $this->addQueryLanguageAndRegion($query, $opts); $js = [ 'https://maps.googleapis.com/maps/api/js' . Url::query($query), '@core/maps/map.google.min.js', ]; if (! empty($opts['search'])) { $js[] = 'markerclustererplus'; } return $js; } /** * Static Map JavaScript API URL * @param string|float $latitude * @param string|float $longitude * @param int|string $width * @param int|string $height * @param array $opts * @return string|string[] */ public function staticScripts($latitude, $longitude, int $width, int $height, array $opts = []) { $query = $this->defaults($opts['query'] ?? [], [ 'center' => join(',', [$latitude, $longitude]), 'zoom' => $opts['zoom'] ?? $this->providerConfig('static.zoom', 13), 'size' => join('x', [$width, $height]), 'markers' => 'color:red|' . join(',', [$latitude, $longitude]), 'key' => $this->apiKey, ]); return 'https://maps.googleapis.com/maps/api/staticmap' . Url::query($query); } /** * Add language and region to query * @param array $query * @param array $opts * @return void */ protected function addQueryLanguageAndRegion(array &$query, array $opts = []) { list($language, $region) = explode('_', $opts['lang'] ?? Lang::current('locale', 'ru_RU')); $query['language'] = $opts['language'] ?? $language; $query['region'] = $opts['region'] ?? $region; } }