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=\'=(%s?"%s":"")?>\' url=\'=(%s?"%s":"")?>\' 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 @@
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 @@
-
-
+
+
-