| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- namespace Dcat\Admin\Form\Field;
- use Dcat\Admin\Admin;
- use Dcat\Admin\Form\Field;
- class Map extends Field
- {
- /**
- * Column name.
- *
- * @var array
- */
- protected $column = [];
- /**
- * Get assets required by this field.
- *
- * @return void
- */
- public static function collectAssets()
- {
- switch (config('admin.map_provider')) {
- case 'tencent':
- $js = '//map.qq.com/api/js?v=2.exp&key='.env('TENCENT_MAP_API_KEY');
- break;
- case 'google':
- $js = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
- break;
- case 'yandex':
- $js = '//api-maps.yandex.ru/2.1/?lang=ru_RU';
- break;
- default:
- $js = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
- }
- Admin::js($js);
- }
- public function __construct($column, $arguments)
- {
- $this->column['lat'] = (string) $column;
- $this->column['lng'] = (string) $arguments[0];
- array_shift($arguments);
- $this->label = $this->formatLabel($arguments);
- $this->id = $this->formatId($this->column);
- /*
- * Google map is blocked in mainland China
- * people in China can use Tencent map instead(;
- */
- switch (config('admin.map_provider')) {
- case 'tencent':
- $this->useTencentMap();
- break;
- case 'google':
- $this->useGoogleMap();
- break;
- case 'yandex':
- $this->useYandexMap();
- break;
- default:
- $this->useGoogleMap();
- }
- }
- public function useGoogleMap()
- {
- $this->script = <<<JS
- (function() {
- function initGoogleMap(name) {
- var lat = $('#{$this->id['lat']}');
- var lng = $('#{$this->id['lng']}');
-
- var LatLng = new google.maps.LatLng(lat.val(), lng.val());
-
- var options = {
- zoom: 13,
- center: LatLng,
- panControl: false,
- zoomControl: true,
- scaleControl: true,
- mapTypeId: google.maps.MapTypeId.ROADMAP
- }
-
- var container = document.getElementById("map_"+name);
- var map = new google.maps.Map(container, options);
-
- var marker = new google.maps.Marker({
- position: LatLng,
- map: map,
- title: 'Drag Me!',
- draggable: true
- });
-
- google.maps.event.addListener(marker, 'dragend', function (event) {
- lat.val(event.latLng.lat());
- lng.val(event.latLng.lng());
- });
- }
-
- initGoogleMap('{$this->id['lat']}{$this->id['lng']}');
- })();
- JS;
- }
- public function useTencentMap()
- {
- $this->script = <<<JS
- (function() {
- function initTencentMap(name) {
- var lat = $('#{$this->id['lat']}');
- var lng = $('#{$this->id['lng']}');
-
- var center = new qq.maps.LatLng(lat.val(), lng.val());
-
- var container = document.getElementById("map_"+name);
- var map = new qq.maps.Map(container, {
- center: center,
- zoom: 13
- });
-
- var marker = new qq.maps.Marker({
- position: center,
- draggable: true,
- map: map
- });
-
- if( ! lat.val() || ! lng.val()) {
- var citylocation = new qq.maps.CityService({
- complete : function(result){
- map.setCenter(result.detail.latLng);
- marker.setPosition(result.detail.latLng);
- }
- });
-
- citylocation.searchLocalCity();
- }
-
- qq.maps.event.addListener(map, 'click', function(event) {
- marker.setPosition(event.latLng);
- });
-
- qq.maps.event.addListener(marker, 'position_changed', function(event) {
- var position = marker.getPosition();
- lat.val(position.getLat());
- lng.val(position.getLng());
- });
- }
-
- initTencentMap('{$this->id['lat']}{$this->id['lng']}');
- })();
- JS;
- }
- public function useYandexMap()
- {
- $this->script = <<<JS
- (function() {
- function initYandexMap(name) {
- ymaps.ready(function(){
-
- var lat = $('#{$this->id['lat']}');
- var lng = $('#{$this->id['lng']}');
-
- var myMap = new ymaps.Map("map_"+name, {
- center: [lat.val(), lng.val()],
- zoom: 18
- });
-
- var myPlacemark = new ymaps.Placemark([lat.val(), lng.val()], {
- }, {
- preset: 'islands#redDotIcon',
- draggable: true
- });
-
- myPlacemark.events.add(['dragend'], function (e) {
- lat.val(myPlacemark.geometry.getCoordinates()[0]);
- lng.val(myPlacemark.geometry.getCoordinates()[1]);
- });
-
- myMap.geoObjects.add(myPlacemark);
- });
-
- }
-
- initYandexMap('{$this->id['lat']}{$this->id['lng']}');
- })();
- JS;
- }
- }
|