diff --git a/addons/point/conf/info.xml b/addons/point/conf/info.xml new file mode 100644 index 000000000..7ccbcd3a4 --- /dev/null +++ b/addons/point/conf/info.xml @@ -0,0 +1,10 @@ + + + 포인트 활성화 애드온 + + 제로 + + 포인트시스템 모듈에 설정된 내용을 바탕으로 글작성/삭제/댓글작성/삭제/파일업로드/삭제/다운로드등의 행동에 대해서 포인트를 기록합니다. + + + diff --git a/addons/point/point.addon.php b/addons/point/point.addon.php new file mode 100644 index 000000000..0d66545f3 --- /dev/null +++ b/addons/point/point.addon.php @@ -0,0 +1,221 @@ +member_srl) return; + + // point action cache file을 가져와서 현재 속한 캐시파일인지 확인 + $act_cache_file = "./files/cache/point.act.cache"; + $buff = FileHandler::readFile($act_cache_file); + if(strpos($buff,$this->act)===false) return; + + // point 모듈 정보 가져옴 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + // 현재 로그인 사용자의 포인트를 가져옴 + $member_srl = $logged_info->member_srl; + + $oPointModel = &getModel('point'); + $cur_point = $oPointModel->getPoint($member_srl, true); + + // 파일다운로드를 제외한 action은 called_position가 before_module_proc일때 실행 + if($called_position == 'after_module_proc') { + + // 게시글 작성 + if(strpos($config->insert_document_act,$this->act)!==false) { + $document_srl = Context::get('document_srl'); + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + + // 신규 글인지 체크 + if($oDocument->get('regdate')!=$oDocument->get('last_update')) return; + $module_srl = $oDocument->get('module_srl'); + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['insert_document']; + if(!$point) $point = $config->insert_document; + + // 포인트 증감 + $cur_point += $point; + $oPointController = &getController('point'); + $oPointController->setPoint($member_srl,$cur_point); + + // 게시글 삭제 + } elseif(strpos($config->delete_document_act,$this->act)!==false) { + if(!$this->toBool()) return; + $target_member_srl = Context::get('_point_target_member_srl'); + if(!$target_member_srl) return; + + $module_srl = $this->module_srl; + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['insert_document']; + if(!$point) $point = $config->insert_document; + + // 포인트 차감 + $cur_point = $oPointModel->getPoint($target_member_srl, true); + $cur_point -= $point; + + $oPointController = &getController('point'); + $oPointController->setPoint($target_member_srl,$cur_point); + + // 댓글 작성 + } elseif(strpos($config->insert_comment_act,$this->act)!==false) { + $comment_srl = Context::get('comment_srl'); + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl); + + // 이미 존재하는 댓글인지 체크 + if($comment->last_update) return; + + // 포인트를 구해옴 + $module_srl = $comment->module_srl; + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['insert_comment']; + if(!$point) $point = $config->insert_comment; + + // 포인트 증감 + $cur_point += $point; + $oPointController = &getController('point'); + $oPointController->setPoint($member_srl,$cur_point); + + + // 댓글 삭제 + } elseif(strpos($config->delete_comment_act,$this->act)!==false) { + if(!$this->toBool()) return; + $target_member_srl = Context::get('_point_target_member_srl'); + if(!$target_member_srl) return; + + // 포인트를 구해옴 + $module_srl = $this->module_srl; + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['insert_comment']; + if(!$point) $point = $config->insert_comment; + + // 포인트 증감 + $cur_point = $oPointModel->getPoint($target_member_srl, true); + $cur_point -= $point; + + $oPointController = &getController('point'); + $oPointController->setPoint($target_member_srl,$cur_point); + + // 파일업로드 + } elseif(strpos($config->upload_file_act,$this->act)!==false) { + if(!$output->toBool()||!$output->get('file_srl')) return; + $file_srl = $output->get('file_srl'); + + $oFileModel = &getModel('file'); + $file_info = $oFileModel->getFile($file_srl); + + $module_srl = $this->module_srl; + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['upload_file']; + if(!$point) $point = $config->upload_file; + + // 포인트 증감 + $cur_point += $point; + $oPointController = &getController('point'); + $oPointController->setPoint($member_srl,$cur_point); + + // 파일삭제 + } elseif(strpos($config->delete_file_act,$this->act)!==false) { + // 파일 정보를 구해옴 + $file_srl = Context::get('file_srl'); + if(!$file_srl) return; + $target_member_srl = Context::get('_point_target_member_srl'); + if(!$target_member_srl) return; + + $module_srl = $this->module_srl; + + $target_member_srl = Context::get('_point_target_member_srl'); + if(!$target_member_srl) return; + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['upload_file']; + if(!$point) $point = $config->upload_file; + + // 포인트 차감 + $cur_point = $oPointModel->getPoint($target_member_srl, true); + $cur_point -= $point; + $oPointController = &getController('point'); + $oPointController->setPoint($target_member_srl,$cur_point); + } + + // 파일다운로드는 before_module_proc 일때 체크 + } else if($called_position == "before_module_proc") { + + // 파일다운로드 + if(strpos($config->download_file_act,$this->act)!==false) { + // 파일 정보를 구해옴 + $file_srl = Context::get('file_srl'); + if(!$file_srl) return; + + $oFileModel = &getModel('file'); + $file_info = $oFileModel->getFile($file_srl); + if($file_info->file_srl != $file_srl) return; + + $module_srl = $file_info->module_srl; + + // 포인트를 구해옴 + $point = $config->module_point[$module_srl]['download_file']; + if(!$point) $point = $config->download_file; + + // 포인트가 0보다 작고 포인트가 없으면 파일 다운로드가 안되도록 했다면 오류 + if($cur_point + $point < 0 && $config->disable_download == 'Y') { + $this->stop('msg_cannot_download'); + } + + // 포인트 차감 + $cur_point += $point; + $oPointController = &getController('point'); + $oPointController->setPoint($member_srl,$cur_point); + + // 글 삭제일 경우 대상 글의 사용자 번호 저장 + } elseif(strpos($config->delete_document_act,$this->act)!==false) { + $document_srl = Context::get('document_srl'); + $oDocumentModel = &getModel('document'); + $oDocument = $oDocumentModel->getDocument($document_srl); + $target_member_srl = $oDocument->get('member_srl'); + if($target_member_srl) Context::set('_point_target_member_srl', $target_member_srl); + + // 댓글 삭제일 경우 대상 댓글의 사용자 번호 저장 + } elseif(strpos($config->delete_comment_act,$this->act)!==false) { + $comment_srl = Context::get('comment_srl'); + $oCommentModel = &getModel('comment'); + $comment = $oCommentModel->getComment($comment_srl); + $target_member_srl = $comment->member_srl; + if($target_member_srl) Context::set('_point_target_member_srl', $target_member_srl); + + // 파일삭제일 경우 대상 파일의 정보에서 사용자 번호 저장 + } elseif(strpos($config->delete_file_act,$this->act)!==false) { + // 파일 정보를 구해옴 + $file_srl = Context::get('file_srl'); + if(!$file_srl) return; + + $oFileModel = &getModel('file'); + $file_info = $oFileModel->getFile($file_srl); + if($file_info->file_srl != $file_srl) return; + + $target_member_srl = $file_info->member_srl; + if($target_member_srl) Context::set('_point_target_member_srl', $target_member_srl); + } + } +?> diff --git a/addons/point_level_icon/.point_level_icon.addon.php.swp b/addons/point_level_icon/.point_level_icon.addon.php.swp new file mode 100644 index 000000000..0aac604b5 Binary files /dev/null and b/addons/point_level_icon/.point_level_icon.addon.php.swp differ diff --git a/addons/point_level_icon/conf/info.xml b/addons/point_level_icon/conf/info.xml new file mode 100644 index 000000000..1a9260fd7 --- /dev/null +++ b/addons/point_level_icon/conf/info.xml @@ -0,0 +1,11 @@ + + + 포인트 레벨 아이콘 표시 애드온 + + 제로 + + 포인트 시스템을 사용중일 경우 사용자 이름 앞에 레벨 아이콘을 표시하도록 합니다. + 레벨 아이콘은 모듈 > 포인트시스템에서 선택 가능합니다. + + + diff --git a/addons/point_level_icon/point_level_icon.addon.php b/addons/point_level_icon/point_level_icon.addon.php new file mode 100644 index 000000000..e50591b37 --- /dev/null +++ b/addons/point_level_icon/point_level_icon.addon.php @@ -0,0 +1,17 @@ +]*)member_([0-9\-]*)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oPointController, 'transLevelIcon'), $output); +?> diff --git a/modules/point/conf/info.xml b/modules/point/conf/info.xml new file mode 100644 index 000000000..64235d2dd --- /dev/null +++ b/modules/point/conf/info.xml @@ -0,0 +1,12 @@ + + + 포인트 시스템 + + 제로 + + 글작성/삭제/댓글작성/삭제시에 포인트를 부여할 수 있습니다. + 포인트마다 레벨을 지정하여 사용자 이름 앞에 아이콘을 표시할 수도 있습니다. + 단 포인트 관련 애드온을 활성화 시키셔야 됩니다. + + + diff --git a/modules/point/conf/module.xml b/modules/point/conf/module.xml new file mode 100644 index 000000000..3383cdf9f --- /dev/null +++ b/modules/point/conf/module.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/modules/point/icons/default/0.gif b/modules/point/icons/default/0.gif new file mode 100755 index 000000000..efaa21145 Binary files /dev/null and b/modules/point/icons/default/0.gif differ diff --git a/modules/point/icons/default/1.gif b/modules/point/icons/default/1.gif new file mode 100755 index 000000000..6ad33d739 Binary files /dev/null and b/modules/point/icons/default/1.gif differ diff --git a/modules/point/icons/default/10.gif b/modules/point/icons/default/10.gif new file mode 100755 index 000000000..0f9fb0271 Binary files /dev/null and b/modules/point/icons/default/10.gif differ diff --git a/modules/point/icons/default/11.gif b/modules/point/icons/default/11.gif new file mode 100755 index 000000000..007bf5872 Binary files /dev/null and b/modules/point/icons/default/11.gif differ diff --git a/modules/point/icons/default/12.gif b/modules/point/icons/default/12.gif new file mode 100755 index 000000000..182a42785 Binary files /dev/null and b/modules/point/icons/default/12.gif differ diff --git a/modules/point/icons/default/13.gif b/modules/point/icons/default/13.gif new file mode 100755 index 000000000..f0fe7f6d0 Binary files /dev/null and b/modules/point/icons/default/13.gif differ diff --git a/modules/point/icons/default/14.gif b/modules/point/icons/default/14.gif new file mode 100755 index 000000000..8e0061d2b Binary files /dev/null and b/modules/point/icons/default/14.gif differ diff --git a/modules/point/icons/default/15.gif b/modules/point/icons/default/15.gif new file mode 100755 index 000000000..db8837344 Binary files /dev/null and b/modules/point/icons/default/15.gif differ diff --git a/modules/point/icons/default/16.gif b/modules/point/icons/default/16.gif new file mode 100755 index 000000000..e014dfd47 Binary files /dev/null and b/modules/point/icons/default/16.gif differ diff --git a/modules/point/icons/default/17.gif b/modules/point/icons/default/17.gif new file mode 100755 index 000000000..6492fd21c Binary files /dev/null and b/modules/point/icons/default/17.gif differ diff --git a/modules/point/icons/default/18.gif b/modules/point/icons/default/18.gif new file mode 100755 index 000000000..a01cf8984 Binary files /dev/null and b/modules/point/icons/default/18.gif differ diff --git a/modules/point/icons/default/19.gif b/modules/point/icons/default/19.gif new file mode 100755 index 000000000..b8bcd4228 Binary files /dev/null and b/modules/point/icons/default/19.gif differ diff --git a/modules/point/icons/default/2.gif b/modules/point/icons/default/2.gif new file mode 100755 index 000000000..713e5b64b Binary files /dev/null and b/modules/point/icons/default/2.gif differ diff --git a/modules/point/icons/default/20.gif b/modules/point/icons/default/20.gif new file mode 100755 index 000000000..c1efbb8d2 Binary files /dev/null and b/modules/point/icons/default/20.gif differ diff --git a/modules/point/icons/default/21.gif b/modules/point/icons/default/21.gif new file mode 100755 index 000000000..3a5828fba Binary files /dev/null and b/modules/point/icons/default/21.gif differ diff --git a/modules/point/icons/default/22.gif b/modules/point/icons/default/22.gif new file mode 100755 index 000000000..e184dcc33 Binary files /dev/null and b/modules/point/icons/default/22.gif differ diff --git a/modules/point/icons/default/23.gif b/modules/point/icons/default/23.gif new file mode 100755 index 000000000..0787ca8b1 Binary files /dev/null and b/modules/point/icons/default/23.gif differ diff --git a/modules/point/icons/default/24.gif b/modules/point/icons/default/24.gif new file mode 100755 index 000000000..c61d5a3bc Binary files /dev/null and b/modules/point/icons/default/24.gif differ diff --git a/modules/point/icons/default/25.gif b/modules/point/icons/default/25.gif new file mode 100755 index 000000000..9de0ffb8a Binary files /dev/null and b/modules/point/icons/default/25.gif differ diff --git a/modules/point/icons/default/26.gif b/modules/point/icons/default/26.gif new file mode 100755 index 000000000..c188cf0c3 Binary files /dev/null and b/modules/point/icons/default/26.gif differ diff --git a/modules/point/icons/default/27.gif b/modules/point/icons/default/27.gif new file mode 100755 index 000000000..96947cee7 Binary files /dev/null and b/modules/point/icons/default/27.gif differ diff --git a/modules/point/icons/default/28.gif b/modules/point/icons/default/28.gif new file mode 100755 index 000000000..988588b5d Binary files /dev/null and b/modules/point/icons/default/28.gif differ diff --git a/modules/point/icons/default/29.gif b/modules/point/icons/default/29.gif new file mode 100755 index 000000000..9ccb0ca18 Binary files /dev/null and b/modules/point/icons/default/29.gif differ diff --git a/modules/point/icons/default/3.gif b/modules/point/icons/default/3.gif new file mode 100755 index 000000000..82bc3171c Binary files /dev/null and b/modules/point/icons/default/3.gif differ diff --git a/modules/point/icons/default/30.gif b/modules/point/icons/default/30.gif new file mode 100755 index 000000000..49695680e Binary files /dev/null and b/modules/point/icons/default/30.gif differ diff --git a/modules/point/icons/default/4.gif b/modules/point/icons/default/4.gif new file mode 100755 index 000000000..554bef415 Binary files /dev/null and b/modules/point/icons/default/4.gif differ diff --git a/modules/point/icons/default/5.gif b/modules/point/icons/default/5.gif new file mode 100755 index 000000000..9df6ad65d Binary files /dev/null and b/modules/point/icons/default/5.gif differ diff --git a/modules/point/icons/default/6.gif b/modules/point/icons/default/6.gif new file mode 100755 index 000000000..6970c7ae5 Binary files /dev/null and b/modules/point/icons/default/6.gif differ diff --git a/modules/point/icons/default/7.gif b/modules/point/icons/default/7.gif new file mode 100755 index 000000000..728943e9a Binary files /dev/null and b/modules/point/icons/default/7.gif differ diff --git a/modules/point/icons/default/8.gif b/modules/point/icons/default/8.gif new file mode 100755 index 000000000..27a1db3e7 Binary files /dev/null and b/modules/point/icons/default/8.gif differ diff --git a/modules/point/icons/default/9.gif b/modules/point/icons/default/9.gif new file mode 100755 index 000000000..ed2d11574 Binary files /dev/null and b/modules/point/icons/default/9.gif differ diff --git a/modules/point/lang/ko.lang.php b/modules/point/lang/ko.lang.php new file mode 100644 index 000000000..e142c67ed --- /dev/null +++ b/modules/point/lang/ko.lang.php @@ -0,0 +1,45 @@ + + * @brief 포인트 (point) 모듈의 기본 언어팩 + **/ + + $lang->point = "포인트"; + $lang->level = "레벨"; + + $lang->about_point_module = "포인트 모듈은 글작성/댓글작성/업로드/다운로드등의 행동을 할때 포인트를 부여할 수 있습니다.
단 포인트 모듈에서는 설정만 할 뿐이고 포인트 애드온을 활성화 시켜야 포인트가 누적이 됩니다"; + $lang->about_act_config = "게시판,블로그등의 모듈마다 글작성/삭제/댓글작성/삭제등의 action이 있습니다.
게시판/블로그외의 모듈에 포인트 기능 연동을 하고 싶을때는 각 기능에 맞는 act값을 추가해주시면 됩니다.
연결은 ,(콤마)로 해주시면 됩니다."; + + $lang->max_level = '최고 레벨'; + $lang->about_max_level = '최고레벨을 지정하실 수 있습니다. 레벨 아이콘을 염두에 두셔야 하고 최고 레벨은 100이 한계입니다'; + + $lang->level_icon = '레벨 아이콘'; + $lang->about_level_icon = '레벨아이콘은 ./modules/point/icons/레벨.gif 로 지정되며 최고레벨과 아이콘셋이 다를 수 있으니 주의해주세요'; + + $lang->point_name = '포인트 명칭'; + $lang->about_point_name = '포인트의 이름이나 단위를 정하실 수 있습니다'; + + $lang->level_point = '레벨 포인트'; + $lang->about_level_point = '아래 각 레벨별 포인트에 도달하거나 감소하게 되면 레벨이 조절됩니다'; + + $lang->disable_download = '다운로드 금지'; + $lang->about_disable_download = '포인트가 없을 경우 다운로드를 금지하게 합니다. (이미지파일은 제외입니다)'; + + $lang->about_module_point = '모듈별로 포인트를 지정할 수 있으며 지정되지 않은 모듈은 기본 포인트를 이용하게 됩니다
모든 점수는 반대 행동을 하였을 경우 원상복귀 됩니다.'; + + $lang->point_insert_document = '글 작성'; + $lang->point_delete_document = '글 삭제'; + $lang->point_insert_comment = '댓글 작성'; + $lang->point_delete_comment = '댓글 삭제'; + $lang->point_upload_file = '파일 업로드'; + $lang->point_delete_file = '파일 업로드'; + $lang->point_download_file = '파일 다운로드 (이미지 제외)'; + + + $lang->cmd_point_config = '기본 설정'; + $lang->cmd_point_module_config = '모듈별 설정'; + $lang->cmd_point_act_config = '기능별 act 설정'; + + $lang->msg_cannot_download = '포인트가 부족하여 다운로드를 하실 수 없습니다'; +?> diff --git a/modules/point/point.admin.controller.php b/modules/point/point.admin.controller.php new file mode 100644 index 000000000..51e82119d --- /dev/null +++ b/modules/point/point.admin.controller.php @@ -0,0 +1,138 @@ +getModuleConfig('point'); + + // 변수 정리 + $args = Context::getRequestVars(); + + $config->point_name = $args->point_name; + if(!$config->point_name) $config->point_name = 'point'; + + $config->max_level = $args->max_level; + if($config->max_level>100) $config->max_level = 100; + if($config->max_level<1) $config->max_level = 1; + + $config->level_icon = $args->level_icon; + if($args->disable_download == 'Y') $config->disable_download = 'Y'; + else $config->disable_download = 'N'; + + for($i=1;$i<=$config->max_level;$i++) { + $key = "level_step_".$i; + $config->level_step[$i] = (int)$args->{$key}; + } + + // 저장 + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('point', $config); + + $this->cacheActList(); + + $this->setMessage('success_updated'); + } + + /** + * @brief 모듈별 설정 저장 + **/ + function procPointAdminInsertModuleConfig() { + // 설정 정보 가져오기 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + // 변수 정리 + $args = Context::getRequestVars(); + + $config->insert_document = $args->insert_document; + $config->insert_comment = $args->insert_comment; + $config->upload_file = $args->upload_file; + $config->download_file = $args->download_file; + + foreach($args as $key => $val) { + preg_match("/^(insert_document|insert_comment|upload_file|download_file)_([0-9]+)$/", $key, $matches); + if(!$matches[1]) continue; + $name = $matches[1]; + $module_srl = $matches[2]; + if(strlen($val)==0) unset($config->module_point[$module_srl][$name]); + else $config->module_point[$module_srl][$name] = $val; + } + + // 저장 + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('point', $config); + + $this->cacheActList(); + + $this->setMessage('success_updated'); + } + + /** + * @brief 기능별 act 저장 + **/ + function procPointAdminInsertActConfig() { + // 설정 정보 가져오기 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + // 변수 정리 + $args = Context::getRequestVars(); + + $config->insert_document_act = $args->insert_document_act; + $config->delete_document_act = $args->delete_document_act; + $config->insert_comment_act = $args->insert_comment_act; + $config->delete_comment_act = $args->delete_comment_act; + $config->upload_file_act = $args->upload_file_act; + $config->delete_file_act = $args->delete_file_act; + $config->download_file_act = $args->download_file_act; + + // 저장 + $oModuleController = &getController('module'); + $oModuleController->insertModuleConfig('point', $config); + + $this->cacheActList(); + + $this->setMessage('success_updated'); + } + + /** + * @brief 캐시파일 저장 + **/ + function cacheActList() { + // 설정 정보 가져오기 + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('point'); + + // 각 act값을 정리 + $act_list = sprintf("%s,%s,%s,%s,%s,%s,%s", + $config->insert_document_act, + $config->delete_document_act, + $config->insert_comment_act, + $config->delete_comment_act, + $config->upload_file_act, + $config->delete_file_act, + $config->download_file_act + ); + + $act_cache_file = "./files/cache/point.act.cache"; + FileHandler::writeFile($act_cache_file, $act_list); + } + + } +?> diff --git a/modules/point/point.admin.view.php b/modules/point/point.admin.view.php new file mode 100644 index 000000000..2f8d8b1b2 --- /dev/null +++ b/modules/point/point.admin.view.php @@ -0,0 +1,59 @@ +getModuleConfig('point'); + Context::set('config', $config); + + // 설정 변수 지정 + Context::set('config', $config); + + // template path지정 + $this->setTemplatePath($this->module_path.'tpl'); + } + + /** + * @brief 기본 설정 + **/ + function dispPointAdminConfig() { + // 레벨 아이콘 목록 구함 + $level_icon_list = FileHandler::readDir("./modules/point/icons"); + Context::set('level_icon_list', $level_icon_list); + + // 템플릿 지정 + $this->setTemplateFile('config'); + } + + /** + * @brief 모듈별 점수 지정 + **/ + function dispPointAdminModuleConfig() { + // mid 목록 가져오기 + $oModuleModel = &getModel('module'); + $mid_list = $oModuleModel->getMidList(); + Context::set('mid_list', $mid_list); + + // 템플릿 지정 + $this->setTemplateFile('module_config'); + } + + /** + * @brief 기능별 act 설정 + **/ + function dispPointAdminActConfig() { + // 템플릿 지정 + $this->setTemplateFile('action_config'); + } + } +?> diff --git a/modules/point/point.class.php b/modules/point/point.class.php new file mode 100644 index 000000000..33f282b40 --- /dev/null +++ b/modules/point/point.class.php @@ -0,0 +1,92 @@ +insertActionForward('point', 'view', 'dispPointAdminConfig'); + $oModuleController->insertActionForward('point', 'view', 'dispPointAdminModuleConfig'); + $oModuleController->insertActionForward('point', 'view', 'dispPointAdminActConfig'); + + // 포인트 정보를 기록할 디렉토리 생성 + FileHandler::makeDir('./files/member_extra_info/point'); + + $oModuleController = &getController('module'); + + // 최고레벨 + $config->max_level = 30; + + // 레벨별 점수 + for($i=1;$i<=30;$i++) { + $config->level_step[$i] = pow($i,2)*90; + } + + // 포인트 호칭 + $config->point_name = 'point'; + + // 레벨 아이콘 디렉토리 + $config->level_icon = "default"; + + // 점수가 없을때 다운로드 금지 기능 + $config->disable_download = false; + + /** + * 모듈별 기본 점수 및 각 action 정의 (게시판,블로그외에 어떤 모듈이 생길지 모르니 act값을 명시한다 + **/ + // 글작성 + $config->insert_document = 10; + + $config->insert_document_act = 'procBoardInsertDocument'; + $config->delete_document_act = 'procBoardDeleteDocument'; + + // 댓글작성 + $config->insert_comment = 5; + + $config->insert_comment_act = 'procBoardInsertComment,procBlogInsertComment'; + $config->delete_comment_act = 'procBoardDeleteComment,procBlogDeleteComment'; + + // 업로드 + $config->upload_file = 5; + + $config->upload_file_act = 'procFileUpload'; + $config->delete_file_act = 'procFileDelete'; + + // 다운로드 + $config->download_file = -5; + $config->download_file_act = 'procFileDownload'; + + // 설정 저장 + $oModuleController->insertModuleConfig('point', $config); + + // 빠른 실행을 위해서 act list를 캐싱 + $oPointController = &getAdminController('point'); + $oPointController->cacheActList(); + + return new Object(); + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(0, 'success_updated'); + } + + } +?> diff --git a/modules/point/point.controller.php b/modules/point/point.controller.php new file mode 100644 index 000000000..c761c6a10 --- /dev/null +++ b/modules/point/point.controller.php @@ -0,0 +1,85 @@ +member_srl = $member_srl; + $args->point = $point; + + // 포인트가 있는지 체크 + $oPointModel = &getModel('point'); + if($oPointModel->isExistsPoint($member_srl)) { + executeQuery("point.updatePoint", $args); + } else { + executeQuery("point.insertPoint", $args); + } + + // 캐시 설정 + $cache_path = sprintf('./files/member_extra_info/point/%s/', getNumberingPath($member_srl)); + FileHandler::makedir($cache_path); + + $cache_filename = sprintf('%s%d.cache.txt', $cache_path, $member_srl); + FileHandler::writeFile($cache_filename, $point); + + return $output; + } + + /** + * @brief 포인트 레벨 아이콘 표시 + **/ + function transLevelIcon($matches) { + if(!$this->config) { + $oModuleModel = &getModel('module'); + $this->config = $oModuleModel->getModuleConfig('point'); + } + + if(!$this->oPointModel) $this->oPointModel = &getModel('point'); + + $member_srl = $matches[3]; + if($this->member_code[$member_srl]) return $this->member_code[$member_srl]; + + $point = $this->oPointModel->getPoint($member_srl); + $level = $this->oPointModel->getLevel($point, $this->config->level_step); + + $src = sprintf("modules/point/icons/%s/%d.gif", $this->config->level_icon, $level); + if(!$this->icon_width) { + $info = getimagesize($src); + $this->icon_width = $info[0]; + $this->icon_height = $info[1]; + } + + if($level < $this->config->max_level) { + $next_point = $this->config->level_step[$level+1]; + if($next_point > 0) { + $per = (int)($point / $next_point*100); + } + } + + $code = str_replace('<'.$matches[6], sprintf('<%s title="%s:%s%s, %s:%s/%s" style="cursor:pointer;background:url(%s) no-repeat left;padding-left:%dpx; height:%dpx" ', $matches[1], Context::getLang('point'), $point, $per?"(".$per."%)":"", Context::getLang('level'), $level, $this->config->max_level, Context::getRequestUri().$src, $this->icon_width+2, $this->icon_height), $matches[0] ); + $this->member_code[$member_srl] = $code; + + return $this->member_code[$member_srl]; + } + } +?> diff --git a/modules/point/point.model.php b/modules/point/point.model.php new file mode 100644 index 000000000..6a0a7f461 --- /dev/null +++ b/modules/point/point.model.php @@ -0,0 +1,54 @@ +member_srl = $member_srl; + $output = executeQuery('point.getPoint', $args); + if($output->data->member_srl == $member_srl) return true; + return false; + } + + /** + * @brief 포인트를 구해옴 + **/ + function getPoint($member_srl, $from_db = false) { + $cache_filename = sprintf('./files/member_extra_info/point/%s%d.cache.txt', getNumberingPath($member_srl), $member_srl); + + if(!$from_db && file_exists($target_filename)) return trim(FileHandler::readFile($cache_filename)); + + // DB에서 가져옴 + $args->member_srl = $member_srl; + $output = executeQuery('point.getPoint', $args); + $point = (int)$output->data->point; + + FileHandler::writeFile($cache_filename, $point); + + return $point; + } + + /** + * @brief 레벨을 구함 + **/ + function getLevel($point, $level_step) { + $level_count = count($level_step); + for($level=0;$level<=$level_count;$level++) if($point < $level_step[$level]) break; + $level --; + return $level; + } + } +?> diff --git a/modules/point/queries/getPoint.xml b/modules/point/queries/getPoint.xml new file mode 100644 index 000000000..320fb585a --- /dev/null +++ b/modules/point/queries/getPoint.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/modules/point/queries/insertPoint.xml b/modules/point/queries/insertPoint.xml new file mode 100644 index 000000000..b8c08907f --- /dev/null +++ b/modules/point/queries/insertPoint.xml @@ -0,0 +1,9 @@ + + +
+ + + + + + diff --git a/modules/point/queries/updatePoint.xml b/modules/point/queries/updatePoint.xml new file mode 100644 index 000000000..3955d0151 --- /dev/null +++ b/modules/point/queries/updatePoint.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/point/schemas/point.xml b/modules/point/schemas/point.xml new file mode 100644 index 000000000..b5ea15a56 --- /dev/null +++ b/modules/point/schemas/point.xml @@ -0,0 +1,4 @@ +
+ + +
diff --git a/modules/point/skins/default/css/poll.css b/modules/point/skins/default/css/poll.css new file mode 100644 index 000000000..ee5a1020e --- /dev/null +++ b/modules/point/skins/default/css/poll.css @@ -0,0 +1,81 @@ +.poll_box { + border:3px solid #555555; + background-color:#EEEEEE; + margin:5px; + padding:8px 5px 8px 5px; +} + +.poll_title_box { + border:2px solid #444444; + background-color:#888888; + color:#FFFFFF; + font-weight:bold; + margin:5px; + padding:5px; + height:13px; + clear:both; +} + +.poll_stop_date { + float:left; +} + +.poll_join_count { + float:right; +} + +.poll_detail_box { + border:1px solid #444444; + background-color:#FFFFFF; + margin:5px; + padding-bottom:5px; +} + +.poll_detail_box .title { + background-color:#555555; + color:#FFFFFF; + padding:5px; + font-weight:bold; +} + +.poll_detail_box .item { + padding:5px; + border-bottom:1px solid #EEEEEE; +} + +.poll_detail_box .checkcount { + background-color:#AAAAAA; + text-align:right; + color:#EEEEEE; + padding:5px; +} + +.poll_detail_box .text { + margin:5px 0px 5px 20px; +} + +.poll_detail_box .bar_box { + width:80%; + margin-bottom:10px; + border:1px solid #DDDDDD; + margin:0px 5px 5px 35px; + padding:1px; +} + +.poll_detail_box .bar { + background-color:#444444; + border-bottom:1px solid #AAAAAA; + height:5px; +} + + +.poll_button_area { + text-align:center; +} + +.poll_button { + border:1px solid #555555; + background-color:#FFFFFF; + font-weight:bold; + height:20px; +} diff --git a/modules/point/skins/default/filter/poll.xml b/modules/point/skins/default/filter/poll.xml new file mode 100644 index 000000000..2639e3195 --- /dev/null +++ b/modules/point/skins/default/filter/poll.xml @@ -0,0 +1,10 @@ + +
+ + + + + + + + diff --git a/modules/point/skins/default/form.html b/modules/point/skins/default/form.html new file mode 100644 index 000000000..f6ac6e6f1 --- /dev/null +++ b/modules/point/skins/default/form.html @@ -0,0 +1,59 @@ + + + + + + +
+ +
+ + + + + + +
+
+ {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d H:i")} +
+
+ + + + +
+
{$val->title}
+ + {@$_idx = $poll->poll_srl.'_'.$poll_srl_index.'_'.$item_srl} + +
+ + + + + + +
+ + + +
+ {$lang->poll_checkcount} : {$val->checkcount} +
+ +
+ + + +
+ +
+ + + +
+ +
diff --git a/modules/point/skins/default/images/blank.gif b/modules/point/skins/default/images/blank.gif new file mode 100644 index 000000000..35d42e808 Binary files /dev/null and b/modules/point/skins/default/images/blank.gif differ diff --git a/modules/point/skins/default/js/poll.js b/modules/point/skins/default/js/poll.js new file mode 100644 index 000000000..e497eee65 --- /dev/null +++ b/modules/point/skins/default/js/poll.js @@ -0,0 +1,51 @@ +/* 설문 참여 함수 */ +function doPoll(fo_obj) { + + var checkcount = new Array(); + var item = new Array(); + + for(var i=0;i-1) { + var t = name.split('_'); + var poll_srl_index = parseInt(t[1],10); + checkcount[poll_srl_index] = obj.value; + item[poll_srl_index] = new Array(); + + } else if(name.indexOf('item_')>-1) { + var t = name.split('_'); + var poll_srl = parseInt(t[1],10); + var poll_srl_index = parseInt(t[2],10); + if(obj.checked == true) item[poll_srl_index][item[poll_srl_index].length] = obj.value; + } + } + + var poll_srl_indexes = ""; + for(var poll_srl_index in checkcount) { + var count = checkcount[poll_srl_index]; + var items = item[poll_srl_index]; + if(count > items.length) { + alert(poll_alert_lang); + return false; + } + + poll_srl_indexes += items.join(',')+','; + } + fo_obj.poll_srl_indexes.value = poll_srl_indexes; + + procFilter(fo_obj, poll); + return false; +} + +/* 설문 조사후 내용을 바꿀 함수 */ +function completePoll(ret_obj) { + alert(ret_obj['message']); + var poll_srl = ret_obj['poll_srl']; + var tpl = ret_obj['tpl']; + var width = xWidth("poll_"+poll_srl); + xInnerHtml("poll_"+poll_srl, tpl); + xWidth("poll_"+poll_srl, width); +} diff --git a/modules/point/skins/default/result.html b/modules/point/skins/default/result.html new file mode 100644 index 000000000..eeb1636de --- /dev/null +++ b/modules/point/skins/default/result.html @@ -0,0 +1,35 @@ + + +
+ +
+
+ {$lang->poll_join_count} : {number_format($poll->poll_count)} +
+
+ {$lang->poll_stop_date} : {zdate($poll->stop_date, "Y-m-d H:i")} +
+
+ +
+
{$val->title} ({$val->poll_count})
+ + {@$per = (int)(( $item->poll_count / $val->poll_count)*100) } + +
+ {$item_srl+1}. {$item->title} : {$item->poll_count} ({$per}%) +
+
+ +
bar
+ +
bar
+ +
+ + +
+ + + +
diff --git a/modules/point/skins/default/skin.xml b/modules/point/skins/default/skin.xml new file mode 100644 index 000000000..b78f17f73 --- /dev/null +++ b/modules/point/skins/default/skin.xml @@ -0,0 +1,25 @@ + + + 설문조사 기본 스킨 + アンケート調査デフォルトスキン + 投票调查基本皮肤 + Default Skin of Poll + + 제로 + Zero + zero + zero + 설문조사 기본 스킨 + アンケート調査デフォルトスキン + 投票调查基本皮肤 + Default Skin of Poll + + + + 기본 + デフォルト + 基本 + Default + + + diff --git a/modules/point/tpl/.action_config.html.swp b/modules/point/tpl/.action_config.html.swp new file mode 100644 index 000000000..156b9fe58 Binary files /dev/null and b/modules/point/tpl/.action_config.html.swp differ diff --git a/modules/point/tpl/action_config.html b/modules/point/tpl/action_config.html new file mode 100644 index 000000000..9d571c0db --- /dev/null +++ b/modules/point/tpl/action_config.html @@ -0,0 +1,45 @@ + + + +
+ +
{$lang->about_act_config}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->point_insert_document}
{$lang->point_delete_document}
{$lang->point_insert_comment}
{$lang->point_delete_comment}
{$lang->point_upload_file}
{$lang->point_delete_file}
{$lang->point_download_file}
+ + +
+ +
+ +
diff --git a/modules/point/tpl/config.html b/modules/point/tpl/config.html new file mode 100644 index 000000000..d471da3ca --- /dev/null +++ b/modules/point/tpl/config.html @@ -0,0 +1,64 @@ + + + +
+ +
{$lang->about_point_module}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang->max_level} + +

{$lang->about_max_level}

+
{$lang->point_name} + +

{$lang->about_point_name}

+
{$lang->level_icon} + +

{$lang->about_level_icon}

+
{$lang->disable_download} + disable_download=='Y')-->checked="checked" /> + {$lang->about_disable_download} +
{$lang->level_point}1 {$config->point_name}
{$i} {$config->point_name}
+ + +
+ +
+ +
diff --git a/modules/point/tpl/filter/insert_act_config.xml b/modules/point/tpl/filter/insert_act_config.xml new file mode 100644 index 000000000..56e18df59 --- /dev/null +++ b/modules/point/tpl/filter/insert_act_config.xml @@ -0,0 +1,8 @@ + +
+ + + + + + diff --git a/modules/point/tpl/filter/insert_config.xml b/modules/point/tpl/filter/insert_config.xml new file mode 100644 index 000000000..20cec621b --- /dev/null +++ b/modules/point/tpl/filter/insert_config.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/point/tpl/filter/insert_module_config.xml b/modules/point/tpl/filter/insert_module_config.xml new file mode 100644 index 000000000..f479559e9 --- /dev/null +++ b/modules/point/tpl/filter/insert_module_config.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/point/tpl/header.html b/modules/point/tpl/header.html new file mode 100644 index 000000000..8d58880e8 --- /dev/null +++ b/modules/point/tpl/header.html @@ -0,0 +1,12 @@ + +

{$lang->point} {$lang->cmd_management}

+ + + + diff --git a/modules/point/tpl/js/point_admin.js b/modules/point/tpl/js/point_admin.js new file mode 100644 index 000000000..62d4b2f6b --- /dev/null +++ b/modules/point/tpl/js/point_admin.js @@ -0,0 +1,6 @@ +/** + * @file modules/point/js/point_admin.js + * @author zero (zero@nzeo.com) + * @brief point 모듈의 관리자용 javascript + **/ + diff --git a/modules/point/tpl/module_config.html b/modules/point/tpl/module_config.html new file mode 100644 index 000000000..0741b5f70 --- /dev/null +++ b/modules/point/tpl/module_config.html @@ -0,0 +1,38 @@ + + + + + +
{$lang->about_module_point}
+ + + + + + + + + + + + + + + + + + + + + + + + +
 {$lang->point_insert_document}{$lang->point_insert_comment}{$lang->point_upload_file}{$lang->point_download_file}
{$lang->is_default} {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name}
{$val->browser_title} ({$val->mid}) {$config->point_name} {$config->point_name} {$config->point_name} {$config->point_name}
+ + +
+ +
+ +