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

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

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에 넣어주는 구문은 어디에 있는 것인가요?

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

답변을 작성하시기 전에 로그인 해주세요.
전체 13
QA 내용 검색

회원로그인

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