You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.3 KiB
160 lines
4.3 KiB
<?php
|
|
|
|
namespace App\Admin\Extensions\Form;
|
|
|
|
use Encore\Admin\Form\Field;
|
|
|
|
class MyMap extends Field
|
|
{
|
|
/**
|
|
* Column name.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $column = [];
|
|
|
|
protected $view = 'admin.form.mymap';
|
|
|
|
protected $addressInput;
|
|
|
|
/**
|
|
* Get assets required by this field.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getAssets()
|
|
{
|
|
if (config('app.locale') == 'zh-CN') {
|
|
$js = '//map.qq.com/api/js?v=2.exp';
|
|
} else {
|
|
$js = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
|
|
}
|
|
|
|
return compact('js');
|
|
}
|
|
|
|
public function __construct($column, $arguments)
|
|
{
|
|
$this->column['lat'] = $column;
|
|
$this->column['lng'] = $arguments[0];
|
|
|
|
$this->addressInput = $arguments[2] ?? 'myAddress';
|
|
|
|
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(;
|
|
*/
|
|
if (config('app.locale') == 'zh-CN') {
|
|
$this->useTencentMap();
|
|
} else {
|
|
$this->useGoogleMap();
|
|
}
|
|
}
|
|
|
|
public function useGoogleMap()
|
|
{
|
|
$this->script = <<<EOT
|
|
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']}');
|
|
EOT;
|
|
}
|
|
|
|
public function useTencentMap()
|
|
{
|
|
$this->script = <<<EOT
|
|
function initTencentMap(name) {
|
|
var lat = $('#{$this->id['lat']}');
|
|
var lng = $('#{$this->id['lng']}');
|
|
|
|
var inputAddress = $('#{$this->addressInput}');
|
|
|
|
|
|
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());
|
|
});
|
|
|
|
var callbacks={
|
|
complete:function(results){
|
|
map.setCenter(results.detail.location);
|
|
marker.setPosition(results.detail.location);
|
|
},
|
|
}
|
|
var geocoder = new qq.maps.Geocoder(callbacks);
|
|
|
|
|
|
inputAddress.change(function () {
|
|
geocoder.getLocation($(this).val());
|
|
});
|
|
}
|
|
|
|
initTencentMap('{$this->id['lat']}{$this->id['lng']}');
|
|
EOT;
|
|
}
|
|
}
|