Web Study/킴스큐 Rb
[킴스큐 Rb]킴스큐Rb 개발자를 위한 기초 활용노트 8 - 데이터 플로우
파노카페
2012. 9. 29. 20:48
출처: http://www.kimsq.com/?m=forum&bid=devGuide&p=3&uid=15
킴스큐Rb 뿐만 아니라 모든 프로그램들의 구조를 파악하는데 있어서 데이터의 흐름을 파악하는 것은 매우 중요합니다.
프로그램을 구동시켰을때 어떠한 순서에 따라 실행이 되는지 이해할 수 있다면 그 프로그램의 구조는 반 이상 이해했다고 해도 과언이 아닙니다.
킴스큐Rb는 index.php 와 _core 그리고 각각의 모듈들의 main.php 만 이해하면 구조파악의 7부능선은 넘은 것입니다.
그러면 다시한번 킴스큐Rb의 기본 디렉토리구조를 보겠습니다.
여기에서 index.php 에 주목하세요.
킴스큐Rb를 구동시키기 위해서는 반드시 index.php 를 거치게 됩니다.
즉, 데이터의 입력,가공,출력을 위해서는 index.php 를 호출해 주어야 하며 index.php 가 아닌 다른 경로로는 어떠한 데이터의 입출력도 불가능합니다.
index.php 파일에 대한 자세한 해석은 첨부파일을 참고하세요.
(버젼에 따라서 소스코드가 약간씩 다를 수 있습니다.)
$_tmp['v']) if (is_array($_GET[$_tmp['k']])) foreach($_GET[$_tmp['k']] as $_tmp['k1'] => $_tmp['v1']) $_GET[$_tmp['k']][$_tmp['k1']] = ${$_tmp['k']}[$_tmp['k1']] = addslashes($_tmp['v1']); else $_GET[$_tmp['k']] = ${$_tmp['k']} = addslashes($_tmp['v']); if (is_array($_POST)) foreach($_POST as $_tmp['k'] => $_tmp['v']) if (is_array($_POST[$_tmp['k']])) foreach($_POST[$_tmp['k']] as $_tmp['k1'] => $_tmp['v1']) $_POST[$_tmp['k']][$_tmp['k1']] = ${$_tmp['k']}[$_tmp['k1']] = addslashes($_tmp['v1']); else $_POST[$_tmp['k']] = ${$_tmp['k']} = addslashes($_tmp['v']); } else { if (!ini_get('register_globals')) { extract($_GET); extract($_POST); } } // _var/db.info.php 파일이 존재하면 킴스큐Rb가 설치된 상태입니다. // _var/db.info.php 는 DB접속정보를 담고 있으며 이 파일은 인스톨과정에서 자동으로 생성됩니다. if (is_file($g['path_var'].'db.info.php')) { include_once $g['path_var'].'db.info.php'; // DB접속정보 파일 include_once $g['path_var'].'table.info.php'; // DB테이블정보 파일 (인스톨과정에서 자동생성되며 모듈의 설치 및 제거시 자동갱신됩니다) include_once $g['path_core'].'function/db.mysql.func.php'; // MYSQL 관련함수 파일 include_once $g['path_core'].'function/sys.func.php'; // 킴스큐Rb 기본함수 파일 $DB_CONNECT = isConnectDb($DB); // DB연결 및 사용할DB선택 $g['mobile']= isMobileConnect($_SERVER['HTTP_USER_AGENT']); // 모바일 디바이스 확인 (모바일일 경우 android , ios , windows 7 등의 디바이스명이 대입됩니다.) $my = array(); // 회원데이터 배열생성 $my['level'] = 0; // 회원등급 0으로 셋팅(비회원일 경우 회원등급 0으로 간주) // 회원UID 세션이 존재한다면 (회원로그인 상태로 간주) if ($_SESSION['mbr_uid']) { $my = getUidData($table['s_mbrid'],$_SESSION['mbr_uid']); // 회원아이디 테이블에서 회원UID 세션값으로 데이터를 얻음 $my = array_merge(getDbData($table['s_mbrdata'],"memberuid='".$my['uid']."'",'*'),$my); //회원아이디 테이블과 회원데이터 테이블 병합 if($my['pw'] != $_SESSION['mbr_pw']) exit; // DB에 저장된 패스워드와 세션에 저장된 패스워드가 다를 경우 비정상적인 회원로그인으로 간주하여 차단함 } // 사이트코드 $r 이 요청되면 if ($r) { $_HS = getDbData($table['s_site'],"id='".$r."'",'*'); // 사이트정보를 $_HS 배열에 담습니다. $s = $_HS['uid']; // 사이트PK인 UID값을 $s 변수에 담습니다. } // 사이트UID $s 요청이 없거나 정의되어 있지 않으면 if (!$s) { // 모바일 디바이스일 경우 if ($g['mobile']) { $_HH = getDbData($table['s_mobile'],'','*'); // 모바일접속시 설정데이터를 $_HH 배열에 담습니다. if ($_HH['usemobile'] == 1) $_HS = getUidData($table['s_site'],$_HH['startsite']); // 사이트별로 모바일모드 적용으로 설정했을 경우 시작페이지를 찾아 $_HS 배열에 담습니다. // 모바일접속시 모바일전용 도메인연결로 설정했을 경우 현재접속한 도메인과 설정도메인이 다를 경우 설정도메인으로 이동시킵니다. else if($_HH['usemobile'] == 2) if($g['url_root'].'/' != $_HH['startdomain']) getLink($_HH['startdomain'],'','',''); } // 시작사이트 정의되지 않은 경우 if (!$_HS['uid']) { // 현재 접속호스트로 도메인연결 설정데이터를 확인합니다. $_HD = getDbData($table['s_domain'],"name='".str_replace('www.','',$_SERVER['HTTP_HOST'])."'",'*'); // 현재 접속호스트로 연결사이트가 있을 경우 해당사이트 데이터를 $_HS 배열에 담습니다. if ($_HD['site']) $_HS = getUidData($table['s_site'],$_HD['site']); // 현재 접속호스트로 연결사이트가 없을 경우 사이트패널에 등록된 첫번째 사이트데이터를 $_HS 배열에 담습니다. else $_HS = db_fetch_array(getDbArray($table['s_site'],'','*','gid','asc',1,1)); } $s = $_HS['uid']; // 사이트UID 를 $s 변수에 대입합니다. $r = $_HS['id']; // 사이트코드를 $r 변수에 대입합니다. } else $_HS = getUidData($table['s_site'],$s); // 사이트UID $s 가 정의되어 있다면 $s에 해당되는 사이트데이터를 $_HS 에 담습니다. include_once $g['path_var'].'language/'.$_HS['lang'].'/_sys.lang.php'; // 사이트설정 언어팩을 인클루드합니다. $_CA = array(); // $_CA 배열을 생성합니다. 이 배열의 데이터는 소속메뉴를 결정하는 역할을 합니다. $date = getVDate($_HS['timecal']); // 날짜배열 $date 를 생성합니다. $g['s'] = str_replace('/index.php','',$_SERVER['SCRIPT_NAME']); // 이 파일의 절대경로를 얻습니다. $g['r'] = $_HS['rewrite'] ? $g['s'].($_HS['usescode']?'/'.$r:'') : '.'; // rewirte , 사이트코드 사용여부에 따라 이 파일의 경로를 재정의합니다. $g['img_core'] = $g['s'].'/_core/image'; // 공용이미지의 URL $g['sys_selectlang']=$_HS['lang']; // 현재 사이트의 실제 적용언어 (실제 적용언어와 사용할 수 있는 언어는 다릅니다. 언어팩이 없는 모듈일 경우 존재하는 언어팩으로 대체함) $g['location'] = 'HOME'; // 현재위치값 정의 $g['browtitle'] = $_HS['title']; // 브라우져타이틀 정의 $g['meta_sbj'] = $_HS['name']; // 메타정보 $g['meta_tit'] = ''; // 메타정보 $g['meta_key'] = ''; // 메타정보 $g['meta_des'] = ''; // 메타정보 $g['sys_module'] = 'home'; // 사용자페이지를 구성하는 시스템 모듈은 home(홈페이지)모듈 입니다. $g['sys_action'] = $a && !$c ? true : false; // $a(액션) 변수가 정의되거나 유입되었고 $c(메뉴코드) 변수가 정의되지도 유입되지도 않았다면 true 아니면 false $m = $m ? $m : $g['sys_module']; // $m(모듈코드) 변수가 정의되거나 유입되었으면 그 변수를 아니면 시스템모듈인 home 을 대입합니다. $_m = $m; // $_m 변수에 최초 정의되거나 유입된 $m 변수를 담습니다. $_mod = $mod; // $_mod 변수에 최초 정의되거나 유입된 $mod(페이지코드) 변수를 담습니다. // $_m , $_mod 를 정의하는 이유는 메뉴에 모듈을 연결할 경우 $m 과 $mod 가 overwrite 되기 때문에 최초 호출값을 기억하기 위함입니다. // 액션요청도 없고 $system 변수가 정의되지도 유입되지도 않았다면 if (!$g['sys_action'] && !$system) { // $c(메뉴코드) 가 정의되거나 유입되면 if ($c) { $_CA = explode('/',$c); // $c 를 / 으로 분리해서 $_CA 배열에 담습니다. $_tmp['count'] = count($_CA); // $c 의 depth를 구합니다.(몇단계 메뉴인가..) $_tmp['id'] = $_CA[$_tmp['count']-1]; // 메뉴단계중 실제 요청된 메뉴를 구합니다.(c=kimsq/rb 일 경우 실제 요청된 메뉴는 rb임) $_HM = getDbData($table['s_menu'],"id='".$_tmp['id']."' and site=".$s,'*'); // 현재사이트에서 요청된 메뉴데이터를 $_HM 에 담습니다. if ($_HM['reject']&&!$my['admin']) getLink('','',$lang['sys']['none_page'],'-1'); // 메뉴차단상태이면서 관리자권한이 없으면 차단메세지를 출력합니다. if ($_HM['site']!=$_HS['uid']) getLink('','',$lang['sys']['none_menu'],'-1'); // 메뉴의 소속사이트와 현재사이트가 일치하지 않으면 없는메뉴라는 메세지를 출력합니다. $_HM['incfile'] = $g['path_page'].'menu/'.sprintf('%05d',$_HM['uid']); // 메뉴용 헤더/풋터파일을 5자리 숫자로 정의합니다.(메뉴UID가 56일 경우 00056) // 현재위치를 얻기위해 메뉴단계별 메뉴명 및 링크를 구합니다. for ($_i = 0; $_i < $_tmp['count']-1; $_i++) { $_tmp['location'] = getDbData($table['s_menu'],"id='".$_CA[$_i]."'",'*'); $_tmp['split_id'].= ($_i?'/':'').$_tmp['location']['id']; $g['location'] .= ' > '.$_tmp['location']['name'].''; } $g['location'] .= ' > '.$_HM['name'].''; // 현재위치를 구합니다. if(!$_HS['titlefix']) $g['browtitle'] = $_HS['title'].' - '.$_HM['name']; // 타이틀고정으로 설정하지 않았다면 메뉴별 타이틀을 붙여줍니다. // 메뉴형식이 모듈연결방식이라면 if($_HM['menutype']==1) { if ($_HM['redirect']) getLink($_HM['joint'],'','',''); // 리다이렉트설정이 되어있다면 설정된 URL로 이동시킵니다. $_tmpexp = explode('?',$_HM['joint']); // 모듈연결주소를 ? 으로 분리하여 $_tmpexp 배열에 담습니다. // 모듈연결주소중 ? 다음에 문자열이 있다면 if ($_tmpexp[1]) { // ? 다음의 문자열을 & 으로 분리하여 $_tmparr 배열에 담습니다. $_tmparr = explode('&',$_tmpexp[1]); // $_tmparr 배열의 인자를 $_tmpval 에 담습니다. foreach($_tmparr as $_tmpval) { if(!$_tmpval) continue; // $_tmpval 이 없으면 점프합니다. $_tmparr = explode('=',$_tmpval); // $_tmpval 을 = 으로 분리하여 다시 $_tmparr 배열에 담습니다. ${$_tmparr[0]} = $_tmparr[1]; // = 으로 분리된 데이터중 앞인자를 변수로 뒤인자를 값으로 정의합니다. } } } } // $_HM['joint'] 가 /rb/?m=bbs&bid=freeboard 였다면 // $m = 'bbs' , $bid = 'freeboard' 변수가 생성됩니다. // 메뉴코드가 정의되지도 유입되지도 않았고 모듈코드가 home 이라면 if (!$c && $m == $g['sys_module']) { // 페이지코드가 정의되지도 유입되지도 않았다면 접속디바이스에 따라 시작페이지를 구해 $_HP 배열에 담습니다. if (!$mod) $_HP = getUidData($table['s_page'],$g['mobile']&&$_SESSION['pcmode']!='Y'?($_HS['m_startpage']?$_HS['m_startpage']:$_HS['startpage']):$_HS['startpage']); // 페이지코드에 대한 요청이 있다면 페이지코드에 해당되는 페이지의 데이터를 $_HP 에 담습니다. else $_HP = getDbData($table['s_page'],"id='".$mod."'",'*'); if($_HP['uid']) $_HM['layout'] = $_HP['layout']; // 페이지데이터가 존재하면 메뉴의 레이아웃을 페이지의 레이아웃으로 대체합니다. // 메뉴에서 모듈연결에 의해 overwrite 되지 않은 페이지코드가 요청된 경우라면 if($_mod) { $g['location'] .= ' > '.$_HP['name'].''; // 현재위치 정의 if(!$_HS['titlefix']) $g['browtitle'] = $_HS['title'].' - '.$_HP['name']; // 브라우져 타이틀 정의 } // 페이지형식이 모듈연결이라면 if ($_HP['pagetype']==1) { $_HM['layout'] = $_HP['layout']; // 메뉴레이아웃을 페이지레이아웃으로 대체 $_tmpexp = explode('?',$_HP['joint']); // 모모듈연결주소를 ? 으로 분리하여 $_tmpexp 배열에 담습니다. if ($_tmpexp[1]) { // ? 다음의 문자열을 & 으로 분리하여 $_tmparr 배열에 담습니다. $_tmparr = explode('&',$_tmpexp[1]); // $_tmparr 배열의 인자를 $_tmpval 에 담습니다. foreach($_tmparr as $_tmpval) { if(!$_tmpval) continue; // $_tmpval 이 없으면 점프합니다. $_tmparr = explode('=',$_tmpval); // $_tmpval 을 = 으로 분리하여 다시 $_tmparr 배열에 담습니다. ${$_tmparr[0]} = $_tmparr[1]; // = 으로 분리된 데이터중 앞인자를 변수로 뒤인자를 값으로 정의합니다. } if ($_m == $g['sys_module']) $_mod = ''; // overwrite 되지 앟은 초기 모듈코드가 home 이라면 $_mod 는 지웁니다. if ($m != $g['sys_module']) $mod = $_mod; // overwrite 된 모듈코드가 home 이 아니라면 overwrite된 $mod 에 overwrite 되지 않은 $_mod 를 대입합니다. // $mod 가 모듈에서 사용되는 변수일 수 있기 때문에 overwrite 에 대한 재정의가 필요함 } } } } // $_HP['joint'] 가 /rb/?m=bbs&bid=freeboard 였다면 // $m = 'bbs' , $bid = 'freeboard' 변수가 생성됩니다. } // _var/db.info.php 파일이 존재하지 않으면(인스톨되지 않았다면) else { $m = 'admin'; // 모듈을 admin(시스템모듈) 으로 정의합니다. - admin모듈에는 인스톨러가 포함되어 있음 $mod = 'install'; // 페이지를 install로 정의합니다. // 인스톨이 되지 않은 킴스큐Rb를 호출했다면 인스톨러가 출력됩니다. } // $keyword(검색어) 가 정의되거나 유입되었다면 if ($keyword) { $keyword = trim($keyword); // 공백을 지웁니다. $_keyword= stripslashes(htmlspecialchars($keyword)); // html코드를 없애고 \ 을 제거합니다. } if (!$p) $p = 1; // $p(페이지넘버)가 정의되지 않았다면 1페이지로 정의합니다. if (!is_dir($g['path_module'].$m)) $m = $g['sys_module']; //모듈경로에 요청된 모듈이 없으면 home 모듈로 셋팅합니다. if (!is_dir($g['path_module'].$m.'/lang.'.$_HS['lang'])) $_HS['lang']=$g['sys_lang']; //모듈에 현재사이트에서 설정된 언어팩이 없다면 기본언어팩(korean)으로 셋팅합니다. $g['dir_module'] = $g['path_module'].$m.'/'; // 요청된 모듈의 경로 $g['url_module'] = $g['s'].'/modules/'.$m; // 요청된 모듈의 url $g['img_module'] = $g['url_module'].'/image'; // 요청된 모듈의 이미지폴더 uirl $g['add_module'] = $g['dir_module'].'_main.php'; // 요청된 모듈의 추가php 경로(모듈폴더에 _main.php 로 있어야 함) if (is_file($g['add_module'])) include_once $g['add_module']; // 요청된 모듈의 추가php 가 존재하면 인클루드합니다. // $a(액션) 가 정의되거나 유입되었다면 (액션의 요청) if ($a) { // 모듈내에 액션폴더를 찾습니다. // 언어팩의 존재여부에 따라 언어팩이 있으면 언어팩내의 액션에 그렇지 않을 경우 기본액션에 접근합니다. // 애션폴더내에 서브폴더가 존재할 경우 서브폴더의 액션파일로 접근할 수도 있도록 합니다. $g['act_module1'] = $g['dir_module'].'lang.'.$_HS['lang'].'/action/'.(strpos($a,'/')?str_replace('/','/a.',$a):'a.'.$a).'.php'; $g['act_module2'] = $g['dir_module'].'action/a.'.$a.'.php'; if (is_file($g['act_module1'])) include_once $g['act_module1']; if (is_file($g['act_module2'])) include_once $g['act_module2']; } // 현재사이트가 정상서비스 상태가 아니라면 if ($_HS['open'] > 1) { // 관리자오픈,정지상태에 따라 이동시킬 페이지 및 처리방식을 정의합니다. if ($m != 'admin' && (($_HS['open']==2&&!$my['admin'])||$_HS['open']==3)) $iframe = 'Y'; if ($_HS['open'] == 2) if (!$my['admin'] && $m != 'admin' && $system != 'guide.stopsite') getLink($g['s'].'/?r='.$r.'&system=guide.stopsite','','',''); if ($_HS['open'] == 3) if ($m != 'admin' && $system != 'guide.stopsite') getLink($g['s'].'/?r='.$r.'&system=guide.stopsite','','',''); } // $_SERVER['PATH_INFO'] 가 유입되면 트랙백데이터를 수집합니다. if ($_SERVER['PATH_INFO']) include_once $g['path_module'].'trackback/action/a.rcv_trackback.php'; // 사이트UID 가 정의되지 않았고 요청된 모듈이 admin 도 아니면 생성된 사이트가 없는 것이므로 사이트생성 페이지로 이동시킵니다. if (!$s && $m != 'admin') getLink($g['s'].'/?r='.$r.'&m=admin&module='.$g['sys_module'].'&nosite=Y','','',''); // 모듈접속파일(modulues/모듈폴더/main.php) 을 불러들입니다. include_once $g['dir_module'].'main.php'; // 요청모듈이 admin 이거나 $iframe 이 Y 로 요청되었다면 if ($m=='admin' || $iframe=='Y') { $_HM['layout'] = '_blank/main.php'; // 레이아웃을 히든레이아웃으로 대체 $d['layout']['php'] = $_HM['layout']; // $d 배열에 레이아웃정보 대입 } else { // 레이아웃정의 if (!$g['mobile']||$_SESSION['pcmode']=='Y') $d['layout']['php'] = $prelayout ? $prelayout.'.php' : ($_HM['layout'] ? $_HM['layout'] : $_HS['layout']); else $d['layout']['php'] = $_HS['m_layout'] ? $_HS['m_layout'] : $_HS['layout']; } $d['layout']['dir'] = dirname($d['layout']['php']); // 레이아웃 폴더 $d['layout']['str'] = str_replace('.php','',$d['layout']['php']); // 레이아웃 파일에서 .php 제거 $d['layout']['pwd'] = $g['path_layout'].$d['layout']['str']; // 레이아웃파일 경로에서 .php 제거 $d['layout']['var'] = $g['path_layout'].$d['layout']['dir'].'/_main.php'; // 레이아웃 변수파일 $g['url_layout'] = $g['s'].'/layouts/'.$d['layout']['dir']; //레이아웃 폴더의 url $g['img_layout'] = $g['url_layout'].'/image'; // 레이아웃 폴더내의 이미지폴더 url if (is_file($d['layout']['var'])) include_once $d['layout']['var']; // 레이아웃 전용 변수파일이 존재하면 인클루드 define('__KIMS_CONTENT__',$g['path_core'].'engine/content.engine.php'); // 콘텐츠엔진 상수정의 define('__KIMS_CONTAINER_HEAD__',$g['path_core'].'engine/container_head.engine.php'); // 콘텐츠 헤더엔진 상수정의 define('__KIMS_CONTAINER_FOOT__',$g['path_core'].'engine/container_foot.engine.php'); // 콘텐츠 풋터엔진 상수정의 if ($m!='admin'){include_once $g['path_var'].'sitephp/'.$_HS['uid'].'.php';if($_HS['buffer']){$g['buffer']=true;ob_start('ob_gzhandler');}} //버퍼셋팅 ?>