묻고답하기
[0.2.5따라잡기] "이 게시글을..." 관련기능 스킨으로
2007.11.06 22:12
0.2.5 에서 새로 생긴 "이 게시글을..." 팝업 기능을 스킨으로 적응시켜 보려고 합니다.
아마도~~ 모든 스킨 제작자들이 이 고민을 할 것이라고 생각되어 이 부분의 소스 분석으로 공론화 하려고 생각하여 글을 씁니다.
1. "이 게시글을..."을 클릭하면 대략 5가지 기능의 메뉴가 팝업창에 생기나 봅니다.
그래서 매우 중요한 기능이죠.
=================================================
/modules/document/ document.model.php 파일의 함수입니다.
=================================================
~~기타생략~~
/**
* @brief 선택된 게시물의 팝업메뉴 표시
*
* 인쇄, 스크랩, 추천, 비추천, 신고 기능 추가
**/
function getDocumentMenu() {
// 요청된 게시물 번호와 현재 로그인 정보 구함
$document_srl = Context::get('target_srl');
$mid = Context::get('+
'+
'cur_mid');
$logged_info = Context::get('logged_info');
$act = Context::get('cur_act');
// menu_list 에 "표시할글,target,url" 을 배열로 넣는다
$menu_list = array();
// trigger 호출
ModuleHandler::triggerCall('document.getDocumentMenu', 'before', $menu_list);
// 인쇄 버튼 추가
$menu_str = Context::getLang('cmd_print');
$menu_link = sprintf("%s?document_srl=%s&act=dispDocumentPrint",Context::getRequestUri(),$document_srl);
$menu_list[] = sprintf("\n%s,%s,winopen('%s','MemberModifyInfo')", '' ,$menu_str, $menu_link);
// 추천 버튼 추가
$menu_str = Context::getLang('cmd_vote');
$menu_link = sprintf("doCallModuleAction('+
'document','procDocumentVoteUp','%s')", $document_srl);
$menu_list[] = sprintf("\n%s,%s,%s", '', $menu_str, $menu_link);
// 비추천 버튼 추가
$menu_str = Context::getLang('cmd_vote_down');
$menu_link = sprintf("doCallModuleAction('document','procDocumentVoteDown','%s')", $document_srl);
$menu_list[] = sprintf("\n%s,%s,%s", '', $menu_str, $menu_link);
// 신고 기능 추가
$menu_str = Context::getLang('cmd_declare');
$menu_link = sprintf("doCallModuleAction('document','procDocumentDeclare','%s')", $document_srl);
$menu_list[] = sprintf("\n%s,%s,%s", '', $menu_str, $menu_link);
// 회원이어야만 가능한 기능
if($logged_info->member_srl) {
// 스크랩 버튼 추가
$menu_str = Context::getLang('cmd_scrap'+
');
$menu_link = sprintf("doCallModuleAction('+
'member','procMemberScrapDocument','%s')", $document_srl);
$menu_list[] = sprintf("\n%s,%s,%s", '', $menu_str, $menu_link);
}
// trigger 호출 (after)
ModuleHandler::triggerCall('document.getDocumentMenu', 'after', $menu_list);
// 정보를 저장
$this->add("menu_list", implode("\n",$menu_list));
}
이 중에서 새로 생긴 것은 비추천 인것 같습니다.
신고도 새로 생긴 것인가요?
어쨌든.
이거 두가지 기존에 만든 스킨에 기능 추가해 넣을라구 합니다 ㅋㅋ
근데 얄굳게도 스킨파일에는 해당 소스가 없네요.
그래서 디벼보기 시작했습니다.
2. 대충 통빡으로 굴려서 procDocumentVoteDown 이 부분을 어트게 해서 넘겨주면 될 것 같네요.
아래 나오는 함수를 들여다 보면, getContent함수에 전달하는 $add_document_info 값이 기본으로 true로 되어 있네요
이 부분을 false로 하면 된다고 제로님이 언지를 주셨습니다.
(이 부분은 나인테일님 글에 댓글 주셨죠 http://www.zeroboard.com/15971318 )
=================================================
/modules/document/ document.item.php에 나오는 함수입니다.
=================================================
~~클래스 앞부분 생략~~
function getContent($add_document_info = true) {
if($this->isSecret() && !$this->isGranted()) return Context::getLang('msg_is_secret');
$_SESSION['accessible'+ '][$this->document_srl] = true;
$content = $this->get('content');
// OL/LI 태그를 위한 치환 처리
$content = preg_replace('!<(ol|ul|blockquote)>!is','<\\1 style="margin-left:40px;">',$content);
// url에 대해서 정규표현식으로 치환
$content = preg_replace('!([^>^"^\'^=])(http|https|ftp|mms):\/\/([^ ^<^"^\']*)!is','$1<a href="$2://$3" onclick="window.open(this.href);return false;">$2://$3</a>',' '.$content);
if(!$add_document_info) return $content;
$content = sprintf(
'<!--BeforeDocument(%d,%d)--><div class="document_%d_%d">%s</div><div class="document_popup_menu"><span class="document_popup_menu document_%d">%s</span></div><!--AfterDocument(%d,%d)-->',
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $this->get('member_srl'),
$content,
$this->document_srl, Context::getLang('cmd_document_do'),
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $this->get('member_srl')
);
return $content;
}
으아~ content에 많이 붙었네요
보시다 시피 내용 뒤에 뭐를 붙입니다. <span class="document_popup_menu document_%d">
지난번에 보니, 게시판에서 이름을 클릭할 경우 회원정보가 뜨는데 거기 실명이 공개되어서 그거 없애느라고 미니팝업 소스를 찾았었죠. 이것도 그것과 비슷할 거에요.
이 부분은 어트게 변형하겠죠?
컴파일 할때 소스를 바꿔서 어트게 해 주는 것 같습니다. 이 부분은 아직 찾지를 못했습니다.
3. 통빡을 굴리기 위해서ㅋㅋ 기존에 사용하던 스킨 소스를 들여다 보겠습니다.
=================================================================
게시판 스킨의 view_document.html파일의 아랫부분을 변형해 쓰던 것입니다.
=================================================================
<li class="listButton">
<!--@if($oDocument->isEditable())-->
<!--수정-->
<a href="{getUrl('act','dispBoardWrite','document_srl',$oDocument->document_srl)}" class="button"><span>{$lang->cmd_modify}</span></a>
<!--삭제-->
<a href="{getUrl('act','dispBoardDelete','document_srl',$oDocument->document_srl)}" class="button"><span>{$lang->cmd_delete}</span></a>
<!--@end-->
<!--프린트-->
<a href="{getUrl('','act','dispDocumentPrint','document_srl',$oDocument->document_srl)}" onclick="winopen(this.href);return false;" class="button"><span>{$lang->cmd_print}</span></a>
<!--스크렙-->
<!--@if($is_logged)--><a href="#" onclick="doScrap({$oDocument->document_srl}); return false;" class="button"><span>{$lang->cmd_scrap}</span></a><!--@end-->
<!--리스트-->
<a href="{getUrl('document_srl','')}" class="button"><span>{$lang->cmd_list}</span></a>
<!--추천-->
<a href="#" onclick="doVote();return false;" class="button"><span>{$lang->cmd_vote}</span></a>
</li>
음... 통빡이 잘 굴러가야 하는데 여기서 딱 멈췄네요
3. 통박굴리기
기존에 <추천>은 doVote(); 이걸로 하나만 하다가 procDocumentVoteUp /// 'procDocumentVoteDown 이렇게 두가지로 바뀐 거 같죠?
근데 내가 알기로는 doVote저거는 자바스크립트였던 거 같은데요
이거 초보 통빡으로 연결하기 좀 복잡하겠는데요
맨 위 소스랑 직접 연결해 볼께요
신고 procDocumentDeclare 이거는 비교할 게 없는...
추천 doVote();이거는 둘로 변함
procDocumentVoteUp
procDocumentVoteDown
예전 doScrap({$oDocument->document_srl});
변경 procMemberScrapDocument
에~ 근데 더이상 진도가 안나갑니다.
4. 질문
기존 소스를 어떻게 변경해야 될까요?
댓글 4
-
xe촙5
2007.11.07 11:04
-
꼬리
2007.11.07 16:18
그런데,,,
/modules/document/ document.item.php 중에서
$content = sprintf(
'+ '+ '<!--BeforeDocument(%d,%d)--><div class="document_%d_%d">%s</div><div class="document_popup_menu"><span class="document_popup_menu document_%d">%s</span></div><!--AfterDocument(%d,%d)-->',
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $this->get('member_srl'),
$content,
$this->document_srl, Context::getLang('cmd_document_do'),
$this->document_srl, $this->get('member_srl'),
$this->document_srl, $this->get('member_srl')
);
위에 녹색으로 표시된 부분이 중복되어 있는 것 아닌가요? 대응하는 변환문자가 없으므로 별 영향은 없겠지만...
아무튼 불필요한 부분 아닌가요? -
xe촙5
2007.11.07 22:04
음... 그게 그런 것 같기도 하고 ... 잘 모르겠네요
음...
통박을 굴려서 실험해 봤는데요
<!--추천-->이렇게 해 봤는데요
<a href="#" onclick="doCallModuleAction('document','procDocumentVoteUp','$document_srl');return false;" class="button"><span>={$menu_str = Context::getLang('cmd_vote')}=</span></a>
추천은 되는 것 같은데 예전 스킨에서 추천수 값이 보이질 않는 것 같습니다.
내부적으로 어떻게 돌아가는 지 모르겠네요
디비를 직접 다룰 수 있는 능력이 안되어서리...
흠... 복잡복잡 -
xe촙5
2007.11.08 00:39
이 글은 xe팁게시판에 정리해서 올렸습니다.
참고해 주세요
http://www.zeroboard.com/?mid=zbxe_user_tip&document_srl=15979333
음... 그리고 1번 소스 하단에 있는 trigger 호출을 추적하기 위해서
================================================================
classes/module/ ModuleHandler.class.php에 function triggerCall을 들여다 봅시다
================================================================
class ModuleHandler extends Handler {
~~클래스 앞부분 생략~~
/**
* @brief trigger_name, called_position을 주고 trigger 호출
**/
function triggerCall($trigger_name, $called_position, &$obj) {
// 설치가 안되어 있다면 trigger call을 하지 않고 바로 return
if(!Context::isInstalled()) return new Object();
$oModuleModel = &getModel('module');
$cache_dir = sprintf("./files/cache/triggers/");
if(!is_dir($cache_dir)) FileHandler::makeDir($cache_dir);
$cache_file = sprintf("%s%s.%s", $cache_dir, $trigger_name, $called_position);
if(!@file_exists($cache_file)) {
$triggers = $oModuleModel->getTriggers($trigger_name, $called_position);
FileHandler::writeFile($cache_file, serialize($triggers));
} else {
$buff = FileHandler::readFile($cache_file);
$triggers = unserialize($buff);
}
if(!$triggers || !count($triggers)) return new Object();
foreach($triggers as $item) {
$module = $item->module;
$type = $item->type;
$called_method = $item->called_method;
$oModule = null;
$oModule = &getModule($module, $type);
if(!$oModule || !method_exists($oModule, $called_method)) continue;
$output = $oModule->{$called_method}($obj);
if(!$output->toBool()) return $output;
}
return new Object();
}
그러니까는...
ModuleHandler::triggerCall('+ 'document.getDocumentMenu', 'after', $menu_list);
이렇게 넘어갔는데요
function triggerCall($trigger_name, $called_position, &$obj) {
이렇게 받았거든요
이걸 좀 알아야 응용을 할텐데 after는 무슨 역할을 하는 걸까요
아~ 복잡합니다.