tree javascript change : 메뉴, 게시판분류, 홈페이지

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@5055 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
ngleader 2008-12-11 02:27:37 +00:00
parent 987c7fbfbd
commit 19859b1615
65 changed files with 1591 additions and 875 deletions

View file

@ -98,6 +98,8 @@
**/
function _toJSON(&$oModule) {
$variables = $oModule->getVariables();
$variables['error'] = $oModule->getError();
$variables['message'] = $oModule->getMessage();
//if(function_exists('json_encode')) return json_encode($variables);
//else return json_encode2($variables);
$json = str_replace("\r\n",'\n',json_encode2($variables));

View file

@ -358,12 +358,19 @@
}
// view action이고 결과 출력이 XMLRPC일 경우 해당 모듈의 api method를 실행
if((Context::getResponseMethod() == 'XMLRPC' || Context::getResponseMethod() == 'JSON') && $this->module_info->module_type == 'view') {
if($this->module_info->module_type == 'view'){
if(Context::getResponseMethod() == 'XMLRPC' || Context::getResponseMethod() == 'JSON') {
$oAPI = getAPI($this->module_info->module, 'api');
if(method_exists($oAPI, $this->act)) {
$oAPI->{$this->act}($this);
}
}
}else if($this->module_info->module_type == 'controller'){
if(Context::getResponseMethod() == 'JSON'){
}
}
return true;
}

View file

@ -0,0 +1,186 @@
.simpleTree
{
margin:0;
padding:0;
/*
overflow:auto;
width: 250px;
height:350px;
overflow:auto;
border: 1px solid #444444;
*/
}
.simpleTree li
{
white-space: nowrap;
list-style: none;
margin:0;
padding:0 0 0 34px;
line-height: 14px;
}
.simpleTree li span
{
display:inline;
clear: left;
white-space: nowrap;
}
.simpleTree li a img
{
padding:0 1px 0px 3px;
}
.simpleTree ul
{
margin:0;
padding:0;
}
.simpleTree .root
{
margin-left:-16px;
background: url(./common/tpl/images/tree/root.gif) no-repeat 16px 0 #ffffff;
}
.simpleTree .line
{
margin:0 0 0 -16px;
padding:0;
line-height: 3px;
height:3px;
font-size:3px;
background: url(./common/tpl/images/tree/line_bg.gif) 0 0 no-repeat transparent;
}
.simpleTree .line-last
{
margin:0 0 0 -16px;
padding:0;
line-height: 3px;
height:3px;
font-size:3px;
background: url(./common/tpl/images/tree/spacer.gif) 0 0 no-repeat transparent;
}
.simpleTree .line-over
{
margin:0 0 0 -16px;
padding:0;
line-height: 3px;
height:3px;
font-size:3px;
background: url(./common/tpl/images/tree/line_bg_over.gif) 0 0 no-repeat transparent;
}
.simpleTree .line-over-last
{
margin:0 0 0 -16px;
padding:0;
line-height: 3px;
height:3px;
font-size:3px;
background: url(./common/tpl/images/tree/line_bg_over_last.gif) 0 0 no-repeat transparent;
}
.simpleTree .folder-open
{
margin-left:-16px;
background: url(./common/tpl/images/tree/collapsable.gif) 0 -2px no-repeat #fff;
}
.simpleTree .folder-open-last
{
margin-left:-16px;
background: url(./common/tpl/images/tree/collapsable-last.gif) 0 -2px no-repeat #fff;
}
.simpleTree .folder-close
{
margin-left:-16px;
background: url(./common/tpl/images/tree/expandable.gif) 0 -2px no-repeat #fff;
}
.simpleTree .folder-close-last
{
margin-left:-16px;
background: url(./common/tpl/images/tree/expandable-last.gif) 0 -2px no-repeat #fff;
}
.simpleTree .doc
{
margin-left:-16px;
background: url(./common/tpl/images/tree/leaf.gif) 0 -1px no-repeat #fff;
}
.simpleTree .doc-last
{
margin-left:-16px;
background: url(./common/tpl/images/tree/leaf-last.gif) 0 -1px no-repeat #fff;
}
.simpleTree .ajax
{
background: url(./common/tpl/images/tree/spinner.gif) no-repeat 0 0 #ffffff;
height: 16px;
display:none;
}
.simpleTree .ajax li
{
display:none;
margin:0;
padding:0;
}
.simpleTree .trigger
{
display:inline;
margin-left:-32px;
width: 28px;
height: 11px;
cursor:pointer;
}
.simpleTree .text
{
cursor: default;
}
.simpleTree .active
{
cursor: default;
background-color:#F7BE77;
padding:0px 2px;
border: 1px dashed #444;
}
#drag_container
{
background:#ffffff;
color:#000;
font: normal 11px arial, tahoma, helvetica, sans-serif;
border: 1px dashed #767676;
}
#drag_container ul
{
list-style: none;
padding:0;
margin:0;
}
#drag_container li
{
list-style: none;
background-color:#ffffff;
line-height:18px;
white-space: nowrap;
padding:1px 1px 0px 16px;
margin:0;
}
#drag_container li span
{
padding:0;
}
#drag_container li.doc, #drag_container li.doc-last
{
background: url(./common/tpl/images/tree/leaf.gif) no-repeat -17px 0 #ffffff;
}
#drag_container .folder-close, #drag_container .folder-close-last
{
background: url(./common/tpl/images/tree/expandable.gif) no-repeat -17px 0 #ffffff;
}
#drag_container .folder-open, #drag_container .folder-open-last
{
background: url(./common/tpl/images/tree/collapsable.gif) no-repeat -17px 0 #ffffff;
}
.contextMenu
{
display:none;
}

View file

@ -0,0 +1,468 @@
/*
* jQuery SimpleTree Drag&Drop plugin
* Update on 22th May 2008
* Version 0.3
*
* Licensed under BSD <http://en.wikipedia.org/wiki/BSD_License>
* Copyright (c) 2008, Peter Panov <panov@elcat.kg>, IKEEN Group http://www.ikeen.com
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the Peter Panov, IKEEN Group nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY Peter Panov, IKEEN Group ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL Peter Panov, IKEEN Group BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
(function($){
$.fn.simpleTree = function(opt){
return this.each(function(){
var TREE = this;
var ROOT = $('.root',this);
var mousePressed = false;
var mouseMoved = false;
var dragMoveType = false;
var dragNode_destination = false;
var dragNode_source = false;
var dragDropTimer = false;
var ajaxCache = Array();
TREE.option = {
drag: true,
animate: false,
autoclose: false,
speed: 'fast',
afterAjax: false,
afterMove: false,
beforeMovedToLine: false,
beforeMovedToFolder: false,
afterClick: false,
afterDblClick: false,
// added by Erik Dohmen (2BinBusiness.nl) to make context menu cliks available
afterContextMenu: false,
docToFolderConvert:false
};
TREE.option = $.extend(TREE.option,opt);
$.extend(this, {getSelected: function(){
return $('span.active', this).parent();
}});
TREE.closeNearby = function(obj)
{
$(obj).siblings().filter('.folder-open, .folder-open-last').each(function(){
var childUl = $('>ul',this);
var className = this.className;
this.className = className.replace('open','close');
if(TREE.option.animate)
{
childUl.animate({height:"toggle"},TREE.option.speed);
}else{
childUl.hide();
}
});
};
TREE.nodeToggle = function(obj)
{
var childUl = $('>ul',obj);
if(childUl.is(':visible')){
obj.className = obj.className.replace('open','close');
if(TREE.option.animate)
{
childUl.animate({height:"toggle"},TREE.option.speed);
}else{
childUl.hide();
}
}else{
obj.className = obj.className.replace('close','open');
if(TREE.option.animate)
{
childUl.animate({height:"toggle"},TREE.option.speed, function(){
if(TREE.option.autoclose)TREE.closeNearby(obj);
if(childUl.is('.ajax'))TREE.setAjaxNodes(childUl, obj.id);
});
}else{
childUl.show();
if(TREE.option.autoclose)TREE.closeNearby(obj);
if(childUl.is('.ajax'))TREE.setAjaxNodes(childUl, obj.id);
}
}
};
TREE.setAjaxNodes = function(node, parentId, callback)
{
if($.inArray(parentId,ajaxCache) == -1){
ajaxCache[ajaxCache.length]=parentId;
var url = $.trim($('>li', node).text());
if(url && url.indexOf('url:'))
{
url=$.trim(url.replace(/.*\{url:(.*)\}/i ,'$1'));
$.ajax({
type: "GET",
url: url,
contentType:'html',
cache:false,
success: function(responce){
node.removeAttr('class');
node.html(responce);
$.extend(node,{url:url});
TREE.setTreeNodes(node, true);
if(typeof TREE.option.afterAjax == 'function')
{
TREE.option.afterAjax(node);
}
if(typeof callback == 'function')
{
callback(node);
}
}
});
}
}
};
TREE.setTreeNodes = function(obj, useParent){
obj = useParent? obj.parent():obj;
$('li>span', obj).addClass('text')
.bind('selectstart', function() {
return false;
}).click(function(){
$('.active',TREE).attr('class','text');
if(this.className=='text')
{
this.className='active';
}
if(typeof TREE.option.afterClick == 'function')
{
TREE.option.afterClick($(this).parent());
}
return false;
}).dblclick(function(){
mousePressed = false;
TREE.nodeToggle($(this).parent().get(0));
if(typeof TREE.option.afterDblClick == 'function')
{
TREE.option.afterDblClick($(this).parent());
}
return false;
// added by Erik Dohmen (2BinBusiness.nl) to make context menu actions
// available
}).bind("contextmenu",function(){
$('.active',TREE).attr('class','text');
if(this.className=='text')
{
this.className='active';
}
if(typeof TREE.option.afterContextMenu == 'function')
{
TREE.option.afterContextMenu($(this).parent());
}
return false;
}).mousedown(function(event){
mousePressed = true;
cloneNode = $(this).parent().clone();
var LI = $(this).parent();
if(TREE.option.drag)
{
$('>ul', cloneNode).hide();
$('body').append('<div id="drag_container"><ul></ul></div>');
$('#drag_container').hide().css({opacity:'0.8'});
$('#drag_container >ul').append(cloneNode);
$("<img>").attr({id : "tree_plus",src : "./common/tpl/images/tree/plus.gif"}).css({width: "7px",display: "block",position: "absolute",left : "5px",top: "5px", display:'none'}).appendTo("body");
$(document).bind("mousemove", {LI:LI}, TREE.dragStart).bind("mouseup",TREE.dragEnd);
}
return false;
}).mouseup(function(){
if(mousePressed && mouseMoved && dragNode_source)
{
TREE.moveNodeToFolder($(this).parent());
}
TREE.eventDestroy();
});
$('li', obj).each(function(i){
var className = this.className;
var open = false;
var cloneNode=false;
var LI = this;
var childNode = $('>ul',this);
if(childNode.size()>0){
var setClassName = 'folder-';
if(className && className.indexOf('open')>=0){
setClassName=setClassName+'open';
open=true;
}else{
setClassName=setClassName+'close';
}
this.className = setClassName + ($(this).is(':last-child')? '-last':'');
if(!open || className.indexOf('ajax')>=0)childNode.hide();
TREE.setTrigger(this);
}else{
var setClassName = 'doc';
this.className = setClassName + ($(this).is(':last-child')? '-last':'');
}
}).before('<li class="line"></li>')
.filter(':last-child').after('<li class="line-last"></li>');
TREE.setEventLine($('.line, .line-last', obj));
};
TREE.setTrigger = function(node){
$('>span',node).before('<img class="trigger" src="./common/tpl/images/tree/spacer.gif" border=0>');
var trigger = $('>.trigger', node);
trigger.click(function(event){
TREE.nodeToggle(node);
});
if(!$.browser.msie)
{
trigger.css('float','left');
}
};
TREE.dragStart = function(event){
var LI = $(event.data.LI);
if(mousePressed)
{
mouseMoved = true;
if(dragDropTimer) clearTimeout(dragDropTimer);
if($('#drag_container:not(:visible)')){
$('#drag_container').show();
LI.prev('.line').hide();
dragNode_source = LI;
}
$('#drag_container').css({position:'absolute', "left" : (event.pageX + 5), "top": (event.pageY + 15) });
if(LI.is(':visible'))LI.hide();
var temp_move = false;
if(event.target.tagName.toLowerCase()=='span' && $.inArray(event.target.className, Array('text','active','trigger'))!= -1)
{
var parent = event.target.parentNode;
var offs = $(parent).offset({scroll:false});
var screenScroll = {x : (offs.left - 3),y : event.pageY - offs.top};
var isrc = $("#tree_plus").attr('src');
var ajaxChildSize = $('>ul.ajax',parent).size();
var ajaxChild = $('>ul.ajax',parent);
screenScroll.x += 19;
screenScroll.y = event.pageY - screenScroll.y + 5;
if(parent.className.indexOf('folder-close')>=0 && ajaxChildSize==0)
{
if(isrc.indexOf('minus')!=-1)$("#tree_plus").attr('src','./common/tpl/images/tree/plus.gif');
$("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
dragDropTimer = setTimeout(function(){
parent.className = parent.className.replace('close','open');
$('>ul',parent).show();
}, 700);
}else if(parent.className.indexOf('folder')>=0 && ajaxChildSize==0){
if(isrc.indexOf('minus')!=-1)$("#tree_plus").attr('src','./common/tpl/images/tree/plus.gif');
$("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
}else if(parent.className.indexOf('folder-close')>=0 && ajaxChildSize>0)
{
mouseMoved = false;
$("#tree_plus").attr('src','./common/tpl/images/tree/minus.gif');
$("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
$('>ul',parent).show();
/*
Thanks for the idea of Erik Dohmen
*/
TREE.setAjaxNodes(ajaxChild,parent.id, function(){
parent.className = parent.className.replace('close','open');
mouseMoved = true;
$("#tree_plus").attr('src','./common/tpl/images/tree/plus.gif');
$("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
});
}else{
if(TREE.option.docToFolderConvert)
{
$("#tree_plus").css({"left": screenScroll.x, "top": screenScroll.y}).show();
}else{
$("#tree_plus").hide();
}
}
}else{
$("#tree_plus").hide();
}
return false;
}
return true;
};
TREE.dragEnd = function(){
if(dragDropTimer) clearTimeout(dragDropTimer);
TREE.eventDestroy();
};
TREE.setEventLine = function(obj){
obj.mouseover(function(){
if(this.className.indexOf('over')<0 && mousePressed && mouseMoved)
{
this.className = this.className.replace('line','line-over');
}
}).mouseout(function(){
if(this.className.indexOf('over')>=0)
{
this.className = this.className.replace('-over','');
}
}).mouseup(function(){
if(mousePressed && dragNode_source && mouseMoved)
{
dragNode_destination = $(this).parents('li:first');
TREE.moveNodeToLine(this);
TREE.eventDestroy();
}
});
};
TREE.checkNodeIsLast = function(node)
{
if(node.className.indexOf('last')>=0)
{
var prev_source = dragNode_source.prev().prev();
if(prev_source.size()>0)
{
prev_source[0].className+='-last';
}
node.className = node.className.replace('-last','');
}
};
TREE.checkLineIsLast = function(line)
{
if(line.className.indexOf('last')>=0)
{
var prev = $(line).prev();
if(prev.size()>0)
{
prev[0].className = prev[0].className.replace('-last','');
}
dragNode_source[0].className+='-last';
}
};
TREE.eventDestroy = function()
{
// added by Erik Dohmen (2BinBusiness.nl), the unbind mousemove TREE.dragStart action
// like this other mousemove actions binded through other actions ain't removed (use it myself
// to determine location for context menu)
$(document).unbind('mousemove',TREE.dragStart).unbind('mouseup').unbind('mousedown');
$('#drag_container, #tree_plus').remove();
if(dragNode_source)
{
$(dragNode_source).show().prev('.line').show();
}
dragNode_destination = dragNode_source = mousePressed = mouseMoved = false;
//ajaxCache = Array();
};
TREE.convertToFolder = function(node){
node[0].className = node[0].className.replace('doc','folder-open');
node.append('<ul><li class="line-last"></li></ul>');
TREE.setTrigger(node[0]);
TREE.setEventLine($('.line, .line-last', node));
};
TREE.convertToDoc = function(node){
$('>ul', node).remove();
$('img', node).remove();
node[0].className = node[0].className.replace(/folder-(open|close)/gi , 'doc');
};
TREE.moveNodeToFolder = function(node)
{
if(typeof(TREE.option.beforeMovedToFolder) == 'function')
{
var pos = $(dragNode_source).prevAll(':not(.line)').size();
if(!TREE.option.beforeMovedToFolder($(node).parents('li:first'), $(dragNode_source), pos)) return false;
}
if(!TREE.option.docToFolderConvert && node[0].className.indexOf('doc')!=-1)
{
return true;
}else if(TREE.option.docToFolderConvert && node[0].className.indexOf('doc')!=-1){
TREE.convertToFolder(node);
}
TREE.checkNodeIsLast(dragNode_source[0]);
var lastLine = $('>ul >.line-last', node);
if(lastLine.size()>0)
{
TREE.moveNodeToLine(lastLine[0]);
}
};
TREE.moveNodeToLine = function(node){
if(typeof(TREE.option.beforeMovedToLine) == 'function')
{
var pos = $(dragNode_source).prevAll(':not(.line)').size();
if(!TREE.option.beforeMovedToLine($(node).parents('li:first'), $(dragNode_source), pos)) return false;
}
TREE.checkNodeIsLast(dragNode_source[0]);
TREE.checkLineIsLast(node);
var parent = $(dragNode_source).parents('li:first');
var line = $(dragNode_source).prev('.line');
$(node).before(dragNode_source);
$(dragNode_source).before(line);
node.className = node.className.replace('-over','');
var nodeSize = $('>ul >li', parent).not('.line, .line-last').filter(':visible').size();
if(TREE.option.docToFolderConvert && nodeSize==0)
{
TREE.convertToDoc(parent);
}else if(nodeSize==0)
{
parent[0].className=parent[0].className.replace('open','close');
$('>ul',parent).hide();
}
// added by Erik Dohmen (2BinBusiness.nl) select node
if($('span:first',dragNode_source).attr('class')=='text')
{
$('.active',TREE).attr('class','text');
$('span:first',dragNode_source).attr('class','active');
}
if(typeof(TREE.option.afterMove) == 'function')
{
var pos = $(dragNode_source).prevAll(':not(.line)').size();
TREE.option.afterMove($(node).parents('li:first'), $(dragNode_source), pos);
}
};
TREE.addNode = function(id, text, callback)
{
var temp_node = $('<li><ul><li id="'+id+'"><span>'+text+'</span></li></ul></li>');
TREE.setTreeNodes(temp_node);
dragNode_destination = TREE.getSelected();
dragNode_source = $('.doc-last',temp_node);
TREE.moveNodeToFolder(dragNode_destination);
temp_node.remove();
if(typeof(callback) == 'function')
{
callback(dragNode_destination, dragNode_source);
}
};
TREE.delNode = function(callback)
{
dragNode_source = TREE.getSelected();
TREE.checkNodeIsLast(dragNode_source[0]);
dragNode_source.prev().remove();
dragNode_source.remove();
if(typeof(callback) == 'function')
{
callback(dragNode_destination);
}
};
TREE.init = function(obj)
{
TREE.setTreeNodes(obj, false);
};
TREE.init(ROOT);
});
}
})(jQuery);

View file

@ -386,3 +386,59 @@ function xml2json(xml, tab, ignoreAttrib) {
var json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "");
return "{" + (tab ? json.replace(/\t/g, tab) : json.replace(/\t|\n/g, "")) + "}";
}
/**
* @brief exec_json (exec_xml와 같은 용도)
**/
(function($){
$.exec_json = function(action,data,func){
if(typeof(data) == 'undefined') data = {};
action = action.split(".");
if(action.length == 2){
if(show_waiting_message) {
$("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible');
}
$.extend(data,{module:action[0],act:action[1]});
$.ajax({
type:"POST"
,dataType:"json"
,url:request_uri
,contentType:"application/json"
,data:$.param(data)
,success : function(data){
$("#waitingforserverresponse").css('visibility','hidden');
if(data.error > 0) alert(data.message);
if($.isFunction(func)) func(data);
}
});
}
};
$.fn.exec_html = function(action,data,type){
if(typeof(data) == 'undefined') data = {};
if(!$.inArray(type, ['html','append','prepend'])) type = 'html';
var self = $(this);
action = action.split(".");
if(action.length == 2){
if(show_waiting_message) {
$("#waitingforserverresponse").html(waiting_message).css('top',$(document).scrollTop()+20).css('left',$(document).scrollLeft()+20).css('visibility','visible');
}
$.extend(data,{module:action[0],act:action[1]});
$.ajax({
type:"POST"
,dataType:"html"
,url:request_uri
,data:$.param(data)
,success : function(html){
$("#waitingforserverresponse").css('visibility','hidden');
self[type](html);
}
});
}
};
})(jQuery);

View file

@ -69,6 +69,7 @@
$lang->disable = 'Disable';
// Essential Words
$lang->menu = 'Menu';
$lang->no = 'No.';
$lang->notice = 'Notice';
$lang->secret = 'Secret';

View file

@ -68,6 +68,7 @@
$lang->disable = 'Desactivar'; //Desactivado
// Palabras Esenciales
$lang->menu = 'Menu';
$lang->no = 'Nº';
$lang->notice = 'Aviso'; //boletín, noticia
$lang->secret = 'Secreto';

View file

@ -69,6 +69,7 @@
$lang->disable = 'Invalide';
// Mots essentiels
$lang->menu = 'Menu';
$lang->no = 'No';
$lang->notice = 'Notice';
$lang->secret = 'Secret';

View file

@ -69,6 +69,7 @@
$lang->deaktivieren = 'Deaktivieren';
// Essential Words
$lang->menu = 'Menu';
$lang->no = 'Nein';
$lang->notice = 'Hinweis';
$lang->secret = 'Geheim';

View file

@ -69,6 +69,7 @@
$lang->disable = '不可';
// 基本用語
$lang->menu = 'Menu';
$lang->no = '番号';
$lang->notice = 'お知らせ';
$lang->secret = '非公開';

View file

@ -69,6 +69,7 @@
$lang->disable = '불가능';
// 기본 단어
$lang->menu = '메뉴';
$lang->no = '번호';
$lang->notice = '공지';
$lang->secret = '비밀';

View file

@ -69,6 +69,7 @@
$lang->disable = 'Выключено';
// Существенные слова
$lang->menu = 'Menu';
$lang->no = 'No.';
$lang->notice = 'Уведомление';
$lang->secret = 'Секрет';

View file

@ -69,6 +69,7 @@
$lang->disable = '禁用';
// 基本词语
$lang->menu = 'Menu';
$lang->no = '编号';
$lang->notice = '公告';
$lang->secret = '密帖';

View file

@ -69,6 +69,7 @@
$lang->disable = '禁用';
// 基本詞語
$lang->menu = 'Menu';
$lang->no = '編號';
$lang->notice = '公告';
$lang->secret = '秘密';

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 670 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,004 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

View file

@ -352,6 +352,7 @@
/**
* @brief 카테고리 이동
**/
/*
function procBoardAdminMoveCategory() {
$source_category_srl = Context::get('source_category_srl');
$target_category_srl = Context::get('target_category_srl');
@ -380,6 +381,71 @@
$this->add('xml_file', $xml_file);
$this->add('source_category_srl', $source_category_srl);
}
*/
function procBoardAdminMoveCategory() {
$source_category_srl = Context::get('source_srl');
// parent_srl 이 있으면 첫 자식으로 들어간다
$parent_category_srl = Context::get('parent_srl');
// target_srl 이 있으면 target_srl 아래로 형제로 들어간다
$target_category_srl = Context::get('target_srl');
$oDocumentModel = &getModel('document');
$oDocumentController = &getController('document');
$source_category = $oDocumentModel->getCategory($source_category_srl);
//parent_category_srl 의 첫 자식으로 넣자
if($parent_category_srl > 0 || ($parent_category_srl == 0 && $target_category_srl == 0)){
$parent_category = $oDocumentModel->getCategory($parent_category_srl);
$args->module_srl = $source_category->module_srl;
$args->parent_srl = $parent_category_srl;
$output = executeQuery('document.getChildCategoryMinListOrder', $args);
if(!$output->toBool()) return $output;
$args->list_order = (int)$output->data->list_order;
if(!$args->list_order) $args->list_order = 0;
$args->list_order--;
$source_args->category_srl = $source_category_srl;
$source_args->parent_srl = $parent_category_srl;
$source_args->list_order = $args->list_order;
$output = $oDocumentController->updateCategory($source_args);
if(!$output->toBool()) return $output;
// $target_category_srl의 아래동생으로
}else if($target_category_srl > 0){
$target_category = $oDocumentModel->getCategory($target_category_srl);
//$target_category의 아래 동생을 모두 내린다
$output = $oDocumentController->updateCategoryListOrder($target_category->module_srl, $target_category->list_order+1);
if(!$output->toBool()) return $output;
$source_args->category_srl = $source_category_srl;
$source_args->parent_srl = $target_category->parent_srl;
$source_args->list_order = $target_category->list_order+1;
$output = $oDocumentController->updateCategory($source_args);
if(!$output->toBool()) return $output;
}
// xml파일 재생성
$xml_file = $oDocumentController->makeCategoryFile($source_category->module_srl);
// return 변수 설정
$this->add('xml_file', $xml_file);
$this->add('source_category_srl', $source_category_srl);
}
/**
* @brief xml 파일을 갱신

View file

@ -56,7 +56,7 @@
// template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다.
$oTemplate = &TemplateHandler::getInstance();
$tpl = $oTemplate->compile($this->module_path.'tpl', 'category_info');
$tpl = str_replace("\n",'',$tpl);
// return 할 변수 설정
$this->add('tpl', $tpl);
}

View file

@ -198,7 +198,7 @@
Context::set('category_xml_file', $category_xml_file);
Context::addJsFile('./common/js/tree_menu.js');
Context::set('layout','none');
// Context::set('layout','none');
$this->setTemplateFile('category_list');
}

View file

@ -1,7 +1,7 @@
<!--%import("filter/insert.xml")-->
<!--#include("header.html")-->
<form action="./" method="post" onsubmit="return procFilter(this, window.insert)" id="fo_write">
<form action="./" method="post" onsubmit="return procFilter(this, insert)" id="fo_write">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="content" value="{$oDocument->getContentText()}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />

View file

@ -15,15 +15,8 @@
<p>{$lang->about_category_title}</p>
</td>
</tr>
<tr class="row2">
<th scope="row"><div>{$lang->expand}</div></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"><div>{$lang->category_group_srls} <input type="checkbox" onclick="XE.checkboxToggleAll('group_srls'); return false;" /></div></th>
<tr >
<th scope="row2"><div>{$lang->category_group_srls} <input type="checkbox" onclick="XE.checkboxToggleAll('group_srls'); return false;" /></div></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>
@ -33,14 +26,8 @@
</tr>
<tr class="row2">
<td scope="row" colspan="2" class="right">
<!--@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-->
</td>
</tr>
</table>

View file

@ -1,46 +1,39 @@
<!--#include("./header.html")-->
<!--%import("filter/insert_category.xml")-->
<!--%import("filter/delete_category.xml")-->
<!--%import("filter/move_category.xml")-->
<!--%import("css/board.css")-->
<!--%import("js/board_admin.js")-->
<!--%import("../../common/js/jquery.simple.tree.js",optimized=false)-->
<!--%import("../../common/css/jquery.simple.tree.css",optimized=false)-->
<!--%import("js/board_admin.js")-->
<script type="text/javascript">
var category_title = "{$lang->category}";
</script>
<h3>{$lang->board} <span class="gray">{$lang->cmd_management}</span></h3>
<div class="infoText">{nl2br($lang->about_board_category)}</div>
<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 class="infoText">{nl2br($lang->about_board_category)}
</div>
<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 -->
<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>
<span style="float:right"><a href="#" onclick="doReloadTreeCategory('{$module_info->module_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a></span>
<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}" />
<div id="category_list">
<div id="zone_category"></div>
<div id="menu">
<ul class="simpleTree">
<li class="root" id='tree_0'><span>{$lang->category}</span></li>
</ul>
</div>
<div id="category_info"></div>
<div id="category_info" style="position:absolute;top:300px; width:70%; right:20px"></div>
</form>
</div>
<script type="text/javascript">
loadTreeMenu("{$category_xml_file}", "category", "zone_category", category_title, '', doGetCategoryInfo, 0, doMoveTree);
var simpleTreeCollection;
var max_menu_depth = 999;
var lang_confirm_delete = "{$lang->confirm_delete}";
var xml_url = "{$category_xml_file}";
Tree(xml_url);
</script>
</div>

View file

@ -18,7 +18,7 @@
<!--@end-->
<li <!--@if($act=='dispBoardAdminBoardInfo'||$act=='dispBoardAdminInsertBoard')-->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')}" 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=='dispBoardAdminCategoryInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminCategoryInfo')}">{$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

@ -4,6 +4,169 @@
* @brief board 모듈의 관리자용 javascript
**/
function Tree(url){
// clear tree;
jQuery('#menu > ul > li > ul').remove();
if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery('<a href="#" class="add"><img src="./common/tpl/images/tree/iconAdd.gif" /></a>').bind("click",function(e){addNode(0,e);}).appendTo("ul.simpleTree > li");
//ajax get data and transeform ul il
jQuery.get(url,function(data){
jQuery(data).find("node").each(function(i){
var text = jQuery(this).attr("text");
var node_srl = jQuery(this).attr("node_srl");
var parent_srl = jQuery(this).attr("parent_srl");
var url = jQuery(this).attr("url");
// node
var node = jQuery('<li id="tree_'+node_srl+'"><span>'+text+'</span></li>');
// button
jQuery('<a href="#" class="add"><img src="./common/tpl/images/tree/iconAdd.gif" /></a>').bind("click",function(e){addNode(node_srl,e);}).appendTo(node);
jQuery('<a href="#" class="modify"><img src="./common/tpl/images/tree/iconModify.gif" /></a>').bind("click",function(e){
modifyNode(node_srl,e);
}).appendTo(node);
jQuery('<a href="#" class="delete"><img src="./common/tpl/images/tree/iconDel.gif" /></a>').bind("click",function(e){
deleteNode(node_srl);
}).appendTo(node);
// insert parent child
if(parent_srl>0){
if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('<ul>'));
jQuery('#tree_'+parent_srl+'> ul').append(node);
}else{
if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("<ul>").appendTo('#menu ul.simpleTree > li');
jQuery('#menu ul.simpleTree > li > ul').append(node);
}
});
//button show hide
jQuery("#menu li").each(function(){
if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide();
if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide();
});
// draw tree
simpleTreeCollection = jQuery('.simpleTree').simpleTree({
autoclose: false,
afterClick:function(node){
//alert("text-"+jQuery('span:first',node).text());
},
afterDblClick:function(node){
//alert("text-"+jQuery('span:first',node).text());
},
afterMove:function(destination, source, pos){
var module_srl = jQuery("#fo_category input[name=module_srl]").val();
var parent_srl = destination.attr('id').replace(/.*_/g,'');
var source_srl = source.attr('id').replace(/.*_/g,'');
var target = source.prevAll("li:not([class^=line])");
var target_srl = 0;
if(target.length >0){
target_srl = source.prevAll("li:not([class^=line])").get(0).id.replace(/.*_/g,'');
parent_srl = 0;
}
jQuery.exec_json("board.procBoardAdminMoveCategory",{ "module_srl":module_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl},
function(data){
if(data.error > 0) Tree(xml_url);
});
},
// i want you !! made by sol
beforeMovedToLine : function(destination, source, pos){
return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth);
},
// i want you !! made by sol
beforeMovedToFolder : function(destination, source, pos){
return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1);
},
afterAjax:function()
{
//alert('Loaded');
},
animate:true
,docToFolderConvert:true
});
// open all node
nodeToggleAll();
},"xml");
}
function addNode(node,e){
var params ={
"category_srl":0
,"parent_srl":node
,"module_srl":jQuery("#fo_category [name=module_srl]").val()
};
jQuery.exec_json('board.getBoardAdminCategoryTplInfo', params, function(data){
jQuery('#category_info').html(data.tpl);
});
}
function modifyNode(node,e){
var params ={
"category_srl":node
,"parent_srl":0
,"module_srl":jQuery("#fo_category [name=module_srl]").val()
};
jQuery.exec_json('board.getBoardAdminCategoryTplInfo', params, function(data){
jQuery('#category_info').html(data.tpl);
});
}
function nodeToggleAll(){
jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){
simpleTreeCollection[0].nodeToggle(this);
});
}
function deleteNode(node){
if(confirm(lang_confirm_delete){
var params ={
"category_srl":node
,"parent_srl":0
,"module_srl":jQuery("#fo_category [name=module_srl]").val()
};
jQuery.exec_json('board.procBoardAdminDeleteCategory', params, function(data){
if(data.error==0) Tree(xml_url);
});
}
}
/* 카테고리 아이템 입력후 */
function completeInsertCategory(ret_obj) {
jQuery('#category_info').html("");
Tree(xml_url);
}
function hideCategoryInfo() {
jQuery('#category_info').html("");
}
/* 모듈 생성 후 */
function completeInsertBoard(ret_obj) {
var error = ret_obj['error'];
@ -98,40 +261,9 @@ function doCartSetup(act_type) {
* 카테고리 관리
**/
/* 빈 카테고리 아이템 추가 */
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);
@ -143,10 +275,7 @@ function checkMousePosition(e) {
_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');
@ -164,26 +293,7 @@ function completeGetCategoryTplInfo(ret_obj, response_tags) {
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을 받음 */

View file

@ -879,16 +879,17 @@
$group_srls = $node->group_srls;
$mid = $node->mid;
$module_srl = $node->module_srl;
$parent_srl = $node->parent_srl;
// node->group_srls값이 있으면
if($group_srls) $group_check_code = sprintf('($is_admin==true||(is_array($group_srls)&&count(array_intersect($group_srls, array(%s)))))',$group_srls);
else $group_check_code = "true";
$attribute = sprintf(
'mid="%s" module_srl="%d" node_srl="%d" category_srl = "%d" text="<?php echo (%s?"%s":"")?>" url="%s" expand="%s" document_count="%d" ',
'mid="%s" module_srl="%d" node_srl="%d" parent_srl="%d" category_srl="%d" text="<?php echo (%s?"%s":"")?>" url="%s" expand="%s" document_count="%d" ',
$mid,
$module_srl,
$category_srl,
$parent_srl,
$category_srl,
$group_check_code,
$title,

View file

@ -0,0 +1,12 @@
<query id="getChildCategoryMinListOrder" action="select">
<tables>
<table name="document_categories" />
</tables>
<columns>
<column name="min(list_order)" alias="list_order" />
</columns>
<conditions>
<condition operation="equal" column="parent_srl" var="parent_srl" default="0" filter="number" notnull="notnull" />
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" pipe="and" />
</conditions>
</query>

View file

@ -237,47 +237,8 @@
$target_srl = Context::get('target_srl');
if(!$menu_srl || !$mode || !$target_srl) return new Object(-1,'msg_invalid_request');
// 원본 메뉴들을 구함
$oMenuAdminModel = &getAdminModel('menu');
$oMenuAdminController = &getAdminController('menu');
$target_item = $oMenuAdminModel->getMenuItemInfo($target_srl);
if($target_item->menu_item_srl != $target_srl) return new Object(-1,'msg_invalid_request');
// 위치 이동 (순서 조절)
if($mode == 'move') {
$args->parent_srl = $parent_srl;
$args->menu_srl = $menu_srl;
if($source_srl) {
$source_item = $oMenuAdminModel->getMenuItemInfo($source_srl);
if($source_item->menu_item_srl != $source_srl) return new Object(-1,'msg_invalid_request');
$args->listorder = $source_item->listorder-1;
} else {
$output = executeQuery('menu.getMaxListorder', $args);
if(!$output->toBool()) return $output;
$args->listorder = (int)$output->data->listorder;
if(!$args->listorder) $args->listorder= 0;
}
$args->parent_srl = $parent_srl;
$output = executeQuery('menu.updateMenuItemListorder', $args);
if(!$output->toBool()) return $output;
$args->parent_srl = $parent_srl;
$args->menu_item_srl = $target_srl;
$output = executeQuery('menu.updateMenuItemNode', $args);
if(!$output->toBool()) return $output;
// 자식으로 추가
} elseif($mode == 'insert') {
$args->menu_item_srl = $target_srl;
$args->parent_srl = $parent_srl;
$args->listorder = -1*getNextSequence();
$output = executeQuery('menu.updateMenuItemNode', $args);
if(!$output->toBool()) return $output;
}
$xml_file = $oMenuAdminController->makeXmlFile($menu_srl);
$xml_file = $oMenuAdminController->moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode);
$this->add('xml_file', $xml_file);
}

View file

@ -91,6 +91,7 @@
$this->setTemplateFile('menu_manage');
}
function dispHomepageBottomMenu() {
// 메뉴 정보 가져오기
$menu_srl = $this->homepage_info->second_menu_srl;

View file

@ -1,8 +1,5 @@
@charset "utf-8";
#menu ul { margin-top:10px; }
#menu li { padding-bottom:10px; }
#menuItem { visibility:hidden; position:absolute; left:0; top:0; background-color:#FFFFFF; z-index:1000; border:2px solid #DDDDDD; padding:10px;}
#menu_normal_btn_zone { display:none; }
#menu_hover_btn_zone { display:none; }

View file

@ -1,206 +1,107 @@
var max_menu_depth = 1;
var menuList = new Array();
var mousePos = {x:0,y:0}
function chkMousePosition(evt) {
var e = new xEvent(evt);
mousePos = {x:e.pageX, y:e.pageY};
function homepageLoadMenuInfo(url){
// clear tree;
jQuery('#menu > ul > li > ul').remove();
if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery('<a href="#" class="add"><img src="./common/tpl/images/tree/iconAdd.gif" /></a>').bind("click",function(e){homepageAddMenu(0,e);}).appendTo("ul.simpleTree > li");
var pobj = e.target;
while(pobj) {
pobj = pobj.parentNode;
if(pobj && pobj.id == 'menuItem') return;
//ajax get data and transeform ul il
jQuery.get(url,function(data){
jQuery(data).find("node").each(function(i){
var text = jQuery(this).attr("text");
var node_srl = jQuery(this).attr("node_srl");
var parent_srl = jQuery(this).attr("parent_srl");
var url = jQuery(this).attr("url");
// node
var node = jQuery('<li id="tree_'+node_srl+'"><span>'+text+'</span></li>');
// button
jQuery('<a href="#" class="add"><img src="./common/tpl/images/tree/iconAdd.gif" /></a>').bind("click",function(e){homepageAddMenu(node_srl,e);}).appendTo(node);
jQuery('<a href="#" class="modify"><img src="./common/tpl/images/tree/iconModify.gif" /></a>').bind("click",function(e){
jQuery.exec_json("homepage.getHomepageMenuItem",{ "node_srl":node_srl},function(data){
data.menu_info['mode'] = 'update';
menuFormInsert(data.menu_info);
jQuery("#menuItem").css('position','absolute').css('visibility','visible').css('top',e.pageY - jQuery("#header").height() - 70).css('left',e.pageX - jQuery("#navigation").width() -40);
jQuery('#itemAttr4').css("display",'block');
});
}).appendTo(node);
jQuery('<a href="#" class="delete"><img src="./common/tpl/images/tree/iconDel.gif" /></a>').bind("click",function(e){homepageDeleteMenu(node_srl);}).appendTo(node);
// insert parent child
if(parent_srl>0){
if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('<ul>'));
jQuery('#tree_'+parent_srl+'> ul').append(node);
}else{
if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("<ul>").appendTo('#menu ul.simpleTree > li');
jQuery('#menu ul.simpleTree > li > ul').append(node);
}
hideMenuItem();
}
});
function homepageLoadMenuInfo(xml_file) {
var oXml = new xml_handler();
oXml.reset();
oXml.xml_path = xml_file;
oXml.request(completeHomepageLoadMenuInfo, oXml);
}
//button show hide
jQuery("#menu li").each(function(){
if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide();
if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide();
});
function completeHomepageLoadMenuInfo(oXml) {
var waiting_obj = xGetElementById("waitingforserverresponse");
if(waiting_obj) waiting_obj.style.visibility = "hidden";
var xmlDoc = oXml.getResponseXml();
if(!xmlDoc) return null;
// draw tree
simpleTreeCollection = jQuery('.simpleTree').simpleTree({
autoclose: false,
afterClick:function(node){
//alert("text-"+jQuery('span:first',node).text());
},
afterDblClick:function(node){
//alert("text-"+jQuery('span:first',node).text());
},
afterMove:function(destination, source, pos){
jQuery('#menuItem').css("visibility",'hidden');
// node 태그에 해당하는 값들을 가져와서 html을 작성
var node_list = xmlDoc.getElementsByTagName("node");
if(node_list.length<1) return;
var menu_srl = jQuery("#fo_menu input[name=menu_srl]").val();
var parent_srl = destination.attr('id').replace(/.*_/g,'');
var target_srl = source.attr('id').replace(/.*_/g,'');
var brothers = jQuery('#'+destination.attr('id')+' > ul > li:not([class^=line])').length;
var mode = brothers >1 ? 'move':'insert';
var source_srl = pos == 0 ? 0: source.prevAll("li:not(.line)").get(0).id.replace(/.*_/g,'');
// select 내용 없앰
xInnerHtml('menu','');
var root = xmlDoc.getElementsByTagName("root")[0];
root.setAttribute('node_srl',0);
root.setAttribute('parent_srl',0);
xGetElementById('menu').appendChild(getGabItem(0,0,0));
homepageInsertMenuObject(xGetElementById('menu'), root, 0);
}
function getGabItem(parent_srl, up_srl, depth) {
if(typeof(parent_srl)=='undefined' || !parent_srl) parent_srl = 0;
if(typeof(up_srl)=='undefined' || !up_srl) up_srl = 0;
if(typeof(depth)=='undefined' || !depth) depth = 0;
var gabObj = xCreateElement('div');
gabObj.id = 'gab_'+parent_srl+'_'+up_srl;
gabObj.style.cursor = "pointer";
gabObj.style.width = '100%';
gabObj.style.height = '1px';
gabObj.style.marign = '5px 0 0 0';
gabObj.style.padding = '0 0 5px 0';
gabObj.style.overflow = "hidden";
gabObj.style.whitespace = "nowrap";
return gabObj;
}
// root부터 시작해서 recursive하게 노드를 표혐
function homepageInsertMenuObject(drawObj, parent_node, depth) {
for (var i=0; i< parent_node.childNodes.length; i++) {
var html = "";
var node = parent_node.childNodes.item(i);
if(node.nodeName!="node") continue;
var node_srl = node.getAttribute("node_srl");
var parent_srl = node.getAttribute("parent_srl");
var text = node.getAttribute("text");
var url = node.getAttribute("url");
if(!text) continue;
var itemObj = xCreateElement('div');
itemObj.style.margin = "0 0 0 "+(depth*20)+"px";
if(parent_srl>0 && i<1) itemObj.appendChild(getGabItem(parent_srl, 0, depth));
var textObj = xCreateElement('div');
textObj.className = "page";
textObj.style.cursor = "pointer";
textObj.id = "node_"+node_srl;
textObj.style.padding = "5px 0 5px 20px";
xInnerHtml(textObj, text);
if(depth < max_menu_depth-1)
xInnerHtml(textObj, xInnerHtml(textObj) + '<a href="#" onclick="homepageAddMenu('+node_srl+'); return false;" class="insert"><img src="./common/tpl/images/blank.gif" alt="" /></a> ');
xInnerHtml(textObj, xInnerHtml(textObj) + '<a href="#" onclick="homepageModifyMenu('+node_srl+'); return false;" class="modify"><img src="./common/tpl/images/blank.gif" alt="" /></a> ');
if(!node.hasChildNodes()) {
xInnerHtml(textObj, xInnerHtml(textObj) + '<a href="#" onclick="homepageDeleteMenu('+node_srl+'); return false;" class="delete"><img src="./common/tpl/images/blank.gif" alt="" /></a> ');
jQuery.exec_json("homepage.procHomepageMenuItemMove",{ "menu_srl":menu_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl,"mode":mode},
function(data){
if(data.error>0){
homepageLoadMenuInfo(xml_url);
}
itemObj.appendChild(textObj);
});
},
if(node.hasChildNodes()) homepageInsertMenuObject(itemObj, node, depth+1);
itemObj.appendChild(getGabItem(parent_srl, node_srl, depth));
// i want you !! made by sol
beforeMovedToLine : function(destination, source, pos){
return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth);
},
drawObj.appendChild(itemObj);
}
// i want you !! made by sol
beforeMovedToFolder : function(destination, source, pos){
return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1);
},
afterAjax:function()
{
//alert('Loaded');
},
animate:true
,docToFolderConvert:true
});
// open all node
nodeToggleAll();
},"xml");
}
function homepageAddMenu(node_srl) {
menuFormReset();
var obj = new Array();
obj['mode'] = 'insert';
if(typeof(node_srl)!='undefined' && node_srl > 0) {
obj['parent_srl'] = node_srl;
}
menuFormInsert(obj)
showMenuItem();
}
function homepageModifyMenu(node_srl) {
var params = new Array();
params['node_srl'] = node_srl;
var response_tags = new Array('error','message','menu_info');
exec_xml('homepage','getHomepageMenuItem', params, completeModifyMenu, response_tags);
}
function completeModifyMenu(ret_obj) {
var menu_info = ret_obj['menu_info'];
menu_info['mode'] = 'update';
menuFormInsert(menu_info)
showMenuItem();
showMenuButton();
}
function homepageDeleteMenu(node_srl) {
var fo_obj = xGetElementById('menu_item_form');
fo_obj.menu_item_srl.value = node_srl;
procFilter(fo_obj, delete_menu_item);
}
function completeChangeLayout(ret_obj) {
location.reload();
}
function hideMenuItem() {
xGetElementById('menuItem').style.visibility = 'hidden';
menuFormReset();
}
function showMenuButton() {
xGetElementById('itemAttr4').style.display = 'block';
}
function showMenuItem() {
var obj = xGetElementById('menuItem');
xLeft(obj, mousePos.x - xWidth('navigation') - 40);
xTop(obj, mousePos.y - xHeight('header') - 70 );
obj.style.visibility = 'visible';
}
function menuFormReset() {
var fo_obj = xGetElementById("fo_menu");
fo_obj.parent_srl.value = '';
fo_obj.menu_item_srl.value = '';
fo_obj.mode.value = '';
var names = xGetElementsByClassName("menu_names");
for(var i in names) names[i].value = "";
fo_obj.browser_title.value = '';
fo_obj.menu_open_window.checked = false;
fo_obj.menu_expand.checked = false;
for(var i=0; i<fo_obj.group_srls.length;i++) fo_obj.group_srls[i].checked = false;
fo_obj.module_type.selectedIndex = 0;
fo_obj.module_type.disabled = "";
fo_obj.module_id.value = '';
fo_obj.url.value = '';
xGetElementById('itemAttr3').style.display = "none";
xGetElementById("menu_normal_btn_zone").style.display = "none";
xGetElementById('menu_normal_btn_img').src = "";
xGetElementById("menu_hover_btn_zone").style.display = "none";
xGetElementById('menu_hover_btn_img').src = "";
xGetElementById("menu_active_btn_zone").style.display = "none";
xGetElementById('menu_active_btn_img').src = "";
xGetElementById('itemAttr4').style.display = 'none';
fo_obj.reset();
}
function menuFormInsert(obj) {
if(typeof(obj)=='undefined') return;
var fo_obj = xGetElementById("fo_menu");
var fo_obj = jQuery("#fo_menu").get(0);
if(typeof(obj.parent_srl)!='undefined') fo_obj.parent_srl.value = obj.parent_srl;
if(typeof(obj.menu_item_srl)!='undefined') fo_obj.menu_item_srl.value = obj.menu_item_srl;
@ -232,324 +133,114 @@ function menuFormInsert(obj) {
fo_obj.module_type.selectedIndex = 2;
if(typeof(obj.url)!='undefined') fo_obj.url.value = obj.url;
fo_obj.module_type.disabled = "disabled";
xGetElementById('itemAttr2').style.display = 'none';
xGetElementById('itemAttr3').style.display = 'block';
jQuery('#itemAttr2').css('display','none');
jQuery('#itemAttr3').css('display','block');
} else {
if(obj.module_type == 'page') fo_obj.module_type.selectedIndex = 1;
else fo_obj.module_type.selectedIndex = 1;
if(typeof(obj.module_id)!='undefined') fo_obj.module_id.value = obj.module_id;
fo_obj.module_type.disabled = "disabled";
xGetElementById('itemAttr2').style.display = 'block';
xGetElementById('itemAttr3').style.display = 'none';
jQuery('#itemAttr2').css('display','block');
jQuery('#itemAttr3').css('display','none');
}
}
if(typeof(obj.normal_btn)!='undefined' && obj.normal_btn) {
xGetElementById('menu_normal_btn_img').src = obj.normal_btn;
xGetElementById('menu_normal_btn_zone').style.display = "block";
xGetElementById('itemAttr4').style.display = 'block';
jQuery('#menu_normal_btn_img').attr("src",obj.normal_btn);
jQuery('#menu_normal_btn_zone','#itemAttr4').css("display",'block');
fo_obj.normal_btn.value = obj.normal_btn;
}
if(typeof(obj.hover_btn)!='undefined' && obj.hover_btn) {
xGetElementById('menu_hover_btn_img').src = obj.hover_btn;
xGetElementById('menu_hover_btn_zone').style.display = "block";
xGetElementById('itemAttr4').style.display = 'block';
jQuery('#menu_hover_btn_img').attr("src",obj.hover_btn);
jQuery('#menu_hover_btn_zone','#itemAttr4').css("display",'block');
fo_obj.hover_btn.value = obj.hover_btn;
}
if(typeof(obj.active_btn)!='undefined' && obj.active_btn) {
xGetElementById('menu_active_btn_img').src = obj.active_btn;
xGetElementById('menu_active_btn_zone').style.display = "block";
xGetElementById('itemAttr4').style.display = 'block';
jQuery('#menu_active_btn_img').attr("src",obj.active_btn);
jQuery('#menu_active_btn_zone','#itemAttr4').css("display",'block');
fo_obj.active_btn.value = obj.active_btn;
}
}
function changeMenuType(obj) {
if(obj.selectedIndex == 2) {
xGetElementById('itemAttr2').style.display = 'none';
xGetElementById('itemAttr3').style.display = 'block';
return;
}
xGetElementById('itemAttr2').style.display = 'block';
xGetElementById('itemAttr3').style.display = 'none';
function menuFormReset() {
var fo_obj = jQuery("#fo_menu").get(0);
fo_obj.parent_srl.value = '';
fo_obj.menu_item_srl.value = '';
fo_obj.mode.value = '';
jQuery(".menu_names").each(function(){ jQuery(this).val(''); });
fo_obj.browser_title.value = '';
fo_obj.menu_open_window.checked = false;
fo_obj.menu_expand.checked = false;
for(var i=0; i<fo_obj.group_srls.length;i++) fo_obj.group_srls[i].checked = false;
fo_obj.module_type.selectedIndex = 0;
fo_obj.module_type.disabled = "";
fo_obj.module_id.value = '';
fo_obj.url.value = '';
jQuery('#itemAttr3').css("display","none");
jQuery('#menu_normal_btn_zone','#menu_hover_btn_zone','#menu_active_btn_zone').css("display","none");
jQuery('#menu_normal_btn_img','#menu_hover_btn_img','#menu_active_btn_img').attr("src","");
jQuery('#itemAttr4').css("display","none");
fo_obj.reset();
}
function completeInsertMenuItem(ret_obj) {
var xml_file = ret_obj['xml_file'];
function completeInsertMenuItem(data) {
var xml_file = data['xml_file'];
if(!xml_file) return;
hideMenuItem();
homepageLoadMenuInfo(xml_file);
homepageLoadMenuInfo(xml_url);
jQuery('#menuItem').css("visibility",'hidden');
menuFormReset();
}
function doHomepageMenuUploadButton(obj) {
// 이미지인지 체크
if(!/\.(gif|jpg|jpeg|png)$/i.test(obj.value)) return alert(alertImageOnly);
var fo_obj = xGetElementById("fo_menu");
var act = fo_obj.act.value;
fo_obj.act.value = "procHomepageMenuUploadButton";
fo_obj.target.value = obj.name;
fo_obj.submit();
fo_obj.act.value = act;
fo_obj.target.value = "";
function homepageAddMenu(node_srl,e) {
menuFormReset();
var obj = new Array();
obj['mode'] = 'insert';
if(typeof(node_srl)!='undefined' && node_srl > 0) {
obj['parent_srl'] = node_srl;
}
menuFormInsert(obj);
jQuery("#menuItem").css('position','absolute').css('visibility','visible').css('top',e.pageY - jQuery("#header").height() - 70).css('left',e.pageX - jQuery("#navigation").width() -40);
jQuery('#itemAttr4').css("display",'block');
}
/* 메뉴 이미지 업로드 후처리 */
function completeMenuUploadButton(target, filename) {
var column_name = target.replace(/^menu_/,'');
var fo_obj = xGetElementById("fo_menu");
var zone_obj = xGetElementById(target+'_zone');
var img_obj = xGetElementById(target+'_img');
fo_obj[column_name].value = filename;
var img = new Image();
img.src = filename;
img_obj.src = img.src;
zone_obj.style.display = "block";
}
function doDeleteButton(target) {
var fo_obj = xGetElementById("fo_menu");
var col_name = target.replace(/^menu_/,'');
var params = new Array();
params['target'] = target;
params['menu_srl'] = fo_obj.menu_srl.value;
params['menu_item_srl'] = fo_obj.menu_item_srl.value;
params['filename'] = fo_obj[col_name].value;
var response_tags = new Array('error','message', 'target');
exec_xml('homepage','procHomepageDeleteButton', params, completeDeleteButton, response_tags);
}
function completeDeleteButton(ret_obj) {
var target = ret_obj['target'];
var column_name = target.replace(/^menu_/,'');
var fo_obj = xGetElementById("fo_menu");
var zone_obj = xGetElementById(target+'_zone');
var img_obj = xGetElementById(target+'_img');
fo_obj[column_name].value = "";
img_obj.src = "";
zone_obj.style.display = "none";
}
/* drag item */
xAddEventListener(document, 'mousedown', dragItem);
var dragObj = null;
var dragTarget = null;
var dragTmpObjectect = new Array();
var dragDisappear = 0;
function dragItem(evt) {
var e = new xEvent(evt);
if(!e.target) return;
var obj = e.target;
while(obj) {
if(obj && obj.nodeName == 'DIV' && typeof(obj.id)!='undefined' && obj.id.indexOf('node_')>-1) {
dragEnable(obj, evt);
return;
}
obj = obj.parentNode;
}
}
function getDragTmpObject(obj) {
if(!dragTmpObjectect[obj.id]) {
tmpObj = xCreateElement('div');
tmpObj.id = obj.id + '_tmp';
tmpObj.style.display = 'none';
tmpObj.style.position = 'absolute';
tmpObj.style.opacity = 0.5;
tmpObj.style.filter = 'alpha(opacity=50)';
tmpObj.style.cursor = "pointer";
xInnerHtml(tmpObj,xInnerHtml(obj));
document.body.appendChild(tmpObj);
dragTmpObjectect[obj.id] = tmpObj;
}
return dragTmpObjectect[obj.id];
}
function removeDragTmpObject(obj) {
if(!dragTmpObjectect[obj.id]) return;
dragTmpObjectect[obj.id] = null;
}
function dragEnable(obj, evt) {
if(obj.id.indexOf('node_')<0) return;
obj.draggable = true;
dragObj = obj;
dragObj.id = obj.id;
var e = new xEvent(evt);
xPreventDefault(evt);
obj.xDPX = e.pageX;
obj.xDPY = e.pageY;
xAddEventListener(document, 'mouseup', dragUp, false);
xAddEventListener(document, 'mousemove', dragMove, false);
var tmpObj = getDragTmpObject(obj);
xLeft(tmpObj, e.pageX+1);
xTop(tmpObj, e.pageY+1);
xWidth(tmpObj, xWidth(obj));
xHeight(tmpObj, xHeight(obj));
xDisplay(tmpObj, 'block');
}
function dragMove(evt) {
if(!dragObj) return;
var e = new xEvent(evt);
var target = e.target;
var obj = dragObj;
var tobj = getDragTmpObject(obj);
xLeft(tobj, e.pageX+1);
xTop(tobj, e.pageY+1);
if(target && target.nodeName == "DIV" && typeof(target.id)!='undefined' && (target.id.indexOf('gab_')>-1||target.id.indexOf('node_')>-1)) {
var isChilds = false;
var pObj = target.parentNode;
while(pObj) {
if(pObj.firstChild && typeof(pObj.firstChild.id)!='undefined' && pObj.firstChild.id == dragObj.id) {
isChilds = true;
break;
}
pObj = pObj.parentNode;
}
if(dragTarget) {
dragTarget.style.backgroundColor = '';
dragTarget.style.borderTop = '0px solid #000';
dragTarget = null;
}
if(!isChilds) {
dragTarget = target;
if(target.id.indexOf('gab_')>-1) {
dragTarget.style.borderTop = '1px solid #000';
} else {
dragTarget.style.backgroundColor = '#DDDDDD';
}
}
} else if(dragTarget) {
dragTarget.style.backgroundColor = '';
dragTarget.style.borderTop = '0px solid #000';
dragTarget = null;
}
xPreventDefault(evt);
}
function dragUp(evt) {
if(!dragObj) return;
if(dragTarget && dragTarget.id != dragObj.id && confirm(confirmMenuMove)) {
var mode = null;
if(dragTarget.id.indexOf('gab_')>-1) mode = 'move';
else mode = 'insert';
var tmpArr = dragTarget.id.split('_');
var parent_srl = tmpArr[1];
var source_srl = mode=='move'?tmpArr[2]:0;
var tmpArr = dragObj.id.split('_');
var target_srl = tmpArr[1];
var params = new Array();
params['menu_srl'] = xGetElementById('fo_menu').menu_srl.value;
params['mode'] = mode;
params['parent_srl'] = parent_srl;
params['source_srl'] = source_srl;
params['target_srl'] = target_srl;
var response_tags = new Array('error','message','xml_file');
exec_xml('homepage','procHomepageMenuItemMove', params, completeInsertMenuItem, response_tags);
}
var tobj = getDragTmpObject(dragObj);
xRemoveEventListener(document, 'mouseup', dragUp, false);
xRemoveEventListener(document, 'mousemove', dragMove, false);
dragDisappear = dragDisapearObject(tobj, dragObj);
var e = new xEvent(evt);
xPreventDefault(evt);
dragObj = null;
if(dragTarget) {
dragTarget.style.backgroundColor = '';
dragTarget.style.borderTop = '0px solid #000';
dragTarget = null;
function homepageDeleteMenu(node_srl) {
if(confirm(lang_confirm_delete)){
jQuery('#menuItem').css("visibility",'hidden');
var fo_obj = jQuery('#menu_item_form').get(0);
fo_obj.menu_item_srl.value = node_srl;
procFilter(fo_obj, delete_menu_item);
}
}
// 스르르 사라지게 함;;
function dragDisapearObject(obj, tobj) {
var it = 20;
var ib = 20;
function nodeToggleAll(){
jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){
simpleTreeCollection[0].nodeToggle(this);
});
}
var x = parseInt(xPageX(obj),10);
var y = parseInt(xPageY(obj),10);
var ldt = (x - parseInt(xPageX(tobj),10)) / ib;
var tdt = (y - parseInt(xPageY(tobj),10)) / ib;
function doReloadTreeMenu(){
var menu_srl = jQuery("#fo_menu input[name=menu_srl]").val();
return setInterval(function() {
if(ib < 1) {
clearInterval(dragDisappear);
xDisplay(obj, 'none');
removeDragTmpObject(tobj);
return;
jQuery.exec_json("menu.procMenuAdminMakeXmlFile",{ "menu_srl":menu_srl},
function(data){
homepageLoadMenuInfo(xml_url);
}
ib -= 3;
x-=ldt;
y-=tdt;
xLeft(obj, x);
xTop(obj, y);
}, it/ib);
);
}
function completeInsertBoard(ret_obj) {
alert(ret_obj['message']);
location.reload();
function closeTreeMenuInfo(){
jQuery('#menuItem').css("visibility",'hidden');
}
function completeInsertPage(ret_obj) {
alert(ret_obj['message']);
location.reload();
}
function doDeleteGroup(group_srl) {
var fo_obj = xGetElementById('fo_group');
fo_obj.group_srl.value = group_srl;
procFilter(fo_obj, delete_group);
}
function completeInsertGroup(ret_obj) {
location.href = current_url.setQuery('group_srl','');
}
function completeDeleteGroup(ret_obj) {
location.href = current_url.setQuery('group_srl','');
}
function completeInsertGrant(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
alert(message);
}

View file

@ -1,20 +1,24 @@
<!--%import("./filter/insert_menu_item.xml")-->
<!--%import("./filter/delete_menu_item.xml")-->
<!--%import("./filter/move_up_menu_item.xml")-->
<!--%import("./filter/move_down_menu_item.xml")-->
<!--%import("../../../../common/js/jquery.simple.tree.js",optimized=false)-->
<!--%import("../../../../common/css/jquery.simple.tree.css",optimized=false)-->
<h3 class="title">{$lang->cmd_homepage_menus[$act]}</h3>
<p class="infoText">{$lang->about_homepage_act[$act]}</p>
<span style="float:right"><a href="#" onclick="doReloadTreeMenu('{$menu_info->menu_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a></span>
<form method="post" action="./" id="menu_item_form">
<input type="hidden" name="menu_item_srl" value="" />
</form>
<form method="post" action="./" id="menu_form">
<input type="hidden" name="menu_srl" value="{$menu_info->menu_srl}" />
<div id="menu"></div>
<div id="menu">
<ul class="simpleTree">
<li class="root" id='tree_0'><span>{$lang->menu}</span></li>
</ul>
</div>
<br />
<a href="#" onclick="homepageAddMenu(); return false;" class="button blue"><span>{$lang->cmd_add_new_menu}</span></a>
</form>
<div id="menuItem">
@ -144,20 +148,21 @@
<tr>
<td>
<span class="button green"><input type="submit" value="{$lang->cmd_save}" /></span>
<a href="#" onclick="hideMenuItem();return false" class="button red"><span>{$lang->cmd_close}</span></a>
<a href="#" onclick="closeTreeMenuInfo()" class="button red"><span>{$lang->cmd_close}</span></a>
</td>
</tr>
</table>
</form>
</div>
<iframe id='tmp_upload_iframe' name='tmp_upload_iframe' style='display:none;width:1px;height:1px;position:absolute;top:-10px;left:-10px'></iframe>
<script type="text/javascript">
max_menu_depth = {$menu_max_depth};
xAddEventListener(window,'load',function() { homepageLoadMenuInfo("{$menu_info->xml_file}"); } );
xAddEventListener(document,'mousedown',chkMousePosition);
var alertImageOnly = "{$lang->alert_image_only}";
var confirmMenuMove = "{$lang->confirm_move}";
var max_menu_depth = 999; //{$menu_max_depth};
var simpleTreeCollection;
var alertImageOnly = "{$lang->alert_image_only}";
var confirmMenuMove = "{$lang->confirm_move}";
var lang_confirm_delete = "{$lang->confirm_delete}";
var xml_url = "{$menu_info->xml_file}";
homepageLoadMenuInfo(xml_url);
</script>

View file

@ -209,6 +209,7 @@
/**
* @brief 메뉴의 메뉴를 이동
**/
/*
function procMenuAdminMoveItem() {
// 변수 설정
$menu_id = Context::get('menu_id');
@ -241,6 +242,65 @@
$this->add('xml_file', $xml_file);
$this->add('source_item_srl', $source_item_srl);
}
*/
function procMenuAdminMoveItem() {
$menu_srl = Context::get('menu_srl');
$mode = Context::get('mode');
$parent_srl = Context::get('parent_srl');
$source_srl = Context::get('source_srl');
$target_srl = Context::get('target_srl');
if(!$menu_srl || !$mode || !$target_srl) return new Object(-1,'msg_invalid_request');
$this->moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode);
}
function moveMenuItem($menu_srl,$parent_srl,$source_srl,$target_srl,$mode){
// 원본 메뉴들을 구함
$oMenuAdminModel = &getAdminModel('menu');
$target_item = $oMenuAdminModel->getMenuItemInfo($target_srl);
if($target_item->menu_item_srl != $target_srl) return new Object(-1,'msg_invalid_request');
// 위치 이동 (순서 조절)
if($mode == 'move') {
$args->parent_srl = $parent_srl;
$args->menu_srl = $menu_srl;
if($source_srl) {
$source_item = $oMenuAdminModel->getMenuItemInfo($source_srl);
if($source_item->menu_item_srl != $source_srl) return new Object(-1,'msg_invalid_request');
$args->listorder = $source_item->listorder-1;
} else {
$output = executeQuery('menu.getMaxListorder', $args);
if(!$output->toBool()) return $output;
$args->listorder = (int)$output->data->listorder;
if(!$args->listorder) $args->listorder= 0;
}
$args->parent_srl = $parent_srl;
$output = executeQuery('menu.updateMenuItemListorder', $args);
if(!$output->toBool()) return $output;
$args->parent_srl = $parent_srl;
$args->menu_item_srl = $target_srl;
$output = executeQuery('menu.updateMenuItemNode', $args);
if(!$output->toBool()) return $output;
// 자식으로 추가
} elseif($mode == 'insert') {
$args->menu_item_srl = $target_srl;
$args->parent_srl = $parent_srl;
$args->listorder = -1*getNextSequence();
$output = executeQuery('menu.updateMenuItemNode', $args);
if(!$output->toBool()) return $output;
}
$xml_file = $this->makeXmlFile($menu_srl);
return $xml_file;
// $this->add('xml_file', $xml_file);
}
/**
* @brief xml 파일을 갱신

View file

@ -152,7 +152,8 @@
$tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_item_info');
// return 할 변수 설정
$this->add('tpl', $tpl);
$this->add('tpl', str_replace("\n"," ",$tpl));
}
}

View file

@ -71,7 +71,6 @@
Context::set('menu_info', $menu_info);
// 레이아웃을 팝업으로 지정
Context::set('layout','none');
$this->setTemplateFile('menu_management');
}

View file

@ -1,5 +1,6 @@
<!--%import("filter/delete_menu.xml")-->
<!--%import("js/menu_admin.js")-->
<!--#include("header.html")-->
<!-- 정보 -->
@ -26,7 +27,7 @@
<!--@foreach($menu_list as $no => $val)-->
<tr class="row{$cycle_idx}">
<td class="number center">{$no}</td>
<td><a href="{getUrl('act','dispMenuAdminManagement','menu_srl',$val->menu_srl)}" onclick="winopen(this.href,'MenuManage','width=850,height=800,resizable=yes,scrollbars=yes,toolbars=no');return false;">{htmlspecialchars($val->title)}</a></td>
<td><a href="{getUrl('act','dispMenuAdminManagement','menu_srl',$val->menu_srl)}">{htmlspecialchars($val->title)}</a></td>
<td class="date center nowrap">{zdate($val->regdate,"Y-m-d")}</td>
<td class="delete center"><a href="#" onclick="doDeleteMenu('{$val->menu_srl}');return false;">{$lang->cmd_delete}</a></td>
</tr>

View file

@ -1,12 +1,4 @@
/* 메뉴 입력후 */
function completeInsertMenu(ret_obj) {
var menu_srl = ret_obj['menu_srl'];
alert(ret_obj['message']);
location.href = current_url.setQuery('act','dispMenuAdminContent');
//var url = current_url.setQuery('act','dispMenuAdminManagement').setQuery('menu_srl',menu_srl);
//window.open(url);
}
/* 메뉴 삭제 */
function doDeleteMenu(menu_srl) {
@ -69,9 +61,7 @@ function checkMousePosition(e) {
*/
function hideCategoryInfo() {
var obj = xGetElementById('menu_zone_info');
xInnerHtml(obj,'');
obj.style.display = "none";
jQuery("#menu_zone_info").html("");
}
function completeGetMenuItemTplInfo(ret_obj, response_tags) {
@ -104,29 +94,6 @@ function completeGetMenuItemTplInfo(ret_obj, response_tags) {
*/
}
/* 메뉴 아이템 입력후 */
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'];
var parent_srl = ret_obj['parent_srl'];
if(!xml_file) return;
loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, '', doGetMenuItemInfo, menu_item_srl, doMoveTree);
if(!menu_srl) xInnerHtml("menu_zone_info", "");
else {
var params = {node_srl:menu_item_srl, parent_srl:parent_srl}
doGetMenuItemInfo('menu', params)
}
if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter();
}
/* 메뉴를 드래그하여 이동한 후 실행할 함수 , 이동하는 item_srl과 대상 item_srl을 받음 */
function doMoveTree(menu_id, source_item, target_item) {
var fo_obj = xGetElementById("fo_move_menu");

View file

@ -0,0 +1,155 @@
function Tree(url){
// clear tree;
jQuery('#menu > ul > li > ul').remove();
if(jQuery("ul.simpleTree > li > a").size() ==0)jQuery('<a href="#" class="add"><img src="./common/tpl/images/tree/iconAdd.gif" /></a>').bind("click",function(e){addNode(0,e);}).appendTo("ul.simpleTree > li");
//ajax get data and transeform ul il
jQuery.get(url,function(data){
jQuery(data).find("node").each(function(i){
var text = jQuery(this).attr("text");
var node_srl = jQuery(this).attr("node_srl");
var parent_srl = jQuery(this).attr("parent_srl");
var url = jQuery(this).attr("url");
// node
var node = jQuery('<li id="tree_'+node_srl+'"><span>'+text+'</span></li>');
// button
jQuery('<a href="#" class="add"><img src="./common/tpl/images/tree/iconAdd.gif" /></a>').bind("click",function(e){addNode(node_srl,e);}).appendTo(node);
jQuery('<a href="#" class="modify"><img src="./common/tpl/images/tree/iconModify.gif" /></a>').bind("click",function(e){
modifyNode(node_srl,e);
}).appendTo(node);
jQuery('<a href="#" class="delete"><img src="./common/tpl/images/tree/iconDel.gif" /></a>').bind("click",function(e){
deleteNode(node_srl);
}).appendTo(node);
// insert parent child
if(parent_srl>0){
if(jQuery('#tree_'+parent_srl+'>ul').length==0) jQuery('#tree_'+parent_srl).append(jQuery('<ul>'));
jQuery('#tree_'+parent_srl+'> ul').append(node);
}else{
if(jQuery('#menu ul.simpleTree > li > ul').length==0) jQuery("<ul>").appendTo('#menu ul.simpleTree > li');
jQuery('#menu ul.simpleTree > li > ul').append(node);
}
});
//button show hide
jQuery("#menu li").each(function(){
if(jQuery(this).parents('ul').size() > max_menu_depth) jQuery("a.add",this).hide();
if(jQuery(">ul",this).size()>0) jQuery(">a.delete",this).hide();
});
// draw tree
simpleTreeCollection = jQuery('.simpleTree').simpleTree({
autoclose: false,
afterClick:function(node){
//alert("text-"+jQuery('span:first',node).text());
},
afterDblClick:function(node){
//alert("text-"+jQuery('span:first',node).text());
},
afterMove:function(destination, source, pos){
jQuery("#menu_zone_info").html("");
var menu_srl = jQuery("#fo_menu input[name=menu_srl]").val();
var parent_srl = destination.attr('id').replace(/.*_/g,'');
var target_srl = source.attr('id').replace(/.*_/g,'');
var brothers = jQuery('#'+destination.attr('id')+' > ul > li:not([class^=line])').length;
var mode = brothers >1 ? 'move':'insert';
var source_srl = pos == 0 ? 0: source.prevAll("li:not(.line)").get(0).id.replace(/.*_/g,'');
jQuery.exec_json("menu.procMenuAdminMoveItem",{"menu_srl":menu_srl,"parent_srl":parent_srl,"target_srl":target_srl,"source_srl":source_srl,"mode":mode},
function(data){
if(data.error>0) Tree(xml_url);
});
},
// i want you !! made by sol
beforeMovedToLine : function(destination, source, pos){
// if(typeof(destination.id) == 'undefined') return false;
return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth);
},
// i want you !! made by sol
beforeMovedToFolder : function(destination, source, pos){
// if(typeof(destination.id) == 'undefined') return false;
return (jQuery(destination).parents('ul').size() + jQuery('ul',source).size() <= max_menu_depth-1);
},
afterAjax:function()
{
//alert('Loaded');
},
animate:true
,docToFolderConvert:true
});
// image url replace
// jQuery("#menu ul.simpleTree img").attr("src",function(){ return jQuery(this).attr("src").replace("images/","./common/tpl/images/tree/");});
// open all node
nodeToggleAll();
},"xml");
}
function nodeToggleAll(){
jQuery("[class*=close]", simpleTreeCollection[0]).each(function(){
simpleTreeCollection[0].nodeToggle(this);
});
}
function modifyNode(node_srl,e){
jQuery('#menu_zone_info').html('');
var params ={
"parent_srl":0
,"menu_item_srl":node_srl
};
jQuery.exec_json('menu.getMenuAdminTplInfo', params, function(data){
jQuery('#menu_zone_info').html(data.tpl);
});
}
function addNode(node_srl,e){
jQuery('#menu_zone_info').html('');
var params ={
"menu_item_srl":0
,"parent_srl":node_srl
};
jQuery.exec_json('menu.getMenuAdminTplInfo', params, function(data){
jQuery('#menu_zone_info').html(data.tpl);
});
}
function deleteNode(node_srl){
if(confirm(lang_confirm_delete)){
jQuery('#menu_zone_info').html('');
var params ={
"menu_item_srl":node_srl
,"menu_srl":jQuery("form input[name=menu_srl]").val()
};
jQuery.exec_json('menu.procMenuAdminDeleteItem', params, function(data){
Tree(xml_url);
});
}
}
function completeInsertMenuItem(ret_obj) {
jQuery('#menu_zone_info').html('');
Tree(xml_url);
}

View file

@ -25,7 +25,7 @@
<th scope="row" colspan="2"><div>{$lang->menu_url}</div></th>
<td>
<input type="text" name="menu_url" value="{htmlspecialchars($item_info->url)}" class="inputTypeText" />
<a href="{getUrl('module','menu','act','dispMenuAdminMidList')}" onclick="popopen(this.href);return false;" class="button"/><span>{$lang->cmd_search_mid}</span></a>
<a href="{getUrl('module','menu','act','dispMenuAdminMidList')}" onclick="popopen(this.href);return false;" class="button"><span>{$lang->cmd_search_mid}</span> </a>
<p class="clear">{$lang->about_menu_url}</p>
</td>
</tr>
@ -36,13 +36,7 @@
<p>{$lang->about_menu_open_window}</p>
</td>
</tr>
<tr>
<th scope="row" colspan="2"><div>{$lang->menu_expand}</div></th>
<td>
<input type="checkbox" name="menu_expand" value="Y" <!--@if($item_info->expand=="Y")-->checked="checked"<!--@end--> />
<p>{$lang->about_menu_expand}</p>
</td>
</tr>
<tr>
<th scope="row" colspan="2"><div>{$lang->menu_img_btn}</div></th>
<td><p>{$lang->about_menu_img_btn}</p></td>
@ -89,14 +83,8 @@
</tr>
<tr>
<th scope="row" colspan="3" class="button"><div>
<!--@if($item_info->name)-->
<a href="#" onclick="doDeleteMenuItem('{$menu_item_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($item_info->name)-->
<a href="#" onclick="doInsertMenuItem('{$item_info->menu_item_srl}');return false" class="button"><span>{$lang->cmd_make_child}</span></a>
<!--@end-->
</div></th>
</tr>
</table>

View file

@ -2,7 +2,10 @@
<!--%import("filter/insert_menu_item.xml")-->
<!--%import("filter/delete_menu_item.xml")-->
<!--%import("filter/move_menu_item.xml")-->
<!--%import("css/menu.css")-->
<!--%import("../../common/js/jquery.simple.tree.js",optimized=false)-->
<!--%import("../../common/css/jquery.simple.tree.css",optimized=false)-->
<!--%import("js/menu_tree.js")-->
<!--%import("js/menu_admin.js")-->
<script type="text/javascript">
@ -11,13 +14,6 @@
<div class="menuManagement">
<!-- 메뉴 이동을 위해 임시로 사용하는 form -->
<form id="fo_move_menu" action="./" method="get">
<input type="hidden" name="menu_id" />
<input type="hidden" name="source_item" />
<input type="hidden" name="target_item" />
</form>
<!--@if($module == 'admin')-->
<form action="./" method="get" onsubmit="return procFilter(this, update_menu_title)">
<input type="hidden" name="menu_srl" value="{$menu_info->menu_srl}" />
@ -31,13 +27,14 @@
</div>
<div class="fr">
<span class="button"><input type="submit" value="{$lang->cmd_modify}" /></span>
<a href="#" onclick="window.close();return false;" class="button"><span>{$lang->cmd_close}</span></a>
</div>
</td>
</tr>
<tr>
<th scope="col"><div>{$lang->menu_management}</div></th>
<td class="left">{nl2br($lang->about_menu_management)}</td>
<td class="left">{nl2br($lang->about_menu_management)}
<span style="float:right"><a href="#" onclick="doReloadTreeMenu('{$menu_info->menu_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a></span>
</td>
</tr>
</table>
</form>
@ -57,14 +54,6 @@
</table>
<!--@end-->
<div class="gap1">
<a href="#" onclick="doInsertMenuItem(0);return false;" class="button"><span>{$lang->cmd_insert}</span></a>
<a href="#" onclick="doReloadTreeMenu('{$menu_info->menu_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a>
<a href="#" onclick="openAllTreeMenu('menu');return false;" class="button"><span>{$lang->cmd_open_all}</span></a>
<a href="#" onclick="closeAllTreeMenu('menu');return false;" class="button"><span>{$lang->cmd_close_all}</span></a>
</div>
<p class="gap1"><input type="checkbox" id="menu_enable_move" class="checkbox" /> <label for="menu_enable_move">{$lang->cmd_enable_move_menu}</label></p>
<div class="gap1">
<form id="fo_menu" action="./" method="post" onsubmit="return procFilter(this, insert_menu_item)" class="clear" target="tmp_upload_iframe" enctype="multipart/form-data">
@ -76,19 +65,23 @@
<input type="hidden" name="act" value="" />
<input type="hidden" name="target" value="" />
<div id="category_list">
<div id="menu_zone_menu"></div>
<div id="menu">
<ul class="simpleTree">
<li class="root" id='tree_0'><span>{$lang->menu}</span></li>
</ul>
</div>
<div id="menu_zone_info"></div>
<div id="menu_zone_info" style="position:absolute;top:200px; width:70%; right:20px"></div>
</form>
<script type="text/javascript">
loadTreeMenu("{$menu_info->xml_file}", "menu", "menu_zone_menu", "{$menu_info->title}", '', doGetMenuItemInfo, 0, doMoveTree);
</script>
</div>
</div>
<iframe id='tmp_upload_iframe' name='tmp_upload_iframe' style='display:none;width:1px;height:1px;position:absolute;top:-10px;left:-10px'></iframe>
<script type="text/javascript">
var simpleTreeCollection;
var max_menu_depth = 999;
var xml_url = "{$menu_info->xml_file}";
var lang_confirm_delete = "{$lang->confirm_delete}";
Tree(xml_url);
</script>