diff --git a/modules/layout/lang/ko.lang.php b/modules/layout/lang/ko.lang.php index 5f076ad2e..eacfaf9b2 100644 --- a/modules/layout/lang/ko.lang.php +++ b/modules/layout/lang/ko.lang.php @@ -11,6 +11,7 @@ $lang->menu_count = '메뉴의 수'; $lang->menu_management = '메뉴 관리'; $lang->depth = '단계'; + $lang->parent_menu_name = '상위 메뉴명'; $lang->menu_name = '메뉴명'; $lang->menu_srl = '메뉴의 고유 번호'; $lang->menu_id = '메뉴의 이름'; diff --git a/modules/layout/layout.controller.php b/modules/layout/layout.controller.php index affe1dad8..509d06b7d 100644 --- a/modules/layout/layout.controller.php +++ b/modules/layout/layout.controller.php @@ -84,9 +84,9 @@ } // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $this->makeXmlFile($args->layout_srl); + $xml_file = $this->makeXmlFile($args->layout_srl, $args->menu_id); - $this->add('xml_file', $xml_file[$args->menu_id]); + $this->add('xml_file', $xml_file); $this->add('menu_srl', $args->menu_srl); $this->add('menu_id', $args->menu_id); $this->add('menu_title', $menu_title); @@ -117,15 +117,15 @@ } // XML 파일을 갱신하고 위치을 넘겨 받음 - $xml_file = $this->makeXmlFile($args->layout_srl); + $xml_file = $this->makeXmlFile($args->layout_srl, $args->menu_id); - $this->add('xml_file', $xml_file[$args->menu_id]); + $this->add('xml_file', $xml_file); $this->add('menu_id', $args->menu_id); $this->add('menu_title', $menu_title); } /** - * @brief xml 파일을 갱싱 + * @brief xml 파일을 갱신 **/ function procMakeXmlFile() { // 입력값을 체크 @@ -146,47 +146,68 @@ } // xml파일 재생성 - $xml_file = $this->makeXmlFile($layout_srl); + $xml_file = $this->makeXmlFile($layout_srl, $menu_id); // return 값 설정 $this->add('menu_id',$menu_id); $this->add('menu_title',$menu_title); - $this->add('xml_file',$xml_file[$menu_id]); + $this->add('xml_file',$xml_file); } /** * @brief 메뉴의 xml 파일을 만들고 위치를 return **/ - function makeXmlFile($layout_srl) { + function makeXmlFile($layout_srl, $menu_id) { + if(!$layout_srl || !$menu_id) return; + + // DB에서 layout_srl에 해당하는 메뉴 목록을 listorder순으로 구해옴 $oDB = &DB::getInstance(); $args->layout_srl = $layout_srl; + $args->menu_id = $menu_id; $output = $oDB->executeQuery("layout.getLayoutMenuList", $args); if(!$output->toBool()) return; + // xml 파일의 이름을 지정 + $xml_file = sprintf("./files/cache/layout/%s_%s.xml", $layout_srl, $menu_id); + + // 구해온 데이터가 없다면 걍 return $list = $output->data; + if(!$list) { + $xml_buff = ""; + FileHandler::writeFile($xml_file, $xml_buff); + return $xml_file; + } + if(!is_array($list)) $list = array($list); + + // 루프를 돌면서 tree 구성 $list_count = count($list); - for($i=0;$i<$list_count;$i++){ + for($i=0;$i<$list_count;$i++) { $node = $list[$i]; - $menu_id = $node->menu_id; - $menu_list[$menu_id][] = $node; - $menu_id_list[] = $menu_id; - } - if(!count($menu_id_list)) return; + $menu_srl = $node->menu_srl; + $parent_srl = $node->parent_srl; - foreach($menu_id_list as $menu_id) { - unset($node_list); - $node_list = $menu_list[$menu_id]; - $buff = ""; - foreach($node_list as $node) { - $buff .= sprintf('', $node->menu_srl, $node->name); - } - if($buff) $buff = "".$buff.""; - else $buff = ""; - - $xml_file[$menu_id] = sprintf("./files/cache/layout/%s_%s.xml", $layout_srl, $menu_id); - FileHandler::writeFile($xml_file[$menu_id], $buff); + $tree[$parent_srl][$menu_srl] = $node; } + + $xml_buff = "".$this->getXmlTree($tree[0], $tree).""; + FileHandler::writeFile($xml_file, $xml_buff); return $xml_file; } + + /** + * @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성 + **/ + function getXmlTree($source_node, $tree) { + if(!$source_node) return; + foreach($source_node as $menu_srl => $node) { + $child_buff = ""; + + if($menu_srl&&$tree[$menu_srl]) $child_buff = $this->getXmlTree($tree[$menu_srl], $tree); + + if($child_buff) $buff .= sprintf('%s', $node->menu_srl, $node->name, $child_buff); + else $buff .= sprintf('', $node->menu_srl, $node->name); + } + return $buff; + } } ?> diff --git a/modules/layout/layout.model.php b/modules/layout/layout.model.php index 671f4a9c5..b71954f5a 100644 --- a/modules/layout/layout.model.php +++ b/modules/layout/layout.model.php @@ -177,9 +177,14 @@ // parent_srl이 있고 menu_srl이 없으면 하부 메뉴 추가임 if(!$menu_srl && $parent_srl) { + // 상위 메뉴의 정보를 가져옴 + $parent_info = $this->getLayoutMenuInfo($parent_srl); + + // 추가하려는 메뉴의 기본 변수 설정 $oDB = &DB::getInstance(); $menu_info->menu_srl = $oDB->getNextSequence(); $menu_info->parent_srl = $parent_srl; + $menu_info->parent_menu_name = $parent_info->name; } else { // menu_srl 이 있으면 해당 메뉴의 정보를 가져온다 if($menu_srl) $menu_info = $this->getLayoutMenuInfo($menu_srl); diff --git a/modules/layout/queries/getLayoutMenuList.xml b/modules/layout/queries/getLayoutMenuList.xml index 8f3afeeac..87b4fde4c 100644 --- a/modules/layout/queries/getLayoutMenuList.xml +++ b/modules/layout/queries/getLayoutMenuList.xml @@ -7,6 +7,7 @@ + diff --git a/modules/layout/tpl.admin/layout_menu_info.html b/modules/layout/tpl.admin/layout_menu_info.html index e8a995025..fada8ca15 100644 --- a/modules/layout/tpl.admin/layout_menu_info.html +++ b/modules/layout/tpl.admin/layout_menu_info.html @@ -4,6 +4,12 @@ + + + + + +
{$lang->parent_menu_name}{$menu_info->parent_menu_name}
{$lang->menu_name}