Permalink
Browse files

GoogleMapの取得処理を変更

GoogleMapsAPIキーが必須となり、GoogleMapsAPIキーの利用制限をかける場合、
位置情報取得にBcGmapsが利用できなくなった。
理由は、地図取得は、Javascript である為、利用制限はリファラ制限となる。
BcGmapsの場合、サーバーサイドである為、IP制限しか利用できない。
※ リファラ制限を利用する場合、BcGmapsの処理に失敗する。

両方の制限を利用する場合、APIキーが二つ必要となり現実的ではない為、
位置情報取得も、Javascriptに変更した。
  • Loading branch information...
ryuring committed Jul 11, 2018
1 parent 0152de4 commit 0587cf6f88286f00baeb67baeb9a2f88bc400dd8
@@ -87,66 +87,4 @@ public function loadDataProvider()
];
}
/**
* 位置情報を読み込む
*
* @param string $address 位置情報を取得したい住所
* @param boolean $expected 期待値
* @dataProvider loadLocationDataProvider
*/
public function testLoadLocation($address, $expected)
{
$this->markTestIncomplete('このテストは、まだ実装されていません');
$this->BcGooglemaps->address = $address;
$result = $this->BcGooglemaps->loadLocation();
$this->assertEquals($expected, $result);
}
public function loadLocationDataProvider()
{
return [
['福岡', true],
['', false]
];
}
/**
* 位置情報を取得する
*
* @param string $address 位置情報を取得したい住所
* @param array/boolean $expected 期待値
* @dataProvider getLocationDataProvider
* 2018/05/15 ryuring TravisCI環境にて、タイミングにより、データを取得できず処理に失敗するので一旦コメントアウト
* @todo 処理内容を変える等の検討が必要
*/
// public function testGetLocation($address, $expected) {
// $result = $this->BcGooglemaps->getLocation($address);
//
// if (!empty($address)) {
//
// if (isset($result['latitude']) && isset($result['longitude'])) {
// $result['latitude'] = round($result['latitude'], 1);
// $result['longitude'] = round($result['longitude'], 1);
// $this->assertEquals($expected, $result, '位置情報を正しく取得できません');
//
// } else {
// $this->markTestIncomplete('GoogleMapの情報の取得に失敗したため、テストをスキップします');
// }
//
// } else {
// $this->assertEquals($expected, $result, '位置情報を正しく取得できません');
// }
//
// }
//
// public function getLocationDataProvider() {
// return [
// ['博多駅', ['latitude' => '33.6', 'longitude' => '130.4']],
// ['fukuoka', ['latitude' => '33.6', 'longitude' => '130.4']],
// [8100042, ['latitude' => '33.6', 'longitude' => '130.4']],
// ['', false]
// ];
// }
}
@@ -82,14 +82,8 @@ class BcGooglemapsHelper extends AppHelper {
* @return boolean
*/
public function load($address = '', $width = null, $height = null) {
if ($address)
if ($address) {
$this->address = $address;
if (!$this->longitude || !$this->latitude) {
if (!$this->loadLocation()) {
return false;
}
}
$script = $this->_getScript();
if ($script) {
@@ -98,7 +92,7 @@ public function load($address = '', $width = null, $height = null) {
} else {
echo '<div id="' . $this->mapId . '"><noscript>※ ' . __d('baser', 'JavaScript を有効にしてください。') . '</noscript></div>';
}
echo $this->_getScript();
echo $script;
return true;
} else {
return false;
@@ -107,64 +101,76 @@ public function load($address = '', $width = null, $height = null) {
/**
* Google マップ読み込み用のjavascriptを生成する
*
* @todo リファクタリング
* @return string
*/
protected function _getScript() {
if (!$this->longitude || !$this->latitude || !$this->mapId) {
if (!$this->mapId) {
return false;
}
$apiKey = empty($this->BcBaser->siteConfig['google_maps_api_key']) ? "" : h($this->BcBaser->siteConfig['google_maps_api_key']);
$address = $this->address;
$script = <<< DOC_END
var latlng = new google.maps.LatLng({$this->latitude},{$this->longitude});
var options = {
zoom: {$this->zoom},
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
navigationControl: true,
mapTypeControl: true,
scaleControl: true,
scrollwheel: false,
};
var map = new google.maps.Map(document.getElementById("{$this->mapId}"), options);
var marker = new google.maps.Marker({
position: latlng,
map: map,
title:"{$this->title}"
});
var geo = new google.maps.Geocoder();
var lat = '{$this->latitude}';
var lng = '{$this->longitude}';
if(!lat || !lng) {
geo.geocode({ address: '{$address}' }, function(results, status) {
if(status === 'OK') {
lat = results[0].geometry.location.lat();
lng = results[0].geometry.location.lng();
loadMap(lat, lng);
}
});
} else {
loadMap(lat, lng)
}
function loadMap(lat, lng){
var latlng = new google.maps.LatLng(lat,lng);
var options = {
zoom: {$this->zoom},
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
navigationControl: true,
mapTypeControl: true,
scaleControl: true,
scrollwheel: false,
};
var map = new google.maps.Map(document.getElementById("{$this->mapId}"), options);
var marker = new google.maps.Marker({
position: latlng,
map: map,
title:"{$this->title}"
});
if('{$this->markerText}') {
var infowindow = new google.maps.InfoWindow({
content: '{$this->markerText}'
});
infowindow.open(map,marker);
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
}
}
DOC_END;
if ($this->markerText) {
$script .=
<<< INFO_END
var infowindow = new google.maps.InfoWindow({
content: '{$this->markerText}'
});
infowindow.open(map,marker);
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
INFO_END;
}
$apiKey = empty($this->BcBaser->siteConfig['google_maps_api_key']) ? "" : $this->BcBaser->siteConfig['google_maps_api_key'];
if (empty($apiKey)) {
$adminLink = $this->BcBaser->getUrl(["admin"=>true, 'plugin' => '', 'controller' => 'site_configs', 'action'=>'form']);
echo sprintf(__d('baser', 'Googleマップを利用するには、Google Maps APIのキーの登録が必要です。<a href="https://developers.google.com/maps/web/" target="_blank">キーを取得</a>して、<a href="%s">システム管理</a>より設定してください。'), $adminLink);
}
if($this->request->is('ssl')) {
$apiUrl = 'https://maps.google.com/maps/api/js';
} else {
$apiUrl = 'http://maps.google.com/maps/api/js';
}
$googleScript = '<script src="' . $apiUrl . '?key=' . h($apiKey) . '"></script>';
$apiUrl = 'https://maps.google.com/maps/api/js';
$googleScript = '<script src="' . $apiUrl . '?key=' . $apiKey . '"></script>';
return $googleScript . '<script>' . $script . '</script>';
}
/**
* 位置情報を読み込む
*
* @return boolean
* @deprecated GoogleMapsAPIキーの利用制限をかける場合、BcGmapsが利用できない為、非推奨
* 地図取得は、Javascript なので、利用制限はリファラ制限となる。BcGmapsの場合、IP制限しか利用できない為、
* 両方の制限を利用する場合、APIキーが二つ必要となり現実的ではない。
*/
public function loadLocation() {
@@ -186,6 +192,9 @@ public function loadLocation() {
*
* @param string $address
* @return array|boolean
* @deprecated GoogleMapsAPIキーの利用制限をかける場合、BcGmapsが利用できない為、非推奨
* 地図取得は、Javascript なので、利用制限はリファラ制限となる。BcGmapsの場合、IP制限しか利用できない為、
* 両方の制限を利用する場合、APIキーが二つ必要となり現実的ではない。
*/
public function getLocation($address) {
App::uses('BcGmaps', 'Lib');

0 comments on commit 0587cf6

Please sign in to comment.