Skip to content

Commit

Permalink
Merge pull request #6 from xe-public/misol-maps-module
Browse files Browse the repository at this point in the history
maps module ver. 1.1 - Bing Maps
  • Loading branch information
misol committed Nov 10, 2014
2 parents d9d12eb + a309d7b commit ea77c4a
Show file tree
Hide file tree
Showing 7 changed files with 311 additions and 5 deletions.
4 changes: 2 additions & 2 deletions conf/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
<title xml:lang="en">Maps Module</title>
<description xml:lang="ko">위젯으로 표시할 수 있는 지도를 생성하고, 수정하고, 삭제할 수 있습니다. 위젯으로 표시될 지도를 관리하는 모듈입니다.</description>
<description xml:lang="en">Manage maps, viewing through the maps widget. Maps can be created, modified, or deleted.</description>
<version>1.0</version>
<date>2014-11-02</date>
<version>1.1</version>
<date>2014-11-10</date>
<category>content</category>
<license>The MIT License (MIT)</license>

Expand Down
4 changes: 2 additions & 2 deletions lang/lang.xml
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@
<value xml:lang="en">Maps API key</value>
</item>
<item name="about_maps_module_map_api_key">
<value xml:lang="ko"><![CDATA[다음 또는 네이버 지도 API 키를 입력하실 수 있습니다.<br />https://dna.daum.net/myapi/mapsapi/new 에서 다음 지도형 API 중 JS 기반 지도 뷰를 발급 받으시거나,<br />https://developer.naver.com/openapi/register.nhn 에서 지도 API 키를 발급받은 후 입력해주세요.]]></value>
<value xml:lang="en"><![CDATA[Daum or Naver Maps API key is acceptable.<br />Get Daum maps API key from https://dna.daum.net/myapi/mapsapi/new<br />, or Naver Maps API from https://developer.naver.com/openapi/register.nhn .]]></value>
<value xml:lang="ko"><![CDATA[구글 지도를 이용하고 싶으실 경우 이 칸을 비워두세요.<br />다음, 네이버 또는 지도 API 키를 입력하실 수 있습니다.<br />https://www.bingmapsportal.com/application 에서 빙 지도 API 키를 발급 받으실 수 있습니다.<br />https://dna.daum.net/myapi/mapsapi/new 에서 다음 지도형 API 중 JS 기반 지도 뷰를 발급 받으시거나,<br />https://developer.naver.com/openapi/register.nhn 에서 지도 API 키를 발급받은 후 입력해주세요.]]></value>
<value xml:lang="en"><![CDATA[If you want to show Google Maps, do not fill in this blank.<br />Bing(Microsoft), Daum or Naver Maps API key is acceptable.<br />Get Bing maps API key from https://www.bingmapsportal.com/application<br />, Daum maps API key from https://dna.daum.net/myapi/mapsapi/new<br />, or Naver Maps API from https://developer.naver.com/openapi/register.nhn .]]></value>
</item>
<item name="maps_module_fail_to_set">
<value xml:lang="ko">설정 실패</value>
Expand Down
15 changes: 15 additions & 0 deletions maps.admin.view.php
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,20 @@ public function dispMapsAdminWrite()
'</script>';
Context::set('maps_langcode', 'ko');
}
elseif($maps_config->maps_api_type == 'microsoft')
{
// 언어 값 설정
$langtype = str_replace($this->xe_langtype, $this->microsoft_langtype, strtolower(Context::getLangType()));

$map_comp_header_script = '<script type="text/javascript" src="https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0&amp;mkt=ngt,'.$langtype.'"></script>';
$map_comp_header_script .= '<script>'.
sprintf(
'var defaultlat="%s";'.
'var defaultlng="%s";'
,$maps_lat,$maps_lng).
'</script>';
Context::set('maps_langcode', 'ko');
}
else
{
// 언어 값 설정
Expand Down Expand Up @@ -139,6 +153,7 @@ public function dispMapsAdminWrite()
}

Context::set('maps_api_type', $maps_config->maps_api_type);
Context::set('map_api_key', $maps_config->map_api_key);

Context::addHtmlHeader($map_comp_header_script);

Expand Down
19 changes: 18 additions & 1 deletion maps.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,23 @@ class maps extends ModuleObject
'tr'
);

/**
* @param array $microsoft_langtype Microsoft 언어 타입 모음 http://msdn.microsoft.com/en-us/library/gg427600.aspx
*/
protected $microsoft_langtype = array(
'ko-KR',
'en-US',
'zh-TW',
'zh-HK',
'ja-JP',
'es-ES',
'fr-FR',
'ru-RU',
'en-US', // MS does not not support
'en-US', // MS does not not support
'en-US' // MS does not not support
);

/**
* Implement if additional tasks are necessary when installing
* @return Object
Expand Down Expand Up @@ -75,4 +92,4 @@ public function recompileCache()
}

/* End of file maps.class.php */
/* Location: ./modules/document/document.class.php */
/* Location: ./modules/maps/maps.class.php */
269 changes: 269 additions & 0 deletions tpl/js/microsoft_map.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
/* Copyright (C) Kim, MinSoo <misol.kr@gmail.com> */
/*
* @file tpl/js/microsoft_map.js
* @author MinSoo Kim (misol.kr@gmail.com)
* @brief javascript for viewing bing map and load or save map data.
* @see 지도 모듈의 편집용 자바스크립트 중 기초 스크립트
*/
var map_zoom = 13, map_lat = '', map_lng = '', map = null, marker = '', map_markers = new Array(), map_marker_positions = '', modi_marker_pos = '', saved_location = new Array(), result_array = new Array(), result_from = '';

function map_point(i) { //검색된 위치 정보를 배열에서 로드
center = result_array[i].geometry.location;
map.setView({center:center});
}
function view_list() { //검색된 위치 정보를 배열에서 리스트로 뿌림
var html = '';
if(result_array.length == 0)
{
alert(no_result);
return;
}
for(var i=0;i<result_array.length;i++) {
if(i==0) {
html += '<ul id="view_list">';
}
if(result_array.length==1) { map_point('0'); }
var format_split = result_array[i].formatted_address.split(" ");
var list_address = result_array[i].formatted_address.substring(result_array[i].formatted_address.lastIndexOf(format_split[format_split.length-3]));
html += "<li class=\"result_lists\"><a href=\"javascript:map_point('"+i+"');\">"+ list_address +"</a></li>";
}
html += '</ul>';
jQuery("#result_list_layer").html(html);
}

function showLocation(query) {
result_from = '';
if(!query) return;

var params = new Array();
params['query'] = query;

var response_tags = new Array('error','message','results');
exec_xml('maps', 'getMapsAdminLocation', params, function(a,b) { complete_search(a,b,query); }, response_tags);
}

function complete_search(ret_obj, response_tags, query) {
var results = ret_obj['results'];
if(results) results = results.item;
else results = new Array();

address_adder(results);
}
function address_adder(results) {
result_array = new Array();
if(typeof(results.length) == "undefined") results = new Array(results);

for(var i=0;i<results.length;i++) {
if(results[i].formatted_address || results[i].formatted_address != null) {
result_array[i] = { from: results[i].result_from,
formatted_address: results[i].formatted_address,
geometry: {location : new Microsoft.Maps.Location(results[i].geometry.lat, results[i].geometry.lng) } };
}
}
view_list();
}

function getMaps() {
var map_canvas = document.getElementById("map_canvas");
var map_width = jQuery( map_canvas ).width();
var map_height = jQuery( map_canvas ).height();
var mapOption = {
credentials: map_api_key,
width: map_width,
height: map_height,
zoom: map_zoom,
center: new Microsoft.Maps.Location(defaultlat, defaultlng),
mapTypeId: Microsoft.Maps.MapTypeId.road,
showMapTypeSelector: false,
showScalebar: false,
enableSearchLogo: false
}
map = new Microsoft.Maps.Map(map_canvas, mapOption);

if(saved_maps_srl > 0)
{
var center_split = saved_map_center.split(',');
center = new Microsoft.Maps.Location(center_split[0], center_split[1]);

var markers_split = saved_map_markers.split(';');
map_marker_positions = saved_map_markers.trim();
marker = addMarker(0);

map_zoom = parseInt(saved_map_zoom,10);
if(!map_zoom) map_zoom = 13;
}
else
{
center = new Microsoft.Maps.Location(defaultlat, defaultlng);
}

// Set the map center
map.setView({
center:center,
zoom:map_zoom
});
var center = map.getCenter();

Microsoft.Maps.Events.addHandler(map, 'click', function(MouseEvent) {
if(MouseEvent.targetType == "map") {
var point = new Microsoft.Maps.Point(MouseEvent.getX(), MouseEvent.getY());
var latlng = MouseEvent.target.tryPixelToLocation(point);
if(latlng!=null) {
addMarker(latlng);
}
}
});

}

/* 새로운 위치에 마커 추가. latlng = 0 인 경우, map_marker_positions 에 지정된 마커 새로 찍음 */
function addMarker(latlng) {
var new_marker_obj;
/* 전체 구조는 removeMarker() 와 동일*/
// 마커 일단 다 제거
if(typeof(map_markers) != "undefined") {
for(var i = 0; i < map_markers.length; i++)
{
var indexOfPinToRemove = map.entities.indexOf(map_markers[i]);
map.entities.removeAt(indexOfPinToRemove);
}
}
map_markers = new Array();

if(latlng != 0) {
// 중복되는 마커는 생성되지 않도록.
map_marker_positions = positionstrRemover(latlng, map_marker_positions);
map_marker_positions += latlng.latitude + ',' + latlng.longitude + ';'; /* removeMarker() 와 다른 곳 */
}

positions = makeLocationArray(map_marker_positions);

// 전체 마커 다시 생성
for(var i = 0; i < positions.length; i++)
{
map_markers[i] = new Microsoft.Maps.Pushpin(positions[i], {
draggable: false
});
map.entities.push(map_markers[i]);
map_markers[i].soo_position = positions[i];
new_marker_obj = map_markers[i];

Microsoft.Maps.Events.addHandler(map_markers[i], "click", function(e) {
if (e.targetType == 'pushpin'){
//var position = this.soo_position;
//var point = new Microsoft.Maps.Point(e.getX(), e.getY());
//var position = e.target.tryPixelToLocation(point);
var position = e.target.getLocation();
removeMarker(position);
}
});
}

// 추가된 마커가 배열의 가장 마지막에 있을거란 가정 하에 마지막 마커 리턴
return new_marker_obj;

}
function removeMarker(latlng) {
/* 전체 구조는 removeMarker() 와 동일*/
// 마커 일단 다 제거
for(var i = 0; i < map_markers.length; i++)
{
var indexOfPinToRemove = map.entities.indexOf(map_markers[i]);
map.entities.removeAt(indexOfPinToRemove);
}
map_markers = new Array();

// 마커 위치 제거
map_marker_positions = positionstrRemover(latlng, map_marker_positions);
positions = makeLocationArray(map_marker_positions);

// 전체 마커 다시 생성
for(var i = 0; i < positions.length; i++)
{
map_markers[i] = new Microsoft.Maps.Pushpin(positions[i], {
draggable: false
});
map.entities.push(map_markers[i]);
map_markers[i].soo_position = positions[i];
new_marker_obj = map_markers[i];

Microsoft.Maps.Events.addHandler(map_markers[i], "click", function(e) {
if (e.targetType == 'pushpin'){
//var position = this.soo_position;
//var point = new Microsoft.Maps.Point(e.getX(), e.getY());
//var position = e.target.tryPixelToLocation(point);
var position = e.target.getLocation();
removeMarker(position);
}
});
}

}

function positionstrRemover(obj_position, str_positions) {
var remove_point = '';
var arr_positions = str_positions.split(";");
for(var i = 0; i < arr_positions.length; i++)
{
if(!arr_positions[i].trim()) continue;
var position = arr_positions[i].split(",");
var obj_base_position = new Microsoft.Maps.Location(position[0],position[1]);
if(Microsoft.Maps.Location.areEqual(obj_base_position,obj_position))
{
str_positions = str_positions.replace(arr_positions[i] + ';', '');
}
}
return str_positions;
}

function makeLocationArray(str_position) {
var arr_positons = new Array();
var positions = str_position.split(";");
for(var i = 0; i < positions.length; i++)
{
if(!positions[i].trim()) continue;
var position = positions[i].split(",");
arr_positons[i] = new Microsoft.Maps.Location(position[0],position[1]);
}
return arr_positons;
}

function makeLocationStr(arr_position) {
var str_positons = '';

for(var i = 0; i < arr_position.length; i++)
{
str_positons += arr_position[i].latitude + ',' + arr_position[i].longitude + ';';
}
return str_positons;
}
function saveMap(obj) {
var maps_srl = jQuery("#maps_srl").val(), map_title = jQuery("#map_title").val(), map_description = jQuery("#map_description").val();

map_zoom = map.getZoom();
map_lat = map.getCenter().latitude;
map_lng = map.getCenter().longitude;
if(!maps_srl) {maps_srl = 'NEW'}

var map_var = {
'maps_srl':maps_srl,
'map_center': map_lat+','+map_lng,
'map_markers': map_marker_positions,
'map_zoom': map_zoom,
'map_title': map_title,
'map_description':map_description
};

var response_tags = new Array('error','message','maps_srl');
exec_xml('maps', 'procMapsAdminInsert', map_var, function(ret_obj,b) {
var maps_srl = ret_obj['maps_srl'];
if(maps_srl > 0)
{
jQuery("#maps_srl").val(maps_srl);
alert(maps_saved);
}

}, response_tags);
}

jQuery(document).ready(function() { getMaps(); });
2 changes: 2 additions & 0 deletions tpl/js/microsoft_map.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions tpl/maps_write.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<load target="./js/naver_map.js" />
<!--@elseif($maps_api_type == 'daum')-->
<load target="./js/daum_map.js" />
<!--@elseif($maps_api_type == 'microsoft')-->
<load target="./js/microsoft_map.js" />
<!--@else-->
<load target="./js/google_map.js" />
<!--@end-->
Expand All @@ -14,6 +16,7 @@
'", saved_map_center="'.$map_center.
'", saved_map_markers="'.$map_markers.
'", saved_map_zoom="'.$map_zoom.
'", map_api_key="'.$map_api_key.
'";</script>');}
<div id="bodyDiv">
<h1 id="maps_title"><!--@if(!$maps_srl)-->{$lang->maps_module_maps_write}<!--@else-->{$lang->maps_module_maps_edit} ({$maps_srl})<!--@end--></h1>
Expand Down

0 comments on commit ea77c4a

Please sign in to comment.