diff --git a/modules/blog/board.class.php b/modules/blog/board.class.php
new file mode 100644
index 000000000..9908984fd
--- /dev/null
+++ b/modules/blog/board.class.php
@@ -0,0 +1,58 @@
+insertActionForward('board', 'view', 'dispBoardAdminContent');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminModuleConfig');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminBoardInfo');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminInsertBoard');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminDeleteBoard');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminSkinInfo');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminCategoryInfo');
+ $oModuleController->insertActionForward('board', 'view', 'dispBoardAdminGrantInfo');
+ //$oModuleController->insertActionForward('board', 'controller', 'procBoardAdminInsertGrant');
+ $oModuleController->insertActionForward('board', 'controller', 'procBoardAdminUpdateSkinInfo');
+ //$oModuleController->insertActionForward('board', 'controller', 'procBoardAdminDeleteBoard');
+ //$oModuleController->insertActionForward('board', 'controller', 'procBoardAdminInsertCategory');
+ //$oModuleController->insertActionForward('board', 'controller', 'procBoardAdminUpdateCategory');
+ //$oModuleController->insertActionForward('board', 'controller', 'procBoardAdminInsertConfig');
+
+ return new Object();
+ }
+
+ /**
+ * @brief 설치가 이상이 없는지 체크하는 method
+ **/
+ function moduleIsInstalled() {
+ return new Object();
+ }
+
+ /**
+ * @brief 업데이트 실행
+ **/
+ function moduleUpdate() {
+ return new Object();
+ }
+
+ }
+?>
diff --git a/modules/blog/board.controller.php b/modules/blog/board.controller.php
new file mode 100644
index 000000000..256cacd18
--- /dev/null
+++ b/modules/blog/board.controller.php
@@ -0,0 +1,519 @@
+module_srl = $this->module_srl;
+ if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N';
+
+ // document module의 model 객체 생성
+ $oDocumentModel = &getModel('document');
+
+ // document module의 controller 객체 생성
+ $oDocumentController = &getController('document');
+
+ // 이미 존재하는 글인지 체크
+ $document = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager);
+
+ // 이미 존재하는 경우 수정
+ if($document->document_srl == $obj->document_srl) {
+ $output = $oDocumentController->updateDocument($document, $obj);
+ $msg_code = 'success_updated';
+
+ // 그렇지 않으면 신규 등록
+ } else {
+ $output = $oDocumentController->insertDocument($obj);
+ $msg_code = 'success_registed';
+ $obj->document_srl = $output->get('document_srl');
+ }
+
+ // 오류 발생시 멈춤
+ if(!$output->toBool()) return $output;
+
+ // 트랙백이 있으면 트랙백 발송
+ $trackback_url = Context::get('trackback_url');
+ $trackback_charset = Context::get('trackback_charset');
+ if($trackback_url) {
+ $oTrackbackController = &getController('trackback');
+ $oTrackbackController->sendTrackback($obj, $trackback_url, $trackback_charset);
+ }
+
+ // 결과를 리턴
+ $this->add('mid', Context::get('mid'));
+ $this->add('document_srl', $output->get('document_srl'));
+
+ // 성공 메세지 등록
+ $this->setMessage($msg_code);
+ }
+
+ /**
+ * @brief 문서 삭제
+ **/
+ function procBoardDeleteDocument() {
+ // 문서 번호 확인
+ $document_srl = Context::get('document_srl');
+
+ // 문서 번호가 없다면 오류 발생
+ if(!$document_srl) return $this->doError('msg_invalid_document');
+
+ // document module model 객체 생성
+ $oDocumentController = &getController('document');
+
+ // 삭제 시도
+ $output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager);
+ if(!$output->toBool()) return $output;
+
+ // 성공 메세지 등록
+ $this->add('mid', Context::get('mid'));
+ $this->add('page', $output->get('page'));
+ $this->setMessage('success_deleted');
+ }
+
+ /**
+ * @brief 추천
+ **/
+ function procBoardVoteDocument() {
+ // document module controller 객체 생성
+ $oDocumentController = &getController('document');
+
+ $document_srl = Context::get('document_srl');
+ return $oDocumentController->updateVotedCount($document_srl);
+ }
+
+ /**
+ * @brief 코멘트 추가
+ **/
+ function procBoardInsertComment() {
+ // 댓글 입력에 필요한 데이터 추출
+ $obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage');
+ $obj->module_srl = $this->module_srl;
+
+ // comment 모듈의 model 객체 생성
+ $oCommentModel = &getModel('comment');
+
+ // comment 모듈의 controller 객체 생성
+ $oCommentController = &getController('comment');
+
+ // comment_srl이 존재하는지 체크
+ $comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager);
+
+ // comment_srl이 없을 경우 신규 입력
+ if($comment->comment_srl != $obj->comment_srl) {
+
+ // parent_srl이 있으면 답변으로
+ if($obj->parent_srl) {
+ $parent_comment = $oCommentModel->getComment($obj->parent_srl);
+ if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request');
+
+ $output = $oCommentController->insertComment($obj);
+
+ // 없으면 신규
+ } else {
+ $output = $oCommentController->insertComment($obj);
+ }
+
+ // comment_srl이 있으면 수정으로
+ } else {
+ $obj->parent_srl = $comment->parent_srl;
+ $output = $oCommentController->updateComment($obj);
+ $comment_srl = $obj->comment_srl;
+ }
+
+ if(!$output->toBool()) return $output;
+
+ $this->setMessage('success_registed');
+ $this->add('mid', Context::get('mid'));
+ $this->add('document_srl', $obj->document_srl);
+ $this->add('comment_srl', $comment_srl);
+ }
+
+ /**
+ * @brief 코멘트 삭제
+ **/
+ function procBoardDeleteComment() {
+ // 댓글 번호 확인
+ $comment_srl = Context::get('comment_srl');
+ if(!$comment_srl) return $this->doError('msg_invalid_request');
+
+ // comment 모듈의 controller 객체 생성
+ $oCommentController = &getController('comment');
+
+ $output = $oCommentController->deleteComment($comment_srl, $this->grant->manager);
+ if(!$output->toBool()) return $output;
+
+ $this->add('mid', Context::get('mid'));
+ $this->add('page', Context::get('page'));
+ $this->add('document_srl', $output->get('document_srl'));
+ $this->setMessage('success_deleted');
+ }
+
+ /**
+ * @brief 엮인글 삭제
+ **/
+ function procBoardDeleteTrackback() {
+ $trackback_srl = Context::get('trackback_srl');
+
+ // trackback module의 controller 객체 생성
+ $oTrackbackController = &getController('trackback');
+ $output = $oTrackbackController->deleteTrackback($trackback_srl, $this->grant->manager);
+ if(!$output->toBool()) return $output;
+
+ $this->add('mid', Context::get('mid'));
+ $this->add('page', Context::get('page'));
+ $this->add('document_srl', $output->get('document_srl'));
+ $this->setMessage('success_deleted');
+ }
+
+ /**
+ * @brief 문서와 댓글의 비밀번호를 확인
+ **/
+ function procBoardVerificationPassword() {
+ // 비밀번호와 문서 번호를 받음
+ $password = md5(Context::get('password'));
+ $document_srl = Context::get('document_srl');
+ $comment_srl = Context::get('comment_srl');
+
+ // comment_srl이 있을 경우 댓글이 대상
+ if($comment_srl) {
+ // 문서번호에 해당하는 글이 있는지 확인
+ $oCommentModel = &getModel('comment');
+ $data = $oCommentModel->getComment($comment_srl);
+ // comment_srl이 없으면 문서가 대상
+ } else {
+ // 문서번호에 해당하는 글이 있는지 확인
+ $oDocumentModel = &getModel('document');
+ $data = $oDocumentModel->getDocument($document_srl);
+ }
+
+ // 글이 없을 경우 에러
+ if(!$data) return new Object(-1, 'msg_invalid_request');
+
+ // 문서의 비밀번호와 입력한 비밀번호의 비교
+ if($data->password != $password) return new Object(-1, 'msg_invalid_password');
+
+ // 해당 글에 대한 권한 부여
+ if($comment_srl) {
+ $oCommentController = &getController('comment');
+ $oCommentController->addGrant($comment_srl);
+ } else {
+ $oDocumentController = &getController('document');
+ $oDocumentController->addGrant($document_srl);
+ }
+ }
+
+ /**
+ * @brief 관리자가 글 선택시 세션에 담음
+ **/
+ function procBoardAdminAddCart() {
+ $document_srl = Context::get('srl');
+ $check_flag = Context::get('check_flag');
+ if(!$document_srl || !in_array($check_flag, array('add','remove'))) return;
+
+ $flag_list = $_SESSION['document_management'][$this->module_srl];
+
+ if($check_flag == 'remove') unset($flag_list[$document_srl]);
+ else $flag_list[$document_srl] = true;
+
+ $_SESSION['document_management'][$this->module_srl] = $flag_list;
+ }
+
+ /**
+ * @brief 세션에 담긴 선택글의 이동/ 삭제
+ **/
+ function procBoardAdminManageCheckedDocument() {
+ $type = Context::get('type');
+ $module_srl = Context::get('target_board');
+ $flag_list = $_SESSION['document_management'][$this->module_srl];
+
+ $document_srl_list = array_keys($flag_list);
+
+ $oDocumentController = &getController('document');
+ $document_srl_count = count($document_srl_list);
+
+ if($type == 'move') {
+ if(!$module_srl) return new Object(-1, 'fail_to_move');
+ else {
+ $output = $oDocumentController->moveDocumentModule($document_srl_list, $module_srl, $this->module_srl);
+ if(!$output->toBool()) return new Object(-1, 'fail_to_move');
+ $msg_code = 'success_moved';
+ $_SESSION['document_management'][$this->module_srl] = null;
+ }
+
+ } elseif($type =='delete') {
+ $oDB = &DB::getInstance();
+ $oDB->begin();
+ for($i=0;$i<$document_srl_count;$i++) {
+ $document_srl = $document_srl_list[$i];
+ $output = $oDocumentController->deleteDocument($document_srl, true);
+ if(!$output->toBool()) return new Object(-1, 'fail_to_delete');
+ }
+ $oDB->commit();
+ $msg_code = 'success_deleted';
+ $_SESSION['document_management'][$this->module_srl] = null;
+ }
+
+ $this->setMessage($msg_code);
+ }
+
+ /**
+ * @brief 권한 추가
+ **/
+ function procBoardAdminInsertGrant() {
+ $module_srl = Context::get('module_srl');
+
+ // 현 모듈의 권한 목록을 가져옴
+ $grant_list = $this->xml_info->grant;
+
+ if(count($grant_list)) {
+ foreach($grant_list as $key => $val) {
+ $group_srls = Context::get($key);
+ if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls);
+ }
+ $grants = serialize($arr_grant);
+ }
+
+ $oModuleController = &getController('module');
+ $oModuleController->updateModuleGrant($module_srl, $grants);
+
+ $this->add('module_srl',Context::get('module_srl'));
+ $this->setMessage('success_registed');
+ }
+
+ /**
+ * @brief 스킨 정보 업데이트
+ **/
+ function procBoardAdminUpdateSkinInfo() {
+ // module_srl에 해당하는 정보들을 가져오기
+ $module_srl = Context::get('module_srl');
+ $oModuleModel = &getModel('module');
+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
+ $skin = $module_info->skin;
+
+ // 스킨의 정보르 구해옴 (extra_vars를 체크하기 위해서)
+ $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin);
+
+ // 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰)
+ $obj = Context::getRequestVars();
+ unset($obj->act);
+ unset($obj->module_srl);
+ unset($obj->page);
+
+ // 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌
+ if($skin_info->extra_vars) {
+ foreach($skin_info->extra_vars as $vars) {
+ if($vars->type!='image') continue;
+
+ $image_obj = $obj->{$vars->name};
+
+ // 삭제 요청에 대한 변수를 구함
+ $del_var = $obj->{"del_".$vars->name};
+ unset($obj->{"del_".$vars->name});
+ if($del_var == 'Y') {
+ @unlink($module_info->{$vars->name});
+ continue;
+ }
+
+ // 업로드 되지 않았다면 이전 데이터를 그대로 사용
+ if(!$image_obj['tmp_name']) {
+ $obj->{$vars->name} = $module_info->{$vars->name};
+ continue;
+ }
+
+ // 정상적으로 업로드된 파일이 아니면 무시
+ if(!is_uploaded_file($image_obj['tmp_name'])) {
+ unset($obj->{$vars->name});
+ continue;
+ }
+
+ // 이미지 파일이 아니어도 무시
+ if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) {
+ unset($obj->{$vars->name});
+ continue;
+ }
+
+ // 경로를 정해서 업로드
+ $path = sprintf("./files/attach/images/%s/", $module_srl);
+
+ // 디렉토리 생성
+ if(!FileHandler::makeDir($path)) return false;
+
+ $filename = $path.$image_obj['name'];
+
+ // 파일 이동
+ if(!move_uploaded_file($image_obj['tmp_name'], $filename)) {
+ unset($obj->{$vars->name});
+ continue;
+ }
+
+ // 변수를 바꿈
+ unset($obj->{$vars->name});
+ $obj->{$vars->name} = $filename;
+ }
+ }
+
+ // serialize하여 저장
+ $skin_vars = serialize($obj);
+
+ $oModuleController = &getController('module');
+ $oModuleController->updateModuleSkinVars($module_srl, $skin_vars);
+
+ $this->setTemplatePath($this->module_path.'tpl');
+ $this->setTemplateFile("top_refresh.html");
+ }
+
+ /**
+ * @brief 게시판 추가
+ **/
+ function procBoardAdminInsertBoard() {
+ // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
+ $args = Context::gets('module_srl','module_category_srl','board_name','skin','browser_title','description','is_default','header_text','footer_text','admin_id');
+ $args->module = 'board';
+ $args->mid = $args->board_name;
+ unset($args->board_name);
+ if($args->is_default!='Y') $args->is_default = 'N';
+
+ // 기본 값외의 것들을 정리
+ $extra_var = delObjectVars(Context::getRequestVars(), $args);
+ if($extra_var->use_category!='Y') $extra_var->use_category = 'N';
+ unset($extra_var->mo);
+ unset($extra_var->act);
+ unset($extra_var->page);
+ unset($extra_var->board_name);
+
+ // module_srl이 넘어오면 원 모듈이 있는지 확인
+ if($args->module_srl) {
+ $oModuleModel = &getModel('module');
+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl);
+
+ // 만약 원래 모듈이 없으면 새로 입력하기 위한 처리
+ if($module_info->module_srl != $args->module_srl) unset($args->module_srl);
+ }
+
+ // $extra_var를 serialize
+ $args->extra_vars = serialize($extra_var);
+
+ // module 모듈의 controller 객체 생성
+ $oModuleController = &getController('module');
+
+ // is_default=='Y' 이면
+ if($args->is_default=='Y') $oModuleController->clearDefaultModule();
+
+ // module_srl의 값에 따라 insert/update
+ if(!$args->module_srl) {
+ $output = $oModuleController->insertModule($args);
+ $msg_code = 'success_registed';
+ } else {
+ $output = $oModuleController->updateModule($args);
+ $msg_code = 'success_updated';
+ }
+
+ if(!$output->toBool()) return $output;
+
+ $this->add('page',Context::get('page'));
+ $this->add('module_srl',$output->get('module_srl'));
+ $this->setMessage($msg_code);
+ }
+
+ /**
+ * @brief 게시판 삭제
+ **/
+ function procBoardAdminDeleteBoard() {
+ $module_srl = Context::get('module_srl');
+
+ // 원본을 구해온다
+ $oModuleController = &getController('module');
+ $output = $oModuleController->deleteModule($module_srl);
+ if(!$output->toBool()) return $output;
+
+ $this->add('module','board');
+ $this->add('page',Context::get('page'));
+ $this->setMessage('success_deleted');
+ }
+
+ /**
+ * @brief 카테고리 추가
+ **/
+ function procBoardAdminInsertCategory() {
+ // 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
+ $module_srl = Context::get('module_srl');
+ $category_title = Context::get('category_title');
+
+ // module_srl이 있으면 원본을 구해온다
+ $oDocumentController = &getController('document');
+ $output = $oDocumentController->insertCategory($module_srl, $category_title);
+ if(!$output->toBool()) return $output;
+
+ $this->add('page',Context::get('page'));
+ $this->add('module_srl',$module_srl);
+ $this->setMessage('success_registed');
+ }
+
+ /**
+ * @brief 카테고리의 내용 수정
+ **/
+ function procBoardAdminUpdateCategory() {
+ $module_srl = Context::get('module_srl');
+ $category_srl = Context::get('category_srl');
+ $mode = Context::get('mode');
+
+ $oDocumentModel = &getModel('document');
+ $oDocumentController = &getController('document');
+
+ switch($mode) {
+ case 'up' :
+ $output = $oDocumentController->moveCategoryUp($category_srl);
+ $msg_code = 'success_moved';
+ break;
+ case 'down' :
+ $output = $oDocumentController->moveCategoryDown($category_srl);
+ $msg_code = 'success_moved';
+ break;
+ case 'delete' :
+ $output = $oDocumentController->deleteCategory($category_srl);
+ $msg_code = 'success_deleted';
+ break;
+ case 'update' :
+ $selected_category = $oDocumentModel->getCategory($category_srl);
+ $args->category_srl = $selected_category->category_srl;
+ $args->title = Context::get('category_title');
+ $args->list_order = $selected_category->list_order;
+ $output = $oDocumentController->updateCategory($args);
+ $msg_code = 'success_updated';
+ break;
+ }
+ if(!$output->toBool()) return $output;
+
+ $this->add('module_srl', $module_srl);
+ $this->setMessage($msg_code);
+ }
+
+ /**
+ * @brief 게시판 기본 정보의 추가
+ **/
+ function procBoardAdminInsertConfig() {
+ // 기본 정보를 받음
+ $args = Context::gets('test');
+
+ // module Controller 객체 생성하여 입력
+ $oModuleController = &getController('module');
+ $output = $oModuleController->insertModuleConfig('board',$args);
+ return $output;
+ }
+ }
+?>
diff --git a/modules/blog/board.view.php b/modules/blog/board.view.php
new file mode 100644
index 000000000..4af582fa9
--- /dev/null
+++ b/modules/blog/board.view.php
@@ -0,0 +1,617 @@
+act, 'Admin')) $this->initAdmin();
+ else $this->initNormal();
+ }
+
+ /**
+ * @brief 관리자 act 호출시에 관련 정보들 세팅해줌
+ **/
+ function initAdmin() {
+ // module_srl이 있으면 미리 체크하여 존재하는 모듈이면 module_info 세팅
+ $module_srl = Context::get('module_srl');
+ if(!$module_srl && $this->module_srl) {
+ $module_srl = $this->module_srl;
+ Context::set('module_srl', $module_srl);
+ }
+
+ // module model 객체 생성
+ $oModuleModel = &getModel('module');
+
+ // module_srl이 넘어오면 해당 모듈의 정보를 미리 구해 놓음
+ if($module_srl) {
+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
+ if(!$module_info) {
+ Context::set('module_srl','');
+ $this->act = 'list';
+ } else {
+ $this->module_info = $module_info;
+ Context::set('module_info',$module_info);
+ }
+ }
+
+ // 모듈 카테고리 목록을 구함
+ $module_category = $oModuleModel->getModuleCategories();
+ Context::set('module_category', $module_category);
+
+ // 템플릿 경로 지정 (board의 경우 tpl에 관리자용 템플릿 모아놓음)
+ $template_path = sprintf("%stpl/",$this->module_path);
+ $this->setTemplatePath($template_path);
+ }
+
+ /**
+ * @brief 일반 게시판 호출시에 관련 정보를 세팅해줌
+ **/
+ function initNormal() {
+ // 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅
+ if($this->module_info->use_category=='Y') {
+ $oDocumentModel = &getModel('document');
+ $this->category_list = $oDocumentModel->getCategoryList($this->module_srl);
+ Context::set('category_list', $this->category_list);
+ }
+
+ // 템플릿에서 사용할 변수를 Context::set()
+ if($this->module_srl) Context::set('module_srl',$this->module_srl);
+
+ Context::set('module_info',$this->module_info);
+
+ // 기본 모듈 정보들 설정
+ $this->list_count = $this->module_info->list_count?$this->module_info->list_count:20;
+ $this->page_count = $this->module_info->page_count?$this->module_info->page_count:10;
+
+ // 스킨 템플릿 경로 지정
+ $template_path = sprintf("%sskins/%s/",$this->module_path, $this->skin);
+ $this->setTemplatePath($template_path);
+
+ // rss url
+ if($this->grant->view) Context::set('rss_url', getUrl('','mid',$this->mid,'act','dispBoardRss'));
+ }
+
+ /**
+ * @brief 목록 및 선택된 글 출력
+ **/
+ function dispBoardContent() {
+ // 권한 체크
+ if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted');
+
+ // 목록 구현에 필요한 변수들을 가져온다
+ $document_srl = Context::get('document_srl');
+ $page = Context::get('page');
+
+ // document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-;
+ $oDocumentModel = &getModel('document');
+
+ // document_srl이 있다면 해당 글을 구해오자
+ if($this->grant->view && $document_srl) {
+
+ // 글을 구함
+ $document = $oDocumentModel->getDocument($document_srl, $this->grant->manager, true);
+
+ // 찾아지지 않았다면 초기화
+ if($document->document_srl != $document_srl) {
+ unset($document);
+ unset($document_srl);
+ Context::set('document_srl','',true);
+
+ // 글이 찾아졌으면 댓글 권한과 허용 여부를 체크하여 댓글 에디터 세팅
+ } elseif($this->grant->write_comment && $document->allow_comment == 'Y' && $document->lock_comment != 'Y') {
+
+ // 브라우저 타이틀
+ $browser_title = $this->module_info->browser_title.' - '.$document->title;
+ Context::setBrowserTitle($browser_title);
+
+ // 댓글
+ $this->setCommentEditor();
+ }
+
+ Context::set('document', $document);
+ }
+
+ // 만약 document_srl은 있는데 page가 없다면 글만 호출된 경우 page를 구해서 세팅해주자..
+ if($document_srl && !$page) {
+ $page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count);
+ Context::set('page', $page);
+ }
+
+ // 목록을 구하기 위한 옵션
+ $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl
+ $args->page = $page; ///< 페이지
+ $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수
+ $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수
+
+ // 검색 옵션
+ $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...)
+ $args->search_keyword = Context::get('search_keyword'); ///< 검색어
+ if($this->module_info->use_category=='Y') $args->category_srl = Context::get('category'); ///< 카테고리 사용시 선택된 카테고리
+
+ $args->sort_index = 'list_order'; ///< 소팅 값
+
+ // 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조이다... (아.. 이거 나쁜 버릇인데.. ㅡ.ㅜ 어쩔수 없다)
+ $output = $oDocumentModel->getDocumentList($args);
+
+ // 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅
+ Context::set('total_count', $output->total_count);
+ Context::set('total_page', $output->total_page);
+ Context::set('page', $output->page);
+ Context::set('document_list', $output->data);
+ Context::set('page_navigation', $output->page_navigation);
+
+ // 템플릿에서 사용할 검색옵션 세팅
+ $count_search_option = count($this->search_option);
+ for($i=0;$i<$count_search_option;$i++) {
+ $search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]);
+ }
+ Context::set('search_option', $search_option);
+
+ // 관리자일 경우 체크한 문서들의 목록을 세팅
+ if($this->grant->is_admin) {
+ Context::set('check_list',$_SESSION['document_management'][$this->module_srl]);
+ }
+
+ $this->setTemplateFile('list');
+ }
+
+ /**
+ * @brief 글 작성 화면 출력
+ **/
+ function dispBoardWrite() {
+ // 권한 체크
+ if(!$this->grant->write_document) return $this->dispBoardMessage('msg_not_permitted');
+
+ // GET parameter에서 document_srl을 가져옴
+ $document_srl = Context::get('document_srl');
+
+ // document 모듈 객체 생성
+ $oDocumentModel = &getModel('document');
+
+ // 지정된 글이 없다면 (신규) 새로운 번호를 만든다
+ if($document_srl) {
+ $document = $oDocumentModel->getDocument($document_srl, $this->grant->manager);
+ if(!$document) {
+ unset($document_srl);
+ Context::set('document_srl','');
+ }
+ }
+
+ if(!$document_srl) $document_srl = getNextSequence();
+
+ // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로
+ if($document&&!$document->is_granted) return $this->setTemplateFile('input_password_form');
+
+ Context::set('document_srl',$document_srl);
+ Context::set('document', $document);
+
+ // 에디터 모듈의 getEditor를 호출하여 세팅
+ $oEditorModel = &getModel('editor');
+ $editor = $oEditorModel->getEditor($document_srl, $this->grant->fileupload, true);
+ Context::set('editor', $editor);
+
+ $this->setTemplateFile('write_form');
+ }
+
+ /**
+ * @brief 문서 삭제 화면 출력
+ **/
+ function dispBoardDelete() {
+ // 권한 체크
+ if(!$this->grant->write_document) return $this->dispBoardMessage('msg_not_permitted');
+
+ // 삭제할 문서번호를 가져온다
+ $document_srl = Context::get('document_srl');
+
+ // 지정된 글이 있는지 확인
+ if($document_srl) {
+ $oDocumentModel = &getModel('document');
+ $document = $oDocumentModel->getDocument($document_srl);
+ }
+
+ // 삭제하려는 글이 없으면 에러
+ if(!$document) return $this->dispBoardContent();
+
+ // 권한이 없는 경우 비밀번호 입력화면으로
+ if($document&&!$document->is_granted) return $this->setTemplateFile('input_password_form');
+
+ Context::set('document',$document);
+
+ $this->setTemplateFile('delete_form');
+ }
+
+ /**
+ * @brief 댓글의 답글 화면 출력
+ **/
+ function dispBoardReplyComment() {
+ // 권한 체크
+ if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted');
+
+ // 목록 구현에 필요한 변수들을 가져온다
+ $document_srl = Context::get('document_srl');
+ $parent_srl = Context::get('comment_srl');
+
+ // 지정된 원 댓글이 없다면 오류
+ if(!$parent_srl) return new Object(-1, 'msg_invalid_request');
+
+ // 해당 댓글를 찾아본다
+ $oCommentModel = &getModel('comment');
+ $source_comment = $oCommentModel->getComment($parent_srl, $this->grant->manager);
+
+ // 댓글이 없다면 오류
+ if(!$source_comment) return $this->dispBoardMessage('msg_invalid_request');
+
+ // 필요한 정보들 세팅
+ Context::set('document_srl',$document_srl);
+ Context::set('parent_srl',$parent_srl);
+ Context::set('comment_srl',NULL);
+ Context::set('source_comment',$source_comment);
+
+ // 댓글 에디터 세팅
+ $this->setCommentEditor();
+
+ $this->setTemplateFile('comment_form');
+ }
+
+ /**
+ * @brief 댓글 수정 폼 출력
+ **/
+ function dispBoardModifyComment() {
+ // 권한 체크
+ if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted');
+
+ // 목록 구현에 필요한 변수들을 가져온다
+ $document_srl = Context::get('document_srl');
+ $comment_srl = Context::get('comment_srl');
+
+ // 지정된 댓글이 없다면 오류
+ if(!$comment_srl) return new Object(-1, 'msg_invalid_request');
+
+ // 해당 댓글를 찾아본다
+ $oCommentModel = &getModel('comment');
+ $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
+
+ // 댓글이 없다면 오류
+ if(!$comment) return $this->dispBoardMessage('msg_invalid_request');
+
+ // 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로
+ if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form');
+
+ // 필요한 정보들 세팅
+ Context::set('document_srl',$document_srl);
+ Context::set('comment_srl',$comment_srl);
+ Context::set('comment', $comment);
+
+ // 댓글 에디터 세팅
+ $this->setCommentEditor($comment_srl);
+
+ $this->setTemplateFile('comment_form');
+ }
+
+ /**
+ * @brief 댓글 삭제 화면 출력
+ **/
+ function dispBoardDeleteComment() {
+ // 권한 체크
+ if(!$this->grant->write_comment) return $this->dispBoardMessage('msg_not_permitted');
+
+ // 삭제할 댓글번호를 가져온다
+ $comment_srl = Context::get('comment_srl');
+
+ // 삭제하려는 댓글가 있는지 확인
+ if($comment_srl) {
+ $oCommentModel = &getModel('comment');
+ $comment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
+ }
+
+ // 삭제하려는 글이 없으면 에러
+ if(!$comment) return $this->dispBoardContent();
+
+ // 권한이 없는 경우 비밀번호 입력화면으로
+ if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form');
+
+ Context::set('comment',$comment);
+
+ $this->setTemplateFile('delete_comment_form');
+ }
+
+ /**
+ * @brief 엮인글 삭제 화면 출력
+ **/
+ function dispBoardDeleteTrackback() {
+ // 삭제할 댓글번호를 가져온다
+ $trackback_srl = Context::get('trackback_srl');
+
+ // 삭제하려는 댓글가 있는지 확인
+ $oTrackbackModel = &getModel('trackback');
+ $output = $oTrackbackModel->getTrackback($trackback_srl);
+ $trackback = $output->data;
+
+ // 삭제하려는 글이 없으면 에러
+ if(!$trackback) return $this->dispBoardContent();
+
+ Context::set('trackback',$trackback);
+
+ $this->setTemplateFile('delete_trackback_form');
+ }
+
+ /**
+ * @brief 메세지 출력
+ **/
+ function dispBoardMessage($msg_code) {
+ $msg = Context::getLang($msg_code);
+ if(!$msg) $msg = $msg_code;
+ Context::set('message', $msg);
+ $this->setTemplateFile('message');
+ }
+
+ /**
+ * @brief RSS 출력
+ **/
+ function dispBoardRss() {
+ // 권한 체크
+ if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted');
+
+ // 컨텐츠 추출
+ $args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl
+ $args->page = Context::get('page'); ///< 페이지
+ $args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수
+ $args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수
+
+ $args->search_target = Context::get('search_target'); ///< 검색 대상 (title, contents...)
+ $args->search_keyword = Context::get('search_keyword'); ///< 검색어
+ if($this->module_info->use_category=='Y') $args->category_srl = Context::get('category'); ///< 카테고리 사용시 선택된 카테고리
+
+ $args->sort_index = 'list_order'; ///< 소팅 값
+
+ $oDocumentModel = &getModel('document');
+ $output = $oDocumentModel->getDocumentList($args);
+ $document_list = $output->data;
+
+ // rss 제목 및 정보등을 추출
+ $info->title = Context::getBrowserTitle();
+ $info->description = $this->module_info->description;
+ $info->language = Context::getLangType();
+ $info->date = gmdate("D, d M Y H:i:s");
+ $info->link = sprintf("%s?mid=%s", Context::getRequestUri(), Context::get('mid'));
+ $info->total_count = $output->total_count;
+
+ // RSS 모듈을 불러서 출력할 내용을 지정
+ $oRssView = &getView('rss');
+ $oRssView->dispRss($info, $document_list);
+
+ // RSS 모듈의 tempate을 가져옴
+ $this->setTemplatePath($oRssView->getTemplatePath());
+ $this->setTemplateFile($oRssView->getTemplateFile());
+ }
+
+ /**
+ * @brief 댓글의 editor 를 세팅
+ * 댓글의 경우 수정하는 경우가 아니라면 고유값이 없음.\n
+ * 따라서 고유값이 없을 경우 고유값을 가져와서 지정해 주어야 함
+ **/
+ function setCommentEditor($comment_srl=0) {
+ if(!$comment_srl) {
+ $comment_srl = getNextSequence();
+ Context::set('comment_srl', $comment_srl);
+ }
+
+ // 에디터 모듈의 getEditor를 호출하여 세팅
+ $oEditorModel = &getModel('editor');
+ $comment_editor = $oEditorModel->getEditor($comment_srl, $this->grant->fileupload);
+ Context::set('comment_editor', $comment_editor);
+ }
+
+ /**
+ * @brief 게시판 관리 목록 보여줌
+ **/
+ function dispBoardAdminContent() {
+ // 등록된 board 모듈을 불러와 세팅
+ $args->sort_index = "module_srl";
+ $args->page = Context::get('page');
+ $args->list_count = 40;
+ $args->page_count = 10;
+ $args->s_module_category_srl = Context::get('module_category_srl');
+ $output = executeQuery('board.getBoardList', $args);
+
+ // 템플릿에 쓰기 위해서 context::set
+ Context::set('total_count', $output->total_count);
+ Context::set('total_page', $output->total_page);
+ Context::set('page', $output->page);
+ Context::set('board_list', $output->data);
+ Context::set('page_navigation', $output->page_navigation);
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('index');
+ }
+
+ /**
+ * @brief 게시판에 필요한 기본 설정들
+ **/
+ function dispBoardAdminModuleConfig() {
+
+ // 설정 정보를 받아옴 (module model 객체를 이용)
+ $oModuleModel = &getModel('module');
+ $config = $oModuleModel->getModuleConfig('board');
+ Context::set('config',$config);
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('board_config');
+ }
+
+ /**
+ * @brief 선택된 게시판의 정보 출력
+ **/
+ function dispBoardAdminBoardInfo() {
+
+ // module_srl 값이 없다면 그냥 index 페이지를 보여줌
+ if(!Context::get('module_srl')) return $this->dispBoardAdminContent();
+
+ // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout)
+ if($this->module_info->layout_srl) {
+ $oLayoutModel = &getModel('layout');
+ $layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl);
+ $this->module_info->layout = $layout_info->layout;
+ $this->module_info->layout_title = $layout_info->layout_title;
+ }
+
+ // 정해진 스킨이 있으면 해당 스킨의 정보를 구함
+ if($this->module_info->skin) {
+ $oModuleModel = &getModel('module');
+ $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin);
+ $this->module_info->skin_title = $skin_info->title;
+ }
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('board_info');
+ }
+
+ /**
+ * @brief 게시판 추가 폼 출력
+ **/
+ function dispBoardAdminInsertBoard() {
+
+ // 스킨 목록을 구해옴
+ $oModuleModel = &getModel('module');
+ $skin_list = $oModuleModel->getSkins($this->module_path);
+ Context::set('skin_list',$skin_list);
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('board_insert');
+ }
+
+ /**
+ * @brief 게시판 삭제 화면 출력
+ **/
+ function dispBoardAdminDeleteBoard() {
+
+ if(!Context::get('module_srl')) return $this->dispBoardAdminContent();
+
+ $module_info = Context::get('module_info');
+
+ $oDocumentModel = &getModel('document');
+ $document_count = $oDocumentModel->getDocumentCount($module_info->module_srl);
+ $module_info->document_count = $document_count;
+
+ Context::set('module_info',$module_info);
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('board_delete');
+ }
+
+ /**
+ * @brief 스킨 정보 보여줌
+ **/
+ function dispBoardAdminSkinInfo() {
+
+ // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음
+ $module_info = Context::get('module_info');
+ $skin = $module_info->skin;
+
+ $oModuleModel = &getModel('module');
+ $skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin);
+
+ // skin_info에 extra_vars 값을 지정
+ if(count($skin_info->extra_vars)) {
+ foreach($skin_info->extra_vars as $key => $val) {
+ $name = $val->name;
+ $type = $val->type;
+ $value = $module_info->{$name};
+ if($type=="checkbox"&&!$value) $value = array();
+ $skin_info->extra_vars[$key]->value= $value;
+ }
+ }
+
+ Context::set('skin_info', $skin_info);
+ $this->setTemplateFile('skin_info');
+ }
+
+ /**
+ * @brief 카테고리의 정보 출력
+ **/
+ function dispBoardAdminCategoryInfo() {
+
+ // module_srl을 구함
+ $module_srl = Context::get('module_srl');
+
+ // 카테고리의 목록을 구해옴
+ $oDocumentModel = &getModel('document');
+ $category_list = $oDocumentModel->getCategoryList($module_srl);
+ Context::set('category_list', $category_list);
+
+ // 수정하려는 카테고리가 있다면해당 카테고리의 정보를 가져옴
+ $category_srl = Context::get('category_srl');
+
+ if($category_srl) {
+
+ $selected_category = $oDocumentModel->getCategory($category_srl);
+
+ if(!$selected_category) Context::set('category_srl','');
+ else Context::set('selected_category',$selected_category);
+
+ $this->setTemplateFile('category_update_form');
+
+ } else {
+
+ $this->setTemplateFile('category_list');
+
+ }
+ }
+
+ /**
+ * @brief 권한 목록 출력
+ **/
+ function dispBoardAdminGrantInfo() {
+ // module_srl을 구함
+ $module_srl = Context::get('module_srl');
+
+ // module.xml에서 권한 관련 목록을 구해옴
+ $grant_list = $this->xml_info->grant;
+ Context::set('grant_list', $grant_list);
+
+ // 권한 그룹의 목록을 가져온다
+ $oMemberModel = &getModel('member');
+ $group_list = $oMemberModel->getGroups();
+ Context::set('group_list', $group_list);
+
+ $this->setTemplateFile('grant_list');
+ }
+
+ /**
+ * @brief 선택한 목록 출력
+ **/
+ function dispBoardAdminManageDocument() {
+ // 선택한 목록을 세션에서 가져옴
+ $flag_list = $_SESSION['document_management'][$this->module_srl];
+
+ // 목록이 있으면 게시글을 가져옴
+ if(count($flag_list)) $document_srl_list = array_keys($flag_list);
+ if(is_array($document_srl_list) && count($document_srl_list)) {
+ $oDocumentModeul = &getModel('document');
+ $document_list = $oDocumentModeul->getDocuments($document_srl_list, $this->grant->is_admin);
+ Context::set('document_list', $document_list);
+ }
+
+ // 게시판의 목록을 가져옴
+ $output = executeQuery('board.getAllBoard', $args);
+ $board_list = $output->data;
+ if($board_list && !is_array($board_list)) $board_list = array($board_list);
+ Context::set('board_list', $board_list);
+
+ // 팝업 레이아웃 선택
+ $this->setLayoutPath('./common/tpl');
+ $this->setLayoutFile('popup_layout');
+
+ $this->setTemplateFile('checked_list');
+ }
+ }
+?>
diff --git a/modules/blog/conf/info.xml b/modules/blog/conf/info.xml
new file mode 100644
index 000000000..9fb19deff
--- /dev/null
+++ b/modules/blog/conf/info.xml
@@ -0,0 +1,8 @@
+
+
+ 게시판
+
+ 제로
+ 게시판의 기능을 담당하는 모듈. 게시판의 생성/추가 관리등의 관리자 기능도 포함합니다.
+
+
diff --git a/modules/blog/conf/module.xml b/modules/blog/conf/module.xml
new file mode 100644
index 000000000..f9926b816
--- /dev/null
+++ b/modules/blog/conf/module.xml
@@ -0,0 +1,71 @@
+
+
+
+
+ 목록
+ list
+
+
+ 열람
+ view
+
+
+ 글 작성
+ write document
+
+
+ 댓글 작성
+ write comment
+
+
+ 파일 첨부
+ file upload
+
+
+ 관리
+ manager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/lang/ko.lang.php b/modules/blog/lang/ko.lang.php
new file mode 100644
index 000000000..1b6ceacae
--- /dev/null
+++ b/modules/blog/lang/ko.lang.php
@@ -0,0 +1,53 @@
+cmd_board_list = '게시판 목록';
+ $lang->cmd_module_config = '게시판 공통 설정';
+ $lang->cmd_view_info = '게시판 정보';
+ $lang->cmd_manage_category = '분류관리';
+ $lang->cmd_manage_grant = '권한관리';
+ $lang->cmd_manage_skin = '스킨관리';
+ $lang->cmd_manage_document = '게시글 관리';
+
+ // 항목
+ $lang->header_text = '상단 내용';
+ $lang->footer_text = '하단 내용';
+ $lang->use_category = '분류 사용';
+ $lang->category_title = '분류명';
+ $lang->checked_count = '선택된 글 수';
+
+ $lang->skin_default_info = '스킨 기본정보';
+ $lang->skin_maker = '스킨제작자';
+ $lang->skin_maker_homepage = '홈페이지';
+
+ $lang->test = '테스트';
+ $lang->about_test = '테스트는 블라블라...';
+
+ // 주절 주절..
+ $lang->about_mid = '모듈이름은 http://주소/?mid=모듈이름 처럼 직접 호출할 수 있는 값입니다. (영문+숫자만 가능)';
+ $lang->about_category = '분류를 통한 관리를 할 수 있도록 합니다. 모듈 분류의 관리는 모듈관리 > 모듈카테고리에서 하실 수 있습니다.';
+ $lang->about_browser_title = '브라우저의 제목에 나타나는 값입니다. RSS/Trackback에서도 사용됩니다.';
+ $lang->about_description= '관리용으로 사용되는 설명입니다';
+ $lang->about_default = '선택하시면 사이트에 mid값 없이 접속하였을 경우 기본으로 보여줍니다';
+ $lang->about_header_text = '모듈의 상단에 표시되는 내용입니다 (html 태그 사용 가능)';
+ $lang->about_footer_text = '모듈의 하단에 표시되는 내용입니다 (html 태그 사용 가능)';
+ $lang->about_skin = '모듈의 스킨을 선택하실 수 있습니다';
+ $lang->about_use_category = '선택하시면 분류기능을 사용할 수 있습니다';
+ $lang->about_list_count = '한페이지에 표시될 글의 수를 지정하실 수 있습니다. (기본 20개)';
+ $lang->about_page_count = '목록 하단 페이지 이동 하는 링크의 수를 지정하실 수 있습니다. (기본 10개)';
+
+ $lang->about_admin_id = '해당 모듈에 대해 최고 권한을 가지는 관리자를 지정할 수 있습니다.
,(콤마)로 다수 아이디 지정이 가능합니다. (관리자페이지 접근은 불가능)';
+ $lang->about_grant = '특정 권한의 대상을 모두 해제하시면 로그인하지 않은 회원까지 권한을 가질 수 있습니다';
+
+ $lang->msg_new_module = '모듈 생성';
+ $lang->msg_update_module = '모듈 수정';
+ $lang->msg_category_is_null = '등록된 분류가 없습니다';
+ $lang->msg_grant_is_null = '등록된 권한 대상이 없습니다';
+ $lang->msg_no_checked_document = '선택된 게시물이 없습니다';
+ $lang->msg_move_failed = '이동 실패하였습니다';
+?>
diff --git a/modules/blog/queries/getAllBoard.xml b/modules/blog/queries/getAllBoard.xml
new file mode 100644
index 000000000..49554aeac
--- /dev/null
+++ b/modules/blog/queries/getAllBoard.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/queries/getBoardList.xml b/modules/blog/queries/getBoardList.xml
new file mode 100644
index 000000000..efc53c312
--- /dev/null
+++ b/modules/blog/queries/getBoardList.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/comment.html b/modules/blog/skins/default/comment.html
new file mode 100644
index 000000000..4eab1c6dd
--- /dev/null
+++ b/modules/blog/skins/default/comment.html
@@ -0,0 +1,75 @@
+
+
+
+ {$lang->comment} : {count($document->comment_list)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/comment_form.html b/modules/blog/skins/default/comment_form.html
new file mode 100644
index 000000000..0a0a7cd94
--- /dev/null
+++ b/modules/blog/skins/default/comment_form.html
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | {$lang->date} |
+ {$source_comment->regdate} |
+
+
+ | {$lang->writer} |
+ |
+
+
+ | {$lang->content} |
+ {$source_comment->content} |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/delete_comment_form.html b/modules/blog/skins/default/delete_comment_form.html
new file mode 100644
index 000000000..a3ed7cf27
--- /dev/null
+++ b/modules/blog/skins/default/delete_comment_form.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/delete_form.html b/modules/blog/skins/default/delete_form.html
new file mode 100644
index 000000000..1f552303e
--- /dev/null
+++ b/modules/blog/skins/default/delete_form.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/delete_trackback_form.html b/modules/blog/skins/default/delete_trackback_form.html
new file mode 100644
index 000000000..4ca0aabfc
--- /dev/null
+++ b/modules/blog/skins/default/delete_trackback_form.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/delete_comment.xml b/modules/blog/skins/default/filter/delete_comment.xml
new file mode 100644
index 000000000..115ea00d9
--- /dev/null
+++ b/modules/blog/skins/default/filter/delete_comment.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/delete_document.xml b/modules/blog/skins/default/filter/delete_document.xml
new file mode 100644
index 000000000..7627f5a63
--- /dev/null
+++ b/modules/blog/skins/default/filter/delete_document.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/delete_trackback.xml b/modules/blog/skins/default/filter/delete_trackback.xml
new file mode 100644
index 000000000..2140675f8
--- /dev/null
+++ b/modules/blog/skins/default/filter/delete_trackback.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/input_password.xml b/modules/blog/skins/default/filter/input_password.xml
new file mode 100644
index 000000000..55cb6d8e0
--- /dev/null
+++ b/modules/blog/skins/default/filter/input_password.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/insert.xml b/modules/blog/skins/default/filter/insert.xml
new file mode 100644
index 000000000..85d1ed4ce
--- /dev/null
+++ b/modules/blog/skins/default/filter/insert.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/insert_comment.xml b/modules/blog/skins/default/filter/insert_comment.xml
new file mode 100644
index 000000000..ba2216c8a
--- /dev/null
+++ b/modules/blog/skins/default/filter/insert_comment.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/search.xml b/modules/blog/skins/default/filter/search.xml
new file mode 100644
index 000000000..6c85e1254
--- /dev/null
+++ b/modules/blog/skins/default/filter/search.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/filter/vote.xml b/modules/blog/skins/default/filter/vote.xml
new file mode 100644
index 000000000..0870a7551
--- /dev/null
+++ b/modules/blog/skins/default/filter/vote.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/footer.html b/modules/blog/skins/default/footer.html
new file mode 100644
index 000000000..9d5404ca8
--- /dev/null
+++ b/modules/blog/skins/default/footer.html
@@ -0,0 +1 @@
+{$module_info->footer_text}
diff --git a/modules/blog/skins/default/header.html b/modules/blog/skins/default/header.html
new file mode 100644
index 000000000..68ffc0dae
--- /dev/null
+++ b/modules/blog/skins/default/header.html
@@ -0,0 +1,32 @@
+
+{$module_info->header_text}
+
+
+
+
diff --git a/modules/blog/skins/default/input_password_form.html b/modules/blog/skins/default/input_password_form.html
new file mode 100644
index 000000000..0a26427de
--- /dev/null
+++ b/modules/blog/skins/default/input_password_form.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/js/board.js b/modules/blog/skins/default/js/board.js
new file mode 100644
index 000000000..a9757df89
--- /dev/null
+++ b/modules/blog/skins/default/js/board.js
@@ -0,0 +1,129 @@
+/**
+ * @file modules/board/js/board.js
+ * @author zero (zero@nzeo.com)
+ * @brief board 모듈의 javascript
+ **/
+
+/* 관리자가 카트 선택시 세션에 넣음 */
+function doAddCart(mid, obj) {
+ var srl = obj.value;
+ var check_flag = obj.checked?'add':'remove';
+
+ var params = new Array();
+ params["mid"] = mid;
+ params["srl"] = srl;
+ params["check_flag"] = check_flag;
+
+ exec_xml("board","procBoardAdminAddCart", params, null);
+}
+
+/* 글쓰기 작성후 */
+function completeDocumentInserted(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var mid = ret_obj['mid'];
+ var document_srl = ret_obj['document_srl'];
+ var category_srl = ret_obj['category_srl'];
+
+ alert(message);
+
+ var url = location.href.setQuery('mid',mid).setQuery('document_srl',document_srl).setQuery('act','');
+ if(category_srl) url = url.setQuery('category',category_srl);
+ location.href = url;
+}
+
+/* 글 삭제 */
+function completeDeleteDocument(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var mid = ret_obj['mid'];
+ var page = ret_obj['page'];
+
+ var url = "./?mid="+mid;
+ if(page) url += "&page="+page;
+
+ alert(message);
+
+ location.href = url;
+}
+
+/* 검색 실행 */
+function completeSearch(fo_obj, params) {
+ fo_obj.submit();
+}
+
+/* 추천, 추천은 별도의 폼입력이 필요 없어 직접 필터 사용 */
+function doVote() {
+ var fo_obj = document.getElementById('fo_document_info');
+ procFilter(fo_obj, vote);
+}
+
+function completeVote(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ alert(message);
+ location.href = location.href;
+}
+
+// 현재 페이지 reload
+function completeReload(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+
+ location.href = location.href;
+}
+
+/* 댓글 글쓰기 작성후 */
+function completeInsertComment(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var mid = ret_obj['mid'];
+ var document_srl = ret_obj['document_srl'];
+ var comment_srl = ret_obj['comment_srl'];
+
+ var url = "./?mid="+mid+"&document_srl="+document_srl;
+ if(comment_srl) url += "#comment_"+comment_srl;
+
+ alert(message);
+
+ location.href = url;
+}
+
+/* 댓글 삭제 */
+function completeDeleteComment(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var mid = ret_obj['mid'];
+ var document_srl = ret_obj['document_srl'];
+ var page = ret_obj['page'];
+
+ var url = "./?mid="+mid+'&document_srl='+document_srl;
+ if(page) url += "&page="+page;
+
+ alert(message);
+
+ location.href = url;
+}
+
+/* 트랙백 삭제 */
+function completeDeleteTrackback(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var mid = ret_obj['mid'];
+ var document_srl = ret_obj['document_srl'];
+ var page = ret_obj['page'];
+
+ var url = "./?mid="+mid+'&document_srl='+document_srl;
+ if(page) url += "&page="+page;
+
+ alert(message);
+
+ location.href = url;
+}
+
+/* 카테고리 이동 */
+function doChangeCategory(sel_obj, url) {
+ var category_srl = sel_obj.options[sel_obj.selectedIndex].value;
+ if(!category_srl) location.href=url;
+ else location.href=url+'&category='+category_srl;
+}
diff --git a/modules/blog/skins/default/list.html b/modules/blog/skins/default/list.html
new file mode 100644
index 000000000..eda1f4cfc
--- /dev/null
+++ b/modules/blog/skins/default/list.html
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/message.html b/modules/blog/skins/default/message.html
new file mode 100644
index 000000000..00bf01814
--- /dev/null
+++ b/modules/blog/skins/default/message.html
@@ -0,0 +1,11 @@
+
+
+
+ {$message}
+
+
+
+ {$lang->cmd_login}
+
+
+
diff --git a/modules/blog/skins/default/skin.xml b/modules/blog/skins/default/skin.xml
new file mode 100644
index 000000000..89ae20ddc
--- /dev/null
+++ b/modules/blog/skins/default/skin.xml
@@ -0,0 +1,53 @@
+
+
+ 게시판 기본 스킨
+
+ 제로
+ board모듈의 default스킨
+
+
+
+ 기본
+
+
+ 이상한거
+
+
+
+
+ 제목
+ 그냥 테스트용입니다
+
+
+ 제목 2
+ haha
+
+
+ 내용
+ 내용의 기본값
+
+
+ 선택1
+ 1
+ 2
+ 3
+ 4
+ 5
+
+
+ 다중선택
+ a
+ b
+ c
+
+
+ 하나선택
+ A
+ B
+ C
+
+
+ 로고이미지
+
+
+
diff --git a/modules/blog/skins/default/trackback.html b/modules/blog/skins/default/trackback.html
new file mode 100644
index 000000000..97e9d5d1d
--- /dev/null
+++ b/modules/blog/skins/default/trackback.html
@@ -0,0 +1,46 @@
+
+
+ {$lang->trackback} : {count($document->trackback_list)}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | {$lang->title} |
+ {$val->title} |
+
+
+ | {$lang->date} |
+ {zdate($val->regdate, "Y-m-d H:i:s")} |
+
+
+ | {$lang->blog_name} |
+ {$val->blog_name} |
+
+
+ | {$lang->excerpt} |
+ {nl2br($val->excerpt)} |
+
+
+ | ipaddress |
+ {$val->ipaddress} |
+
+
+ |
+ [{$lang->cmd_delete}]
+ |
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/view_document.html b/modules/blog/skins/default/view_document.html
new file mode 100644
index 000000000..328ac5532
--- /dev/null
+++ b/modules/blog/skins/default/view_document.html
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | {$lang->category} |
+ {$category_list[$document->category_srl]->title} |
+
+
+
+
+ | {$lang->title} |
+ {htmlspecialchars($document->title)} |
+
+
+
+ | {$lang->homepage} |
+ {htmlspecialchars($document->homepage)} |
+
+
+
+ | {$lang->date} |
+ {zdate($document->regdate,"Y-m-d H:i:s")} |
+
+
+ | {$lang->writer} |
+ {htmlspecialchars($document->nick_name)} |
+
+
+ | {$lang->readed_count} |
+ {$document->readed_count} |
+
+
+ | {$lang->voted_count} |
+ {$document->voted_count} |
+
+
+ | {$lang->content} |
+ {$document->content} |
+
+
+ | {$lang->document_url} |
+ {getUrl()}{$document->document_srl} |
+
+
+
+
+ | {$lang->trackback_url} |
+ {getUrl()}trackback/{$document->document_srl} |
+
+
+
+
+
+ | {$lang->tag} |
+
+
+ {htmlspecialchars($val)}
+
+ |
+
+
+
+
+
+ | {$lang->uploaded_file} |
+
+
+
+
+ |
+
+
+
+
+ | ipaddress |
+ {$document->ipaddress} |
+
+
+ |
+
+ {$lang->allow_comment}
+
+
+
+ {$lang->lock_comment}
+
+
+
+ {$lang->allow_trackback}
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/skins/default/write_form.html b/modules/blog/skins/default/write_form.html
new file mode 100644
index 000000000..2a8f6d27e
--- /dev/null
+++ b/modules/blog/skins/default/write_form.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
diff --git a/modules/blog/tpl/board_config.html b/modules/blog/tpl/board_config.html
new file mode 100644
index 000000000..bf07fc6a0
--- /dev/null
+++ b/modules/blog/tpl/board_config.html
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/modules/blog/tpl/board_delete.html b/modules/blog/tpl/board_delete.html
new file mode 100644
index 000000000..93d298485
--- /dev/null
+++ b/modules/blog/tpl/board_delete.html
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/modules/blog/tpl/board_info.html b/modules/blog/tpl/board_info.html
new file mode 100644
index 000000000..508f039c3
--- /dev/null
+++ b/modules/blog/tpl/board_info.html
@@ -0,0 +1,65 @@
+
+
+
diff --git a/modules/blog/tpl/board_insert.html b/modules/blog/tpl/board_insert.html
new file mode 100644
index 000000000..0ba0aabae
--- /dev/null
+++ b/modules/blog/tpl/board_insert.html
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+ {$lang->msg_new_module}
+
+ {$lang->msg_update_module}
+
+
+
+
diff --git a/modules/blog/tpl/category_list.html b/modules/blog/tpl/category_list.html
new file mode 100644
index 000000000..23d786305
--- /dev/null
+++ b/modules/blog/tpl/category_list.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/category_update_form.html b/modules/blog/tpl/category_update_form.html
new file mode 100644
index 000000000..51ffc8ce3
--- /dev/null
+++ b/modules/blog/tpl/category_update_form.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/checked_list.html b/modules/blog/tpl/checked_list.html
new file mode 100644
index 000000000..6ad21a3b9
--- /dev/null
+++ b/modules/blog/tpl/checked_list.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
{$lang->cmd_manage_document}
+
+
+
{$lang->msg_no_checked_document}
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/delete_board.xml b/modules/blog/tpl/filter/delete_board.xml
new file mode 100644
index 000000000..cba763914
--- /dev/null
+++ b/modules/blog/tpl/filter/delete_board.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/insert_board.xml b/modules/blog/tpl/filter/insert_board.xml
new file mode 100644
index 000000000..3655b3fcc
--- /dev/null
+++ b/modules/blog/tpl/filter/insert_board.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/insert_category.xml b/modules/blog/tpl/filter/insert_category.xml
new file mode 100644
index 000000000..9aed519d1
--- /dev/null
+++ b/modules/blog/tpl/filter/insert_category.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/insert_config.xml b/modules/blog/tpl/filter/insert_config.xml
new file mode 100644
index 000000000..c0a674180
--- /dev/null
+++ b/modules/blog/tpl/filter/insert_config.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/insert_grant.xml b/modules/blog/tpl/filter/insert_grant.xml
new file mode 100644
index 000000000..8ac809f0b
--- /dev/null
+++ b/modules/blog/tpl/filter/insert_grant.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/manage_checked_document.xml b/modules/blog/tpl/filter/manage_checked_document.xml
new file mode 100644
index 000000000..f2bd9641c
--- /dev/null
+++ b/modules/blog/tpl/filter/manage_checked_document.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/filter/update_category.xml b/modules/blog/tpl/filter/update_category.xml
new file mode 100644
index 000000000..ff7e59f62
--- /dev/null
+++ b/modules/blog/tpl/filter/update_category.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/grant_list.html b/modules/blog/tpl/grant_list.html
new file mode 100644
index 000000000..432d7f464
--- /dev/null
+++ b/modules/blog/tpl/grant_list.html
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/modules/blog/tpl/header.html b/modules/blog/tpl/header.html
new file mode 100644
index 000000000..e25950779
--- /dev/null
+++ b/modules/blog/tpl/header.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+ {$lang->mid} : {$module_info->mid}
+
+ (
{$lang->cmd_move})
+
+ [{$lang->is_default}]
+
+
diff --git a/modules/blog/tpl/index.html b/modules/blog/tpl/index.html
new file mode 100644
index 000000000..7c939fd12
--- /dev/null
+++ b/modules/blog/tpl/index.html
@@ -0,0 +1,77 @@
+
+
+
+
+ {$lang->total_count} {number_format($total_count)},
+ {$lang->page_count} : {number_format($page)} / {number_format($total_page)}
+
+
+
+
+
+
+
+ | {$lang->no} |
+
+
+ |
+ {$lang->mid} |
+ {$lang->browser_title} |
+ {$lang->is_default} |
+ {$lang->skin} |
+ {$lang->admin_id} |
+ {$lang->regdate} |
+ {$lang->cmd_move} |
+ {$lang->cmd_delete} |
+
+
+
+
+ | {$no} |
+
+
+ {$lang->not_exists}
+
+ {$module_category[$val->module_category_srl]->title}
+
+ |
+ {$val->mid} |
+ {htmlspecialchars($val->browser_title)} |
+ {$val->is_default} |
+ {$val->skin} |
+ {$val->admin_id} |
+ {zdate($val->regdate,"Y-m-d")} |
+ {$lang->cmd_move} |
+ {$lang->cmd_delete} |
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/blog/tpl/js/board_admin.js b/modules/blog/tpl/js/board_admin.js
new file mode 100644
index 000000000..148562b46
--- /dev/null
+++ b/modules/blog/tpl/js/board_admin.js
@@ -0,0 +1,116 @@
+/**
+ * @file modules/board/js/board_admin.js
+ * @author zero (zero@nzeo.com)
+ * @brief board 모듈의 관리자용 javascript
+ **/
+
+/* 모듈 생성 후 */
+function completeInsertBoard(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+
+ var page = ret_obj['page'];
+ var module_srl = ret_obj['module_srl'];
+
+ alert(message);
+
+ var url = location.href.setQuery('module_srl',module_srl).setQuery('act','dispBoardAdminBoardInfo');
+ if(page) url.setQuery('page',page);
+ location.href = url;
+}
+
+/* 모듈 삭제 후 */
+function completeDeleteBoard(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var page = ret_obj['page'];
+ alert(message);
+
+ var url = location.href.setQuery('act','dispBoardAdminContent').setQuery('module_srl','');
+ if(page) url = url.setQuery('page',page);
+ location.href = url;
+}
+
+/* 카테고리 관련 작업들 */
+function doUpdateCategory(category_srl, mode, message) {
+ if(typeof(message)!='undefined'&&!confirm(message)) return;
+
+ var fo_obj = xGetElementById('fo_category_info');
+ fo_obj.category_srl.value = category_srl;
+ fo_obj.mode.value = mode;
+
+ procFilter(fo_obj, update_category);
+}
+
+/* 카테고리 정보 수정 후 */
+function completeUpdateCategory(ret_obj) {
+ var error = ret_obj['error'];
+ var message = ret_obj['message'];
+ var module_srl = ret_obj['module_srl'];
+ var page = ret_obj['page'];
+ alert(message);
+
+ var url = location.href.setQuery('module_srl',module_srl).setQuery('act','dispBoardAdminCategoryInfo');
+ if(page) url.setQuery('page',page);
+ location.href = url;
+}
+
+/* 권한 관련 */
+function doSelectAll(obj, key) {
+ var fo_obj = obj.parentNode;
+ while(fo_obj.nodeName != 'FORM') {
+ fo_obj = fo_obj.parentNode;
+ }
+
+ for(var i=0;i
+
+
+
+
diff --git a/modules/blog/tpl/top_refresh.html b/modules/blog/tpl/top_refresh.html
new file mode 100644
index 000000000..2f4983d1d
--- /dev/null
+++ b/modules/blog/tpl/top_refresh.html
@@ -0,0 +1,3 @@
+