sir.kr의 사이드바에 있는 이 위젯이 탐이 났습니다.
XE로 어떻게 구현할까 하다가 사이트맵 위젯을 활용해봤습니다. (더 좋은 의견 있으면 코멘트 남겨주세요.)
1. 기본 코드
<!--@foreach($widget_info->sitemap_widget_menu->list as $k1 => $v1)--> {@ $module_srl = $v1['node_srl']-1; $oModuleModel =&getModel('module'); $oModuleInfo = $oModuleModel->getModuleInfoByModuleSrl($module_srl); $oDocumentModel = getModel('document'); $document_count = $oDocumentModel->getDocumentCount($module_srl); $oDB = &DB::getInstance(); $query = $oDB->_query('SELECT count(*) as todayCount FROM rx_documents WHERE module_srl = '.$module_srl.' AND regdate LIKE "%20221201%"'); $result = $oDB->_fetch($query); $todayCnt = $result->todayCount?$result->todayCount:null; } <a href="{$v1['href']}" cond="$oModuleInfo->module=='board' || $oModuleInfo->module=='wiki'"> <span class="todayCount" cond="$todayCnt">{$todayCnt}</span> <span class="board">{$v1['text']}</span> <span class="count">{$document_count}</span> </a> <!--@end-->
사이트맵 위젯 스킨에서는 활용할 수 있는 변수값이 마땅치 않아 module_srl을 구해오기 위해 $v1['node_srl']값을 활용해서 만들었습니다.
1) module_srl 값 구하기
2) module 모듈을 이용하여 해당 메뉴가 page, board, wiki 등인지 구별하기 (-> board, wiki만을 대상으로 하기 위해서)
3) document 모듈을 이용하여 해당 메뉴의 전체 게시물 수 구하기(getDocumentCount함수 사용)
4) 직접 쿼리문으로 오늘 작성한 게시물 수 카운트하기
이렇게 구현했습니다.
저렇게 만들고 나니깐 조금 부족한 부분들이 다시 눈에 들어오더군요.
1) 바로가기 메뉴의 경우 해당 게시판의 module_srl 값을 구해오지 못함.
2) 24시간이 아닌 오늘 날짜를 기준으로 카운트함.
2. 보완한 버전..
<!--@foreach($widget_info->sitemap_widget_menu->list as $k1 => $v1)--> {@ $mid = $v1['url']; $oDB = &DB::getInstance(); $oModuleModel = getModel('module'); $module_srl = $oModuleModel->getModuleInfoByMid($mid)->module_srl; $oModuleInfo = $oModuleModel->getModuleInfoByModuleSrl($module_srl); $oDocumentModel = getModel('document'); $document_count = $oDocumentModel->getDocumentCount($module_srl); $query = $oDB->prepare('SELECT count(*) as todayCount FROM documents WHERE module_srl =? AND regdate BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW()'); $query->execute(array($module_srl)); $result = $query->fetchAll(); $todayCnt = $result[0]->todayCount?$result[0]->todayCount:null; } <a href="{$v1['href']}" cond="$oModuleInfo->module!=='page'" target="_blank"|cond="$v1['open_window']=='Y'"> <span class="board"><span class="todaycount" cond="$todayCnt">{$todayCnt}</span>{$v1['text']}</span> <span class="count" cond="$document_count!==0">{$document_count}</span> </a> <!--@end-->
1) 바로가기 메뉴도 게시글 수 카운트해주도록 수정함.
먼저 1의 방법의 경우 $v1['node_srl']값을 활용해서 module_srl 값을 가져왔었는데,
이를 mid를 기준으로 다시 module 모듈을 통해 mid값을 구하는 방법으로 구현했습니다.
사이트맵 위젯스킨에서 url 값으로 mid를 구해올 수 있으므로 $v1['url'] 값을 이용하여 module_srl 값을 가져왔습니다.
이를 통해서 이제 바로가기 메뉴도 게시판 글수를 구해올 수 있게 되었습니다.
2) today를 24시간 기준으로 변경함
BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR) AND NOW() 을 사용함으로써 24시간 이내로 카운트 해주었습니다.
3) 쿼리문 수정
사실 1의 방법에서 사용된 쿼리문은 보안 때문에 보통 추천하지 않습니다. 그리고 rx_, xe_ 같은 DB prefix에 따라서 쿼리문도 다 수정해주어야 하기 때문에 라이믹스에서는 $oDB->_query() 대신에 $oDB->prepare()을 사용합니다.
이 경우에는 별도의 prefix를 사용하지 않더라도 자동으로 쿼리문에 xe_ 라던가 rx_ 등의 prefix를 붙여서 쿼리문을 돌려주게 됩니다.
저도 이 부분에서 익숙하지 않아서 삽질을 좀 했습니다. -_-;
참조
https://xetown.com/tips/1495156
https://github.com/rhymix/rhymix/issues/1509
https://xetown.com/questions/1515051
https://opentutorials.org/module/3774/31972
https://www.php.net/manual/en/function.preg-replace-callback.php 위 팁에서 배열로 다 새로 정의해주지 않으면 이 오류를 만나게 되실 겁니다;; preg_replace_callback()
https://tocup.net/tech/51663 이 팁은 mid로 module_srl을 구해오는 방법을 참조할 때 활용했습니다.
https://rhymix.org/manual 이 공식매뉴얼에는 해당 팁은 없었습니다만 언젠간 올라오겠죠 (__);