그누보드가 현재 테마의 경로를 어떻게 지정해주는지 알고 싶습니다.

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
그누보드가 현재 테마의 경로를 어떻게 지정해주는지 알고 싶습니다.

QA

그누보드가 현재 테마의 경로를 어떻게 지정해주는지 알고 싶습니다.

본문

common.php 파일에

 

// 테마경로

if(defined('_THEME_PREVIEW_') && _THEME_PREVIEW_ === true)

    $config['cf_theme'] = isset($_GET['theme']) ? trim($_GET['theme']) : '';

 

if(isset($config['cf_theme']) && trim($config['cf_theme'])) {

    $theme_path = G5_PATH.'/'.G5_THEME_DIR.'/'.$config['cf_theme'];

    if(is_dir($theme_path)) {

        define('G5_THEME_PATH',        $theme_path);

        define('G5_THEME_URL',         G5_URL.'/'.G5_THEME_DIR.'/'.$config['cf_theme']);

        define('G5_THEME_MOBILE_PATH', $theme_path.'/'.G5_MOBILE_DIR);

        define('G5_THEME_LIB_PATH',    $theme_path.'/'.G5_LIB_DIR);

        define('G5_THEME_CSS_URL',     G5_THEME_URL.'/'.G5_CSS_DIR);

        define('G5_THEME_IMG_URL',     G5_THEME_URL.'/'.G5_IMG_DIR);

        define('G5_THEME_JS_URL',      G5_THEME_URL.'/'.G5_JS_DIR);

    }

    unset($theme_path);

}

 

이런 구문이 있긴 한데  $config['cf_theme']도 결국엔 그누보드에서 sql로 넣어줘야 하는 거잖아요?

근데 이 sql로 넣어주는 부분이 일단 theme.php에 있고(정확히는 admin.lib.php), 이 theme.php는 adm폴더안에 있습니다. 근데 결국 theme를 바꿔주려면 adm 페이지에 접속을 해야하니, 이 때 admin.lib.php 안에 있는 get_theme_dir() 함수안에 있는 쿼리문에 의해 데이터베이스에 경로를 넣겠죠? 여기까진 좋아요.

그럼 데이터베이스에 현재 테마의 경로가 지정돼 있을거고 위에 있는 $config['cf_theme'])로 데이터베이스 에 있는 현재 테마 경로 폴더명의 정보를 가져오겠네요. 근데 몇번째인지 안나와있어요. 즉, 테마가 여러개 일 수 있는데 여기 위에는 어떠한 반복문도 없죠. 

 

그런데 theme.php에는 array_unshift($theme, $config['cf_theme']);라는 함수가 있습니다.

이게 요소?를 첫번째로 옮겨와주는 함수라더군요. 그래서 따로 common.php의 상수 선언에서 반복문같은걸 안쓰면 자동으로 첫번째걸 가져와주는건지 궁금합니다. 

 

위에 볼드체로 한 부분이 사실 가장 궁금한거였는데 서두가 너무 길어졌네요 죄송합니다.

이 질문에 댓글 쓰기 :

답변 2

https://github.com/gnuboard/gnuboard5/blob/master/common.php#L350

>

https://github.com/gnuboard/gnuboard5/blob/master/lib/get_data.lib.php#L4

 

 

$config['cf_theme'] 는

g5_config 테이블의

cf_theme varchar(100) NOT NULL DEFAULT '' 필드

스트링 값이 담깁니다.

 

그리고 상수정의부

https://github.com/gnuboard/gnuboard5/blob/master/common.php#L676

는 문자열 연결 연산입니다.


define('G5_THEME_URL',         G5_URL.'/'.G5_THEME_DIR.'/'.$config['cf_theme']);

 

theme.php 는 위 연산들이 모두 완료되고 난 후 호출됩니다.

저 그런데 추가로 궁금한 것이 있습니다.
테마 폴더 안에 있는 basic 파일들 경로를 보면

include_once(G5_THEME_PATH.'/head.sub.php');

이런 식으로 상수를 통해 경로를 가져오는데, 위의

define('G5_THEME_URL',        G5_URL.'/'.G5_THEME_DIR.'/'.$config['cf_theme']);
는 테마가 아닌 루트 경로에 있는 common.php를 통해 가져오지요?

그렇다면 basic이 아닌, 다른 테마를 만들게 되면 그 테마의 폴더명은 basic이 아니고
다른 이름이 되겠죠.

그럼 경로 상수는 오직 common.php에만 담겨있는데,
어떻게 각각의 테마를 구분해서 알아서 가져오게 되는것인지 궁금합니다.


admin.lib.php 라는 파일 안에

function get_theme_dir()
{
    $result_array = array();

    $dirname = G5_PATH . '/' . G5_THEME_DIR . '/';
    $handle = opendir($dirname);
    while ($file = readdir($handle)) {
        if ($file == '.' || $file == '..') {
            continue;
        }

        if (is_dir($dirname . $file)) {
            $theme_path = $dirname . $file;
            if (is_file($theme_path . '/index.php') && is_file($theme_path . '/head.php') && is_file($theme_path . '/tail.php')) {
                $result_array[] = $file;
            }
        }
    }
    closedir($handle);
    natsort($result_array);

    return $result_array;
}

이런 함수가 있습니다.

이 함수를 보시면 헤더, 인덱스, 푸터 파일이 있으면 해당 폴더명을 배열로 담게 되구요.

theme.php를 보시면


// 테마 필드 추가
if(!isset($config['cf_theme'])) {
    sql_query(" ALTER TABLE `{$g5['config_table']}`
                    ADD `cf_theme` varchar(255) NOT NULL DEFAULT '' AFTER `cf_title` ", true);
}

$theme = get_theme_dir();
if($config['cf_theme'] && in_array($config['cf_theme'], $theme))
    array_unshift($theme, $config['cf_theme']);
$theme = array_values(array_unique($theme));
$total_count = count($theme);


이런 구문이 있습니다
사실 정확한 흐름까지는 제 실력의 부재로 파악을 못하였지만 짐작하건데

if(!isset($config['cf_theme'])) {
    sql_query(" ALTER TABLE `{$g5['config_table']}`
                    ADD `cf_theme` varchar(255) NOT NULL DEFAULT '' AFTER `cf_title` ", true);
}

이 구문을 통해 db에 새로 생긴 theme들의 경로를 넣는 것 같습니다.

그래서 결국은...

경로 상수는 오직 common.php에만 담겨있는데,
어떻게 각각의 테마를 구분해서 알아서 가져오게 되는것인지 궁금합니다!!

{$g5['config_table']} 테이블의 cf_theme 필드 값에

 

'basic' 설정시

define('G5_THEME_URL',        G5_URL.'/'.G5_THEME_DIR.'/'.$config['cf_theme']); 는

...URL.../...THEME.../basic

 

'anotherTheme' 으로 설정시

define('G5_THEME_URL',        G5_URL.'/'.G5_THEME_DIR.'/'.$config['cf_theme']); 는

...URL.../...THEME.../anotherTheme

 

{$g5['config_table']} 테이블의 cf_theme 필드 값을 바꿔가며

단순하게 

define('G5_THEME_URL',        G5_URL.'/'.G5_THEME_DIR.'/'.$config['cf_theme']);

echo G5_THEME_URL;

헤보시면 이해가 가시리라 생각됩니다.

 

각각의 테마를 구분해서

라는 부분이 무슨 의미인지 모르겠습니다.

테마는 여러개 있을수 있지만 {$g5['config_table']} 테이블의 cf_theme 필드 값에 적용하기 위해

지정하는 테마는 결국 하나 인거고

문자열을 설정하면 그 값을 그냥 가져오는것 뿐입니다.

말씀해주신 내용을 이해하려고 많이 찾아봤습니다..
일단 제가 위에 theme.php 안에

// 테마 필드 추가
if(!isset($config['cf_theme'])) {
    sql_query(" ALTER TABLE `{$g5['config_table']}`
                    ADD `cf_theme` varchar(255) NOT NULL DEFAULT '' AFTER `cf_title` ", true);
}

$theme = get_theme_dir();
if($config['cf_theme'] && in_array($config['cf_theme'], $theme))
    array_unshift($theme, $config['cf_theme']); #######################  이 부분 낼 보기
$theme = array_values(array_unique($theme));
$total_count = count($theme);

이런 구문이 있고 이 구문이 sql안에 cf_theme의 경로를 삽입해주는 구문이라고 생각했는데 제가 착각하고 있었던 것 같습니다.

제가 "각각의 테마를 구분해서" 라고 말했던 것은 위에 $theme = get_theme_dir(); 이 부분이

function get_theme_dir()
{
    $result_array = array();

    $dirname = G5_PATH . '/' . G5_THEME_DIR . '/';
    $handle = opendir($dirname);
    while ($file = readdir($handle)) {
        if ($file == '.' || $file == '..') {
            continue;
        }

        if (is_dir($dirname . $file)) {
            $theme_path = $dirname . $file;
            if (is_file($theme_path . '/index.php') && is_file($theme_path . '/head.php') && is_file($theme_path . '/tail.php')) {
                $result_array[] = $file;
            }
        }
    }
    closedir($handle);
    natsort($result_array);

    return $result_array;
}

라는 함수인데, 테마들의 폴더 이름을 배열로 뱉어주는 함수인데 이 함수를 통해 db에 데이터가 드가는 줄 알았고 그래서  cf_theme라는 테이블에 여러개의 테마 폴더 이름들이 기입되는 줄 알았는데 말씀해주신 내용을 들어보니, cf_theme에는 하나의 데이터만 들어가게끔 되어있나보군요. (그게 아니라면 여러개가 들어가지만 cf_theme안에 있는 데이터 하나를 지정해주는 형식이겠죠..?)


저는 위 함수 get_theme_dir()를 통해 어찌저찌 해서

// 테마 필드 추가
if(!isset($config['cf_theme'])) {
    sql_query(" ALTER TABLE `{$g5['config_table']}`
                    ADD `cf_theme` varchar(255) NOT NULL DEFAULT '' AFTER `cf_title` ", true);
}

이 부분을 통해서 db에 테마 경로가 들어간다고 생각했는데 이 함수는 단순히 cf_theme라는 테이블이 데이터베이스에 없으면 넣어주는 구문이더군요.

그래서 딱 지금 여기까지 도달한 마지막 의문점이 있습니다...
대체 현재 테마의 경로를 cf_theme에 넣어주는 구문은 어디에 있는 것인가요?

제가 주말에 이것만 하고 있는게 아니라 답변의 텀이 굉장히 늦어 죄송스럽네요... 감사합니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 0
QA 내용 검색
  • 개별 목록 구성 제목 답변작성자조회작성일
  • 질문이 없습니다.

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT