Skip to content

Commit

Permalink
지도 모듈 완성
Browse files Browse the repository at this point in the history
  • Loading branch information
misol committed Nov 2, 2014
1 parent 1baf7f1 commit b1fe51e
Show file tree
Hide file tree
Showing 11 changed files with 593 additions and 54 deletions.
2 changes: 1 addition & 1 deletion conf/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<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-10-27</date>
<date>2014-11-02</date>
<category>content</category>
<license>The MIT License (MIT)</license>

Expand Down
8 changes: 0 additions & 8 deletions lang/lang.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,6 @@
<value xml:lang="ko">검색 결과</value>
<value xml:lang="en">Search result</value>
</item>
<item name="maps_module_drag_marker_text">
<value xml:lang="ko">이 지점에 마커가 생성됩니다.</value>
<value xml:lang="en">A marker will be here.</value>
</item>
<item name="maps_module_about_marker">
<value xml:lang="ko">지도를 더블클릭하면 마커가 추가됩니다.</value>
<value xml:lang="en">Another marker with another double-click.</value>
</item>
<item name="about_maps_module_result_use">
<value xml:lang="ko"><![CDATA[특정 위치를 표시 하고 싶을땐, 오른쪽 지도에서 해당 지점을 <strong>클릭</strong>하세요.<br />표시는 원하는 만큼 하실 수 있습니다.<br />표시를 지우고 싶을땐 표시를 클릭하세요.<br />검색창에 찾을 지역명을 검색 하시면, 이곳에 검색 결과가 나타납니다. 검색 결과가 1개 일 경우 바로 이동하며, 2개 이상일 경우는 선택해 주셔야 합니다.]]></value>
<value xml:lang="en"><![CDATA[You can select or de-select a place (or places) by a click.<br />You can use searching box to find out the location. The result would be shown up here.]]></value>
Expand Down
5 changes: 3 additions & 2 deletions maps.admin.controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,19 @@ public function procMapsAdminDelete()
$args->maps_srl = intval(trim(Context::get('maps_srl'))); // 정수형이 아닐 경우 제거

// 정수형이고, 값이 존재할 경우 실제 존재하는 지도인지 확인(업데이트 날짜가 존재하는지 확인)
if($maps_srl > 0)
if($args->maps_srl > 0)
{
$output = executeQuery('maps.getMapUpdate', $args);
//todo 존재하는 지도일 경우, 삭제 진행
}

// 존재하는 지도일 경우, 삭제 진행
if($output->update)
if($output->data->update)
{
$output = executeQuery('maps.deleteMapContent', $args);
}

$this->setRedirectUrl(Context::get('error_return_url'));
}

/**
Expand Down
32 changes: 19 additions & 13 deletions maps.admin.view.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,30 @@ public function dispMapsAdminList()
$oMapsAdminModel = getAdminModel('maps');
$maps_list = $oMapsAdminModel->getMapsAdminList($args);

//Pre. page
if($maps_list->page_navigation->first_page <= $maps_list->page_navigation->cur_page - 1)
if($maps_list->error)
{
$maps_list->page_navigation->prev_page = $maps_list->page_navigation->cur_page - 1;
Context::set('total_count', 0);
Context::set('maps_error', $maps_list->error);
Context::set('maps_message', $maps_list->message);
}
else
{
$maps_list->page_navigation->prev_page = $maps_list->page_navigation->cur_page;
}


//Pre. page
if($maps_list->page_navigation->first_page <= $maps_list->page_navigation->cur_page - 1)
{
$maps_list->page_navigation->prev_page = $maps_list->page_navigation->cur_page - 1;
}
else
{
$maps_list->page_navigation->prev_page = $maps_list->page_navigation->cur_page;
}

Context::set('total_count', $maps_list->total_count);
Context::set('total_page', $maps_list->total_page);
Context::set('total_page', $maps_list->total_page);
Context::set('page', $maps_list->page);
Context::set('page_navigation', $maps_list->page_navigation);
Context::set('maps_list', $maps_list->data);
Context::set('total_count', $maps_list->total_count);
Context::set('total_page', $maps_list->total_page);
Context::set('page', $maps_list->page);
Context::set('page_navigation', $maps_list->page_navigation);
Context::set('maps_list', $maps_list->data);
}

// Specify a template
$this->setTemplatePath($this->module_path.'tpl');
Expand Down
6 changes: 2 additions & 4 deletions queries/deleteMapContent.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
<query id="deleteMapContent" action="delete">
<tables>
<table name="editor_autosave" />
<table name="maps_contents" />
</tables>
<columns />
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" />
<condition operation="equal" column="member_srl" var="member_srl" pipe="and" />
<condition operation="equal" column="ipaddress" var="ipaddress" pipe="and" />
<condition operation="equal" column="maps_srl" var="maps_srl" />
</conditions>
</query>
264 changes: 264 additions & 0 deletions tpl/js/daum_map.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,264 @@
/* Copyright (C) Kim, MinSoo <[email protected]> */
/*
* @file tpl/js/daum_map.js
* @author MinSoo Kim ([email protected])
* @brief javascript for viewing daum map and load or save map data.
* @see 지도 모듈의 편집용 자바스크립트 중 기초 스크립트
*/

var map_zoom = 5, map_lat = '', map_lng = '', map = '', 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.setCenter(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);
window.location.href = '#view_list';
}

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, address) {
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 daum.maps.LatLng(results[i].geometry.lat, results[i].geometry.lng) } };
}
}
view_list();
}

function getMaps() {
var mapOption = {
level: map_zoom,
center: new daum.maps.LatLng(defaultlat, defaultlng)
}
map = new daum.maps.Map(document.getElementById("map_canvas"), mapOption);

if(saved_maps_srl > 0)
{
var center_split = saved_map_center.split(',');
center = new daum.maps.LatLng(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 = 20 - parseInt(saved_map_zoom,10);
if(!map_zoom) map_zoom = 5;
}
else
{
center = new daum.maps.LatLng(defaultlat, defaultlng);
}

map.setCenter(center);
var center = map.getCenter();

jQuery("#width").val('600');
jQuery("#height").val('400');
map.setLevel(map_zoom);

var zoomControl = new daum.maps.ZoomControl();
map.addControl(zoomControl, daum.maps.ControlPosition.LEFT);
var mapTypeControl = new daum.maps.MapTypeControl();
map.addControl(mapTypeControl, daum.maps.ControlPosition.TOPRIGHT);

daum.maps.event.addListener(map, 'click', function(MouseEvent) {
latlng = MouseEvent.latLng;
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++)
{
map_markers[i].setMap(null);
}
}

if(latlng != 0) {
var latitude = latlng.getLat();
var longitude = latlng.getLng();

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

positions = makeLocationArray(map_marker_positions);

// 전체 마커 다시 생성
for(var i = 0; i < positions.length; i++)
{
map_markers[i] = new daum.maps.Marker({
position: positions[i]
});
map_markers[i].setMap(map);
map_markers[i].setDraggable(true);
map_markers[i].soo_position = positions[i];
new_marker_obj = map_markers[i];

// 이벤트 등록 드래그 시작과 끝은 전후 관계로 연결 되어있음
daum.maps.event.addListener(map_markers[i], "dragstart", function() {
var position = this.soo_position;
map_marker_positions = map_marker_positions.replace(position.getLat() + ',' + position.getLng() + ';', '');
});
daum.maps.event.addListener(map_markers[i], "dragend", function() {
var position = this.getPosition();
// 중복되는 마커는 생성되지 않도록.
map_marker_positions = map_marker_positions.replace(position.getLat() + ',' + position.getLng() + ';', '');
map_marker_positions += position.getLat() + ',' + position.getLng() + ';';
addMarker(0);
});
daum.maps.event.addListener(map_markers[i], "click", function() {
var position = this.soo_position;
removeMarker(position);
});
}

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

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

var latitude = latlng.getLat();
var longitude = latlng.getLng();

// 마커 위치 제거
map_marker_positions = map_marker_positions.replace(latitude+','+longitude+';', '');
positions = makeLocationArray(map_marker_positions);

// 전체 마커 다시 생성
for(var i = 0; i < positions.length; i++)
{
map_markers[i] = new daum.maps.Marker({
position: positions[i]
});
map_markers[i].setMap(map);
map_markers[i].setDraggable(true);
map_markers[i].soo_position = positions[i];
new_marker_obj = map_markers[i];

// 이벤트 등록 드래그 시작과 끝은 전후 관계로 연결 되어있음
daum.maps.event.addListener(map_markers[i], "dragstart", function() {
var position = this.soo_position;
map_marker_positions = map_marker_positions.replace(position.getLat() + ',' + position.getLng() + ';', '');
});
daum.maps.event.addListener(map_markers[i], "dragend", function() {
var position = this.getPosition();
map_marker_positions = map_marker_positions.replace(position.getLat() + ',' + position.getLng() + ';', '');
map_marker_positions += position.getLat() + ',' + position.getLng() + ';';
addMarker(0);
});
daum.maps.event.addListener(map_markers[i], "click", function() {
var position = this.soo_position;
removeMarker(position);
});
}

}

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 daum.maps.LatLng(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].getLat() + ',' + arr_position[i].getLng() + ';';
}
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 = 20 - map.getLevel();
map_lat = map.getCenter().getLat();
map_lng = map.getCenter().getLng();
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(); });
Loading

0 comments on commit b1fe51e

Please sign in to comment.