웹마스터 팁
트리메뉴(dtree) 대충 정리
2009.07.19 23:52
dtree 메뉴에 대해 모아봤습니다.
조성우님의 dtree메뉴 적용하기
http://www.xpressengine.com/17647873
쫑득이님의 트리메뉴 구성
http://www.xpressengine.com/16560220
보거스내친구님의 새글 아이콘
http://www.xpressengine.com/18089216
사이트에 적용된 모습
저는 'XE 공식 사이트 레이아웃 ver 0.1 (xe_official)' - wite 를 사용하고 있습니다.
4가지정도 수정해줘서 사용중입니다.
조성우님이 올리신 파일을 받아서
1.
/www/layouts/xe_official/images 여기에
dtree_img 폴더 저장
2.
/www/layouts/xe_official/js 여기에
dtree.js 파일 저장
js 파일 중에
처음부분에 count 와 new-icon 변수 추가
// Node object
function Node(id, pid, count, new_icon, name, url, title, target, icon, iconOpen, open) {
this.id = id;
this.pid = pid;
this.new_icon = new_icon;
this.count = count;
this.name = name;
this.url = url;
this.title = title;
this.target = target;
this.icon = icon;
this.iconOpen = iconOpen;
this._io = open || false;
this._is = false;
this._ls = false;
this._hc = false;
this._ai = 0;
this._p;
};
65번줄 정도 아이콘 경로 변경
// Tree object
var dtree_icon_path = "./layouts/xe_official/images/dtree_img/";
function dTree(objName) {
287번줄 정도 게시물갯수와 뉴아이콘 이미지 경로 추가
else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id)
str += '<a href="javascript:" + this.obj + '.o(' + nodeId + ');" class="node">';
str += node.name;
if(node.count) str += '<span id="dnum"> [' + node.count + '] </span>';
if(node.new_icon) str += ' <img src="http://www.hanistory.com/img/new.gif">';
if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>';
str += '</div>';
3.
/www/layouts/xe_official/css 아래
white.css 파일 수정
css 파일 제일 아래에 아래내용 추가 (따로 css 파일을 만들지 않고)
/*--------------------------------------------------|
| dTree 2.05 | www.destroydrop.com/javascript/tree/ |
|---------------------------------------------------|
| Copyright (c) 2002-2003 Geir Landr? |
|--------------------------------------------------*/
#dtree { padding:0px 0 0 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11px; color: #666; white-space: nowrap; }
#dnum { font:1em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; color: #666;}
#dhom { font-weight:bold; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 15px; color: #000000; white-space: nowrap;}
#dtree img { border: 0px; vertical-align: middle; }
#dtree a { color: #333; text-decoration: none; }
#dtree a.node { white-space: nowrap; padding: 1px 2px 1px 2px; }
#dtree a.nodeSel { white-space: nowrap; padding: 1px 2px 1px 2px; }
#dtree a.node:hover { color: #333; text-decoration: underline; }
#dtree a.nodeSel:hover { color: #333; text-decoration: underline; }
#dtree a.nodeSel { background-color: #c0d2ec; }
#dtree .clip { overflow: hidden; }
#dtree p { padding:0 10px 0 0; text-align:center; }
/***********************************************************/
4.
관리자 설정 - 레이아웃 편집창에 로그인위젯 아래부분에 코드추가
<!--트리메뉴-->
<!--%import("js/dtree.js")-->
<?php
$result = @mysql_query('SELECT * FROM `xe_documents`');
$time_interval = 86400;
$time_check = date("YmdHis", time()-$time_interval);
while($row = @mysql_fetch_array($result)){
$module_srl[] = $row[module_srl];
$regdate[] = $row[regdate];
}
$regdate_len = count($regdate);
?>
<div id="dtree">
<script type="text/javascript">
var module_srl = new Array();
var regdate = new Array();
<?php
echo "regdate_len = $regdate_len;";
echo "time_check = $time_check;";
for($i=0;$i<$regdate_len;$i++){
$j = $regdate_len-$i-1;
echo "module_srl[$i] = $module_srl[$j];";
echo "regdate[$i] = $regdate[$j];";
}
?>
function new_icon(board){
var board_id;
if(board.search("qna") != -1) board_id = '234';
if(board.search("tip") != -1) board_id = '235';
if(board.search("pds") != -1) board_id = '230';
if(board.search("notice") != -1) board_id = '233';
if(board.search("freeboard") != -1) board_id = '232';
if(board.search("program") != -1) board_id = '2336';
if(board.search("regular") != -1) board_id = '18730';
if(board.search("besttip") != -1) board_id = '49605';
if(board.search("gallery") != -1) board_id = '51822';
if(board.search("regularpds") != -1) board_id = '52853';
if(board.search("memo") != -1) board_id = '56439';
if(board.search("link") != -1) board_id = '+
'+
'58787';
if(board.search("backup") != -1) board_id = '54397';
for(i=0;i<regdate_len;i++){
if(module_srl[i] == board_id) {
if(regdate[i] > time_check) {
return true;
}
else {
return false;
}
}
}
return false;
};
function count(){
var num;
num=0;
var board_id;
if(board.search("qna") != -1) board_id = '234';
if(board.search("tip") != -1) board_id = '235';
if(board.search("pds") != -1) board_id = '230';
if(board.search("notice") != -1) board_id = '233';
if(board.search("freeboard") != -1) board_id = '232';
if(board.search("program") != -1) board_id = '2336';
if(board.search("regular") != -1) board_id = '18730';
if(board.search("besttip") != -1) board_id = '49605';
if(board.search("gallery") != -1) board_id = '51822';
if(board.search("regularpds") != -1) board_id = '52853';
if(board.search("memo") != -1) board_id = '56439';
if(board.search("link") != -1) board_id = '58787';
if(board.search("backup") != -1) board_id = '54397';
for(i=0;i<regdate_len;i++){
if(module_srl[i] == board_id) {
num = num+1;
}
}
return num;
};
d = new dTree('d');
var x,y,z,cnt;
x=0;
y=10;
z=100;
cnt=0;
d.add(0,-1,0,0,'<span id="dhom"> Hani\'s Home </span>','','','');
<!--@foreach($main_menu->list as $key => $val)--><!--@if($val['text'])--> document.write(d); <p><a href="javascript: d.openAll();">모두 펼치기</a> | <a href="javascript: d.closeAll();">모두 접기</a></p>
x=x+1;board="{$val['href'+
']}";
d.add(x,0,0,0,"{$val['link']}","{$val['href']}",''<!--@if($val['open_window']=='Y')-->,true<!--@end-->);
<!--@if($val['selected']) -->
cnt=x;
<!--@end-->
<!--@foreach($val['list'] as $key1 => $val1)--><!--@if($val1['text'])-->
y=y+1;board="{$val1['href']}";
d.add(y,x,count(),new_icon(board),"{$val1['link']}","{$val1['href']}",''<!--@if($val1['open_window']=='Y')-->,true<!--@end-->);
<!--@if($val1['selected']) -->
cnt=y;
<!--@end-->
<!--@foreach($val1['list'] as $key2 => $val2)--><!--@if($val2['text'])-->
z=z+1;board="{$val2['href']}";
d.add(z,y,count(),new_icon(board),"{$val2['link']}","{$val2['href']}",''<!--@if($val2['open_window'+
']=='Y')-->,true<!--@end-->);
<!--@end--><!--@end-->
<!--@end--><!--@end-->
<!--@end--><!--@end-->
d.openTo(cnt, true);
d.openAll();
</script>
</div>
뉴아이콘 뽑아 올때 게시글 갯수도 같이 뽑아오면 좋겠는데 잘 안되서 루프 두번 돌렸습니다.(무식하게)
머 대충 이렇네요. 참고로 루프가 좀 많이 돌아가네요.
댓글 11
-
다스베이더
2009.07.20 16:28
-
글쓴이
2009.07.20 19:27
새아이콘 까지 이상없이 뜨는걸로 봐선
boad 값을 의심해봐야 할듯 하네요
저도 여기서 한동안 해맸었는데
전 걍 하나씩 의심나는 거 다 찍어봤었어요
document.write(boad)
document.write(new_icon)
등등
-
글쓴이
2009.07.20 23:27
아 감사합니다. 바로 적용했습니다.
처음엔 board_id 의 값을 어떻게 구할지 헤맸는데...
게시판 목록에서 바로 구할수 있었습니다.
http://cuple.ba.ro 적용된 사이트 입니다.
많이들 구경오세요.
-
다스베이더
2009.07.21 04:32
문제를 찾아냈습니다;;
$result = @mysql_query('SELECT * FROM `xe_documents`');
위의 빨간 부분이 DB 이름이더군요-_-;;
문제는 해결을 해서 아이콘은 잘 나오는데요
혹시 속도 문제는 없으신가요??
나름 코드를
<?php
$result = @mysql_query('SELECT * FROM `xe_documents`'+ ');$time_interval = 86400;
$time_check = date("YmdHis", time()-$time_interval);while($row = @mysql_fetch_array($result)){
if($row[regdate]-$time_check>0){
$module_srl[] = $row[module_srl];
$regdate[] = $row[regdate];
}
}
로 수정해서24시간 내의 글만 다루도록 하였는데도
페이지 로딩이 조금 버벅 거리네요.....
다른 곳이 문제여서 그런것인진 아직 잘 모르겠습니다.^^
혹시나 해서 여쭤봅니다.
한이73님께 문제가 없다면 제 싸이트에 문제가 있는 것일테니까요
-
다스베이더
2009.07.23 09:49
코드를 조금 바꿔봤습니다.
기존의
<?php
$result = @mysql_query('SELECT * FROM `xe_documents`');$time_interval = 86400;
$time_check = date("YmdHis", time()-$time_interval);while($row = @mysql_fetch_array($result)){
$module_srl[] = $row[module_srl];
$regdate[] = $row[regdate];
}$regdate_len = count($regdate);
?>
는 등록되어 있는 모든 글을 찾아야 해서 글이 많은 싸이트에서는 로딩이 오래걸립니다.그래서 db 검색시 24시간 이내의 글만 뽑아오도록 바꿔봤습니다.
<?php
$time_interval = 86400;
$time_check = date("YmdHis", time()-$time_interval);
$result = @mysql_query('SELECT * FROM `xe_documents` WHERE `regdate`>'.$time_check.' ');
while($row = @mysql_fetch_array($result)){
$module_srl[] = $row[module_srl];
$regdate[] = $row[regdate];
} -
YO-DA
2009.07.25 15:12
감사합니다^^ 적용하여 사용하고 있습니다~
-
보거스내친구
2009.07.26 21:43
오~ 이런것까지 신경을~~
역시 저는 데이터베이스를 안 배워서 아직 잘 몰라요ㅠㅠ
고맙습니다~ 나두 바꿔야지~
-
다스베이더
2009.07.27 13:57
사실 저렇게 바꾸면 이미 DB에서 가져온 module_srl 들이 모두 24시간 이내의 새글들이기 때문에
for(i=0;i<regdate_len;i++){
if(module_srl[i] == board_id) {
if(regdate[i] > time_check) {
return true;
}
else {
return false;
}코드는 필요 없게 되는데
이 코드가 없으면 true를 반환하게 하는 방법을 몰라서
수정을 못했습니다 -ㅂ-
-
보거스내친구
2009.07.27 14:21
역시 데이터베이스만 알아도 더 쉽게 할 수 있는 거였는데..
아직 제가 대학교 3학년인데, 저희 학교에서는 데이터베이스를 3학년 2학기에 배우더라구요ㅠㅠ
나중에 좀 더 효율적으로 바꾸게 되면 다시 올릴게요~~
-
다스베이더
2009.07.27 16:37
전 php도 모르고 DB도 모릅니다;
그저 C만 조금 다룰줄 알고요
제로보드4때부터 남의 소스 고쳐서 쓰는 것만 해오다 보니
눈치밥이 쌓여서 이런것도 하게 된 거죠 뭐;;
보거스님 소스 보고
사실 제로보드4 기반으로 메뉴에 new 띄우는 것처럼 소스 편집을 거의 해봤는데
(위 소스는 24시간 새글을 게시판 중복에 상관 없이 모두 가져오는 것.
제로보드 4 에서는 해당 게시판에서 가장 최신 글 1개만 가져와서 24시간 이내인지 비교하는 것)
마지막에서 막혀서 풀지를 못하고 잇네요
<?
function list_new($zxid) {
global $connect;
$recent_time = 60*60*24; //24시간 이내
$data=@mysql_fetch_array(@mysql_query('SELECT regdate FROM `xe_documents` WHERE `module_srl`='.$zxid.' ORDER BY regdate DESC LIMIT 1'));// 메뉴에 있는 게시판에 대하여 module_srl을 불러와 게시판 별 1개만 저장
$reg_time = $data[regdate];
if(time() - $reg_time < $recent_time) { $new_icon = " n"; }
else { $new_icon = ""; }
echo "$new_icon";// 불러온 게시판의 글 등록 시간을 비교하여 24시간 이내이면 n자 표시
}
?>메뉴<? list_new('+ '152') ?>
위와 같은 소스인데요
제로보드4와 똑같이 해봤습니다.
문제는 xe 레이아웃에서 메뉴 부분에 <? list_new('152') ?> 을 넣어서
해당 메뉴의 게시판 module_srl을 받아와야 하는데
아무리 삽질을 해봐도 질문을 해봐도 답을 모르겠네요-_-
{$module_info->module_srl} 이 해당 게시판의 srl(152) 번호를 가져 오는 것이라고 하는데
잘 안되더라고요
-
한이73
2009.07.27 19:08
for(i=0;i<regdate_len;i++){
if(module_srl[i] == board_id) {
return true;
}
}
걍 time_check 만 빼면 될것 같은데요,,false 값은 굳이 필요없을거 같고...어쨋든 루프는 돌아야 하니
전에 여쭤봤을 때도
코드 상에 차이는 없어보였는데....
똑같이 적용했는데 되지 않는 이유를 모르겠네요-_-
설마 버전 차이 때문에 안되는 경우도 있을까요??
제가 아직 1.1.0 버전을 사용하고 있어서요....-ㅂ-