git-svn-id: http://xe-core.googlecode.com/svn/trunk@320 201d5d3c-b55e-5fd7-737f-ddc643e51545

This commit is contained in:
zero 2007-03-08 02:41:48 +00:00
parent b6268cf13f
commit b277fe9d7f
10 changed files with 172 additions and 161 deletions

View file

@ -2,7 +2,6 @@
<module>
<actions>
<action name="dispContent" type="view" admin_index="true" standalone="true" />
<action name="dispLayoutMenuInfo" type="view" standalone="true" />
<action name="dispInsertLayout" type="view" standalone="true" />
<action name="dispLayoutInfo" type="view" standalone="true" />
<action name="dispList" type="controller" standalone="true" />

View file

@ -15,6 +15,7 @@
/**
* @brief 레이아웃 신규 생성
* 레이아웃의 신규 생성은 제목만 받아서 layouts테이블에 입력함
**/
function procInsertLayout() {
$oDB = &DB::getInstance();
@ -30,7 +31,38 @@
}
/**
* @brief 레이아웃 메뉴 추가
* @brief 레이아웃 삭제
* 삭제시 메뉴 xml 캐시 파일도 삭제
**/
function procDeleteLayout() {
$layout_srl = Context::get('layout_srl');
// 캐시 파일 삭제
$cache_list = FileHandler::readDir("./files/cache/layout","",false,true);
if(count($cache_list)) {
foreach($cache_list as $cache_file) {
$pos = strpos($cache_file, $layout_srl.'_');
if($pos>0) unlink($cache_file);
}
}
// DB에서 삭제
$oDB = &DB::getInstance();
// 레이아웃 메뉴 삭제
$args->layout_srl = $layout_srl;
$output = $oDB->executeQuery("layout.deleteLayoutMenus", $args);
if(!$output->toBool()) return $output;
// 레이아웃 삭제
$output = $oDB->executeQuery("layout.deleteLayout", $args);
if(!$output->toBool()) return $output;
$this->setMessage('success_deleted');
}
/**
* @brief 레이아웃에 메뉴 추가
**/
function procInsertLayoutMenu() {
// 입력할 변수 정리
@ -74,14 +106,7 @@
// 해당 메뉴의 정보를 구함
$layout_info = $oLayoutModel->getLayoutInfoXml($layout);
$navigations = $layout_info->navigations;
if(count($navigations)) {
foreach($navigations as $key => $val) {
if($args->menu_id == $val->id) {
$menu_title = $val->name;
}
}
}
$menu_title = $layout_info->menu->{$args->menu_id}->name;
// XML 파일을 갱신하고 위치을 넘겨 받음
$xml_file = $this->makeXmlFile($args->layout_srl, $args->menu_id);
@ -92,35 +117,6 @@
$this->add('menu_title', $menu_title);
}
/**
* @brief 레이아웃 삭제
**/
function procDeleteLayout() {
$layout_srl = Context::get('layout_srl');
// 캐시 파일 삭제
$cache_list = FileHandler::readDir("./files/cache/layout","",false,true);
if(count($cache_list)) {
foreach($cache_list as $cache_file) {
$pos = strpos($cache_file, $layout_srl.'_');
if($pos>0) unlink($cache_file);
}
}
// DB에서 삭제
$oDB = &DB::getInstance();
// 레이아웃 메뉴 삭제
$args->layout_srl = $layout_srl;
$output = $oDB->executeQuery("layout.deleteLayoutMenus", $args);
if(!$output->toBool()) return $output;
// 레이아웃 삭제
$output = $oDB->executeQuery("layout.deleteLayout", $args);
if(!$output->toBool()) return $output;
$this->setMessage('success_deleted');
}
/**
* @brief 레이아웃 메뉴 삭제
@ -137,10 +133,9 @@
$oDB = &DB::getInstance();
// 자식 노드가 있는지 체크
// 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력
$output = $oDB->executeQuery('layout.getChildMenuCount', $args);
if(!$output->toBool()) return $output;
if($output->data->count>0) return new Object(-1, msg_cannot_delete_for_child);
// DB에서 삭제
@ -149,14 +144,7 @@
// 해당 메뉴의 정보를 구함
$layout_info = $oLayoutModel->getLayoutInfoXml($args->layout);
$navigations = $layout_info->navigations;
if(count($navigations)) {
foreach($navigations as $key => $val) {
if($args->menu_id == $val->id) {
$menu_title = $val->name;
}
}
}
$menu_title = $layout_info->menu->{$args->menu_id}->name;
// XML 파일을 갱신하고 위치을 넘겨 받음
$xml_file = $this->makeXmlFile($args->layout_srl, $args->menu_id);
@ -169,6 +157,9 @@
/**
* @brief xml 파일을 갱신
* 관리자페이지에서 메뉴 구성 간혹 xml파일이 재생성 안되는 경우가 있는데\n
* 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n
* 개발 중간의 문제인 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능
**/
function procMakeXmlFile() {
// 입력값을 체크
@ -179,14 +170,7 @@
// 해당 메뉴의 정보를 구함
$oLayoutModel = &getModel('layout');
$layout_info = $oLayoutModel->getLayoutInfoXml($layout);
$navigations = $layout_info->navigations;
if(count($navigations)) {
foreach($navigations as $key => $val) {
if($menu_id == $val->id) {
$menu_title = $val->name;
}
}
}
$menu_title = $layout_info->menu->{$menu_id}->name;
// xml파일 재생성
$xml_file = $this->makeXmlFile($layout_srl, $menu_id);
@ -201,6 +185,7 @@
* @brief 메뉴의 xml 파일을 만들고 위치를 return
**/
function makeXmlFile($layout_srl, $menu_id) {
// xml파일 생성시 필요한 정보가 없으면 그냥 return
if(!$layout_srl || !$menu_id) return;
// DB에서 layout_srl에 해당하는 메뉴 목록을 listorder순으로 구해옴
@ -213,13 +198,15 @@
// xml 파일의 이름을 지정
$xml_file = sprintf("./files/cache/layout/%s_%s.xml", $layout_srl, $menu_id);
// 구해온 데이터가 없다면 걍 return
// 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성
$list = $output->data;
if(!$list) {
$xml_buff = "<root />";
FileHandler::writeFile($xml_file, $xml_buff);
return $xml_file;
}
// 구해온 데이터가 하나라면 array로 바꾸어줌
if(!is_array($list)) $list = array($list);
// 루프를 돌면서 tree 구성
@ -232,13 +219,17 @@
$tree[$parent_srl][$menu_srl] = $node;
}
// 파일 생성
$xml_buff = "<root>".$this->getXmlTree($tree[0], $tree)."</root>";
FileHandler::writeFile($xml_file, $xml_buff);
return $xml_file;
}
/**
* @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성
* 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n
* (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현)
**/
function getXmlTree($source_node, $tree) {
if(!$source_node) return;

View file

@ -2,6 +2,7 @@
/**
* @class layoutModel
* @author zero (zero@nzeo.com)
* @version 0.1
* @brief layout 모듈의 Model class
**/
@ -15,6 +16,7 @@
/**
* @brief DB 생성된 레이아웃의 목록을 구함
* 생성되었다는 것은 DB에 등록이 되었다는 것을 의미
**/
function getLayoutList() {
$oDB = &DB::getInstance();
@ -27,6 +29,7 @@
/**
* @brief DB 생성된 한개의 레이아웃 정보를 구함
* 생성된 레이아웃의 DB정보를 return
**/
function getLayout($layout_srl) {
$oDB = &DB::getInstance();
@ -39,6 +42,7 @@
/**
* @brief 레이아웃의 경로를 구함
* 기본으로는 ./layouts에 있지만 웹관리기능으로 다운로드시 ./files/layouts에 존재함
**/
function getLayoutPath($layout_name) {
$class_path = sprintf('./files/layouts/%s/', $layout_name);
@ -52,6 +56,7 @@
/**
* @brief 레이아웃의 종류와 정보를 구함
* 다운로드되어 있는 레이아웃의 종류 (생성과 다른 의미)
**/
function getDownloadedLayoutList() {
// 다운받은 레이아웃과 설치된 레이아웃의 목록을 구함
@ -61,27 +66,22 @@
$searched_count = count($searched_list);
if(!$searched_count) return;
// 찾아진 레이아웃 목록을 loop돌면서 필요한 정보를 간추려 return
for($i=0;$i<$searched_count;$i++) {
// 레이아웃의 이름
$layout_name = $searched_list[$i];
// 레이아웃의 경로 (files/layouts가 우선)
$path = $this->getLayoutPath($layout_name);
$layout = $searched_list[$i];
// 해당 레이아웃의 정보를 구함
$info = $this->getLayoutInfoXml($layout_name);
unset($obj);
$layout_info = $this->getLayoutInfoXml($layout);
$info->layout = $layout_name;
$info->path = $path;
$list[] = $info;
$list[] = $layout_info;
}
return $list;
}
/**
* @brief 모듈의 conf/info.xml 읽어서 정보를 구함
* 이것 역시 캐싱을 통해서 xml parsing 시간을 줄인다..
**/
function getLayoutInfoXml($layout, $layout_srl = 0) {
// 요청된 모듈의 경로를 구한다. 없으면 return
@ -92,60 +92,61 @@
$xml_file = sprintf("%sconf/info.xml", $layout_path);
if(!file_exists($xml_file)) return;
// cache 파일을 비교하여 문제 없으면 include하고 $layout_info 변수를 return
$cache_file = sprintf('./files/cache/layout/%s.cache.php', $layout);
if(file_exists($cache_file)&&filectime($cache_file)>filectime($xml_file)) {
include $cache_file;
return $layout_info;
}
// cache 파일이 없으면 xml parsing하고 변수화 한 후에 캐시 파일에 쓰고 변수 바로 return
$oXmlParser = new XmlParser();
$tmp_xml_obj = $oXmlParser->loadXmlFile($xml_file);
$xml_obj = $tmp_xml_obj->layout;
if(!$xml_obj) return;
$info->title = $xml_obj->title->body;
$buff = '';
// 레이아웃의 제목, 버전
$buff .= sprintf('$layout_info->layout = "%s";', $layout);
$buff .= sprintf('$layout_info->path = "%s";', $layout_path);
$buff .= sprintf('$layout_info->title = "%s";', $xml_obj->title->body);
$buff .= sprintf('$layout_info->version = "%s";', $xml_obj->attrs->version);
// 작성자 정보
$layout_info->title = $xml_obj->title->body;
$layout_info->version = $xml_obj->attrs->version;
$layout_info->author->name = $xml_obj->author->name->body;
$layout_info->author->email_address = $xml_obj->author->attrs->email_address;
$layout_info->author->homepage = $xml_obj->author->attrs->link;
$layout_info->author->date = $xml_obj->author->attrs->date;
$layout_info->author->description = $xml_obj->author->description->body;
$buff .= sprintf('$layout_info->author->name = "%s";', $xml_obj->author->name->body);
$buff .= sprintf('$layout_info->author->email_address = "%s";', $xml_obj->author->attrs->email_address);
$buff .= sprintf('$layout_info->author->homepage = "%s";', $xml_obj->author->attrs->link);
$buff .= sprintf('$layout_info->author->date = "%s";', $xml_obj->author->attrs->date);
$buff .= sprintf('$layout_info->author->description = "%s";', $xml_obj->author->description->body);
// history
if(!is_array($xml_obj->history->author)) $history[] = $xml_obj->history->author;
else $history = $xml_obj->history->author;
// 추가 변수 (템플릿에서 사용할 제작자 정의 변수)
foreach($history as $item) {
unset($obj);
$obj->name = $item->name->body;
$obj->email_address = $item->attrs->email_address;
$obj->homepage = $item->attrs->link;
$obj->date = $item->attrs->date;
$obj->description = $item->description->body;
$layout_info->history[] = $obj;
// 메뉴
if(!is_array($xml_obj->menus->menu)) $menus[] = $xml_obj->menus->menu;
else $menus = $xml_obj->menus->menu;
$menu_count = count($menus);
$buff .= sprintf('$layout_info->menu_count = "%s";', count($menus));
for($i=0;$i<$menu_count;$i++) {
$id = $menus[$i]->attrs->id;
$buff .= sprintf('$layout_info->menu->{%s}->id = "%s";',$id, $menus[$i]->attrs->id);
$buff .= sprintf('$layout_info->menu->{%s}->name = "%s";',$id, $menus[$i]->name->body);
$buff .= sprintf('$layout_info->menu->{%s}->maxdepth = "%s";',$id, $menus[$i]->maxdepth->body);
$buff .= sprintf('$layout_info->menu->{%s}->xml_file = "./files/cache/layout/".$layout_srl."_%s.xml";',$id, $id);
}
// navigations
if(!is_array($xml_obj->navigations->navigation)) $navigations[] = $xml_obj->navigations->navigation;
else $navigations = $xml_obj->navigations->navigation;
unset($item);
foreach($navigations as $item) {
unset($obj);
$obj->id = $item->attrs->id;
$obj->name = $item->name->body;
$obj->maxdepth = $item->maxdepth->body;
$obj->xml_file = sprintf("./files/cache/layout/%s_%s.xml", $layout_srl, $obj->id);
if($layout_srl && !file_exists($obj->xml_file)) {
$buff = "<root />";
FileHandler::writeFile($obj->xml_file, $buff);
}
$layout_info->navigations[] = $obj;
}
$buff = '<?php if(!__ZB5__) exit(); '.$buff.' ?>';
FileHandler::writeFile($cache_file, $buff);
if(file_exists($cache_file)) include $cache_file;
return $layout_info;
}
/**
* @brief 특정 menu_srl의 정보를 return
* 정보중에 group_srls의 경우는 , 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴
**/
function getLayoutMenuInfo($menu_srl) {
$oDB = &DB::getInstance();
@ -162,6 +163,7 @@
/**
* @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return
* 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 html을 직접 return
**/
function getMenuTplInfo() {
// 해당 메뉴의 정보를 가져오기 위한 변수 설정
@ -185,10 +187,13 @@
$menu_info->menu_srl = $oDB->getNextSequence();
$menu_info->parent_srl = $parent_srl;
$menu_info->parent_menu_name = $parent_info->name;
// root에 메뉴 추가하거나 기존 메뉴의 수정일 경우
} else {
// menu_srl 이 있으면 해당 메뉴의 정보를 가져온다
if($menu_srl) $menu_info = $this->getLayoutMenuInfo($menu_srl);
// 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_srl값만 구해줌
if(!$menu_info->menu_srl) {
$oDB = &DB::getInstance();
$menu_info->menu_srl = $oDB->getNextSequence();

View file

@ -26,7 +26,8 @@
}
/**
* @brief 레이아웃 등록 페이지 step 1
* @brief 레이아웃 등록 페이지
* 1차적으로 레이아웃만 선택한 DB 값을 넣고 상세 설정하는 단계를 거침
**/
function dispInsertLayout() {
// 레이아웃 목록을 세팅
@ -38,7 +39,7 @@
}
/**
* @brief 레이아웃 등록 페이지 step 2
* @brief 레이아웃 세부 정보 입력
**/
function dispLayoutInfo() {
// 선택된 레이아웃의 정보르 구해서 세팅
@ -55,39 +56,26 @@
// xml 정보를 가져옴
$layout = $layout_info->layout;
$layout_info = $oLayoutModel->getLayoutInfoXml($layout, $layout_srl);
// 기본 layout_info에 세부 정보를 입력할 layout_srl, layout_title을 추가
$layout_info->layout_srl = $layout_srl;
$layout_info->layout_title = $layout_title;
$layout_info->layout = $layout;
Context::set('layout_info', $layout_info);
$this->setTemplateFile('layout_info');
}
/**
* @brief 레이아웃 메뉴의 개별 정보 출력
**/
function dispLayoutMenuInfo() {
// 팝업이기 때문에 팝업용 레이아웃을 지정
$this->setLayoutPath('./common/tpl/');
$this->setLayoutFile('popup_layout');
// menu_srl에 해당하는 값을 가져옴
// 템플릿 지정
$this->setTemplateFile('layout_menu_info');
}
/**
* @brief 레이아웃 목록을 보여줌
**/
function dispLayoutList() {
function dispDownloadedLayoutList() {
// 레이아웃 목록을 세팅
$oLayoutModel = &getModel('layout');
$layout_list = $oLayoutModel->getDownloadedLayoutList();
Context::set('layout_list', $layout_list);
$this->setTemplateFile('layout_list');
$this->setTemplateFile('downloaded_layout_list');
}

View file

@ -11,7 +11,7 @@
<td>{$lang->author}</td>
<td>{$lang->menu_count}</td>
<td>{$lang->date}</td>
<td>{$lang->date}</td>
<td>{$lang->path}</td>
<td>{$lang->cmd_make}</td>
</tr>
<!--@foreach($layout_list as $key => $val)-->
@ -22,7 +22,7 @@
</td>
<td>{$val->version}</td>
<td><a href="#" onclick="window.open('{$val->author->homepage}')">{$val->author->name}</a></td>
<td>{count($val->navigations)}</td>
<td>{$val->menu_count}</td>
<td>{$val->author->date}</td>
<td>{$val->path}</td>
<td><a href="{getUrl('mo','layout','act','dispInsertLayout','layout',$val->layout)}">{$lang->cmd_make}</a></td>

View file

@ -18,6 +18,10 @@
<th>{$lang->layout_name}</th>
<td>{$layout_info->title} ver {$layout_info->version} ({$layout_info->layout})</td>
</tr>
<tr>
<th>{$lang->path}</th>
<td>{$layout_info->path}</td>
</tr>
<tr>
<th>{$lang->author}</th>
<td><a href="#" onclick="window.open('{$layout_info->author->homepage}');return false;">{$layout_info->author->name}</a></td>
@ -44,37 +48,37 @@
<th>{$lang->menu_management}</th>
<td>{nl2br($lang->about_menu_management)}</td>
</tr>
<!--@foreach($layout_info->navigations as $key => $val)-->
<!--@foreach($layout_info->menu as $menu_id => $menu)-->
<tr>
<th>
{$val->name} <br />
({$val->maxdepth} {$lang->depth})
{$menu->name} <br />
({$menu->maxdepth} {$lang->depth})
</th>
<td>
<form id="fo_{$val->id}" action="./" method="get" onsubmit="return procFilter(this, insert_layout_menu)">
<form id="fo_{$menu->id}" action="./" method="get" onsubmit="return procFilter(this, insert_layout_menu)">
<input type="hidden" name="layout_srl" value="{$layout_srl}" />
<input type="hidden" name="layout" value="{$layout_info->layout}" />
<input type="hidden" name="menu_id" value="{$val->id}" />
<input type="hidden" name="menu_id" value="{$menu->id}" />
<table border="0">
<tr valign="top">
<td width="300">
<div id="menu_zone_{$val->id}"></div>
<div id="menu_zone_{$menu_id}"></div>
<div>
<input type="button" value="{$lang->cmd_insert}" onclick="doInsertLayoutMenu('{$val->id}');return false;" />
<input type="button" value="{$lang->cmd_open_all}" onclick="openAllTreeMenu('{$val->id}');return false;" />
<input type="button" value="{$lang->cmd_close_all}" onclick="closeAllTreeMenu('{$val->id}');return false;" />
<input type="button" value="{$lang->cmd_remake_cache}" onclick="doReloadTreeMenu('{$val->id}');return false;" />
<input type="button" value="{$lang->cmd_insert}" onclick="doInsertLayoutMenu('{$menu_id}');return false;" />
<input type="button" value="{$lang->cmd_open_all}" onclick="openAllTreeMenu('{$menu_id}');return false;" />
<input type="button" value="{$lang->cmd_close_all}" onclick="closeAllTreeMenu('{$menu_id}');return false;" />
<input type="button" value="{$lang->cmd_remake_cache}" onclick="doReloadTreeMenu('{$menu_id}');return false;" />
</div>
</td>
<td>
<div id="menu_zone_info_{$val->id}">
<div id="menu_zone_info_{$menu_id}">
</div>
</td>
</tr>
</table>
</form>
<script type="text/javascript">
xAddEventListener(window,'load', function() { loadTreeMenu("{$val->xml_file}", "{$val->id}", "menu_zone_{$val->id}", "{$val->name}", doGetMenuInfo); });
xAddEventListener(window,'load', function() { loadTreeMenu("{$menu->xml_file}", "{$menu_id}", "menu_zone_{$menu_id}", "{$menu->name}", doGetMenuInfo); });
</script>
</td>
</tr>