head	1.96;
access;
symbols;
locks; strict;
comment	@# @;


1.96
date	2007.03.19.18.07.12;	author thruthesky;	state Exp;
branches;
next	1.95;

1.95
date	2007.03.10.06.58.59;	author thruthesky;	state Exp;
branches;
next	1.94;

1.94
date	2007.03.09.10.42.54;	author thruthesky;	state Exp;
branches;
next	1.93;

1.93
date	2007.03.06.14.35.15;	author thruthesky;	state Exp;
branches;
next	1.92;

1.92
date	2007.03.06.07.15.42;	author thruthesky;	state Exp;
branches;
next	1.91;

1.91
date	2007.03.06.06.54.16;	author thruthesky;	state Exp;
branches;
next	1.90;

1.90
date	2007.03.05.16.55.27;	author thruthesky;	state Exp;
branches;
next	1.89;

1.89
date	2007.02.28.11.00.41;	author thruthesky;	state Exp;
branches;
next	1.88;

1.88
date	2007.02.28.05.24.22;	author thruthesky;	state Exp;
branches;
next	1.87;

1.87
date	2007.02.27.15.26.31;	author thruthesky;	state Exp;
branches;
next	1.86;

1.86
date	2007.02.27.04.49.00;	author thruthesky;	state Exp;
branches;
next	1.85;

1.85
date	2007.02.24.14.32.54;	author thruthesky;	state Exp;
branches;
next	1.84;

1.84
date	2007.02.23.09.31.07;	author thruthesky;	state Exp;
branches;
next	1.83;

1.83
date	2007.02.22.11.35.47;	author thruthesky;	state Exp;
branches;
next	1.82;

1.82
date	2007.02.22.10.16.19;	author thruthesky;	state Exp;
branches;
next	1.81;

1.81
date	2007.02.22.09.48.20;	author thruthesky;	state Exp;
branches;
next	1.80;

1.80
date	2007.02.22.07.33.46;	author thruthesky;	state Exp;
branches;
next	1.79;

1.79
date	2007.02.21.08.22.46;	author thruthesky;	state Exp;
branches;
next	1.78;

1.78
date	2007.02.21.06.22.10;	author thruthesky;	state Exp;
branches;
next	1.77;

1.77
date	2007.02.20.14.16.46;	author thruthesky;	state Exp;
branches;
next	1.76;

1.76
date	2007.02.17.11.07.09;	author thruthesky;	state Exp;
branches;
next	1.75;

1.75
date	2007.02.16.17.38.39;	author thruthesky;	state Exp;
branches;
next	1.74;

1.74
date	2007.02.16.17.32.19;	author thruthesky;	state Exp;
branches;
next	1.73;

1.73
date	2007.02.16.07.27.57;	author thruthesky;	state Exp;
branches;
next	1.72;

1.72
date	2007.02.15.14.38.57;	author thruthesky;	state Exp;
branches;
next	1.71;

1.71
date	2007.02.15.14.33.38;	author thruthesky;	state Exp;
branches;
next	1.70;

1.70
date	2007.02.15.11.13.11;	author thruthesky;	state Exp;
branches;
next	1.69;

1.69
date	2007.02.15.10.46.15;	author thruthesky;	state Exp;
branches;
next	1.68;

1.68
date	2007.02.13.12.47.04;	author thruthesky;	state Exp;
branches;
next	1.67;

1.67
date	2007.02.13.12.41.22;	author thruthesky;	state Exp;
branches;
next	1.66;

1.66
date	2007.02.13.10.57.33;	author thruthesky;	state Exp;
branches;
next	1.65;

1.65
date	2007.02.12.18.38.07;	author thruthesky;	state Exp;
branches;
next	1.64;

1.64
date	2007.02.11.18.55.02;	author thruthesky;	state Exp;
branches;
next	1.63;

1.63
date	2007.02.10.17.00.14;	author thruthesky;	state Exp;
branches;
next	1.62;

1.62
date	2007.02.10.15.57.02;	author thruthesky;	state Exp;
branches;
next	1.61;

1.61
date	2007.02.10.14.51.22;	author thruthesky;	state Exp;
branches;
next	1.60;

1.60
date	2007.02.10.12.03.29;	author thruthesky;	state Exp;
branches;
next	1.59;

1.59
date	2007.02.10.05.58.42;	author thruthesky;	state Exp;
branches;
next	1.58;

1.58
date	2007.02.09.14.22.53;	author thruthesky;	state Exp;
branches;
next	1.57;

1.57
date	2007.02.09.12.46.27;	author thruthesky;	state Exp;
branches;
next	1.56;

1.56
date	2007.02.09.11.28.34;	author thruthesky;	state Exp;
branches;
next	1.55;

1.55
date	2007.02.09.10.11.44;	author thruthesky;	state Exp;
branches;
next	1.54;

1.54
date	2007.02.08.16.21.38;	author thruthesky;	state Exp;
branches;
next	1.53;

1.53
date	2007.02.08.14.52.29;	author thruthesky;	state Exp;
branches;
next	1.52;

1.52
date	2007.02.08.09.43.29;	author thruthesky;	state Exp;
branches;
next	1.51;

1.51
date	2007.02.02.04.33.58;	author thruthesky;	state Exp;
branches;
next	1.50;

1.50
date	2007.02.01.15.28.51;	author thruthesky;	state Exp;
branches;
next	1.49;

1.49
date	2007.01.31.17.33.00;	author thruthesky;	state Exp;
branches;
next	1.48;

1.48
date	2007.01.31.07.18.34;	author thruthesky;	state Exp;
branches;
next	1.47;

1.47
date	2007.01.31.07.02.56;	author thruthesky;	state Exp;
branches;
next	1.46;

1.46
date	2007.01.31.06.26.57;	author thruthesky;	state Exp;
branches;
next	1.45;

1.45
date	2007.01.31.03.49.22;	author thruthesky;	state Exp;
branches;
next	1.44;

1.44
date	2007.01.30.09.52.46;	author thruthesky;	state Exp;
branches;
next	1.43;

1.43
date	2007.01.30.09.16.01;	author thruthesky;	state Exp;
branches;
next	1.42;

1.42
date	2007.01.30.08.45.50;	author thruthesky;	state Exp;
branches;
next	1.41;

1.41
date	2007.01.28.14.44.47;	author thruthesky;	state Exp;
branches;
next	1.40;

1.40
date	2007.01.28.12.47.03;	author thruthesky;	state Exp;
branches;
next	1.39;

1.39
date	2007.01.28.12.36.00;	author thruthesky;	state Exp;
branches;
next	1.38;

1.38
date	2007.01.27.17.11.35;	author thruthesky;	state Exp;
branches;
next	1.37;

1.37
date	2007.01.27.11.40.27;	author thruthesky;	state Exp;
branches;
next	1.36;

1.36
date	2007.01.27.10.13.09;	author thruthesky;	state Exp;
branches;
next	1.35;

1.35
date	2007.01.26.12.46.29;	author thruthesky;	state Exp;
branches;
next	1.34;

1.34
date	2007.01.26.12.40.25;	author thruthesky;	state Exp;
branches;
next	1.33;

1.33
date	2007.01.26.09.49.47;	author thruthesky;	state Exp;
branches;
next	1.32;

1.32
date	2007.01.25.15.10.13;	author thruthesky;	state Exp;
branches;
next	1.31;

1.31
date	2007.01.25.09.41.08;	author thruthesky;	state Exp;
branches;
next	1.30;

1.30
date	2007.01.24.15.44.42;	author thruthesky;	state Exp;
branches;
next	1.29;

1.29
date	2007.01.24.12.55.52;	author thruthesky;	state Exp;
branches;
next	1.28;

1.28
date	2007.01.23.15.33.43;	author thruthesky;	state Exp;
branches;
next	1.27;

1.27
date	2007.01.23.14.31.01;	author thruthesky;	state Exp;
branches;
next	1.26;

1.26
date	2007.01.23.12.28.54;	author thruthesky;	state Exp;
branches;
next	1.25;

1.25
date	2007.01.22.17.27.04;	author thruthesky;	state Exp;
branches;
next	1.24;

1.24
date	2007.01.22.07.28.18;	author thruthesky;	state Exp;
branches;
next	1.23;

1.23
date	2007.01.22.07.15.58;	author thruthesky;	state Exp;
branches;
next	1.22;

1.22
date	2007.01.22.05.45.34;	author thruthesky;	state Exp;
branches;
next	1.21;

1.21
date	2007.01.21.17.33.19;	author thruthesky;	state Exp;
branches;
next	1.20;

1.20
date	2007.01.21.16.30.45;	author thruthesky;	state Exp;
branches;
next	1.19;

1.19
date	2007.01.21.14.31.13;	author thruthesky;	state Exp;
branches;
next	1.18;

1.18
date	2007.01.21.12.25.33;	author thruthesky;	state Exp;
branches;
next	1.17;

1.17
date	2007.01.20.12.19.14;	author thruthesky;	state Exp;
branches;
next	1.16;

1.16
date	2007.01.20.11.45.09;	author thruthesky;	state Exp;
branches;
next	1.15;

1.15
date	2007.01.20.09.11.41;	author thruthesky;	state Exp;
branches;
next	1.14;

1.14
date	2007.01.20.06.29.18;	author thruthesky;	state Exp;
branches;
next	1.13;

1.13
date	2007.01.19.15.12.34;	author thruthesky;	state Exp;
branches;
next	1.12;

1.12
date	2007.01.19.14.33.07;	author thruthesky;	state Exp;
branches;
next	1.11;

1.11
date	2007.01.19.11.56.48;	author thruthesky;	state Exp;
branches;
next	1.10;

1.10
date	2007.01.19.11.41.49;	author thruthesky;	state Exp;
branches;
next	1.9;

1.9
date	2007.01.19.09.02.24;	author thruthesky;	state Exp;
branches;
next	1.8;

1.8
date	2007.01.19.08.24.45;	author thruthesky;	state Exp;
branches;
next	1.7;

1.7
date	2007.01.19.07.11.17;	author thruthesky;	state Exp;
branches;
next	1.6;

1.6
date	2007.01.19.05.07.00;	author thruthesky;	state Exp;
branches;
next	1.5;

1.5
date	2007.01.18.18.42.09;	author thruthesky;	state Exp;
branches;
next	1.4;

1.4
date	2007.01.18.16.19.35;	author thruthesky;	state Exp;
branches;
next	1.3;

1.3
date	2007.01.18.15.53.27;	author thruthesky;	state Exp;
branches;
next	1.2;

1.2
date	2007.01.18.14.13.26;	author thruthesky;	state Exp;
branches;
next	1.1;

1.1
date	2007.01.18.11.03.57;	author thruthesky;	state Exp;
branches;
next	;


desc
@@


1.96
log
@v2 work
@
text
@[*] About document

This file contains all the information about building, restructering the software.
Documentating in English is now in progress.
If you need help, feel free to mail me. <thruthesky@@yahoo.co.kr>

This software is licensed under GPL. see README file or http://www.gnu.org/licenses/gpl.txt

[*] 숙지할 점
- 글은 모두 post 테이블에 저장된다. 쪽지, 메일, 쇼핑몰 상품 글, 개인 일기장, 게시물 등... 모든 글은 post 테이블에 저장되어야한다.


[*] TODO LIST
표기: bug 고쳐진 버그, fix 는 고쳐진것, mod 는 변경된 것(문제가 해결되지 않았을 수 도 있음.), doing 은 처리 중인 내용을 담고 있다.


	- 홈툴즈의 작업공간. SVN. hometools.kldp.net
		-- SVN 으로 다른 사람들과 작업을 연계하는 방법에 대해서 알아본다.
		-- kldp.net 에 아직 활성화가 되지 않았다. 다음주 화요일까지 안되면 연락을 해 본다.
	

	- 2.0 작업 시작... hometools.kldp.net 에서 작업을 한다.
		-- V2 파일에 버젼2 에서 달라지는 점을 기록해 놓았다.
		-- 스킨에 대한 내용은 스킨노트 맨 아래에 V2 에 대한 내용을 기록한다.
		-- branches 를 통해서 모듈별로 관리를 할 수 있도록한다.
	
	
	여기서부터...
	- plugin 처리를 한다.
		module/plugin 모듈은 플러그인 관리를 한다.
		스킨에 기록된 plugin() 위치를 다 찾아서 플러그인 적용 및 설정을 할 수 있다.
		
		V2 파일에 설명이있다.
		
		마무리 테스트 및 문서화를 한다.
		
		










	
	
	- 2.0 의 주요 내용
		-- 배포되는 파일에 일체의 이미지 파일이나 외부 링크(css,javascript)를 추가(첨부)하지 않는다.
			--- 스킨은 default 외에 나머지는 모두 실시간 다운로드 할 수 있도록 한다.
			--- 완전히 export 하고 SVN 으로 첨부터 새로 작업을 한다.
			--- 기본 스킨 파일은 모듈에 저장한다. (지금처럼 default 에 저장하지 않고 modules/각모듈/안에 스킨파일로 저장해서 배포한다.)
			--- 모듈도 회원관리, 게시판 2개만 기본적으로 배포한다.
		-- 쇼핑몰 관련 기능 완전 강화. 상업용으로 즉시 활용 가능하도록.
		-- 기능의 완숙.
		-- 다국어
	
====================================================

layout.html 은 아래와 같이 레이아웃을 가질 수 있다.

------------------- 아래 -------------------
<?
	list ($header,$cate_header,$cate_mode,$cate_footer,$footer,$cate_left,$cate_right) = checkLayout();
?>
<?if ( $header ) include(header_skin())?>
<?if ( $cate_header )	include(category_header_skin())?>
<table>
	<tr>
		<td>
			<?if ( $cate_left ) include(skin("$ui[cate].left"))?>
			<?include plugin("left.1")?>
			<?include plugin("left.2")?>
			<?include plugin("left.3")?>
		</td>
		<td>
			<?include plugin("body.top")?>
			
				<?if ( $cate_mode ) include(skin())?>
				
			<?include plugin("body.bottom.1")?>
			<?include plugin("body.bottom.2")?>
		</td>
		<td>	
			<?if ( $cate_right )	include(skin("$ui[cate].right"))?>
			<?include plugin("right.1")?>
			<?include plugin("right.2")?>
			<?include plugin("right.3")?>
			<?include plugin("right.4")?>
			<?include plugin("right.5")?>
			<?include plugin("right.6")?>
			<?include plugin("right.7")?>
			<?include plugin("right.8")?>
		</td>
	</tr>
</table>
<?
	if ( $cate_footer )	include(category_footer_skin());
	if ( $footer )			include(footer_skin());
?>
------------------- 끝 -------------------


이 때, plugin 부분에 해당하는 값은 관리자 모드에서 직접 변경을 할 수 있다.
즉, HTML 파일이나 소스 파일을 전혀 건드리지 않고 관리자 모드에서 클릭만으로 변경을 할 수 있다.

관리자 모드에서 plugin(" ... ") 의 내용을 직접 추출해서 HTML FORM 을 자동으로 만들어 준다.
위와 같이 레이아웃 소스만 작성하면 끝이다. 나머지는 자동으로 해결이된다.

================================================

		
	
		
	
	- 2.0.1 알파. 1.0 정식 버젼 발표 후 안정화 작업 버젼과 2.0 알파 버젼을 위한 기본 모듈 작업에 들어간다.
		-- 2.0 은 sf 에 작업공간을 만든다. kldp 서버가 자주 다운되어서 작업에 어려움이 있다.
		-- siteapi.sf.net 이 준비되어있다.
	- begin.php 와 end.php 에서 @@ 표현 사용 여부.
		@@ 표현으로 에러 메세지를 화면에 나타내지 않는다. 따라서 에러가 있는지 없는지를 판별하기가 쉽지 않다.
		
	- 모듈을 제작할 때에 스킨 파일의 저장이 쉽지 않다.
		-- 현제는 스킨 파일의 탐색이 먼저 현제 선택된 디렉토리, 그 다음 default 디렉토리이다.
		여기에 모듈 디렉토리를 추가해준다. 즉, 현제 스킨 디렉토리 -> default 디렉토리 -> 모듈 디렉토리 순으로 스킨 파일을 찾는 것이다.
	
	- UTF-8 <-> EUC-KR 상호 변환 프로그램 배포

	
	
	- euck-kr 파일 버젼이 필요한가? utf8 편집기로 편집하는것이 어려운가? 한방에 전체 파일을 euck-kr 로 변환하는 소스를 작성해야하는가?
	- bug / 답글을 볼때, 상위글의 파일이 안나타난다.
	
	- 카테고리 계층도 한눈에 보는 화면과 이동, 복사를 편하게하는 기능이 필요하다.	
	
	- 홈페이지의 회원 가입 처리를 아래와 같이 두가지 방법으로 가능하도록 한다.
		-- 점수
		--- 총 100 점을 얻어야 가입. (점수는 변경가능)
		--- 회원 등급이 점수로 사용. 1등급이 100명 인정해야 가입처리, 회원 등급 100 이면 1명 인정으로 가입 처리
		--- 99 점을 얻었는데, 50 등급 회원이 반대하면 44점이 된다.
		
		-- 초청장
		--- 특정 등급별로 초청 티겟을 나누어준다. 등급 * 2 개씩.
		--- 초청장을 받아서 가입을 할 수 있다.
	- 사용자 정보에서 사진을 올리기 위해서는 등급이 필요하다. 자신의 사진 대신에 안좋은 사진을 올릴 수 있기 때문이다.
	
	- 등급별 할 수 있는 작업 정리하여 옵션으로 지정.
		-- ex 자신의 사진 관리 등급: 10 이상. (처음 가입해서 이상한 사진 올리는 사람들이 있음)
		-- ex 다른 사람의 글에 대한 평가: 5 등급 이상. (허위로 글의 등급 평가를 막는다. 글의 평가의 결과로 글을 블라인드 시킬 수 있다.)
	
	
	- 코멘트를 기록할 때, 비밀글로 기록할 수 있도록 한다.

	- 차단 모듈 강화.
		매스포스팅은 대부분 별도의 응용 소프트웨어로 이루어지고 이 같은 경우 쿠키가 지원되지 않을 수 있다.
		-- 쿠키로 체크를 하지 않는다.
		-- module/block 에서 작업을 하도록 한다.
		



	- 국내 GPL 소스 활용. 소스가 GPL 이면, 대부분의 경우 스킨도 GPL 이 된다. GNUBoard, TT 등 많은 툴이 있따.		
	


	** 2.0 버젼에서는 영문화, 스킨 관리에 중점에 둔다.
	
	- 레이아웃 관리 기능.
		-- layout.html 에는 기본적인 레이아웃 스킨 파일이 사용가능하다.
				각 스킨 파일을 작성할 때에, 레이아웃에 맞춰서 <?include template($manager[var1])?> 과 같이 해서 변수를 무한대로 지정할 수 있도록 한다.
				관리자 모드에서 각 var1 별로 스킨 값을 지정하여 실시간으로 템플릿을 변경할 수 있도록 한다.

	- 사이트빌더 기능. 모듈로 제작을 해야한다.
		-- 스킨 자동화(사이트 빌드 개념). 메뉴의 자동 생성 및 홈페이지로 연결. 템플릿의 자동 연결.
			--- 플러그인 개념. zb5, tattertools 의 플러그인과 같은 개념.
				모듈은 하나의 완전한 기능.
				플러그인은 부분적인 기능. 템플릿과 같이 페이지에 짜투리 기능으로 동작할 수 있도록한다.
			--- 기존 스킨 파일 로드 방식은,
				---- 현제 스킨 파일 없으면, 기본 스킨 파일 로드 였다.
				---- 현제 스킨 파일 없으면, 모듈(디렉토리) 스킨 파일을 찾고 없으면 기본 스킨 파일을 찾도록 한다.
					따라서, 모듈내에 직접 스킨 파일을 저장할 수 있다.
	

	- orange 스킨 글읽기에서 글 검색시 오류.
					

	PHP 지원 버젼을 4.3 로 고수한다. 4.3 이 한계버젼이다. 실제 업체에서 사용되고 있는 버젼이다.
	
	필요한 함수는 아래와 같이 처리하거나, function_exists 함수를 통해서 직접 만든다.
  if (version_compare(phpversion(), '4.3') < 0) {
    eval('
    function clone($object) {
      return $object;
    }
    ');
  }
	- 전체 내용 영문화 작업.
	- 관리자 모드의 경우 별도의 스킨을 사용하지 않기 때문에 겉 모양의 수정이 어렵다.
		따라서 랭귀지 파일을 통해서 언어의 선택을 쉽게해야한다.
	- english 스킨 추가.
	- 문서는 전체를 영문화. 외부에 보여지는 내용은 스킨에서 처리를 한다.
	- 스킨 및 메뉴 관리 자동화 모듈 추가.
	- 포인트(경험치)의 조정과 이에 따른 레벨(등급)의 증가 관계 구현
	- 카테고리 분류를 작성하고 관련된 라이브러리를 제공
	- 업데이트 자동화 모듈 추가.
	- 글 리스트에서 카테고리 아이디가 생략되면, 자신의 권한에 맞추어 전체 글을 리스트한다. 블로그든지 뭐든지,
		-- 왜 이걸 해야하지? 카테고리 아이디가 지정되지 않으면, module/list/begin.php 를 통과해서 list.php 로 가기가 쉽지가 않다.
		왜 해야하는지 설명이 없어서 당장 필요한 이유를 못느끼겠다.
	
	


	- 장난 스킨 해부학
	- 블로그 스킨 강좌. 테터툴즈에 있는 공개 스킨을 활용.
	- 7탄~10탄까지 쇼핑몰 기능에 대한 세부 강좌





	- 본인이 작성한 글(게시물, 블로그 글 등)에 답변이 달리면, 쪽지로 수신하겠다는 옵션.
		-- 각 개인 별로 개인 정보에 기록을 할 수 있도록 한다.
		-- 글쓰기 이벤트는 드문 이벤트이다. 따라서 회원 정보를 참조해도된다.
		-- 쪽지 설정에서 선택할 수 있도록 한다.
	- 자신이 확인하지 않은 최근 쪽지 1개를 자동으로 화면에 보여주는 템플릿
	- 자신이 쓴 글 리스트, 자신이 쓴 글에 새로운 답변 리스트(새로운 글의 시간은 시스템 새글 시간과 같이한다.)
	
	- 인기 검색어 리스트 (이 값이 태그 리스트가 되게 할 수 있다.)
		통계와 관련된것이다. 사용자 통계, 글 통계, 전체 액세스 통계 등이 필요하다.
	- 파일 이어받기. 파일 받다가 끊어진경우, 이어받기 기능 제공. 참고: http://kr2.php.net/fread

	- 특정 게시판에서 게시물 1개를 최근 글이 쓰여진 것이 높은 확률적으로 가져오기.
		-- 예를 들면, 평균적으로 가장 최근 게시물이 50%, 2~4 번째의 최근 게시물이 나타날 확률 30,
				5~10 번째의 게시물이 10% 나머지 10% 해서, 확률적으로 가장 최근 글이 많이 나오고, 점점 적게나오는 함수를 작성할 것.
		-- 활용도는 공지사항의 경우 지나간 글들도 메인에 보여주어야한다. 따라서 최근글이 많이 나오도록 보여주도록 하고 오래된 글은 천천히 보여 주도록 하기 위한 것이다.		
	

[*] 나중에 시간날때 해야할 것들
	- 공지 모듈. 모달창으로 띄워서 공지 표시.
	
	- todo later) 메뉴 관리 모듈, 이와 연동할 레이아웃 모듈 이와 연동할 스킨 관리 모듈.
		스킨 자체를 관리하는 모듈.
		새로운 모듈을 추가할 때, 따로 스킨 파일을 만질 필요 없이 클릭만으로 그 기능의 사용이 가능하게
		하려면, 스킨 구조를 담당할 전용 모듈이 있어야한다.
		스킨에 레이어 구조를 하고, 기능이 추가되면 자동으로 메뉴가 만들어지게하고,
		클릭시 그 기능이 이용가능한 자동 관리 모듈이 필요하다.
	- 네이버 카페 게시판 리스트를 하면, 웹진형, 앨범형, 블로그형 등 하나의 글 영역의 정보들을 다양하게 표현할 수 있다.
		장난은 애초부터 이것을 염두에 두고 설계되었다. 이것은 단순히 추가 모듈에서 표현만 다르게하면된다.
	- 실시간 접속자 정보.
	- todo later 문서화) 스킨 디자인에서 사용가능한 모든 것을 보여준다. 예를 들면 index.html 을 완전히 갈아 엎거나
		스킨 구조를 완전히 무시하고, 홈 디렉토리에 HTML 파일을 직접 올리고 디자인하는 것에 대해서도 가르쳐준다.
	- todo later) 업데이트 모듈. 업데이트 모듈 항목 참조. 새로운 업데이트 정보가 있는지 알아서 관리자 메인 화면으로 송출
	- todo later) 백업 모듈. 다음, 백업해야할 시간이 얼마나 남았는지 관리자 메인 화면으로 송출
	- todo later) 생일 축하 모듈, 답변 글 모듈(게시판이나 기타 글에 답변글 달기 모듈), 블로그 모듈,
		갤러리 모듈, 쇼핑몰 모듈, 회원 포인트(등급,레벨) 자동 증/감 모듈, 게시물 신고 모듈,
		파일 업로드 모듈(게시판이나 기타 파일 업로드 기능이 없다), 회원 가입 모듈 아이디 중복 체크, 메일 중복, 별명 중복, 주민번호 체크 등이 있는 모듈이 필요하다.
	- 문서 인덱싱( Full Text Index 기법 활용)의 중요성이 필요하다. 당장 필요할까.
		개인 사이트에 무슨 인덱싱이 필요할까... 만은, ...
		잡지모듈, 신문모듈(잡지와 신문 형식으로 글을 리스트하는 모듈)
	- FTP 모듈 (파일 퍼미션이 맞지 않는 일이 많이 생길 것이다)
	- 캐슁 모듈 ( 스킨 페이지에서 직접 사용이 가능한 캐슁 모듈 )
	- 컨버팅 모듈, gnu4, zb4, zb5, 다음, 네이버 카페, 테터툴즈, 각종 블로그 업체 글 컨버팅
	- 로그 모듈 작성.
		-- 관리자 모드에서 옵션 처리. startup.php 나 endup.php 로 구현하는 것이 가장 이상적이다.
		-- 로그 데이터를 DB 에 보관하면 사용하기가 편리, 파일에 보관하면 압축하기가 편리.
	- HTML 내용을 웹 브라우저로 압축 전송 모듈
	- todo later) Site Open API 클라이언트. 소켓 접속을 하므로 시간이 걸릴수 있다. 따라서 iframe 처리를 한다.
	- todo later) 트랙백, RSS 2.0 feed http://blogs.law.harvard.edu/tech/rss
	- todo later) 파일 관리 모듈. 각종 업로드된 파일 중, 최근 1년 동안 다운로드가 안되었거나,
			6개월 동안 다운로드 횟수가 2 이하일 경우 등의 옵션으로 용량만 차지하는 인기 없는 자료의 삭제 모듈
	- later) access log 파일 압축 및 통계를 볼 수 있는 외부 소스 소개
	- 메인화면에 한줄짜리 글쓰기. 예) 뭐하는 홈페이지입니까? 장난이 뭔가요? 안녕하십니까?
	- 모듈 업데이트 모듈 작성. HTTP 를 통해서 데이터를 다운로드하고, 그 다운로드된 내용을 압축 해제후, FTP 로 로컬 호스트에 접속해서 업로드를 한다. 즉, 자신의 계정과 퍼미션으로 파일을 업로드하는 것이다.
	- OpenID 플러그인. 프로토콜 구현이 생각보다 쉽지가 않다. 시간이 지나면 마땅한 API 가 나타나리라.
	- 폼메일
	- 폼메일, contact, 의견, 버그 리포팅 등의 사항을 처리할 수 있는 모듈.
		내용은 관리자의 쪽지로 저장을 하고, 메일로도 전송을 한다.

[*] 참고
	- README 파일 참고
	- 스킨노트 파일 참고
	- http://jangnans.com/etc/docs/ 참고
	- 많은 데이터베이스 종류를 지원하기 위해서는 데이터베이스 레이어가 필요하다. PEAR 의 것을 사용하면 좀 더 손쉽게 해결될 수 있다. 한 두가지 DB 를 지원하는 것이면 몰라도 수십가지의 DB 를 지원하려 한다면 어쩔 수 없이 PEAR 를 써야한다. 따라서 차후 다른 종류의 데이터베이스 지원(포팅)이 필요한 경우에는 PEAR 의 사용을 심각하게 고려를 한다.
	- todo later) 검색 모듈 추가. 검색 모듈 항목 참조


[*] 코딩 규칙 (소스 코딩시 지켜야할 것 들)

새로운 기능이 추가되는 것은 메이저 버젼 업데이트이다.
데이터베이스가 변경이 되는 경우는 마이너 버젼 업데이트이다.
버그 수정과 같이 소스만 수정되는 경우는 패치이다.



** HTTP 변수로
	- id 에는 아이디 값만 전달하고,
	- idx 에는 (카테고리나 게시물) 번호 값만 전달하도록 한다.
	
** HTTP 변수에는 사용처가 명백한 경우, idx 를 그대로 이용한다.
	그러나 애매한 경우에는 uidx, pidx, cidx 와 같이 사용자 번호, 글 번호, 카테고리 번호를 사용하도록 한다.
	
	

** begin.php 에서 전체 인증을 관리하는 경향이 있다.
	각 모드(행동)스크립트에서 직접 인증을 처리하도록 한다.
	

[*] 코딩 가이드

begin.php 에서 많은 처리를 하지 않도록 한다.
예를 들면, 권한 인증이나 mode 별로 처리해야 할 내용은 해당 스크립트에서 하도록 한다.
대신 필요한 함수 준비는 begin.php 에 넣을 수 있다.

module/mall 카테고리에서는 begin.php 를 적당히 사용한다.

end.php 에서 각종 기본 값을 처리하면 된다.



[-] 카테고리 등록

개인 메모, 블로그, 메세지(쪽지, 내부메일)의 카테고리 등록이 필요하나?
그냥 내부적으로 카테고리 타입이 정해져 있으므로, 글 영역에 글을 저장하면된다.

일단 메세지 CATE_MESSAGE 부터 카테고리 등록이 없이 처리를 해 보겠다.





[*] 설명

본 문서는 본 소프트웨어(README 파일 참고)을 개발하는데에 필요한 정보를 담고 있다.

본 소프트웨어는 Site Open API 를 지원한다.
즉, 본 소프트웨어로 홈페이지를 작성하면 나모 웹에디터나, 프론트 페이지, 드임위버 등으로 바로 글을 쓰고, 수정, 삭제를 할 수 있으며, Windows Live Writer, 장난, Zoundry 등 수 많은 위지위그 HTML 편집기와 블로그(게시물) 편집기를 그대로 사용할 수 있다. 뿐만아니라 각종 Site Open API 클라이언트를 그대로 사용할 수 있다.		

테스트 페이지에서 직접 테스트를 할 수 있다.

문제가 생겼을 경우 본 문서를 먼저 참고할 것을 권한다.


[*] 배포
아래의 SCM 에서 Anonymous 로 checkout 또는 릴리스해서 사용한다.
http://kldp.net/scm/?group_id=986

[*] 개발 상황
홈페이지 http://thruthesky.webzero.co.kr/etc/jangnan/
CVS http://kldp.net/plugins/scmcvs/cvsweb.php/jangnan/?cvsroot=siteapi
문서 http://thruthesky.webzero.co.kr/etc/jangnan/docs/hometools/

[*] 설치

** 조건 PHP 버젼 4.2.0 이상 필요. ( 2002 년 4월 22일 발표됨, 파일 업로드시 $_FILES['userfile']['error'] 의 값이 PHP 버젼 4.2.0 이상 부터 적용이된다.) (4.3 버젼 부터 debug_backtrace 가 지원된다. 안타깝지만,... 2007 년 후반부터는 debug_backtrace 를 사용할 수 있도록 PHP 버젼을 4.3 부터 되도록 한다.)
4.2.0 부터는 perg 함수군이 기본적으로 enable 되어서 사용이 가능하다.
** 조건 MySQL 버젼 설치





1. 웹브라우저로 온라인 설치 (설치 프로그램이 필요한 소스를 다운로드 함)
2. 웹브라우저로 직접 설치 (필요한 구성물을 모두 웹 서버에 저장 시킨 후 설치)

- 모든 권한은 웹에서 액세스가 가능해야한다. 그래야 웹에서 소스를 직접 업그레이드하고 모듈을 다운로드 설치 할 수 있다.
이렇게 하기 위해서는 먼저 nobody 로 전체 설치를 한다. 이 때, 설치를 할 때에 umask() 를 이용하거나 chmod 를 이용해서 파일 권한을 707 로 변경을 한다.
사용자에 의해서 변경이 된 파일은 퍼미션이 달라질 수 있다. 이때에는 설치를 주욱 해보고 에러나는 부분을 알려준다.
사용자가 직접 파일을 변경할 수준이면 나머지도 혼자서 왠만큼 처리가 가능하다.
대부분의 경우 웹에서 온라인 설치를 해도 된다.


설치는 원격으로 이루어진다.

install.php 가 담당을 한다. zlib 가 사용가능하면, 바로 zlib 로 다운로드 하고, 아니면, 개개의 파일로 다운로드 해서 설치한다.

처음 install.php 파일 하나만 웹서버의 설치할 디렉토리에 올리고, 그 디렉토리 퍼미션을 웹에서 쓰기 액세스 가능하게 한다. 웹브라우저로 install.php 에 접속을 하면 나머지는 자동이다.

먼저 퍼미션이 올바른지, 그리고 데이터베이스 접근이 가능하지 테스트를 한다.

[-] 설치 모듈

./module/install/check.php 는 현제 설치가 올바르게 되었는지 검사를 한다.
설치가 올바르지 않다면, 자동으로 설치 페이로 이동을 해야한다.


[*] 업데이트

배포를 할 때, 업데이트 스크립트는 ./etc/install/update.php 이다.

데이터베이스나 파일의 구조가 변경이 된 경우와 같이 스크립트의 복사만으로 업데이트가 힘든 경우 이 스크립트를 웹 상에서 실행하면 되도록 한다.

물론, 변경 사항이 많은 경우에는 데이터를 백업 받고 완전히 새로 설치해야할 것이다.










[*] 변경
	디렉토리 구조가 변경이 되었다.
	카테고리와 모듈의 개념이 모호해서 cate 디렉토리를 module 디렉토리로 변경을 했다.




[*] 시스템 설계

기본 골격을 이루는 디렉토리 구조나 스킨 구조, 데이터베이스 구조, 라이브러리 파일 들을 제외하고는 모두 모듈로 구성이 되어 있다.
모듈은 플러그인이나 애드온과 같이 기존 시스템에 새로운 기능을 추가한다고 보면된다.

사실 본 시스템은 처음 시작 버젼 부터 많은 모듈로 구성이 되어있다.
시스템의 관리자 기능 자체가 모듈로 구성이 되어 있으며, 시스템 환결 설정, 사용자(회원)가입, 메모장 등 모든 기능이 모듈로 추가되어있다.

모듈별 관련 문서를 통해서 쉽게 새로운 모듈을 작성할 수 있다.

** 단순해야한다.
괜히 생각나는데로 이런 저런 기능을 막 만들어서는 안된다. 최대한 단순함을 유지해야한다.







[*] 디렉토리 구조
./lib							라이브러리가 보관된다.
./html						각종 짜투리 HTML 파일들이 보관된다. 시스템에서 직접 사용되지 않는 HTML 파일들을 보관하는 임시 공간으로 사용될 수 있다.
./module						시스템(프로그램) 기능(모듈)들이 저장된다. 게시판, 회원관리 등..
	모듈은 플러그인의 개념으로도 해석이 될 수도 있으며 애드온과 같은 방식이라고 이해를 해도 된다. module 디렉토리 아래에는 정보를 영역별로 관리하는 디렉토리가 존재한다. '정보의 영역'을 구분하는 명칭으로 '카테고리 스크립트'라고 생각을 할 수 있다.

./module/admin			관리자 전용 소스 스크립트 보관소
./module/bbs				게시물 정보 영역(케테고리) 관리 소스 스크립트 보관소
./module/category		카테고리 자체를 관리하는 소스 스크립트 보관소
./module/user				회원 정보 영역 관리 스크립트 보관소
./module/memo				개인 메모 관리 소스 스크립트 보관소


./etc							기타 각종 파일들이 보관된다.

./file						데이터 저장공간이다. 위치 변경이 가능하다.
									파일 데이터는 웹에서 직접적인 액세스를 하지 못하도록, 시스템 설정에서 다른 장소로 변경을 할 수 있다.

	./file/data/년/월/일
									시스템에서 사용하는 파일 데이터 저장공간이다. 년/월/일 별로 디렉토리를 만들어 보관을 한다. 이 디렉토리는 임의적으로 변경이 가능하다. 원하는 경우, 웹브라우저로 직접 액세스할 수 없는 공간으로 변경할 수 있다.
	./file/var			임시 데이터 공간이다. 임의적으로 수정/삭제가 되는 파일 보관함이다.
									이 디렉토리내의 정보는 임의 적으로 삭제 해 버려도 된다.
									또 가만히 놔 둬도 언제 삭제될지 모르는 파일들이 저장되는 공간이다.
	./file/log

./skin						스킨 디렉토리다. 이 디렉토리에 스킨 이름 별로 디렉토리가 만들어진다.
									스킨노트 파일을 참고한다.

./utility					시스템에서 사용하는 유티리티 프로그램(소스, 라이브러리 등)이 저장된다.
									라이브러리 디렉토리에서 사용되기 전에 미리 한번 점검을 하는 장소라 생각하면된다.
	./utility/xmlrpc	이 디렉토리에는 XML-RPC 관련 소스 스크립트가 있다. XML-RPC 를 해야한다면 이 소스 스크립트를 사용하면된다.

./src							각종 소스 스크립트가 보관된다. 그러나 시스템에 직접 사용되지 않는 파일들이다.
									즉, 없어도 되는 디렉토리이다. 따라서 홈페이지 운영이나 프로그램 실행에 관련한 중요한 정보는 이곳에 저장하지 않는다.
	./src/ex					예제 파일 디렉토리. 각종 예제 파일이 보관된다.
	
	



[*] 시스템 파일 들

./file/system.conf.php 시스템 설정 파일이다. php 구문 형식으로 정보가 보관이 되며, 위치 변경이 불가능하다.
이 설정 파일에 데이터 저장소를 기록하여 이를 바탕으로 시스템에서 사용하는 데이터를 따로 보관할 수 있다.





./file/log 로그 디렉토리 변경을 위해서는 환경 설정의 값을 수정한다.
만약 환결 설정에서 수정이 안된다면, default.php 의 log_repository 를 수정하면된다.
./file/log						각종 실행(로그) 정보를 보관하는 디렉토리이다.
./file/log/install		설치 정보를 기록한다.

./file/var 임시 공간이다. 수정을 위해서는 환경 설정이나 defualt.php  의 tmp_repository 를 수정한다.
예를 들면, 백업을 할 때, 이 곳에 임시 파일을 생성하고, 압축하고, 전송한 뒤에 삭제가 된다.


./file/data , ./file/log , ./file/var 와 같이 각 디렉토리별로 개별적인 위치변경을 원한다면 default.php 내에 있는 변수의 경로 지정 값을 변경해야한다.

시스템 설정에서는 ./file 디렉토리의 위치를 변경할 수 있다.




./etc/install/sql					설치 관련 SQL 파일이 보관된다.
./etc/install/sql/default_data.sql			처음 설치를 할 때 사용되는 파일로서 기본 데이터 몇개를 가지고 있다.
./etc/install/update.php	업그레이드시, 소스 파일 덮어쓰기로만 해결이 되지 않고, 시스템 구조(파일,DB 구조 등)가 바뀌었을때 등에서 자동으로 업그레이드하게 하는 소스 파일이다.






[-] 시스템 파일 구조

시스템 파일은 대부분 다음의 형식(구조)를 이룬다.



----------------------------- 파일 -----------------------------
abc = this is the value of abc
def = ya, huh? later...
xyz = Hm...
----------------------------- 끝

위와 같은 구조를 가진 (파일) 형식을 설정 형식이라고 한다.

----------------------------- 파일 -----------------------------
<?php
$abc = "this is the value of abc";
$def = "ya, huh? later...";
$xyz = "Hm...";
?>
----------------------------- 끝

위와 같은 구조를 가진 (파일) 형식을 PHP 설정 형식이라고 한다.


----------------------------- 파일 -----------------------------
abc this is the value of abc
abc this is the second value of abc
def ya, huh? later...
xyz Hm...
----------------------------- 끝

위와 같이 중복 이름을 허용하는 설정 형식을 배열 형식이라고한다.


이러한 시스템 파일 구조와 관련된 함수가 준비되어있다. 이러한 파일 형식을 다루기 위해서 일일히 코딩을 할 필요가 없다.








[*] 데이터베이스 설계


가장 간단한 원리로 출발을 한다. 나중에 정규화를 하는 경우가 있더라도, 최소한의 구조를 이룬다.

최소 구조란,
예를 들면, 한 게시판의 게시물이 총 몇개가 있는지 게시판 설정 영역에 보관을 하지 않는다.
게시판의 게시물을 일일히 세어보면 알 수 있는 걸 굳이 게시판 설정에 기록을 하지 않는다는 것이다.
특정 게시판의 게시물의 총 수를 세어야할 일은 빈번하다. 빈번 할 것이다. 충분히 그럴 것이다.
그래서 게시판 설정에 게시물의 수를 미리 기록해 놓으면 그 수를 구하고자 할 때, 별 다른 쿼리 시간을 가질 필요 없이 간단하게 해결이 된다. 그러나 하나의 게시물(게시물의 수)이 갱신될때 총 게시물의 수를 유지하는 비용이 만만치 않다. 게시물이 하나 더해 질 때, 현제 게시물 수 + 1 하고 삭제될때 -1 하면 되지 않을까, ... 물론 그렇게 하면된다. 하지만 실수할 수가 있다. 이렇게 놓고 본다면 총 수를 구하는 것은 100% 신뢰할 결과물이고 미리 누적해서 계산해 놓은 게시물의 수를 얻는 것은 신뢰하기 힘들어지는 값이된다. 누적해서 게시물의 수를 추적(유지)하는 비용이 많이 들고, 거기다가 결과물을 신뢰할 수 없는 상황이 벌어진다면, ...




글 목록을 리스트할 때, 각 글 당 답변글이 몇개나 있는지 세는 것은 글 전체의 수를 세는 것 보다 훨씬 빈번하다. 이 같은 경우는 어렵더라도 미리 총 코멘트 수를 각 글 당 계산해 놓는 것으로 한다. 효율성과 편리성의 합의점이 필요하다.

카테고리별 총 게시물의 수를 구하는 것은 그냥 생각없이 실시간으로 구한다. 간단한 것이 견고한 것이다.

post 에 사용자의 id 와 idx 를 중복으로 기록하지 않고, 사용자의 idx 만 post.idx_user 필드 에 기록한다. 
카테고리 정보도 마찬가지로 post.idx_category 필드에 기록을 한다.





테이블 명칭은 user, category 와 같이 그것의 뜻하는 단어의 명사를 그대로 과감하게 사용했다.
xxx_user, xxx_category 와 같이 복잡하게 테이블 명칭을 다루지 않는다.



각 테이블의 idx 필드는 레코드의 고유번호이다.
category.idx 가 있고 post.idx, user.idx 등이 있다.
post.idx, post.idx_category, post.idx_user 등과 같이 post 테이블에 idx 가 여러개 있다.
post.idx_category 는 해당 레코드의 정보가 속해있는 영역(카테고리)을 말한다.
post.idx_user 는 해당 레코드 정보가 어떤 사용자(회원)에 의해서 기록되었는가를 나타낸다.

post.user_agent 는 HTTP_USER_AGENT 와 비슷하다. 글이 어디로 부터 어떻게 작성되었는지를 나타낸다.
매스-포스팅된 경우에는 mass-posting 과 같이 기록이 되어야하고, 외부 응용 프로그램의 경우 해당 소프트웨어 명칭이 기록되어야한다.
이 값이 empty 일 경우 일반적인 웹 브라우저로 글이 작성된 것을 말한다.


몇몇 테이블에 있는 etc 필드는 모듈(카테고리)개발자의 기타 내용을 보관하는 곳이다. 예를 들면 모듈 버젼을 기록할 수 있다.


** category.state 필드가 category.r 로 변경이 되었으며 사용자 등급과 동일한 개념으로 동작한다.
** 마찬가지로 user.state 가 user.r 로 변경이 되었다.


category.r 필드는 해덩 정보 영역의 읽기에 대한 접근 범위를 표시한다.
0 이면 public, 30001 이면 private, 30000 이면 계정 관리자 전용 글 읽기 등이 이다.
category.r 은 글 영역 단위로 접근 범위를 제한하며 post.r 은 글 정보 하나당 접근 범위를 제한한다.
자세한 것은 사용자 등급 정보를 참고하기 바라다.


category.w 는 해당 영역의 정보 작성(수정,삭제)에 대한 접근 범위를 결정한다. 범위는 사용자 권한과 동일 하다.





category.type 필드는 정보 영역의 타입을 나타낸다.

정보의 분류는 아주 많다. 예를 들면 푸쉬-업(팔굽혀펴기) 운동(체조) 관련 정보를 다루고 정보의 분류를 '맨손 운동'라고 하고 싶다면, 적절한 카테고리로 '맨손 운동' 이라고 할 수 있다. 그러나 그 정보의 타입은 일반적으로 글을 다루는 내용이라면 articles 정도가 맞을 것이고 토론을 하는 정보 공간이면 bbs 가 맞을 것이다. 아래와 같이 lib/category.php 정의되어있다. 가능한 한 이곳에 정의된 것을 선택해서 이용을 하도록 한다.


define('CT_BBS', 'bbs');						// 게시판, 토론실, 질문과 답변 등
define('CT_MEMO', 'memo');					// 게인 메모
define('CT_MALL', 'mall');					// 쇼핑몰
define('CT_MAIL', 'mail');					// 메일 송/수신 관련, 웹메일,
define('CT_FILE', 'file');					// 파일, 다운로드, 파일(디렉토리) 관리, 파일 시스템
define('CT_BLOG', 'blog');					// 블로그, 수필, (일기장 제외)
define('CT_DIARY', 'diary');				// 일기장, 일지, 기록표
define('CT_NEWS', 'news');					// 뉴스, 소식
define('CT_ARTICLES', 'articles');	//신문, 기사, 강좌, 문서


category.id(정보 영역 아이디)만 주어졌을 경우, 그 정보를 어떻게 표현해야할 지의 결정은 category.type 에 의해서 결정을 한다.
@@todo 현제는 단순히 bbs 로만 전부 표현을 한다. default.php 에서 주소 변환을 하며 각 카테고리에 맞도록 수정 작업을 해야한다.









권한 필드는 권한 등급과 연관이된다.
권한 등급은 2 바이트 정수로서 0 부터 65535 까지표현이된다.
MySQL Database 에서는 SMALLINT UNSIGNED 로 표현이 가능하다.





post.dateTime_firstwrite 필드는 처음 글이 쓰여진 시간이다.
즉, 수정을 할 때에 post.dateTiem 의 필드가 갱신된다. 이 값을 보고 리스팅이라든지 검색 등을 한다.
맨 처음 글이 쓰여진 시간을 보려면 post.dateTime_firstwrite 항목을 참조하면된다.



[-] user 테이블


user.jumin1					주민번호 앞자리
user.jumin2					주민번호 뒷자리

user.birth_year			주민번호를 입력받지 않을 경우, 태어난 년도 4자리
user.birth_month		월 2자리
user.birth_day			일 2자리
user.sex						성별 1자리



user.cphone					휴대 전화 번호

user.ip_signup varchar(15)				첫 가입시 ip 주소


user.grade 사용자 등급 (레벨)
user.point 사용자 포인트. 특정 이벤트마다 포인트를 증가 시키고 일정 포인트가 쌓이면, 등급을 올리게 할 수 있다.
user.dateTime_signup 에 처음 가입한 시간을 기록해 둔다.
user.dateTime 은 매번 정보를 수정할 때 갱신되는데, 사용자 정보가 수정되면, 최신 정보로 사용된다.

user.skin 개인의 취향에 따라서 스킨을 선택할 수 있도록 user.skin 을 추가한다.


user.domain					사용자 정보가 어디서 왔는지 표시를 한다. 가입 도메인이나 위치 등을 기록하는 장소이다.
user.password_type	데이터가 컨버팅 되었을 때, 비밀번호 타입을 지정한다. zeroboard4, zeroboard5, gnuboard4, rgboard3 와 같이 표기를 한다.
										password 필드와 password_type 필드를 비교해서 비밀번호 검사를 해야한다.


user.job						사용자 직업
user.office_name		회사 이름(빌딩 이름)
user.office_address	회사 주소
user.office_zipcode	회사 우편번호
user.office_phone		회사 전화번호
user.hobby					사용자 취미
user.messenger			사용자의 메신저 주소. 저장 양식 MSN,thruthesky@@yahoo.co.kr AOL,thruthesky@@yahoo.co.kr
user.mailing				메일 수신 여부.


user.signature			사용자 사인, 서명, 필명에 대한 설명. 문서 맨 마지막에 추가할 사항.
user.recommender		추천인. 누가 추천해서 가입했는지, 그 추천한 사람에 대한 사용자 번호를 기록




아래는 임시 항목이다. post 테이블의 설명을 참조한다.

etc_int_1
etc_int_2
etc_char_1 CHAR( 1 )
etc_char_2 CHAR( 1 )
etc_varchar_1 VARCHAR( 255 )
etc_varchar_2 VARCHAR( 255 )





2007년 2월 11일 아래의 항목이 추가되었다.

	-- user.image_nick 이미지 닉 64x16 px
		-- user.image_4x5 신분증 크기 4x5 cm ( 113 x 142 px )
		-- user.image_5x7 명함 크기 5x7 cm ( 142 x 198 px )
		-- user.image_3x4 반명함 크기 3x4 cm ( 85 x 113 px )
		-- user.image_5x5 비자 사진 크기 5x5 cm ( 142 x 142 px )
	
필드 이름에서 알 수 있듯이 image_nick 은 닉네임 대신에 이미지로 표현하고자 할 때 사용한다.
image_4x5 에서 4x5 는 cm 단위의 크기이다. 픽셀의 크기는 위의 괄호안에서 볼 수 있다.

각 이미지의 크기는 마음데로 하지말고, 위에서 정해진대로 맞추어서 작업을 해야 섞이지 않는다.


물론 이미지는 첨부 파일로서 file 테이블에 처리된다. 이때, inline 에 해당 정보를 기록하면,
user 테이블에 이미지 관련 항목이 꼭 준비될 필요가 없다.
그러나 매번 사용자 정보를 액세스할 때에 file 테이블을 참조할 수는 없는 노릇이다.
따라서 user.image_xxxx 에는 file.idx 번호를 가지고 있는다.

즉, 이미지는 file 테이블에 보관하고 그 번호만 가지는 것이다.



용량제한
	닉네임 로고는 20 kb 이하
	각 이미지는 100 kb 이하로 제한된다.





user.message_number, user.message_new 총 쪽지 갯수, 새쪽지 갯수. 새 데이터를 기록할 때에 전체를 계산한다. 쪽지를 읽을때는 새 쪽지 갯수만 변경한다.
user.login_count 로그인 횟수 기록
user.hits 사용자 정보가 읽힌 횟수 기록
	






[-] category 테이블





category 테이블은 영역의 정보를 담는 곳이다.





게시판 영역 하나마다 하나의 레코드가 이 테이블에 존재한다.
게시판 뿐만아니다, 블로그 하나마다 레코드가 이 테이블에 존재한다.
게시판, 블로그는 영역이 무한대로 존재할 수 있다.
특히, 블로그 내에는 따로 카테고리가 존재할 수 있다. 
메모장도 마찬가지다. 사용자별로 별도의 분류를 만들 수 있다.


필드 리스트
idx								고유번호
idx_user					글 영역의 주인( 0 이면 시스템의 것으로 슈퍼 관리자급 이상이 관리를 한다.) 주의: 이 값은 고유값이 아니다. 즉, 중복이 가능한 값이다. 한명의 사용자가 여러개의 카테고리를 소유할 수 있다.
type							종류(카테고리 종류, CATE_BBS, CATE_BLOG, CATE_MEMO 등이 있다.)

id								카테고리 아이디
name							카테고리 이름
title							카테고리 제목
description				카테고리 설명
dateTime					작성(변경)된 시간
dateTime_created	처음 작성된 시간
r									정보 읽기의 접근 범위
w									정보 쓰기의 접근 범위
number_list				한 페이지에 나타낼 글 리스트 갯수
									해당 카테고리의 정보 목록 리스트 갯수
									number of list 정도로 해석되며 한 페이지에 리스트할 글의 수를 말한다.
									0의 값이면 무시되고, 시스템 설정에서 지정하는 $system['numberOfRecords'] 가 사용된다.

page_navigator		한 내비게이션 블럭에 나타낼 페이지 수
etc								기타 내용. (각 모듈 개발자가 임의로 사용하는 값)
skin							카테고리에서 사용하는 스킨(해당 정보 영역이 개인의 블로그 일 경우)

order_no					표시(리스트, 출력)의 순서를 나타낸다. 높은 값일 수록 먼저 표시, 0 이면 순서 없음. -1 이면 표시안함.


기타: 다른 테이블도 마찬가지겠지만, 파일(이미지)의 추가가 필요하면 filesystem library 를 통해서 파일을 추가하면된다.
파일에는 카테고리 타입과 정보의 번호를 기록할 수 있으므로 무제한으로 첨부가 가능하다.



category.type=CATE_BLOG 일 때, category.id 는 "blog.userid" 형식으로 기록이된다.
category.id 는 고유한 값이어야하기 때문에 위와 같은 형식으로 기록을 하는 것이다.
그러나 category.id 를 가지고 카테고리 정보가 어떤 사용자에게 속해있는지를 판별하기 위해서는 사용을 하지 않는다.
대신 아래와 같이 userCategory 를 이용한다.

	$category = userCategory(CATE_BLOG, $blogger['idx']);
	
category.id 를 통해서 category.idx 를 얻는 것은 당연히 가능하지만, category.id 를 통해서 user.idx 를 얻는 것은 하지 않는다.

category.type = post.idx_category_type 이다.
따라서 category.type 을 아는 경우, post.idx_category_type 으로 사용할 수 있다.


category.articles		현제 영역(카테고리)에 속하는 글의 수 이다. 현제는 그냥 count(*) 를 통해서 알아내게하고 있지만, 데이터의 양이 많아 질 경우, 거기다가 검색을 할 경우에는 미리 총 글의 수를 알아두는 것이 편할 때가 있을 것이다. 현제 사용되지는 않지만 만약에 대비해서 존재하는 항목이다.


header						카테고리의 맨 위에 나타낼 설명
footer						카테고리의 맨 밑에 나타낼 설명




@@since 2007 / 01 / 21

change / category.type 필드가 type unsigned tinyint(4) 로 변경이 되었다.
문서에는 다음과 같이 설명이되어있다.

	A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.


0 부터 255 의 값이 저장될 수 있다. 그러나 0 부터 99 까지의 값은 시스템 내부적으로 사용이된다.
따라서 모듈 개발자가 사용할 수 있는 category.type 의 값은 100 부터 255 까지이다.

category.type = post.idx_category_type 이다. post 영역을 검색할 때, idx_category_type 을 통해서 특정 영역의 글을 검색할 수 있다.





category.managers		varchar(255)
	이 항목에 해당 정보 영역의 관리자를 지정할 수 있도록 한다.
	콤마로 구분하며 255 글자이내에서 10명 20명도 지정이 가능하다.
	여기에 기록된 관리자는 해당 영역에 대해서 모든 작업을 할 수 있다.
	즉, 게시판의 경우, root() 나 super() 또는 admin('bbs') 또는 subadmin('category-name') 의 경우 수정을 할 수 있다.
	



category.idx_parent			부모 카테고리 정보를 담는다.
최 상위 카테고리는 당연히 idx_parent 가 0 인 값이다.

쇼핑몰에서 최 상이 카테고리를 찾기 위해서는 type=CATE_MALL 이고 idx_parent 값이 0 인 것을 찾으면된다.

카테고리를 삭제할 때에는 서브 카테고리의 idx_parent 의 값을 0으로 만든다. (상위와 연결 시키지 않는다.)







category.skin	
	각 카테고리별로 스킨을 정할 수 있다.
	user.skin 은 개인 사용자 별로 스킨을 지정할 수 있다.
	게시판의 경우 이 필드를 통해서 기본 게시판 스킨을 정할 수 있다.
	블로그의 경우 마찬가지로 이 필드를 통해서 기본 블로그 스킨을 정할 수 있다.
	





category.image_width, category.image_height 는 글 읽기 페이지에서 이미지의 크기를 나타낼 사이즈를 말한다.

category.image_view 는 tiny int 형으로서 이미지를 클릭했을 때, 동작을 나타낸다.
none=0, popup=1, link=2, newwindow=3 의 값을 나타낸다.


image_width 과 image_height 중 하나만 지정될 수 있다. 이때에는 그 하나에 맞추어서 작업을 한다.






[-] file 테이블과 file 데이터 보관

file 의 모든 정보를 모아 놓은 곳이다.

각 데이터 파일은 독립적인 정보를 구성한다. 즉, 글이나 게시물, 쇼핑몰 데이터 등에 얽매이지 않는 다는 것이다. 그 자체로 하나의 완전한 데이터를 표현한다.
 사용자 사진, 쇼핑몰 사진, 글 첨부 등이 기록될 수 있다.

file.idx
file.idx_category_type		; 파일이 어느 정보 영역의 데이터인지를 나타낸다.
이 값은 카테고리 번호가 아니라, 카테고리 종류이다. 기본적으로 CATE_BBS 영역의 정보를 가진다.
카테고리 번호로 할 경우, 여러 테이블의 인덱스 번호를 가져오야하므로 표현이 다 안된다.


file.idx_post							; 현제 파일의 정보가 연관된 (원래의) 글 번호
file.name									; 파일 이름
file.size									; 파일 크기
file.type									; 파일 타입
file.dateTime							; 등록 시간
file.ip										; unsigned int 작성자의 IP
file.hits									; 클릭수(다운로드수)

file.inline								; 마크를 한다. 페이지에 바로 보여줄지에 대한 표시를 한다. 이 값은 특정 표시를 사용할 수 있다.
						; fileMark 를 통해서 inline 의 값을 비교해서 특정 값만 골라 가져올 수 있다.


파일 데이터는 upload 모듈과 download 모듈 두가지가 같이 동작을 한다.

file/data/06/12/12/1001 와 같이 file/data 디렉토리 밑에 년/월/일 디렉토리에 file.idx 별로 파일을 보관한다.

?cate=downlaod&1001 과 같이 하면 파일이 다운로드 된다.

** 웹에서 액세스 가능한 경로라면 웹브라우저로 바로 다운로드 가능하다. 물론 관리자 모드에서 파일 보관 경로를 변경할 수 있다. 이러한 것을 충분히 문서화 하고 경고를 해야한다.


첨부 파일은 독립적으로 존재할 수 없으며 반드시 file.idx_post 의 값이 있어야한다.
file.idx_post 는 "원래 정보" 를 나타낸다.

file.idx_post 는 post.idx 의 것일 수도 있지만, user.idx, category.idx 의 값일 수도 있다.
따라서 이에 대한 구분은 file.idx_category 로 한다.
예를들어 동일한 file.idx_post 에 여러개의 첨부 파일이 존재하더라도
	file.idx_category 에 따라서 {테이블}.idx 이 달라진다.

만약, idx_category 가 1 이고 idx_post=100 의 경우, post.idx 가 아니고, user.idx 의 첨부파일이다.
idx_category = CATE_BBS 이고 idx_post=100 의 경우, post.idx 의 첨부파일이다.

inline 에는 특정 표시를 할 수 있다.
inline = 'signature' 와 같이 해서, 자신의 이름 대신에 이미지로 표시하게 할 수 도 있다.







[-] 파일 데이터의 직접 보관

아직 구현을 하지 않는다.
업로드된 파일 데이터를 디크상의 파일로 기록하지 않고, 직접 BLOB 데이터로 레코드 항목으로 보관을 하면 어떨까?
이런 아이디어로 과거에 이미 시도한 바가 있으며 실패를 한 것 같았다.

file.data									; 파일 데이터를 직접 보관 레코드









[-] post 테이블

이 테이블에 모든 텍스트 형식의 글이 저장된다. 그냥 게시판의 게시물 테이블 정도로 이해를 하면 된다. 실제로는 그보다 넓은 범위로 모든 text 형식의 글을 보관하는 테이블이다.
게시판 게시물, 방명록 글, 코멘트 글, 메모장 글 등... 차후에 추가되는 모든 기능에서도 text 형식의 내용은 이 테이블에 보관되어야한다.


post.idx_category 현제 글이 속한 카테고리 정보를 가리키는 번호이다.
		category.idx 와 동일한 값이다.
		현제 글의 카테고리 정보가 없는 경우 0의 값이 될 수있다.
		예를 들면, 쪽지글의 경우, 카테고리 정보가 없다.
		post 테이블에 기록되어 있는 데이터는 모두 이 값을 가진다. 이 값은 post 내에 저장된 내용의 분류(카테고리)를 하고 그룹으로 관리할 수 있게한다.
		새로운 정보 영역(카테고리, 게시판 등)를 추가하고 글을 보관하려면 먼저 category 테이블에 카테고리를 생성하고 post 테이블에 글을 기록하되 post.idx_category 에 해당 category.idx 를 기록해 주면된다.
	
post.idx_category_type 현제 글(정보)의 종류를 나타낸다. 이 값은 default.php 에 상수로 정의되어 있다.


post.idx_parent 에는 현제 글이 관련된 상위 정보를 가리킨다. 보통의 경우 현제 글의 참조글 정도가 된다.
이 값은 상황에 따라서 다르게 쓰일 수 있다.


post.idx 는 글번호(정보의 고유번호)이다.
	글 번호는 글이 기록될때 마다 자동으로 증가하는 값이다.

 



idx_user 는 현재 정보의 주인이 회원일 경우 그 주인의 user.idx 를 나타낸다.
즉, 현제 정보의 카테고리는 idx_category==category.idx 를 찾으면 되고 현재 정보의 주인은 idx_user == user.idx 를 찾으면된다.


state 는 정보의 상태를 나타낸다.
	state 에는 현재 게시물이 공지사항 글인지, 삭제된 글인지, 등등을 나타낸다.

	'R' 이면 중요(공지)사항으로 표시된 것이다. 따라서 중요 사항을 만들때에는 이 필드를 업데이트하면된다.

	
	정보의 상태에는 접근 권한을 포함하지 않는다.
	접근 권한은 rwxs 필드가 모두 맡아서한다.
	



rwxs 필드는 권한 설명을 참고한다.


id 는 게시물의 아이디이다. 회원 아이디, 카테고리아이니, 게시판 아이디가 아닌, 게시물 정보 고유의 아이디이다. post.id 가 의미하는 바가 게시물의 아이디이다. 용도가 없으므로 사용되지 않는 필드이다.

post.secret 는 비밀 내용을 기록(포함)한다. 예를 들면 다음과 같은 상황이 발생할 수 있다.
사용자가 자신의 아이디/비밀번호를 잊어버려서 로그인을 못하는 경우, 또 어쩌다 보니 패스워드 확인을 받을 방법이 없는 경우, 이러한 사정을 관리자에게 본문에 기록을 하고, 비밀내용에다 자신의 주민번호나 연락처를 남기면 다른 사용자는 못보고 관리자만 보도록 하는 것이다.

또 다른 예로는 자신의 메일 계정에 정보가 있는 데, 그 정보를 이용하지 못해서 도움을 요청할 경우, 메일 주소와 비밀번호 등을 기록하여 관리자만 보게할 수 있다. 물론 게시물 자체를 비밀글로 하면될 수도 있다. 그렇지만 본문 내용은 다른 사람이 봐야하고, 특정 글만 관리자만 봐야한다면 이 경우 딱 알맞다.




** 답변글(뎃글,코멘트) 관련

post.idx_parent 에는 부모글 번호가 기록이된다.

예를 들어 글번호 100 번에 답변글 형식으로 글을 쓰면 글 번호는 234 번이 될 수 있다.
이때 234 번이 100 번의 답글이나 뎃글이라는 표시로 post.idx=234 의 글에 post.idx_parent=100 으로 기록을 해 준다. 그리고 100 번 글과 관련된 글을 찾을 때에는 post.idx_parent=100 으로 검색을 하면 된다.


float post.order_no							idx_parent != 0 일 때, 부모글 밑으로 글이 나타날 정렬 순서이다.
										예를 들면, order_no = 0.1 이 있고, order_no=0.12, order_no=0.2 가 있을 경우
										이 순서대로 글이 나타난다. 중간 중간에 새로운 답변글이 작성된다고 하더라도 소수점을 이용해서 쉽게 추가가 가능하다.

tinyint(4) post.order_depth			idx_parent != 0 일 때, 부모글 밑으로 글이 날때 들여쓰기를 몇번할 지 기록한다. 예를 들어 order_depth=3 이면 3번 들여쓰기를 반복한다.


답변글과 관련한 필드는 위의 3가지이다. 일단 idx_parent != 0 이면 답변글이라는 표시이다.
정렬이라든지 들여쓰기를 별도의 order_no 필드와 order_depth 필드를 사용하지 않고, idx_parent 이 필드 하나로 모든 것을 끝 낼 수 있다.
idx=5 && idx_parent=0 일때, idx=123 && idx_parent=5, 그리고 idx=234 && idx_parent=123 과 같이 계속 꼬리를 물고 내려갈 수 있으며 이 경우 계층이 만들어 질 수록 계층별로 정렬하고 들여쓰기를 하면된다.

물론 처리가 가능하지만 효율적인 부분에서 많은 의심이된다.

본 시스템에서는 직접적으로 데이터베이스를 조작하는 것에 대해서 권장을 하지 않는다.
준비된 함수를 통해서 DB 와의 정보 입/출력을 해야하며, 이 경우 이러한 알고리즘에 대해서는 크게 신경을 쓰지 않아도 된다.





** post.state varchar(128)
	원래는 char(1) 의 형태였는데, varchar(128) 로 변경이되었다.
	현제 정보(글)의 상태를 나타낸다.
		empty(NULL) 는 일반 글
		R 은 공지사항
	위 값 외에도 정보가 대기 상태이거나 입금 확인 대기 상태 등의 경우, 직접 텍스트로 나타낼 수 있다.
	


** post.children
현재 글과 연관된 답변(코멘트)의 수를 기록한다. 삭제(수정)를 할 때, 이 값이 0 이 아니면 할 수가 없다.

** post.files
현재 글과 연관된 파일의 수를 기록한다.

** post.recommend

사용자로 부터 글이 좋다고 추천받은 수를 기록한다.
-1, 0, 1, 2, 3 과 같이 더하고 빼고를 할 수 있다.







현제 글에 대한 코멘트(답변)의 갯수이다.
코멘트의 갯수는 실시간으로 계산을 할 수 있다.







post.idx_link 는 글 링크(참조)를 가르킨다. 글의 복사나 이동과는 달리, 링크는 지정된 글을 참조한다는 것을 의미한다. 예를 들면, post.idx_link = 100 이라면 100 번 글의 분류(글 영역)을 제외한 모든 내용을 그대로 사용한다는 것이다.
편리한 처리를 위해서는 idx_link != 0 이면, idx_link 에 기록된 글의 내용을 현재 내용으로 모두 복사해서 보여준다. 물론 링크되었다고 표시를 해 주면좋다.



















dateTime, dateTime_firstwrite, dateTime_created 는 시간 관련 항목이다.
dateTime 은 글이 매번 변경이 될 때 갱신되는 시간이다.
dateTime_firstwrite 는 글이 맨 처음 기록된 시간이다.
dateTime_created 는 글이 맨 처음 생성된 시간이다. 즉, 복사되어 글이 저장(기록)될 수 있다. 글이 해당 영역에 기록되는 시간은 dateTime_firstwrite 이고, 저작권자에 의해서 글이 처음 만들어질 당시의 시간 값을 가지는 것이 dateTime_created 이다.





아래는 임시 필드이다. 되도록 이 필드를 사용하지 않아야한다.
하지만 부득이 한경우, 새로운 테이블을 생성하지 않고, 아래의 필드를 사용해야한다.
아래의 필드를 사용하는 것은 기존 필드에서 맞지 않는 항목이 있어서 일 것이다.
이 경우에는 반드시 본 소프트웨어의 개발자에게 연락을 해야한다.
새로 테이블을 만들거나 다른 장소에 데이터를 저장한다면 백업,복구 등의 작업에서 데이터의 안전을 보장받지 못한다.


etc_int_1
etc_int_2
etc_char_1 CHAR( 1 )
etc_char_2 CHAR( 1 )
etc_varchar_1 VARCHAR( 255 )
etc_varchar_2 VARCHAR( 255 )




post.grade			등급의 증감 수치를 나타낸다.
								+ 1 일 경우, 글 읽기를 하면, 1등급 증가한다.
								- 2 일 경우, 글 읽기를 하면, 2등급 감소한다.
								


post.point			각 글에 포인트를 매길 수 있다. +10 일 경우, 읽기를 할 경우 10 포인트가 증가,
								-100 일 경우, 읽기할 경우 100 포인트 감소를 한다.
								


post.password_type			비밀번호 종류이다. md5, crypt, MySQL password, DES 등으로 표현될 수 있고, 다른 소프트웨어에서 포팅된 경우, zeroboard4, gnuboard4 와 같이 기록될 수 도 있다.






글을 저장할 때에, 필수적으로 입력이 되어야하는 값은

post.idx_category, post.idx_category_type 이다.






post.origin			글의 출처 [직접 작성] 이름, [기타] 연락처,
post.license		글의 저작권 public, GPL, private, 기타 [라이센스 URL]
		




























[*] 정보 영역

정보 영역은 카테고리 영역이라고도 하며 모듈 영역이라고도한다. 모두 같은 말이다.

정보 영역은 데이터의 성격에 따라 분류가된다.

lib/category.php 에 정보의 분류가 기록되어있다.

2007년 초 현제에는 다음과 같이 분류가 되어있다.


define('CATE_BBS', 'bbs');						// 게시판, 토론실, 질문과 답변, 뉴스, 새소식, 신문, 기사, 강좌, 문서 등
	// 만약 새로운 모듈을 작성한다고 하더라도, 이런 류의 글을 다루면 CATE_BBS 타입이어야한다.
	// 그래야 검색이라든지 다른 기능에서 올바로 데이터가 이용이된다.
define('CATE_MEMO', 'memo');					// 게인 메모
define('CATE_MALL', 'mall');					// 쇼핑몰
define('CATE_MAIL', 'mail');					// 메일 송/수신 관련, 웹메일,
define('CATE_FILE', 'file');					// 파일, 다운로드, 파일(디렉토리) 관리, 파일 시스템
define('CATE_BLOG', 'blog');					// 블로그, 수필, (일기장 제외)
define('CATE_DIARY', 'diary');				// 일기장, 일지, 기록표


모든 글 정보는 post 테이블에 저장이되므로, 각 정보 영역으로 데이터가 상호 호환이 가능하다.
즉, bbs 영역의 정보를 blog 모듈로 뿌려주면 그것이 블로그 처럼 나타난다.









[*] 카테고리와 모듈
본 소프트웨어에서 카테고리의 의미는 정보의 영역(분류,군집)를 말하는 것이다.

"카테고리란? 정보의 영역이다." 라는 표현에 집착하기를 바란다.

홈페이지 전체 정보를 놓고 볼때, 회원 정보는 하나의 카테고리에 속한다. 게시판 엮시 회원 정보나 개인 메모장 정보 등과는 별도의 정보 영역이다. 게시판에도 여러가지 분류가 있을 수 있다. 공지사항, 자유토론 등.. 이러한 공지사항 게시물도 하나의 정보 영역을 이루므로 공지사항 자체가 하나의 카테고리가 된다.

module 디렉토리에는 각 정보 분류를 다루는 소스 스크립트가 디렉토리 별로 존재한다.


카테고리의 정보를 보기 위해서는 웹브라우저로 URL 을 입력하면된다.
게시판의 공지사항을 읽고 싶다면,

http://홈페이지/?cate=bbs&mode=list&name=공지사항 과 같이 하면된다.
단순히 http://홈페이지/?공지사항 과 같이 해도 상관이 없다.



[-] 문자셋 관련 참고

데이터베이스의 문자셋이 다를 경우, 글 쓰기에서 '꽼', '쾤','꽦', '솦'과 같은 글자는 기록되지 않는다. 따라서 그 이후 문자들이 기록이되지 않는다.
'캍' 과 같은 글자도 입력이 안된다.
비록 데이터베이스는 EUC-KR 이라도 처음 데이터베이스 생성을 할 때, collation 을 지정해서 하면된다.
꽦, 꿲 등의 문자가 들어가기 위해서는 utf8 이어야한다. 그리고 일본어 중국어 등도 같은 페이지에 나타내려면 utf8 이어야한다.

phpmyadmin 과 같은 프로그램으로 볼 때, collation 이 utf8_general_ci 라고 표기가되어야한다.


utf8 외의 문자셋을 사용할 경우, 옵션으로 처리를 한다. 이 때, DB 는 utf8 이다.
따라서 글 변환을 해서 저장을 하고 보여주고 한다.




[*] 정보와 모듈

정보는 하나의 레코드 단위로 기록이된다. 레코드의 집합은 정보의 영역이라고 부른다.
post 테이블에는 이러한 영역, 정보 레코드 등을 담고 있다.
정보 영역은 하나의 카테고리이며, 카테고리는 category 테이블에 보관이 된다.

정보를 post 테이블에 보관(작성, 수정, 삭제 등)하는 방식은 모듈(기능)을 통해서 한다.

모듈은 modules 디렉토리에 있는 프로그램 소스들이며 post 테이블의 데이터와 작업을 한다.

free 라는 카테고리(정보 영역)가 있다면, bbs 모듈을 통해서 이 카테고리를 보여줄 수 있으며, 동시에 memo 등 여러가지 모듈을 통해서 보여줄 수 있다. 즉, 어떤 데이터 영역은 특정 모듈에 얽매이지 않는다는 것이다. 






[*] 파일 작성 형식
최 상단 부분에 파일의 설명을 한다. 작성자, 연락처(메일, 홈페이지), 저작권, 파일의 기능 등





[*] 모듈, 라이브러리, 함수명, 변수명 작성 규칙.
가능하면 표준을 따르고 싶지만, 표준이 어떤건지 까묵은지 오래되었고, 그리고 학습기간이 만만치 않을 것 같다.
다름과 같이 규격한다.

함수명 작성 규칙: 방향-모듈-행동(또는 속성)
예) 
	getMoudleName 모듈 이름을 얻는다.
	setCategoryType 카테고리 타입을 지정한다.
	getPostCount 글의 수를 얻는다.
	setPostHits 글의 읽은 횟수를 기록한다.

방향이 생략되면 값을 가져오는 것으로 한다.

	moduleName 은 모듈 이름을 얻기 위한 함수이다.
	
임시 변수명 작성과 사용: _ 로 시작을 한다.
예)		$_id = 1; unset($_id);





[*] 디렉토리와 파일의 구조 및 연결


게시물을 본다고 가정을 한다면,

게시물의 정보는 게시판 영역에서 관리가된다. 게시판은 하나의 카테고리(정보 영역)이다.
이때 실행되는 프로그램 소스 스크립트는 module 디렉토리 밑의 bbs 내에 있다.

이때 보여지는 HTML 스킨 파일은 skin/저정스킨종류/bbs.****.html 파일들이다.


회원 정보를 본다면, module/user 디렉토리에 프로그램 소스 스크립트가 있고,
HTML 스킨 파일은 skin/지정스킨종류/user.****.html 파일들이 이용된다.

[*] 파일 접근 퍼미션

모든 파일은 웹에서 쓰기 퍼미션이 열려있어야한다.
따라서 차후에 업데이트가 자동으로 이루어진다.

맨 처음 설치를 할 때, 웹에서 설치가 필요하다.











[*] 웹브라우저로 프로그램 소스 실행
디렉토리 구조를 보면 module 디렉토리가 있고 그 아래에 bbs, user 등과 같은 디렉토리가 있다.
웹브라우저로 module 디렉토리 밑에 있는 bbs 디렉토리의 list.php 소스 스크립트를 실행하고 싶다면,
index.html?cate=bbs&mode=list 와 같이 URL 입력을 하면된다.
이 URL 을 해석해 보면, 카테고리는 bbs 이고 모드는 list 이다. 즉, bbs (데이터) 영역의 정보를 list 하겠다는 뜻이된다. 사용자 영역의 정보를 리스트 하고 싶다면 cate=user&mode=list 와 같이 하면된다.
index.html?cate=user&mode=list 는 결과적으로 웹브라우저가 module/user 디렉토리 아래에 list.php 를 실행하는 것이 된다.

[*] 문서화된 프로그램 소스 및 함수 리스트

공식 사이트의 문서화 링크 참조





[*] 프로그램 소스 파일 작성 관련

$dirRoot = ".";
include_once("$dirRoot/lib/default.php");

와 같이 $dirRoot 변수에 본 소프트웨어의 홈 경로가 지정되어있어야한다. ($dirRoot, $_dirRoot, $rootDir 모두 같은 변수이다. 셋 중에 하나만 지정을 하면된다.)



내부적으로는 아래와 같이 dirRoot 상수를 사용한다.

if ( isset( $dirRoot ) ) define ('dirRoot', $dirRoot, true);

default.php 를 인클루드 할 때에는 반드시 아래와 같은 형식이어야한다.

include_once("$dirRoot/lib/default.php");

따라서 외부로 부터 시스템 관련 기능을 인클루드하려면, 아래의 두 라인이 추가되어야한다.
$_dirRoot = "설치경로";
include_once("$_dirRoot/lib/default.php");

그리고 필요하다면 데이터베이스 라이브러리를 사용할 수 있다.
lib('mysql');
$db = new MySQL("root", "1111", "siteapi");

[*] 소스(라이브러리) 파일 인클루드

includeOnce(...) 함수는 내부적으로 include_once 함수를 사용해서 소스 파일을 단 한번만 인클루드(포함)하게 한다. 입력값으로는 "라이브러리/모듈" 의 형태를 띄고 있다. 예를 들면 includeOnce("lib/system"); 과 같을 경우 lib 디렉토리의 system.php 파일을 인클루드한다.
includeOnce(...) 함수를 줄임말 함수로 Once(...) 함수를 사용할 수 있다.
lib("모듈") 함수가 있는데, 이 함수는 오직 "lib" 디렉토리에 있는 파일만 인클루드한다.
따라서 라이브러리 파일을 인클루드하려면 lib 함수를 사용한다.
lib("system"); 문장은 includeOnce("lib/sytem"); 과 같으며 Once("lib/system"); 과 같다.

모듈과 스킨의 인클루드
module() 과 skin() 두개의 함수가 있다. 이 함수들은 해당 모듈과 스킨 파일의 경로를 리턴한다.
따라서 include(skin()); 과 같이 사용을하면 된다.





[*] 주의: 모듈내에서는 어떤 데이터도 직접적으로 출력을 해서는 안된다.
오직 스킨에 의해서만 결과가 웹 브라우저로 보여야한다.


[*] 데이터베이스의 사용

기본적으로 사용할 수 있는 코드는 아래와 같다.
	lib('mysql');
	$db = new MySQL("root", "1111", "siteapi");
기본적으로 인클루드 되는 default.php 에서 $db_user 와 같은 변수를 세팅하기 때문에,
	lib('mysql');
	$db = new MySQL();
와 같이 하고 간단히 사용을 하면된다.


하지만 이 같은 경우 매번 MySQL 객체를 생성해야하는 번거로움이 있다. 또한 이것은 내부적으로 DB 접속을 반복해서 하기 때문에 여러모로 좋지가 않다.
따라서 아래와 같이 한다.
	lib('db');
이 와 같이 'db' 라이브러리를 호출하면 미리 준비되어 있는 데이터베이스 객체 변수 $db 를 사용할 수 있다. 각종 데이터베이스 관련 함수는 내부적으로 이 라이브러리를 로드해서 사용한다.

데이터베이스 쿼리와 관련된 소스는 예제 파일 디렉토리(src/ex)의 db.php 예제 파일을 참고한다.


[*] 소스 코드 코딩 규칙

기본적으로 많이 사용되는 변수, 또는 범용적으로 사용가능한 변수 등은, 전처리해 놓는 것으로 한다.
HTTP 변수와 값의 표현은 hv 로 시작한다.
예를 들면 다음과 같다.
	
	$hvPageNo
	
위 변수는 hv 접두어로 시작한다. 이것을 보고 위 변수는 HTTP 변수와 값을 표현한다는 것을 알 수 있다.
즉, "&pageNo=..." 와 같은 형식의 문자열을 가지는 변수이다.

PHP 함수는 대소문자 구분을 하지 않는다. 즉, 함수를 function abcXYZ () { ... } 와 같이 정의 했다면, AbCxYz()와 같이 호출해도 상관이 없다. 하지만 규칙을 두자면, 소문자로 시작하고 단어별로 대문자로 시작한다.



[-] 클래스


Scope Resolution Operator (::) 의 사용에 대해서...
PHP 4 에서는 부모 클래스의 변수, 함수 또는 객체가 없는 클래스의 함수에 접근하는데 이용될 수 있다.

PHP 5 에서는 클래스의 static, 상수, overridden 멤버들과 메소드들에 사용이 가능하다.




[*] 코딩 기법


기본적으로 스크립트 부분의 에러 리포팅은 error_reporting(E_ALL); 로 한다. 스킨을 로드하기 전에 error_reporting(E_ALL ^ E_NOTICE); 를 해서, 스킨 부분은 좀 유연하게 에러 리포팅을 한다.
따라서 PHP 스크립트 파일 작업시에 $ar[name] 과 같이 하면 name 상수가 정의되지 않았다고 에러 리포팅을 한다. 따라서 $ar['name'] 과 같이 해야하다. 가끔식 인덱스 처리가 곤란할 때가 있다. 그럴때는 다음과 같이 에러 리포팅을 무시하게 할 수 있다.

		$cond[] = qField($k, $v, @@$kvs["$k cond"]);

		function getLink() { return @@$this->link; }
		








quiet(함수와 변수) 는 에러가 발생할 경우, 웹브라우저로 출력되는 내용을 최대한 제한한다는 뜻을 나타낸다.

예를 들면, lib('db'); 를 호출하기 전에, 에러 메세지가 웹브라우저로 나가지 않게 quiet() 함수를 호출한다. 물론 db.php 에서 적당한 처리를 해야한다. 자세한 것은 ./module/install/check.php 파일을 참고하기 바란다.







[*] 날짜 형식
년도4자리, 월,일,시,분,초 각각 2자리씩으로 총 14자리이다.
예를 들면 "200612020455" 와 같다. 이것을 '기본 날짜-시간 형식'이라고하며 dateTime 형이라고 한다.
date("YmdHis"); 로 날짜 형식을 구할 수 있으며 간단하게 dateTime() 함수로 이 값을 얻을 수 있다.

데이터베이스에 날짜 형식을 기록할때에는 기본 날짜 형식을 사용한다. 이 날짜 형식의 값을 unix time-stamp 의 값으로 변경하기 위해서는 toStamp() 함수를 사용한다. Iso8601.dateTime 형식의 날짜 값을 사용하기 위해서는 toIso8601(toStamp(dateTime())); 와 같이 호출을 하면된다. 이것은 toIso8601(time()) 과 같다.

function decodeDateTime($dateTime) { ... } 이라는 함수가 있다. 이 함수에 '기본 날짜 시간' 형식의 문자열 값을 전달하면 연관 배열로 그 값을 분석해서 리턴한다.



[*] 기본 상수
stirng 형 상수 workDir 현제 스크립트의 디렉토리 위치 값을 가지고 있다.


[*] 기본 변수

사용자 입력(웹브라우저로 부터의 입력)값이 $userInput 에 보관이된다. 이 변수는 $ui 변수의 참조자이다.
$userInput 변수를 사용하든, $ui 변수를 직접 사용하든 똑같다.




이 변수는 $_GET, $_POST 두개의 변수의 합해서 보관한다. 주의 점은 $_GET, $_POST 두 변수에 공통 값이 있으면 $_POST 의 값이 사용된다.

스킨 파일에서 웹브라우저 주소 입력창의 값을 사용하려면 그냥 아래와 같이하면된다.

http://domain.com/?cate=bbs 일경우 <?=$ui[cate]?> 와 같이 하면 된다. 그러면 bbs 가 값이 불려진다.

그러나 cate, mode, idx 변수들은 자주 사용되므로 $cate = &$ui[cate] 와 같이 변수를 설정해 놓고 참조를 하게하고 있다. 


모든 스킨 페이지에서는 해당 정보 영역의 데이터베이스 필드 명칭이 변수로서 그대로 사용이 가능하다.
자세한 것은 데이터베이스 테이블 설명을 참조하기바란다.


주의할 점은 변수가 덮어 쓰여져 버려서 맨 나중에 설정된 값이 이용될 수 있다.



사용자가 로그인을 하였을 경우, $user 연관 배열이 기본 변수로 사용이 가능하다. 이 배열을 통해서 사용자의 각 항목의 값을 얻을 수 있다.
$member = &$user; 와 같이 $member 엮시 $user 와 같은 값을 가진다. 이 두 변수는 같은 것이다.
따라서 $user 변수와 $member 변수는 스크립트 내에서 덮어쓰기를 하면 안되므로 조심해야한다.







스킨 파일에서 회원이 로그인 했는지 알아보려면 다음과 같이 할 수 있다.
<?if( $member ) { ?>
로그인 했습니다. ... HTML 내용 ...
<?}?>

	



페이지(정보 영역, 카테고리, 모듈, 스킨 페이지 등) 별로 기본적으로 사용할 수 있는 변수가 틀리다.
현제 페이지 정보의 항목을 가지는 변수는 그대로 사용이 가능하다. 예를 들어서 현재 정보의 이름을 알고 싶다면 <?=$name?> 과 같이 하면된다.




기본 변수를 잘 활용해서 여러번 DB 쿼리를 하는 경우가 없도록 한다.

자주 사용되는 기본 변수는 아래와 같다.

$system
$ui
$user
$url_rss
$cate
$mode

$category
$category_name, $category_id
$post


기본 변수외에 기본 함수들도 외워두고 사용하면 좋다.


기본 변수를 마음대로 변경하면 안된다.



$parent					부모 카테고리의 값이 들어있다.
$category 가 올바른 값을 가지고 있는 경우, $parent 가 !isset() 이면 $parent 값을 직접 추출할 수 있다.












[*.5] 체크 박스, 라디오 박스 값의 처리

HTML 폼 문장이 있는 스킨 파일에서 라디오 버튼에서 특정 항목을 선택해야할 경우, <?=$변수명_값?> 을 써 주면 자동으로 선택이된다.

다음은 그 예 중 하나이다.

<form ...>
	
	...
	
	<input type=radio name='type' value='bbs' <?=$type_bbs?>>게시판
	<input type=radio name='type' value='gallery' <?=$type_gallery?>>겔러리
	<input type=radio name='type' value='music' <?=$type_music?>>뮤직<br>
	
	설명: <input type=text name=description value='<?=$description?>'><br>
	
	권한:
	<input type=radio name=state value='public' <?=$state_public?>>공개
	<input type=radio name=state value='user' <?=$state_user?>>회원들에게만 공개
	<input type=radio name=state value='private' <?=$state_private?>>비공개<br>
	<input type=submit>
	
	...
	
</form>


기본 적으로 사용할 수 있는 변수 중에, 변수 또는 인덱스 항목으로 url_view, url_modify, url_delete 가 있다.
예)

	[<a href='<?=$ca[url_view]?>'>보기</a>]
	[<a href='<?=$ca[url_modify]?>'>수정</a>]
	[<a href='<?=$ca[url_delete]?>'>삭제</a>]




사용가능한 기본 변수는
default.php 의 기본 변수 리스트,
module/모듈이름/README 파일에 기록(설명)이 되어있다.



[*] 기본 실행 스크립트 그리고 모듈 구조와 스킨 구조

모든 카테고리에는 begin.php 와 end.php 가 있다. 이 스크립트들은 실제 카테고리 관련 스크립트가 실행되기 전후에 실행이된다.

이 스크립트에서 기본 변수 설정을 해 주면된다.

스킨의 경우, 자동으로 보여지는 파일은 다음과 같다.

header.html									자동으로 보여지는 홈페이지의 맨 처음 위 스킨
footer.html									자동으로 보여지는 홈페이지의 맨 마지막 아래 스킨

카테고리.header.html				자동으로 보여지는 카테고리별 맨 처음 위 스킨
카테고리.footer.html				자동으로 보여지는 카테고리별 맨 아래 스킨



실행되는 순서는 다음과 같다. index.html -> begin.php -> 모듈.php -> end.php -> header.html -> 카테고리.header.html -> 스킨.html -> 카테고리.footer.html -> footer.html
즉, 모듈 관련 PHP 스크립트가 실행되기 전에 그 어떤 출력도 있어서는 안된다.





기본 스킨은 default, simple, all 세가지이다.

default 는 기본적으로 사용하기 무난한 디자인 스킨이다.
simple 은 간단한 형식의 디자인 스킨이다.
all 은 모든 기능을 다 표현한 디자인 스킨이다.



[*.1] 모듈 구조

모듈 항목 참조



[-] 모듈 관련 스크립트와 스킨 실행 순서

default.php -> file.php -> (db.php ->) begin.php -> mode.php -> end.php -> layout.html -> header.html -> module.header.html -> left.html -> mode.html -> right.html -> module.footer.html -> footer.html





[*] 카테고리 리스트 예제 파일 디렉토리 src/ex/categorylist.php 참고

[*] 게시판 내용 출력
기본적으로 아래의 두 코드는 동일한 것이다.
게시판의 내용을 출력하고 싶을때 아래와 같이 사용할 수 있다.
code 는 includeModule 함수보다 좀 더 기능이 많다.
<?includeModule("bbs", "list")?>
<?code("bbs/list")?>

code("bbs/list", "게시판아이디", "게시물 갯수");



[*] URL 값

URL 주소로 홈페이지의 특정 정보 영역을 가리키는 것을 말한다.

아래의 예에서 카테고리는 bbs 이고 이것을 list 하는데, 비비에스 아이디는 free 라는 뜻이다.
ex) http://domain.com/index.html?cate=bbs&mode=list&id=free

index.html 은 기본적으로 실행이 되는 것으로 생략이 가능하다.

서버 스크립트로 값을 전달하는 방법은 ? 뒤에 키=값 의 형태로 전달한다. 그러므로 index.html 을 제외하고 ?a=b 와 같이 URL 을 기록하면된다.




[*] 주소 변환
자세한 내용은 default.php 의 관련 부분을 참고한다.



http://domain.com/?free 는 다음과 같이 해석된다.
free 는 게시판 카테고리 아이디이다. 카테고리가 free 게시판이며 모듈은 기본 모듈을 실행한다.
즉, 아래와 같다.
http://domain.com/?cate=bbs&mode=index&id=free

웹브라우저의 URL 입력으로 실행되는 웹서버의 스크립트 파일은 모듈들이다.
따라서 이러한 주소 변환은 모듈을 인클루드 시키는 includeModule() 함수 내에서 일어난다.


?userinfo 는 사용자 정보를 보는 페이지로 이동을 한다. ?cate=user&mode=read 로 주소가 변환이된다.
?leave 는 사용자 회원 탈퇴






[*] 로그인 / 로그 아웃

로그인과 로그아웃의 기본 카테고리는 user 이다. user 카테고리의 로그인 모듈의 파일이 module/user/login.php 인 것이다.


GET/POST 메소드로의 요청이며 cate, mode 값이 생략된 상태로 id,pw 변수가 있을 경우에는 ?cate=user&mode=login 으로 주소 변환을 한다.

URL 변수 값이 '?logout' 인 경우 ?cate=user&mode=logout 으로 주소 변환을 한다.
"?signup" 인 경우 ?cate=user&mode=signup 으로 주소 변환을 한다.




로그인을 했는지 안했는지는 int hasLogin() 함수로 한다. 함수 설명을 참고한다.



[*] 데이터베이스 접속
사용자 로그인이 되어 있는 상황이면 default.php 에서 DB 에 접속해서 사용자 정보를 얻고 $user 변수에 설정을 한다. 이때 매 스크립트 실행시, 기본적인 사용자 정보 설정을 통해 매번 DB 에 접속하는 과부하 현상이 발생할 수 있다. 그러나 현제 대부분의 프로그램에서 이런식이며, 대형 서비스 엮시 이런식이다. 과부하 현상이 벌어지면, DB Backend Layer 에서 작업이 필요할 것 같다.



[*] 권한 등급 및 권한 체크

설명이 어렵게 복잡하게 되어있다. 따라서 아래와 같이 요약한다.
------------------- 아래 요약 -------------------
user.r, post.r, category.r, category.w 가 있다. r 은 읽기, w 는 쓰기 등급을 나타낸다.
사용자 등급의 값을 가지는 user.grade 가 있다.
user.r 은 사용자 정보를 공개할 범위이다. 즉, 자신의 정보를 외부에 보여줄 권한 범위이다.
user.grade 의 값이 user.r, post.r, category.r/w 의 값과 같거나 높아야 해당 권한을 가질 수 있다.
user.grade 는 높을 수록 권한이 높다. 3만이 최고 관리자이며, 이 값, 3만 보다 높을 경우, 최고 관리자도 글을 읽을 수 없다. 즉, 개인 비밀글에 사용할 수 있다.
------------------- -------------------



사이트 등급: 루트, 슈퍼, 관리자, 서브관리자, 사용자

루트 관리자는 단 한명이다.

루트 관리자는 현제는 그냥 슈퍼와 같은 기능을 가진다.

루트(root, 계정) 관리자 - 홈페이지 서버의 디렉토리 계정을 직접 알고 있는 사람. files/system.conf.php 파일에 등록된 아이디를 가르킨다. 루트관리자의 등급은 상관이 없이 설정 파일에 기록된 정보를 바탕으로 루트인지 결정을 한다. 하지만 일반적으로 슈퍼관리자와 동일하게 처리를 한다. 30000 (3만) 이다. 다만 system.conf.php 에 아이디가 기록이 되어 있어서 시스템적인 작업을 처리할 수 있다.

슈퍼(super) 관리자 - user.grade 의 값이 30000 (3만)이다. 루트가 할 수 있는 많은 것이 가능하다. 그러나 웹사이트 정보 관리와 운영에 관한 슈퍼 관리자 일 뿐, 실제 사이트를 폐쇄하거나 사이트 데이터 파일 삭제나 백업 등의 일은 할 수 없다.
슈퍼 관리자는 홈페이지 관리와 운영에 관한 모든 권한을 가지고 있다. 따라서 마음데로 카테고리의 생성과 같은 작업을 할 수 있다. 또한 관리자를 임명, 직위 해제 할 수도 있다.


관리자(admin) - 관리자는 하나의 모듈(예, bbs, user)을 통째로 관리할 수 있다.
	이 정보는 user 테이블에 기록이된다.
	user.grade 와 상관이 없이, user.manager 에 기록된 모듈을 관리할 수 있다.
	새로운 카테고리 생성과 같은 작업을 하지 못하지만, 존재하는 데이터들에 대해서 모듈별로 액세스를 할 수 있다.
	존재하는 정보 수정/삭제를 할 수 있다.
	모듈별로 관리를 하기 때문에 모듈(또는 카테고리) 관리자라고 한다.

서브관리자(subadmin) - 서브관리자는 하나의 정보 영역에 대해서 관리를 할 수 있다.
	모듈보다 작은 단위로서 예를 들면, free 게시판이나 download 게시판이 될 수 있다.
	즉, 게시판 하나에 관리자를 여러명 임명하고자 할 경우, 서브관리자로 임명할 수 있다.
	서브관리자의 정보는 category.managers 에 기록이된다.



사용자(회원) 등급은 0 부터 9999 까지이다.


최고 등급은 30000 (3만) 이다. 만약 비밀글이나 비밀 일기글, 기타 아무도 접근이 불가능하도록 하려면 각 레코드의 권한 값을 30001 으로 하면된다.


슈퍼 관리자의 권한은 아무에게나 줄 일이 아니다. 슈퍼 관리자의 권한을 가진 사람은 사용자(회원)의 모든 정보를 열람할 수 있으며, 사이트 자체를 백업 받아서 동일한 사이트를 만들 수 있다.


관리자는 모듈 별로 관리 권한을 가질 수 있다.
예를 들어 bbs 모듈 관리자로 지정을 하면, bbs 내의 모든 기능을 슈퍼 유저와 같이 사용할 수 있다.






권한 체크 가능하는 부분이 특별히 있는 것이 아니라, 모든 영역에서 가능하다.
r,w,x 세가지 필드가 있으며, 유닉스의 파일 권한과 비슷한 개념이다.

카테고리에는 r,w 권한이 있으며, 글 영역에는 post.r 이 있다.
이 두 r 영역의 접근을 할 때에는 높은 값을 선택해서 적용을 한다.
예를 들어 post.r = 1 이고 category.r = 1 일 경우, 정보는 1의 권한을 가진다.
post.r = 0 이고 category.r = 10 일 경우 정보는 10의 권한을 가진다.
post.r = 100 이고 category.r = 0 일 경우 정보는 100의 권한을 갖는다.
 

따라서 관리자 전용 글쓰기 정보 영역을 만들기 위해서는 category.w=30000, category.r=0, post.r=0 으로 하면된다.







[-] 권한 체크

정보의 접근 권한을 말한다.
정보의 단위별로 접근 권한을 설정할 수 있다.
정보의 최소 단위는 하나의 정보를 구성하는 레코드이다.
각 레코드(정보)별로 권한 지정이 가능하다. 뿐만 아니라 레코드가 모여서 영역을 이루는 카테고리별로 권한 지정이 가능하다.

카테고리에 권한 설정을 하면 그 카테고리에 속하는 모든 정보가 지정된 카테고리 권한에 종속된다.

POST 영역을 예로 들어서 설명을 하면, POST 영역에는 게시판 뿐만 아니라, 메모라든지 여러가지가 있을 수 있다. 게시판 분류도 여러가지가 있을 수 있다. 이러한 분류는 하나의 카테고리가 되며 이러한 분류별로 권한 지정을 할 수 있는 것이다.

권한이 있는지 검사는 다음과 같은 순서로 이루어질 것이다.

우선 해당 카테고리에 대한 권한이 있는지 알아보고, 각 정보(레코드)별로 권한이 있는지 알아봐야한다.

하나의 정보(레코드)에는 요약 정보(리스트)보기, 전체 정보 보기의 권한이 별도로 있을 수 있다.
각 정보(레코드)에는 r,x 2개의 2바이트 숫자형 필드가 있으며 각각 요약(리스트), 읽기 정보를 나타낸다.
이것은 유닉스의 rwx 파일 권한과 비슷하다. 본인의 글이야 직접 모든 것이 가능하니 owner 에 대한 rwx 는 모두 참이어서 생략을 했다. 그리고 w 권한의 경우, group 이나 others 에게는 필요가 없어서 w 부분을 생략했다. r 과 x 부분에 대한 접근 권한이다. 이 값이 0 이면 others 에 권한이 풀리는 것이다. 유닉스 계정과는 달리 웹은 groups 는 others 로 변환이 가능하다. 따라서 권한 값이 0 이면 others 뿐만 아니라 group 에게도 권한이 풀린다. 이 값이 1 이상이면 others 에게는 잠긴다.

r,x 중에 x 는 필요가 없다. 실행(요약 정보 리스트)하는 부분에 대해서 차후에 기능이 필요할지 모르겠지만, 현제 시점에서 복잡하게 하는 것은 오히려 문제점을 만드는 것 밖에 안된다. 따라서 오직 읽기 권한 필드 'r' 에 대해서만 염두를 한다.
r 필드의 값은 '권한 등급' 값을 따른다. 즉, 0 의 값이면 아무나 비밀번호 없이 다 읽을 수 있다.

만약 개인의 비밀글이라면 아무도 못보게 관리자도 못보게 r 의 값을 30001 (3만 1)로 지정하면된다.

해당 정보(레코드)의 상위 카테고리가 회원 전용(또는 특정 등급 이상)으로 제한 해 버린다면, 글(레코드, 게시물) 개개별의 정보는 그 카테고리 자체의 권한을 통과해야 접근이 가능하다.

권한 체크는 각 모듈의 begin.php 에서 1차적으로 한다. 즉, 모듈 개발자가 권한을 직접 체크를 해야한다.
2차적으로 각 모듈의 스크립트 파일에서 체크를 할 수도 있다.


권한 체크를 할 때에는 미리 준비된 함수를 사용해야한다. 그래야 실수가 없다.
뿐만 아니라 데이터베이스에서 글을 가져올 때에도 미리 준비된 함수를 이용한다. 직접 데이터베이스 쿼리를 하다가 실수를 하는 경우가 발생한다.






[-] 카테고리와 글의 권한

2007/01/10 부터 적용이된다.

post.r 은 기본적으로 category.r 의 값을 가진다.

이렇게하는 이유는 글을 검색할 때, 사용자의 권한에 맞는 글만 보여주기 위해 category 정보를 살필 필요없이, 바로 post 테이블만 검색을 하면된다.

여기에는 다음과 같은 처리가 추가된다.

category.r 의 값을 변경할 경우, post.r 의 값을 같이 변경해줘야하는데,
이 때, category.r >= post.r 의 값만 category.r = post.r 로 update 해 준다.
즉, 카테고리의 읽기 등급을 변경 할 때, 해당 카테고리에 속한 글의 등급도 같이 변경해 주는데, 카테고리 보다 등급이 높다면, 등급을 그대로 유지 시켜준다. 예를 들면 비밀글이나 관리자만 보기 글이 그대로 유지되도록 하기 위해서 이다.











[-] 권한 등급 체크
2007년 1월 15일 적용된 내용들이다.

	-- 루트,슈퍼 관리자는 자기보다 낮은 등급의 사용자 등급을 변경할 수 있어야한다. 관리자를 임명할 수 도 있고 해제할 수도 있다.
	-- 관리자는 해당 카테고리에 대한 정보를 관리할 수 있어야한다.
	관리자 기능은, 한 게시판에 하나의 관리자를 임명하는 것이 아니라,
	관리자 한명이 게시판 전체를 관리하게 하고 또는 사용자 전체를 관리하게 하는 등 정보 영역별로 하나의 영역을 관리할 수 있게 한다.
		
	관리자 모드로는 슈퍼관리자 부터 진입을 할 수 있다. 슈퍼관리자는 홈페이지 정보에 대해서 모든 접근을 한다. 단, 시스템 자체에 대해서는 권한이 없다. 예를 들면 FTP 로 홈페이지 HTML 파일을 삭제한다거나 데이터베이스 비밀번호를 변경한다거나, 루트 관리자 아이디 변경한다는 등의 작업을 할 수는 없다.
		
	권한 체크는 다음과 같이 한다.
		<? root() or goBack(accessDenied, "you are not allowed to view this page"); ?>
		super() or go('?', "admin::begin you do not have permission.", accessDenied);
		admin() or checkUserAuthority();
		
	사용자(회원)의 등급 조정은 슈퍼 관리자 이상만 가능하다.
	사용자 등급은 사용자 영역의 관리자라고 하더라도 슈퍼 권한을 가진 사용자만 할 수 있도록 체크를 해야한다.
		

	관리자 화면은 스킨 파일을 두지 않는 것이 일반적이다. 스킨 파일을 사용할 때에는 left, right, header, footer 를 사용하지말고, mode.html 만 사용한다.
	-- @@since 2007/01/15 변경된 내용. 카테고리 관리자는 등급과 상관이 없이 지정될 수 있다.
	카테고리 관리자를 위해서 특별히 정보 파일을 만들고 매번 로딩하는 것은 부담이된다.
	그렇다고 시스템 관리 파일에 같이 둘수가 없다.
	그나마 user.manager varchar(255) 로 하는 것이 가장 부담이 적다. 다만, 관리를 하지 않는 유저의 경우 그냥 빈 empty 값이라는게 좀 걸린다. 그렇다고 별도로 테이블을 만들어서 액세스를 할 수도 없는 노릇이다.

	관리자 모드로 진입을 할 수 있는 사용자는 카테고리 관리자 이상이다. 카테고리 관리자, 슈퍼 관리자, 루트 관리자가 가능하다. 카테고리 관리자가 
		
		
		
2007년 1월 29일 적용된 내용

루트관리자, 슈퍼관리자, 관리자 이렇게 3가지 관리자에서 서브관리자가 추가되었다.
서브관리자는 카테고리 관리자라고도 하며 하나의 카테고리(정보영역, 예를 들면 자유게시판)에 대해서 정보를 관리할 수 있다.






[*] 카테고리


[-] 설정


각 카테고리는 카테고리 설정이 따로 있다.


[-] 카테고리 카테고리, ] 메뉴



카테고리는 정보 그룹의 분류이다. 카테고리에는 여러가지가 있다.

게시판, 쇼핑몰, 쪽지, 메모, 글 영역 등... 이러한 것들이 하나의 카테고리이다.

카테고리에는 카테고리 자체를 위한 카테고리가 있다.

default.php 에 아래와 같이 정의되어 있다.

	define('CATE_CATEGORY',			8);

이것은 중첩 카테고리를 표현할 때나 카테고리간의 계층, 또는 메뉴 등 카테고리 자체를 표현하고자할 때 사용한다.

쇼핑몰을 예를 들어, 하부 카테고리를 가지며, 상품도 가지는 경우는 쇼핑몰 카테고리이다.

상품을 가지지 않고 서브 카테고리만 가지게 하려면, 즉 메뉴로서만 동작하게 하려면 카테고리 타입이 카테고리이어야한다.


예를 들어 메뉴를 구성한다고 가정하자.


메인메뉴에 "홈페이지, PHP, MySQL" 과 같은 3개의 메뉴가 있고, 각각의 아이디가 "homepage, php, mysql" 이라면,

메인 메뉴를 "홈페이지"를 클릭하면, 펼쳐질 페이지를 homepage.html 로한다.


즉, 메뉴 카테고리의 아이디에 따라서 자동으로 "메뉴아이디.html" 이 되게하는 것이다.

물론 이에 대한 별도의 준비된 작업 루틴은 없다. 이론적으로 이런것이며 실제로 이와 같이 구현을 하면된다.


"홈페이지" 메뉴를 클릭하면 서브메뉴 "HTML, CSS, 자바스크립트" 3개를 펼친다고 가정을 할 때,

각 각의 카테고리 타입에 따라 CATE_BBS 이면 그냥 그 모듈로 링크를 걸면된다.

물론 메인 메뉴에서도 마찬가지이다.

메인 메뉴에서도 카테고리 타입이 BBS 이면 그냥 BBS 를 바로 보여주면되는 것이다.


다음과 같은 시나리오를 구성할 수 있다.

mainmenu							카테고리: 카테고리, 메인 메뉴 그룹
menu_homepage					카테고리: 카테고리, 부모 카테고리는 mainmenu 이다.
menu_php							카테고리: 카테고리, 부모 카테고리 mainmenu
menu_javascript				카테고리: 카테고리, 보무 카테고리 mainmenu

위에서 mainmenu 는 그냥 단순히 하위 메뉴 menu_homepage, menu_php, menu_javascript 를 그룹으로 묶기 위한 것이다.

mainmenu 에 속하는 3개의 카테고리의 카테고리 타입은 카테고리이다.

따라서 mainmenu 에 속하는 카테고리를 메인 메뉴에 나타낼 때, 카테고리 타입에 따라서 해당 모듈(또는 페이지)을 보여주면된다.

카테고리 타입인 메뉴는 해당 HTML 페이지를 나타내기 위해서 "?include=<?=$sd?>/<?=$categoryid?>.html" 과 같이 링크를 걸면된다.


카테고리 관리에서 menu_homepage 의 하위 카테고리로 lecture_homepage, lecture_html, study 3개의 게시판을 연결했다. 3개의 게시판 관리자 모드에서 부모 카테고리를 menu_hompeage 로 지정한 것이다.

이와 같은 경우, menu_homepage 에 해당하는 "홈페이지" 메뉴를 클릭하면, 해당 스킨 디렉토리에 menu_homepage.html 이 스킨 파일로서 사용이되며 여기에서 서브 메뉴로 lecture_homepage, lecture_html, study 에 해당하는 메뉴이름(카테고리,게시판)이 나타나면된다.



- 메인 메뉴는 항상 mainmenu 로 묶는다.
		parent 가 mainmenu 인 것은 주 메뉴에 속한다.
		
- 메인 메뉴에 속하는 메뉴는 "메뉴아이디.html" 파일이 사용되도록 include 링크를 한다.
		parent 가 mainmenu 인 카테고리 menu_community 를 생성했다면,
		자동으로 menu_community 에 해당하는 메뉴 이름이 표현되며
		클릭이 되면, menu_community.html 이 포함되게한다.
		
- menu_community 를 parent 로 하는 서브 메뉴를 여러개 생성한다.
		또는 존재하는 게시판의 부모 카테고리를 menu_community 로 한다.
		
- 게시판이 클릭되었을 때, 현제 게시판이 어느 메뉴에 속하는지 판단을 할 수 있다.
	하지만, 메뉴를 클릭했을 때, 이 메뉴가 어디 메뉴에 속하는지 또는 어떤 하위 메뉴를 가지는지 알 수가 없다.
	왜냐하면 "?include=<?=$sd?>/<?=$categoryid?>.html" 과 같이 링크를 걸면, 단순히 include 만 하는지
	아니면 메뉴를 포함하는 include 인지 알 수가 없다.
	따라서 cid 변수에 카테고리 아이디를 같이 넘긴다.
	즉, "?cid=<?=$categoryid?>&include=<?=$sd?>/<?=$categoryid?>.html" 와 같이 링크를 걸어야한다.
	그리고 게시판이 클릭되면, cid 변수에 카테고리 값을 넣어야한다.
	즉, 메뉴에서 서브 카테고리가 있는 메뉴는 cid 를 가져야한다.
	-- 메인 메뉴에 게시판 메뉴가 클릭되면 서브 카테고리가 없으므로 cid  값이 없다.
	-- 서브 메뉴에는 상위 cid 를 직접 만들면된다.

- 메뉴를 표현할 때에는 아래와 같이 클릭시 행동을 아래와 같이 표현한다.
	-- 카테고리 아이디 mainmenu (또는 다른 아이디일 경우 직접 지정) 의 하위 카테고리를 메인으로 표현한다.
	-- 클릭시 이동 페이지를 type=CATE_BBS 이면 게시판으로 type=CATE_MALL 이면 상품 리스트를 할 수 있도록 한다.
		--- 이와 같이 하면, 서브메뉴로 게시판, 쇼핑몰 등이 혼합되어 사용될 수 있다.
	-- etc 에 값이 있을 경우, URL 주소이다. 따라서 이 주소로 이동하게한다. 예를 들어 etc 의 값이 "?cate=mall&mode=order" 이면 장바구니로 이동을 할 것이다.
	-- 어떤 동작을 해야하는지 명확하지 않은 경우, include 형식으로 "아이디.html" 과 같이 HTML 파일을 포함하게한다.


이와 관련된 예제 소스는 아래를 참고한다.
	- skin/blue.ky.v1/header.html
	- plugin/menu




- 시나리오 예1.
	메인 메뉴를 클릭하면 기본적 게시판이 나타나고, 서브 메뉴에 그 기본 게시판이 나타나도록 하는 방법

	-- 메인 메뉴에 "질문과 답변"을 나타나게한다.
		메인 메뉴 카테고리의 자식으로 카테고리를 생성
	-- 메인 메뉴를 직접 클릭 하면, "질문과 답변" 게시판이 열린다.
		etc (기타)에 ?qna 로 지정
	-- 서브 메뉴에는 맨 위에 "질문과 답변" 이 나오고
		그 아래로 서브 메뉴 "PHP 질문과 답변", "HTML 질문과 답변"이 열린다.
		
		
- 시나리오 예2.

	하나의 게시판을 여러 메뉴의 서브메뉴로 나타나게하기.
	
	-- 아이디를 alias_qna 로 하고 이름을 "질문과답변", 부모 아이디를 메인메뉴의 카테고리로
			etc 에 "?qna" 로 하면,
	-- "질문과답변" 게시판을 다른 서브 메뉴에 나타나게할 수 있다.
	









[-] 메뉴 작성법 2번째

메뉴를 자동화한다는 것이 쉽지가 않다.

이미지나 플래시를 자동으로 생성할 수 없다면, 자동화의 의미는 크게 줄어든다.

따라서 우선 수동으로만 처리를 한다.

데이터베이스와 전혀 상관이 없이, include 만으로 간단하게 처리를 하는 방법에 대해서 설명한다.

커뮤너티와 강좌, 프로젝트 와 같이 주 메뉴가 있다고 가정할 때에 아래와 같이 링크를 작성할 수 있다.

	include=skin/v2/menu_community.html
	include=skin/v2/menu_lecture.html
	include=skin/v2/menu_project.html

하지만, 이와 같이 include 를 통해서 메뉴를 구성하는 것은 한계가 있다. 특히, 게시판을 클릭했을 때,
현제 게시판이 어디의 메뉴의 것인지 알수가 없다.

이때문에 메뉴 카테고리를 작성하는 것이다.




















[*] 테이블 정보의 수정과 URL 링크

모든 URL 에는 아이디를 사용하지 않고, 정보의 번호를 사용한다.

URL 등에 아이디를 사용하면, 다음과 같은 문제가 발생할 수 있다.

다른 사이트에서 링크를 걸어두었는데, 그 링크의 URL 에 카테고리 아이디가 포함되어 있을 경우, 카테고리 아이디 변경으로 인해서 그 URL 이 유효하지 않는 경우이다. 뿐만 아니라 내부적으로 링크를 사용할 때 이와 같은 문제가 발생할 수 있다.
프로그램 내부에서는 자동으로 URL 링크를 만들지만, 수동으로 할때에는 어쩔 수 없이 카테고리 아이디를 사용해야한다. 하지만 수동으로 사용할 때에는 이런 URL 링크가 변경될 위험 부담이 적으며, 또 카테고리 아이디 자체는 잘 변경되지 않는 성질의 것이다. 뿐만 아니라 내부적으로 카테고리 아이디가 변경되어 URL 이 잘 못되었을때에는 그냥 메인 페이지를 보여주면된다.

결론적으로 카테고리 아이디는 변경을 할 수 있도록 허용한다.







[*] 시스템 환경 설정 정보 파일

system 이라공 명칭한다.

system.newDate 는 해당 데이터가 새로 작성된 데이터인지 그 시간 범위를 시간 단위로 지정한다.
예들어 system.newDate = 10 일 경우, 10 시간 이내에 작성된 정보는 새로운 정보로 인식을 한다.





[*] 아이디

아이디는 변경이 가능하다.
255 글자까지 표현 가능하며 영숫자, 한글등이 사용 가능하다.

다음과 같은 규칙이다.

- 255 글자 이하,
- 문자가 1개 이상 포함되어야 함.
- 특수 기호 안됨

위 규칙은 validID('id', level=2)와 같이 레벨 2 의 아이디 규칙 이며, 한글이나 외국어가 사용가능하다.

자세한 정보는 validID 함수를 참조한다.






[*] 비밀번호
비밀번호는 글자수는 관리자 모드에서 관리자가 임의적으로 설정을 할 수 있다.
심플 간단 사이트는 4자 이상.
제대로 하려면 6자 이상으로해야한다. 6 글자 이상이어야 비밀번호 매칭 공격을 피할 수 있다.

최대 255 글자 까지 입력이 가능하다.









[*] 모듈

모듈은 플러그인, 애드온과 같은 용도로 해석될 수 있으며, 메인 프로그램에 새로운 기능을 추가하는 것을 말한다.

모듈 작성의 좋은 예제로서 memo 모듈을 참고하기 바란다.
만약 모듈을 직접 작성하고자 하는 경우 외에도 시스템의 이해나 수정이 필요할 경우에 memo 모듈은 시스템 내부 동작을 이해하는데 많은 도움이 될 것이다.
그리고 아주 간단한 모듈의 예제로서 system 이 있다. system 모듈은 시스템의 기본 정보를 관리한다.



모듈을 작성할 때 무엇보다 중요한 점은 미리 준비된 함수(라이브러리)를 사용하는 것이다.
물론 모듈 작성 규칙을 지키는 것도 중요하지만, 미리 준비된 함수를 사용하면 이러한 보다 편리하게 코딩이 가능하며 이러한 규칙을 확실히 지키는 길이된다.






각 모듈에서 필수적으로 갖추어야할 사항은 다음과 같다.

디렉토리
	module/이름/

필수파일
	README				// 기본 설명 파일
	info.php			// 모듈이 가지는 기본 정보를 리턴한다.
	admin.php			// 모듈을 관리할 관리자 스크립트이다. 관리자 모드에서 이 스크립트로 연결이되며 나머지는 알아서 해야한다.
	index.php			// 모듈의 메인 페이지

	begin.php			// 필요한 각종 설정을 하는 스크립트. 변수/함수 초기화, 각종 전처리 및 에러체크, 권한체크 등 등을 하는 곳이다. (파일이 존재하지 않으면 무시된다.)
	end.php				//


스킨 파일은 기본적(반드시)으로 default 스킨을 제공해야한다.
스킨에 관한 내용은 스킨 구조를 참고하기 바란다.



모듈 작업을 할 때에는 디버깅 옵션을 체크하고 하기바란다. 많은 도움이 될 것이다.






** README 파일 (필독,공지 등의 역활)

README 파일은 해당 모듈의 필수 정보를 가지고 있는 파일이다.

저작권 표시 부터 모듈의 명칭, 버젼, 연락처, 설치, 사용 방법, 스킨 디자인 방법 등을 기록해 놓으면 된다.
info.php 에도 저작권과 관련된 내용이 기록된다. 이 경우에는 간략하게 서술하고 info.php 를 참고하라고 한다.

README 파일에는 단순히 저작권, 명칭, 버젼과 같은 내용 뿐만 아니라, 모듈의 전체적인 기능 설명과 사용상이나 수정작업시 주의점이나 도움말 등을 기록할 수 있다.






** 관리자 스크립트 설명



각 모듈 디렉토리에는 admin.php 가 있다.
이 스크립트는 모듈 정보를 관리하는 스크립트로서 '관리자 스크립트'라 부르며 독자적으로 수행이 된다.

각 모듈의 관리자 스크립트는 해당 모듈의 전체 정보를 관리할 수 있어야한다.
뿐만 아니라 관리자 권한이 있는지 준비된 함수를 통해서 체크를 해야한다.


메모장이라는 라는 새로운 모듈 'memo' 를 작성할 경우 module/memo 디렉토리가 그 정보 작업 관련 소스 스크립트가 위치하는 곳이다. 이 디렉토리에 admin.php 가 존재해야한다. 즉, 파일의 경로는 module/memo/admin.php 가 된다.
memo 모듈의 관리자 스크립트가 실행되기 위한 URI 는 ?cate=memo&mode=admin 이다.

관리자 모듈에서 메모 모듈의 관리자 스크립트를 실행할 때에는 단순히 iframe 이나 새창을 띄워서 사용을 한다. 물론 직접 ?cate=memo&mode=admin 과 같이 웹브라우저로 접속을 해도 상관이 없다.
일단 메모장 모듈의 관리자 스크립트가 제어권을 가지면 그 다음 부터 모든 작업은 관리자 스크립트가 알아서 해야한다.



[-] 모듈 정보 스크립트

info.php

$info['copyright']			= 모듈의 저작권 표기
$info['author']					= 작성자
$info['email']					= 연락처
$info['homepage']				= 홈페이지 (옵션)
$info['phone']					= 전화번호 (옵션)
$info['name']						= 모듈 이름
$info['version']				= 모듈 버젼
$info['description']		= 모듈 설명
$info['menu']						= 메뉴에 표시될 이름 (생략하면 모듈 이름이 표시됨)
$info['order']					= 메뉴에 표시될 순번 

order 값은 낮을 수록 메뉴가 위에 표시가된다.
따라서 중요한 모듈이 위로 올 수 있도록 가능하면 order 값을 높여서 기록을 한다.

1~4			시스템 모듈
5~7			일반 모듈에서 중요하다가 판단이 되면 5~7 사이의 값을 지정한다.

스킨이나 모듈, 업데이트, 백업 등과 같이 시스템적인 모듈은 1~4 사이의 값을 가진다.
쪽지, 메모장과 같은 모듈은 일반 모듈로서 5 이상의 값을 가진다.
생략하면 9 의 값을 가지며 맨 밑에 표시가된다.



만약 info.php 파일이 생략되면, 관리자 화면에 나타나지 않는다. 따라서 관리자에 의해서 관리될 필요가 없는 모듈이라면 info.php 를 생략하면된다. info.php 가 생략이되면 admin.php 가 작성될 필요가 없으며 관련 스크립트 파일도 필요가 없다.




새로운 모듈을 작성할 때에는 존재하는 라이브러리를 잘 활용해야한다. 예를 들면, 새로운 글(게시물이나 메모 내용 등)을 기록하기 위해서 직접 DB 쿼리를 할 필요가 없다. 이미 존재하는 함수를 이용하면된다. 자세한 내용은 공식 사이트의 문서화 링크를 참조바란다.





[-] begin.php 와 end.php

이 두 스크립트는 각 모듈의 처음과 끝에서 실행이된다.
주의 점은 @@ 표현으로 에러 메세지를 화면에 나타내지 않는다. 따라서 에러가 있는지 없는지를 판별하기가 쉽지 않다.




[-] 모듈 설치 스크립트

스크립트 파일 명칭은 install.php 이다. module/memo/install.php 에서 모듈 설치에 대한 좋은 소스를 볼 수 있다.


모듈을 다운로드 한 후 설치를 위한 스크립트이다. 예를 들면, 모듈의 정보를 위해서 새로운 카테고리의 생성이 필요할 수 도 있다. 이러한 작업을 하기 위해서 install.php 가 이용된다.
관리 스크립트(admin.php 또는 그 스킨 파일)에서 install.php 로 url 링크를 걸어야한다.
물론, 설치 과정이 필요가 없다면, install.php 파일은 작성하지 않아도 되며, 관리자 모드로 부터 연결을 할 필요가 없다.




모든 모듈에서 다루는 글(문서)은 post 테이블에 내용을 보관해야한다.

post 테이블에 카테고리를 기록해서 데이터 영역을 지정할 수 있고, 카테고리별, 레코드별로 권한 제어를 할 수 있다. 자세한 것은 해당 항목을 참고하기 바란다.

모듈을 처음 설치를 할 때에는 모듈에서 다루는 정보의 초기화가 필요하다.

다음과 같은 작업을 해야한다.

1. 모듈에서 다루는 정보의 카테고리를 정해서 category 테이블에 추가를 해야한다. 준비된 함수를 이용
2. 설치된 정보가 올바른지 체크한다.


추가하려는 모듈의 카테고리 아이디는 "module.모듈 이름" 으로 한다.

이것은 새로운 카테고리를 category 테이블에 추가를 할 때, 추가하려는 카테고리 아이이와 동일한 것이 존재할 수 있어서 이를 피하기 위해서이다. 따라서 "module.memo" 와 같이 카테고리 아이디를 만들고 category 테이블에 추가를 한다. 이 때, 카테고리 아이디로 이미 "module.memo" 가 존재할 수 있다. 이 경우를 대비해서 미리 에러 체크를 해야한다.


install.php 의 스킨은 사용하지 않는 것을 원칙으로한다. 물론 꼭 필요한 경우 스킨 파일을 작성해도 된다.
install.php return 을 할 때, return array('0000000'); 과 같이 하거나 아니면 자바 스크립트를 사용해서 바로 관리자 화면으로 이동하게 한다.



** 모듈은 설치 과정을 진행할 수도 있고 그렇지 않을 수도 있다.
따라서,  설치된 모듈 리스트. 설치 가능한 모듈 리스트를 추출하기가 쉽지 않다.


모듈의 설치와 제거 스크립트의 파일 명칭은 install.php uninstall.php 로 한다.

모듈의 설치와 제거는 추가 스크립트와는 틀리다. 추가 스크립트는 매번 프로그램이 실행될때 그 시작과 끝에 특정 코드가 실행되도록 하는 것이다.




[-] 모듈 스킨

처음 모듈을 작성해서 배포를 할 때에 기본적으로 사용되는 스킨 파일을 지정하기가 애매할 경우가 있다.

대부분의 경우, skin/default 나 skin/template 에 스킨을 저장하면 되지만, 필요한 경우, 직접 모듈 디렉토리에 저장을 해야할 것이다.

이 경우, module/mymodule/template.html 과 같이, 파일 이름을 template.html 으로 고정을 한다.

사용자는 모듈의 기본 스킨을 포함하기 위해서 include 'module/mymodule/template.html' 과 같이 명령해야한다.


물론, 모듈 스킨이 cate.mode.html 의 형식을 띄는 경우에는 반드시 해당 스킨 디렉토리에 스킨 파일이 저장되어야할 것이다.







[-] 모듈 추가 스크립트

모듈의 추가 스크립트는 프로그램의 시작 단계에서 실행(준비되는 함수 등)되는 코드를 작성하는 것을 말한다.

예를 들면, 스킨의 수정 작업이 없이, 그냥 모듈의 설치만으로 동작을 하게 하려면, 이와 같은 방식을 통해야한다.




module/backup 에 좋은 예가 있다.
admin.php, install.php, uninstall.php, endup.php 를 살펴보면된다.





** 모듈의 설치 과정은 여러 가지가 있다.
** 모듈의 설치는 반드시 준비된 함수를 통해야한다.
** 테스팅, 디버깅. 추가 스크립트의 테스트(디버깅) 작업은 쉽지가 않을 것이다.
테스트 작업을 할때에는 module/backup/endup.php 를 바로 실행해서 한다.
왠만해서는 데이터베이스 쿼리를 직접 작성하고 쿼리하지 않는다.
준비된 함수를 통해서 DB 액세스를 한다. 이것이 차후 시스템 내부구조가 바뀌더라도 모듈이라든지 각종 코드가 호환될 것이라는 최소한의 보장인 것이다.

module/backup/endup.php 을 보면 default.php 를 인클루드한다.
즉, 웹브라우저로 바로 module/backup/endup.php 를 접속해서 관련 코드를 다 작성한 다음, index.html 로 접속해서 테스트를 해 보는 것이다.

** 추가 스크립트는 스크립트 자체가 함수내에서 include 된다. 즉, $system 과 같은 전역 변수를 사용하기 위해서는 global 화를 해야한다.








카테고리 정보를 사용하는 모듈 설치는 setModule 를 통해서 설치를 해야한다.

특정 모듈내에서만 동작하는 것이 아니라, 전체 기능에서 동작을 해야하는 경우가 있다.
이때는 작성한 스크립트가 프로그램의 맨 처음이나 맨 나중에 실행되어야할 것이다.

예를 들면, IP 차단이나, 압축 전송, 또는 모든 스킨에서 사용 가능한 변수 지정등에서이다.



이 경우에는 다음의 함수를 이용한다.

	installBegin();
	installEnd();
	beginScript();
	endScript();
	uninstallBegin() uninstallEnd()

예를 들어, 특정 IP 를 차단하는 모듈(기능)을 추가하고 싶다면, 스크립트의 맨 처음 시작 부분에 해당 코드가 실행이 되어야할 것이다. 이럴 때, 모듈 설치를 진행해서 installBegin() 를 통해서 원하는 코드가 프로그램 시작 부분에 실행되게할 수 있다.

installBegin('check'); 와 같이 호출을 하면 자동으로 현제 모듈의 check.php 가 실행된다. 매번 check.php 가 실행되는 것이다.
예를 들어 ip_block 라는 모듈에서 installBegin('check') 와 같이 호출하면 ./module/ip_block/check.php 가 프로그램이 맨 처음 시작할 때 실행된다.

installBegin() 함수를 통해서 설치 과정을 진행하는 모듈은 반드시 제거 과정을 제공해야한다.
즉, 원하지 않을 경우, 제거를 할 수 있어야한다. 이것은 uninstallBegin() uninstallEnd() 으로 각각 해제를 할 수 있다.



모듈 추가 스크립트는 installBegin, installEnd 함수로 추가되어 실행되는 것을 말한다.


	begin module/block/startup.php
	end module/block/endup.php
	end module/log/endup.php


추가 스크립트 정보는 위와 같은 설정 형식으로 데이터저장소/scripts.php 에 보관된다.

** 주의: 추가 스크립트들은 모듈내에 있는 begin.php, end.php 와 연관되지 않는다. 위에서 예로든 ./module/ip_block/check.php 는 매번 실행이되는데에 반해서 ./module/ip_block/begin.php 는 ip_block 모듈이 실행될때에만 같이 실행되기 때문이다.

** 주의: 관리자가 추가 스크립트를 설치할 때에, 왜 이 동작을 하는지에 대해서 반드시 무엇때문에 하는지에 대해서 설치 페이지에 자세한 설명이 있어야한다.



** 추가 스크립트 작성시 주의할 점

기본 변수나 객체를 변형시켜서는 안된다.

추가 스크립트 내에서 데이터를 웹브라우저로 출력, 또는 실행 종료 등의 작업을 할 때에는 프로그램 실행 구조를 잘 알아야한다.

본 시스템에서는 PHP 스크립트 부분에서는 웹브라우저로의 출력을 하지 않는다는 것이 원칙이다. HTML 데이터 출력은 스킨에서 이루어지며, PHP 에서 직접 출력을 할 경우, 출력한 다음 자체적으로 종료를 하는 것이 원칙이다.

추가 스크립트는 스크립트 자체가 함수내에서 include 된다. 즉, $system 과 같은 전역 변수를 사용하기 위해서는 global 화를 해야한다.



** 추가 스크립트 실행 방식

installBegin, installEnd 함수를 통해서 추가 스크립트를 실행할 수 있도록 등록한다.
uninstallBegin, uninstallEnd 함수를 통해서 등록된 추가 스크립트를 제거한다.

등록은 ./file/scripts.php 설정 파일에 배열 형식으로 데이터를 기록을 함으로
서 이루어진다. 관련된 모듈 스크립트의 경로가 저장된다.

프로그램이 실행될 때, ./file/scripts.php 를 읽어서 begin 부분에 실행되어야할 스크립트를 (함수 내에서) 인클루드한다. end 부분에 실행되어야할 스크립트는 맨 마지막에 인클루드한다.

hasScriptInstall 는 특정 스크립트가 추가 스크립트로 등록이 되었는지 체크할 수 있다.







** 추가 스크립트 실행 지점

default.php 가 로드된 직후에 installBegin 으로 등록된 스크립트가 실행된다.
프로그램(스크립트)의 맨 마지막에 installEnd 로 등록된 스크립트가 실행된다. 맨 마지막이라면, 모든 스킨이 출력되고, 그리고 디버깅 메세지가 출력되고 ... 등등 모든 작업이 다 끝난 실행의 맨 끝 지점을 말한다.

실행되는 스크립트는 함수내에서 인클루드된다. 함수내에서 인클루드 된다는 것과 그렇지 않은 것과의 큰 차이점은 전역 변수의 사용이라 하겠다.

필요한 기본 변수는 모두 global 지시자 또는 $GLOBALS 변수를 통해서 접근해야한다.






** 추가 스크립트는 에러 표시가 나지 않도록 @@include 를 통해서 인클루드된다.
물론 debug 모드에서는 에러표시가 나도록 그냥 include 를 한다.
따라서 모듈(기능) 작성을 할 때에는 디버그 모드로 하도록 한다.







** 추가 스크립트 예제는 block 모듈과 output_compress 모듈을 참고하기 바란다.



** @@since 2007/01/11 추가 스크립트의 파일 이름은 startup.php, endup.php 로 정한다.




[*] 추가 스크립트에서 범용 함수 작성

startup.php 에서 작성하는 함수는 매번 스크립트가 실행될때마다 실행이된다.
따라서 여기서 작성하는 함수는 범용(전역) 함수가 된다.

예를 들면, 실시간 사용자 정보를 표현하는 함수를 작성할 때, startup.php 에 display_connectors() 와 같이 작성을 해 놓으면 어디서든지 display_connector() 를 통해서 사용할 수 있다.
물론 함수의 호출은 직접적으로 display_connector() 와 같이 하지 않고, display('connectors'); 와 같이 한다.module/connectors/startup.php 에서는 display_connectors() 함수가 없다면 내부적으로 에러 처리를 하기 위해서이다.
인자의 전달은 display('connectors', associative-array); 와 같이 값을 전달한다.











[-] 모듈 작성 정보

post.idx_category, post.idx_user, post.r,w,x,s 와 같은 정보를 설정을 해야한다.
자세한 것은 해당 항목을 참고하기 바란다.





아래와 같이 하면 스킨을 사용하지 않는다. (단, layout.html 스킨 파일은 사용된다.)

	<?php
		return array('0000000');
	?>

아래와 같이 exit 를 이용해서 실행을 종료하는 방법은 가급적이면 피한다. 스크립트 파일 자체에서 종료를 하는 것은 나머지 작업이 생략되게 된다.

	<?php
		exit;
	?>


go, goback 과 같은 함수는 내부적으로 종료를 한다. 따라서 아래와 같이 하면 스크립트 내에서 종료하는 효과가 있다.

	<?php
		go("?");
	?>

이 와 같은 경우 end.php 나 기타 스크립트가 실행이 안된다. 그러므로 가급적 사용을 제한하고 return output(0); 을 이용한다.

XML 이나 파일 자료를 웹브라우저로 출력하는 경우, 또는 layout.html 과 같은 스킨 파일 자체가 로드되면 않아야하거나 디버깅 메세지가 출력되면 안되는 경우에는 return output(0); 과 같이 한다.

return output(0); 는 스킨과 디버깅 메세지 관련 코드 및 화면(웹클라이언트)으로 출력하는 모든 내용의 코드를 if 문으로 건너뛴다.



return array('000000'); 는 스킨을 로드하지 않을 뿐, 레이아웃 파일과 같은 것은 로드를 한다.
레이아웃 파일에는 HTML 주석문 장이 존재할 수도 있다.

실제로 스크립트 파일에서는 아래와 같이 리턴할 수 있다.




	
	
	return array('0000000'); 일 경우 layout.html 을 인클루드한다. 따라서 두번째 요소값을 통해서 명시적으로 로드하지 못하게 하는 것이다.

참고: [*] 스킨 로드









[-] 모듈 정보 저장 장소


새로운 모듈을 작성하고 그 정보의 저장은 어떻게 해야할까? 물론 임의적으로 데이터베이스 테이블을 생성해서는 안된다.

정보의 저장은 준비된 함수를 통해서 해야한다. 준비된 함수로 할 수 없는 일이라면, 해서는 안된다. 임의적으로 정보 저장소를 건드리는 것은 차후 업데이트나 부가적인 작업시 많은 걸림돌이 될 수 있다. 꼭 필요하다면 기능 요청을 공식 사이트로 요청을 해야한다.



모듈이 파일 업로드와 관련한 정보를 다룬다면, 엮시 준비된 함수를 통해서만 작업을 해야한다. 데이터의 일관성이 유지되어야만 안전하게 사이트를 유지할 수 있다.



우선 모듈에 맞는 모듈의 카테고리를 작성해야한다. 이것은 module 라이브러리를 통해서 손쉽게 해결을 할 수 있다. module 라이브러리는 category 라이브러리를 모듈에 맞도록 함수의 명칭 변경을 한 정도 일 뿐이다. 직접적으로 category 라이브러리를 이용해도 상관이 없다.

준비된 함수를 통해서 카테고리 설정을 할 수 있다.
그리고 모듈을 이용할 사용자를 정할수 있다. 이 엮시 준비된 함수를 이용하면된다.

물론 글을 저장하는 것이나 수정, 변경 등은 준비된 함수를 이용해야한다.



이와 같이 새로운 모듈을 추가(작성)한다 하더라도 직접 데이터베이스에 접근을 해서는 안된다.
이것은 작업을 어렵게 할 뿐만 아니라, 데이터 보관의 일관성을 깨뜨리는 일이다.


모듈의 정보를 저장할때에 데이터베이스가 아니라 파일에 정보를 기록해야하는 상황이 발생할 수 있다.

이 경우 ./file/module 디렉토리에 모든 파일이 보관된다. ./file 디렉토리는 위치 변경이 가능하다. $system['repository'] 변수의 값을 따라야한다. default.php 에는 이와 관련하여 미리 module_repository 상수가 정의되어 있다. 따라서 모듈에서 block_list_ip.log 파일을 액세스하고자 한다면, module_repository.'/block_list_ip.log' 와 같이 경로를 잡아야한다.




** 모듈의 설정 파일

./file/module/모듈이름.conf 으로 정한다.
./file 의 위치는 임의적으로 변한다.

따라서 다음과 같이 파일 경로를 만든다.

$file = module_repository.'/output_compress.conf';

모듈의 설정 파일 형식은 설정 형식이다.

따라서 readAs, writeAs 함수를 통해서 설정 값을 액세스해야하며, 입/출력 변수는 연관배열이어야한다.

이 모든 과정을 간편히 한 함수가 준비되어있다. 사용 빈도가 높은 함수리라 생각을 해서, 우선 default.php 라이브러리에 넣었다. 차후 이동 가능성이 있다.

readConf, writeConf 가 그 함수들이다. 자세한 내용은 관련 문서를 참고하기 바란다.






** 모듈의 전달 값 변수.
모듈의 전달 값 변수는 여러가지 일수도 있고, 임의적으로 개발자가 지정을 한다.
만약, 모듈에 한가지 특정 옵션이 필요한 다면, 이때에 사용하는 HTTP 변수명칭을 attr 로 하기를 권장한다. 다음과 같다.

	?cate=memo&mode=read&attr=value
	
다른 개발자가 위 URL을 보고, attr 변수가 있으니, module/memo/read.php 에서 $ui['attr'] 를 바탕으로 어떤 한가지 옵션 처리를 하는 구나 하고 짐작을 할 수 있다.

















[-] 스크립트와 스킨


스킨은 메인 시스템에서 자동으로 로드한다. 하지만 각 스크립트 파일에서 스킨을 로드할 지 말지를 결정할 수 있다. 각 스크립트에서는 리턴 값으로 배열을 리턴한다. 첫번째 항목에 스킨을 로드할지 말지를 결정하는 값이 들어간다.

하나의 스크립트에 사용되는 스킨은 총 7개 이다. 스킨 정보 항목을 살펴보기바란다.

5자리 문자열로서 "11100" 과 같이 표현될 수 있다.
순서대로 header, 카테고리.header, 스킨, 카테고리.footer, footer 스킨 파일들을 나타낸다.
각 위치의 문자열의 값이 1이면 해당 스킨을 로드한다.

return array('1110000'); 과 같을 경우 header, 카테고리.header, 스킨 파일들을 로드한다.
"0000001" 이면 footer 스킨만, "1001001" 이면 header, 스크립트 스킨, footer 만을 로드한다.

스크립트의 리턴값이 없으면 그냥 스킨을 다 로드한다.

특히 관리자 스크립트를 작성할 때에는 return array('0001000'); 와 같이 해서 헤더,풋터를 다 없애고 꼭 필요한 정보만 이용하여 스킨의 크기를 최대한으로 줄인다. 관리자 스크립트는 관리자들에 의해서 실행이 되며, iframe 으로 페이지내에 포함되어 질 수 있다.


[-] 모듈의 스킨

스킨 디렉토리의 구조를 보면 하나의 디렉토리에 스킨을 구성하는 파일들이 저장되어있다.
모듈 스킨 파일들도 이곳에 저장이된다.
모듈을 배포할 때, 기본 스킨을 같이 배포를 해야한다. 모듈 설치 과정에서 이 스킨 파일들은 default 스킨 디렉토리에 자동으로 복사가 되게해야한다.

default 디렉토리는 각 스킨 디렉토리에 해당 스킨 파일이 없을 경우 기본적으로 사용되는 디렉토리이다.

즉, memo 모듈을 설치하는 과정에서 스킨 파일들을 skin/default 디렉토리에 넣게하면된다.
사용자가 simple 스킨을 사용하고 있다면, memo 관련 스킨 파일은 존재하지 않을 것이고 그렇게 되면 default 디렉토리에서 스킨 파일을 구하게 되는 것이다.







[-] 모듈의 제거

필요한 경우 모듈의 제거 스크립트를 작성해야한다. 모듈의 제거 과정은 설치와 반대의 과정이면 올바를 것이다.


- 파일 명칭은 uninstall.php 로 한다.
- 관리자에서 직접 링크를 걸어서 사용한다.
- category 라이브러리의 deleteCategory() 함수를 이용해서 모듈의 카테고리 정보를 삭제한다.

이와 비슷하게 백업이나 기타 스크립트를 작성해서 관리자 모드에서 직접 연결시켜 이용을 하도록 응용할 수 있다.




[-] 모듈의 기본 변수 이용과 기본 변수 설정

각 모듈마다 정의해야하는 변수리스트. 이러한 변수들은 begin.php 에 정의하는 것이 적당하다.
- $page_title 값에 적당한 값을 지정해야한다.
이 변수는 페이지 제목을 가진다. 구분이 필요한 경우 "::" 를 사용한다. 예를 들면 bbs/begin.php 에서 "게시판이름"을 지정해 놓고, bbs/read.php 에서 "게시판이름::글제목" 과 같이 할 수 있다.

실제로 다음과 같이 사용을 할 수 있다.
<?=$system[name]?>::<?=$page_title?>



[5] 관리자 모듈


관리자 영역도 하나의 모듈이다. 따라서 모듈 구조의 규칙을 따라야한다.

관리자 모듈에서는 각 모듈의 관리자 스크립트를 연결하는 역활을 한다. 단순히 링크를 걸거나, 새창으로 띄우기 또는 iframe 으로 연결하면된다.


각 모듈의 정보는 모듈 관리자 스크립트가 모두 도맡아서 처리를 하므로 관리자 모듈에서는 시스템 자체에 대한 관리를 하면된다. 예를 들면, 새로운 버젼 업데이트 사항이나, 설명 문서, 질문과 답변등의 처리이다.


원격에 있는 데이터를 끌어오는 것은 무조건 Site Open API 를 사용한다.










[*] 업데이트 모듈과 패치 모듈

관리자 모드에서 자동으로 업데이트와 패치가 있는지 체크를 해서 다운로드 할 수 있도록 옵션한다.

Site Open API 를 통해서 정보 교환을 한다.


설치는 계정 관리자 모드에서 직접 해야하도록 한다.





[*] 기본 데이터

설치시 기본적으로 제공되는 데이터





[*] 검색 모듈


검색 모듈 하나로 전체 데이터를 검색한다.

기존의 모듈에는 따로 검색 기능이 없다. 즉, 예를 들면, 회원 검색이나, 게시판 검색, 개인 메모장 검색 등의 기능이 없다.

검색 기능 자체를 모듈 규격에 따라 모듈화 해야하며, 개인정보의 검색의 경우 권한이 있는 경우에만 검색이 가능하다. 예를 들어 비밀글이나 개인 메모장같은 경우 본인의 글만 검색 가능하다.






[*] 문서화의 규칙

소스 스크립트를 작성할 때에 지켜야할 코딩 기술 법과 주석문 처리 및 문서화의 규칙이 있다.







[*] 기본 리스트 갯수

관리자 설정에서 지정하며, numberOfRecords 상수에 값이 보관된다





[*] 글 관련 작업

준비된 라이브러리가 있다. 반드시 이 라이브러리를 통해서 작업을 해야한다.





[*] 스킨

버젼 0.5 부터 스킨의 레이아웃이 바뀌었다.
기본 내용은 그대로이다. 각 스킨 디렉토리에서 layout.html 을 통해서 스킨 파일의 배치를 직접 수정할 수 있도록 했다.

기존에는 레이아웃이 테이블로 고정되어 있었는데, 원한다면 수정이 가능하다.


스킨의 변경은 시스템 관리자 모드에서 지정을 할 수 있다.
또는 URL 창에 직접 값을 입력하여서 스킨을 지정할 수 있다.
URL 창에 직접 값을 입력하는 경우는 스킨이 이상해져서 관리자 모드로 진입이 어려운 경우나
또는 스킨을 실시간으로 변경을 하기 위해서 사용되기도 한다.



[-] 스킨 선택

개인 사용자 별로 자신이 맘에 맞는 스킨을 선택할 수 있다. 메인 사이트 스킨, 블로그 모듈 스킨 등.
특히, 외국인에게는 영문 사이트를 보게할 수도 있다.




[-] 스킨 정보

README 파일에 기록이된다.

스킨내에 특정 모듈 스킨이 존재하는지의 체크는 해당 모듈의 스킨 파일이 존재하는지 검사하는 것으로 한다.
예를 들어서 simple 스킨에 블로그 관련 스킨 파일이 존재하는지 알아보려면,
skin/simple/blog.index.html 이 존재하는지 검사를 하면된다.

블로그에서는 개인 마다 스킨을 따로 할 수 있는데, 사용가능한 블로그 스킨의 리스트하고 사용자가 선택하게 할 때에는 README 파일이 존재하고 블로그 관련 스킨 파일이 있는지 살펴보면된다.


메인 스킨의 조건은 README 파일이 존재하고, index.html 파일이 존재해야한다.




[-] 스킨 로드


각 "카테.모드" 스크립트 파일에서 return array("0001111"); 과 같이 스킨 인클루드 표시를 한 경우에는인클루드 또는 비 인클루드를 한다.

신경을 써야할 부분은 옵션 처리로 스킨을 로드해야하는 것과 하지 않아야하는 것이다.
그것은 "카테.left.html" 과 '카테.right.html' 두가지이다.
이 두 파일은 return array('0010100'); 과 같이 스크립트 파일에서 인클루드 지시를 했다 하더라도 환경 설정이나 README 파일에 표시가 되어있어야 로드가 가능하다.
환경 설정에서 좌,우 측 스킨 파일 표시 옵션이 체크된 경우나 스킨 디렉토리의 README 의 layout 에 left,right 가 표시된 경우에 해당 스킨을 보여준다. 환결 설정이나 README 둘 중 하나만 표시가 되어도 된다. 이 경우, 관리자 모드에서 표시를 안 했는데, 나타 날수도 있다. 이것은 README 의 layout 에서 표시가 되었기 때문이다.


참고: 스크립트와 스킨

lib/skin.php 에 관련 루틴이 있다.
각 스크립트의 return 문장을 참고하여, 기본 스킨 파일을 로드하며,
레이아웃 관련 스킨은 환경 설정 파일과 스킨 README 파일을 참고하여 로드한다.



리턴되는 배열의 두번째 요소는 boolean 값을 가지며, layout.html 을 로드할지를 결정한다.
리턴되는 배열의 세번째 요소는 boolean 값을 가지며, 디버깅 처리를 할지 결정한다.

output(0); 함수는 이 두 처리를 생략한다.
이 함수를 호출하면 아래와 같은 코드를 얻을 수 있다.

	array('',false,false);


output(0) 은 웹브라우저에 아무것도 출력을 하지 않는다. 

return output(0, $ui['url_return']); 와 같이 하면, 지정된 URL 로 이동을 한다.
ex) return output(0, "?cate=user&mode=admin");





[-] 스킨, HTML 파일 인클루드

아래의 두 함수가 사용가능하다.

include(skin('file-name'));
include(html('file-name'));

include(skin(파일이름)) 함수는 include("skin/파일이름.html") 과 같다.


html(파일이름) 함수는 include("html/파일이름.html") 함수와 같다. 단, html 의 경우, 기본적으로 글로벌 영역의 변수를 사용할 수 없다.



[-] 스킨 변수 함수 규칙

스킨을 사용할 때, 중복으로 동일한 함수를 호출하는 경우가 발생할 수 있다.

예를 들면, index.left.html 에서 카테고리를 전부 검색하고 나서 index.right.html 에서 다시 중복해서 검색을 할 수 있다.

아직 이러한 처리에 대한 규칙을 정해 놓지 못했다.

현재로서는 그냥 아무렇게나 한다.

앞으로 발전 방향은 BBS 영역의 글을 가져올 때에 아래와 같이 호출하면 해당 정보를 돌려주는 것이다.

	sv('category', CATE_BBS);

이 것은 다시 svCategory(CATE_BBS) 로 줄여서 사용될 수 있으며, 다시

	svBBSCategory()

와 같이 줄여서 사용될 수 있다.

가장 유력한 방법은 클래스의 사용이다. 클래스 사용이 힘들다면 그때에 클래스를 갈무리하는 개별 함수를 제공하면 된다.

class skinVariables { ... }


이런 함수는 내부적으로 한번 실행된 동일한 처리에 대한 값을 가지고 있도록 해서 중복 실행을 막는다.

지금 버젼에서는 그냥 필요한대로 쓴다.




[*] 페이징 관련 작업

페이징 관련 작업을 하기 위해 준비된 라이브러리는 lib/pager.php, lib/list.php 가 있다.

페이징 부분은 쉬운 부분이 아니라서 아래과 같이 정리를 해 놓았다.
'스킨노트' 의 '[*] 페이징' 을 참고해도 도움이 될 것이다.



[-] 글 (검색) 목록 리스트 (페이징) 방법


** 먼저 한 목록(페이지)에 보여줄 글을 수를 결정한다.
	예를 들어 $articles = 5 라고 하자.
	
** 현제 페이지 번호를 얻는다. 아래와 같이 $ui HTTP 변수의 pageNo 에 기록을 한다.
	if ( !isset($ui['pageNo']) || empty($ui['pageNo']) ) $ui['pageNo'] = 0;

** 한 목록에 나타낼 글의 수, 현제 페이지 번호를 바탕으로 SQL LIMIT 구문을 만든다.
	예를 들면, searchPost 함수로 DB 쿼리를 한다는 가정을 할 때,
	SQL LIMIT 구문을 생성하기 위한 searchPost 의 입력값 준비는 아래와 같다.
	
	$limit['fromNumber']	= ($ui['pageNo'] - 1) * $ui['articles'];
	$limit['toNumber']		= $ui['articles'];

** 글 목록(검색) 조건에 따라서 글을 리스트한다.

** UTF-8 환경에서는 HTTP 변수로 값을 넘기기위해서 문자에 urlencode 시켜야한다.
	예를 들면 다음과 같다.
	
	$opt_search .= "&kv=$ui[kv]&cond=$ui[cond]&keyword=".urlencode($ui['keyword']);
	


	위 내용을 실제 코드로 보면 아래와 같다.

	/** page navigation bar */
	if ( ! empty($category['number_list']) ) $articles = $category['number_list'];
	else $articles = numberOfRecords;
	if ( !isset($ui['pageNo']) || empty($ui['pageNo']) ) $pageNo = 1;
	$limit['fromNumber']	= ($pageNo - 1) * $articles;
	$limit['toNumber']		= $articles;
	$total = countPost(array($category['idx']), array(), array());
	
	
	/** search blog post */
	$ar = searchPost(array(), $kvs, $limit, array('dateTime'=>'DESC'));





** 실제 페이징 결과를 보여주는 것은 스킨에서 한다.

	다음은 간단한 스킨 코드 예이다. 어려워 보여도 간단하다.
	
	'스킨노트' 파일의 '[*] 페이징'을 참고하기 바란다.
	
	extraVar 는 URL 을 지정할 때에 추가될 값이다.


<!-- 페이지 이동 바 -->
<?
	lib('list');
	
	$ar['pagesInBlock']		= 10;										// 페이지 이동 바에서 나타날 페이지 표시 갯수
	$ar['articles']				= $articles;						// 한 페이지에 나타낼 글의 수
	$ar['pageNo']					= $pageNo;							// 현제 페이지 번호
	$ar['pageVar']				= "pageNo";							// 페이지 변수
	$ar['totalItem']			= $total;
	$ar['extraVar']				= "cate=blog&uidx=$uidx";
	
	$nav = getLinkPaging('object', $ar);
	
	$block = $nav->getLinkBlockAll();
?>
<?=$block?>












[*] HTTP FORM 문장 관련
<form action='?' method='post'>
	<input type=hidden name='cate' value='bbs'>
	<input type=hidden name='mode' value='reply_submit'>
	<input type=hidden name='idx' value='<?=$ui['idx']?>'>
	<input type=hidden name='pageNo' value='<?=$ui['pageNo']?>'>

와 같이 필요한 값을 히든으로 넘겨주어야한다.


[*] HTTP 변수 관련

&cache=again 이면 캐시 파일을 새로 작성한다.



[*] BBS 모듈

?free 와 같이... 카테고리 인덱스 번호 보다는, 아이디를 사용할 것을 권장한다.

내부적으로도 아이디를 사용한다. 물론 DB 쿼리는 추가 실행 없도록 한다.




[-] 글 읽기

글 읽기 페이지 밑에 답변글을 입력할 수 있도록 아래와 같이, 스킨 파일을 추가할 수 있다.

	<? include( skin( 'bbs.reply' ) ) ?>




글 읽기 페이지 밑에 글 목록을 나타내주고 싶다면 아래와 같이 관련 스크립트와 스킨을 로드하면된다.

	<? include( script('list') ); include( skin('bbs.list') ) ?>





[*] 그룹(카페, 동호회) 모듈
현제 존재하지 않는 모듈이다.

그룹, 카페, 동호회 등 모두 같은 것을 의미하는 단어들이다.

여기서는 이러한 모듈 작업을 위한 설명을 한다.


우선의 이름과 설명, 공개 그룹, 폐쇠 그룹 등의 설정을 할 수 있어야한다.
이러한 설정은 당연히 category 테이블을 통해서 한다.
category.type = group 정도가 되어야할 것이다.
category.r, category.w 로 그룹의 정보 공개 범위를 충분히 나타낼 수 있다.
그룹 정보가 category 테이블에 보관되는 이상, 하나의 그룹은 하나의 카테고리가 되는 것이다.
즉, 하나의 카테고리는 한 그룹의 정보를 묶어놓은 것을 지칭한다.

사용자를 그룹으로 묶을 수 있어야, 누가 그룹에 속했는지 구분을 할 수 있다.
뿐만 아니라, 그룹별로 등급을 매길 수 있어야한다.



category 테이블을 그대로 이용해서 그룹의 정보를 관리한다.
그룹에 대한 사용자는 category_user 테이블 정도로 나타내야할 것이다.
















[*] 로그(시스템 로그)

로그 시스템의 목표는 당연히, 홈페이지에 어떤 정보가 많이 이용되고, 어떤 정보를 보강해야지 사용자들이 늘어날지에 대한 문제 해결의 도움을 얻는 것이다.

로그 파일은 로그 디렉토리에 보관이된다.
특정 이벤트(주기)마다 zlib 형식의 압축이 필요하다.



GraphViz 를 향한 로그 파일의 분석 과정: 로그 파일 -> StatViz - >GraphViz 의 연결
GraphViz 참조: http://statviz.sourceforge.net/
GraphViz 참조: http://ctotodevelopers.blogspot.com/2006/01/clickstream-analysis-tool.html

강력한 로그 분석기가 필요하다.
유저 한명(IP, Cookie 로 중복 방지 체크)이 접속한 시간, 홈페이지 내에서 이동 경로, 페이지별 머문 시간(중요하게 본 정보), 페이지에서 빠져 나간 시간 등..

웹서버에서 로그 파일을 지원한다면, 직접 로그 파일을 작성할 필요 없지만, 웹 서버를 임대(웹 호스팅 등)해서 사용하는 경우, 그 지원 여부의 결정 권한은 홈페이지 운영자에게 없다. 따라서 직접 로그 파일을 작성해야한다. 로그 데이터의 기록. 생각보다 만만치가 않다. 하루 1천 유저의 방문이 있는 홈페이지에서 1만번의 히트가 발생하고 힛트당 200 바이트의 데이터를 기록한다면, 하루 2메가, 한달이면 60메가, 1년이면 700 메가가 넘는 데이터 양이다. 하루 1만 유저의 방문, 10만번의 힛트가 발생한다면, 하루 20메가, 한달에 600 메가의 저장 공간이필요할 것이다.


[-] 로그 파일 형식

Apache 웹 서버의 combined format 으로 한다.
기본LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
변형LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	
	ex) 211.175.163.139 - - [13/Oct/2006:21:34:54 +0900] "GET / HTTP/1.0" 200 2929 "-" "-"

	%h : 원격의 호스트
	%l : 원격의 로그인 ID(지원한다면. 사용자 아이디 )
	%u : 원격의 유저이름(인증시. 사용자 이름)
	%t : 시간 포맷(CLF 포맷)										// [13/Oct/2006:21:34:54 +0900]
	%r : 첫번째 요청 라인 (%...r:          First line of request)	// "GET / HTTP/1.0"
	%s : 상태코드													// 200
	%b : 헤더를 포함한 전송량(bytes)								// 2929
	\"%{Referer}i\"		: %U : 요청한 URL
	\"%{User-Agent}i\""		: agent
	


[-] 설치 로그

설치, 업데이트와 관련된 로그는 ./file/log/install 파일에 기록된다.

installlog 함수로 간편하게 기록이 가능하다.
모듈 설치를 할 때에도 이 함수를 사용해야한다.

로그 형식은 다음과 같다.

	"모듈이름 버젼 날짜(timestamp) 설치(install/update/uninstall)"

날짜는 timestamp 로 기록을 하고, 설치 부분에는 install, update, uninstall 중에 하나를 선택하면된다.







[*] 압축 전송 모듈. output_compress

README 파일 참고



일일 전송량이 500M, 1G 이렇게 한정되어 있는 경우, 실제로 로봇들에 의해서 트래픽 제한에 걸려 홈페이지 서비스가 안되는 경우가 많다. 이런때에 HTML 내용을 압축해서 웹브라우저로 전송을 하면, 평균적으로 10 배의 효과를 볼 수 있다. ob_gzhandler 를 참고 해서 작성을 해 본다. 물론 module 로 기능이 추가되어야한다.
		<?php
			if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler");
			else ob_start();
		?>
function output_compress_handler($buffer)
{
	header('Content-Encoding: gzip');
	header('Vary: Accept-Encoding');
	return gzencode($buffer, 6);
}
ob_start('output_compress_handler');




[-] 문제 해결

압축 전송을 할 때에 에러가 발생하는 경우가 종종 있다.

예를 들면, 웹 호스팅 제공 업체에서 임의로 특정 코드를 맨 밑에 추가하는 경우, 이와 같은 경우에는 추가된 코드는 압축이 안되어 있어서 에러가 발생할 수 있다.



이와 같은 경우 끊임 없이 리프레쉬(refresh, 리로드)가 되는 경향이 있다.

예를 들어 압축 전송을 하는데, 아래와 같이 웹호스팅 서버에 의해서 자동으로 메세지가 추가되는 경우 문제가 발생할 수 있다.


<a href="http://www.oranc.co.kr/" target="_blank"><img src="http://www.oranc.co.kr/home_images/menu3/oranc_banner5.gif" width="150" height="60" border="0"></a>







[*] 쇼핑몰 모듈

쇼핑몰의 구성은 글과, 상품의 관련 항목들, 그리고 금액(세일가, 특가, 기타 등등) 그리고 상품 이미지 등이 있다.

이러한 항목들은 별도의 테이블로 처리를 하지 않는다. 쇼핑몰의 아이템에 사용되는 모든 글은 post 테이블에 기록된다. 모든 이미지 자료는 file 테이블에 기록된다.
필요한 필드가 있다면 개발자에게 문의를 해야한다.


다음은 post 테이블에 정보가 기록되는 형식이다.

idx_parent			이 값이 0 이 아니면, 상품에 대한 후기(평가)이다.
idx_category		카테고리 정보(상품의 카테고리)
idx_category_type	CATE_MALL
idx_user				상품의 주인 번호
id							상품의 주인아이디
name						상품 이름
birth						unsigned int 이다. 제조일로서 년4자리,월2,일2 이렇게 저장이된다.
title						제목. 대표 표기명
description			설명
tags						태그


homepage				원산지
email						제조사
recommend				운영자가 추천하는 표시 1~10
sex							히트상품 표시	1~10
password				시중가
password_type		판매가

user_agent			배송정보
grade						사이즈 표기 선택. 1,2,3 (1=대,중,소 2=large, small, medeum 등)
point						재고량



키 매칭을 한다. 없는 키는 그대로 사용을 한다.

birth						-> created
homepage				-> origin
email						-> maker
sex							-> hit
password				-> origin_price
password_type		-> price
user_agent			-> delivery
grade						-> size
point						-> stock





[-] 주문 정보



주문자 정보, 받는이 정보 등의 내용을 varchar(255) 필드에 넣는다. 이 필드는 충분한 크기이다.

구분자는 | 이다.

idx				= 레코드 고유 번호
idx_user	= 주문자 회원 번호
id				= 주문자 회원 아이디
name			= 주문자 통장 입금 표기명
idx_category				= 0
idx_category_type		= CATE_MALL_ORDER
r					= GRADE_PRIVATE
email			= 주문자 정보
hompeage	= 받는이 정보
secret		= 기타 내용

password				= 주문 내역. 상품번호=갯수|idx=number|idx=number
password_type		= 주문번호

recommend		= 총 합금액


dateTime		= 주문한 날짜. 자동으로 작성되며, 정보를 읽을 때 활성화된다.

state				= 상품 주문,배송 상태




[-] 주문 처리 (입금 정보)


"입금대기(확인중)"			주문을 하자 마자 이 상태로 들어간다.
"입금완료,배송준비"			카드 결제이면 바로 이 상태가된다.
"배송완료"









[*] 글 정보 영역에서 글 제목이 없는 경우의 처리.

글 정보에서 글 제목이 없는 경우는 흔히 발생할 수 있는 문제이다.
예를 들면, 웹브라우저가 아닌, 블로그 편집기로 글을 쓰는 경우를 들 수 있다.

데이터베이스의 title 항목에 값이 없을 경우, 내용에서 <title> 태그가 있는지 살펴보고 있으면 그것을 사용한다. 없으면 '제목없음' 이라고 표현을 한다.

[*] 웹 페이지의 제목 처리


스킨의 HTML <head> 부분에 직접 <title> 제목: <?=$page_title?> </title> 을 지정할 수 있다.
각 모듈에서는 페이지에 맞도록 자동으로 $page_title 변수가 설정이된다.
예를 들어 글 영역의 정보를 보여주는 페이지 일 경우, 제목이 없다면, 전처리를 한 후, $page_title 변수에 값을 지정해야한다.

[*] 파일 업로드
file 테이블과 filesystem.php 라이브러리 파일이 담당을한다.
파일은 ./file/data/06/12/29 와 같이 년/월/일 을 바탕으로 디렉토리를 생성해서 파일을 보관한다.
년/월/일 을 구성하는 정보는 file.dateTime 이다.

즉, 파일을 업로드할 때에는 현재 날짜를 구해서 년/월/일 디렉토리를 만든 다음, 파일을 저장하고 file 테이블에 관련 내용을 기록하면된다. 그리고 post.files 에 총 파일의 갯수를 업데이트하면된다.

만약, 파일이 먼저 업데이트된다면, file 테이블에 글관련 정보를 기록하지 못한다. 이때에는 글을 입력하고 file 테이블에 마저 정보를 기록한다.



[*] 검색

search 모듈과 pager.php 를 참고한다.




[*] HTML 파일 링크
@@todo 스킨노트로 이동

본문은 모듈의 정보가 표시된다.

만약, 회사 소개라든지, 약도라든지, 개인 취향에 대한 정보를 본문에 싣고 싶다면, 다음과 같은 과정을 따른다.

- 원하는 내용을 HTML 파일로 작성한다. about.html 로 저장을 한다.
- 작성한 HTML 파일을 링크는 다음과 같이 한다. ?include=about.html
- 원하는 메뉴에 링크를 건다.

about.html 파일을 저장할 때에 왠만하면 디렉토리를 만들고 그 안에 분류별로 저장하는 것이 보기가 좋다.
예를 들면, etc 디렉토리 안에 html 디렉토리안에 기타 HTML 파일을 모두 모아둔다고 하면,
about.html 파일을 etc/html 디렉토리에 저장을 하고 URL 링크는 ?include=etc/html/about.html 정도가 적당로 하면된다.

HTML 파일에는 PHP 코드가 사용이가능하다. index.html 에서 사용이 가능한 모든 HTML 파일이 가능하다.







[*] RSS

$url_rss 변수는 항상 현제 페이지에 대한 RSS 주소를 가지고 있다. 즉, 모든 스킨에서 이 변수를 이용해서 RSS 정보를 나타낼 수 있다.









[*] 파일 업로드

파일 업로드는 bbs 모듈에 예가 있다.
module/bbs/addfile 스크립트이며, 한번에 업로드할 수 있는 파일의 갯수는 제한이 없다.
업로드하는 파일이 본문에 첨부가 가능한 형식이면, 예를 들어 이미지 파일이면, 파일에 첨부 할지 여부를 표시할 수 있다.
"inline번호" 변수가 그 역활을 한다.
변수는 순서대로 0번 부터 매겨져야한다. 그리고 파일 첨부도 처음 부터 되어야한다.
첫칸을 비우도 둘째칸 부터 파일을 지정해서 업로드하려 한다면, 첨부 표시가 엇갈리게된다.




<form method=post action=? enctype='multipart/form-data'>
<input type=hidden name=cate value=bbs>
<input type=hidden name=mode value=addfile_submit>
<input type=hidden name=idx value=<?=$ui[idx]?>>

<h3> 카테고리(글 영역) <?=$category_name?> </h3>
<br>
<div class=name>제목 </div><div><?=$title?></div>
<? if ( ! myPost() ) { ?>
<div class=name>비밀번호</div><div><input type=password name=password></div>
<?}?>
<br>
<div class=name>파일 1</div><div><input type=file name='file[]' size=20></div>
<div class=name></div><div><input type=checkbox name='inline0' value='checked' checked>본문에 첨부(이미지 등)</div>
<div class=name>파일 2</div><div><input type=file name='file[]' size=20></div>
<div class=name></div><div><input type=checkbox name='inline1' value='checked' checked>본문에 첨부(이미지 등)</div>
<div class=name>파일 3</div><div><input type=file name='file[]' size=20></div>
<div class=name></div><div><input type=checkbox name='inline2' value='checked' checked>본문에 첨부(이미지 등)</div>
<div class=name>파일 4</div><div><input type=file name='file[]' size=20></div>
<div class=name></div><div><input type=checkbox name='inline3' value='checked' checked>본문에 첨부(이미지 등)</div>
<div class=name>파일 5</div><div><input type=file name='file[]' size=20></div>
<div class=name></div><div><input type=checkbox name='inline4' value='checked' checked>본문에 첨부(이미지 등)</div>
<div class=name></div>
<div><input class=button type=submit value=' 파 일 업 로 드 '></div>
</form>





[*] 자동 백업

필요한 이유는, ... 백업을 안해서. .. 데이터를 잃어 버리는 경우가 발생한다.
data/backup.conf.php 에 날짜를 기록해 놓고, 매 시간/일 마다 체크를 할 수 있도록 한다.
모든 테이블에는 dateTime 이 기록된다. 이 값을 보고 새로운 내용만 백업하게 하면된다.
zlib 를 통해서 내용을 보관한다면 효과적으로 용량을 줄 일 수 있다.

백업된 내용은 보안이 필요하다. 비밀글과 같은 내용이 유출되어서는 안된다.
따라서 다운로드가 안되도록 data/backup/년월일시분.zlib.php 로 보관을 한다.



[*] 비밀번호 변경

메일로 전송하는 경우 문제가 발생한다.
모든 시스템에서 sendmail 을 지원하는 것도 아니고, 모든 시스템에서 PHP socket 통신을 지원하는 것도 아니다.
따라서 메일이 아닌 다른 방법을 통해서 본인을 확인하는 것이 필요하다.
이것에 대한 가장 근본적인 해결책은 비밀번호 분실시, 변경을 위한 추가 질문/답이다.

user.password_q, user.password_a 를 두고 검사를 한다.


[*] 멀티 사이트

하나의 데이터베이스로 여러개의 사이트를 운영하고자 한다면 다음과 같이 멀티를 할 수 있다.
데이터베이스의 내용과 업로드된 내용은 파일은 그대로 같이 사용을 하지만, 웹브라우저의 URL 지정이라든지 스킨은 완전히 다른 것이된다.

한 계정에서 여러개의 프로그램 설치시, 동일한 데이터베이스와 파일 저장 공간을 이용해서, 마치 여러개의 독립 사이트로 운영되는 것 처럼한다.
즉, 홈페이지의 내용은 동일하나 껍데기만 다르게 보이도록 하는 기능이다.
홈페이지의 글 내용이나 업로드된 파일 자료는 동일하다. 다만, 스킨이라든지 이미지 디자인을 마음데로 바꿀 수 있다.


단순히 스킨을 실시간으로 변경하게 하는 것은 재지정은 재접속시 문제가된다. 물론 맘에 드는 스킨을 기억하게 할 수 있겠지만 여전히 문제점이 남는다.

방법은 새로운 프로그램을 설치해서 스킨을 완전히 다른 것으로 고정을 시킨다.

예를 들면, http://jangnans.com/study/ 와 같이 새로 프로그램을 설치하고, 스킨을 완전히 다르게 할 수 있다.
회원 가입을 할 때, 어떤 스킨(멀티) 사이트로 부터 가입을 했는지 표시를 할 수 있다.
user.from 에 표시가 된다.

멀티 사이트를 할 때에는 데이터베이스의 id, pw, 파일 이름과, 파일 저장 디렉토리 이 4가지가 일치해야한다.



[*] 등급

등급은 권한과 관련된다.

레벨이라고 생각을 해도된다.


[*] 포인트
** 아직 구현이 안된다. 2.0 버젼에서나 ..

포인트는 기본적인 행동에 대해서 점수를 주거나 뺄때 사용한다.

포인트 시스템을 사용할지 말지를 관리자 모드에서 체크할 수 있다. 포인트에 대한 개념은 생각보다 어렵고 관리하기가 쉽지가 않다. 따라서 첫 버젼에는 관리자가 옵션을 선택하면 프로그램 내부적으로 자동으로 처리가되게한다.

포인트의 증감에 대한 값은 특별히 각 카테고리에서 지정을 할 수 있다. 낮음, 보통, 높음으로 선택이 가능하다.

모든 정보의 접근 권한 체크는 등급을 바탕으로한다.

따라서 포인트가 일정 수치에 도달하면 등급을 자동으로 조정(업데이트 시켜야)할지를 선택할 수 있다.


예를 들면, 등급을 레벨과 같은 개념으로 구현을 한다.

1레벨은 도달하기가 쉽다. 기본적으로 1레벨로 주어진다. 글 하나 작성하면 다음 레벨로 올라간다.
2레벨은 글 두개를 작성해야 다음 레벨로 올라간다.
3레벨에 글 세개를 작성해야 다음 레벨로 간다.
4레벨은 글 4개,
5레벨은 글 5개...

등등으로.. 포인트에 따라서 자동으로 등급이 올라가게 하는 것이다.

보통 수준의 경우가 위에서 설명한 경우이며,
낮음 수준은,
글 2개당 레벨이 1개 정도 올라가도록 한다.
높음은 글 0.5 개당 레벨이 1로 올라가도록 한다. 즉, 9레벨에서 10레벨이 되기 위해서는 글을 5개 기록해야하고, 10레벨에서 11레벨이 되려면 글 5.5 개를 입력해야한다.






[*] 문자셋
데이터베이스가 UTF8 을 지원하지 않을 경우, 소프트웨어에서 옵션 처리를 하여 데이터베이스만 UTF8 이 아니게 지정을 할 수 있습니다. 하지만 실질적으로 웹페이지로 보여지는 모든 내용은 UTF8 문자셋이라고 생각을 하시면됩니다.




[*] 실시간 접속자 정보

connectors 모듈에서 작성되어있다.


display('connectors', associative-array); 규칙에 의해서 표현할 수 있다.





[*] 데이터베이스에 접속이 안되는 경우,
먼저, system.conf.php 파일을 열어서 정보가 올바른지 체크한다.


[*] 홈페이지에 글자가 깨져서 나오는 경우,
관리자 > 시스템 설정 > 문자셋 항목을 체크한다.


[*] 시스템 설정 변수


./file/system.conf 에 값이 기록된다. 이 파일의 위치는 고정이다.


시스템 설정에서는 시스템에 대한 전반적인 운영에 대한 결정을 하는 값들을 수정/보관 한다.

language 는 언어를 나타낸다. en 는 영어 팩, kr 또는 ko 는 한국어팩이다.

name 은 사이트(시스템)의 이름을 나타낸다.
description 은 사이트의 설명을 나타낸다.
skin 은 사이트의 스킨을 나타낸다.
admin 는 관리자 아이디를 나타낸다.


[*] 슈퍼 사용자

등급 관련 정보 참고







[*] 데이터 저장소.

디렉토리의 권한은 공개되어있다.

즉, 해킹이 일어난다면, 아마 이 공간에서 system.conf.php 파일 내부의 관리자 아이디나 super.conf.php 이나 admin.conf.php 파일 등을 수정할 수 있다.
또는 간단하게 읽기가 가능하다면, system.conf.php 내용을 열람함으로서 데이터베이스 정보고 누출될 수 있다.

따라서 데이터 저장소의 정보고 밖으로 새지 않도록 조심을 해야한다. 가능하면 웹에서 액세스가 안되는 장소로 보관하는 것이 좋다.

system.conf.php 파일은 반드시 ./file 디렉토리에 위치를 해야한다. 그 외의 정보(파일)은 system.conf.php 에 기록된 임의의 곳으로 이동될 수 있다.




[*] 블로그

블로그를 개인 사용자에게 분양할 때에 블로그 주소를 두가지 방법으로 한다.

- 서브 도메인
	http://userid.jangnans.com 과 같이 할 수 있다.
	이 방식은 서버 설정을 조정해야한다. 간단한 작업이다.
	웹서버 관리자에게 모든 서브 도메인을 jangnans.com 도메인과 같이 해달라고 하면된다.
	간단한 작업이지만, 웹 호스팅을 하는 경우, 서버 관리 업체에서 서브 도메인 하나 마다 가격을 책정해 놓는 경우가 많다.
	웹서버 관리자에게 모든 서브 도메인을 메인 도메인과 같은 계정으로 연결해달라고 해야한다.
	
- 쿼리 방식
	http://jangnans.com/?/userid 와 같이 할 수 있다.
	특별한 설정은 필요 없다. 하지만 도메인으로 연결하는 것 보다 깔끔하지 못하다.
	쿼리 방식은 "http://홈페이지주소/?/사용자아이디"와 같다.
	자신의 도메인이 없어서 홈페이지 주소가 "http://some-host.com/~myhome/ky/" 가 자신의 홈페이지 주소라면 서브 도메인으로는 하기가 힘들다.
	이때에는 하는 수 없이 "http://some-host.com/~myhome/ky/?/userid" 와 같은 방식으로 사용자에게 블로그를 분양해야한다.

	쿼리 방식은 default.php 에서 주소 변환이 이우러져야한다.
	
	
	블로그의 주소는 위와 같이 하되, 내부 URL 은 프로그램적으로 처리를 하면된다.
	


	
	


[-] 모듈 설치

관리자 모드에서 블로그 모듈을 설치해야한다.
한번 설치를 하면 제거를 할 수 없다. 할 수 없다기 보다는 설치하는 스크립트(기능)만 있을 뿐 제거하는 스크립트는 작성을 하지 않았다.
굳이 제거할 필요가 없기 때문이다.



[-] 각 사용자의 블로그 옵션 정보

category 테이블에 저장이된다.
category.idx_user 는 사용자 아이디.



[-] 블로그 스킨

@@doc 블로그에서는 header.html 과 footer.html 을 사용하지 않게 할 수도 있다.
이유는 header.html 과 footer.html 은 사이트에 적용이 되는 것이고 사이트의 내용이 블로그에 담겨져서는 안되기 때문이다.
이때에는 header.html 과 footer.html 에서

	<?if ( $ui['cate'] == 'blog' ) return?>

위와 같이 그냥 리턴을 해버린다.

물론 원한다면 그냥 header.html 과 footer.html 을 사용하면된다. 사용하고 하지 않고는 스킨에서 처리(결정)를 한다.
아마 메인 스킨(특정 모듈을 위한 스킨이 아닌)이랑 같이 사용하면 header.html 은 쓰지 않는 것이 좋을 것이다.



블로그는 기본적으로 다양한 스킨이 필요하다.
뿐만아니라 개인의 취향에 따라 블로그를 직접 선택할 수 있어야한다.
개인 사진도 블로그 화면에 담아야한다.

이에 따라서 category.skin 를 추가한다.

블로그의 옵션은 스킨과 개인 이미지로 한다. 자신의 소개는 회원 정보의 것을 그대로 사용한다.
일단 이렇게 간단하게 하고, 복잡하게 업그레이드를 할 경우에는 블로그 옵션을 위한 테이블을 따로 만든다.


기본 블로그 스킨은 다른 모듈과 마찬가지로 default/blog.*.html 들이다.
블로그의 스킨 디자인은 메인과는 완전히 다를 수 있다.
블로그 스킨만 따로 준비될 필요가 있다. 블로그 스킨은 개인 취향에 따라 다르므로 많이 준비될 수록 좋다.





[-] 트랙백
@@todo 트랙백 공격을 막기 위해서 동일한 아이피로 1분 이내에 트랙백을 다시 전송할 수 없도록 한다.
@@todo 트랙백 내용을 md5 해서 동일한 내용이 2번 포스팅 될 수 없도록 한다.


post.name 에 트랙백하는 사이트의 블로그 이름
post.idx_parent 에 부모글
post.idx_category_type 에 CATE_TRACKBACK
post.idx_category 에 개인의 블로그 카테고리 정보 레코드 번호
post.homepage 에 트랙백하는 사이트의 주소


주의: user.idx = category.idx_user, category.idx != post.idx_category 이다.

user.idx 과 category.idx_user 는 N:M 의 관계이다. 따라서 N:N 의 관계를 만들기 위해서는 category.type 이 추가되어야한다.












[*] 미니홈
블로그와 같은 개념으로 생각을 하면된다.
아직 개발을 하지 않는다.






[*] 삭제

정보를 삭제할 경우, 관련된 정보의 조정이 필요하다.
예를 들어서 글 정보(레코드)를 삭제할 경우, 부모, 자식글과의 관계 정보, 파일 정보를 먼저 처리해야한다.



[*] 스킨에서 결과 처리를 할 때에,

$failed = 1 이면 처리가 잘된 것이다.
따라서

	<?if($failed){?>처리 결과 실패<?}?>
	
위와 같이 나타낼 수 있다.



[*] 컨버팅

		타 게시판 프로그램으로부터 데이터 포팅
		user.domain 필드를 두어서 사용자 정보가 어디서 왔는지 표시를 한다. 가입 도메인이나 위치 등을 기록하는 장소이다.
		user.password_type 필드를 두어서 비밀번호 타입을 지정한다.
		password 필드와 password_type 필드를 비교해서 비밀번호 검사를 해야한다.

[*] 서브도메인

관리자 모드에서 서브도메인을 사용자 아이디로 연결 옵션을 선택할 수 있다. 이 옵션을 선택하면 서브도메인은 사용자 블로그 홈페이지 주소로 인식된다.
이 옵션이 선택되면, 도메인을 기록해야한다.
도메인: jangnans.com 이라면,

http://thruthesky.jangnans.com 을 웹 브라우저에 입력을 하면 thruthesky 블로그로 이동을 한다.
www.jangnans.com 과 같이 www 는 자동으로 제외된다.

이 옵션을 이용하려면 서버 설정에서 모든 서브 도메인을 하나의 계정으로 연결해 달라고 서버 관리자에게 얘기를 해야한다.


DNS 에서 서브 도메인 위임을 아래와 같이 하고,

	*  IN A 192.168.10.2

아파치 서버 설정에서
	
	ServerAlias *.home.com

와 같이 설정을 하면된다.






[*] 문서화

스킨이나 모듈 코드같은 경우 당장 문서화가 필요하지 않다.
라이브러리 내용들만 먼저 문서화를 한다.

태그: note,doc,changed,code,added,important

아래의 두 디렉토리를 문서화
C:\lab\homepage\jangnan\lib,C:\lab\homepage\jangnan\src\ex


템플릿은 workdocs\문서화 디렉토리에 보관










[*] 라이브러리

라이브러리 파일은 lib 디렉토리에 저장이된다.
그러나 본인이 직접 작성한 라이브러리는 모듈 디렉토리에 직접 저장을 하면된다.

그리고 아래와 같이 로드를 하면 된다.


include "module/$cate/xmlrpc.inc";
include script("api_library);

현제 모듈에 존재하는 파일을 include 할 때에 확장자가 php 이면, script 함수를 사용할 수 있다.
확장자가 .php 가 아니면, 위와 같이 $cate 변수를 사용해서 파일을 로드해야한다.
확장자가 .php 인경 우 생략할 수 있다.


다음과 같이 사용할 수 있다.
 	include script('info');
 	g($info);








[*] 파일

시스템에서 파일을 다룰 때에는 아래와 같이 먼저 파일을 그냥 기록해본다.
에러가 나면, 디렉토리를 점검한다.

$filename = tmp_repository . "/connectors";
$message	= time() . ",$_SERVER[REMOTE_ADDR],$ui[cate],$id,$nick".rn;

if ( ! @@attachString($filename, $message) )
{
	if ( is_dir(tmp_repository) ) return false;
	else
	{
		if( @@mkdirEx(tmp_repository) )
		{
			return attachString($filename, $message);
		}
		else return false;
	}
}
return true;



[*] 메세지 모듈

메세지, 쪽지, 내부 폼 메일 등에 사용된다.
모듈 설치, 등록, 관리 메뉴가 없다.


글 영역에 글을 보관한다.
글 조회 수가 0 이면 새 쪽지이다.






[*] 글 쓰기 입력 양식

easyEditor 를 사용할 때에는 폼 태그에 아래와 같이 값을 전송하기 전에 자바 스크립트 처리를 해줘야한다.

<script src="etc/wysiwyg/easy_editor/easyEditor.js"></script>
<form action='?' method='post' onsubmit="description = ed.getHtml();">



[*] URL 지정(메인 스크립트 연결)

아래와 같이 지정을 하면, index.html 이나 index.php 와 같이 디렉토리의 기본 인덱싱 파일만 사용된다.

	$post['url'] = "./?";

이 경우, index2.html 과 같은 경우에는 올바로 링크가 되지 않는다.

이것은 http://jangnans.com/ 과 같이 메인 페이지로 이동할 때와는 틀리다. 그냥 메인 사이트의 인덱싱으로 이동하려면, ./ 와 같이 하면된다.



[*] 스킨 직접 지정(재지정)

스킨을 HTTP GET 방식으로 직접 지정할 수 있다. 단, POST 방식으로 skin 변수에 값을 넘기는 것은 적용되지 않는다.
따라서 skin 변수를 통해서 꼭 값을 넘겨야하는 상황이면 GET 방식은 피해야한다.

[*] 문자열 자르기 strcut 함수

		다음과 같이 처리를 했다.
		시스템의 (DB) 문자셋이 utf8 인 경우, iconv 를 통해서 문자를 자른다.
		iconv (PHP 4 >= 4.0.5) 지원을 하며, 내장 함수가 아니므로 따로 추가 설치를 해야한다.
		strcut 에서 내부적으로 iconv 를 사용해도 되는 상황이면 iconv 를 통해서 문자열 자르기를 한다.



[*] 게시판 등 카테고리의 설정


게시판은 하나의 카테고리이다. 따라서 카테고리 설정을 통해서 게시판 설정을 할 수 있다.
뿐만 아니라, 게시판은 게시판만의 설정을 따로 준비해 놓고 있다.
따라서 양쪽의 것을 적절히 활용해서 설정을 할 수 있다.


[*] 세션아이디

매 접속시 고유의 세션아이디가 만들어진다. 이 값을 바탕으로 세션 값을 기록을 할 수 있다.

<?=$sessionid?>


[*] 임시 공간, 임시 파일

아래와 같이 사용을 한다.

$filename = tmp_repository . "/connectors";
$filename = tmp_repository . "/" . $sessionid;

sessionfile() 함수는 임시 공간에다가 세션 파일을 붙여서 지정한다.





[*] nextpage , 다음페이지, 이전페이지로 돌아가기


모든 HTML FORM 에서 nextpage 값을 사용할 수 있다. 이 값을 지정할 경우, FORM 이 올바로 수행되면 nextpage 에 지정된 url 로 이동을 한다. 이때 스킨 파일은 로드되지 않는다.
		-- outskin 제작을 할 때 사용할 수 있다.
		-- doc/ 이에 따라서 로그아웃을 할 때에 ?logout 과 같이 할 수 있으며, <a href='?cate=user&mode=logout_submit&nextpage=<?=$nextpage?>'> 과 같이 해도된다.
		-- doc/ 실제 예제는 src/outskin 에 있다.


인증이 필요한 부분에서 nextpage 값을 가지고 로그인 페이지로 이동시킬 수 있다.
nextpage 값을 이용하여 로그인을 한 후 다시 인증 페이지로 바로 돌아올 수 있다.
로그인 페이지에서 회원 가입 페이지로 이동을 하는 경우, nextpage 값을 유지하면, 회원 가입 후에 인증 페이지로 돌아올 수 있다.


대부분의 경우, nextpage 에 값을 지정하지 않는다.
이와 같은 경우 user.login_submit.html 에서 referer 를 보고 자동으로 로그인을 시도한 페이지로 이동하게하면된다.
또 실제로 그러하게 처리를 한다.
따라서 보통의 경우 그냥 nextpage 변수를 무시하면된다.






[*] getskinlist 함수

{module}.index.html 파일이 있으면 해당 모듈의 스킨이 존재하는 것으로 판단한다.



[*] 데이터 캐슁, 데이터 캐시

file/var 디렉토리에 모듈, 스킨 별로 진행을 한다.


[*] 첨부 파일

참고: file 테이블의 설명을 참고한다.




[*] 답변 글

답변글, 코멘트, 덧글 등이 기록되면 원글이 수정되는 것으로 한다.

따라서 답변글이 기록되면, 새글이 2개가되는 것이다.



[*] 회원 정보에 대한 코멘트


사용자 정보에 대한 글을 쓴다.

예를 들면, 신규 가입한 사용자에 대해서 가입 축하메세지를 남기는 경우 등에 이용될 수 있다.

회원 전용으로 할 지, 글 쓰기를 하면 쪽지로 자동 전송할 지 옵션으로 한다.

처음 제작은 회원 전용에 쪽지로 자동 전송이다.

필수 정보: 받는 사람 회원 번호, 내용
추가 정보: 보내는 사람 회원 번호


post 테이블에 글이 보관되며 idx_category_type 은 CATE_USER_INFO 이다.





[*] 스킨 디렉토리 사이의 파일 인클루드

아래와 같이 직접적으로 인클루드하면 된다.

<?include('skin/default/index.html');?>















[*] caching, 캐시, 캐슁


간단하게 처리를 한다.

로그인과 같이 한 페이지에서 여러가지 모습으로 나타날 수 있는 정보의 처리는 쿠키로 대체한다.

HTTP 변수 정보를 보고 간단하게 캐시 파일을 만들고 액세스를 한다.





lib/cache.php 에 관련 라이브러리를 둔다.

$system['cache'] = 1; 분단위, 참 값이면 캐슁 실행


템플릿이나 스킨에서 게시판에 새 정보가 있는지 살펴보고 없으면 기존 데이터를 보여주는 형식으로한다.


file/var/cache/category.conf.php 에 각 카테고리의 캐시 설정 정보를 담는다.
[category|skin|template].conf.php 에 <?$erase=1;?> 이면 전체 삭제를 한다.


cate, mode, [id|idx] 값을 보고 캐슁 파일 명칭을 만든다.


<?
$data['expire']	= 12342349;
$data['1']['subject'] = '1행 제목';
$data['1']['name'] = '1행 이름';
$data['2']['subject'] = '2행 제목';
$data['2']['name'] = '2행 이름';
?>

[-] 사용 범위

	"cate.mode" 형태로 표현을 한다. 콤마로 구분한다.
	"index.index,bbs.list,bbs.read" 와 같이 표현을 한다.

	실제로는 cate.mode.id.idx.pageNo 와 같은 형태로 캐시 파일이 만들어진다.
		즉, mode 가 list 의 경우, pageNo 변수에 따라서 파일이 생성되도록 하는 것이다.

	

[-] 방법론

1. $system['cache'] 가 참이면(캐시 동작 수행), 캐시 파일 데이터가 있는지 살펴본다.
2. 있으면 expire 시간을 본다. expire 시간이 경과하지 않았으면 현제 파일 정보를 사용한다.
3. 캐이 파일이 없거나 expire 시간이 경과 했으면, 정상 처리를 하고 캐시 파일을 만든다.
4. 갱신이 필요한 시점에서 HTTP 변수로 cache=again 으로 값을 주면 캐시 값을 갱신한다.



expire 시간이 지나지 않아도, 해당 정보에 대해서 새로운 정보가 올라오면 캐시 파일을 삭제한다.

예를 들어 특정 글에 답변글이 달리면 해당 글의 캐시 파일은 삭제되며, 자동으로 메인 파일도 삭제된다.

즉, 메인 캐시 파일의 경우 삭제가 빈번하게 일어난다.

따라서 expire 시간을 1440 와 같이해서 긴 시간(하루)을 지정해도 좋다.





$ui['cache'] = 'again' 이면 다시 캐싱을 한다. 이 때, index.index 는 기본적으로 다시 캐싱이된다.




[-] 주의

현제는 압축 전송 모듈과 같이 사용하는 것에 대해서 대충 테스트는 되었으나 확실한 체크는 되지 않았다.
기존 압축 전송 모듈과 캐시 파일을 생성하기 위해서 ob_start() 를 사용하는 것에 대한 충돌이 발생하지 않는다.




캐쉬는 jangnan.php 에서 동작된다. 따라서 아웃스킨과 같이 jangnan.php 를 실행하지 않는 경우는 동작하지 않는다.



스킨 파일에서 회원 로그인을 했는지 하지 않았는지에 대한 여부는 쿠키로 판단을 해야한다.



글 읽기 같은 정보가 캐시된다면, 조회수 값이 증가하지 않는다.



[-] 캐시 파일 생성

내용이 수정, 변경이 된 경우, 캐시 파일을 다시 작성해야한다.

bbs 의 경우, cache=again 의 값을 기본적으로 지정하므로, 아래와 같이 적절히 스킨에서 사용하면된다.

<script>
	location.href="<?=$url_read?>";
</script>



[-] 사용

관리자 모드에서 설정을 한다.

캐시 파일 삭제하는 방법은 캐시 수행을 하다가 중지를 하면 모든 캐시 파일이 삭제된다.
캐시 유효 기간 값이 참이다가 거짓이 되는 순간이 중지하는 시점이다.




[*] 쿠키


자바스크립트에서만 사용되는 쿠키 전용 값. PHP 스크립트에서는 사용되지 않는 값으로 co_ 로 시작하는 쿠키 변수들이다.


session("co_name", $user['name']);
session("co_nick", $user['nick']);
session("co_grade", $user['grade']);
session("co_point", $user['point']);



[*] 스킨 캐쉬, 템플릿 캐쉬


lib/cache.php 에서 skin_cache_start, skin_cache_end 로 정의되어있다.

사용법은 이 함수를 참조한다.

메인 스킨에서는 메인 스크립트가 작업을 하므로, 큰 도움이 되지 않을 수 있다.


사용법은 최상단에 아래 구문을 사용하고

	<? lib('cache'); if ( skin_cache_start(40) ) return; ?>

최 하단에 아래의 구문을 사용하면된다.
	
	<? skin_cache_end() ?>



[*] 잘못된 페이지, wrongpage


잘못된 페이지의 경우, wrongpage.html  이 나타난다.



[*] 날짜, search-date

기본적으로 날짜는 년도4자리, 월, 일, 시, 분, 초 이렇게 각 2자리씩 총 14자리로 구성이된다.

검색을 할 때에는 수동으로 날짜를 직접 타이핑해서 입력을 할 수 있다.


이와 관련된 함수는 lib/default 의 sdate 가 있다.



이때는 다음과 같은 규칙을 따른다.

"년/월/일"로 표기를 한다. 년도는 2자리 또는 4자리 수로 표현이된다.

2007/03/04 와 같이 하면, 2007년 3월 4일에 해당하는 정보를 찾는다.

시작과 종료에 해당하는 날짜를 지정할 때에는 날짜 2개를 지정할 수 있다.

이 때, 중간에 하이픈(-)으로 범위를 지정할 수 있다.

2007/03/02-2007/03/04 와 같이 표현할 수 있다.

숫자값에서 0으로 시작되는 값은 생략할 수 있다.

따라서 2007/03/02-2007/03/04 는 2007/3/2-2007/3/4 와 동일하다.

날짜 범위의 시작은 없이 종료 날짜만 지정할 수도 있다.

이때에는 하이픈(-)을 앞 뒤로 필요한 날짜값을 기록하면된다.

"- 7/3/4" 는 시작 시간에 상관없이 07/03/04 이전의 날짜에 해당하는 정보를 검색한다.

"07/ 03/ 4-" 는 2007/03/04 이후의 정보에 대해서만 검색을 한다.




검색은 시작 날짜는 >= 으로하며, 종료 날짜는 < 로 한다.

따라서 종료 날짜는 검색이 안되며, 그 전날까지 검색이된다.





[*] login, 사용자 로그인 관련


로그인이 올바르면 아래와 같이 값이 적용된다.

따라서 모든 스크립트에서 아래의 세션값을 이용할 수 있다.

co_ 로 시작하는 것은 쿠키로 저장을 한다는 뜻이다.

따라서, 캐쉬 관련 작업에서는 자바스크립트로 쿠키 아래의 값을 이용하면 좋다.


session("co_name", $user['name'], $last);
session("co_nick", $user['nick'], $last);
session("co_grade", $user['grade'], $last);
session("co_point", $user['point'], $last);






======================== 버젼 2.0 에서 달라지는 점 ========================

V2 파일을 참고한다.



@


1.95
log
@1.8
@
text
@d21 5
d27 14
a40 6
	- 업데이트 될 DB 구조
		ALTER TABLE `user` ADD `message_number` SMALLINT UNSIGNED NOT NULL ,
		ADD `message_new` SMALLINT UNSIGNED NOT NULL ,
		ADD `login_count` MEDIUMINT UNSIGNED NOT NULL ,
		ADD `hits` INT UNSIGNED NOT NULL ;
		ALTER TABLE `post` ADD `summary` VARCHAR( 255 ) NOT NULL ;
a41 1
	- 7탄~10탄까지 쇼핑몰 기능에 대한 세부 강좌
a42 1
	- bug / 코멘트를 삭제할 때, 코멘트 갯수가 갱신되지 않는다.
a43 4
	
	
	- 장난 스킨 해부학
	- 블로그 스킨 강좌. 테터툴즈에 있는 공개 스킨을 활용.
a44 7
	- done / 스킨 캐쉬에 이상이 없으면, 내부 캐시 기능을 제거(삭제)한다. 로그인과 같은 경우 작업이 불편하다.
		-- 각 스크립트에서 &cache=again 를 제거해야한다.
	
	- done 필드 추가 / user.message_number, user.message_new 총 쪽지 갯수, 새쪽지 갯수.
	- done 추가 / user.login_count 로그인 횟수 기록
	- done 추가 / user.hits 사용자 정보가 읽힌 횟수 기록
	- done post.summary 를 추가해서, 글 쓰기를 할 때에, 자세한 요약 정보를 입력할 수 있도록 한다.
a45 4
	- done 쪽지 정보를 나타낼 때에 총 쪽지의 갯수와 새쪽지의 값을 얻기 위해서 post 테이블을 항상 액세스해야한다.
		DB 작업에 무리가 될 것 같으면, user.message_number , user.message_new 필드를 두어서 메세지 정보가 기록될 때, 저장을 하도록 한다.
		이렇게하면 매번 글 영역에서 총 갯수를 셀 필요가 없다.
	
a46 1
	- 1.8 발표
a47 1
	- 2.0 작업 시작... hometools.kldp.net 에서 작업을 한다.
d52 4
a55 1
		-- 스킨 자동화(사이트 빌드 개념). 메뉴의 자동 생성 및 홈페이지로 연결. 템플릿의 자동 연결.
d59 55
a113 1
		
d131 1
d133 1
d164 1
d174 9
a182 1
	- 사이트빌더 기능.
d211 10
d238 3
a241 3
		
[*] 나중에 시간날때 해야할 것들

d264 3
a266 1
	- 시스템 로그 작성. 관리자 모드에서 옵션 처리. 표준 형식의 데이터를 최대로 압축해서 파일로 저장
d275 1
a275 1
	-
d1543 2
d1902 2
d1959 91
a2049 1
menu_homepage 의 하위 카테고리로 lecture_homepage, lecture_html, study 3개의 게시판을 연결했다.
a2050 1
즉, menu_homepage 에 해당하는 "홈페이지" 메뉴를 클릭하면, 해당 스킨 디렉토리에 menu_homepage.html 이 스킨 파일로서 사용이되며
a2051 1
서브 메뉴로는 lecture_homepage, lecture_html, study 에 해당하는 카테고리(게시판)이 나타날 것이다.
d2522 3
a2524 4
return array('',false,false);
	세번째 요소는 디버깅 정보 출력 여부이다.
	두번째 요소는 layout.html 파일을 인클루드하는지 여부이다.
	첫번째 요소는 7가지 스킨 파일을 로드할 것인지에 대한 정보이다.
d3840 9
d4071 1
a4071 1
[*] 날짜
d4077 5
d4117 28
@


1.94
log
@no message
@
text
@d9 3
a19 3
		

	- 6탄~12탄까지 쇼핑몰 기능에 대한 세부 강좌
d22 8
a29 2
	
	- 템플릿 디렉토리를 세부화 해서 서브 디렉토리로 관리를 하는 것에 대한 검토
d31 1
a31 6
	- 코멘트를 삭제할 때, 코멘트 갯수가 갱신되지 않는다.
	
	- 본인이 작성한 글(게시물, 블로그 글 등)에 답변이 달리면, 쪽지로 수신하겠다는 옵션.
		-- 각 개인 별로 개인 정보에 기록을 할 수 있도록 한다.
		-- 글쓰기 이벤트는 드문 이벤트이다. 따라서 회원 정보를 참조해도된다.
		-- 쪽지 설정에서 선택할 수 있도록 한다.
a32 3
	- 자신이 확인하지 않은 최근 쪽지 1개를 자동으로 화면에 보여주는 템플릿
	
	- 자신이 쓴 글 리스트, 자신이 쓴 글에 새로운 답변 리스트(새로운 글의 시간은 시스템 새글 시간과 같이한다.)
a34 4
	- user.read.php 에서 메일 주소를 복사(로봇으로 메일 수집)하지 못하도록한다.
		-- 주민번호 앞자리를 보여주지 않도록한다.


a35 4

	- 사용자 사진을 메인 화면 밑에 나타내는 템플릿 설명


a36 4
	- 특정 게시판에서 게시물 1개를 최근 글이 쓰여진 것이 높은 확률적으로 가져오기.
		-- 예를 들면, 평균적으로 가장 최근 게시물이 50%, 2~4 번째의 최근 게시물이 나타날 확률 30,
				5~10 번째의 게시물이 10% 나머지 10% 해서, 확률적으로 가장 최근 글이 많이 나오고, 점점 적게나오는 함수를 작성할 것.
		-- 활용도는 공지사항의 경우 지나간 글들도 메인에 보여주어야한다. 따라서 최근글이 많이 나오도록 보여주도록 하고 오래된 글은 천천히 보여 주도록 하기 위한 것이다.
d38 1
a38 3
	- orange 스킨 글읽기에서 글 검색시 오류.
	
	- 스킨 캐쉬에 이상이 없으면, 내부 캐시 기능을 제거(삭제)한다. 로그인과 같은 경우 작업이 불편하다.
d41 4
a44 20
	
	

	- 추가 / category.title_length		표시할 제목의 길이	
	- 추가 / user.login_count 로그인 횟수 기록
	- 추가 / user.hits 사용자 정보가 읽힌 횟수 기록
	- post.summary 를 추가해서, 글 쓰기를 할 때에, 자세한 요약 정보를 입력할 수 있도록 한다.
	
	
	- 카테고리 계층도 한눈에 보는 화면과 이동, 복사를 편하게하는 기능이 필요하다.	

	- euck-kr 파일 버젼이 필요한가? utf8 편집기로 편집하는것이 어려운가? 한방에 전체 파일을 euck-kr 로 변환하는 소스를 작성해야하는가?
	
	- 차단 모듈 강화.
		매스포스팅은 대부분 별도의 응용 소프트웨어로 이루어지고 이 같은 경우 쿠키가 지원되지 않을 수 있다.
		-- 쿠키로 체크를 하지 않는다.
		-- module/block 에서 작업을 하도록 한다.

	- todo: 업데이트 스크립트가 따로 필요하다. converter.php 로 백업&복구를 하니, idx 가 변해서 데이터 유지가 힘들다.

d46 2
a47 2
	- todo/ 쪽지 정보를 나타낼 때에 총 쪽지의 갯수와 새쪽지의 값을 얻기 위해서 post 테이블을 항상 액세스해야한다.
		DB 작업에 무리가 될 것 같으면, user.message_count , user.message_new 필드를 두어서 메세지 정보가 기록될 때, 저장을 하도록 한다.
a49 2
	
	- 코멘트를 기록할 때, 비밀글로 기록할 수 있도록 한다.
d55 1
d59 2
a60 1
		-- 쇼핑몰 관련 기능 완전 강화
d78 1
d80 1
d82 1
d99 7
d122 3
a124 1
				
d150 7
d160 5
a164 1
		
d666 4
@


1.93
log
@1.6 p0
@
text
@d14 4
a17 5
	
	- 정리
	
	- 1.6p0 쇼핑몰 기능 강화 버젼 배포
			-- soaps 같이 배포
d19 1
a19 6
	- 쇼핑몰 전용 스킨 shop_v1 스킨 배포
		-- shop_v1 바탕으로 회원관리+게시판 스킨 배포
	
	- "왕초보 쇼핑몰 만들기 4탄" 강좌 이미지와 함께, 쇼핑몰의 개괄적인 설명.
	- 1~4 탄 강좌 내용 보강. 이미지 첨부할 것.
	- 6탄~14탄까지 이미지와 함께 아주 자세한 설명.
d30 6
d44 2
a45 2
	- 스킨 강좌. 스킨 샘플 작성
	- 아웃스킨 강좌. 스킨 샘플 작성
a50 5
	
	
	- orange 스킨 글일기에서 글 검색시 오류.
	- 블럭 모듈에 IP 뿐만 아니라 쿠키로도 사용할 것. 둘중에 하나가 걸리면 차단한다.
	
d52 1
a52 3
	- 등급별 할 수 있는 작업 정리하여 옵션으로 지정.
		-- ex 자신의 사진 관리 등급: 10 이상. (처음 가입해서 이상한 사진 올리는 사람들이 있음)
		-- ex 다른 사람의 글에 대한 평가: 5 등급 이상. (허위로 글의 등급 평가를 막는다. 글의 평가의 결과로 글을 블라인드 시킬 수 있다.)
a65 23
	
	
	

	
	- 1.6 버젼 정도에서 etc/wysiwyg/ziwoo 를 삭제한다. 더 이상 사용되지 않는 HTML 에디터이다.
	
	- 홈페이지의 회원 가입 처리를 아래와 같이 두가지 방법으로 가능하도록 한다.
		-- 점수
		--- 총 100 점을 얻어야 가입. (점수는 변경가능)
		--- 회원 등급이 점수로 사용. 1등급이 100명 인정해야 가입처리, 회원 등급 100 이면 1명 인정으로 가입 처리
		--- 99 점을 얻었는데, 50 등급 회원이 반대하면 44점이 된다.
		
		-- 초청장
		--- 특정 등급별로 초청 티겟을 나누어준다. 등급 * 2 개씩.
		--- 초청장을 받아서 가입을 할 수 있다.
	

	- 사용자 정보에서 사진을 올리기 위해서는 등급이 필요하다. 자신의 사진 대신에 안좋은 사진을 올릴 수 있기 때문이다.
		

	
	
a66 10
	- 사이팅 보다, RSS 리더기가 더 활용성이 많지 않나?
	- UTF-8 <-> EUC-KR 상호 변환 프로그램 배포

	- 장난-홈툴즈 소개서 작성.
		
	
	
	- HTML 웹 에디터. 아래에 좋은 스크립트가 있다. 개발자와 연락을 해서 직접 배포가 불가하다면, 사용법을 홈페이지에 올린다.
	http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=48791&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%C5%D7%C0%CC%BA%ED+%BB%E8%C1%A6&sop=and
	- skin/default/README 에 키, display_inline_copy = on 이면 HTML 상단에 카피라이트 태그를 넣어준다. 웹페이지에서는 안보임.	
a67 1
	- 자신이 쓴 글 리스트, 자신이 쓴 글에 새로운 답변 리스트(새로운 글의 시간은 시스템 새글 시간과 같이한다.)
a69 7
	
	
	
	- http://jangnans.com/study/ 에 스터디 사이트를 만든다.
	
	
	
d74 1
a74 1
	- 폼메일	
a77 2
	- 폼메일, contact, 의견, 버그 리포팅 등의 사항을 처리할 수 있는 모듈.
		내용은 관리자의 쪽지로 저장을 하고, 메일로도 전송을 한다.
d82 1
a82 3
	- http://jangnans.com/skin/ 에 스킨 전용 멀티를 한다.	
		-- index 에 각 스킨을 추출해서 3열로 전시(보여)한다.
		-- view1, dreamy, default, shop_v1, summerBreeze, voodoo, orange, jangnan, lonelyness
d84 1
a84 1
		
d86 2
d89 7
d97 1
a97 2
	
	
d109 14
d124 3
d128 2
d141 3
d210 4
d1820 5
a1824 1
[*] 카테고리 설정
d1829 72
d2141 15
d2162 6
d2175 1
d3882 2
d3885 7
a3891 1
메인 스킨에서는 메인 스크립트가 작업을 하므로, 큰 도움이 되지 않을 수 있다.
@


1.92
log
@1.6 p0
@
text
@a13 23
	- doc / 1.4p8 버젼 부터 기존의 PHP 버젼보다 한단계 높인 버젼을 사용한다.
		-- 이전 버젼에서는 PHP >= 4.2 이상이면 어디든지 사용이 가능했다.
		-- 현제 버젼부터는 PHP >= 4.3 이상이어야한다.
		-- PHP 4.3 버젼은 2002년에 발표되었다. 아주 오래전에 발표되었으며 현제까지 4.3 이하의 PHP 버젼을 사용하는 서버 컴퓨터는 보지 못했다.

	- done / 스킨(템플릿)별 캐쉬
	- done / 쇼핑몰 아이템 수정에서 카테고리 선택할 수 있도록 한다.
	- done / 사용자 접속(IP) 차단 기능 강화
	- done / category.order_no 추가. 카테고리 리스트 순서. 메뉴나 기타 상황에서 리스트를 할 때, 순서를 지정
		-- ALTER TABLE `category` ADD `order_no` TINYINT NOT NULL ;

ALTER TABLE `post` ADD INDEX ( `idx_parent` ) 
ALTER TABLE `post` ADD INDEX ( `idx_category` )
ALTER TABLE `post` ADD INDEX ( `idx_category_type` ) 
ALTER TABLE `post` ADD INDEX ( `idx_user` ) 
ALTER TABLE `post` ADD INDEX ( `state` ) 	


	- mod 모듈별 캐쉬 기능 삭제
		-- add 스킨(템플릿)별 캐쉬 기능 사용
	
	
	- 쇼핑몰 전용 shop_v1 스킨 작성.
d20 3
d28 1
@


1.91
log
@1.6 p0
@
text
@d32 2
a33 2
	- 모듈별 캐쉬 기능 삭제
		-- 스킨(템플릿)별 캐쉬 기능 사용
a58 1
	- 캐시 파일 관리. 오래된 캐시 파일 자동 삭제 문제.
@


1.90
log
@1.6 mall work
@
text
@d24 6
a29 1
	
d32 2
d36 1
d38 1
a38 1
	- 쇼핑몰 전용 shop_v1 스킨 작성 중. mall 카테고리 작업 병행
d40 2
a41 4
	
	- 관리자 화면, 주문 관리
	- 입금 확인 중, 확인 완료, 배송 준비 중, 배송 중 단계별 표시
	- 카드 결제 시스템 적용
a42 4
	- 1.4.2p10 쇼핑몰 기능 강화 버젼 배포
		-- soaps 같이 배포
		
	
d44 1
a48 12
	
	
	
	- 메일 수집을 방해하기 위한 표현.
		-- @@ 을 (at) 으로 표현.
		-- mail-tag.com 을 이용한 메일택 사용 옵션
		

	- 쇼핑몰 스킨 작업을 진행하면서, 기능 보완 및 강좌가 필요하다.

	- 팝업 창. 모듈로 추가 할 것.
		-- 필요 하기는 하는데, .... 레이어로 만들기가 쉽지않다. 따라서 그냥 팝업창으로...
a58 9
	- 장난 rss reader 디자인 수정, 전체 내용 읽음 상태 표시 기능 추가.
		-- 3회 연속 rss 피드를 읽이 못하면, 웹서버 다운 가능성이 있다. 메세지를 표시한다.
		-- 사이즈 조절 기능
	
	- soaps 를 기본적으로 포함해서 배포

	- deletefile_submit 에서 글 캐시 삭제
		-- modify_submit 에서도 확인

a85 5
ALTER TABLE `post` ADD INDEX ( `idx_parent` ) 
ALTER TABLE `post` ADD INDEX ( `idx_category` )
ALTER TABLE `post` ADD INDEX ( `idx_category_type` ) 
ALTER TABLE `post` ADD INDEX ( `idx_user` ) 
ALTER TABLE `post` ADD INDEX ( `state` ) 
a113 1
	- 국내 GPL 소스 활용. 소스가 GPL 이면, 대부분의 경우 스킨도 GPL 이 된다. GNUBoard, TT 등 많은 툴이 있따.
d157 1
a157 1
	- 1.6 발표
d176 2
a177 1
		
@


1.89
log
@outskin
@
text
@d20 4
a25 1
	- "왕초보 쇼핑몰 만들기" 강좌 & 쇼핑몰 전용 스킨 작성
d27 9
d37 12
d58 2
d69 4
d76 1
a76 2
	- 캐시 방법. 스킨, 템플릿 단위로 이동하는 방법을 고려,
		-- 그리고 사이트가 느린 것이 DB 쿼리 때문인지, 네트웍때문인지 잘 판단해야한다.
d92 1
d94 7
d117 4
d133 5
d175 5
d181 5
a185 2
		
	- 1.4 발표
d204 6
d211 2
a212 1
	PHP 지원 버젼을 4.2 로 고수한다.
d783 2
d3498 3
d3504 1
a3504 1
그러나 본인이 직접 작성한 라이브러리는 모듈 디렉토리에 직접 저자을 하면된다.
d3509 2
a3510 2
include("module/$cate/xmlrpc.inc");
include(script("api_library.php"));
d3514 7
d3627 4
a3630 1
[*] nextpage
d3638 5
d3850 48
@


1.88
log
@skin cache
@
text
@d25 5
d3765 3
@


1.87
log
@p8 user signup & read
@
text
@d14 7
d3750 11
@


1.86
log
@p8 user signup & read
@
text
@d15 7
a21 1
	- 레이어 팝업 창. 모듈로 추가 할 것.
d26 3
a28 1
		
a40 1
	- "왕초보 쇼핑몰 만들기" 강좌 & 쇼핑몰 전용 스킨 작성
d2869 10
@


1.85
log
@autologin time configuration of the cookie vars
@
text
@d15 9
@


1.84
log
@1.4p8
@
text
@d23 1
a23 1
	- 사용자 사진을 메인 화면 밑에 나타내는 템플릿 작성
d25 7
d48 2
@


1.83
log
@p6 cache
@
text
@a13 24
	- done / rss 리더기의 문제. 서버로 요청을 할 때마다, 기존 정보를 중복해서 가져온다.
		-- 이로 인해서 트래픽 부하가 생긴다.
		-- 간단하게 etc/rss.php 로 해서 회원,글 정보에 대해서, 특정 시간 부터 이름,시간,제목만 출력하도록 한다.
		-- 이를 위한 리더기를 만든다.



	- done / 사용자 정보를 보는 페이지에서 바로 코멘트를 작성할 수 있도록 할 것.
	- done / 사용자 닉네임을 이미지로 표현. 클릭시 기본 정보 보기 화면으로 이동
	
	
	- done / 게시판 글 쓰기 시 비밀글 옵션 체크하고, 리스트에서 비밀글이라고 표현되도록 하고, 운영자와 글쓴이가 볼 수 있다.
		-- 비밀글도 제목은 리스트를 해준다.

		

	- doing / 캐쉬 관련 기능. 간단하게 처리했다. 빌드가이드 항목을 참고한다.
		-- 압축 모듈과 연동 시, 주의 요망. 아직까지는 문제 없음.
	


	
	- 1.4 p6 발표

d15 4
a20 1

d27 1
d3147 5
a3151 1
모듈로 작성이되어야하며, 추가 스크립트, endup.php 정도로 처리를 하면된다.
@


1.82
log
@p6 cache
@
text
@d2856 10
d3686 5
@


1.81
log
@p6 cache
@
text
@d3688 8
@


1.80
log
@p6 cache
@
text
@d2714 7
@


1.79
log
@p4
@
text
@d30 12
d45 1
a49 6

	- "왕초보 쇼핑몰 만들기" 강좌 & 쇼핑몰 전용 스킨 작성
	
	- 설치를 할 때에 퍼미션이 올바르지 않으면, 수행을 할 수 없도록 강력한 조치가 필요하다.
	
	
a50 2
	- 1.4 p4 발표

d52 5
d2242 10
d2706 5
d3567 127
@


1.78
log
@p4
@
text
@d45 1
d47 4
a50 3
	
	- user.login_count 로그인 횟수 기록
	- user.hits 사용자 정보가 읽힌 횟수 기록
@


1.77
log
@p4
@
text
@d3533 7
@


1.76
log
@1.4 patch
@
text
@d44 7
d1431 4
d1439 2
@


1.75
log
@roll template
@
text
@d550 11
@


1.74
log
@roll template
@
text
@d25 3
a27 2
	- done / 게시판 글쓰기시 비밀글 옵션 체크하고, 리스트에서 비밀글이라고 표현되도록 하고, 운영자만 볼 수 있도록 한다.
		-- 지금은 "관리자" 로만 해놓았고, 자기가 쓴 글을 자기가 볼 수가 없다.
d29 1
d31 1
a31 2
	
	
@


1.73
log
@- private posts
@
text
@d25 1
a25 1
	- 게시판 글쓰기시 비밀글 옵션 체크하고, 리스트에서 비밀글이라고 표현되도록 하고, 운영자만 볼 수 있도록 한다.
@


1.72
log
@- applying user nick image into orange
- write user comment
@
text
@d24 3
d28 2
d35 1
@


1.71
log
@- applying user nick image into orange
- write user comment
@
text
@d20 4
a23 3
	- 사용자 정보를 보는 페이지에서 바로 코멘트를 작성할 수 있도록 할 것.
		-- idx_category_type = CATE_USER, idx_parent = 보내는이. idx_user = 보내는이, 자신의 코멘트
		-- 본인에게는 쪽지로도 글이 전송되도록 한다.
d26 1
a26 1
	- 사용자 사진을 메인 화면 밑에 나타내는 방법
a27 1

a28 1
	- 무료 계정 사이트
@


1.70
log
@- applying user nick image into orange
- write user comment
@
text
@d3484 19
@


1.69
log
@no message
@
text
@a19 2
	- 장난 연습장. HTML 이 그대로 적용되는 게시판.
	
d21 1
a21 1
		-- idx_category_type = CATE_USER, idx_parent = 받는이. idx_user = 글쓴이
d23 4
@


1.68
log
@1.4 work
@
text
@d14 4
d20 9
d32 2
@


1.67
log
@1.4 work
@
text
@a13 57
	-- 변경된 DB 항목
	
ALTER TABLE `user` ADD `image_nick` INT NOT NULL ,
ADD `image_4x5` INT NOT NULL ,
ADD `image_5x7` INT NOT NULL ,
ADD `image_3x4` INT NOT NULL ,
ADD `image_5x5` INT NOT NULL ;

ALTER TABLE 
ADD `origin` VARCHAR( 128 ) NOT NULL ,
ADD `license` VARCHAR( 255 ) NOT NULL ;

ALTER TABLE `category` ADD `image_width` SMALLINT NOT NULL ,
ADD `image_height` SMALLINT NOT NULL ,
ADD `image_view` TINYINT NOT NULL ;

ALTER TABLE `post` ADD INDEX ( `dateTime` ) 
ALTER TABLE `post` ADD INDEX ( `dateTime_firstwrite` ) 
ALTER TABLE `post` ADD INDEX ( `recommend` )
	- done 사용자 이미지 관련 DB 항목 추가	
		-- user.image_nick 이미지 닉 46x14 px
		-- user.image_4x5 신분증 크기 4x5 cm ( 113 x 142 px )
		-- user.image_5x7 명함 크기 5x7 cm ( 142 x 198 px )
		-- user.image_3x4 반명함 크기 3x4 cm ( 85 x 113 px )
		-- user.image_5x5 비자 사진 크기 5x5 cm ( 142 x 142 px )
	- bug 카테고리 수정시 parent 항목 처리
	- done 게시판 관리자 기능 강화
		-- 생성 기능
		-- 삭제 기능
		-- 스킨 변경 가능. 이를 통해서 게시판마다 스킨을 번갈아가면서 홈페이지를 보여줄 수 있다.
	- done / 글 복사 기능 구현한다
	- 템플릿 구조 적용 skin/template 디렉토리에 모든 템플릿을 저장한다.
		-- doc. CSS 등, 공통적으로 사용하는 것이라도 필요한 경우 직접 인클루드해야한다.
		<div style='float:right;'>
			<?include(template('manager_article'))?>
		</div>
	- done / 재 사용을 위한 기본 스킨 다듬기
	- done / 게시판 설정에서 이미지 표현. 너비, 높이 조절, 클릭시 팝업 조절.
		-- image_width, image_height DB 항목 추가. 카테고리별 기본 이미지 사이즈.
		-- image_view (none | popup | link | newwindow)
	- done / 글의 저작권 표현을 위한 필드 추가
		-- post.origin 글의 출처 [직접 작성] 이름, [기타] 연락처,
		-- post.license 글의 저작권 public, GPL, private, 기타 [라이센스 URL]
	- mod / 기본 스킨인 default 스킨이 좀 다듬어졌다. 이로 인해서 default 스킨을 참조하는 타 스킨에 영향이 미칠 수 있다.	
	- done / outskin 작성. outskin.html 과 스킨 노트 참고
	- done / 주소변환. ?234 와 같이 is_numeric 조건에 만족하면 게시판 글 번호로 인식을 해서 보여준다. ?cate=bbs&mode=read&idx=234 로 변경 시켜주는 것이다.
		-- 기존에는 ?{숫자} 의 값이면 카테고리로 연결이 되었다.


	- done / 쇼핑몰 관리자 모드 기능 강화
		-- 쇼핑몰 관리자 모드에서, 카테고리 생성, 수정, 삭제.

	- done / 잘못된 접근 처리 스킨 파일 wrongpage.html 을 통해서 오류 메세지를 표현할 수 있다.

	- fix / 글 작성 후, 첨부 파일을 추가할 때, 첨부 파일의 총 갯수 표현이 안되던 문제

	- 1.4 발표
@


1.66
log
@1.4 work
@
text
@d68 2
@


1.65
log
@1.4 work
@
text
@d66 1
d1641 1
a1641 1
루트(root, 계정) 관리자 - 홈페이지 서버의 디렉토리 계정을 직접 알고 있는 사람. files/system.conf.php 파일에 등록된 아이디를 가르킨다. 루트관리자의 등급은 슈퍼관리자와 동일하다. 30000 (3만) 이다. 다만 system.conf.php 에 아이디가 기록이 되어 있어서 시스템적인 작업을 처리할 수 있다.
d3514 7
@


1.64
log
@1.2p2
@
text
@d16 1
a16 1
	ALTER TABLE `user` ADD `image_nick` INT NOT NULL ,
d22 11
a32 1

a38 1

d44 17
d63 5
a69 12
	- 기본 스킨 다듬기. #여기서부터. 게시판 대충 다듬었다. 쪽지 손보고, 아래 항목들 처리하고 나머지 처리한다.
		-- image_width, image_height DB 항목 추가. 카테고리별 기본 이미지 사이즈.
		-- post.origin 글의 출처 [직접 작성] 이름, [기타] 연락처,
		-- post.license 글의 저작권 public, GPL, private, 기타 [라이센스 URL]
		
		
	- 글 이동, 복사를 구현한다. 링크에 대해서는 차후에한다. 복잡해지는데 반해 효과가 미미하다.
	- default 스킨에서 글 삭제가 제대로 안됨. 본인의 글을 삭제하는데 비밀번호를 묻는다.
	
	
	
	- outskin 자세한 설명
d71 1
a72 4
	- 쇼핑몰 문서화 밑 "왕초보 쇼핑몰 만들기" 강좌 & 스킨 작성
		-- 쇼핑몰 관리자 모드에서, 카테고리 생성, 수정, 삭제.
		-- 상품 추가, 수정, 삭제,
		-- 주문 내역 리스트, 수정, 삭제
a73 5
	- 주소변환. 필요성에 대한 검토가 필요. ?234 와 같이 is_numeric 으로 들어오면 게시판 글 번호로 인식을 해서 보여준다. ?cate=bbs&mode=read&idx=234 로 변경 시켜주는 것이다.	
		-- 현재는 ?{숫자} 의 값이면 카테고리로 연결이 된다. 이런일이 없도록 가능한 빨리 처리를 한다.
		
	- doc / easyEditor 의 크기를 조절하기 위해서는 <div></div> 감싸고 스타일을 지정하면된다.
	- 1.2p2 발표
d126 1
a126 1
	- 1.4.0 발표
d625 3
d651 4
d782 15
d1060 7
@


1.63
log
@outskin
@
text
@d14 8
a21 1
	- 퀵돔 1만개 이상 신청.
d23 6
d31 1
a31 1
	- mod 게시판 관리자 기능 강화
d36 17
a52 2
	- 기본 스킨 다듬기
	- 
d54 1
a54 1
		-- 카테고리 생성, 수정, 삭제.
d57 3
d61 1
d64 11
d83 1
a83 1
	- 주소변환. 필요성에 대한 검토가 필요. ?234 와 같이 is_numeric 으로 들어오면 게시판 글 번호로 인식을 해서 보여준다. ?cate=bbs&mode=read&idx=234 로 변경 시켜주는 것이다.	
d614 21
d777 1
a777 1
file.idx_post							; 파일의 정보가 기록될 글 번호
d798 14
a812 1
개인 사진은 file.idx_category 에 1 을 주고, file.idx_post 에는 사용자 idx 를 둔다.
d3466 8
@


1.62
log
@outskin
@
text
@d23 2
a24 1

@


1.61
log
@delete & modify bbs
@
text
@d3383 5
@


1.60
log
@delete & modify bbs
@
text
@d11 1
a11 1
표기: fix 는 고쳐진것, mod 는 변경된 것(문제가 해결되지 않았을 수 도 있음.), doing 은 처리 중인 내용을 담고 있다.
d15 10
a24 7
	
	
	- 게시판 관리에서 게시판 생성, 삭제 기능 추가. 카테고리를 통해서 생성하니 복잡하다.
		-- todo: 게시판 관리. 생성, 삭제, 스킨 설정
	
	
	- 쇼핑몰 문서화 밑 "왕초보 쇼핑몰 만들기" 강좌
d29 2
a30 1

d3375 8
@


1.59
log
@1.2 p2
@
text
@d17 3
a20 1
	- 게시판 관리에서 게시판 생성, 삭제 기능 추가. 카테고리를 통해서 생성하니 복잡하다.
d1841 12
a1852 1
$info['order']					= 메뉴에 표시될 순번 ( 이 값은 낮을 수록 메뉴가 위에 표시가된다. 시스템 모듈 2, 일반 모듈 5. 스킨이나 모듈, 업데이트, 백업 등과 같이 시스템적인 모듈은 2의 값을 가진다. 쪽지, 메모장과 같은 모듈은 일반 모듈로서 5 이상의 값을 가진다. 생략하면 9 의 값을 가지며 맨 밑에 표시가된다.)
@


1.58
log
@1.2 test
@
text
@d682 11
@


1.57
log
@1.2 test
@
text
@d14 10
a25 3
	- 퀵돔 1만개 이상 신청.
	
	- done / 게시판 관리에서 게시판 생성, 삭제 기능 추가. 카테고리를 통해서 생성하니 복잡하다.
@


1.56
log
@1.2 test
@
text
@a12 69
	- 데이터베이스 변경 사항. 아래의 필드를 테이터베이스 변경에 적용시켜야한다.
			ALTER TABLE `category` ADD `idx_parent` INT UNSIGNED NOT NULL;
			ALTER TABLE `post` CHANGE `birth` `birth` INT( 9 ) UNSIGNED NOT NULL;
			ALTER TABLE `post` CHANGE `state` `state` VARCHAR( 128 ) NOT NULL;

	- security related bug fix / 로그인 상태에서 설치를 진행할 경우, 시스템 파일의 기존 정보에 덮어 쓰여진다.
		-- 보안 관련 패치이므로 기존 모든 버젼이 업그레이드를 해야한다.

	- mod / output_compress 모듈에서 통계 부분에 이상이 발생. 모듈 재 설치시 초기화 하도록 변경.
		-- 모듈 업데이트를 하기 위해서는 반드시 먼저 모듈을 제거하고 업데이트를 해야한다.
		
	- fix / 설치시 undefined index - OS 가 에러

	- done/doc/ 모든 HTML FORM 에서 nextpage 값을 사용할 수 있다. 이 값을 지정할 경우, FORM 이 올바로 수행되면 nextpage 에 지정된 url 로 이동을 한다. 이때 스킨 파일은 로드되지 않는다.
		-- outskin 제작을 할 때 사용할 수 있다.
		-- doc/ 이에 따라서 로그아웃을 할 때에 ?logout 과 같이 할 수 있으며, <a href='?cate=user&mode=logout_submit&nextpage=<?=$nextpage?>'> 과 같이 해도된다.
		-- doc/ 실제 예제는 src/outskin 에 있다.


	- done / 카테고리를 계층적으로 만들 수 있다. module/category/README 참고
	



	- done / 쇼핑몰
	
	- done / doc / 야그 / 현제 접속자 리스트 & 메시징 & 채팅방 GPL 프로그램
		-- etc/yag 디렉토리에 업로드를 하고 웹브라우저로 etc/yag/install.php 로 접속해서 설치를 한다.
		-- 스킨에 코드를 집어 넣는다.
		
	- done / 게시판 관리에서 게시판 생성, 삭제 기능을 추가한다. 카테고리를 통해서 생성하니 복잡하다.

	
	- done / 관리자 화면에 DB 구조를 보고 어떤 버젼이 업데이트되었는지 또는 해야하는지 체크를 해준다.
	
	- done / src/phpinfo.php 를 추가
	
	- 업데이트 스크립트 작성
	
	- 설치 테스트
	
	- 1.2 정식 버젼 발표
	
	
	
























d18 1
d3333 1
d3335 4
@


1.55
log
@1.2 test
@
text
@d13 1
a13 1
	- 데이터베이스 변경 사항. 아래의 필드를 테이브베이스 변경에 적용시켜야한다.
d16 1
a16 1
			ALTER TABLE `post` CHANGE `state` `state` VARCHAR( 128 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
@


1.54
log
@1.2 work
@
text
@a44 1
	- 설치 화면의 디자인 변경
d48 5
a52 2
	- src/phpinfo.php 를 추가
	- 함께 장난을 개발하실 기획자, 디자이너, 프로그래머, 시스템 관리자를 찾습니다.
a53 4
	- q-log.com 관리자와 상의해서 학습을 위한 계정 지원이 되는지 물어본다.
		-- 불가하다면, 개인용으로 서버를 관리하는 사람들과 연락을 해본다. 실제로 개인용 컴퓨터로 서비스하는 분들이 있다.
		-- http://www.bigumdo.net/
		-- ysbnim.codns.com
d56 2
@


1.53
log
@1.2 work
@
text
@d45 1
a45 1
	- 설치 화면의 디자인을 세련되게 바꾼다.
a49 1
	- 설치 화면에 추가할 정보: 홈툴을 설치하면 설치한 곳의 도메인이 http://jangnans.com 에 자동 등록되고, 새소식과 업데이트 정보를 자동으로 알려줍니다.
a55 1
		
d87 2
@


1.52
log
@1.2 work
@
text
@d37 1
a37 1
	- 쇼핑몰
d39 3
a41 3
	- 현제 접속자 리스트 & 메시징 & 채팅방 GPL 프로그램 http://www.yagne.com/index.html 을 수정해서 곧바로 사용 가능하도록 한다.
		-- yag 에 문제점 1. 서버 부하, 2. 데이터량(페이지 한번 이동시 200 kb 를 먹는다.)
		-- 문제점을 수정한다고 하지만, 정 안되면 connectors 의 디자인을 수정한다.
d43 1
d45 7
a51 2
	- etc/javascript/test.html 에 좋은 소스있음.활용할 것.

d55 2
d58 26
a84 9
	- 답변이 달리면, 원글의 시간이 갱신된다.
		-- 이 때, SOA 에서는 원글과 답변글 두개다 새글로 인식이된다.
		-- 옵션으로 처리를 한다.

	- 실시간 접속자 정보 리스트. module/connectors 손을 더 보고, 아이디를 리스트할 수 있도록 한다.
	
	- 폼메일, contact, 의견, 버그 리포팅 등의 사항을 처리할 수 있는 모듈. 내용은 DB 로 저장을 하고, 메일로도 전송을 한다.
	- todo/ 쪽지에서 총 쪽지의 갯수와 새쪽지에 대해서 사용자 정보 테이블에 필드 생성이 필요하다. 그렇지 않으면 매번 글 영역에서 총 갯수를 세어야한다.
		DB 구조의 변경이 필요하므로 다음 버젼업을 할 때에 처리를 한다.
a85 9
	- http://jangnans.com/study/ 에 스터디 사이트를 만든다.
	- 장난-홈툴즈 소개서 작성.
	- 게시판 관리에서 게시판 생성, 삭제 기능을 추가한다. 카테고리를 통해서 생성하니 복잡하다.
	- 카테고리 계층도 한눈에 보는 화면과 이동, 복사를 편하게하는 기능이 필요하다.
	- 설치 화면의 디자인을 멋있게 확 바꾼다.
	- 관리자 화면에 DB 구조를 보고 어떤 버젼이 업데이트되었는지 또는 해야하는지 체크를 해준다.
	- src/phpinfo.php 를 추가
	- 함께 장난을 개발하실 기획자, 디자이너, 프로그래머, 시스템 관리자를 찾습니다.
	- 1.2 정식 버젼 발표
d88 2
d93 1
d107 1
d111 1
a111 1
	- 1.2.0 매스 포스팅 차단 모듈 강화.
d119 7
@


1.51
log
@1.2 security bug fix
@
text
@d16 1
d19 2
d23 4
a26 2
	- fix / 설치시 undefined index - OS 가 에러가 난다. 옵션 처리를 해야겠다.
	- doing / 모든 HTML FORM 에서 nextpage 값을 사용할 수 있다. 이 값을 지정할 경우, FORM 이 올바로 수행되면 nextpage 에 지정된 url 로 이동을 한다. 이때 스킨 파일은 로드되지 않는다.
d33 10
d44 1
d46 4
a49 1
	- 쇼핑몰, 폼메일
d67 2
d70 4
d95 1
a95 1
	
d99 2
d212 11
a222 1
[*] 코딩 검토
d854 10
a863 4
** post.state char(1)
현재 글의 상태를 나타낸다.
empty(NULL) 는 일반 글
R 은 공지사항
d1441 4
d2769 46
d3356 20
@


1.50
log
@work for version 1.2
@
text
@d17 1
@


1.49
log
@category
@
text
@d30 5
d55 1
a55 1
	- 답변이 달리면, 원글의 시간이 갱신된다. 이 때, SOA 에서는 원글과 답변글 두개다 새글로 인식이된다. 어떻게 처리할 지, 생각을 해 본다.
d699 2
@


1.48
log
@category
@
text
@d13 4
d18 1
d26 2
a27 4
	- 쇼핑몰을 만들기 전에 카테고리 관리에 대한 기능을 보강.
			category.idx_parent 필드를 추가한다.
			카테고리 계층구조 추가, 수정, 삭제 기능이 있으면 된다.
			삭제를 할 때 하부 구조가 존재하면 삭제를 못하게 한다.
d38 4
d662 9
d2671 41
@


1.47
log
@outskin
@
text
@d19 2
a20 2
		
	
d23 1
a23 1
			카테고리 추가, 수정, 삭제 기능이 있으면 된다.
d25 1
a25 1
	
d32 1
a32 1
		
@


1.46
log
@mod output_compress
@
text
@d11 1
a11 1
표기: fix 는 고쳐진것, mod 는 변경된 것(문제가 해결되지 않았을 수 도 있음.)
d15 5
a19 1
	- 주소변환. ?234 와 같이 is_numeric 으로 들어오면 게시판 글 번호로 인식을 해서 보여준다. ?cate=bbs&mode=read&idx=234 로 변경 시켜주는 것이다.
a32 5
	- outskin 제작법
		홈페이지 주소는 http://jangnans.com/study/
		프로그램 설치는 http://jangnans.com/study/jangnan/ 으로 되어있고,
		디자인의 주소는 http://jangnans.com/study 로 할 때에
		$dirRoot = "./jangnan" 으로 해서 디자인을 하는 방법에 대해서 설명을 한다.
d36 2
a37 1
	
@


1.45
log
@patch
@
text
@d11 1
d13 2
a14 2
	- output_compress 모듈에서 통계 부분에 이상이있다.
	- 설치시 undefined index - OS 가 에러가 난다. 옵션 처리를 해야겠다.
@


1.44
log
@1.0.6 work
@
text
@d12 3
a14 1
	output_compress 모듈에서 통계 부분에 이상이있다.
d16 4
a20 2

	- 쇼핑몰을 만들기 전에 카테고리 관리에 대한 기능을 보강.
@


1.43
log
@1.0.6 work
@
text
@d12 4
@


1.42
log
@no message
@
text
@d12 1
a12 10


	- http://jangnans.com/study/ 에 스터디 사이트를 만든다.
	- 장난-홈툴즈 소개서 작성.

	
	- 설치 로그에 서버 OS, 웹서버 버젼, PHP 버젼, MySQL 버젼 등을 통계 목적으로 기록한다.



d25 2
a26 1

d28 3
d33 1
a33 6

	- skin/default/README 에 키, display_inline_copy = on 이면 HTML 상단에 카피라이트 태그를 넣어준다. 웹페이지에서는 안보임.

	
	- 회원 가입 후 자동 로그인 옵션 처리
	- 쇼핑몰을 만들기 전에 카테고리 관리에 대한 기능을 보강.
@


1.41
log
@v1.0.4 p6
@
text
@d12 2
a13 2
	- bbs 모듈에 공지사항 옵션, 관리자(들)를 지정하는 옵션 추가
	- user 모듈에 회원 관리 기능 강화
a14 1
	- 버그 잡이를 위한 스킨 작업을 하면서 utility.php 라이브러의 함수를 보고 설명과 활용법에 대한 예를 한다.
a15 2
	- 네이버 카페 게시판 리스트를 하면, 웹진형, 앨범형, 블로그형 등 하나의 글 영역의 정보들을 다양하게 표현할 수 있다.
		장난은 애초부터 이것을 염두에 두고 설계되었다. 따라서 실행을 한다.
a16 8
	- done/doc display('모듈명') 으로 하면 해당 모듈의 정보가 출력되도록한다.
		예를 들면 display('connectors'); 가 된다.
		이때, module/connectors/startup.php 에서는 display_connectors() 함수를 등록해놓아야한다.
		display('connectors', associative-array); 와 같이 값을 전달한다.
	
	
	- 1.0.6 발표
		
d18 1
d118 2
a119 1
		
d507 2
d550 11
d565 2
d600 1
a600 1
skin							카테고리에서 사용하는 스킨
d647 7
d1463 2
a1464 1
사이트 등급: 루트, 슈퍼, 관리자, 사용자
d1475 11
a1485 3
카테고리 관리자(admin) - user.grade 와 상관이 없이, user.manager 에 기록된 카테고리를 관리할 수 있다.
새로운 카테고리 생성과 같은 작업을 하지 못하지만, 존재하는 데이터들에 대해서 카테고리 별로 액세스를 할 수 있다. 존재하는 정보 수정/삭제를 할 수 있다.
카테고리(모듈)별로 관리를 하기 때문에 카테고리 관리자라고 한다.
d1615 7
a1621 1
		
d1997 9
d3188 11
@


1.40
log
@v1.0.4 p4
@
text
@d12 2
a13 3
 

	
a16 2
	

a18 2
		

d32 1
d34 1
d422 3
d436 4
d559 7
a565 1
이 테이블은 영역의 정보를 담는 곳이다.
d588 4
d596 1
d702 131
d908 3
a1606 146
[*] 테이블과 그 필드 설명

테이블 명칭은 user, category 와 같이 그것의 뜻하는 단어의 명사를 그대로 과감하게 사용했다.
xxx_user, xxx_category 와 같이 복잡하게 테이블 명칭을 다루지 않는다.



[-] post 테이블

post.idx_category 현제 글이 속한 카테고리 정보를 가리키는 번호이다. category.idx 와 동일한 값이다.
	현제 글의 카테고리 정보가 없는 경우 0의 값이 될 수있다.
	예를 들면, 쪽지글의 경우, 카테고리 정보가 없다.
post.idx_category_type 현제 글(정보)의 종류를 나타낸다. 이 값은 default.php 에 상수로 정의되어 있다.


post.idx_parent 에는 현제 글이 관련된 상위 정보를 가리킨다. 보통의 경우 현제 글의 참조글 정도가 된다.
이 값은 상황에 따라서 다르게 쓰일 수 있다.


이 테이블에 모든 텍스트 형식의 글이 저장된다. 그냥 게시판의 게시물 테이블 정도로 이해를 하면 된다. 실제로는 그보다 넓은 범위로 모든 text 형식의 글을 보관하는 테이블이다.
게시판 게시물, 방명록 글, 코멘트 글, 메모장 글 등... 차후에 추가되는 모든 기능에서도 text 형식의 내용은 이 테이블에 보관되어야한다.



post.idx 는 글번호(정보의 고유번호)이다. #domain.POST.category.post.idx 와 같이 전 세계에서 고유 번호를 만들 수 있다.
글 번호는 글이 기록될때 마다 자동으로 증가하는 값이다.

 

idx_category  는 현재 정보의 카테고리를 가르킨다. 이 값은 category.idx 와 동일하다.
post 테이블에 기록되어 있는 데이터는 모두 이 값을 가진다. 이 값은 post 내에 저장된 내용의 분류(카테고리)를 하고 그룹으로 관리할 수 있게한다.
새로운 정보 영역(카테고리, 게시판 등)를 추가하고 글을 보관하려면 먼저 category 테이블에 카테고리를 생성하고 post 테이블에 글을 기록하되 post.idx_category 에 해당 category.idx 를 기록해 주면된다.



idx_user 는 현재 정보의 주인이 회원일 경우 그 주인의 user.idx 를 나타낸다.
즉, 현제 정보의 카테고리는 idx_category==category.idx 를 찾으면 되고 현재 정보의 주인은 idx_user == user.idx 를 찾으면된다.


state 는 정보의 상태를 나타낸다. 정보의 상태에는 접근 권한을 포함하지 않는다. 접근 권한은 rwxs 필드가 모두 맡아서한다. state 에는 현재 게시물이 공지사항 글인지, 삭제된 글인지, 등등을 나타낸다.



rwxs 필드는 권한 설명을 참고한다.


id 는 게시물의 아이디이다. 회원 아이디, 카테고리아이니, 게시판 아이디가 아닌, 게시물 정보 고유의 아이디이다. post.id 가 의미하는 바가 게시물의 아이디이다. 용도가 없으므로 사용되지 않는 필드이다.

post.secret 는 비밀 내용을 기록(포함)한다. 예를 들면 다음과 같은 상황이 발생할 수 있다.
사용자가 자신의 아이디/비밀번호를 잊어버려서 로그인을 못하는 경우, 또 어쩌다 보니 패스워드 확인을 받을 방법이 없는 경우, 이러한 사정을 관리자에게 본문에 기록을 하고, 비밀내용에다 자신의 주민번호나 연락처를 남기면 다른 사용자는 못보고 관리자만 보도록 하는 것이다.

또 다른 예로는 자신의 메일 계정에 정보가 있는 데, 그 정보를 이용하지 못해서 도움을 요청할 경우, 메일 주소와 비밀번호 등을 기록하여 관리자만 보게할 수 있다. 물론 게시물 자체를 비밀글로 하면될 수도 있다. 그렇지만 본문 내용은 다른 사람이 봐야하고, 특정 글만 관리자만 봐야한다면 이 경우 딱 알맞다.




** 답변글(뎃글,코멘트) 관련

post.idx_parent 에는 부모글 번호가 기록이된다.

예를 들어 글번호 100 번에 답변글 형식으로 글을 쓰면 글 번호는 234 번이 될 수 있다.
이때 234 번이 100 번의 답글이나 뎃글이라는 표시로 post.idx=234 의 글에 post.idx_parent=100 으로 기록을 해 준다. 그리고 100 번 글과 관련된 글을 찾을 때에는 post.idx_parent=100 으로 검색을 하면 된다.


float post.order_no							idx_parent != 0 일 때, 부모글 밑으로 글이 나타날 정렬 순서이다.
										예를 들면, order_no = 0.1 이 있고, order_no=0.12, order_no=0.2 가 있을 경우
										이 순서대로 글이 나타난다. 중간 중간에 새로운 답변글이 작성된다고 하더라도 소수점을 이용해서 쉽게 추가가 가능하다.

tinyint(4) post.order_depth			idx_parent != 0 일 때, 부모글 밑으로 글이 날때 들여쓰기를 몇번할 지 기록한다. 예를 들어 order_depth=3 이면 3번 들여쓰기를 반복한다.


답변글과 관련한 필드는 위의 3가지이다. 일단 idx_parent != 0 이면 답변글이라는 표시이다.
정렬이라든지 들여쓰기를 별도의 order_no 필드와 order_depth 필드를 사용하지 않고, idx_parent 이 필드 하나로 모든 것을 끝 낼 수 있다.
idx=5 && idx_parent=0 일때, idx=123 && idx_parent=5, 그리고 idx=234 && idx_parent=123 과 같이 계속 꼬리를 물고 내려갈 수 있으며 이 경우 계층이 만들어 질 수록 계층별로 정렬하고 들여쓰기를 하면된다.

물론 처리가 가능하지만 효율적인 부분에서 많은 의심이된다.

본 시스템에서는 직접적으로 데이터베이스를 조작하는 것에 대해서 권장을 하지 않는다.
준비된 함수를 통해서 DB 와의 정보 입/출력을 해야하며, 이 경우 이러한 알고리즘에 대해서는 크게 신경을 쓰지 않아도 된다.


** post.state char(1)
현재 글의 상태를 나타낸다.
empty(NULL) 는 일반 글
R 은 공지사항


** post.children
현재 글과 연관된 답변(코멘트)의 수를 기록한다. 삭제(수정)를 할 때, 이 값이 0 이 아니면 할 수가 없다.

** post.files
현재 글과 연관된 파일의 수를 기록한다.

** post.recommend

사용자로 부터 글이 좋다고 추천받은 수를 기록한다.
-1, 0, 1, 2, 3 과 같이 더하고 빼고를 할 수 있다.







현제 글에 대한 코멘트(답변)의 갯수이다.
코멘트의 갯수는 실시간으로 계산을 할 수 있다.







post.idx_link 는 글 링크(참조)를 가르킨다. 글의 복사나 이동과는 달리, 링크는 지정된 글을 참조한다는 것을 의미한다. 예를 들면, post.idx_link = 100 이라면 100 번 글의 분류(글 영역)을 제외한 모든 내용을 그대로 사용한다는 것이다.
편리한 처리를 위해서는 idx_link != 0 이면, idx_link 에 기록된 글의 내용을 현재 내용으로 모두 복사해서 보여준다. 물론 링크되었다고 표시를 해 주면좋다.


















** category 테이블

정보를 리스트를 하거나 정보를 읽기 할 때에는 가능하면 category.id 를 사용한다.
정보의 수정이나 삭제를 할 때에는 category.idx 를 이용한다.


category.number_list				해당 카테고리의 정보 목록 리스트 갯수
number of list 정도로 해석되며 한 페이지에 리스트할 글의 수를 말한다.
0의 값이면 무시되고, 시스템 설정에서 지정하는 $system['numberOfRecords'] 가 사용된다.




@


1.39
log
@v1.0.4 p4
@
text
@a11 9
	- fix/쪽지가 없을 때 에러가 나던 메세지 처리
	- mod / 긴 문자열 자를 때 끝글자가 깨지던 문제 수정
	- fix / 언어팩과 관련된 표기 문제
	- fix / 설치 로그시 장난 버젼 기록
	- fix / 회원 탈퇴시 에러 발생


	- 업데이트하기 전에 반드시 백업을 한번 받도록 할 것. 특히 스킨 디자인의 경우, 덮어쓰여지면 기존 디자인을 잃는 경우가 많다.
	- 1.0.4 패치 4 발표
@


1.38
log
@v 1.0.4 p4
@
text
@d13 4
d19 1
a19 16
 * @@todo 여기에 정의된 상수를 언어팩에서 사용하는 경향이 있다. 언어팩과 오류코드는 별개의 것이어야한다.
 * 예를 들면 언어팩에서 메뉴를 각 언어별로 표시하는데, 여기 오류 코드와는 전혀 연관성이 없다.
	- 언어팩과 관련된 표기 문제.
	- mod / 긴 문자열 자르기 문제.
		다음과 같이 처리를 했다.
		시스템의 (DB) 문자셋이 utf8 인 경우, iconv 를 통해서 문자를 자른다.
		iconv (PHP 4 >= 4.0.5) 지원을 하며, 내장 함수가 아니므로 따로 추가 설치를 해야한다.
		strcut 에서 내부적으로 iconv 를 사용해도 되는 상황이면 iconv 를 통해서 문자열 자르기를 한다.
		
	- access log 파일 압축 및 통계를 낼 것.
	- 회원 탈퇴시 에러 발생
	- 설치 로그시 장난 버젼 기록
	- 관리자 모드에서 Site Open API 설치할 수 있는 링크를 건다.
	- 사이팅 링크도 걸어주고, 기본적으로 장난 홈페이지에 사이팅을 할 수 있도록 한다.
	
	
d161 1
a161 1

d3151 6
@


1.37
log
@v 1.0.4 p4
@
text
@d18 6
a23 1
	- 긴 문자열 자르기 문제.
d27 3
@


1.36
log
@v 1.0.4 p4
@
text
@d21 1
d23 1
a25 1
	- 1.0.6 발표
d41 3
a43 1
		
@


1.35
log
@v1.0.4 p2 work
@
text
@d12 15
a26 1
		- http://jangnans.com/study/ 에 스터디 사이트를 만든다.
@


1.34
log
@v1.0.4 p2 work
@
text
@d12 1
a12 18
	- fix / 회원 가입 후 자동 로그인이 되도록 했다. @@todo 옵션 처리해야한다.
	- fix / install/submit.php 에서 메인 서버로 로그시 installation log 의 정확한 위치
	- doc / 버젼 체계에 따라서 sql 파일이 사용된다. 따라서 자주 배포하면서 버젼만 바꾸고 sql 파일을 준비하지 않는 경우가 발생한다.
		체크를 한다.
	- doc//멀티사이트를 하기위해서는 단순히 DB 접속 정보와 파일 저장공간만 맞추어주면된다.
		즉, 새로 설치를 하되, 정보를 같이한다. DB 가 설치되어있다고 메세지가 뜨면 무시한다.
		멀티 사이트로 http://jangnans.com/siteapi/ 로 SOA 커뮤너티 분리.
	- done / 쪽지(메세지, 내부 메일) 모듈
	
	- 기본 카테고리 추가:
		lecture_hometools, lecture_homepage, lecture_html, qna, ad(광고게시판), picture(이미지 게시판) 가 추가되었다.
		따라서 기존 readme, free, download, member, test 까지해서 총 11개의 카테고리(게시판)이 추가되어서 배포(설치)된다.
	
	- 처음 설치 후 무엇을 어떻게 해야하는지 게시판에 정보를 입력해 둔다.
	- http://jangnans.com/study/ 에 스터디 사이트를 만든다.
	- 재 설치시, 존재하는 기존 데이터 삭제 옵션을 둔다. 즉, 문자셋을 잘못 지정한 경우, 편리하게 재 설치를 할 수 있다.
	
	- 1.0.4 패치 2 발표. 1.0.4.2 버젼이다. 버젼 표기는 1.0.4 이다.
d15 1
@


1.33
log
@orange skin work
@
text
@a23 4



	- orange 스킨 하단 의견. 배포 준비
a24 1

d60 2
d3148 5
@


1.32
log
@orange skin work
@
text
@d21 7
a27 3
	- 기본 카테고리 추가: lecture_hometools, lecture_homepage, qna, ad(광고게시판) 4개가 추가되었다.
		따라서 기존 readme, free, download, member, test 까지해서 총 9개의 카테고리(게시판)이 추가되어서 배포(설치)된다.
		
d29 1
a29 2
	
	- 버그 잡이를 위한 스킨 작업을 하면서 utility.php 라이브러의 함수를 보고 설명과 활용법에 대한 예를 한다.
a30 1
	- 설치후 첫 페이지 디자인을 http://www.land4989.biz/ 정도로 풀 스킨으로 만든다.
d35 1
d38 3
d47 3
d2666 1
a2666 1

d3130 21
@


1.31
log
@orange skin work
@
text
@d21 3
d31 1
@


1.30
log
@orange work
@
text
@d33 5
a85 8
	- 스킨: 모듈별로 display.php 를 두어서 display('모듈명') 으로 하면 해당 모듈의 정보가 출력되도록한다.
		예를 들면 display('connectors'); 가 된다.
		이때, module/connectors/display.php 에서는 startup.php 로 display_connectors() 함수를 등록해놓아야한다.
		display('connectors'); 가 아니라 display_ 는 앞에 붙여주고, display_connectors() 를 바로 호출 하도록 한다.
		display_connectors() 와 같이 사용을 할 때에는 앞에 에러 안나타냄 연산자 @@ 를 붙이도록한다.
		첫번째 입력값으로 1,2,3 이 있을 수 있다. 1은 간단한 표현, 2는 조금 복잡한 표현, 3은 아주 자세한 표현을 해준다. 기본 값은 1이다. 0은 표현을 하지 않는다.
		display('connectors', 2); 와 같이 사용을 할 수 있도록 한다.
		display_connectors 의 경우 에러가 나면, 다음 출력이 전혀 안된다.
@


1.29
log
@1.0.4 p2
@
text
@d47 2
a48 1
	
@


1.28
log
@1.0.6 work
@
text
@d12 2
a13 5
	- default/layout.html 을 수정해서 simple 레이아웃이 맞도록 할 것.
	- 실시간 접속자 정보 리스트. module/connectors
	- 회원 가입 후 자동 로그인이 되도록 했다.
	
	- installation log 의 정확한 위치
a15 6
	- 장난-홈툴즈 소개를 작성해서 홍보한다.

	- 폼메일, contact, 의견, 버그 리포팅 등의 사항을 처리할 수 있는 모듈. 내용은 DB 로 저장을 하고, 메일로도 전송을 한다.
	- 코딩가이드: goBack() 이나 go() 대신 return output(0, 'url', errorcode, 'message') 를 사용할 수 있도록 할 것. end.php 에서도 행동 스크립트에서 return 0 를 했다는 것을 감지할 수 있도록 할것.
	- 버그 잡이를 위한 스킨 작업을 하면서 utility.php 라이브러의 설명과 활용법에 대한 예를 한다.

d19 1
a19 3
		-- 공지사항, 다운로드, 자유토론
	- 장난 메뉴 변경
		-- 공지사항, 다운로드, 자유토론, 강좌(팁,스킨)
a20 2
	- 처음 설치 후 무엇을 어떻게 해야하는지 게시판에 정보를 입력해 둔다.	
	- 1.0.4.2 발표
d22 11
d35 13
a48 1
	- 1.0 정식 버젼 발표
d188 9
d1468 12
a1479 1
post 테이블
d3104 15
@


1.27
log
@1.0.6 work
@
text
@d44 2
@


1.26
log
@1.0.6 work
@
text
@d31 4
d43 1
@


1.25
log
@1.0.6 work
@
text
@a12 1
	
d14 1
d16 1
a16 1

d36 8
d1410 2
a1411 1
	관리자 화면은 스킨 파일을 두지 않는 것이 일반적이다.
@


1.24
log
@1.0.4 work
@
text
@d12 3
a14 9
	- change / category.type 필드가 type unsigned tinyint(4) 로 변경이 되었다.
	- done 설치 시점에서 메인 서버로 설치 내역을 api 로 전송한다. 단순히 통계를 위한 로그이다.
	- done 관리자 모드에서 바로 글쓰기 가능. XML-RPC 로 제작되었다.
	- done 메인서버에 로그 표시, 숨김 옵션 선택
	- done 관리자 모드에서 사용자 정보 보기 기능 강화
	- done 로그를 기록할 때, ?cate=download 에서도 로그를 기록해서, 실제 홈페이지 정보를 홍보하는 이미지를 담는 경우, 엄청난 로그가 발생한다.
		다운로드에서는 로그를 기록하지 않는다.
	- fix 로그 파일 기록이 아이디, 이름을 저장하지 못하던 문제 수정
	- 1.0.4 버젼 발표
d44 1
d54 10
a63 1
		
d1868 2
d3035 22
@


1.23
log
@1.0.4 work
@
text
@d16 4
a19 3
	- 관리자 모드에서 사용자 정보 보기 기능 강화
	- 문제점: 로그를 기록할 때, ?cate=download 에서도 로그를 기록해서, 실제 홈페이지 정보를 홍보하는 이미지를 담는 경우, 엄청난 로그가 발생한다.
		다운로드에서는 로그를 기록하지 않는 옵션을 두도록 해야하겠다.
d21 1
@


1.22
log
@1.0.4 work
@
text
@d13 8
a20 3
	
	
	- done 관리자 모드에서 바로 글쓰기 가능하도록 SOA 클라이언트로 만든다.
d24 1
a24 7
	
	- 문제점: 로그를 기록할 때, ?cate=download 에서도 로그를 기록해서, 실제 홈페이지 정보를 홍보하는 이미지를 담는 경우, 엄청난 로그가 발생한다.
		다운로드에서는 로그를 기록하지 않는 옵션을 두도록 해야하겠다.
	- 관리자 모드에서 회원 정보 보기 기능이 강화되어야한다. 회원에게 메일을 보내거나 홈페이지를 열람할 수 없다.
	
	
	
d147 5
a151 1
	- uidx 에는 사용자 번호값이 저장되도록한다.
@


1.21
log
@1.0.3 work
@
text
@d18 1
a19 1
	- 장난-홈툴즈 소개를 작성해서 홍보한다.
d22 2
@


1.20
log
@1.0.3 work
@
text
@d16 2
@


1.19
log
@1.0.3 work
@
text
@d15 1
d17 3
a21 4

	- 장난-홈툴즈 소개를 작성해서 홍보한다.
	- 관리자 모드에서 바로 글쓰기 가능하도록 SOA 클라이언트로 만든다.
	
@


1.18
log
@1.0.3 work
@
text
@d12 8
a19 1
	- 1.0 베타 발표 후, 테스팅 작업하고, 사용자 참여를 위해서 문서화와 소개를 작성해서 홍보한다.
d21 1
d48 9
a252 2
./src							각종 소스 스크립트가 보관된다.
	./src/ex					예제 파일 디렉토리. 각종 예제 파일이 보관된다. 시스템에 직접 사용되지 않는 파일들이다.
d280 9
a288 1

d524 1
d565 20
d639 2
d688 29
d1718 9
d2999 22
@


1.17
log
@v1.0.2 work
@
text
@a11 4
	- done/사용자 가입을 위한 테이블에 충분한 항목을 준비해 두었다.
	- mod / C:\lab\homepage 에 converter.php 를 이동 시켰다.
	- mod / 도메인 내에서 인증 유지가 되도록했다. 즉, 멀티 사이트를 할 경우, 로그인이 유지된다.
	
a12 1
	
a14 1
	
d16 1
a16 5
	

	- 문서화 후, 1.0 베타 발표.
	- 버그 잡이를 위한 스킨 추가 작업을 하면서 utility.php 라이브러의 설명과 활용법에 대한 예를 한다.
	
@


1.16
log
@v1.0.2 work
@
text
@d13 3
a15 1
	- C:\lab\homepage 에 converter.php 를 이동 시켰다.
@


1.15
log
@v1.0.x work
@
text
@d13 2
a34 1
	- 1.0 베타 발표 후, 테스팅 작업하고, 사용자 참여를 위해서 문서화와 소개를 작성해서 홍보한다.
@


1.14
log
@v1.0.x work
@
text
@d24 3
a26 1
	- 멀티 사이트로 http://jangnans.com/siteapi/ 로 SOA 커뮤너티 분리.
a27 2
	- 멀티 사이트로 http://jangnans.com/web2.0memo/ 로 SOA 커뮤너티 분리.
	- 멀티 사이트로 http://jangnans.com/test/ 에 테스트 사이트 개설.
@


1.13
log
@1.0.a1
@
text
@d14 5
d31 2
d42 1
@


1.12
log
@1.0.a1
@
text
@d108 3
@


1.11
log
@1.0.a1
@
text
@d2897 1
d2901 1
d2903 2
a2904 1
C:\lab\homepage\jangnan\lib,C:\lab\homepage\jangnan\src\ex
@


1.10
log
@1.0.a1
@
text
@d2897 5
a2902 21
C:\lab\homepage\jangnan\lib\category.php,
C:\lab\homepage\jangnan\lib\db.php,
C:\lab\homepage\jangnan\lib\debug.php,
C:\lab\homepage\jangnan\lib\db.php,
C:\lab\homepage\jangnan\lib\default.php,
C:\lab\homepage\jangnan\lib\file.php,
C:\lab\homepage\jangnan\lib\filesystem.php,
C:\lab\homepage\jangnan\lib\list.php,
C:\lab\homepage\jangnan\lib\log.php,
C:\lab\homepage\jangnan\lib\module.php,
C:\lab\homepage\jangnan\lib\mysql.php,
C:\lab\homepage\jangnan\lib\mysql_dump.php,
C:\lab\homepage\jangnan\lib\pager.php,
C:\lab\homepage\jangnan\lib\post.php,
C:\lab\homepage\jangnan\lib\skin.php,
C:\lab\homepage\jangnan\lib\sql_parser.php,
C:\lab\homepage\jangnan\lib\string.php,
C:\lab\homepage\jangnan\lib\system.php,
C:\lab\homepage\jangnan\lib\upload.php,
C:\lab\homepage\jangnan\lib\user.php,
C:\lab\homepage\jangnan\lib\utility.php
@


1.9
log
@1.0.a1
@
text
@d2888 36
@


1.8
log
@1.0.a1
@
text
@d12 2
@


1.7
log
@1.0.a1
@
text
@d7 1
a7 2
This software is licensed under GPL. see README file.
http://www.gnu.org/licenses/gpl.txt
@


1.6
log
@1.0.a1
@
text
@a13 9
	








d19 1
d22 2
d29 1
a29 1
	- 1.0.2 매스 포스팅 차단 모듈 강화.
d35 4
a39 3
	

	- 2.0.1 알파. 1.0 정식 버젼 발표 후 안정화 작업 버젼과 2.0 알파 버젼을 위한 기본 모듈 작업에 들어간다.
d574 16
@


1.5
log
@v 1.0 work
@
text
@d13 1
a13 19
	[ 1.0 작업 ]
	- done // 등급 및 관리자 기능 마무리
	- mod // 잘못된 함수 명칭을 바로 잡았다. 곳곳에서 자주 쓰이는 함수들이라 에러가 속출하고 있다.
		이경우 deprecated 메세지가 뜨도록 했다.
		변경은 if ( isAdmin() == ok ) 를 	if ( admin() ) 와 같이 하면된다.
	- done // user.dateTime_signup 항목으로 처음 가입한 시간을 기록해 둔다.
		dateTime 은 매번 갱신되는데, 사용자 정보가 수정되면, 최신 정보로 사용된다.
	- done // user.skin 필드를 추가해, 사용자 정보 수정 화면에서 개인 사용자 별로 원하는 스킨을 직접 선택할 수 있도록 했다.
		웹브라우저 정보를 체크해서 영어권 지역에서 접속을 하면, 스킨을 영어로 된 것을 선택(또는 자동 지정)하게 할 수있다.
	- done // blog 모듈 추가. 블로그는 사용자(회원)에게 분양을 할 수 있다.
		간단하게 나마 블로그 틀을 갖출 수 있게 해 놓았다.
	- done // rss 모듈 버그 패치
	- 트랙백 send/recv 모듈을 밖으로 떼 내서, 블로그 뿐만 아니라, 게시판 등에서도 사용할 수 있다.
		트랙백 전송 HTML FORM 은 자신의 글 일때만 나타나도록 옵션 처리를 할 수 있다.
		
		게시판에는 트랙백 전송만 해놨다. 트랙백 수신은 블로그를 지켜보면서 block 모듈을 확실히 만들고 게시판에서 트랙백 수신 기능을 단다.
		
	- done // 블로그 모듈 전용 스킨 2개 추가.
	- doc // 블로그든 게시물이든 사용자 정보든, .. 정보를 수정하면 작성된 시간이 갱신된다. 따라서 최신 정보로 이용이된다. (단, 처음 작성된 시간은 DB 에 기록이 보관된다.)
a14 38
	- doc // 임시 스크립트.
		This script is for extra skin work.
		module/user/etc.php 가 임시 스크립트이다.
		기본 기능에 빠진것을 etc.html 과 같은 스킨을 파일을 통해서 직접 코딩을 할 수 있도록 준비를 했다.
		let's see, if there's no user's deregister module, then this lets the web-designer do it by herself using only skin files.
		만약, 회원 탈퇴 기능이 없을 경우, 이 임시 스크립트를 통해서 직접 스킨 작업을 해서 회원 탈퇴 기능을 스킨 작업만으로 제공할 수 있다.
		각 모듈에서 etc.php 이름을 가진 스크립트가 임시 스크립트이다.
	- done // 사용자 정보 관리 강화
		-- 사용자 등급, 카테고리 관리 권한 설정 가능
		-- 회원 강제 탈퇴 처리 가능
		-- 회원 비밀번호 변경 가능. 회원이 비밀번호를 잊어버리고, 분실시 질문 답변도 기억해 내지 못할때, 관리자가 직접 비밀번호를 지정할 수 있도록 했다.
		-- 사용자 아이디, 이름으로 검색이 가능하다. 검색을 한 후 정보를 변경할 수 있다.
		-- 루트 관리자는 슈퍼 관리자나 일반 관리자를 임명할 수 있다.
			슈퍼 관리자는 일반 관리자를 임명할 수 있다.
			일반 관리자는 카테고리 별로 관리 권한을 위임 받을 수 있다.
			사용자 관리 권한을 받은 관리자는 사용자 탈퇴, 비밀번호 변경 등의 작업 처리를 할 수 있다.

	- done // 글 정보 관리 강화
		-- 사용자 정보나 글 정보에 대해서 직접적으로 열람을 할 수 없고, 해서도 안된다.
		-- 글 수정이나 사용자 정보 수정은 안된다.
		-- 글 이동, 글 삭제 기능을 추가했다.
	- done // converter.php
		다른 홈페이지 프로그램의 데이터로부터 장난으로 전환(포팅, 옮기기).
		홈툴즈 버전간의 업데이트도 이와 같이 한다. 메이저 버젼이 변경된 경우는 컨버팅이 필요하다.
		
		사용.
		-- converter.php 를 백업할 홈페이지에 저장.
		-- 웹에서 converter.php 실행. 백업을 한다.
		-- 결과물 jcff 파일을 다운로드.
		-- 장난 홈페이지에 converter.php 와 jcff 파일을 업로드.
		-- 웹에서 converter.php 를 실행해서 복구를 한다.
		
		노트: 컨버팅 관련 파일 저장 장소는 소프트웨어가 설치된 위치이다. 장난의 경우 jangnan.php 가 존재하는 곳이고, zb4 의 경우 zboard.php 가 존재하는 곳에 업로드를 해야한다.
	- done // 비밀번호 체킹을 위한 checkPassword($input_password, $old_password, $type) 으로 하고, 각종 password_type 에 따라서 비교한다.
	- done // 서브도메인으로 사용자 블로그 홈으로 연결할 것. 도메인을 결정하는 것이 필요하다. [*] 서브도메인 항목 참조



@


1.4
log
@v 1.0 work
@
text
@a39 2
		

d54 1
a54 4



	- converter.php
d66 12
a77 1
		
a78 4
	- done // 비밀번호 체킹을 위한 checkPassword($input_password, $old_password, $type) 으로 하고, 각종 password_type 에 따라서 비교한다.
	
	
	- todo. 서브도메인으로 사용자 블로그 홈으로 연결할 것. 도메인을 결정하는 것이 필요하다.
d2910 22
@


1.3
log
@v 1.0 work
@
text
@d73 1
a73 1
	- 비밀번호 체킹을 위한 checkPassword($input_password, $old_password, $type) 으로 하고, 각종 password_type 에 따라서 비교한다.
d78 2
a79 1
	- 버그 잡이를 위한 스킨 추가 작업
@


1.2
log
@v 1.0 work
@
text
@d522 3
@


1.1
log
@v 1.0 work
@
text
@d7 2
a8 1
If you want to know how this software licensed or could be redistributted, see README file.
d73 2
a74 3
	- 매스 포스팅 차단. 매스포스팅은 대부분 별도의 응용 소프트웨어로 이루어지고 이 같은 경우 쿠키가 지원되지 않을 수 있다.
		-- 쿠키로 체크를 하지 않는다.
		-- module/block 에서 작업을 하도록 한다.
d86 7
d496 3
d512 21
d559 2
a560 1
number_list				글 리스트 갯수
d582 5
a636 1
아래는 임시 필드이다. 되도록 이 필드를 사용하지 않아야한다. 하지만 부득이 한경우, 새로운 테이블을 생성하지 않고, 아래의 필드를 사용해야한다. 아래의 필드를 사용하는 것은 기존 필드에서 맞지 않는 항목이 있어서 일 것이다. 이 경우에는 반드시 본 소프트웨어의 개발자에게 연락을 해야한다.
d640 8
d669 2
@

