# work6-php-framework : 워크식스 프레임워크

php를 이용한 웹 서비스를 구축하는 개발자들을 위한 개발 프레임워크 입니다.
꼭 필요한 클레스와 메소드를 제공함으로써 훨씬 빠르게 프로젝트를 개발할 수 있게 합니다.
프레임워크를 이용하면 코드의 양을 최소화하여 개발 스트레스로부터 해방 시켜주며, 창의적인 개발에 집중할 수 있도록 해줍니다.

# 특징

  • + 한국어 프레임워크 가이드를 제공합니다.
  • + 가볍고 탁월한 성능을 자랑합니다.
  • + MVC를 지원 합니다.
  • + UI 설치가 가능합니다.
  • + 손쉬운 버전 업그레이드를 지원합니다.
  • + 솔루션 개발에 필요한 기본 관리자가 포함되어 있습니다.
  • + 표준적으로 사용되는 제이쿼리 플러그인 및 스타일을 포함하고 있습니다.
  • + 코어와 커스터마이징 영역이 분리되어 관리가 쉽습니다.

# 포함

# 개발노트

2019년 5월 1일 이후 개발노트는 github를 통해서 확인하실 수 있습니다. (https://github.com/work6kr/work6-php-framework)
버전 다운로드 업데이트 설명
3.5 - 2019년 2월 26일 MVC 도입 - Model 분리
js 플러그인 추가
3.4 - 2019년 1월 15일 네이버 키, 구글 키 타이틀 뒤바뀜 수정
관리자 접근 권한 보안 강화
프레임워크 라이센스 수정
3.3 - 2018년 12월 28일 custom 에서 controller extends 할수 있도록 수정
3.2 - 2018년 12월 7일 프론트 스킨 폴더 설정 기능 추가
3.1 - 2018년 7월 22일 버그수정
3.0 - 2018년 7월 1일 아키텍처 변경
2.6 - 2018년 6월 29일 버그수정
2.5 - 2017년 5월 22일 버그수정
2.4 - 2018년 5월 8일 버그수정
2.3 - 2018년 4월 26일 아키텍처 변경
1.1 - 2017년 7월 24일 버그수정
1.0 - 2017년 7월 16일 최초작성

# 설치환경

최소한의 설치환경을 요구합니다.
  • + Linux (CensOS 또는 Ubuntu)
  • + Apache 2.2 이상
  • + PHP 7.0 이상
  • + MariaDB 5.0 이상
  • + Charset UTF-8

# git으로 설치하기

① 웹 서버에 git을 설치합니다.
② 웹 서비스의 홈 디렉토리로 이동합니다.
git clone https://github.com/work6kr/work6-php-framework.git 명령을 합니다.
④ 데이터베이스를 만듭니다.
⑤ 웹브라우저로 대표도메인에 접속합니다.
⑥ 사용할 관리자 계정 정보 및 데이터베이스 정보를 입력합니다.
⑦ http://도메인/admin 으로 접속되면 설치가 완료된 것입니다.

# zip으로 설치하기

① github에서 zip으로 다운로드 받습니다.
② 웹서비스의 홈 디렉토리로 이동합니다.
③ 압축을 풀어서 웹서버에 업로드 합니다.
④ .htaccess 파일이 업로드 되었는지 다시 한번 체크 합니다.
⑤ 데이터베이스를 만듭니다.
⑥ 웹 브라우저로 대표도메인에 접속합니다.
⑦ 사용할 관리자 계정 정보 및 데이터베이스 정보를 입력합니다.
⑧ http://도메인/admin 으로 접속되면 설치가 완료된 것입니다.

# 구조

& 디렉토리 구조

크게는 코어, 커스텀마이징, 모델, 데이터 영역으로 구분됩니 다.
코어는 common, controller 디렉토리가 해당합니다. 이곳의 파일들은 불가피한 경우를 제외하고 수정/삭제를 권하지 않습니다. 코어 영역 디렉토리들을 교체하여 프레임워크 버전을 업데이트를 할 수 있습니다. common는 템플릿, 다운로드, 파일 업로드, 메일과 같이 공통으로 사용될수 있는 클레스들이 있습니다. controller는 직원 관리, 로그인, 로그아웃 등 솔루션 개발에 필요한 기본 페이지를 구성하는 클레스들이 있습니다. controller/admin에는 관리자 페이지들이, controller/front에는 사용자 페이들이 구성되어 있습니다.
커스텀마이징은 custom 디렉토리가 해당합니다. 코어의 controller 안에 클레스들을 직접 수정하지 않고 커스텀마이징하기 위하여 존재합니다. controller와 같은 디렉토리 구조를 가집니다.
모델은 model 디렉토리가 해당합니다. 데이터베이스 select, insert, update 동작 클레스로 구성되어 있습니다.
데이터는 data 디렉토리가 해당합니다. data/skin/admin는 기본으로 제공되는 관리자 페이지의 퍼블리싱 파일 HTML, CSS, JS가 있습니다. data/skin/error는 에러 발생시 퍼블리싱 파일이 있습니다. data/document와 같이 디렉토리를 생성하여 업로드 파일, 공통 이미지 등을 저장할 수 있습니다.

& 캡슐화 구조

디렉토리 구조를 따릅니다.
                namespace common
                namespace controller
                namespace controller\admin
                namespace controller\front
                namespace custom
                namespace custom\admin
                namespace custom\front
                namespace model
                namespace model\admin
                namespace model\front
            

& URL 구조

관리자와 프론트 두가지의 URL 구조를 가지며, 아래와 같은 규칙이 적용됩니다.
관리자 https://대표도메인/admin/클레스/메소드/파라미터1/파리미터2/... 프론트 https://대표도메인/클레스/메소드/파라미터1/파리미터2/...

# 데이터베이스

& 기본 테이블

프레임워크 설치 중에 가장 간단한 구조의 데이터베이스 테이블이 함께 설치됩니다.
w_config : 설정 테이블
번호 컬럼 컬럼명 타입 비고
1 idx 인덱스 int(10) auto_increment, primary key
2 code 코드 varchar(30) 데이터의 고유코드
3 data text
w_level : 직원등급 테이블
번호 컬럼 컬럼명 타입 비고
1 idx 인덱스 int(10) auto_increment, primary key
2 name 직원등급명 varchar(30)
3 admin_permision 접속허용여부 varchar(1) Y/N
4 admin_menu_permit 접근허용메뉴 text
5 level 직원등급 int(4) 9999 는 최고관리자 등급
6 insdt 등록일 datetime
7 moddt 수정일 datetime
w_member : 직원 테이블
번호 컬럼 컬럼명 타입 비고
1 idx 인덱스 int(10) auto_increment, primary key
2 uid 아이디 varchar(255) 이메일
3 upw 패스워드 text PASSWORD()
4 team 소속 varchar(255)
5 name 이름 varchar(100)
6 level 직원등급 int(4)
7 insdt 가입일 datetime
8 moddt 수정일 datetime
9 logindt 최근접속일 datetime
10 ip 최근접속아이피 varchar(45)
11 photo 사진 text
w_log_login : 접속 로그 테이블
번호 컬럼 컬럼명 타입 비고
1 idx 인덱스 int(10) auto_increment, primary key
2 member_idx 직원 idx int(10)
3 logindt 최근접속일 datetime
4 ip 최근접속아이피 varchar(45)
w_notice : 공지 테이블
번호 컬럼 컬럼명 타입 비고
1 idx 인덱스 int(10) auto_increment, primary key
2 member_idx 작성자 idx int(10)
3 subject 제목 varchar(255)
4 contents 내용 text
5 file 첨부파일 text
6 insdt 작성일 datetime
7 moddt 수정일 datetime

& 추가한 데이터베이스 테이블 선언하기

테이블을 추가한 경우, custom/conf/tables.php 파일에 다음과 같이 추가합니다.
                $table['virtual_name'] ='real_table_name';
            

# 클레스 & 메소드

& 새로운 클레스 추가

custom 디렉토리 안에 클레스명과 동일하게 파일을 만듭니다. 파일명은 소문자로 합니다. 클레스명은 첫글자를 대문자로 합니다.
namespace를 지정해줍니다.
화면 출력이 필요한 경우 관리자는 common\AdminLibrary, 프론트는 common\FrontLibrary를 extends 합니다.
extends 할때는 반드시 parent::__construct(); 를 추가합니다.
                /* custom/sample.php */
                namespace custom\admin;
                use common;
                class Sample extends common\AdminLibrary{

                    function __construct(){

                        parent::__construct();

                    }

                }
            

& controller 내에 클레스 대체

                /* custom/sample.php */
                namespace custom\admin;
                use common;
                class Sample extends controller\admin\Sample{

                    function __construct(){

                        parent::__construct();

                    }

                }
            

& controller 클레스 수정

controller 내에 클레스 수정을 추천하지 않습니다. controller 내에 클레스 대체 방법을 이용합니다.

& 클레스 선언 : 불러오기

방법1 : use 사용

                use common\Page as Page;
                class YourClass{

                	function __construct()
                	{
                        $this->page = new Page;
                	}

                }
            

방법2 : 인라인

                class YourClass{

                	function __construct()
                	{
                        $this->page = new common\Page;
                	}

                }
            

방법3 : 추가한 클레스 선언

                use custom\front\yourclass2 as YourClass2;
                class YourClass{

                	function __construct()
                	{
                        $this->page = new YourClass2;
                	}

                }
            

& 라이브러리 클레스

사용준비 - 방법1

common\AdminLibrary, common\FrontLibrary 또는 controller 를 extends 한 경우 별도의 선언이 필요 없습니다.
                class YourClass extends common\AdminLibrary{

                    function __construct()
                    {
                        parent::__construct();
                    }

                }
            

사용준비 - 방법2

extends 하지 않을 경우입니다.
                class YourClass{

                    function __construct()
                    {
                        global $lib;
                        $this->lib = $lib;
                    }

                }
            

404 에러

404 에러 화면을 출력 합니다.
                $this->lib->err404();
            
public void err404()

페이지 이동

location.href를 이용한 페이지 이동을 합니다.
                $this->lib->go($url);
            
public void go(string $url)

부모창 페이지 이동

top.location.href를 이용한 페이지 이동을 합니다.
                $this->lib->parentGo($url);
            
public void parentGo(string $url)

부모창 새로고침

top.location.reload를 이용한 페이지 새로고침을 합니다.
                $this->lib->parentReload();
            
public void parentReload()

alert 메시지

alert 메시지를 발생 시킵니다.
                $this->lib->alert($text);
            
public void alert(string $text)

이메일 유효성 체크

정상적인 양식의 이메일인지 검사합니다.
                $this->lib->emailCheck($email);
            
public bool emailCheck(string $email)

XML to Array

XML 데이터를 배열 데이터로 변환 시킵니다.
                $this->lib->xml2array($xml,$result);
            
public array xml2array(object $xml, array $result=array())

이메일 발송

이메일을 발송합니다. 관리자에서 메일 서버 설정이 필요할 수 있습니다.
                $this->lib->sendEmail($to_name,$to_email,$subject,$content,$file);
            
public bool sendEmail(string $to_name,string $to_email,string $subject,string $content,string $file=null)
입력 값
$to_name 수신자
$to_email 수신 이메일 주소
$subject 메일 제목
$content 메일 내용, HTML 태그를 사용할 수 있습니다.
$file 파일 업로드 변수 ex) $_FILES['file']

랜덤 문자 생성

랜덤한 문자를 생성합니다.
                $this->lib->getRandomString($len,$type);
            
public string getRandomString(int $len = 10, string $type = '')
입력 값
$len 결과 글자 수
$type 랜덤 문자 유형 ex) 09, az, AZ, $, AZ09, az09, $AZaz09 ...

날짜 데이터 '0시간 전' 형식으로 변환

'2018-07-20 12:12:20' 형식을 '10시간 전' 형식으로 바꿔줍니다. 24시간 이내 데이터만 적용됩니다.
                $this->lib->dateAgo($date);
            
public string dateAgo(string $date)
입력 값
$date 날짜 데이터 ex) 2018-07-20 12:12:20

https 검사

https 접속인지 확인합니다. http 접속이면 https 접속으로 바꿔줍니다.
                $this->lib->chk_https();
            
public void chk_https()

http 검사

http 접속인지 확인합니다. https 접속이면 http 접속으로 바꿔줍니다.
                $this->lib->chk_http();
            
public void chk_http()

& 개발지원

사용준비 - 방법1

common\AdminLibrary, common\FrontLibrary 또는 controller 를 extends 한 경우 별도의 선언이 필요 없습니다.
                class YourClass extends common\AdminLibrary{

                    function __construct()
                    {
                        parent::__construct();
                    }

                }
            

사용준비 - 방법2

extends 하지 않을 경우입니다.
                class YourClass{

                    function __construct()
                    {
                        global $dev;
                        $this->lib = $dev;
                    }

                }
            

디버깅

변수에 대해 사람이 읽을 수 있는 정보로 출력합니다. 시인성이 좋습니다.
                $this->dev->debug($data);
            
public void debug(mixed $data)

& 템플릿

사용준비 - 방법1

common\AdminLibrary, common\FrontLibrary 또는 controller 를 extends 한 경우 별도의 선언이 필요 없습니다.
                class YourClass extends common\AdminLibrary{

                    function __construct()
                    {
                        parent::__construct();
                    }

                }
            

사용준비 - 방법2

프론트에서 스킨 파일이 필요한 경우 입니다.
                class YourClass extends FrontLibrary{

                    function __construct()
                    {
                        parent::__construct();
                    }

                }
            

스킨 파일 정의

사용할 스킨 파일을 정의 합니다.
                $this->define($id,$tpl);
            
public void define(string $id, string $tpl)
입력 값
$id 사용자 설정 ID
$tpl 스킨 파일 경로

스킨 변수 할당

스킨에서 사용할 변수를 할당 합니다.
                $this->assign($data);
            
public void assign(array $data)

정의된 스킨 파일 출력

정의된 스킨 파일들을 출력 합니다.
                $this->print_($template);
            
public void print_(string $template)

& 데이터베이스

사용준비 - 방법1

common\AdminLibrary, common\FrontLibrary 또는 controller 를 extends 한 경우 별도의 선언이 필요 없습니다.
                class YourClass extends common\AdminLibrary{

                    function __construct()
                    {
                        parent::__construct();
                    }

                }
            

사용준비 - 방법2

extends 하지 않을 경우입니다.
                class YourClass{

                    function __construct()
                    {
                        global $db;
                        $this->db = $db;
                    }

                }
            

쿼리문 실행

쿼리문을 실행 합니다.
                $this->db->query($text);
            
public bool query(string $text)

결과 행 가져오기

쿼리문 실행 결과 행을 가져옵니다. 쿼리문을 직접 입력할 수도 있습니다.
                $this->db->fetch($text);
            
public mixed fetch(mixed $text)

결과 전체 행 수 가져오기

쿼리문 실행 결과 전체 행 수를 가져옵니다. 쿼리문을 직접 입력할 수도 있습니다.
                $this->db->rows($text);
            
public int rows(mixed $text)

마지막 쿼리 ID 가져오기

마지막 쿼리의 생성된 ID를 가져옵니다.
                $this->db->last();
            
public mixed last()

MYSQL에서 사용 가능한 문자로 변환

따옴표 붙은 문자열의 인용 부호를 해제합니다. MYSQL에서 사용할 수 있는 문자로 만듭니다. SQL Injection 방어를 합니다.
                $this->db->escape($text);
            
public string escape(string $text)

& 파일 업로드

사용준비

                use common\FileUpload;
                class YourClass{

                    function __construct()
                    {
                        $this->fileupload = new FileUpload;
                    }

                }
            

최대 파일 업로드 사이즈 가져오기

서버에서 허용된 최대 파일 업로드 사이즈를 가져옵니다.
                $this->fileupload->uploadMaxFilesize();
            
public string uploadMaxFilesize()

파일 업로드

파일을 업로드 합니다.
                $this->fileupload->upload($_FILES['file'],$upload_path,$new_filename);
            
public string upload(array $_FILES['file'], string $upload_path, string $new_filename='')
입력 값
$_FILES['file'] 파일 업로드 변수
$upload_path 업로드 경로 ex) ./data/img
$new_filename 저장될 파일명
리턴 값
저장된 파일명

& 다운로드

사용준비

                use common\Download;
                class YourClass{

                    function yourMethod()
                    {
                        $this->download = new Download;
                    }

                }
            

파일 다운로드

파일을 다운로드 합니다.
                $this->download->fileDownload($filepath, $filename);
            
public void fileDownload(string $filepath, string $filename)
입력 값
$filepath 다운로드 대상 파일 상대 경로
$filename 로컬에 저장될 파일 이름

& 페이징

사용준비

                use common\Page;
                class YourClass{

                    function yourMethod()
                    {
                        $this->page = new Page($_GET['page'],$_GET['row']);
                    }

                }
            
public void Page(int $_GET['page'], int $_GET['row'])
입력 값
$_GET['page'] 출력 대상 페이지
$_GET['row'] 페이지 당 레코드 수

페이징 쿼리 만들기

페이징을 위한 쿼리를 만듭니다.
                $this->page->setQuery($table, $column, $where, $etc);
            
public void setQuery(string $table, string $column, array $where, string $etc)
입력 값
$table 테이블명
$column 출력 컬럼명
$where 조건문 ex) array('A="1",'B!="2"')
$_GET['page'] order by, limit 등 추가 쿼리문 ex) ORDER BY sort DESC LIMIT 5

페이징 된 쿼리 가져오기

페이징 처리된 쿼리를 가져옵니다.
                $this->page->query;
            
string query

& 암호화/복호화

사용준비

                use common\Cryption;
                class YourClass{

                    function yourMethod()
                    {
                        $this->cryption = new Cryption;
                    }

                }
            

암호화 방식 및 암호키 설정

암호화 방식 및 암호키를 설정합니다.
                $this->cryption->set($type,$key);
            
public void set(int $type,string $key)
입력 값
$type 암호화 방식 설정 코드 , 0부터 17사이의 숫자 가운데 입력, 기본값:0
$key 암호키

암호화

데이터를 암호화 합니다.
                $this->cryption->encrypt($data);
            
public string encrypt(string $data)

복호화

데이터를 복호화 합니다.
                $this->cryption->decrypt($data);
            
public string decrypt(string $data)

단방향 암호화

복구할 수 없는 암호화를 합니다.
                $this->cryption->hash($data);
            
public string hash(string $data)

& 보안

사용준비

                use common\Security;
                class YourClass{

                    function yourMethod()
                    {
                        $this->security = new Security;
                    }

                }
            

XSS 방어 ( Cross Site Scripting )

데이터 출력 시 자바스크립트에 의한 공격을 차단합니다.
                $this->security->xss($data);
            
public mixed xss(mixed $data)
입력 값
$data 배열 또는 텍스트

CSRF 취약점 방어

Referer를 체크하여 해킹을 차단합니다.
                $this->security->csrf();
            
public mixed csrf()

# 스킨

& 기본 스킨 파일

data/skin/admin 또는 data/skin/front 안에 파일이 스킨 파일입니다. _header.htm, _footer.htm, _popup_header.htm, _popup_footer.htm 파일은 공통 레이아웃으로 이용합니다. _header.htm, yourskin.htm, _footer.htm 같이 구성하여 완전한 하나의 화면을 출력할 수 있습니다.
                {#header}

                
                ...
                

                {#header}
            

& 스킨 파일 적용

자세한 내용은 클레스&메소드 > 템플릿 메뉴를 확인 바랍니다.
                namespace custom/front;
                use common;
                class YourClass extends common\FrontLibrary{

                    function __construct(){
                        parent::__construct();
                    }

                    function yourMethod()
                    {
                        $tpl = $this->lib->cfg['skin'].'/yourSkin.htm';

                        $this->define('tpl', $tpl);
                		$this->assign(array('data'=>$data,'cfg'=>$this->lib->cfg,'page'=>$page));
                		$this->print_('tpl');
                    }

                }
            

& 스킨 함수

템플릿언더바를 활용하고 있습니다. 자세한 설명은 해당 홈페이지를 이용 바랍니다.

# 라이센스

재판매 또는 수정 후 재판매는 할 수 없습니다. 프레임워크 사용으로 인하여 발생하는 모든 피해는 사용자에게 있습니다.