하나의 게시판에 여러 스킨을 적용해 보자 정보
하나의 게시판에 여러 스킨을 적용해 보자첨부파일
본문
자유게시판 들여다 보면서 스킨을 좀 바꿔봤으면 좋겠는데 하는 생각을 하다가...
급하게 한 번 그누보드 가지고 구현해 봤읍니다.
개발을 잘 몰라서 혼자 보면서 실수하지 않으려고
주석을 덕지덕지 붙여가면서 구현해 봤는데,
저같은 초보자들한테는 도움이 될 것 같아서 그대로 올려봅니다.
효율적인지는 잘 모르겠네요... ㅎ
1) 관리자 > 환경설정 > 기본환경설정 > 여분필드 > 여분필드1 에 멀티스킨을 이용할 게시판 아이디(bo_table)값을 |로 구분하여 입력하세요.
예시: free|notice|gallery
2) 아래 구조의 DB 테이블을 추가합니다.
CREATE TABLE `g5_select_bo_skin` (
`skin_id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`mb_id` varchar(20) NOT NULL,
`bo_table` varchar(255) NOT NULL,
`bo_skin` varchar(255) NOT NULL,
`bo_mobile_skin` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
자 내가 여기서 어떻게 하는 건지 잘 모르겠다?
첨부파일 다운 받아서 그누보드 설치된 디렉토리에 업로드하고 실행하세요.
common.php 파일 있는 디렉토리에 업로드 하시면 됩니다.
그 다음에 회원님도메인/dbupdate.php 로 한 번 접속하고 끄세요.
3) extend 에 아무 이름으로 php 파일을 만들어서 아래 코드를 복붙합니다.
예시: selectskin.extend.php
<?php
// 멀티 스킨을 이용하는 게시판 아이디 배열
$arr_select_bo = explode('|', $config['cf_1']);
// 스킨 선택값을 저장
if (isset($_GET['select_bo_skin']) && $_GET['select_bo_skin'])
$_bo_skin = clean_xss_tags($_GET['select_bo_skin']);
// 멀티 스킨을 이용하는 게시판일 때만 동작
if (isset($bo_table) && in_array($bo_table, $arr_select_bo)) {
// PC, 모바일 구분
$bo_skin_device = 'bo_';
if ($is_mobile) $bo_skin_device .= 'mobile_';
$bo_skin_device .= 'skin';
// 스킨을 선택했으면
if (isset($_bo_skin) && !empty($_bo_skin)) {
// 스킨(디렉토리 기준)이 존재하면 세션을 생성합니다.
$dirname = get_skin_path('board', $_bo_skin);
if (is_dir($dirname))
set_session('ss_select_bo_skin', $_bo_skin);
}
$ss_bo_skin = get_session('ss_select_bo_skin');
// 회원이면
if ($is_member) {
// 이전에 마지막으로 선택한 스킨 정보가 있는지 조회
$sql = " SELECT {$bo_skin_device} FROM g5_select_bo_skin WHERE mb_id = '{$member['mb_id']}' and bo_table = '{$bo_table}' ORDER BY skin_id DESC ";
$result = sql_fetch($sql);
// 세션이 있으면
if ($ss_bo_skin) {
// 스킨 정보가 존재하고
if ($result[$bo_skin_device]) {
// 지금 선택한 스킨과 다르면 정보 업데이트
if ($result[$bo_skin_device] != $ss_bo_skin)
sql_query(" UPDATE g5_select_bo_skin SET {$bo_skin_device} = '{$ss_bo_skin}' WHERE mb_id = '{$member['mb_id']}' AND bo_table = '{$bo_table}' ");
// 스킨 정보가 없으면 정보 추가
} else {
sql_query(" INSERT INTO g5_select_bo_skin SET {$bo_skin_device} = '{$ss_bo_skin}', mb_id = '{$member['mb_id']}', bo_table = '{$bo_table}' ");
}
// 세션이 없으면
} else {
// 이전에 마지막으로 선택한 스킨이 있으면 적용
if ($result[$bo_skin_device])
$ss_bo_skin = $result[$bo_skin_device];
}
}
// 선택한 스킨 적용
if ($ss_bo_skin) {
$board_skin_path = get_skin_path('board', $ss_bo_skin);
$board_skin_url = get_skin_url('board', $ss_bo_skin);
}
}
4) 게시판 스킨에 다음 형태의 링크를 추가합니다.
<a href="<?php echo short_url_clean(G5_HTTP_BBS_URL.'/board.php?bo_table='.$bo_table.'&page='.$page.$qstr.'&select_bo_skin=basic'); ?>">목록형</a>
<a href="<?php echo short_url_clean(G5_HTTP_BBS_URL.'/board.php?bo_table='.$bo_table.'&page='.$page.$qstr.'&select_bo_skin=gallery'); ?>">갤러리형</a>
만약 테마에 있는 스킨이면 select_bo_skin=theme/basic 처럼 쓰시면 됩니다.
원하는만큼 추가해서 쓰세요. ㅎㅎ
추가! 만약 게시판마다 허용된 스킨만 적용 가능하게 하려면 다음과 같이 하세요.
4FLIXNETFLIX님 댓글을 보고 수정해 봤습니다. (근데 이건 테스트는 안 해봤어요. ㅎㅎ)
https://sir.kr/g5_tip/20106#c_20109
추가1) 게시판 관리에서 여분필드1에 허용할 스킨을 | 로 구분해서 입력합니다.
예시: basic|gallery
추가2) selectskin.extend.php 에서 (혹은 각자 지정한 파일명에서)
<?php
// 멀티 스킨을 이용하는 게시판 아이디 배열
$arr_select_bo = explode('|', $config['cf_1']);
// 스킨 선택값을 저장
if (isset($_GET['select_bo_skin']) && $_GET['select_bo_skin'])
$_bo_skin = clean_xss_tags($_GET['select_bo_skin']);
// 멀티 스킨을 이용하는 게시판일 때만 동작
if (isset($bo_table) && in_array($bo_table, $arr_select_bo)) {
이 부분을 아래처럼 고칩니다.
<?php
// 멀티 스킨을 이용하는 게시판 아이디 배열
$arr_select_bo = explode('|', $config['cf_1']);
// 멀티 스킨으로 이용할 수 있는 스킨 배열
$arr_whitelist_skin = explode('|', $board['bo_1']);
// 스킨 선택값을 저장
if (isset($_GET['select_bo_skin']) && $_GET['select_bo_skin'])
$_bo_skin = clean_xss_tags($_GET['select_bo_skin']);
// 멀티 스킨을 이용하는 게시판이고 이용허용된 스킨일 때만 동작
if (isset($bo_table) && in_array($bo_table, $arr_select_bo) && in_array($_bo_skin, $arr_whitelist_skin)) {
21
댓글 11개
이것과는 많이 다르지만 저도 최신버전에 추가된 게시판 상하단 삽입 hook 기능으로 내맘대로 스킨을 고를 수 있는 방법을 이리저리 생각하고 있었습니다.ㅋ
1이나 2로 선택하도록 해줘야합니다. 테마 경로를 이용해서 장난을 치거나 보안상 문제가 있을 수 있습니다.
<a href ..... &select_bo_skin=1">기본형</a> 이런형태로 쓰시는걸 권장합니다.
switch ($_GET['select_bo_skin'])
{
case 1:
$select_bo_skin = "basic";
case 2:
$select_bo_skin = "gallery";
default:
$select_bo_skin = "basic";
}