실시간 쪽지 - 마지막 장애물 입니다 ㅠ..ㅠ > 그누4 질문답변

그누4 질문답변

그누보드4 관련 질문은 QA 로 이전됩니다. QA 그누보드4 바로가기
기존 게시물은 열람만 가능합니다.

실시간 쪽지 - 마지막 장애물 입니다 ㅠ..ㅠ 정보

실시간 쪽지 - 마지막 장애물 입니다 ㅠ..ㅠ

첨부파일

real_memo.zip (32.6K) 4회 다운로드 2007-09-19 16:23:17

본문

1. 설치방법
 
(1)
realtime_*는 /bbs 디렉토리에
img 디렉토리의 이미지는 /bbs/img 디렉토리에 넣습니다.
 
(2)
head.sub.php에서 아랫 부분을 코멘트 처리 합니다. 뭐 안해도 상관은 없습니다.
 
// 쪽지를 받았나?
//if ($member['mb_memo_call']) {
//    $mb = get_member($member[mb_memo_call], "mb_nick");
//    sql_query(" update {$g4[member_table]} set mb_memo_call = '' where mb_id = '$member[mb_id]' ");
//    alert($mb[mb_nick]."님으로부터 쪽지가 전달되었습니다.", $_SERVER[REQUEST_URI]);
//}
 
(3)
head.php에서 아래를 추가 합니다.
include_once("$g4[bbs_path]/realtime_memo.php");
 
(4) outlogin에서 쪽지 카운터의 증가를 하게 하려면 outlogin에서 불러야 합니다. 이부분은 조금 더 고민을...
 
 
--- 버트~ 문제가 하나 있어서 공개하지 않고 질문을 합니다 --
 
tag_call 값이 0이 아니면 mb_memo_call에 값이 있다는 의미 입니다.
그래서 이경우 레이어를 활성화 하면서 mb_memo_call의 db 값을 싹 지워야 합니다.
 
그런데... html 코드에서 진한 부분을 보면 $member[mb_memo_call] 값은 페이지가
refresh 될 때 다시 읽어들어 지는 것이므로 사용하면 안되고 ajax를 통해서 가지고 온
tag_call 값을 가지고 판단을 해야 합니다.
 
아무리 잔머리를 써도 생각이 안나서... 이문제를 어떻게 했으면 좋을지 질문 합니다.
 
<?
/*************************************************/
/*           실시간 쪽지 - 그누보드              */
/*  프로그램 by 정권짱, pooka, 불당              */
/*************************************************/
include ("./_common.php");
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가
$replace_time = 5000; // 쪽지정보 새로고침 간격 (대부분의 경우 2만-5만으로 설정하면 됨)
?>
<script type="text/javascript" language="javascript">
var xmlHttp;
startRequest();
function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}
   
function startRequest() {
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.open("GET", "<?=$g4[bbs_path]?>/realtime_memo_connect.php", true); // connect program의 location
    xmlHttp.send(null);
}
function handleStateChange() {
    if(xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {
            var xmlDoc = xmlHttp.responseXML;
            var xml_total = xmlDoc.getElementsByTagName("total")[0];
            var xml_new = xmlDoc.getElementsByTagName("new")[0];
            var xml_call = xmlDoc.getElementsByTagName("call")[0];
            var tag_total = xml_total.childNodes[0].nodeValue;
            var tag_new = xml_new.childNodes[0].nodeValue;
            var tag_call = xml_call.childNodes[0].nodeValue;
           //document.getElementById("mb_call").value = tag_call; //만일 불러오는 html 페이지의 값을 바꿀 때
            if (tag_call != 0) { // me_memo_call에 값이 있을 때 팝업창을 뛰운다
              do_check();
              msn_position();
            }
            setTimeout("startRequest()", <?=$replace_time?>);         
        }
    }
}
</script>
<!--  레이어로 쪽지창 표시 시작 -->
<script language="JavaScript1.2">
 var msn_closed = true;
 var msn_top = 0;
 var msn_left = 0;
 var msn_divheight = 165;
 var msn_divwidth  = 1024;
 
function do_check () {
 msn_closed    = false;
}
function msn_position() {
   if(!msn_closed) {
      msn_top = document.body.scrollTop + document.body.clientHeight - msn_divheight;
      msn_left = document.body.clientWidth - msn_divwidth;
      document.getElementById("kissme").style.top = msn_top;
      document.getElementById("kissme").style.left = msn_left;
      document.getElementById("kissme").style.display = "";
    }
}
 var old_ResizeHandler = window.onresize;
  window.onresize = new Function("{if (old_ResizeHandler != null) old_ResizeHandler(); msn_position();}");
 var old_ScrollHandler = window.onscroll;
  window.onscroll = new Function("{if (old_ScrollHandler != null) old_ScrollHandler(); msn_position();}");
function hideLayer(layer) {
  if(document.layers) {
  layer = eval('document.layers.' + layer);
  if(layer.display != 'none') layer.display = 'none';
    else layer.display = '';
    return;
    }
  layer = document.getElementById(layer);
  if(layer.style.display != 'none') {
  layer.style.display='none';
    }
  else {
  layer.style.display='';
    }
msn_closed = true;
}
</script>
<div id="kissme" name="kissme" style="position:absolute; overflow: hidden; top:10; left:10; z-index: 999999; display: none; width:203; height:165; layer-background-color:rgb(255,204,255);">
<table width="193" border="0" cellspacing="0" cellpadding="0" class="message01">
  <tr>
    <td height="33"><img src="<?=$g4[bbs_path]?>/img/message_01.gif" width="193" height="33" border="0" usemap="#Map" /></td>
  </tr>
  <tr>
    <td height="114" align="center" background="<?=$g4[bbs_path]?>/img/message_02.gif">
    <table width="150" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td align="center" class="message01"><br>
          <strong><?=$member[mb_name]?></strong>님<br>
          <?
          // 쪽지 알림을 확인했으므로 mb_memo_call을 reset 합니다
          //if ($member['mb_memo_call']) {
          //    sql_query(" update {$g4[member_table]} set mb_memo_call = '' where mb_id = '$member[mb_id]' ");
          //}
          ?>

          <br>
          쪽지가 도착했습니다<br>
          확인하시겠습니까?<br></td>
      </tr>
      <tr>
        <td align="center">
        <a href="#" onclick="window.open('<?=$g4[bbs_path]?>/memo.php','member_memo','width=610,height=460,status=no,toolbar=no,resizable=yes,scrollbars=yes');hideLayer('kissme');"><img src="<?=$g4[bbs_path]?>/img/message_btn_01.gif" width="59" height="21" border="0"></a>
        <a href="#" onclick='hideLayer("kissme")'><img src="<?=$g4[bbs_path]?>/img/message_btn_closs.gif" width="59" height="21" border="0"></a></td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td><img src="<?=$g4[bbs_path]?>/img/message_03.gif" width="193" height="15" /></td>
  </tr>
</table>
</div>
<map name="Map"><area shape="rect" coords="168,10,183,24" href="#" onclick='hideLayer("kissme")'></map>

댓글 전체

흙~ 나쁜맘 안머글께요. 답변 좀 달아주세욤 ㅠ..ㅠ

hideLayer에 php 코드를 넣는거 했더니 안되더라구요. 아~ 방법이 방법이... 도와주세욤~!
tag_call이 없다고 하면서 php안의 db sql이 무조건 실행되더라구요. 이긍~

tag_call은 함수안의 변수로 정의되었으니 그럴 수 있는데... 그런경우 안에 있는 php 코드는
실행되면 안되는거쟎아요. ㅠ..ㅠ

function hideLayer(layer) {
  if(document.layers) {
  layer = eval('document.layers.' + layer);
  if(layer.display != 'none') layer.display = 'none';
    else layer.display = '';
    return;
    }
  layer = document.getElementById(layer);
  if(layer.style.display != 'none') {
  layer.style.display='none';
    }
  else {
  layer.style.display='';
    }
msn_closed = true;
    if (tag_call !=0) {
  <?
    // 쪽지 알림을 확인했으므로 mb_memo_call을 reset 합니다
    sql_query(" update {$g4[member_table]} set mb_memo_call = '' where mb_id = '$member[mb_id]' ");
  ?>
    }
}
form을 쓰는 것은 testing을 해보니까 (프로그램 하기전에 생각해씀 프로그램 안했을꺼에요. ㅎㅎ...)
새로운 page가 되어서 전혀 의미가 없네요. ㅋㅋ...

<?
/*************************************************/
/*          실시간 쪽지 - 그누보드              */
/*  프로그램 by 정권짱, pooka, 불당              */
/*************************************************/

include ("./_common.php");
if (!defined("_GNUBOARD_")) exit; // 개별 페이지 접근 불가

$replace_time = 5000; // 쪽지정보 새로고침 간격 (대부분의 경우 2만-5만으로 설정하면 됨)
?>

<? if ($is_member) { ?> <!-- 회원인 경우에만 ajax가 작동하게 합니다 -->

<script type="text/javascript" language="javascript">

<!-- ajax -->

var xmlHttp;

startRequest();

function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}
   
function startRequest() {
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.open("GET", "<?=$g4[bbs_path]?>/realtime_memo_connect.php", true); // connect program의 location
    xmlHttp.send(null);
}

function handleStateChange() {
    if(xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {
            var xmlDoc = xmlHttp.responseXML;
            var xml_total = xmlDoc.getElementsByTagName("total")[0];
            var xml_new = xmlDoc.getElementsByTagName("new")[0];
            var xml_call = xmlDoc.getElementsByTagName("call")[0];
            var tag_total = xml_total.childNodes[0].nodeValue;
            var tag_new = xml_new.childNodes[0].nodeValue;
            var tag_call = xml_call.childNodes[0].nodeValue;

          //document.getElementById("mb_call").value = tag_call; //만일 불러오는 html 페이지의 값을 바꿀 때

            if (tag_call != 0) { // me_memo_call에 값이 있을 때 팝업창을 뛰운다
          do_check();
          msn_position();
            }
            setTimeout("startRequest()", <?=$replace_time?>);         
        }
    }
}

<!--  레이어로 쪽지창 표시 시작 -->

 var msn_closed = true;
 var msn_top = 0;
 var msn_left = 0;
 var msn_divheight = 165;
 var msn_divwidth  = 1024;
 
function do_check () {
 msn_closed    = false;
}

function msn_position() {
  if(!msn_closed) {
      msn_top = document.body.scrollTop + document.body.clientHeight - msn_divheight;
      msn_left = document.body.clientWidth - msn_divwidth;
      document.getElementById("kissme").style.top = msn_top;
      document.getElementById("kissme").style.left = msn_left;
      document.getElementById("kissme").style.display = "";
    }
}

 var old_ResizeHandler = window.onresize;
  window.onresize = new Function("{if (old_ResizeHandler != null) old_ResizeHandler(); msn_position();}");
 var old_ScrollHandler = window.onscroll;
  window.onscroll = new Function("{if (old_ScrollHandler != null) old_ScrollHandler(); msn_position();}");

function hideLayer(layer) {
  if(document.layers) {
  layer = eval('document.layers.' + layer);
  if(layer.display != 'none') layer.display = 'none';
    else layer.display = '';
    return;
    }
  layer = document.getElementById(layer);
  if(layer.style.display != 'none') {
  layer.style.display='none';
    }
  else {
  layer.style.display='';
    }
msn_closed = true;
}
</script>

<form name=fmemoform method=post>
<div id="kissme" name="kissme" style="position:absolute; overflow: hidden; top:10; left:10; z-index: 999999; display: none; width:203; height:165; layer-background-color:rgb(255,204,255);">
<table width="193" border="0" cellspacing="0" cellpadding="0" class="message01">
  <tr>
    <td height="33"><img src="<?=$g4[bbs_path]?>/img/message_01.gif" width="193" height="33" border="0" usemap="#Map" /></td>
  </tr>
  <tr>
    <td height="114" align="center" background="<?=$g4[bbs_path]?>/img/message_02.gif">
    <table width="150" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td align="center" class="message01"><br>
          <strong><?=$member[mb_name]?></strong>님<br>
          <br>
          쪽지가 도착했습니다<br>
          확인하시겠습니까?<br></td>
      </tr>
      <tr>
        <td align="center">
        <a href="#" onclick="window.open('<?=$g4[bbs_path]?>/memo.php','member_memo','width=610,height=460,status=no,toolbar=no,resizable=yes,scrollbars=yes');hideLayer('kissme');"><img src="<?=$g4[bbs_path]?>/img/message_btn_01.gif" width="59" height="21" border="0"></a>
        <a href="#" onclick='hideLayer("kissme"); fmemoform_submit();'><img src="<?=$g4[bbs_path]?>/img/message_btn_closs.gif" width="59" height="21" border="0"></a></td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td><img src="<?=$g4[bbs_path]?>/img/message_03.gif" width="193" height="15" /></td>
  </tr>
</table>
</div>
</form>

<map name="Map"><area shape="rect" coords="168,10,183,24" href="#" onclick='hideLayer("kissme")'></map>

<script type="text/javascript" language="javascript">

function fmemoform_submit() {
    var f = document.fmemoform;
         
    f.action = "<?=$g4[bbs_path]?>/realtime_memo_update.php";
    f.submit();
}
</script>

<? } ?>
결국 popup창을 띄워야 해결이 가능한 문제인가요??? 답을 주세요 ㅠ..ㅠ
레이어가 뽀대 나기 때문에 레이어 하려다가 하루를 쌩으로 다 날려써요.
쪽지를 확인하라는 레이어를 한번만 띄우려고 하시는거죠?
코드를 보니 realtime_memo_connect.php 을 5초마다 한번씩 실행해서
결과값을 xml 로 받고 새로운 쪽지가 있으면 쪽지가 왔다는 메시지를 레이어로 띄우려고 하시는거 같은데..

그렇다면 realtime_memo_connect.php 에서 xml 을 출력한 후
sql_update() 를 해주면 원하시는 동작을 할 것 같아 보입니다.

그런데 생각하셔야 하는 부분이 각 코드의 실행시점입니다. 위 코드들이 php, javascript, html 로 이루어져 있는데..
서버에서는 php 코드를 해석해서 javascript 와 html 로 이루어진 한페이지를 생성해서 클라이언트에게 전송합니다.
그리고 서버와 클라이언트 간의 통신은 종료가 되죠.
그리고 클라이언트의 웹브라우져가 서버에서 전송받은 페이지를 해석해서 화면에 출력해주거든요.
그러니 자바스크립트 안에 php 코드를 넣어봤자 소용이 없고 프로그램이 원하는 것과 다르게 실행이 됩니다.
realtime_memo_connect.php 에서 xml 을 출력한 후
sql_update() 를 해주면 원하시는 동작을 할 것 같아 보입니다.
-> 이경우 컴터를 켜두고 장기 외출했다가 나갔다 온 사람에게는 쪽지 확인이 안되는 문제가 생길 수 있죠.
사용자가 layer를 hide할 때 mb_memo_call field를 clear하는 것 입니다.
hide할 때 ajax request를 날리는 것으로 문제를 해결 했습니다.
감솨드리며 포인트 날립니다. ㅋㅋ...

싸비쓰로 ajax에서 한글 쓰는 법... 좀 알려주세요. ㅠ..ㅠ
전체 66,554 |RSS
그누4 질문답변 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1402호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT