펄스나인님 다중마커 지도 스킨 질문입니다.
그누보드 스킨으로 적용해서
약간 커스텀하여 사용중입니다.
위치보기 클릭 시에는 panTo 정상적으로 마커 위치로 이동되는데, 지도 위에 마커를 클릭 시 아무 반응이 없습니다. 커서도 grabCursor 그대로구요..
list.skin.php 에 무슨 문제가 있나요? ㅠㅠ
</p>
<p><?php</p>
<p>if (!defined('_GNUBOARD_')) exit;</p>
<p>include_once(G5_LIB_PATH.'/thumbnail.lib.php');</p>
<p> </p>
<p>function get_board_sfl_select_options2($sfl){</p>
<p> global $is_admin;</p>
<p> $str = '';</p>
<p> </p>
<p> $str .= '<option value="wr_subject||wr_3||wr_4" '.get_selected($sfl, 'wr_subject||wr_3||wr_4').'>업체명+주소</option>';</p>
<p> $str .= '<option value="wr_subject" '.get_selected($sfl, 'wr_subject', true).'>업체명</option>';</p>
<p> $str .= '<option value="wr_3||wr_4" '.get_selected($sfl, 'wr_3||wr_4').'>주소</option>';</p>
<p> $str .= '<option value="wr_2" '.get_selected($sfl, 'wr_2', true).'>대표전화</option>';</p>
<p> </p>
<p> return run_replace('get_board_sfl_select_options2', $str, $sfl);</p>
<p>}</p>
<p> </p>
<p>$colspan = 5;</p>
<p> </p>
<p>if ($is_checkbox) $colspan++;</p>
<p>if ($is_good) $colspan++;</p>
<p>if ($is_nogood) $colspan++;</p>
<p> </p>
<p>add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);</p>
<p>
</p>
<p>$lat = 36.556400714093284; // 초기 및 리셋 중심좌표</p>
<p>$lng = 126.9785391897507; // 초기 및 리셋 중심좌표</p>
<p>?></p>
<p>
</p>
<p><!-- 게시판 목록 시작 { --></p>
<p><div id="bo_list"></p>
<p> </p>
<p> <div id="map" data-aos="fade-up" data-aos-delay="0" data-aos-offset="0"></div></p>
<p> </p>
<p> <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=<?php echo $board['bo_1'] ?>&libraries=services"></script></p>
<p> <!-- } --></p>
<p> </p>
<p> <script></p>
<p> var mapContainer = document.getElementById('map'), // 지도를 표시할 div</p>
<p> mapOption = {</p>
<p> center: new kakao.maps.LatLng(<?php echo $lat ?: '36.556400'; ?>, <?php echo $lng ?: '126.978539'; ?>), // 지도의 중심좌표 (기본값 추가)</p>
<p> level: 13 // 지도 초기 확대레벨</p>
<p> };</p>
<p> </p>
<p> var map = new kakao.maps.Map(mapContainer, mapOption);</p>
<p> </p>
<p> <?php</p>
<p> $gu = htmlspecialchars(str_replace("/", "", $_GET['gubun']), ENT_QUOTES, 'UTF-8'); // XSS 방지</p>
<p> </p>
<p> if ($_GET['gubun'] == "") {</p>
<p> $sql = "SELECT * FROM g5_write_" . $bo_table . " ORDER BY wr_id ASC";</p>
<p> } else {</p>
<p> $sql = "SELECT * FROM g5_write_" . $bo_table . " WHERE ca_name='" . $gu . "' ORDER BY wr_id ASC";</p>
<p> }</p>
<p> </p>
<p> $result = sql_query($sql);</p>
<p> $cnt = 0;</p>
<p> while ($row = sql_fetch_array($result)) {</p>
<p> if ($row['wr_5'] && $row['wr_6']) {</p>
<p> $thumb = get_list_thumbnail($board['bo_table'], $row['wr_id'], $board['bo_gallery_width'], $board['bo_gallery_height'], false, true);</p>
<p> $img_content = $thumb['src'] ?: '';</p>
<p> ?></p>
<p> // 마커 이미지 설정</p>
<p> <?php if ($row['wr_1'] == "markerStar1") { ?></p>
<p> var imageSrc = '<?php echo $board_skin_url ?>/img/markerStar1.png';</p>
<p> <?php } else if ($row['wr_1'] == "markerStar2") { ?></p>
<p> var imageSrc = '<?php echo $board_skin_url ?>/img/markerStar2.png';</p>
<p> <?php } else if ($row['wr_1'] == "markerStar3") { ?></p>
<p> var imageSrc = '<?php echo $board_skin_url ?>/img/markerStar3.png';</p>
<p> <?php } else if ($row['wr_1'] == "markerStar4") { ?></p>
<p> var imageSrc = '<?php echo $board_skin_url ?>/img/markerStar4.png';</p>
<p> <?php } else if ($row['wr_1'] == "markerStar5") { ?></p>
<p> var imageSrc = '<?php echo $board_skin_url ?>/img/markerStar5.png';</p>
<p> <?php } else { ?></p>
<p> var imageSrc = '<?php echo $board_skin_url ?>/img/markerStar6.png';</p>
<p> <?php } ?></p>
<p> </p>
<p> var imageSize = new kakao.maps.Size(24, 35), // 마커이미지의 크기</p>
<p> imageOption = { offset: new kakao.maps.Point(12, 35) }; // 마커이미지의 옵션</p>
<p> </p>
<p> // 마커의 이미지정보를 가지고 있는 마커이미지 생성</p>
<p> var markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize, imageOption),</p>
<p> markerPosition = new kakao.maps.LatLng(<?php echo $row['wr_5'] ?>, <?php echo $row['wr_6'] ?>); // 마커가 표시될 위치</p>
<p> </p>
<p> // 마커 생성</p>
<p> var marker = new kakao.maps.Marker({</p>
<p> position: markerPosition,</p>
<p> image: markerImage,</p>
<p> clickable: true</p>
<p> });</p>
<p> </p>
<p> // 마커가 지도 위에 표시되도록 설정</p>
<p> marker.setMap(map);</p>
<p> </p>
<p> // 커스텀 오버레이에 표시할 컨텐츠</p>
<p> var content = `</p>
<p> <div class="wrap"></p>
<p> <div class="info"></p>
<p> <div class="body"></p>
<p> <div class="desc" style="margin-left:10px;"></p>
<p> <img src="<?php echo $board_skin_url ?>/img/close_black_24dp.svg" class="close" onclick="closeOverlay_<?php echo $row['wr_id'] ?>()" title="닫기"></p>
<p> <div class="titles cut80"><a href="<?php echo G5_BBS_URL ?>/board.php?bo_table=<?php echo $bo_table ?>&wr_id=<?php echo $row['wr_id']; ?>"><?php echo $row['wr_subject']; ?></a></div></p>
<p> <div class="sub1 cut90"><?php echo $row['wr_3']; ?> <?php echo $row['wr_4']; ?></div></p>
<p> <?php if ($row['wr_2']) { ?></p>
<p> <div class="sub3 cut90"><a href="tel:<?php echo $row['wr_2']; ?>"><?php echo $row['wr_2']; ?></a></div></p>
<p> <?php } else { ?></p>
<p> <div class="sub2 cut90"><a href="<?php echo $row['wr_link1']; ?>" target="_blank"><?php echo $row['wr_link1']; ?></a></div></p>
<p> <?php } ?></p>
<p> </div></p>
<p> </div></p>
<p> </div></p>
<p> </div>`;</p>
<p> </p>
<p> // 커스텀 오버레이 생성</p>
<p> var overlay_<?php echo $row['wr_id'] ?> = new kakao.maps.CustomOverlay({</p>
<p> content: content,</p>
<p> map: null,</p>
<p> position: new kakao.maps.LatLng(<?php echo $row['wr_5'] ?>, <?php echo $row['wr_6'] ?>),</p>
<p> yAnchor: 1</p>
<p> });</p>
<p> </p>
<p> // 마커 클릭 시 오버레이 표시</p>
<p> kakao.maps.event.addListener(marker, 'click', function() {</p>
<p> overlay_<?php echo $row['wr_id'] ?>.setMap(map);</p>
<p> });</p>
<p> </p>
<p> // 오버레이 닫기 함수</p>
<p> window.closeOverlay_<?php echo $row['wr_id'] ?> = function() {</p>
<p> overlay_<?php echo $row['wr_id'] ?>.setMap(null);</p>
<p> };</p>
<p> </p>
<p> overlay_<?php echo $row['wr_id'] ?>.setMap(null);</p>
<p> </p>
<p> <?php</p>
<p> $cnt++;</p>
<p> }</p>
<p> } ?></p>
<p> </script></p>
<p>
답변 3개
어차피 그 코드로는 알수있는 정보가 없습니다.
적어도 핸들러 이벤트 정도는 알아야 뭔가 답변드릴텐데
feat. 그놈의 GPT...
댓글을 작성하려면 로그인이 필요합니다.
PHP while 반복문에서 동적으로 생성되는 다수의 전역 함수와 변수들로 인한 스코프 관리 문제나
JavaScript 실행 오류가 발생해서 마커 클릭 이벤트가 제대로 작동하지 않았을 가능성이 있습니다.
</p>
<p><?php
if (!defined('_GNUBOARD_')) exit;
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
function get_board_sfl_select_options2($sfl){
global $is_admin;
$str = '';
$str .= '<option value="wr_subject||wr_3||wr_4" '.get_selected($sfl, 'wr_subject||wr_3||wr_4').'>업체명+주소</option>';
$str .= '<option value="wr_subject" '.get_selected($sfl, 'wr_subject', true).'>업체명</option>';
$str .= '<option value="wr_3||wr_4" '.get_selected($sfl, 'wr_3||wr_4').'>주소</option>';
$str .= '<option value="wr_2" '.get_selected($sfl, 'wr_2', true).'>대표전화</option>';
return run_replace('get_board_sfl_select_options2', $str, $sfl);
}
$colspan = 5;
if ($is_checkbox) $colspan++;
if ($is_good) $colspan++;
if ($is_nogood) $colspan++;
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.css">', 0);</p>
<p>
$lat = 36.556400714093284; // 초기 및 리셋 중심좌표
$lng = 126.9785391897507; // 초기 및 리셋 중심좌표
?></p>
<p>
<!-- 게시판 목록 시작 { -->
<div id="bo_list">
<div id="map" data-aos="fade-up" data-aos-delay="0" data-aos-offset="0"></div>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=<?php echo $board['bo_1'] ?>&libraries=services"></script>
<!-- } -->
<script>
var mapContainer = document.getElementById('map'), // 지도를 표시할 div
mapOption = {
center: new kakao.maps.LatLng(<?php echo $lat ?: '36.556400'; ?>, <?php echo $lng ?: '126.978539'; ?>), // 지도의 중심좌표 (기본값 추가)
level: 13 // 지도 초기 확대레벨
};
var map = new kakao.maps.Map(mapContainer, mapOption);
// 마커와 오버레이를 저장할 배열
var markers = [];
var overlays = [];</p>
<p> <?php
$gu = htmlspecialchars(str_replace("/", "", $_GET['gubun']), ENT_QUOTES, 'UTF-8'); // XSS 방지
if ($_GET['gubun'] == "") {
$sql = "SELECT * FROM g5_write_" . $bo_table . " ORDER BY wr_id ASC";
} else {
$sql = "SELECT * FROM g5_write_" . $bo_table . " WHERE ca_name='" . $gu . "' ORDER BY wr_id ASC";
}
$result = sql_query($sql);
$cnt = 0;
$marker_data = array(); // 마커 데이터를 저장할 배열
while ($row = sql_fetch_array($result)) {
if ($row['wr_5'] && $row['wr_6']) {
$thumb = get_list_thumbnail($board['bo_table'], $row['wr_id'], $board['bo_gallery_width'], $board['bo_gallery_height'], false, true);
$img_content = $thumb['src'] ?: '';
// 마커 이미지 결정
$marker_img = 'markerStar6.png'; // 기본값
if (in_array($row['wr_1'], ['markerStar1', 'markerStar2', 'markerStar3', 'markerStar4', 'markerStar5'])) {
$marker_img = $row['wr_1'] . '.png';
}
// 마커 데이터 배열에 추가
$marker_data[] = array(
'id' => $row['wr_id'],
'lat' => $row['wr_5'],
'lng' => $row['wr_6'],
'image' => $marker_img,
'subject' => addslashes($row['wr_subject']),
'addr1' => addslashes($row['wr_3']),
'addr2' => addslashes($row['wr_4']),
'phone' => addslashes($row['wr_2']),
'link' => addslashes($row['wr_link1'])
);
$cnt++;
}
}
?>
// 마커 데이터를 JavaScript로 전달
var markerData = <?php echo json_encode($marker_data, JSON_UNESCAPED_UNICODE); ?>;
// 오버레이 닫기 함수
function closeOverlay(index) {
if (overlays[index]) {
overlays[index].setMap(null);
}
}
// 마커 클릭 핸들러 함수
function createMarkerClickHandler(markerIndex) {
return function() {
// 다른 오버레이들 닫기
overlays.forEach(function(ov) {
ov.setMap(null);
});
// 현재 오버레이 표시
overlays[markerIndex].setMap(map);
};
}
// 마커 생성 함수
function createMarkers() {
markerData.forEach(function(data, index) {
// 마커 이미지 설정
var imageSrc = '<?php echo $board_skin_url ?>/img/' + data.image;
var imageSize = new kakao.maps.Size(24, 35);
var imageOption = { offset: new kakao.maps.Point(12, 35) };
// 마커 이미지 생성
var markerImage = new kakao.maps.MarkerImage(imageSrc, imageSize, imageOption);
var markerPosition = new kakao.maps.LatLng(data.lat, data.lng);
// 마커 생성
var marker = new kakao.maps.Marker({
position: markerPosition,
image: markerImage,
clickable: true
});
// 마커를 지도에 표시
marker.setMap(map);
// 커스텀 오버레이 컨텐츠 생성
var content = '<div class="wrap">' +
'<div class="info">' +
'<div class="body">' +
'<div class="desc" style="margin-left:10px;">' +
'<img src="<?php echo $board_skin_url ?>/img/close_black_24dp.svg" class="close" onclick="closeOverlay(' + index + ')" title="닫기">' +
'<div class="titles cut80"><a href="<?php echo G5_BBS_URL ?>/board.php?bo_table=<?php echo $bo_table ?>&wr_id=' + data.id + '">' + data.subject + '</a></div>' +
'<div class="sub1 cut90">' + data.addr1 + ' ' + data.addr2 + '</div>';
if (data.phone) {
content += '<div class="sub3 cut90"><a href="tel:' + data.phone + '">' + data.phone + '</a></div>';
} else if (data.link) {
content += '<div class="sub2 cut90"><a href="' + data.link + '" target="_blank">' + data.link + '</a></div>';
}
content += '</div></div></div></div>';
// 커스텀 오버레이 생성
var overlay = new kakao.maps.CustomOverlay({
content: content,
map: null,
position: markerPosition,
yAnchor: 1
});
// 배열에 저장
markers.push(marker);
overlays.push(overlay);
// 마커 클릭 이벤트 등록
kakao.maps.event.addListener(marker, 'click', createMarkerClickHandler(index));
});
}
// 마커 생성 실행
createMarkers();
</script>
</div></p>
<p>
댓글을 작성하려면 로그인이 필요합니다.
아래의 코드를 한번 참고를 해보시겠어요
업체명+주소'; $str .= ''; $str .= ''; $str .= ''; return run_replace('get_board_sfl_select_options2', $str, $sfl); } $colspan = 5; if ($is_checkbox) $colspan++; if ($is_good) $colspan++; if ($is_nogood) $colspan++; add_stylesheet('', 0);
$lat = 36.556400714093284; // 초기 및 리셋 중심좌표 $lng = 126.9785391897507; // 초기 및 리셋 중심좌표 ?>
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인