웹마스터 팁
이슈 트래커 소유자 변경 시 그룹별 선택 기능
2009.03.05 15:54
최근 이슈 트래커를 적용하고 불편 사항으로 들은 이야기 중에
소유자 부분 이었습니다.
개발자권한에 여러개의 그룹을 지정할 경우 해당 그룹의 유저 전체가 하나의 셀렉트박스에 나오기 때문에 보기가 불편합니다.
그래서 그룹을 선택 하면 그룹에 해당하는 유저 리스트가 표시되는 방식으로 소스를 수정해 봤습니다.
* 참고로 별도의 개발자 권한이 필요없어 개발자 권한이 아니어도 모든 그룹이 표시 되도록 작업 되어있습니다.
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 이슈 트래커에 해당 내용 추가 요청을 해두긴 했지만 임시로 라도 이슈 트래커 사용하시는 분들에게 도움이 되시길 바랍니다.
- [2017/07/18] 묻고답하기 게시판 공개 권한 질문 드려요 도와 주세요ㅠㅠ *2
- [2015/10/25] 웹마스터 팁 그룹별 회원 목록 출력 *2
- [2014/05/02] 묻고답하기 회원을 분류해서 가입받고 싶습니다 *2
- [2014/04/03] 묻고답하기 요청한 기능을 실행할 수 있는 권한이 없습니다. *8
- [2014/03/29] 묻고답하기 admin페이지에서 group 리스트를 순서되로 보고 싶어요 *2
댓글 0
제목 | 글쓴이 | 날짜 |
---|---|---|
통합검색의 기본값을 '제목' 이 아니라 '제목+내용' 으로 하고 픈 경우 [2] | sejin7940 | 2017.02.24 |
반응형 기본 개념 | Ansi™ | 2017.02.27 |
다음 우편번호 5자리 적용 [1] | 뒤늦게입문 | 2017.03.15 |
비밀글에 대해서도 썸네일이미지는 출력되도록 하고 싶으면 | sejin7940 | 2017.04.12 |
사용자정의에서 URL형, email형, textarea 형등에서도 기본값 인식하게 하려면 | sejin7940 | 2017.04.25 |
SASS? CSS확장판 | 키큰아이 | 2017.05.09 |
포인트 적립 횟수 일별 제한하기 (게시글 및 댓글 작성시) | Redback | 2017.06.18 |
스케치북 갤러리 제목에 카테고리 추가하기. [1] | 보보2 | 2017.07.17 |
폰갭 버전 업데이트 후 push 안되시는 분들께.. | 한꼬마 | 2017.08.09 |
폰갭 자기 전화번호 추출 | 한꼬마 | 2017.08.14 |
글등록시 포인트차감으로 등록불가 설정시 개별설정이 아닌 전체 설정 기준으로만 사용할 경우는 적용 안 되는 버그 수정법 | sejin7940 | 2017.08.23 |
폰갭 모바일 사진 분석 부터 번역까지 | 아토피뉴스 | 2017.10.16 |
모바일앱, 모바일 어플에서 카카오톡, 카카오 스토리 앱으로 공유하기 | 한꼬마 | 2017.10.31 |
성공적인 홈페이지 제작을 위해 점검해야 될 사안 | 웹369 | 2017.12.05 |
bitnami ssl 클라우드플레어 설정법 | 키큰아이 | 2017.12.06 |
XE에 채팅 연동 하기 [1] | younggyo | 2017.12.15 |
css 팁 : 색상코드 검색이필요할때 | Dotcomsoft | 2018.01.17 |
css팁 : 웹폰트 저장소 | Dotcomsoft | 2018.01.17 |
게시글 상하단에 광고삽입하기 | veplay2 | 2018.03.08 |
요즘 제가 jquery 웹앱 솔루션을 개발했습니다. [2] | 안드류KIM | 2018.04.03 |