그누보드5, 영카트5 관리권한설정 기능 수정
내가 필요하니까 수정을 해보게 된다. 얼마 전에 생각이 나서 수정을 해볼까 하는 생각이 들었지만 막상 하려니 또 귀찮아서 미루고 있다가 오늘 생각이 나서 코드를 변경해보니 그렇게 어렵지도 않은 걸.. 왜 지금까지 미루고 있었는지.. 코드 수정하고 작동은 이상없이 되는 것 같으니까 일단 코드는 공개하는 걸로!!
기존 그누보드5나 영카트5에서는 회원별로 권한 설정을 할 때 메뉴를 select를 이용해서 하나씩 선택하고 아이디를 지정하는 식으로 해줘야 하는데.. 이 경우 회원 여러 명에서 여러 메뉴의 권한을 부여하려면 정말 노가다를 해야한다. 그래서 위 이미지처럼 변경하는 것을 생각을 했고 아래 코드를 적용하면 구현된다. 그러고 보니 영카트5 데모 사이트 구성할 때도 권한설정 때 이 삽질을 했던 기억이.. 그 때 왜 안 고쳤지?
수정할 파일은 adm/auth_list.php, adm/auth_update.php, adm/css/admin.css 3개의 파일이다. 우선 auth_list.php 파일에서 변경할 부분은 아이디별로 권한을 지정하는 부분으로 아래 코드로 변경하면 된다.
<form name="fauthlist2" id="fauthlist2" action="./auth_update.php" method="post" autocomplete="off">
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
<input type="hidden" name="stx" value="<?php echo $stx ?>">
<input type="hidden" name="sst" value="<?php echo $sst ?>">
<input type="hidden" name="sod" value="<?php echo $sod ?>">
<input type="hidden" name="page" value="<?php echo $page ?>">
<input type="hidden" name="token" value="<?php echo $token ?>">
<section id="add_admin">
<h2 class="h2_frm">관리권한 추가</h2>
<div class="local_desc01 local_desc">
<p>
다음 양식에서 회원에게 관리권한을 부여하실 수 있습니다.<br>
권한 <strong>r</strong>은 읽기권한, <strong>w</strong>는 쓰기권한, <strong>d</strong>는 삭제권한입니다.
</p>
</div>
<div class="tbl_frm01 tbl_wrap">
<table>
<colgroup>
<col class="grid_4">
<col>
</colgroup>
<tbody>
<tr>
<th scope="row"><label for="mb_id">회원아이디<strong class="sound_only">필수</strong></label></th>
<td>
<?php echo help(', 로 구분해 중복 입력 가능'); ?>
<input type="text" name="mb_id" value="<?php echo $mb_id ?>" id="mb_id" required class="required frm_input">
</td>
</tr>
<tr>
<th scope="row"><label for="au_menu">접근가능메뉴<strong class="sound_only">필수</strong></label></th>
<td>
<ul id="au_menu_list">
<?php
$i = 0;
foreach($auth_menu as $key=>$value)
{
if (!(substr($key, -3) == '000' || $key == '-' || !$key)) {
$li_class = 'au_menu_li';
if($i > 0 && $i % 4 == 0)
$li_class .= ' au_menu_clear';
echo '<li class="'.$li_class.'">'.PHP_EOL;
echo '<input type="hidden" name="menu['.$i.']" value="'.$key.'">';
echo '<input type="checkbox" name="au_chk[]" id="au_chk_'.$i.'" value="'.$i.'">'.PHP_EOL;
echo '<label for="au_chk_'.$i.'">'.$value.'</label>'.PHP_EOL;
echo '</li>'.PHP_EOL;
$i++;
}
}
?>
</ul>
</td>
</tr>
<tr>
<th scope="row">권한지정</th>
<td>
<input type="checkbox" name="r" value="r" id="r" checked>
<label for="r">r (읽기)</label>
<input type="checkbox" name="w" value="w" id="w">
<label for="w">w (쓰기)</label>
<input type="checkbox" name="d" value="d" id="d">
<label for="d">d (삭제)</label>
</td>
</tr>
</tbody>
</table>
</div>
<div class="btn_confirm01 btn_confirm">
<input type="submit" value="추가" class="btn_submit">
</div>
</section>
</form>
form 부분을 수정하면 된다. 그런 다음 auth_update.php 파일의 코드를 수정한다. 삭제한 코드가 있고 변경해야할 코드가 있다. 아래의 코드는 삭제한다.
$mb = get_member($mb_id);
if (!$mb['mb_id'])
alert('존재하는 회원아이디가 아닙니다.');
$mb_id 변수에 복수의 아이디를 , 로 구분해 입력할 수 있도록 했기 때문에 위 코드는 필요가 없다. 그리고 실제 DB에 입력, 수정하는 부분의 코드를 아래 코드로 수정한다.
// 아이디
$arr_mb_id = array_map('trim', explode(',', $mb_id));
$count = count($arr_mb_id);
// 선택메뉴
$menu_count = count($_POST['au_chk']);
for($i=0; $i<$count; $i++) {
$mb = get_member($arr_mb_id[$i], 'mb_id');
if (!$mb['mb_id'])
continue;
for($k=0; $k<$menu_count; $k++) {
$j = $_POST['au_chk'][$k];
$au_menu = $_POST['menu'][$j];
$sql = " insert into {$g5['auth_table']}
set mb_id = '{$arr_mb_id[$i]}',
au_menu = '$au_menu',
au_auth = '{$_POST['r']},{$_POST['w']},{$_POST['d']}' ";
$result = sql_query($sql, FALSE);
if (!$result) {
$sql = " update {$g5['auth_table']}
set au_auth = '{$_POST['r']},{$_POST['w']},{$_POST['d']}'
where mb_id = '{$arr_mb_id[$i]}'
and au_menu = '$au_menu' ";
sql_query($sql);
}
}
}
//sql_query(" OPTIMIZE TABLE `$g5['auth_table']` ");
마지막으로 css 코드를 추가해주면 된다. admin.css 파일에 아래의 코드를 추가한다.
/* 관리권한설정 */
#add_admin fieldset {margin-top:20px}
#au_menu_list {margin:0;padding:0;list-style:none}
.au_menu_li{float:left;width:160px;height:25px;line-height:25px;}
.au_menu_clear {clear:both;}
기본 admin.css 파일에서는 431 라인 근처에 코드가 존재하는데 #add_admin fieldset {margin-top:20px} 아래에 위 코드 중에서 3 줄의 css 코드를 추가해주면 된다. css 부분은 적당히 수정하면 된다.
간단한 테스트 결과 이상없이 작동을 하지만 오류가 있을 수도 있기 때문에 실제 적용하기 전에 확실하게 테스트를 거치는 게 좋을 듯 하다. 개발도 개발이지만 테스트가 제일 힘들고 스트레스 맞는 일인 듯!!