diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index b8bfd443f..408f906eb 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -87,6 +87,15 @@ } } + /** + * @brief DB및 기타 자원들의 close + **/ + function close() { + // DB close + $oDB = &DB::getInstance(); + if($oDB) $oDB->close(); + } + /** * @brief DB 정보를 설정하고 DB Type과 DB 정보를 return **/ diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index 7ba7c924d..5a46b537a 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -128,7 +128,8 @@ if($GLOBALS['__db_elapsed_time__']) $buff .= sprintf("\tDB queries elapsed time\t\t: %0.5f sec\n", $GLOBALS['__db_elapsed_time__']); $buff .= sprintf("\tclass file load elapsed time \t: %0.5f sec\n", __RequireClassEndTime__-__RequireClassStartTime__); $buff .= sprintf("\tTemplate compile elapsed time\t: %0.5f sec\n", $GLOBALS['__template_elapsed__']); - $buff .= sprintf("\tPHP elapsed time \t\t: %0.5f sec\n", $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__db_elapsed_time__']-(__RequireClassEndTime__-__RequireClassStartTime__)); + $buff .= sprintf("\tXmlParse compile elapsed time\t: %0.5f sec\n", $GLOBALS['__xmlparse_elapsed__']); + $buff .= sprintf("\tPHP elapsed time \t\t: %0.5f sec\n", $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-(__RequireClassEndTime__-__RequireClassStartTime__)); $buff .= sprintf("\tTotal elapsed time \t\t: %0.5f sec", $end-__StartTime__); debugPrint($buff, false); diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index f681e3082..835f1f3fe 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -57,14 +57,14 @@ } // 해당 모듈의 conf/action.xml 을 분석하여 action 정보를 얻어옴 - $action_info = $oModuleModel->getActionInfo($module); + $xml_info = $oModuleModel->getModuleXmlInfo($module); - // 현재 요청된 act가 있으면 $action_info에서 type을 찾음, 없다면 기본 action을 이용 - if(!$act || !$action_info->{$act}) $act = $action_info->default_action; + // 현재 요청된 act가 있으면 $xml_info에서 type을 찾음, 없다면 기본 action을 이용 + if(!$act || !$xml_info->{$act}) $act = $xml_info->default_action; // type, grant 값 구함 - $type = $action_info->{$act}->type; - $grant = $action_info->{$act}->grant; + $type = $xml_info->action->{$act}->type; + $grant = $xml_info->action->{$act}->grant; // act값을 Context에 세팅 Context::set('act', $act, true); @@ -73,7 +73,7 @@ $oModule = &$this->getModuleInstance($module, $type); // 모듈 정보 세팅 - $oModule->setModuleInfo($module_info); + $oModule->setModuleInfo($module_info, $xml_info); if(!is_object($oModule)) return; diff --git a/classes/module/ModuleObject.class.php b/classes/module/ModuleObject.class.php index 308df62e2..6040036bf 100644 --- a/classes/module/ModuleObject.class.php +++ b/classes/module/ModuleObject.class.php @@ -42,7 +42,8 @@ /** * @brief 모듈의 정보 세팅 **/ - function setModuleInfo($module_info) { + function setModuleInfo($module_info, $xml_info) { + // 기본 변수 설정 $this->mid = $module_info->mid; $this->module = $module_info->module; @@ -63,29 +64,43 @@ } // 권한 설정 - if($this->grant_list) { - foreach($this->grant_list as $grant_name) { + if($xml_info->grant) { + foreach($xml_info->grant as $grant_name => $grant_item) { + $title = $grant_item->title; + $default = $grant_item->default; + $grant->{$grant_name} = false; - if($grant->is_admin || !$this->module_info->grant[$grant_name]) { + if($grant->is_admin) { $grant->{$grant_name} = true; continue; } if(count($user_group)) { foreach($user_group as $group_srl) { - if(in_array($group_srl, $this->module_info->grant[$grant_name])) { + if(in_array($group_srl, $this->module_info->grants[$grant_name])) { $grant->{$grant_name} = true; break; } } + } else { + switch($default) { + case 'guest' : + $grant->{$grant_name} = true; + break; + case 'member' : + if($is_logged) $grant->{$grant_name} = true; + break; + case 'root' : + if($grant->is_admin) $grant->{$grant_name} = true; + break; + } } } } // 권한변수 설정 $this->grant = $grant; - Context::set('grant',$this->grant); // 모듈의 init method 실행 $this->init(); diff --git a/classes/xml/XmlParser.class.php b/classes/xml/XmlParser.class.php index bba6c7e14..bf74f1e5a 100644 --- a/classes/xml/XmlParser.class.php +++ b/classes/xml/XmlParser.class.php @@ -35,6 +35,9 @@ * @brief xml 파싱 **/ function parse($input = '') { + // 디버그를 위한 컴파일 시작 시간 저장 + if(__DEBUG__) $start = getMicroTime(); + $this->lang = Context::getLangType(); $this->input = $input?$input:$GLOBALS['HTTP_RAW_POST_DATA']; @@ -68,7 +71,16 @@ xml_parser_free($this->oParser); if(!count($this->output)) return; - return array_shift($this->output); + + $output = array_shift($this->output); + + // 디버그를 위한 컴파일 시작 시간 저장 + if(__DEBUG__) { + $parsing_elapsed = getMicroTime() - $start; + $GLOBALS['__xmlparse_elapsed__'] += $parsing_elapsed; + } + + return $output; } /** diff --git a/index.php b/index.php index 9c7d75319..50775e6c9 100644 --- a/index.php +++ b/index.php @@ -51,4 +51,9 @@ **/ $oDisplayHandler = new DisplayHandler(); $oDisplayHandler->printContent($oModule); + + /** + * @brief Context::close()를 통해서 DB및 기타 사용된 자원들의 처리 + **/ + $oContext->close(); ?> diff --git a/modules/admin/conf/action.xml b/modules/admin/conf/module.xml similarity index 53% rename from modules/admin/conf/action.xml rename to modules/admin/conf/module.xml index f521e2044..33168e9eb 100644 --- a/modules/admin/conf/action.xml +++ b/modules/admin/conf/module.xml @@ -1,4 +1,6 @@ - + + + diff --git a/modules/board/board.class.php b/modules/board/board.class.php index 603175007..02fc37206 100644 --- a/modules/board/board.class.php +++ b/modules/board/board.class.php @@ -14,14 +14,6 @@ var $page_count = 10; ///< 페이지의 수 var $category_list = NULL; ///< 카테고리 목록 - var $grant_list = array( - 'list', - 'view', - 'write_document', - 'write_comment', - 'fileupload', - ); ///< 권한의 종류를 미리 설정 - var $editor = 'default'; ///< 에디터 종류 } diff --git a/modules/board/conf/action.xml b/modules/board/conf/action.xml deleted file mode 100644 index 8f4737571..000000000 --- a/modules/board/conf/action.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/board/conf/module.xml b/modules/board/conf/module.xml new file mode 100644 index 000000000..c452a8da2 --- /dev/null +++ b/modules/board/conf/module.xml @@ -0,0 +1,49 @@ + + + + + 목록 + list + + + 열람 + view + + + 글 작성 + write document + + + 댓글 작성 + write comment + + + 파일 첨부 + file upload + + + 관리 + management + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/install/conf/action.xml b/modules/install/conf/action.xml deleted file mode 100644 index 3b092c488..000000000 --- a/modules/install/conf/action.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/modules/install/conf/module.xml b/modules/install/conf/module.xml new file mode 100644 index 000000000..ce0cd7e5a --- /dev/null +++ b/modules/install/conf/module.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/member/conf/action.xml b/modules/member/conf/action.xml deleted file mode 100644 index d11593cee..000000000 --- a/modules/member/conf/action.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml new file mode 100644 index 000000000..0e70be153 --- /dev/null +++ b/modules/member/conf/module.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/module/conf/action.xml b/modules/module/conf/module.xml similarity index 52% rename from modules/module/conf/action.xml rename to modules/module/conf/module.xml index e015a3b2d..68f3ea310 100644 --- a/modules/module/conf/action.xml +++ b/modules/module/conf/module.xml @@ -1,4 +1,6 @@ - + + + diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 45c457584..ee2bb44a2 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -14,30 +14,49 @@ } /** - * @brief module의 conf/action.xml 을 통해 act값에 해당하는 action type을 return + * @brief module의 conf/module.xml 을 통해 grant(권한) 및 action 데이터를 return **/ - function getActionInfo($module) { + function getModuleXmlInfo($module) { $class_path = ModuleHandler::getModulePath($module); if(!$class_path) return; - $action_xml_file = sprintf("%sconf/action.xml", $class_path); + $action_xml_file = sprintf("%sconf/module.xml", $class_path); if(!file_exists($action_xml_file)) return; $xml_obj = XmlParser::loadXmlFile($action_xml_file); if(!count($xml_obj->module)) return; - $output->default_action = $xml_obj->module->attrs->default_action; - $output->manage_action = $xml_obj->module->attrs->manage_action; + $output->default_action = $xml_obj->module->attrs->default_action; ///< 별도의 action이 지정되지 않으면 호출될 action + $output->manage_action = $xml_obj->module->attrs->manage_action; ///< 관리자용으로 사용될 기본 action - if(is_array($xml_obj->module->action)) $action_list = $xml_obj->module->action; - else $action_list[] = $xml_obj->module->action; + $grants = $xml_obj->module->grants->grant; ///< 권한 정보 (없는 경우도 있음) + $actions = $xml_obj->module->actions->action; ///< action list (필수) + + // 권한 정보의 정리 + if(is_array($grants)) $grant_list = $grants; + else $grant_list[] = $grants; + + foreach($grant_list as $grant) { + $name = $grant->attrs->name; + $default = $grant->attrs->default; + $title = $grant->title->body; + if(!$default) $default = 'guest'; + + $output->grant->{$name}->title = $title; + $output->grant->{$name}->default = $default; + } + + // actions 정리 + if(is_array($actions)) $action_list = $actions; + else $action_list[] = $actions; foreach($action_list as $action) { $name = $action->attrs->name; $type = $action->attrs->type; $grant = $action->attrs->grant; - $output->{$name}->type = $type; - $output->{$name}->grant = $grant; + if(!$grant) $grant = 'guest'; + $output->action->{$name}->type = $type; + $output->action->{$name}->grant = $grant; } return $output;