Hello World

[펌]워드프레스 한국형 게시판 – 2. KBOARD의 폐허 본문

Wordpress

[펌]워드프레스 한국형 게시판 – 2. KBOARD의 폐허

EnterKey 2016. 1. 11. 11:11
반응형
kboard3

워드프레스 한국형 게시판 – 2. Kboard의 폐허

지난글에 이어 포스팅 한드아..

일단은 워드프레스에서 기본적으로 제공하는 사용자 Role(구독자/글쓴이/기여자/편집자/관리자)만으로는 요구사항을 충족시키지 못한다. 우리는 교수님, 수강생, 연구원등의 Role이 필요했기 때문에 일단은 닥치고 User Role Editor 플러그인을 설치했다. 사실 User Role Editor를 설치하기 이전에 Ultimate Member라는 플러그인이 더 쌈박해 보여서 설치를 해보았으나, 사용자 Role을 생성하는 경우 순정(?) 워드프레스 Role과 같은 레벨로 취급되는 것이 아니라 플러그인 내부에서만 사용하는 Role을 생성하길래 과감히 삭제해버렸다. 최초 작업 목표 중에 하나가 최대한 확장 및 재사용 가능도록 Kboard의 소스를 건드리지 않는 것이었기 때문에 WP의 순정(ㅠㅠ) Role 기능을 활용하여 코드를 작성할 필요가 있었던 것이다.

 

그러나……………………………………………………

 

작업을 시작한지 몇 시간 되지 않아 Kboard는 폐허로 변해갔다. 아래는 내가 작성한 코드들인데, 사실 무슨 파일 몇 번째 라인에 넣고 어쩌고 설명하고 싶었지만 너무너무 귀찮다. 그냥 맥락을 파악할 수 있는 정도로만 작성해둘 터이니 궁금하신 분은 개인적으로 문의하시라.

 

일단은 Kboard의 Functions.helper.php파일에 WP Role을 가져오는 함수를 작성하였다. 참고로 필자는 WP 플러그인 개발 경험이 소박하여 User Role Editor를 뒤져 소스를 카피했다. ㅋㅋ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 사용자 롤을 리턴한다.
 * @return string
 */
function get_user_roles() {
 
 global $wp_roles;
 
 if (!isset($wp_roles)) {
 $wp_roles = new WP_Roles();
 }
 
 $roles = $wp_roles->roles;
 
 if (is_array($roles) && count($roles) > 0) {
 asort($roles);
 }
 
 return $roles;
}

그리고 게시판 설정을 보여주는 kboard_setting.php 파일을 열어 레이아웃을 일부 변경한 후 요런 코드를 추가했다.

 

1
2
3
4
5
6
7
8
9
10
// $meta는 kboard에서 사용하는 메타정보 저장 클래스이다. 우리도 저 메타정보 테이블에 설정을 구겨넣을 것이다.
 // 메타정보 테이블에 설정 정보를 넣을때 json으로 인코딩해서 넣기 때문에 일단 디코딩 하는거임 ㅇㅇ
 $permission_array = json_decode($meta->permission_read_selected);
 
 // $role은 index.php에서 kboard_setting함수가 호출될 때 값을 세팅해 두었다. 잘 들어가있으니 걍 사용하면 된다.
 foreach($roles as $key=>$val) {
 echo "<input name='permission_read_selected[".$key."]' id='r_".$key."' type='checkbox' ";
 if(array_key_exists ($key, $permission_array)) echo "checked";
 echo "/><label for='r_".$key."'>".translate_user_role($val['name'])."</label> ";
 }

위의 코드는 읽기 권한에 관한 것인데 실제 코드에는 저것과 똑같이 생긴 쓰기 권한 코드도 물론 삽입해 줬다.
마지막으로 index.php에서는 이렇게 하였다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 * 게시판 목록 페이지
 */
function kboard_setting(){
 $board = new KBoard();
 $board->setID($_GET['board_id']);
 $meta = new KBoardMeta($board->uid);
 $skin = KBoardSkin::getInstance();
 $roles = get_user_roles(); // 여기서 $role을 세팅해 준다구!
 if(defined('KBOARD_COMMNETS_VERSION')){
 include_once WP_CONTENT_DIR.'/plugins/kboard-comments/class/KBCommentSkin.class.php';
 $comment_skin = KBCommentSkin::getInstance();
 }
 include_once 'pages/kboard_setting.php';
}
 
/*
 * 게시판 정보 수정
 */
function kboard_update(){
 global $wpdb;
 if(!defined('KBOARD_COMMNETS_VERSION')){
 die('<script>alert("게시판 생성 실패!\nKBoard 댓글 플러그인을 설치해주세요.\nhttp://www.cosmosfarm.com/ 에서 다운로드 가능합니다.");history.go(-1);</script>');
 }
 
 $board_id = $_POST['board_id'];
 $board_name = addslashes($_POST['board_name']);
 $skin = $_POST['skin'];
 $page_rpp = $_POST['page_rpp'];
 $use_comment = $_POST['use_comment'];
 $use_editor = $_POST['use_editor'];
 $permission_read = $_POST['permission_read'];
 $permission_write = $_POST['permission_write'];
 $admin_user = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['admin_user']))));
 $use_category = $_POST['use_category'];
 $category1_list = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['category1_list']))));
 $category2_list = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['category2_list']))));
 $create = date("YmdHis", current_time('timestamp'));
 
 if(!$board_id){
 $wpdb->query("INSERT INTO `".KBOARD_DB_PREFIX."kboard_board_setting` (`board_name`, `skin`, `page_rpp`, `use_comment`, `use_editor`, `permission_read`, `permission_write`, `admin_user`, `use_category`, `category1_list`, `category2_list`, `created`) VALUE ('$board_name', '$skin', '$page_rpp', '$use_comment', '$use_editor', '$permission_read', '$permission_write', '$admin_user', '$use_category', '$category1_list', '$category2_list', '$create')");
 $board_id = $wpdb->insert_id;
 }
 else{
 $wpdb->query("UPDATE `".KBOARD_DB_PREFIX."kboard_board_setting` SET `board_name`='$board_name', `skin`='$skin', `page_rpp`='$page_rpp', `use_comment`='$use_comment', `use_editor`='$use_editor', `permission_read`='$permission_read', `permission_write`='$permission_write', `use_category`='$use_category', `category1_list`='$category1_list', `category2_list`='$category2_list', `admin_user`='$admin_user' WHERE `uid`='$board_id'");
 }
 
 if($board_id){
 $meta = new KBoardMeta($board_id);
 $meta->use_direct_url = $_POST['use_direct_url'];
 $meta->latest_alerts = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['latest_alerts']))));
 $meta->comment_skin = $use_comment?$_POST['comment_skin']:'';
 $meta->default_content = $_POST['default_content'];
 $meta->pass_autop = $_POST['pass_autop'];
 $meta->shortcode_execute = $_POST['shortcode_execute'];
 $meta->autolink = $_POST['autolink'];
 $meta->reply_copy_content = $_POST['reply_copy_content'];
 $meta->view_iframe = $_POST['view_iframe'];
 $meta->permission_comment_write = $_POST['permission_comment_write'];
 // 여기서 우리 데이터를 DB로 입력해 둘거야!!
 $meta->permission_read_selected = json_encode($_POST['permission_read_selected']);
 $meta->permission_write_selected = json_encode($_POST['permission_write_selected']);
 
 $auto_page = $_POST['auto_page'];
 if($auto_page){
 $auto_page_board_id = $wpdb->get_var("SELECT `board_id` FROM `".KBOARD_DB_PREFIX."kboard_board_meta` WHERE `key`='auto_page' AND `value`='$auto_page'");
 if($auto_page_board_id && $auto_page_board_id != $board_id) echo '<script>alert("선택하신 페이지에 이미 연결된 게시판이 존재합니다.")</script>';
 else $meta->auto_page = $auto_page;
 }
 else{
 $meta->auto_page = '';
 }
 }
 
 if($_POST['board_id']){
 die('<script>history.go(-1);</script>');
 }
 else{
 die('<script>location.href="' . KBOARD_SETTING_PAGE . '&board_id=' . $board_id . '"</script>');
 }
}

 

내가 추가한 부분은 코멘트를 달아놓은 두 곳 뿐이다.
어찌되었든 여기까지 해서 이제 설정 화면에서 Role을 선택하여 저장할 수 있고 저장된 Role을 눈으로 확인 할 수 있게 되었다. 아싸. 물논! 앞에있는 드롭다운 메뉴에서 ‘선택된 그룹’을 선택했을 때만 보이도록 조금 수정을 더 해줘야겠다.

 

kboard3멋있긔

 

이제 실제로 게시판을 읽고 쓰는 부분에서 우리가 저장해 둔 메타정보를 가져와서 현재 사용자의 Role과 비교해 주면 끄읕~
일단 커피를 한 잔하고 계속 해보자규. 아놔 근데 code 숏코드 사이에 있는 녀석들 자동 줄맞춤 하는 방법 없나?

 

자.. 커피를 마셨으니 이제 마저 써본다.

읽기/쓰기권한은 위에서 DB에 저장을 잘 해 주었다. 이제 읽고 쓸때 실제로 권한을 체크해주는 부분만 만들어주면 된다는 말씀. 그래서 KBoard.class.php에서 읽기 권한을 체크해주는 isReader함수와 쓰기권한을 체크해주는 isWriter함수를 수정해주었다. $this->permission_write == ‘particular’ 체크하는 else if문만 추가해 준거다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* 글 쓰기 권한이 있는 사용자인지 확인한다.
* @return boolean
*/
public function isWriter(){
$admin_user = array_map(create_function('$string', 'return trim($string);'), explode(',', $this->admin_user));
 
if($this->permission_write == 'all'){
return true;
}
else if($this->userdata->data->ID){
if(@in_array('administrator', $this->userdata->roles) || @in_array('editor', $this->userdata->roles)){
// 최고관리자 허용
return true;
}
else if($this->permission_write == 'editor' && @in_array($this->userdata->data->user_login, $admin_user)){
// 선택된 관리자 권한일때, 사용자명과 선택된관리자와 비교후, 일치하면 허용
return true;
}
else if($this->permission_write == 'author'){
// 로그인 사용자 권한일때, role대신 ID값이 있으면, 모든 사용자 허용
return true;
}
else if($this->permission_write == 'particular' && !$secret){
// 특정 그룹 권한일때, 메타 데이터에 사용자 롤이 있으면 허용
$meta = new KBoardMeta($this->id);
$permission_array = json_decode($meta->permission_write_selected);
 
foreach($this->userdata->roles as $user_role) {
if(array_key_exists($user_role, $permission_array)) {
return true;
}
}
 
return false;
}
}
else{
return false;
}
}

오 굳.. 잘 동작한다. 굳굳.. Kboard에서 정식으로 업데이트 해주면 정말 좋겠다.

이제 스마트에디터 이식 작업에 돌입한다. 귀찮다. 하지만 돈 벌려면 해야한다.

흙………………….


출처: http://funexlab.com/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%ED%95%9C%EA%B5%AD%ED%98%95-%EA%B2%8C%EC%8B%9C%ED%8C%90-2-kboard%EC%9D%98-%ED%8F%90%ED%97%88/

반응형
Comments