그누보드가 현재 테마의 경로를 어떻게 지정해주는지 알고 싶습니다.
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개 / 댓글 3개
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 는 위 연산들이 모두 완료되고 난 후 호출됩니다.
답변에 대한 댓글 2개
테마 폴더 안에 있는 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 필드 값에 적용하기 위해
지정하는 테마는 결국 하나 인거고
문자열을 설정하면 그 값을 그냥 가져오는것 뿐입니다.
답변에 대한 댓글 1개
일단 제가 위에 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에 넣어주는 구문은 어디에 있는 것인가요?
제가 주말에 이것만 하고 있는게 아니라 답변의 텀이 굉장히 늦어 죄송스럽네요... 감사합니다.
답변을 작성하려면 로그인이 필요합니다.