게시판의 분류(카테고리) 관리를 메뉴(menu)와 같이 ajax로 부모-자식 관계로 생성할 수 있도록 기능 수정. 카테고리별 권한 설정을 통해 글작성시 카테고리 선별 제공 가능

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@3545 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2008-01-18 12:14:12 +00:00
parent a6a082dfce
commit 205324a735
27 changed files with 716 additions and 149 deletions

View file

@ -0,0 +1,48 @@
<input type="hidden" name="category_srl" value="{$category_info->category_srl}" />
<input type="hidden" name="parent_srl" value="{$category_info->parent_srl}" />
<table cellspacing="0" class="adminTable">
<col width="140" />
<col width="*" />
<!--@if($category_info->parent_category_title)-->
<tr>
<th scope="row">{$lang->parent_category_title}</th>
<td>{$category_info->parent_category_title}</td>
</tr>
<!--@end-->
<tr>
<th scope="row">{$lang->category_title}</th>
<td>
<input type="text" name="category_title" value="{htmlspecialchars($category_info->title)}" class="inputTypeText" />
<p>{$lang->about_category_title}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->expand}</th>
<td>
<input type="checkbox" name="expand" value="Y" <!--@if($category_info->expand=="Y")-->checked="checked"<!--@end--> class="checkbox" />
{$lang->about_expand}
</td>
</tr>
<tr>
<th scope="row">{$lang->category_group_srls} <input type="checkbox" onclick="checkboxSelectAll(this.form, 'group_srls'); return false;" /></th>
<td>
<!--@foreach($group_list as $key=>$val)-->
<div><input type="checkbox" name="group_srls" value="{$key}" id="group_{$key}" <!--@if(is_array($category_info->group_srls)&&in_array($key, $category_info->group_srls))-->checked="checked"<!--@end--> class="checkbox" /> <label for="group_{$key}">{$val->title}</label></div>
<!--@end-->
<p>{$lang->about_category_group_srls}</p>
</td>
</tr>
<tr>
<th scope="row" colspan="2" class="button">
<!--@if($category_info->title)-->
<a href="#" onclick="doDeleteCategory('{$category_srl->category_srl}');return false" class="button"><span>{$lang->cmd_delete}</span></a>
<!--@end-->
<a href="#" onclick="hideCategoryInfo();return false" class="button"><span>{$lang->cmd_close}</span></a>
<span class="button"><input type="submit" value="{$lang->cmd_save}" /></span>
<!--@if($category_info->title)-->
<a href="#" onclick="doInsertCategory('{$category_info->category_srl}');return false" class="button"><span>{$lang->cmd_make_child}</span></a>
<!--@end-->
</th>
</tr>
</table>

View file

@ -1,70 +1,46 @@
<!--%import("filter/insert_category.xml")-->
<!--%import("filter/update_category.xml")-->
<!--%import("filter/delete_category.xml")-->
<!--%import("filter/move_category.xml")-->
<!--%import("css/board.css")-->
<!--%import("js/board_admin.js")-->
<!--#include("./header.html")-->
<script type="text/javascript">
var category_title = "{$lang->category}";
</script>
<!-- 카테고리의 위/아래, 삭제와 관련된 form -->
<form id="fo_category_info" action="./" method="get">
<input type="hidden" name="module_srl" value="{$module_srl}" />
<input type="hidden" name="category_srl" value="" />
<input type="hidden" name="mode" value="" />
</form>
<h3>{$lang->board} <span class="gray">{$lang->cmd_management}</span></h3>
<div class="infoText">{nl2br($lang->about_board_category)}</div>
<table cellspacing="0" class="adminTable">
<col />
<col width="100" />
<col width="50" />
<col width="50" />
<col width="50" />
<thead>
<tr>
<th scope="col">{$lang->category_title}</th>
<th scope="col">{$lang->last_update}</th>
<th scope="col">{$lang->cmd_modify}</th>
<th scope="col">{$lang->cmd_move}</th>
<th scope="col">{$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
<!--@if(!count($category_list))-->
<tr>
<td colspan="5">{$lang->msg_category_is_null}</td>
</tr>
<!--@end-->
<div class="gap">
<a href="#" onclick="doInsertCategory(0);return false;" class="button"><span>{$lang->cmd_insert}</span></a>
<a href="#" onclick="doReloadTreeCategory('{$module_info->module_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a>
<a href="#" onclick="openAllTreeMenu('category');return false;" class="button"><span>{$lang->cmd_open_all}</span></a>
<a href="#" onclick="closeAllTreeMenu('category');return false;" class="button"><span>{$lang->cmd_close_all}</span></a>
<a href="#" onclick="window.close();return false;" class="button"><span>{$lang->cmd_close}</span></a>
</div>
<!--@foreach($category_list as $category_srl => $category_info)-->
<tr>
<td>{htmlspecialchars($category_info->title)}</td>
<td class="tahoma">{zdate($category_info->last_update,"Y-m-d H:i:s")}</td>
<td class="blue"><a href="{getUrl('category_srl',$category_info->category_srl)}">{$lang->cmd_modify}</a></td>
<td>
<a href="#" onclick="doUpdateCategory('{$category_info->category_srl}','up');return false;"><img src="../../admin/tpl/images/button_up.gif" alt="{$lang->cmd_move_up}" width="14" height="14" /></a>
<a href="#" onclick="doUpdateCategory('{$category_info->category_srl}','down');return false;"><img src="../../admin/tpl/images/button_down.gif" alt="{$lang->cmd_move_down}" width="14" height="14" /></a>
</td>
<td class="red"><a href="#" onclick="doUpdateCategory('{$category_info->category_srl}','delete','{$lang->confirm_delete}');return false;">{$lang->cmd_delete}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<p class="gap1"><input type="checkbox" class="checkbox" id="category_enable_move" onclick="hideCategoryInfo()" /> <label for="category_enable_move">{$lang->cmd_enable_move_category}</label></p>
<!-- 카테고리 추가 -->
<form action="./" method="post" onsubmit="return procFilter(this, insert_category)">
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<input type="hidden" name="category_srl" value="" />
<!-- 카테고리의 위/아래, 삭제와 관련된 form -->
<form id="fo_move_category" action="./" method="get">
<input type="hidden" name="module_srl" />
<input type="hidden" name="source_category_srl" />
<input type="hidden" name="target_category_srl" />
</form>
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<col width="100" />
<tr>
<th scope="row">{$lang->category_title}</th>
<td>
<input type="text" name="category_title" class="inputTypeText w300" />
</td>
<th scope="row" class="centerButton"><span class="button"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span></th>
</tr>
</table>
<div class="gap1">
<form id="fo_category" action="./" method="get" onsubmit="return procFilter(this, insert_category)">
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
<input type="hidden" name="xml_file" value="{$category_xml_file}" />
</form>
<div id="category_list">
<div id="zone_category"></div>
</div>
<div id="category_info"></div>
</form>
<script type="text/javascript">
loadTreeMenu("{$category_xml_file}", "category", "zone_category", category_title, '', doGetCategoryInfo, 0, doMoveTree);
</script>
</div>

View file

@ -0,0 +1,11 @@
@charset "utf-8";
body { margin:10px; }
.menuListZone { table-layout:fixed; }
.menuListZone td { vertical-align:top; }
.menuListZone td.category_zone { padding-right:10px; }
#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; width:250px; overflow:hidden; float:left; position:absolute; left:10px;}
#category_info { margin-left:10px; width:560px; _width:540px; float:left; position:absolute; right:10px;}
*:first-child+html #category_info { width:550px; }

View file

@ -0,0 +1,11 @@
<filter name="delete_category" module="board" act="procBoardAdminDeleteCategory" confirm_msg_code="confirm_delete">
<form>
<node target="category_srl" required="true" />
</form>
<response callback_func="completeDeleteCategory">
<tag name="error" />
<tag name="message" />
<tag name="xml_file" />
<tag name="category_srl" />
</response>
</filter>

View file

@ -1,12 +1,23 @@
<filter name="insert_category" module="board" act="procBoardAdminInsertCategory" confirm_msg_code="confirm_submit">
<form>
<node target="module_srl" required="true" />
<node target="category_srl" required="true" />
<node target="category_title" required="true" />
</form>
<response callback_func="completeUpdateCategory">
<parameter>
<param name="module_srl" target="module_srl" />
<param name="category_srl" target="category_srl" />
<param name="parent_srl" target="parent_srl" />
<param name="title" target="category_title" />
<param name="expand" target="expand" />
<param name="group_srls" target="group_srls" />
</parameter>
<response callback_func="completeInsertCategory">
<tag name="error" />
<tag name="message" />
<tag name="page" />
<tag name="module_srl" />
<tag name="category_srl" />
<tag name="parent_srl" />
<tag name="xml_file" />
</response>
</filter>

View file

@ -0,0 +1,10 @@
<filter name="move_category" module="board" act="procBoardAdminMoveCategory" confirm_msg_code="confirm_move">
<form />
<parameter />
<response callback_func="completeMoveCategory">
<tag name="error" />
<tag name="message" />
<tag name="xml_file" />
<tag name="source_category_srl" />
</response>
</filter>

View file

@ -18,7 +18,7 @@
<!--@end-->
<li <!--@if($act=='dispBoardAdminBoardInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminBoardInfo')}">{$lang->cmd_view_info}</a></li>
<li <!--@if($act=='dispBoardAdminBoardAdditionSetup')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminBoardAdditionSetup')}">{$lang->cmd_addition_setup}</a></li>
<li <!--@if($act=='dispBoardAdminCategoryInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminCategoryInfo')}">{$lang->cmd_manage_category}</a></li>
<li <!--@if($act=='dispBoardAdminCategoryInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminCategoryInfo')}" onclick="winopen(this.href,'BoardMenu','width=850,height=800,resizable=yes,scrollbars=yes,toolbars=no');return false;">{$lang->cmd_manage_category}</a></li>
<li <!--@if($act=='dispBoardAdminGrantInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminGrantInfo')}">{$lang->cmd_manage_grant}</a></li>
<li <!--@if($act=='dispBoardAdminSkinInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminSkinInfo')}">{$lang->cmd_manage_skin}</a></li>
</ul>

View file

@ -51,7 +51,9 @@ function completeUpdateCategory(ret_obj) {
var page = ret_obj['page'];
alert(message);
location.href = current_url.setQuery('category_srl','');
var url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispBoardAdminCategoryInfo');
if(page) url.setQuery('page',page);
location.href = url;
}
/* 권한 관련 */
@ -115,3 +117,155 @@ function doCartSetup(act_type) {
var url = current_url.setQuery('act',act_type).setQuery('module_srl','').setQuery('module_srls',module_srl.join(','));
location.href = url;
}
/**
* 카테고리 관리
**/
/* 빈 카테고리 아이템 추가 */
function doInsertCategory(parent_srl) {
if(typeof(parent_srl)=='undefined') parent_srl = 0;
var params = {node_srl:0, parent_srl:parent_srl}
doGetCategoryInfo(null, params);
deSelectNode();
}
/* 카테고리 클릭시 적용할 함수 */
function doGetCategoryInfo(category_id, obj) {
// category, category_id, node_srl을 추출
var fo_obj = xGetElementById("fo_category");
var module_srl = fo_obj.module_srl.value;
var node_srl = 0;
var parent_srl = 0;
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["category_srl"] = node_srl;
params["parent_srl"] = parent_srl;
params["module_srl"] = module_srl;
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
var response_tags = new Array('error','message','tpl');
exec_xml('board', 'getBoardAdminCategoryTplInfo', params, completeGetCategoryTplInfo, response_tags, params);
}
/* 서버로부터 받아온 카테고리 정보를 출력 */
xAddEventListener(document,'mousedown',checkMousePosition);
var _xPos = 0;
var _yPos = 0;
function checkMousePosition(e) {
var evt = new xEvent(e);
_xPos = evt.pageX;
_yPos = evt.pageY;
}
function hideCategoryInfo() {
var obj = xGetElementById('category_info');
obj.style.display = "none";
}
function completeGetCategoryTplInfo(ret_obj, response_tags) {
var obj = xGetElementById('category_info');
if(xScrollTop()>200) {
obj.style.marginTop = ( xScrollTop() - 210 )+'px';
} else {
obj.style.marginTop = '0px';
}
var tpl = ret_obj['tpl'];
xInnerHtml(obj, tpl);
obj.style.display = 'block';
var fo_obj = xGetElementById("fo_category");
fo_obj.category_title.focus();
}
/* 카테고리 아이템 입력후 */
function completeInsertCategory(ret_obj) {
var xml_file = ret_obj['xml_file'];
var category_srl = ret_obj['category_srl'];
var module_srl = ret_obj['module_srl'];
var parent_srl = ret_obj['parent_srl'];
if(!xml_file) return;
loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '',doGetCategoryInfo, category_srl, doMoveTree);
if(!category_srl) {
xInnerHtml("category_info", "");
} else {
var params = {node_srl:category_srl, parent_srl:parent_srl}
doGetCategoryInfo(null, params)
}
if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter();
}
/* 카테고리를 드래그하여 이동한 후 실행할 함수 , 이동하는 category_srl과 대상 category_srl을 받음 */
function doMoveTree(category_id, source_category_srl, target_category_srl) {
source_category_srl = source_category_srl.replace(/menu_category_/,'');
target_category_srl = target_category_srl.replace(/menu_category_/,'');
var p_fo_obj = xGetElementById("fo_category");
var fo_obj = xGetElementById("fo_move_category");
fo_obj.source_category_srl.value = source_category_srl;
fo_obj.target_category_srl.value = target_category_srl;
fo_obj.module_srl.value = p_fo_obj.module_srl.value;
// 이동 취소를 선택하였을 경우 다시 그림;;
if(!procFilter(fo_obj, move_category)) {
var params = new Array();
params["xml_file"] = xGetElementById('fo_category').xml_file.value;
params["source_category_srl"] = source_category_srl;
completeMoveCategory(params);
}
}
function completeMoveCategory(ret_obj) {
var source_category_srl = ret_obj['source_category_srl'];
var xml_file = ret_obj['xml_file'];
loadTreeMenu(xml_file, 'category', "zone_category", category_title, '', doGetCategoryInfo, source_category_srl, doMoveTree);
}
/* 카테고리 목록 갱신 */
function doReloadTreeCategory(module_srl) {
var params = new Array();
params["module_srl"] = module_srl;
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
var response_tags = new Array('error','message', 'xml_file');
exec_xml('board', 'procBoardAdminMakeXmlFile', params, completeInsertCategory, response_tags, params);
}
/* 카테고리 삭제 */
function doDeleteCategory(category_srl) {
var fo_obj = xGetElementById("fo_category");
if(!fo_obj) return;
procFilter(fo_obj, delete_category);
}
/* 카테고리 아이템 삭제 후 */
function completeDeleteCategory(ret_obj) {
var module_srl = ret_obj['module_srl'];
var category_srl = ret_obj['category_srl'];
var xml_file = ret_obj['xml_file'];
alert(ret_obj['message']);
loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '', doGetCategoryInfo, category_srl, doMoveTree);
var obj = xGetElementById('category_info');
xInnerHtml(obj, "");
obj.style.display = 'none';
}