From 1869df4ddc89e512d0d66d528a0e3d375c055fa4 Mon Sep 17 00:00:00 2001 From: zero Date: Mon, 16 Apr 2007 11:37:12 +0000 Subject: [PATCH] git-svn-id: http://xe-core.googlecode.com/svn/trunk@1173 201d5d3c-b55e-5fd7-737f-ddc643e51545 --- modules/menu/conf/module.xml | 6 +- modules/menu/lang/ko.lang.php | 2 +- modules/menu/menu.class.php | 1 + modules/menu/menu.controller.php | 157 +++++------ modules/menu/menu.model.php | 256 +++++------------- modules/menu/menu.view.php | 52 +++- modules/menu/queries/getMenuItems.xml | 4 +- modules/menu/queries/getMenuList.xml | 3 + modules/menu/queries/insertMenu.xml | 2 +- modules/menu/queries/insertMenuItem.xml | 3 +- modules/menu/schemas/menu_item.xml | 15 + modules/menu/tpl/filter/delete_menu_item.xml | 4 + modules/menu/tpl/filter/insert_menu_item.xml | 1 + modules/menu/tpl/filter/move_menu_item.xml | 4 +- modules/menu/tpl/js/menu_admin.js | 139 +++++----- .../{menu_info.html => menu_item_info.html} | 30 +- modules/menu/tpl/menu_management.html | 12 +- 17 files changed, 313 insertions(+), 378 deletions(-) create mode 100644 modules/menu/schemas/menu_item.xml rename modules/menu/tpl/{menu_info.html => menu_item_info.html} (70%) diff --git a/modules/menu/conf/module.xml b/modules/menu/conf/module.xml index bbe0a1ee5..c3dabf732 100644 --- a/modules/menu/conf/module.xml +++ b/modules/menu/conf/module.xml @@ -3,13 +3,17 @@ + + + + - + diff --git a/modules/menu/lang/ko.lang.php b/modules/menu/lang/ko.lang.php index 60c1d0b23..952a4a043 100644 --- a/modules/menu/lang/ko.lang.php +++ b/modules/menu/lang/ko.lang.php @@ -5,9 +5,9 @@ * @brief 메뉴(menu) 모듈의 기본 언어팩 **/ + $lang->cmd_menu_insert = '메뉴 생성'; $lang->cmd_menu_management = '메뉴 설정'; - $lang->layout_name = '레이아웃 이름'; $lang->menu_count = '메뉴의 수'; $lang->menu_management = '메뉴 관리'; $lang->depth = '단계'; diff --git a/modules/menu/menu.class.php b/modules/menu/menu.class.php index 866d09e8f..074c0a367 100644 --- a/modules/menu/menu.class.php +++ b/modules/menu/menu.class.php @@ -15,6 +15,7 @@ $oModuleController = &getController('module'); $oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminContent'); $oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminInsert'); + $oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminManagement'); // 레이아웃에서 사용할 디렉토리 생성 FileHandler::makeDir('./files/cache/menu'); diff --git a/modules/menu/menu.controller.php b/modules/menu/menu.controller.php index d2ce7f325..0c233398d 100644 --- a/modules/menu/menu.controller.php +++ b/modules/menu/menu.controller.php @@ -13,10 +13,25 @@ function init() { } + /** + * @brief 메뉴 추가 + **/ + function procMenuAdminInsert() { + // 입력할 변수 정리 + $args->title = Context::get('title'); + $args->menu_srl = getNextSequence(); + $args->listorder = $args->menu_srl * -1; + + $output = executeQuery('menu.insertMenu', $args); + if(!$output->toBool()) return $output; + + $this->add('menu_srl', $args->menu_srl); + $this->setMessage('success_registed'); + } /** * @brief 메뉴 삭제 - * 삭제시 메뉴 xml 캐시 파일도 삭제 + * menu_item과 xml 캐시 파일 모두 삭제 **/ function procMenuAdminDelete() { $menu_srl = Context::get('menu_srl'); @@ -30,11 +45,10 @@ } } - // DB에서 삭제 + $args->menu_srl = $menu_srl; // 메뉴 메뉴 삭제 - $args->menu_srl = $menu_srl; - $output = executeQuery("menu.deleteMenuMenus", $args); + $output = executeQuery("menu.deleteMenuItems", $args); if(!$output->toBool()) return $output; // 메뉴 삭제 @@ -45,9 +59,9 @@ } /** - * @brief 메뉴에 메뉴 추가 + * @brief 메뉴에 아이템 추가 **/ - function procMenuAdminInsertMenu() { + function procMenuAdminInsertItem() { // 입력할 변수 정리 $source_args = Context::getRequestVars(); unset($source_args->module); @@ -59,6 +73,7 @@ // 변수를 다시 정리 (form문의 column과 DB column이 달라서) $args->menu_srl = $source_args->menu_srl; + $args->menu_item_srl = $source_args->menu_item_srl; $args->parent_srl = $source_args->parent_srl; $args->menu_srl = $source_args->menu_srl; $args->menu_id = $source_args->menu_id; @@ -71,113 +86,104 @@ $args->active_btn = $source_args->menu_active_btn; $args->group_srls = $source_args->group_srls; - $menu = Context::get('menu'); - // 이미 존재하는지를 확인 $oMenuModel = &getModel('menu'); - $menu_info = $oMenuModel->getMenuMenuInfo($args->menu_srl); + $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); // 존재하게 되면 update를 해준다 - if($menu_info->menu_srl == $args->menu_srl) { - $output = executeQuery('menu.updateMenuMenu', $args); + if($item_info->menu_item_srl == $args->menu_item_srl) { + $output = executeQuery('menu.updateMenuItem', $args); if(!$output->toBool()) return $output; // 존재하지 않으면 insert를 해준다 } else { - $args->listorder = -1*$args->menu_srl; - $output = executeQuery('menu.insertMenuMenu', $args); + $args->listorder = -1*$args->menu_item_srl; + $output = executeQuery('menu.insertMenuItem', $args); if(!$output->toBool()) return $output; } // 해당 메뉴의 정보를 구함 - $menu_info = $oMenuModel->getMenuInfo($menu); - $menu_title = $menu_info->menu->{$args->menu_id}->name; + $menu_info = $oMenuModel->getMenu($args->menu_srl); + $menu_title = $menu_info->title; // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $this->makeXmlFile($args->menu_srl, $args->menu_id); + $xml_file = $this->makeXmlFile($args->menu_srl); $this->add('xml_file', $xml_file); $this->add('menu_srl', $args->menu_srl); - $this->add('menu_id', $args->menu_id); + $this->add('menu_item_srl', $args->menu_item_srl); $this->add('menu_title', $menu_title); - - // 현재 mid에 해당하는 모듈의 menu_srl 을 무조건 변경 - if(eregi("^mid=", $args->url)) { - $target_args->menu_srl = $args->menu_srl; - $target_args->mid = substr($args->url,4); - $output = executeQuery("module.updateModuleMenu", $target_args); - if(!$output->toBool()) return $output; - } } /** * @brief 메뉴 메뉴 삭제 **/ - function procMenuAdminDeleteMenu() { + function procMenuAdminDeleteItem() { // 변수 정리 - $args = Context::gets('menu_srl','menu','menu_srl','menu_id'); + $args = Context::gets('menu_srl','menu_item_srl'); $oMenuModel = &getModel('menu'); // 원정보를 가져옴 - $node_info = $oMenuModel->getMenuMenuInfo($args->menu_srl); - if($node_info->parent_srl) $parent_srl = $node_info->parent_srl; + $item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl); + if($item_info->parent_srl) $parent_srl = $item_info->parent_srl; // 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력 $output = executeQuery('menu.getChildMenuCount', $args); if(!$output->toBool()) return $output; - if($output->data->count>0) return new Object(-1, msg_cannot_delete_for_child); + if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child'); // DB에서 삭제 - $output = executeQuery("menu.deleteMenuMenu", $args); + $output = executeQuery("menu.deleteMenuItem", $args); if(!$output->toBool()) return $output; // 해당 메뉴의 정보를 구함 - $menu_info = $oMenuModel->getMenuInfo($args->menu); - $menu_title = $menu_info->menu->{$args->menu_id}->name; + $menu_info = $oMenuModel->getMenu($args->menu_srl); + $menu_title = $menu_info->title; // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $this->makeXmlFile($args->menu_srl, $args->menu_id); + $xml_file = $this->makeXmlFile($args->menu_srl); $this->add('xml_file', $xml_file); - $this->add('menu_id', $args->menu_id); $this->add('menu_title', $menu_title); - $this->add('menu_srl', $parent_srl); + $this->add('menu_item_srl', $parent_srl); + $this->setMessage('success_deleted'); } /** * @brief 메뉴의 메뉴를 이동 **/ - function procMenuAdminMoveMenu() { + function procMenuAdminMoveItem() { // 변수 설정 $menu_id = Context::get('menu_id'); - $source_node_srl = str_replace('menu_'.$menu_id.'_','',Context::get('source_node_srl')); - $target_node_srl = str_replace('menu_'.$menu_id.'_','',Context::get('target_node_srl')); + $source_item_srl = str_replace('menu_'.$menu_id.'_','',Context::get('source_item_srl')); + $target_item_srl = str_replace('menu_'.$menu_id.'_','',Context::get('target_item_srl')); - // target_node 의 값을 구함 + // target_item 의 값을 구함 $oMenuModel = &getModel('menu'); - $target_node = $oMenuModel->getMenuMenuInfo($target_node_srl); + $target_item = $oMenuModel->getMenuItemInfo($target_item_srl); - // source_node에 target_node_srl의 parent_srl, listorder 값을 입력 - $source_args->menu_srl = $source_node_srl; - $source_args->parent_srl = $target_node->parent_srl; - $source_args->listorder = $target_node->listorder; - $output = executeQuery('menu.updateMenuMenuParent', $source_args); + // source_item에 target_item_srl의 parent_srl, listorder 값을 입력 + $source_args->menu_item_srl = $source_item_srl; + $source_args->parent_srl = $target_item->parent_srl; + $source_args->listorder = $target_item->listorder; + $output = executeQuery('menu.updateMenuItemParent', $source_args); if(!$output->toBool()) return $output; - // target_node의 listorder값을 +1해 준다 - $target_args->menu_srl = $target_node_srl; - $target_args->parent_srl = $target_node->parent_srl; - $target_args->listorder = $target_node->listorder -1; - $output = executeQuery('menu.updateMenuMenuParent', $target_args); + // target_item의 listorder값을 +1해 준다 + $target_args->menu_item_srl = $target_item_srl; + $target_args->parent_srl = $target_item->parent_srl; + $target_args->listorder = $target_item->listorder -1; + $output = executeQuery('menu.updateMenuItemParent', $target_args); if(!$output->toBool()) return $output; // xml파일 재생성 - $xml_file = $this->makeXmlFile($target_node->menu_srl, $menu_id); + $xml_file = $this->makeXmlFile($target_item->menu_srl); // return 변수 설정 - $this->add('menu_id', $menu_id); - $this->add('source_node_srl', Context::get('source_node_srl')); + $this->add('menu_srl', $target_item->menu_srl); + $this->add('xml_file', $xml_file); + $this->add('source_item_srl', $source_item_srl); } /** @@ -188,20 +194,17 @@ **/ function procMenuAdminMakeXmlFile() { // 입력값을 체크 - $menu_id = Context::get('menu_id'); - $menu = Context::get('menu'); $menu_srl = Context::get('menu_srl'); // 해당 메뉴의 정보를 구함 $oMenuModel = &getModel('menu'); - $menu_info = $oMenuModel->getMenuInfo($menu); - $menu_title = $menu_info->menu->{$menu_id}->name; + $menu_info = $oMenuModel->getMenu($menu_srl); + $menu_title = $menu_info->title; // xml파일 재생성 - $xml_file = $this->makeXmlFile($menu_srl, $menu_id); + $xml_file = $this->makeXmlFile($menu_srl); // return 값 설정 - $this->add('menu_id',$menu_id); $this->add('menu_title',$menu_title); $this->add('xml_file',$xml_file); } @@ -209,19 +212,19 @@ /** * @brief 메뉴의 xml 파일을 만들고 위치를 return **/ - function makeXmlFile($menu_srl, $menu_id) { + function makeXmlFile($menu_srl) { // xml파일 생성시 필요한 정보가 없으면 그냥 return - if(!$menu_srl || !$menu_id) return; - - // DB에서 menu_srl에 해당하는 메뉴 목록을 listorder순으로 구해옴 + if(!$menu_srl) return; + + // DB에서 menu_srl에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴 $args->menu_srl = $menu_srl; - $args->menu_id = $menu_id; - $output = executeQuery("menu.getMenuMenuList", $args); + $args->sort_index = 'listorder'; + $output = executeQuery('menu.getMenuItems', $args); if(!$output->toBool()) return; // 캐시 파일의 이름을 지정 - $xml_file = sprintf("./files/cache/menu/%s_%s.xml.php", $menu_srl, $menu_id); - $php_file = sprintf("./files/cache/menu/%s_%s.php", $menu_srl, $menu_id); + $xml_file = sprintf("./files/cache/menu/%s.xml.php", $menu_srl); + $php_file = sprintf("./files/cache/menu/%s.php", $menu_srl); // 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성 $list = $output->data; @@ -238,10 +241,10 @@ $list_count = count($list); for($i=0;$i<$list_count;$i++) { $node = $list[$i]; - $menu_srl = $node->menu_srl; + $menu_item_srl = $node->menu_item_srl; $parent_srl = $node->parent_srl; - $tree[$parent_srl][$menu_srl] = $node; + $tree[$parent_srl][$menu_item_srl] = $node; } // xml 캐시 파일 생성 @@ -264,11 +267,11 @@ **/ function getXmlTree($source_node, $tree) { if(!$source_node) return; - foreach($source_node as $menu_srl => $node) { + foreach($source_node as $menu_item_srl => $node) { $child_buff = ""; // 자식 노드의 데이터 가져옴 - if($menu_srl&&$tree[$menu_srl]) $child_buff = $this->getXmlTree($tree[$menu_srl], $tree); + if($menu_item_srl&&$tree[$menu_item_srl]) $child_buff = $this->getXmlTree($tree[$menu_item_srl], $tree); // 변수 정리 $name = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->name); @@ -285,7 +288,7 @@ else $group_check_code = "true"; $attribute = sprintf( 'node_srl="%s" text=\'\' url=\'\' open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" ', - $menu_srl, + $menu_item_srl, $group_check_code, $name, $group_check_code, @@ -313,9 +316,9 @@ $output = array("buff"=>"", "url_list"=>array()); if(!$source_node) return $output; - foreach($source_node as $menu_srl => $node) { + foreach($source_node as $menu_item_srl => $node) { // 자식 노드가 있으면 자식 노드의 데이터를 먼저 얻어옴 - if($menu_srl&&$tree[$menu_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_srl], $tree); + if($menu_item_srl&&$tree[$menu_item_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_item_srl], $tree); else $child_output = array("buff"=>"", "url_list"=>array()); // 노드의 url에 ://가 있으면 바로 링크, 아니면 제로보드의 링크를 설정한다 ($node->href가 완성된 url) @@ -344,7 +347,7 @@ // 속성을 생성한다 ( url_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;) $attribute = sprintf( '"node_srl"=>"%s","text"=>(%s?"%s":""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(in_array(Context::get("zbxe_url"),array(%s))?1:0),"list"=>array(%s)', - $node->menu_srl, + $node->menu_item_srl, $group_check_code, $name, $group_check_code, @@ -360,7 +363,7 @@ ); // buff 데이터를 생성한다 - $output['buff'] .= sprintf('%s=>array(%s),', $node->menu_srl, $attribute); + $output['buff'] .= sprintf('%s=>array(%s),', $node->menu_item_srl, $attribute); } return $output; } diff --git a/modules/menu/menu.model.php b/modules/menu/menu.model.php index 3fd5ab43f..240423412 100644 --- a/modules/menu/menu.model.php +++ b/modules/menu/menu.model.php @@ -15,64 +15,22 @@ } /** - * @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return - * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return + * @brief 전체 메뉴 목록을 구해옴 **/ - function getMenuAdminTplInfo() { - // 해당 메뉴의 정보를 가져오기 위한 변수 설정 - $menu_id = Context::get('menu_id'); - $menu_srl = Context::get('menu_srl'); - $layuot = Context::get('menu'); - $parent_srl = Context::get('parent_srl'); + function getMenuList($obj) { - // 회원 그룹의 목록을 가져옴 - $oMemberModel = &getModel('member'); - $group_list = $oMemberModel->getGroups(); - Context::set('group_list', $group_list); + $args->sort_index = $obj->sort_index; + $args->page = $obj->page?$obj->page:1; + $args->list_count = $obj->list_count?$obj->list_count:20; + $args->page_count = $obj->page_count?$obj->page_count:10; - // parent_srl이 있고 menu_srl이 없으면 하부 메뉴 추가임 - if(!$menu_srl && $parent_srl) { - // 상위 메뉴의 정보를 가져옴 - $parent_info = $this->getMenuMenuInfo($parent_srl); + // document.getDocumentList 쿼리 실행 + $output = executeQuery('menu.getMenuList', $args); - // 추가하려는 메뉴의 기본 변수 설정 - $menu_info->menu_srl = getNextSequence(); - $menu_info->parent_srl = $parent_srl; - $menu_info->parent_menu_name = $parent_info->name; + // 결과가 없거나 오류 발생시 그냥 return + if(!$output->toBool()||!count($output->data)) return $output; - // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 - } else { - // menu_srl 이 있으면 해당 메뉴의 정보를 가져온다 - if($menu_srl) $menu_info = $this->getMenuMenuInfo($menu_srl); - - // 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_srl값만 구해줌 - if(!$menu_info->menu_srl) { - $menu_info->menu_srl = getNextSequence(); - } - } - - Context::set('menu_info', $menu_info); - - // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. - require_once("./classes/template/TemplateHandler.class.php"); - $oTemplate = new TemplateHandler(); - $tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_info'); - - // return 할 변수 설정 - $this->add('menu_id', $menu_id); - $this->add('tpl', $tpl); - } - - /** - * @brief DB 에 생성된 메뉴의 목록을 구함 - * 생성되었다는 것은 DB에 등록이 되었다는 것을 의미 - **/ - function getMenuItemList() { - $output = executeQuery('menu.getMenuList'); - if(!$output->data) return; - - if(is_array($output->data)) return $output->data; - return array($output->data); + return $output; } /** @@ -85,153 +43,71 @@ $output = executeQuery('menu.getMenu', $args); if(!$output->data) return; - // menu, extra_vars를 정리한 후 xml 파일 정보를 불러옴 (불러올때 결합) - $info = $output->data; - $menu_title = $info->title; - $menu = $info->menu; - $vars = unserialize($info->extra_vars); - - return $this->getMenuInfo($menu, $menu_srl, $menu_title, $vars); - } - - /** - * @brief 메뉴의 경로를 구함 - **/ - function getMenuPath($menu_name) { - $class_path = sprintf('./menus/%s/', $menu_name); - if(is_dir($class_path)) return $class_path; - - return ""; - } - - /** - * @brief 메뉴의 종류와 정보를 구함 - * 다운로드되어 있는 메뉴의 종류 (생성과 다른 의미) - **/ - function getDownloadedMenuList() { - // 다운받은 메뉴과 설치된 메뉴의 목록을 구함 - $searched_list = FileHandler::readDir('./menus'); - $searched_count = count($searched_list); - if(!$searched_count) return; - - // 찾아진 메뉴 목록을 loop돌면서 필요한 정보를 간추려 return - for($i=0;$i<$searched_count;$i++) { - // 메뉴의 이름 - $menu = $searched_list[$i]; - - // 해당 메뉴의 정보를 구함 - $menu_info = $this->getMenuInfo($menu); - - $list[] = $menu_info; - } - return $list; - } - - /** - * @brief 모듈의 conf/info.xml 을 읽어서 정보를 구함 - * 이것 역시 캐싱을 통해서 xml parsing 시간을 줄인다.. - **/ - function getMenuInfo($menu, $menu_srl = 0, $menu_title = "", $vars = null) { - // 요청된 모듈의 경로를 구한다. 없으면 return - $menu_path = $this->getMenuPath($menu); - if(!$menu_path) return; - - // 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음 - $xml_file = sprintf("%sconf/info.xml", $menu_path); - if(!file_exists($xml_file)) return; - - // cache 파일을 비교하여 문제 없으면 include하고 $menu_info 변수를 return - $cache_file = sprintf('./files/cache/menu/%s.%s.cache.php', $menu, Context::getLangType()); - if(file_exists($cache_file)&&filectime($cache_file)>filectime($xml_file)) { - include $cache_file; - return $menu_info; - } - - // cache 파일이 없으면 xml parsing하고 변수화 한 후에 캐시 파일에 쓰고 변수 바로 return - $oXmlParser = new XmlParser(); - $tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file); - $xml_obj = $tmp_xml_obj->menu; - if(!$xml_obj) return; - - $buff = ''; - - // 메뉴의 제목, 버전 - $buff .= sprintf('$menu_info->menu = "%s";', $menu); - $buff .= sprintf('$menu_info->path = "%s";', $menu_path); - $buff .= sprintf('$menu_info->title = "%s";', $xml_obj->title->body); - $buff .= sprintf('$menu_info->version = "%s";', $xml_obj->attrs->version); - $buff .= sprintf('$menu_info->menu_srl = $menu_srl;'); - $buff .= sprintf('$menu_info->menu_title = $menu_title;'); - - // 작성자 정보 - $buff .= sprintf('$menu_info->author->name = "%s";', $xml_obj->author->name->body); - $buff .= sprintf('$menu_info->author->email_address = "%s";', $xml_obj->author->attrs->email_address); - $buff .= sprintf('$menu_info->author->homepage = "%s";', $xml_obj->author->attrs->link); - $buff .= sprintf('$menu_info->author->date = "%s";', $xml_obj->author->attrs->date); - $buff .= sprintf('$menu_info->author->description = "%s";', $xml_obj->author->description->body); - - // 추가 변수 (템플릿에서 사용할 제작자 정의 변수) - if(!is_array($xml_obj->extra_vars->var)) $extra_vars[] = $xml_obj->extra_vars->var; - else $extra_vars = $xml_obj->extra_vars->var; - $extra_var_count = count($extra_vars); - $buff .= sprintf('$menu_info->extra_var_count = "%s";', $extra_var_count); - for($i=0;$i<$extra_var_count;$i++) { - unset($var); - unset($options); - $var = $extra_vars[$i]; - - $buff .= sprintf('$menu_info->extra_var->%s->name = "%s";', $var->attrs->id, $var->name->body); - $buff .= sprintf('$menu_info->extra_var->%s->type = "%s";', $var->attrs->id, $var->type->body); - $buff .= sprintf('$menu_info->extra_var->%s->value = $vars->%s;', $var->attrs->id, $var->attrs->id); - $buff .= sprintf('$menu_info->extra_var->%s->description = "%s";', $var->attrs->id, str_replace('"','\"',$var->description->body)); - - $options = $var->options; - if(!$options) continue; - - if(!is_array($options)) $options = array($options); - $options_count = count($options); - for($j=0;$j<$options_count;$j++) { - $buff .= sprintf('$menu_info->extra_var->%s->options["%s"] = "%s";', $var->attrs->id, $options[$j]->value->body, $options[$j]->name->body); - } - } - - // 메뉴 - if(!is_array($xml_obj->menus->menu)) $menus[] = $xml_obj->menus->menu; - else $menus = $xml_obj->menus->menu; - - $menu_count = count($menus); - $buff .= sprintf('$menu_info->menu_count = "%s";', $menu_count); - for($i=0;$i<$menu_count;$i++) { - $id = $menus[$i]->attrs->id; - if($menus[$i]->attrs->default == "true") $buff .= sprintf('$menu_info->default_menu = "%s";', $id); - $buff .= sprintf('$menu_info->menu->{%s}->id = "%s";',$id, $menus[$i]->attrs->id); - $buff .= sprintf('$menu_info->menu->{%s}->name = "%s";',$id, $menus[$i]->name->body); - $buff .= sprintf('$menu_info->menu->{%s}->maxdepth = "%s";',$id, $menus[$i]->maxdepth->body); - $buff .= sprintf('$menu_info->menu->{%s}->xml_file = "./files/cache/menu/".$menu_srl."_%s.xml.php";',$id, $id); - $buff .= sprintf('$menu_info->menu->{%s}->php_file = "./files/cache/menu/".$menu_srl."_%s.php";',$id, $id); - } - - $buff = ''; - FileHandler::writeFile($cache_file, $buff); - - if(file_exists($cache_file)) include $cache_file; + $menu_info = $output->data; + $menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_srl); + $menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_srl); return $menu_info; } /** - * @brief 특정 menu_srl의 정보를 return + * @brief 특정 menu_srl의 아이템 정보를 return * 이 정보중에 group_srls의 경우는 , 로 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴 **/ - function getMenuMenuInfo($menu_srl) { - // menu_srl 이 있으면 해당 메뉴의 정보를 가져온다 - $args->menu_srl = $menu_srl; - $output = executeQuery('menu.getMenuMenu', $args); - if(!$output->toBool()) return $output; - + function getMenuItemInfo($menu_item_srl) { + // menu_item_srl이 있으면 해당 메뉴의 정보를 가져온다 + $args->menu_item_srl = $menu_item_srl; + $output = executeQuery('menu.getMenuItem', $args); $node = $output->data; if($node->group_srls) $node->group_srls = explode(',',$node->group_srls); else $node->group_srls = array(); return $node; } + + /** + * @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return + * 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return + **/ + function getMenuAdminTplInfo() { + // 해당 메뉴의 정보를 가져오기 위한 변수 설정 + $menu_item_srl = Context::get('menu_item_srl'); + $parent_srl = Context::get('parent_srl'); + + // 회원 그룹의 목록을 가져옴 + $oMemberModel = &getModel('member'); + $group_list = $oMemberModel->getGroups(); + Context::set('group_list', $group_list); + + // parent_srl이 있고 menu_item_srl이 없으면 하부 메뉴 추가임 + if(!$menu_item_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $this->getMenuItemInfo($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 + $item_info->menu_item_srl = getNextSequence(); + $item_info->parent_srl = $parent_srl; + $item_info->parent_menu_name = $parent_info->name; + + // root에 메뉴 추가하거나 기존 메뉴의 수정일 경우 + } else { + // menu_item_srl 이 있으면 해당 메뉴의 정보를 가져온다 + if($menu_item_srl) $item_info = $this->getMenuItemInfo($menu_item_srl); + + // 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_item_srl값만 구해줌 + if(!$item_info->menu_item_srl) { + $item_info->menu_item_srl = getNextSequence(); + } + } + + Context::set('item_info', $item_info); + + // template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다. + require_once("./classes/template/TemplateHandler.class.php"); + $oTemplate = new TemplateHandler(); + $tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_item_info'); + + // return 할 변수 설정 + $this->add('tpl', $tpl); + } + } ?> diff --git a/modules/menu/menu.view.php b/modules/menu/menu.view.php index 999d76033..8d8758939 100644 --- a/modules/menu/menu.view.php +++ b/modules/menu/menu.view.php @@ -18,31 +18,61 @@ * @brief 메뉴 관리의 첫 페이지 **/ function dispMenuAdminContent() { + // 등록된 메뉴 목록을 구해옴 + $obj->page = Context::get('page'); + $obj->sort_index = 'listorder'; + $obj->list_count = 20; + $obj->page_count = 20; + $oMenuModel = &getModel('menu'); - $menu_list = $oMenuModel->getMenuList(); - Context::set('menu_list', $menu_list); + $output = $oMenuModel->getMenuList($obj); + + Context::set('total_count', $output->total_count); + Context::set('total_page', $output->total_page); + Context::set('page', $output->page); + Context::set('menu_list', $output->data); + Context::set('page_navigation', $output->page_navigation); $this->setTemplateFile('index'); } /** - * @brief 메뉴 등록/수정 페이지 + * @brief 메뉴 등록 페이지 **/ function dispMenuAdminInsert() { // 선택된 메뉴의 정보르 구해서 세팅 $menu_srl = Context::get('menu_srl'); - // 메뉴의 정보를 가져옴 - $oMenuModel = &getModel('menu'); - $menu_info = $oMenuModel->getMenu($menu_srl); - - // 등록된 메뉴이 없으면 오류 표시 - if(!$menu_info) return $this->dispMenuAdminContent(); - - Context::set('menu_info', $menu_info); + if($menu_srl) { + // 메뉴의 정보를 가져옴 + $oMenuModel = &getModel('menu'); + $menu_info = $oMenuModel->getMenu($menu_srl); + if($menu_info->menu_srl == $menu_srl) Context::set('menu_info', $menu_info); + } $this->setTemplateFile('menu_insert'); } + + /** + * @brief 메뉴 관리 페이지 + **/ + function dispMenuAdminManagement() { + // 선택된 메뉴의 정보르 구해서 세팅 + $menu_srl = Context::get('menu_srl'); + + if(!$menu_srl) return $this->dispMenuAdminContent(); + + // 메뉴의 정보를 가져옴 + $oMenuModel = &getModel('menu'); + $menu_info = $oMenuModel->getMenu($menu_srl); + if($menu_info->menu_srl == $menu_srl) Context::set('menu_info', $menu_info); + else return $this->dispMenuAdminContent(); + + Context::set('menu_info', $menu_info); + + $this->setTemplateFile('menu_management'); + } + /** * @brief 메뉴에서 선택할 수 있는 mid목록을 보여줌 diff --git a/modules/menu/queries/getMenuItems.xml b/modules/menu/queries/getMenuItems.xml index ed0f5ff3f..4c82034fb 100644 --- a/modules/menu/queries/getMenuItems.xml +++ b/modules/menu/queries/getMenuItems.xml @@ -1,6 +1,6 @@ - +
@@ -9,6 +9,6 @@ - + diff --git a/modules/menu/queries/getMenuList.xml b/modules/menu/queries/getMenuList.xml index b705e0eb2..cf57379e2 100644 --- a/modules/menu/queries/getMenuList.xml +++ b/modules/menu/queries/getMenuList.xml @@ -7,5 +7,8 @@ + + + diff --git a/modules/menu/queries/insertMenu.xml b/modules/menu/queries/insertMenu.xml index c5b22837e..6f09c6708 100644 --- a/modules/menu/queries/insertMenu.xml +++ b/modules/menu/queries/insertMenu.xml @@ -4,7 +4,7 @@ - + diff --git a/modules/menu/queries/insertMenuItem.xml b/modules/menu/queries/insertMenuItem.xml index 97084d065..9dfbe3808 100644 --- a/modules/menu/queries/insertMenuItem.xml +++ b/modules/menu/queries/insertMenuItem.xml @@ -3,8 +3,9 @@
- + + diff --git a/modules/menu/schemas/menu_item.xml b/modules/menu/schemas/menu_item.xml new file mode 100644 index 000000000..217045dac --- /dev/null +++ b/modules/menu/schemas/menu_item.xml @@ -0,0 +1,15 @@ +
+ + + + + + + + + + + + + +
diff --git a/modules/menu/tpl/filter/delete_menu_item.xml b/modules/menu/tpl/filter/delete_menu_item.xml index b0dc77fbe..5faf59ae0 100644 --- a/modules/menu/tpl/filter/delete_menu_item.xml +++ b/modules/menu/tpl/filter/delete_menu_item.xml @@ -5,5 +5,9 @@ + + + + diff --git a/modules/menu/tpl/filter/insert_menu_item.xml b/modules/menu/tpl/filter/insert_menu_item.xml index 5ecc1e644..0971a6922 100644 --- a/modules/menu/tpl/filter/insert_menu_item.xml +++ b/modules/menu/tpl/filter/insert_menu_item.xml @@ -8,5 +8,6 @@ + diff --git a/modules/menu/tpl/filter/move_menu_item.xml b/modules/menu/tpl/filter/move_menu_item.xml index 679cad4c9..40a5bfbc5 100644 --- a/modules/menu/tpl/filter/move_menu_item.xml +++ b/modules/menu/tpl/filter/move_menu_item.xml @@ -4,7 +4,7 @@ - - + + diff --git a/modules/menu/tpl/js/menu_admin.js b/modules/menu/tpl/js/menu_admin.js index 3159475ee..d0f6e161e 100644 --- a/modules/menu/tpl/js/menu_admin.js +++ b/modules/menu/tpl/js/menu_admin.js @@ -21,29 +21,31 @@ function completeDeleteMenu(ret_obj) { } /* 빈 메뉴 아이템 추가 */ -function doInsertLayoutMenuItem(parent_srl) { +function doInsertMenuItem(parent_srl) { if(typeof(parent_srl)=='undefined') parent_srl = 0; var params = {node_srl:0, parent_srl:parent_srl} - doGetMenuItemInfo(params); + doGetMenuItemInfo('menu', params); deSelectNode(); } /* 메뉴 클릭시 적용할 함수 */ -function doGetMenuItemInfo(obj) { - // layout, menu_id, node_srl을 추출 +function doGetMenuItemInfo(menu_id, obj) { + // menu, menu_id, node_srl을 추출 var fo_obj = xGetElementById("fo_menu"); var node_srl = 0; var parent_srl = 0; - if(typeof(obj.getAttribute)!="undefined") { - node_srl = obj.getAttribute("node_srl"); - } else { - node_srl = obj.node_srl; - parent_srl = obj.parent_srl; + if(typeof(obj)!="undefined") { + if(typeof(obj.getAttribute)!="undefined") { + node_srl = obj.getAttribute("node_srl"); + } else { + node_srl = obj.node_srl; + parent_srl = obj.parent_srl; + } } var params = new Array(); - params["menu_srl"] = node_srl; + params["menu_item_srl"] = node_srl; params["parent_srl"] = parent_srl; // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. @@ -59,87 +61,80 @@ function completeGetMenuItemTplInfo(ret_obj, response_tags) { fo_obj.menu_name.focus(); } - -/* 메뉴를 드래그하여 이동한 후 실행할 함수 , 이동하는 node_srl과 대상 node_srl을 받음 */ -function doMoveTree(menu_id, source_node_srl, target_node_srl) { - var fo_obj = xGetElementById("fo_move_menu"); - fo_obj.menu_id.value = menu_id; - fo_obj.source_node_srl.value = source_node_srl; - fo_obj.target_node_srl.value = target_node_srl; - - // 이동 취소를 선택하였을 경우 다시 그림;; - if(!procFilter(fo_obj, move_layout_menu)) { - var params = new Array(); - params["menu_id"] = menu_id; - params["source_node_srl"] = source_node_srl; - completeMoveLayoutMenu(params); - } -} - -function completeMoveLayoutMenu(ret_obj) { - var menu_id = ret_obj['menu_id']; - var source_node_srl = ret_obj['source_node_srl']; - - var fo_menu = xGetElementById("fo_"+menu_id); - if(!fo_menu) return; - - var params = new Array(); - params["menu_id"] = menu_id; - params["layout"] = fo_menu.layout.value; - params["layout_srl"] = fo_menu.layout_srl.value; - var xml_file = fo_menu.xml_file.value; - var menu_title = fo_menu.menu_title.value; - var tmp = source_node_srl.split('_'); - var menu_srl = tmp[tmp.length-1]; - loadTreeMenu(xml_file, menu_id, "menu_zone_"+menu_id, menu_title, doGetMenuItemInfo, menu_srl, doMoveTree); -} - - - - - - - - - - - /* 메뉴 아이템 입력후 */ function completeInsertMenuItem(ret_obj) { var menu_id = ret_obj['menu_id']; var xml_file = ret_obj['xml_file']; var menu_title = ret_obj['menu_title']; var menu_srl = ret_obj['menu_srl']; + var menu_item_srl = ret_obj['menu_item_srl']; if(!xml_file) return; - loadTreeMenu(xml_file, menu_id, "menu_zone_"+menu_id, menu_title, doGetMenuItemInfo, menu_srl, doMoveTree); - if(!menu_srl) xInnerHtml("menu_zone_info_"+menu_id, ""); + loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, doGetMenuItemInfo, menu_item_srl, doMoveTree); + + if(!menu_srl) xInnerHtml("menu_zone_info", ""); } -/* 메뉴 삭제 */ -function doDeleteLayoutMenu(menu_srl, menu_id) { - var fo_obj = xGetElementById("fo_"+menu_id); - if(!fo_obj) return; - procFilter(fo_obj, delete_layout_menu); +/* 메뉴를 드래그하여 이동한 후 실행할 함수 , 이동하는 item_srl과 대상 item_srl을 받음 */ +function doMoveTree(menu_id, source_item_srl, target_item_srl) { + var fo_obj = xGetElementById("fo_move_menu"); + fo_obj.menu_id.value = menu_id; + fo_obj.source_item_srl.value = source_item_srl; + fo_obj.target_item_srl.value = target_item_srl; + + // 이동 취소를 선택하였을 경우 다시 그림;; + if(!procFilter(fo_obj, move_menu_item)) { + var params = new Array(); + params["xml_file"] = xGetElementById('fo_menu').xml_file.value; + params["source_item_srl"] = source_item_srl; + completeMoveMenuItem(params); + } +} + +function completeMoveMenuItem(ret_obj) { + var source_item_srl = ret_obj['source_item_srl']; + var xml_file = ret_obj['xml_file']; + + var fo_menu = xGetElementById("fo_menu"); + if(!fo_menu) return; + + var title = fo_menu.title.value; + loadTreeMenu(xml_file, 'menu', "menu_zone_menu", title, doGetMenuItemInfo, source_item_srl, doMoveTree); } /* 메뉴 목록 갱신 */ -function doReloadTreeMenu(menu_id) { - var fo_obj = xGetElementById("fo_"+menu_id); - if(!fo_obj) return; - +function doReloadTreeMenu(menu_srl) { var params = new Array(); - params["menu_id"] = menu_id; - params["layout"] = fo_obj.layout.value; - params["layout_srl"] = fo_obj.layout_srl.value; + params["menu_srl"] = menu_srl; // 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다. - var response_tags = new Array('error','message','menu_id', 'xml_file', 'menu_title'); - exec_xml('layout', 'procLayoutAdminMakeXmlFile', params, completeInsertLayoutMenu, response_tags, params); + var response_tags = new Array('error','message', 'xml_file', 'menu_title'); + exec_xml('menu', 'procMenuAdminMakeXmlFile', params, completeInsertMenuItem, response_tags, params); } +/* 메뉴 삭제 */ +function doDeleteMenuItem(menu_item_srl) { + var fo_obj = xGetElementById("fo_menu"); + if(!fo_obj) return; + + procFilter(fo_obj, delete_menu_item); +} + +/* 메뉴 아이템 삭제 후 */ +function completeDeleteMenuItem(ret_obj) { + var menu_title = ret_obj['menu_title']; + var menu_srl = ret_obj['menu_srl']; + var menu_item_srl = ret_obj['menu_item_srl']; + var xml_file = ret_obj['xml_file']; + alert(ret_obj['message']); + + loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, doGetMenuItemInfo, menu_item_srl, doMoveTree); + xInnerHtml("menu_zone_info", ""); +} + + /* 레이아웃의 메뉴에 mid 추가 */ function doInsertMid(mid, menu_id) { if(!opener) { @@ -147,7 +142,7 @@ function doInsertMid(mid, menu_id) { return; } - var fo_obj = opener.xGetElementById("fo_"+menu_id); + var fo_obj = opener.xGetElementById("fo_menu"); if(!fo_obj) { window.close(); return; diff --git a/modules/menu/tpl/menu_info.html b/modules/menu/tpl/menu_item_info.html similarity index 70% rename from modules/menu/tpl/menu_info.html rename to modules/menu/tpl/menu_item_info.html index a87ffeca2..243429cb5 100644 --- a/modules/menu/tpl/menu_info.html +++ b/modules/menu/tpl/menu_item_info.html @@ -1,39 +1,39 @@ - - + + - + - + - + - + - + - + @@ -44,21 +44,21 @@ - + - + - + @@ -68,10 +68,10 @@
{$lang->parent_menu_name}{$menu_info->parent_menu_name}{$item_info->parent_menu_name}
{$lang->menu_name}
{$lang->about_menu_name}
{$lang->menu_url}
{$lang->about_menu_url}
{$lang->menu_open_window}open_window=="Y")-->checked="true" />open_window=="Y")-->checked="true" />
{$lang->about_menu_open_window}
{$lang->menu_expand}expand=="Y")-->checked="true" />expand=="Y")-->checked="true" />
{$lang->about_menu_expand}
{$lang->menu_normal_btn}
{$lang->menu_hover_btn}
{$lang->menu_active_btn}
{$lang->menu_group_srls} - group_srls))-->checked="true"/> + group_srls)&&in_array($key, $item_info->group_srls))-->checked="true"/>
- + - - + + diff --git a/modules/menu/tpl/menu_management.html b/modules/menu/tpl/menu_management.html index c40019f8b..ba2af0a06 100644 --- a/modules/menu/tpl/menu_management.html +++ b/modules/menu/tpl/menu_management.html @@ -5,8 +5,9 @@
- - + + +
@@ -22,7 +23,8 @@
-
+ + @@ -37,10 +39,10 @@
- + - +