본문

xe게시판 목록설정이 안될 때 대처방법

[그림 1] XpressEngine Core ver. 1.4.4.1 + 게시판 ver. 1.1 사용시 목록설정이 되지 않는다.

위에 그림에 나왔듯이 XpressEngine Core ver. 1.4.4.1 + 게시판 ver. 1.1 의 조합에서 목록설정을 통해 게시물 리스팅 페이지에서 원하거나 원하지 않는 변수에 대한 출력설정을 하려 했다. 지정을 완료한 후 저장 버튼을 눌렀는데 아무런 반응이 없어 어쩔수 없는 버그인가 하고 이에 대한 분석을 시작하였다. 원하는것은 기본적으로 출력하게 되어있는 '조회 수' 항목을 없애고 대신 '추천 수' 항목을 출력하게 하는것. 물론 간단하게 꽁수로 해결하는 방법도 있지만 이왕하는것 더욱 자세하게 분석하여 다른 분들에게 도움이 되고자 하여 이 게시물을 작성한다. 소스 문서화가 잘 되어있지 않다고 생각하여 꺼꾸로 찾아나가는 상향식 분석방법을 사용한다. 하지만 이 버그를 해결하는 방법을 제시하는건 아니고, 이 버그를 어떻게 헤쳐가느냐...에 초점을 맞췄다.

우선 게시물의 리스팅은 어떻게 이루어 지는걸까. 게시판 리스팅은 그에 상응하는 스킨에 따라 달라진다는 개념을 생각해 보면 스킨 폴더에서 찾는것이 맞을 것 같았다. 그래서 xe\modules\board\skins\xe_official 으로 들어갔더니 떡하니 list.html이라는 파일이 있었다. 20번째 줄에 있던 <div class="boardNavigation"> 부터의 내용은 페이지 아래쪽의 목록등의 버튼과 1,2,3식의페이지 리스팅을 관리하는 것이고, 그 위에 있는 <!--@if($module_info->default_style == 'webzine')--> 등의 전처리기로 스타일을 결정한후 파일을 인클루드 시키는 부분에서 else항에 있는 <!--#include("./_style.list.html")--> 가 실제적으로 리스팅을 관리한다는것을 알 수 있었다.

[그림 2] _style.list.html의 내용, 전처리기에 의해 출력할 변수들이 결정된다.

>>다음 항목은 소스의 흐름을 나타내는 것이므로 보기 어려우시면 다음 단락을 참조해주세요.<<
_style.list.html의 내용을 열어보니 <!--@foreach($list_config as $key => $val)--> 라는 구문으로 출력할 변수들이 선택되는것을 확인할 수 있었다. 그럼 $list_config은 어디에 있나. 이는 board.model.php의 23번째 구문에 있는 getListConfig메소드의 일부인 $list_config = $oModuleModel->getModulePartConfig('board', $module_srl);에서 확인이 가능하며 마찬가지로 getModulePartConfig메소드는 module.model.php의 869번쨰 라인에 정의되어있다. 이 메소드는 executeQuery('module.getModulePartConfig', $args);를 호출하며, getModulePartConfig의 내용을 sql구문으로 풀어쓰자면 select config where module='$module' and module_srl='$module_srl' from module_part_config과 같다. 즉 module_part_config 테이블의 config 컬럼값을 (unserialize하여)불러온다는 것인데 테이블을 확인하니 값이 없다. 왜냐하면 뭔가 수정사항을 저장해야 테이블에 기록이 될텐데 수정사항이 입력이 안되는 문제를 겪으니 빌 수밖에 없지...  그렇기 때문에 getListConfig안에 있던 if(!$list_config || !count($list_config)) $list_config = array( 'no', 'title', 'nick_name','regdate','readed_count');가 호출되었던 것이다.

문제 해결(대처) 방법
결국 이 문제에 대처(버그를 완벽하게 수정하지 않았으므로)하기 위한 방법은 module_part_config 테이블에 새로운 엔트리를 추가하는 것이다. module칼럼에는 board를 입력하고, module_srl은 관리자 페이지->서비스 관리->게시판->게시판 목록 페이지에서 톱니모양의 아이콘에 마우스를 가져대면 ?module=admin&act=dispBoardAdminBoardInfo&module_srl=57 이런식으로 주소가 나타나는데 여기서의 57을 입력한다. 그리고 config 칼럼에는 아래의 소스를 실행한 후에 나오는 결과물을 입력하면 된다. 물론 array에 있는 항목은 출력을 원하는 변수들을 나타낸 것이며 다른 항목을 출력/삭제하기 원한다면 [그림 1]의 페이지에서 소스보기상에서의 <div class="targetItem">와 <div class="displayItem"> 내에 있는 option들의 value값을 참고하면 된다. 본인의 경우는 readed_count대신 voted_count를 사용하고 하였으므로 다음과 같은 소스를 사용하였다.
<?
    $list_config = array( 'no', 'title', 'nick_name','regdate','voted_count');
    echo serialize($list_config);
?>


또하나의 팁.

게시판에 있는 '이 게시물을...' 항목을 삭제하고 싶다면
1. view_document.html에 있는 $oDocument->getContent() 항목을 삭제한다. 혹은 getContents(false)로 설정한다. 이 스킨에 대해 설정이 된다.
2. modules\document\lang\ko.lang.php에서 $lang->cmd_document_do = ' '; 으로 설정하면 된다. 해당 언어팩에 대해 설정이 된다.
3, modules\document\document.item.php에서 getContent($add_popup_menu = true... 항목에서 true를 false로 바꿔주어(1번과 같은 원리) 기본적으로 '이 게시물을..' 항목을 보이지 않게 한다. 굳이 설정하지 않아도 모든 페이지에 적용이 된다.

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.