웹마스터 팁

최근 이슈 트래커를 적용하고 불편 사항으로 들은 이야기 중에
소유자 부분 이었습니다.
개발자권한에 여러개의 그룹을 지정할 경우 해당 그룹의 유저 전체가 하나의 셀렉트박스에 나오기 때문에 보기가 불편합니다.
그래서 그룹을 선택 하면 그룹에 해당하는 유저 리스트가 표시되는 방식으로 소스를 수정해 봤습니다.

* 참고로 별도의 개발자 권한이 필요없어 개발자 권한이 아니어도 모든 그룹이 표시 되도록 작업 되어있습니다.

1. /modules/issuetracker/tpl/js/member_list.js    - 파일 신규 생성

function doSelectGroup(column_name) {
 var field_obj = xGetElementById('frm')[column_name];
    var group_val = field_obj.value;

 if(group_val){
        var response_tags = new Array('error','message','commiters');
        exec_xml('issuetracker','dispIssuetrackerCommiters',{group:group_val}, completerSearchMember,response_tags);
    }
}

function completerSearchMember(ret_obj, response_tags, callback_args) {
      
    var selectbox = null;
    selectbox = xGetElementById("assignee_srl");
 
 for(i=0;i<selectbox.options.length;i++){
  selectbox.options[i] = null;
 }

    if(ret_obj['error'] == 0 && ret_obj.commiters){
        var it = new Array();
        var items = ret_obj['commiters']['item'];
        if(typeof(items[0]) == 'undefined'){
            it[0] = items;
        }else{
            it = items;
        }
        var sel = 0;
  
        for(var i=0,c=it.length;i<c;i++){
            selectbox.options[i]=new Option(it[i].nick_name+'('+it[i].user_id+')',it[i].member_srl);
        }
        selectbox.options[sel].selected = true;
        selectbox.style.visibility="visible";
    }else{
        selectbox.style.visibility="hide";
        selectbox.innerHTML="";
    }
}

2. /modules/issuetracker/skins/xe_issuetracker/view_issue.html   수정
- line 2 추가
<!--%import("../../tpl/js/member_list.js")-->

- line 239 수정
<li>
     <input type="radio" name="action" value="reassign" id="actReassign" /><label for="actReassign">{$lang->cmd_reassign}</label>
     <select name="commiter_group" onchange="doSelectGroup(this.name);">
      <option value="0">--그룹을 선택하세요--</option>
      <
!--@foreach($commiter_group as $key => $val)-->
                        <option value="{$val->group_srl}">{$val->title}</option>
                        <
!--@end-->
     </select>
     <select name="assignee_srl" id="assignee_srl" onchange="xGetElementById('actReassign').checked='checked'" style="visibility:hidden;overflow:hidden;"></select>
                </li>
      추가       수정


3. /modules/issuetracker/issuetracker.view.php 
- line 230   dispIssuetrackerViewIssue 함수 수정
/**
         * @brief 이슈 목록 및 내용 보기
         **/
        function dispIssuetrackerViewIssue() {
            // 접근 권한 체크
            if(!$this->grant->ticket_view) return $this->dispIssuetrackerMessage('msg_not_permitted');

            // 프로젝트 관련 정보를 미리 구해서 project 라는 변수로 context setting
            $oIssuetrackerModel = &getModel('issuetracker');
            Context::set('project', $oIssuetrackerModel->getProjectInfo($this->module_info->module_srl));

            // 선택된 이슈가 있는지 조사하여 있으면 context setting
            $document_srl = Context::get('document_srl');
            $oIssue = $oIssuetrackerModel->getIssue(0);

            if($document_srl) {
                $oIssue->setIssue($document_srl);

                if(!$oIssue->isExists()) {
                    unset($document_srl);
                    Context::set('document_srl','',true);
                    $this->alertMessage('msg_not_founded');
                } else {
                    if($oIssue->get('module_srl')!=Context::get('module_srl') ) return $this->stop('msg_invalid_request');
                    if($this->grant->manager) $oIssue->setGrant();
                    if(!$this->grant->ticket_view && !$oIssue->isGranted()) {
                        $oIssue = null;
                        $oIssue = $oIssuetrackerModel->getIssue(0);

                        Context::set('document_srl','',true);

                        $this->alertMessage('msg_not_permitted');
                    } else {
                        // 브라우저 타이틀에 글의 제목을 추가
                        Context::addBrowserTitle($oIssue->getTitleText());
                    }
                }
            }

            // issue가 존재하지 않으면 목록 출력을 위한 준비
            if(!$oIssue->isExists()) {

                $args->module_srl = $this->module_srl;

                // 목록을 구하기 위한 대상 모듈/ 페이지 수/ 목록 수/ 페이지 목록 수에 대한 옵션 설정
                $args->page = Context::get('page');
                $args->list_count = 50;
                $args->page_count = 10;

                // issue 검색을 위한 변수
                $args->milestone_srl = Context::get('milestone_srl');
                $args->priority_srl = Context::get('priority_srl');
                $args->type_srl = Context::get('type_srl');
                $args->component_srl = Context::get('component_srl');
                $args->status = Context::get('status');
                $args->occured_version_srl = Context::get('release_srl');
                $args->resolution_srl = Context::get('resolution_srl');
                $args->assignee_srl = Context::get('assignee_srl');
                $args->member_srl = Context::get('member_srl');

                // status 점검
                if(!is_array($args->status)||!count($args->status)) {
                    $args->status = array('new','assign','reopen','reviewing');
                    Context::set('status'+ '+ ',$args->status);
                }
                $args->status = "'".implode("','",$args->status)."'";

                // 키워드 검색을 위한 변수
                $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...)
                $args->search_keyword = Context::get('search_keyword'); ///< 검색어

                // 커미터 목록 구함
    $commiter_group = $oIssuetrackerModel->getCommiterGroups($this->module_info->grants['commiter']);
    Context::set('commiter_group', $commiter_group);
                $commiters = $oIssuetrackerModel->getGroupMembers($this->module_info->grants['commiter']);
                Context::set('commiters', $commiters);

                // 일반 글을 구해서 context set
                $output = $oIssuetrackerModel->getIssueList($args);
                Context::set('issue_list', $output->data);
                Context::set('total_count', $output->total_count);
                Context::set('total_page', $output->total_page);
                Context::set('page', $output->page);
                Context::set('page_navigation', $output->page_navigation);

                // 스킨에서 사용하기 위해 context set
                Context::set('oIssue', $oIssue);

                $this->setTemplateFile('issue_list');
            } else {
                // 히스토리를 가져옴
                $histories = $oIssuetrackerModel->getHistories($oIssue->get('document_srl'));
                $oIssue->add('histories', $histories);
               
                // 스킨에서 사용하기 위해 context set
                Context::set('oIssue', $oIssue);

                // 커미터 목록을 추출
    $commiter_group = $oIssuetrackerModel->getCommiterGroups($this->module_info->grants['commiter']);
    Context::set('commiter_group', $commiter_group);

                $commiters = $oIssuetrackerModel->getGroupMembers($this->module_info->grants['commiter']);
                Context::set('commiters', $commiters);

                $this->setTemplateFile('view_issue');
            }
        }


- line 337 추가
function dispIssuetrackerCommiters() {
   $group = Context::get('group');
   $oIssuetrackerModel = &getModel('issuetracker');
   //$this->add('commiters', Context::get('commiters'));
   $commiters = $oIssuetrackerModel->getGroupMembers($group);
            $this->add('commiters', $commiters);
        }

4. /modules/issuetracker/issuetracker.model.php
- line 365 추가

function getCommiterGroups($group_srls) {
            if(!$group_srls) return;
            if(!is_array($group_srls)) $group_srls = array($group_srls);

            $args->group_srls = implode(',',$group_srls);
            $output = executeQueryArray('issuetracker.getCommiterGroups', $args);
            return $output->data;
        }

5. /modules/issuetracker/queries/getCommiterGroups.xml  - 파일 추가
<query id="getGroupMembers" action="select">
    <tables>
        <table name="member_group" alias="groups"/>
        <table name="member_group_member" alias="group_member"/>
    </tables>
    <columns>
        <column name="distinct(groups.group_srl)" />
  <column name="groups.title" />
    </columns>
    <conditions>
        <condition operation="equal" column="group_member.group_srl" var="groups.group_srl" />
    </conditions>
</query>





우선 view_issue.html 의 assignee_srl리스트를 숨김 처리하고 commiter_group 리스트를 출력합니다.
- dispIssuetrackerViewIssue() 함수에 추가된  $commiter_group  을 통해 그룹 리스트를 가져옵니다.
그룹 리스트를 가져오는 쿼리는  getCommiterGroups.xml  파일입니다.

그룹을 선택하면 onchange 이벤트를 통해 member_list.js 의 doSelectGroup() 함수를 호출합니다.
doSelectGroup() 함수는 exec_xml을 이용해 issuetracker.view.php의 dispIssuetrackerCommiters() 함수를 호출하게 되고
dispIssuetrackerCommiters() 함수는 선택한 그룹의 유저 리스트를 가져옵니다.

그리고 다시 member_list.js 의 completerSearchMember() 함수를 호출하여 selectbox에 아이템을 채워넣습니다.

이거 때문에 exec_xml을 조금은 알게 된거 같네요.
아 너무 어려워요 ㅠㅠ

결과물은 아래와 같습니다.

최초에는 회원 이름은 나오지 않으며 그룹을 선택하면 옆에 해당 그룹의 유저 리스트가 표시됩니다.




실력이 안되다 보니 순전 하드 코딩을 해서 수정하게 되네요ㅠ.ㅠ

XE 이슈 트래커에 해당 내용 추가 요청을 해두긴 했지만  임시로 라도 이슈 트래커 사용하시는 분들에게 도움이 되시길 바랍니다.

태그 연관 글
  1. [2017/07/18] 묻고답하기 게시판 공개 권한 질문 드려요 도와 주세요ㅠㅠ by sheis**** *2
  2. [2015/10/25] 웹마스터 팁 그룹별 회원 목록 출력 by 윤삼 *2
  3. [2014/05/02] 묻고답하기 회원을 분류해서 가입받고 싶습니다 by 베댜코베구아겨버티 *2
  4. [2014/04/03] 묻고답하기 요청한 기능을 실행할 수 있는 권한이 없습니다. by 불패의초인 *8
  5. [2014/03/29] 묻고답하기 admin페이지에서 group 리스트를 순서되로 보고 싶어요 by 컴박살 *2
제목 글쓴이 날짜
관리자 여러명 만들기 팁 [1] file 만쓰별(정만) 2009.02.03
png파일 제어 ie6투명버그 해결책이 될듯도 한데염 [7] 만쓰별(정만) 2009.02.05
1.1.5 버전에서 로고가 나타나지 않는 문제 gotomoon 2009.02.06
윈도우 서버에서 XE 업데이트 어려움... [2] 윤임수 2009.02.06
나만의 카운터를 만들어보자! [3] 데미안k 2009.02.08
D-DAY 플래시 file 세츠카 2009.02.09
완벽하게 XE폴더를 url에서 접속하기 [2] 팬텀MW 2009.02.10
게시판에서 사이트 관리자만 볼수있는 항목 만들기 [1] ☜ TeRy ☞ 2009.02.13
회원 순위 공동순위 표시해서 뽑기(원리만 소개) 라르게덴 2009.02.13
TortoiseSVN에서 특정 리비전 영역만 추출하기 [1] ◀CGlink▶ 2009.02.19
플래너 최근문서(위젯)에 카테고리색 적용, Dday 적용, 지난 일정 출력 여부 조절 [7] file 주상태 2009.02.21
확장변수전용 권한설정 게시판스킨 미권한자에게 출력 (''깜박''오류?) 보고 file 0su 2009.02.25
테스트용 아이디 탈퇴 막기 [1] SMaker 2009.02.26
윈도우, 리눅스, 맥서버에서 이슈트래커 동작가능하게 하기 [1] file 뽀여니 2009.03.02
2003 + RWAPM + faceOff + IE7 = rewrite mod 에러 neotec 2009.03.03
이슈 트래커 소유자 변경 시 그룹별 선택 기능 file 개돌 2009.03.05
사진이 떳다 사라지는 문제 해결법 [2] 현진 2009.03.07
svn 업으로 xe 최신본 유지하기 [2] file e~세상쉼터 2009.03.08
Faceoff 버젼에서 확장변수 마음대로 배치하기 ^^ 파파민 2009.03.13
게시물 가운데 정렬 문제 임시해결법 한신일 2009.03.15