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');}} //버퍼셋팅
?>







                                
                

                
                

 

 
 
 
 




 

<?php echo $g['browtitle']?>