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 이 공식매뉴얼에는 해당 팁은 없었습니다만 언젠간 올라오겠죠 (__);


 
댓글은 로그인 사용자만 작성 가능합니다. 로그인하기