mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-07 02:31:40 +09:00
삭제
git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2327 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
commit
8326004cb2
2773 changed files with 91485 additions and 0 deletions
17
modules/menu/conf/info.xml
Normal file
17
modules/menu/conf/info.xml
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<module version="0.1">
|
||||
<title xml:lang="ko">메뉴</title>
|
||||
<title xml:lang="zh-CN">菜单</title>
|
||||
<title xml:lang="jp">メニュー</title>
|
||||
<title xml:lang="en">Menu</title>
|
||||
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
|
||||
<name xml:lang="ko">제로</name>
|
||||
<name xml:lang="zh-CN">zero</name>
|
||||
<name xml:lang="jp">Zero</name>
|
||||
<name xml:lang="en">zero</name>
|
||||
<description xml:lang="ko">레이아웃, 모듈을 연결하는 메뉴를 생성/관리하는 모듈입니다.</description>
|
||||
<description xml:lang="zh-CN">此模块将生成并管理连接布局,模块的菜单。</description>
|
||||
<description xml:lang="jp">レイアウト、モジュールを連動させるメニューを作成・管理するモジュールです。</description>
|
||||
<description xml:lang="en">This module is for creating/managering menues that linking layouts or modules.</description>
|
||||
</author>
|
||||
</module>
|
||||
19
modules/menu/conf/module.xml
Normal file
19
modules/menu/conf/module.xml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<module>
|
||||
<actions>
|
||||
<action name="dispMenuAdminContent" type="view" admin_index="true" standalone="true" />
|
||||
<action name="dispMenuAdminInsert" type="view" standalone="true" />
|
||||
<action name="dispMenuAdminManagement" type="view" standalone="true" />
|
||||
<action name="dispMenuAdminMidList" type="view" standalone="true" />
|
||||
|
||||
<action name="getMenuAdminTplInfo" type="model" standalone="true" />
|
||||
|
||||
<action name="procMenuAdminInsert" type="controller" standalone="true" />
|
||||
<action name="procMenuAdminUpdate" type="controller" standalone="true" />
|
||||
<action name="procMenuAdminDelete" type="controller" standalone="true" />
|
||||
<action name="procMenuAdminInsertItem" type="controller" standalone="true" />
|
||||
<action name="procMenuAdminDeleteItem" type="controller" standalone="true" />
|
||||
<action name="procMenuAdminMakeXmlFile" type="controller" standalone="true" />
|
||||
<action name="procMenuAdminMoveItem" type="controller" standalone="true" />
|
||||
</actions>
|
||||
</module>
|
||||
51
modules/menu/lang/en.lang.php
Normal file
51
modules/menu/lang/en.lang.php
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/**
|
||||
* @file modules/menu/lang/en.lang.php
|
||||
* @author zero <zero@nzeo.com>
|
||||
* @brief Menu module's basic language pack
|
||||
**/
|
||||
|
||||
$lang->cmd_menu_insert = 'Create menu';
|
||||
$lang->cmd_menu_management = 'Menu management';
|
||||
|
||||
$lang->menu = 'Menu';
|
||||
$lang->menu_count = 'No. of menu';
|
||||
$lang->menu_management = 'Menu management';
|
||||
$lang->depth = 'Step';
|
||||
$lang->parent_menu_name = 'Parent menu name';
|
||||
$lang->menu_name = 'Menu name';
|
||||
$lang->menu_srl = 'Menu SRL';
|
||||
$lang->menu_id = 'Menu ID';
|
||||
$lang->menu_url = 'Menu URL';
|
||||
$lang->menu_open_window = 'Open a new window';
|
||||
$lang->menu_expand = 'Expand';
|
||||
$lang->menu_img_btn = 'Image button';
|
||||
$lang->menu_normal_btn = 'Normal';
|
||||
$lang->menu_hover_btn = 'Mouse over';
|
||||
$lang->menu_active_btn = 'When selected';
|
||||
$lang->menu_group_srls = 'Accessable groups';
|
||||
$lang->layout_maker = "Layout maker";
|
||||
$lang->layout_history = "Update history ";
|
||||
$lang->layout_info = "Layout info";
|
||||
$lang->layout_list = 'Layout list';
|
||||
$lang->downloaded_list = 'Downloaded list';
|
||||
$lang->limit_menu_depth = 'Display enabled';
|
||||
|
||||
$lang->cmd_make_child = 'Add a child menu';
|
||||
$lang->cmd_move_to_installed_list = "View created lists";
|
||||
$lang->cmd_enable_move_menu = "Move menu (Drag the top menu after selecting)";
|
||||
$lang->cmd_search_mid = "Search mid";
|
||||
|
||||
$lang->msg_cannot_delete_for_child = 'Cannot delete a menu having a child menu.';
|
||||
|
||||
$lang->about_title = 'Enter a title which can be easily recognized when linked to a module.';
|
||||
$lang->about_menu_management = "Menu management enables you to consist menu in the selected layout.\nYou can create menu upto setted depth and can enter information in details by clicking the menu.\nMenu will be expanded by cliking the folder image.\nIf menu is not shown normally, refresh the information by clicking the button \"Re-create cache file\".\n* Menu created over the depth limit may not be shown properly.";
|
||||
$lang->about_menu_name = 'The name will be shown as a menu name if it is not an admin or image button.';
|
||||
$lang->about_menu_url = "It is the menu URL when select the menu.<br />You may enter only id value to link to other module.<br />If no contents exist, nothing will happen even though you click the menu.";
|
||||
$lang->about_menu_open_window = 'You can assign it to open a page in a new window when the menu clicked.';
|
||||
$lang->about_menu_expand = 'It enables the menu to remain expanded when the tree menu(tree_menu.js) is used.';
|
||||
$lang->about_menu_img_btn = 'If you register an image button, the image button will automatically replace the text button, and it will be shown in the layout.';
|
||||
$lang->about_menu_group_srls = 'If you select a group, only the group members can see the menu. (if xml file is directly opened, it will be shown.)';
|
||||
|
||||
$lang->about_menu = "Menu module will help you to create a complete site through the convenient menu management which arranges created modules and links to layouts without any manual works..\nMenu is not a site manager, but it just has information which can link to modules and layouts so you can express different types of menu.";
|
||||
?>
|
||||
51
modules/menu/lang/jp.lang.php
Normal file
51
modules/menu/lang/jp.lang.php
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/**
|
||||
* @file modules/menu/lang/ko.lang.php
|
||||
* @author zero <zero@nzeo.com> 翻訳:RisaPapa
|
||||
* @brief メニュー(menu)モジュールの基本言語パッケージ
|
||||
**/
|
||||
|
||||
$lang->cmd_menu_insert = 'メニュー生成';
|
||||
$lang->cmd_menu_management = 'メニュー設定';
|
||||
|
||||
$lang->menu = 'メニュー';
|
||||
$lang->menu_count = 'メニュー数';
|
||||
$lang->menu_management = 'メニュー管理';
|
||||
$lang->depth = 'スレッド';
|
||||
$lang->parent_menu_name = '上位メニュー名';
|
||||
$lang->menu_name = 'メニュー名';
|
||||
$lang->menu_srl = 'メニュー固有番号';
|
||||
$lang->menu_id = 'メニュー名';
|
||||
$lang->menu_url = 'リンクURL';
|
||||
$lang->menu_open_window = '新しいウィンドウズで開く';
|
||||
$lang->menu_expand = '拡張表示';
|
||||
$lang->menu_img_btn = 'イメージボタン';
|
||||
$lang->menu_normal_btn = '一般ボタン';
|
||||
$lang->menu_hover_btn = 'マウスオーバー';
|
||||
$lang->menu_active_btn = '選択時のボタン';
|
||||
$lang->menu_group_srls = 'グループ制限';
|
||||
$lang->layout_maker = "レイアウト作者";
|
||||
$lang->layout_history = "変更内容";
|
||||
$lang->layout_info = "レイアウト情報";
|
||||
$lang->layout_list = 'レイアウトリスト';
|
||||
$lang->downloaded_list = 'ダウンロードリスト';
|
||||
$lang->limit_menu_depth = '表示スレッド';
|
||||
|
||||
$lang->cmd_make_child = '下位メニュー追加';
|
||||
$lang->cmd_move_to_installed_list = "生成されたリスト表示";
|
||||
$lang->cmd_enable_move_menu = "メニュー移動(選択後メニューをドラッグしてください)";
|
||||
$lang->cmd_search_mid = "mid 検索";
|
||||
|
||||
$lang->msg_cannot_delete_for_child = '下位メニューが存在するメニューは削除できません。';
|
||||
|
||||
$lang->about_title = 'モジュールをリンクする際に区別し易いタイトルを入力してください。';
|
||||
$lang->about_menu_management = "メニュー管理は、選択されたレイアウトで使用するメニューを構成できるようにします。<br />一定レベルまでメニューの構成ができ、入力したメニューをクリックすると詳細情報が入力できます。<br />フォルダーのイメージをクリックするとメニューを拡張することができます。<br />もしメニューが正常に表示されない場合は、 「キャッシュファイル再生成」ボタンをクリックして情報を更新してください。<br />* 一定レベル以上のメニューは正しく表示されない場合があります。";
|
||||
$lang->about_menu_name = '管理及びイメージボタンではない場合、メニュー名として表示されるタイトルです。';
|
||||
$lang->about_menu_url = "メニュー選択時、移動するURLです。<br />他のモジュールとリンクを張る場合はIDの値のみ入力してください。<br />内容がない場合は、メニューを選択しても何の動作もありません。";
|
||||
$lang->about_menu_open_window = 'メニュー選択時、新しいウィンドウで開くかを指定することができます。';
|
||||
$lang->about_menu_expand = 'ツリーメニュー(tree_menu.js)を利用すると常に拡張表示(すべて表示)の状態にすることができます。';
|
||||
$lang->about_menu_img_btn = 'イメージボタンを登録するとレイアウトで自動的にイメージボタンに入れ替わって表示されます。';
|
||||
$lang->about_menu_group_srls = 'グループを選択すると該当するグループのユーザにのみメニューが表示されます(XMLファイルを直接開くと情報が表示されます)。';
|
||||
|
||||
$lang->about_menu = "メニューモジュルは、生成されたモジュールを、便利なメニュー管理機能で、整理したりレイアウトをリンクしたりして煩わしい作業なしでサイトを構築できるようにします。メニューは、サイトを管理するというより、モジュールとレイアウトをリンクして様々なメニューを表示させる情報のみ保持します。";
|
||||
?>
|
||||
51
modules/menu/lang/ko.lang.php
Normal file
51
modules/menu/lang/ko.lang.php
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/**
|
||||
* @file modules/menu/lang/ko.lang.php
|
||||
* @author zero <zero@nzeo.com>
|
||||
* @brief 메뉴(menu) 모듈의 기본 언어팩
|
||||
**/
|
||||
|
||||
$lang->cmd_menu_insert = '메뉴 생성';
|
||||
$lang->cmd_menu_management = '메뉴 설정';
|
||||
|
||||
$lang->menu = '메뉴';
|
||||
$lang->menu_count = '메뉴의 수';
|
||||
$lang->menu_management = '메뉴 관리';
|
||||
$lang->depth = '단계';
|
||||
$lang->parent_menu_name = '상위 메뉴명';
|
||||
$lang->menu_name = '메뉴명';
|
||||
$lang->menu_srl = '메뉴의 고유 번호';
|
||||
$lang->menu_id = '메뉴의 이름';
|
||||
$lang->menu_url = '연결 url';
|
||||
$lang->menu_open_window = '새창 열기';
|
||||
$lang->menu_expand = '펼침';
|
||||
$lang->menu_img_btn = '이미지 버튼';
|
||||
$lang->menu_normal_btn = '일반';
|
||||
$lang->menu_hover_btn = '마우스오버';
|
||||
$lang->menu_active_btn = '선택시';
|
||||
$lang->menu_group_srls = '그룹 제한';
|
||||
$lang->layout_maker = "레이아웃 제작자";
|
||||
$lang->layout_history = "변경 사항 ";
|
||||
$lang->layout_info = "레이아웃 정보";
|
||||
$lang->layout_list = '레이아웃 목록';
|
||||
$lang->downloaded_list = '다운로드 목록';
|
||||
$lang->limit_menu_depth = '표시 가능';
|
||||
|
||||
$lang->cmd_make_child = '하부 메뉴 추가';
|
||||
$lang->cmd_move_to_installed_list = "생성된 목록 보기";
|
||||
$lang->cmd_enable_move_menu = "메뉴 옮기기 (선택후 위 메뉴를 드래그하세요)";
|
||||
$lang->cmd_search_mid = "mid 찾기";
|
||||
|
||||
$lang->msg_cannot_delete_for_child = '하부 메뉴가 있는 메뉴는 삭제하실 수 없습니다';
|
||||
|
||||
$lang->about_title = '모듈에 연결시 쉽게 구분할 수 있는 제목을 입력해주세요';
|
||||
$lang->about_menu_management = "메뉴관리는 선택하신 레이아웃에서 사용하는 메뉴를 구성할 수 있도록 합니다.\n정해진 단계까지 메뉴를 구성 가능하며 입력하신 메뉴를 클릭하시면 상세 정보를 입력할 수 있습니다.\n폴더그림을 클릭하시면 메뉴를 확장하실 수 있습니다.\n간혹 메뉴가 정상적으로 나타나지 않으면 \"캐시파일 재생성\" 버튼을 눌러서 정보를 갱신하세요.\n* 정해진 단계 이상의 메뉴는 제대로 표시되지 않을 수 있습니다.";
|
||||
$lang->about_menu_name = '관리 및 이미지 버튼이 아닐경우 메뉴 명으로 나타날 제목입니다';
|
||||
$lang->about_menu_url = "메뉴를 선택시 이동한 URL입니다.<br />다른 모듈을 연결하고자 할 때에는 id값만 입력해주시면 됩니다.<br />내용이 없을시 메뉴를 선택하여도 아무런 동작이 없게 됩니다.";
|
||||
$lang->about_menu_open_window = '메뉴 선택시 새창으로 띄울 것인지를 정할 수 있습니다';
|
||||
$lang->about_menu_expand = '트리메뉴(tree_menu.js)를 사용시 늘 펼쳐진 상태로 있게 합니다';
|
||||
$lang->about_menu_img_btn = '이미지 버튼을 등록하시면 레이아웃에서 자동으로 이미지 버튼으로 교체되어 표시가 됩니다.';
|
||||
$lang->about_menu_group_srls = '그룹을 선택하시면 해당 그룹의 사용자만 메뉴가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)';
|
||||
|
||||
$lang->about_menu = "메뉴모듈은 생성된 모듈을 편리한 메뉴관리기를 통해 정리하고 레이아웃과 연결하여 별도의 수작업 없이 완성된 사이트를 구축하도록 도와줍니다..\n메뉴는 사이트를 관리하기 보다는 모듈과 레이아웃을 연결해 주며 레이아웃을 통해서 여러가지 형태의 메뉴를 표시할 수 있도록 하는 정보만 가지고 있습니다.";
|
||||
?>
|
||||
51
modules/menu/lang/zh-CN.lang.php
Normal file
51
modules/menu/lang/zh-CN.lang.php
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
<?php
|
||||
/**
|
||||
* @file modules/menu/lang/zh-CN.lang.php
|
||||
* @author zero <zero@nzeo.com>
|
||||
* @brief 菜单(menu) 模块的基本语言包
|
||||
**/
|
||||
|
||||
$lang->cmd_menu_insert = '生成菜单';
|
||||
$lang->cmd_menu_management = '菜单设置';
|
||||
|
||||
$lang->menu = '菜单';
|
||||
$lang->menu_count = '菜单数';
|
||||
$lang->menu_management = '菜单管理';
|
||||
$lang->depth = '层级';
|
||||
$lang->parent_menu_name = '上级菜单名';
|
||||
$lang->menu_name = '菜单名';
|
||||
$lang->menu_srl = '菜单固有编号';
|
||||
$lang->menu_id = '菜单名称';
|
||||
$lang->menu_url = '链接';
|
||||
$lang->menu_open_window = '新窗口';
|
||||
$lang->menu_expand = '展开';
|
||||
$lang->menu_img_btn = '图片按钮';
|
||||
$lang->menu_normal_btn = '普通';
|
||||
$lang->menu_hover_btn = '鼠标滑过';
|
||||
$lang->menu_active_btn = '激活链接';
|
||||
$lang->menu_group_srls = '用户组';
|
||||
$lang->layout_maker = "布局作者";
|
||||
$lang->layout_history = "更新列表 ";
|
||||
$lang->layout_info = "布局信息";
|
||||
$lang->layout_list = '布局目录';
|
||||
$lang->downloaded_list = '下载目录';
|
||||
$lang->limit_menu_depth = '可显示';
|
||||
|
||||
$lang->cmd_make_child = '添加下级菜单';
|
||||
$lang->cmd_move_to_installed_list = "查看生成目录";
|
||||
$lang->cmd_enable_move_menu = "移动菜单 (选择后用鼠标拖动)";
|
||||
$lang->cmd_search_mid = "查找 mid";
|
||||
|
||||
$lang->msg_cannot_delete_for_child = '有下级菜单的菜单不能删除。';
|
||||
|
||||
$lang->about_title = '请输入连接模块时容易区分的标题。';
|
||||
$lang->about_menu_management = "菜单管理可以构筑被选布局中使用的菜单。\n不仅可以构筑指定级(层级)菜单,点击输入的菜单项即可对其详细设置。\n点击菜单前置图标可以展开菜单。\n偶尔不能正常显示菜单时,请按\"缓冲文件再生成\"按钮更新信息。\n* 可能不能正常显示指定级(层级)以上的菜单。";
|
||||
$lang->about_menu_name = '输入不是图片按钮时显示为菜单名标题。';
|
||||
$lang->about_menu_url = "点击菜单时要移动的URL。<br />连接其他模块时只输入id值即可。<br />没有内容时点击菜单也不会有什么动作。";
|
||||
$lang->about_menu_open_window = '可以设置点击菜单时是否要在新窗口中打开。';
|
||||
$lang->about_menu_expand = '使用树型(tree_menu.js)菜单时总是呈展开状态。';
|
||||
$lang->about_menu_img_btn = '如登录图片按钮,在布局中自动替换显示为图片按钮。';
|
||||
$lang->about_menu_group_srls = '如选择用户组,只有所属组用户才能看到此菜单。 —(xml文件中不能隐藏)';
|
||||
|
||||
$lang->about_menu = "菜单模块可以通过菜单管理器整理已生成的模块并同布局相连接来轻松建设一个完整的网站。\n菜单模块虽然具有连接模块和布局并通过布局来显示多种形态菜单的信息,但它不具备管理网站的功能。";
|
||||
?>
|
||||
432
modules/menu/menu.admin.controller.php
Normal file
432
modules/menu/menu.admin.controller.php
Normal file
|
|
@ -0,0 +1,432 @@
|
|||
<?php
|
||||
/**
|
||||
* @class menuAdminController
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief menu 모듈의 admin controller class
|
||||
**/
|
||||
|
||||
class menuAdminController extends menu {
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
**/
|
||||
function init() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 추가
|
||||
**/
|
||||
function procMenuAdminInsert() {
|
||||
// 입력할 변수 정리
|
||||
$args->title = Context::get('title');
|
||||
$args->menu_srl = getNextSequence();
|
||||
$args->listorder = $args->menu_srl * -1;
|
||||
|
||||
$output = executeQuery('menu.insertMenu', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$this->add('menu_srl', $args->menu_srl);
|
||||
$this->setMessage('success_registed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 제목 변경
|
||||
**/
|
||||
function procMenuAdminUpdate() {
|
||||
// 입력할 변수 정리
|
||||
$args->title = Context::get('title');
|
||||
$args->menu_srl = Context::get('menu_srl');
|
||||
|
||||
$output = executeQuery('menu.updateMenu', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$this->setMessage('success_registed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 삭제
|
||||
* menu_item과 xml 캐시 파일 모두 삭제
|
||||
**/
|
||||
function procMenuAdminDelete() {
|
||||
$menu_srl = Context::get('menu_srl');
|
||||
|
||||
// 캐시 파일 삭제
|
||||
$cache_list = FileHandler::readDir("./files/cache/menu","",false,true);
|
||||
if(count($cache_list)) {
|
||||
foreach($cache_list as $cache_file) {
|
||||
$pos = strpos($cache_file, $menu_srl.'_');
|
||||
if($pos>0) unlink($cache_file);
|
||||
}
|
||||
}
|
||||
|
||||
$args->menu_srl = $menu_srl;
|
||||
|
||||
// 메뉴 메뉴 삭제
|
||||
$output = executeQuery("menu.deleteMenuItems", $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 메뉴 삭제
|
||||
$output = executeQuery("menu.deleteMenu", $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴에 아이템 추가
|
||||
**/
|
||||
function procMenuAdminInsertItem() {
|
||||
// 입력할 변수 정리
|
||||
$source_args = Context::getRequestVars();
|
||||
unset($source_args->module);
|
||||
unset($source_args->act);
|
||||
if($source_args->menu_open_window!="Y") $source_args->menu_open_window = "N";
|
||||
if($source_args->menu_expand !="Y") $source_args->menu_expand = "N";
|
||||
$source_args->group_srls = str_replace('|@|',',',$source_args->group_srls);
|
||||
$source_args->parent_srl = (int)$source_args->parent_srl;
|
||||
|
||||
// 변수를 다시 정리 (form문의 column과 DB column이 달라서)
|
||||
$args->menu_srl = $source_args->menu_srl;
|
||||
$args->menu_item_srl = $source_args->menu_item_srl;
|
||||
$args->parent_srl = $source_args->parent_srl;
|
||||
$args->menu_srl = $source_args->menu_srl;
|
||||
$args->menu_id = $source_args->menu_id;
|
||||
$args->name = $source_args->menu_name;
|
||||
$args->url = trim($source_args->menu_url);
|
||||
$args->open_window = $source_args->menu_open_window;
|
||||
$args->expand = $source_args->menu_expand;
|
||||
$args->normal_btn = $source_args->menu_normal_btn;
|
||||
$args->hover_btn = $source_args->menu_hover_btn;
|
||||
$args->active_btn = $source_args->menu_active_btn;
|
||||
$args->group_srls = $source_args->group_srls;
|
||||
|
||||
// 이미 존재하는지를 확인
|
||||
$oMenuModel = &getAdminModel('menu');
|
||||
$item_info = $oMenuModel->getMenuItemInfo($args->menu_item_srl);
|
||||
|
||||
// 존재하게 되면 update를 해준다
|
||||
if($item_info->menu_item_srl == $args->menu_item_srl) {
|
||||
$output = executeQuery('menu.updateMenuItem', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 존재하지 않으면 insert를 해준다
|
||||
} else {
|
||||
$args->listorder = -1*$args->menu_item_srl;
|
||||
$output = executeQuery('menu.insertMenuItem', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
}
|
||||
|
||||
// 해당 메뉴의 정보를 구함
|
||||
$menu_info = $oMenuModel->getMenu($args->menu_srl);
|
||||
$menu_title = $menu_info->title;
|
||||
|
||||
// XML 파일을 갱신하고 위치을 넘겨 받음
|
||||
$xml_file = $this->makeXmlFile($args->menu_srl);
|
||||
|
||||
// url이 mid일 경우 기록 남김
|
||||
if(eregi('^([a-zA-Z0-9\_\-]+)$', $args->url)) {
|
||||
$mid = $args->url;
|
||||
|
||||
$mid_args->menu_srl = $args->menu_srl;
|
||||
$mid_args->mid = $mid;
|
||||
|
||||
// menu_srl에 해당하는 레이아웃 값을 구함
|
||||
$output = executeQuery('menu.getMenuLayout', $args);
|
||||
|
||||
// 해당 모듈에 레이아웃 값이 정해져 있지 않으면 지정
|
||||
$oModuleModel = &getModel('module');
|
||||
$module_info = $oModuleModel->getModuleInfoByMid($mid);
|
||||
if(!$module_info->layout_srl&&$output->data->layout_srl) $mid_args->layout_srl = $output->data->layout_srl;
|
||||
|
||||
// 해당 mid의 메뉴값을 선택된 메뉴로 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->updateModuleMenu($mid_args);
|
||||
}
|
||||
|
||||
$this->add('xml_file', $xml_file);
|
||||
$this->add('menu_srl', $args->menu_srl);
|
||||
$this->add('menu_item_srl', $args->menu_item_srl);
|
||||
$this->add('menu_title', $menu_title);
|
||||
$this->add('parent_srl', $args->parent_srl);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 메뉴 삭제
|
||||
**/
|
||||
function procMenuAdminDeleteItem() {
|
||||
// 변수 정리
|
||||
$args = Context::gets('menu_srl','menu_item_srl');
|
||||
|
||||
$oMenuAdminModel = &getAdminModel('menu');
|
||||
|
||||
// 원정보를 가져옴
|
||||
$item_info = $oMenuAdminModel->getMenuItemInfo($args->menu_item_srl);
|
||||
if($item_info->parent_srl) $parent_srl = $item_info->parent_srl;
|
||||
|
||||
// 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력
|
||||
$output = executeQuery('menu.getChildMenuCount', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child');
|
||||
|
||||
// DB에서 삭제
|
||||
$output = executeQuery("menu.deleteMenuItem", $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// 해당 메뉴의 정보를 구함
|
||||
$menu_info = $oMenuAdminModel->getMenu($args->menu_srl);
|
||||
$menu_title = $menu_info->title;
|
||||
|
||||
// XML 파일을 갱신하고 위치을 넘겨 받음
|
||||
$xml_file = $this->makeXmlFile($args->menu_srl);
|
||||
|
||||
$this->add('xml_file', $xml_file);
|
||||
$this->add('menu_title', $menu_title);
|
||||
$this->add('menu_item_srl', $parent_srl);
|
||||
$this->setMessage('success_deleted');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴의 메뉴를 이동
|
||||
**/
|
||||
function procMenuAdminMoveItem() {
|
||||
// 변수 설정
|
||||
$menu_id = Context::get('menu_id');
|
||||
$source_item_srl = str_replace('menu_'.$menu_id.'_','',Context::get('source_item_srl'));
|
||||
$target_item_srl = str_replace('menu_'.$menu_id.'_','',Context::get('target_item_srl'));
|
||||
|
||||
// target_item 의 값을 구함
|
||||
$oMenuModel = &getAdminModel('menu');
|
||||
$target_item = $oMenuModel->getMenuItemInfo($target_item_srl);
|
||||
|
||||
// source_item에 target_item_srl의 parent_srl, listorder 값을 입력
|
||||
$source_args->menu_item_srl = $source_item_srl;
|
||||
$source_args->parent_srl = $target_item->parent_srl;
|
||||
$source_args->listorder = $target_item->listorder;
|
||||
$output = executeQuery('menu.updateMenuItemParent', $source_args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// target_item의 listorder값을 +1해 준다
|
||||
$target_args->menu_item_srl = $target_item_srl;
|
||||
$target_args->parent_srl = $target_item->parent_srl;
|
||||
$target_args->listorder = $target_item->listorder -1;
|
||||
$output = executeQuery('menu.updateMenuItemParent', $target_args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
// xml파일 재생성
|
||||
$xml_file = $this->makeXmlFile($target_item->menu_srl);
|
||||
|
||||
// return 변수 설정
|
||||
$this->add('menu_srl', $target_item->menu_srl);
|
||||
$this->add('xml_file', $xml_file);
|
||||
$this->add('source_item_srl', $source_item_srl);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief xml 파일을 갱신
|
||||
* 관리자페이지에서 메뉴 구성 후 간혹 xml파일이 재생성 안되는 경우가 있는데\n
|
||||
* 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n
|
||||
* 개발 중간의 문제인 것 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능
|
||||
**/
|
||||
function procMenuAdminMakeXmlFile() {
|
||||
// 입력값을 체크
|
||||
$menu_srl = Context::get('menu_srl');
|
||||
|
||||
// 해당 메뉴의 정보를 구함
|
||||
$oMenuAdminModel = &getAdminModel('menu');
|
||||
$menu_info = $oMenuAdminModel->getMenu($menu_srl);
|
||||
$menu_title = $menu_info->title;
|
||||
|
||||
// xml파일 재생성
|
||||
$xml_file = $this->makeXmlFile($menu_srl);
|
||||
|
||||
// return 값 설정
|
||||
$this->add('menu_title',$menu_title);
|
||||
$this->add('xml_file',$xml_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴의 xml 파일을 만들고 위치를 return
|
||||
**/
|
||||
function makeXmlFile($menu_srl) {
|
||||
// xml파일 생성시 필요한 정보가 없으면 그냥 return
|
||||
if(!$menu_srl) return;
|
||||
|
||||
// DB에서 menu_srl에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴
|
||||
$args->menu_srl = $menu_srl;
|
||||
$args->sort_index = 'listorder';
|
||||
$output = executeQuery('menu.getMenuItems', $args);
|
||||
if(!$output->toBool()) return;
|
||||
|
||||
// 캐시 파일의 이름을 지정
|
||||
$xml_file = sprintf("./files/cache/menu/%s.xml.php", $menu_srl);
|
||||
$php_file = sprintf("./files/cache/menu/%s.php", $menu_srl);
|
||||
|
||||
// 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성
|
||||
$list = $output->data;
|
||||
if(!$list) {
|
||||
$xml_buff = "<root />";
|
||||
FileHandler::writeFile($xml_file, $xml_buff);
|
||||
return $xml_file;
|
||||
}
|
||||
|
||||
// 구해온 데이터가 하나라면 array로 바꾸어줌
|
||||
if(!is_array($list)) $list = array($list);
|
||||
|
||||
// 루프를 돌면서 tree 구성
|
||||
$list_count = count($list);
|
||||
for($i=0;$i<$list_count;$i++) {
|
||||
$node = $list[$i];
|
||||
$menu_item_srl = $node->menu_item_srl;
|
||||
$parent_srl = $node->parent_srl;
|
||||
|
||||
$tree[$parent_srl][$menu_item_srl] = $node;
|
||||
}
|
||||
|
||||
// xml 캐시 파일 생성
|
||||
$xml_buff = sprintf('<?php header("Content-Type: text/xml; charset=UTF-8"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); @session_start(); ?><root>%s</root>', $this->getXmlTree($tree[0], $tree));
|
||||
|
||||
// php 캐시 파일 생성
|
||||
$php_output = $this->getPhpCacheCode($tree[0], $tree);
|
||||
$php_buff = sprintf('<?php if(!defined("__ZBXE__")) exit(); $menu->list = array(%s); ?>', $php_output['buff']);
|
||||
|
||||
// 파일 저장
|
||||
FileHandler::writeFile($xml_file, $xml_buff);
|
||||
FileHandler::writeFile($php_file, $php_buff);
|
||||
return $xml_file;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성
|
||||
* 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 이 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n
|
||||
* (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현)
|
||||
**/
|
||||
function getXmlTree($source_node, $tree) {
|
||||
if(!$source_node) return;
|
||||
foreach($source_node as $menu_item_srl => $node) {
|
||||
$child_buff = "";
|
||||
|
||||
// 자식 노드의 데이터 가져옴
|
||||
if($menu_item_srl&&$tree[$menu_item_srl]) $child_buff = $this->getXmlTree($tree[$menu_item_srl], $tree);
|
||||
|
||||
// 변수 정리
|
||||
$name = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->name);
|
||||
$url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url);
|
||||
if(eregi('^([0-9a-zA-Z\_\-]+)$', $node->url)) $href = getUrl('','mid',$node->url);
|
||||
else $href = $url;
|
||||
$open_window = $node->open_window;
|
||||
$expand = $node->expand;
|
||||
$normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn);
|
||||
$hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn);
|
||||
$active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn);
|
||||
$group_srls = $node->group_srls;
|
||||
|
||||
// node->group_srls값이 있으면
|
||||
if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls);
|
||||
else $group_check_code = "true";
|
||||
$attribute = sprintf(
|
||||
'node_srl="%s" text="<?=(%s?"%s":"")?>" url="<?=(%s?"%s":"")?>" href="<?=(%s?"%s":"")?>" open_window="%s" expand="%s" normal_btn="%s" hover_btn="%s" active_btn="%s" ',
|
||||
$menu_item_srl,
|
||||
$group_check_code,
|
||||
$name,
|
||||
$group_check_code,
|
||||
$url,
|
||||
$group_check_code,
|
||||
$href,
|
||||
$open_window,
|
||||
$expand,
|
||||
$normal_btn,
|
||||
$hover_btn,
|
||||
$active_btn
|
||||
);
|
||||
|
||||
if($child_buff) $buff .= sprintf('<node %s>%s</node>', $attribute, $child_buff);
|
||||
else $buff .= sprintf('<node %s />', $attribute);
|
||||
}
|
||||
return $buff;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief array로 정렬된 노드들을 php code로 변경하여 return
|
||||
* 메뉴에서 메뉴를 tpl에 사용시 xml데이터를 사용할 수도 있지만 별도의 javascript 사용이 필요하기에
|
||||
* php로 된 캐시파일을 만들어서 db이용없이 바로 메뉴 정보를 구할 수 있도록 한다
|
||||
* 이 캐시는 ModuleHandler::displayContent() 에서 include하여 Context::set() 한다
|
||||
**/
|
||||
function getPhpCacheCode($source_node, $tree) {
|
||||
$output = array("buff"=>"", "url_list"=>array());
|
||||
if(!$source_node) return $output;
|
||||
|
||||
foreach($source_node as $menu_item_srl => $node) {
|
||||
// 자식 노드가 있으면 자식 노드의 데이터를 먼저 얻어옴
|
||||
if($menu_item_srl&&$tree[$menu_item_srl]) $child_output = $this->getPhpCacheCode($tree[$menu_item_srl], $tree);
|
||||
else $child_output = array("buff"=>"", "url_list"=>array());
|
||||
|
||||
// 현재 노드의 url값이 공란이 아니라면 url_list 배열값에 입력
|
||||
if($node->url) $child_output['url_list'][] = $node->url;
|
||||
$output['url_list'] = array_merge($output['url_list'], $child_output['url_list']);
|
||||
|
||||
// node->group_srls값이 있으면
|
||||
if($node->group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$node->group_srls);
|
||||
else $group_check_code = "true";
|
||||
|
||||
// 변수 정리
|
||||
$name = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->name);
|
||||
$href = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->href);
|
||||
$url = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->url);
|
||||
if(eregi('^([0-9a-zA-Z\_\-]+)$', $node->url)) $href = getUrl('','mid',$node->url);
|
||||
else $href = $url;
|
||||
$open_window = $node->open_window;
|
||||
$normal_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->normal_btn);
|
||||
$hover_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->hover_btn);
|
||||
$active_btn = str_replace(array('&','"','<','>'),array('&','"','<','>'),$node->active_btn);
|
||||
$selected = '"'.implode('","',$child_output['url_list']).'"';
|
||||
$child_buff = $child_output['buff'];
|
||||
|
||||
// 속성을 생성한다 ( url_list를 이용해서 선택된 메뉴의 노드에 속하는지를 검사한다. 꽁수지만 빠르고 강력하다고 생각;;)
|
||||
$attribute = sprintf(
|
||||
'"node_srl"=>"%s","text"=>(%s?"%s":""),"href"=>(%s?"%s":""),"url"=>(%s?"%s":""),"open_window"=>"%s","normal_btn"=>"%s","hover_btn"=>"%s","active_btn"=>"%s","selected"=>(array(%s)&&in_array(Context::get("mid"),array(%s))?1:0),"list"=>array(%s)',
|
||||
$node->menu_item_srl,
|
||||
$group_check_code,
|
||||
$name,
|
||||
$group_check_code,
|
||||
$href,
|
||||
$group_check_code,
|
||||
$url,
|
||||
$open_window,
|
||||
$normal_btn,
|
||||
$hover_btn,
|
||||
$active_btn,
|
||||
$selected,
|
||||
$selected,
|
||||
$child_buff
|
||||
);
|
||||
|
||||
// buff 데이터를 생성한다
|
||||
$output['buff'] .= sprintf('%s=>array(%s),', $node->menu_item_srl, $attribute);
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴와 레이아웃 매핑
|
||||
* 레이아웃에서 메뉴를 지정할때 지정된 메뉴의 기본 레이아웃을 매핑
|
||||
**/
|
||||
function updateMenuLayout($layout_srl, $menu_srl_list) {
|
||||
if(!count($menu_srl_list)) return;
|
||||
|
||||
// 일단 menu_srls의 값을 지움
|
||||
$args->menu_srls = implode(',',$menu_srl_list);
|
||||
$output = executeQuery('menu.deleteMenuLayout', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
|
||||
$args->layout_srl = $layout_srl;
|
||||
|
||||
// menu_srls, layout_srl 매핑
|
||||
for($i=0;$i<count($menu_srl_list);$i++) {
|
||||
$args->menu_srl = $menu_srl_list[$i];
|
||||
$output = executeQuery('menu.insertMenuLayout', $args);
|
||||
if(!$output->toBool()) return $output;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
125
modules/menu/menu.admin.model.php
Normal file
125
modules/menu/menu.admin.model.php
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
<?php
|
||||
/**
|
||||
* @class menuAdminModel
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @version 0.1
|
||||
* @brief menu 모듈의 admin model class
|
||||
**/
|
||||
|
||||
class menuAdminModel extends menu {
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
**/
|
||||
function init() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 전체 메뉴 목록을 구해옴
|
||||
**/
|
||||
function getMenuList($obj) {
|
||||
|
||||
$args->sort_index = $obj->sort_index;
|
||||
$args->page = $obj->page?$obj->page:1;
|
||||
$args->list_count = $obj->list_count?$obj->list_count:20;
|
||||
$args->page_count = $obj->page_count?$obj->page_count:10;
|
||||
|
||||
// document.getDocumentList 쿼리 실행
|
||||
$output = executeQuery('menu.getMenuList', $args);
|
||||
|
||||
// 결과가 없거나 오류 발생시 그냥 return
|
||||
if(!$output->toBool()||!count($output->data)) return $output;
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 등록된 모든 메뉴를 return
|
||||
**/
|
||||
function getMenus() {
|
||||
// 일단 DB에서 정보를 가져옴
|
||||
$args->menu_srl = $menu_srl;
|
||||
$output = executeQuery('menu.getMenus', $args);
|
||||
if(!$output->data) return;
|
||||
$menus = $output->data;
|
||||
if(!is_array($menus)) $menus = array($menus);
|
||||
return $menus;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DB 에 생성된 한개의 메뉴 정보를 구함
|
||||
* 생성된 메뉴의 DB정보+XML정보를 return
|
||||
**/
|
||||
function getMenu($menu_srl) {
|
||||
// 일단 DB에서 정보를 가져옴
|
||||
$args->menu_srl = $menu_srl;
|
||||
$output = executeQuery('menu.getMenu', $args);
|
||||
if(!$output->data) return;
|
||||
|
||||
$menu_info = $output->data;
|
||||
$menu_info->xml_file = sprintf('./files/cache/menu/%s.xml.php',$menu_srl);
|
||||
$menu_info->php_file = sprintf('./files/cache/menu/%s.php',$menu_srl);
|
||||
return $menu_info;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 특정 menu_srl의 아이템 정보를 return
|
||||
* 이 정보중에 group_srls의 경우는 , 로 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴
|
||||
**/
|
||||
function getMenuItemInfo($menu_item_srl) {
|
||||
// menu_item_srl이 있으면 해당 메뉴의 정보를 가져온다
|
||||
$args->menu_item_srl = $menu_item_srl;
|
||||
$output = executeQuery('menu.getMenuItem', $args);
|
||||
$node = $output->data;
|
||||
if($node->group_srls) $node->group_srls = explode(',',$node->group_srls);
|
||||
else $node->group_srls = array();
|
||||
return $node;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 특정 menu_srl의 정보를 이용하여 템플릿을 구한후 return
|
||||
* 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 된 html을 직접 return
|
||||
**/
|
||||
function getMenuAdminTplInfo() {
|
||||
// 해당 메뉴의 정보를 가져오기 위한 변수 설정
|
||||
$menu_item_srl = Context::get('menu_item_srl');
|
||||
$parent_srl = Context::get('parent_srl');
|
||||
|
||||
// 회원 그룹의 목록을 가져옴
|
||||
$oMemberModel = &getModel('member');
|
||||
$group_list = $oMemberModel->getGroups();
|
||||
Context::set('group_list', $group_list);
|
||||
|
||||
// parent_srl이 있고 menu_item_srl이 없으면 하부 메뉴 추가임
|
||||
if(!$menu_item_srl && $parent_srl) {
|
||||
// 상위 메뉴의 정보를 가져옴
|
||||
$parent_info = $this->getMenuItemInfo($parent_srl);
|
||||
|
||||
// 추가하려는 메뉴의 기본 변수 설정
|
||||
$item_info->menu_item_srl = getNextSequence();
|
||||
$item_info->parent_srl = $parent_srl;
|
||||
$item_info->parent_menu_name = $parent_info->name;
|
||||
|
||||
// root에 메뉴 추가하거나 기존 메뉴의 수정일 경우
|
||||
} else {
|
||||
// menu_item_srl 이 있으면 해당 메뉴의 정보를 가져온다
|
||||
if($menu_item_srl) $item_info = $this->getMenuItemInfo($menu_item_srl);
|
||||
|
||||
// 찾아진 값이 없다면 신규 메뉴 추가로 보고 menu_item_srl값만 구해줌
|
||||
if(!$item_info->menu_item_srl) {
|
||||
$item_info->menu_item_srl = getNextSequence();
|
||||
}
|
||||
}
|
||||
|
||||
Context::set('item_info', $item_info);
|
||||
|
||||
// template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다.
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
$tpl = $oTemplate->compile($this->module_path.'tpl', 'menu_item_info');
|
||||
|
||||
// return 할 변수 설정
|
||||
$this->add('tpl', $tpl);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
106
modules/menu/menu.admin.view.php
Normal file
106
modules/menu/menu.admin.view.php
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
/**
|
||||
* @class menuAdminView
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief menu 모듈의 admin view class
|
||||
**/
|
||||
|
||||
class menuAdminView extends menu {
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
**/
|
||||
function init() {
|
||||
$this->setTemplatePath($this->module_path.'tpl');
|
||||
Context::addJsFile('./common/js/tree_menu.js');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 관리의 첫 페이지
|
||||
**/
|
||||
function dispMenuAdminContent() {
|
||||
// 등록된 메뉴 목록을 구해옴
|
||||
$obj->page = Context::get('page');
|
||||
$obj->sort_index = 'listorder';
|
||||
$obj->list_count = 20;
|
||||
$obj->page_count = 20;
|
||||
|
||||
$oMenuModel = &getAdminModel('menu');
|
||||
$output = $oMenuModel->getMenuList($obj);
|
||||
|
||||
Context::set('total_count', $output->total_count);
|
||||
Context::set('total_page', $output->total_page);
|
||||
Context::set('page', $output->page);
|
||||
Context::set('menu_list', $output->data);
|
||||
Context::set('page_navigation', $output->page_navigation);
|
||||
|
||||
$this->setTemplateFile('index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 등록 페이지
|
||||
**/
|
||||
function dispMenuAdminInsert() {
|
||||
// 선택된 메뉴의 정보르 구해서 세팅
|
||||
$menu_srl = Context::get('menu_srl');
|
||||
|
||||
if($menu_srl) {
|
||||
// 메뉴의 정보를 가져옴
|
||||
$oMenuModel = &getAdminModel('menu');
|
||||
$menu_info = $oMenuModel->getMenu($menu_srl);
|
||||
if($menu_info->menu_srl == $menu_srl) Context::set('menu_info', $menu_info);
|
||||
}
|
||||
|
||||
$this->setTemplateFile('menu_insert');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 메뉴 관리 페이지
|
||||
**/
|
||||
function dispMenuAdminManagement() {
|
||||
// 선택된 메뉴의 정보르 구해서 세팅
|
||||
$menu_srl = Context::get('menu_srl');
|
||||
|
||||
if(!$menu_srl) return $this->dispMenuAdminContent();
|
||||
|
||||
// 메뉴의 정보를 가져옴
|
||||
$oMenuModel = &getAdminModel('menu');
|
||||
$menu_info = $oMenuModel->getMenu($menu_srl);
|
||||
if($menu_info->menu_srl != $menu_srl) return $this->dispMenuAdminContent();
|
||||
|
||||
Context::set('menu_info', $menu_info);
|
||||
|
||||
// 레이아웃을 팝업으로 지정
|
||||
Context::set('layout','none');
|
||||
$this->setTemplateFile('menu_management');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 메뉴에서 선택할 수 있는 mid목록을 보여줌
|
||||
**/
|
||||
function dispMenuAdminMidList() {
|
||||
$oModuleModel = &getModel('module');
|
||||
|
||||
// 모듈 카테고리 목록을 구함
|
||||
$module_category = $oModuleModel->getModuleCategories();
|
||||
Context::set('module_category', $module_category);
|
||||
|
||||
// 모듈 목록을 구함
|
||||
$module_list = $oModuleModel->getModuleList();
|
||||
Context::set('module_list', $module_list);
|
||||
|
||||
// mid 목록을 구해옴
|
||||
$args->module_category_srl = Context::get('module_category_srl');
|
||||
$args->module = Context::get('target_module');
|
||||
$mid_list = $oModuleModel->getMidList($args);
|
||||
Context::set('mid_list', $mid_list);
|
||||
|
||||
// 메뉴을 팝업으로 지정
|
||||
$this->setLayoutFile('popup_layout');
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('mid_list');
|
||||
}
|
||||
}
|
||||
?>
|
||||
40
modules/menu/menu.class.php
Normal file
40
modules/menu/menu.class.php
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
/**
|
||||
* @class menu
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief menu 모듈의 high class
|
||||
**/
|
||||
|
||||
class menu extends ModuleObject {
|
||||
|
||||
/**
|
||||
* @brief 설치시 추가 작업이 필요할시 구현
|
||||
**/
|
||||
function moduleInstall() {
|
||||
// action forward에 등록 (관리자 모드에서 사용하기 위함)
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminContent');
|
||||
$oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminInsert');
|
||||
$oModuleController->insertActionForward('menu', 'view', 'dispMenuAdminManagement');
|
||||
|
||||
// 메뉴 사용할 디렉토리 생성
|
||||
FileHandler::makeDir('./files/cache/menu');
|
||||
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 설치가 이상이 없는지 체크하는 method
|
||||
**/
|
||||
function checkUpdate() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 업데이트 실행
|
||||
**/
|
||||
function moduleUpdate() {
|
||||
return new Object();
|
||||
}
|
||||
}
|
||||
?>
|
||||
8
modules/menu/queries/deleteMenu.xml
Normal file
8
modules/menu/queries/deleteMenu.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteMenu" action="delete">
|
||||
<tables>
|
||||
<table name="menu" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/menu/queries/deleteMenuItem.xml
Normal file
8
modules/menu/queries/deleteMenuItem.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteMenuItem" action="delete">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_item_srl" var="menu_item_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/menu/queries/deleteMenuItems.xml
Normal file
8
modules/menu/queries/deleteMenuItems.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteMenuItems" action="delete">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
8
modules/menu/queries/deleteMenuLayout.xml
Normal file
8
modules/menu/queries/deleteMenuLayout.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<query id="deleteMenuLayout" action="delete">
|
||||
<tables>
|
||||
<table name="menu_layout" />
|
||||
</tables>
|
||||
<conditions>
|
||||
<condition operation="in" column="menu_srl" var="menu_srls" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/menu/queries/getChildMenuCount.xml
Normal file
11
modules/menu/queries/getChildMenuCount.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getChildMenuCount" action="select">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="parent_srl" var="menu_item_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/menu/queries/getMenu.xml
Normal file
11
modules/menu/queries/getMenu.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getMenu" action="select">
|
||||
<tables>
|
||||
<table name="menu" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
11
modules/menu/queries/getMenuItem.xml
Normal file
11
modules/menu/queries/getMenuItem.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getMenuItem" action="select">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_item_srl" var="menu_item_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
14
modules/menu/queries/getMenuItems.xml
Normal file
14
modules/menu/queries/getMenuItems.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="getMenuItems" action="select">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="listorder" order="desc" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/menu/queries/getMenuLayout.xml
Normal file
11
modules/menu/queries/getMenuLayout.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getMenuLayout" action="select">
|
||||
<tables>
|
||||
<table name="menu_layout" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="layout_srl" alias="layout_srl" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
14
modules/menu/queries/getMenuList.xml
Normal file
14
modules/menu/queries/getMenuList.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<query id="getMenuList" action="select">
|
||||
<tables>
|
||||
<table name="menu" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<navigation>
|
||||
<index var="sort_index" default="listorder" order="asc" />
|
||||
<list_count var="list_count" default="20" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/menu/queries/getMenus.xml
Normal file
11
modules/menu/queries/getMenus.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="getMenus" action="select">
|
||||
<tables>
|
||||
<table name="menu" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<navigation>
|
||||
<index var="sort_index" default="listorder" order="asc" />
|
||||
</navigation>
|
||||
</query>
|
||||
11
modules/menu/queries/insertMenu.xml
Normal file
11
modules/menu/queries/insertMenu.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="insertMenu" action="insert">
|
||||
<tables>
|
||||
<table name="menu" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
<column name="listorder" var="listorder" notnull="notnull" />
|
||||
<column name="regdate" var="regdate" default="curdate()" />
|
||||
</columns>
|
||||
</query>
|
||||
20
modules/menu/queries/insertMenuItem.xml
Normal file
20
modules/menu/queries/insertMenuItem.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<query id="insertMenuItem" action="insert">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="menu_item_srl" var="menu_item_srl" filter="number" notnull="notnull" />
|
||||
<column name="parent_srl" var="parent_srl" filter="number" default="0" />
|
||||
<column name="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
<column name="name" var="name" notnull="notnull" />
|
||||
<column name="url" var="url" />
|
||||
<column name="open_window" var="open_window" />
|
||||
<column name="expand" var="expand" />
|
||||
<column name="normal_btn" var="normal_btn" />
|
||||
<column name="hover_btn" var="hover_btn" />
|
||||
<column name="active_btn" var="active_btn" />
|
||||
<column name="group_srls" var="group_srls" />
|
||||
<column name="listorder" var="listorder" notnull="notnull" />
|
||||
<column name="regdate" var="regdate" default="curdate()" />
|
||||
</columns>
|
||||
</query>
|
||||
9
modules/menu/queries/insertMenuLayout.xml
Normal file
9
modules/menu/queries/insertMenuLayout.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<query id="insertMenuLayout" action="insert">
|
||||
<tables>
|
||||
<table name="menu_layout" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
<column name="layout_srl" var="layout_srl" filter="number" notnull="notnull" />
|
||||
</columns>
|
||||
</query>
|
||||
11
modules/menu/queries/updateMenu.xml
Normal file
11
modules/menu/queries/updateMenu.xml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
<query id="updateMenu" action="update">
|
||||
<tables>
|
||||
<table name="menu" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="title" var="title" notnull="notnull" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
18
modules/menu/queries/updateMenuItem.xml
Normal file
18
modules/menu/queries/updateMenuItem.xml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<query id="updateMenuItem" action="update">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="name" var="name" notnull="notnull" />
|
||||
<column name="url" var="url" />
|
||||
<column name="open_window" var="open_window" />
|
||||
<column name="expand" var="expand" />
|
||||
<column name="normal_btn" var="normal_btn" />
|
||||
<column name="hover_btn" var="hover_btn" />
|
||||
<column name="active_btn" var="active_btn" />
|
||||
<column name="group_srls" var="group_srls" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_item_srl" var="menu_item_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
12
modules/menu/queries/updateMenuItemParent.xml
Normal file
12
modules/menu/queries/updateMenuItemParent.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="updateMenuItemParent" action="update">
|
||||
<tables>
|
||||
<table name="menu_item" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="parent_srl" var="parent_srl" default="0" />
|
||||
<column name="listorder" var="listorder" notnull="notnull" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="menu_item_srl" var="menu_item_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
</query>
|
||||
6
modules/menu/schemas/menu.xml
Normal file
6
modules/menu/schemas/menu.xml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
<table name="menu">
|
||||
<column name="menu_srl" type="number" size="12" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="title" type="varchar" size="250" />
|
||||
<column name="listorder" type="number" size="11" default="0" inex="idx_listorder" />
|
||||
<column name="regdate" type="date" index="idx_regdate" />
|
||||
</table>
|
||||
15
modules/menu/schemas/menu_item.xml
Normal file
15
modules/menu/schemas/menu_item.xml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<table name="menu_item">
|
||||
<column name="menu_item_srl" type="number" size="12" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="parent_srl" type="number" size="12" notnull="notnull" default="0" />
|
||||
<column name="menu_srl" type="number" size="12" notnull="notnull" index="idx_menu_srl" />
|
||||
<column name="name" type="varchar" size="250" />
|
||||
<column name="url" type="varchar" size="250" />
|
||||
<column name="open_window" type="char" size="1" default="N" />
|
||||
<column name="expand" type="char" size="1" default="N" />
|
||||
<column name="normal_btn" type="varchar" size="255" />
|
||||
<column name="hover_btn" type="varchar" size="255" />
|
||||
<column name="active_btn" type="varchar" size="255" />
|
||||
<column name="group_srls" type="text" />
|
||||
<column name="listorder" type="number" size="11" default="0" inex="idx_listorder" />
|
||||
<column name="regdate" type="date" index="idx_regdate" />
|
||||
</table>
|
||||
4
modules/menu/schemas/menu_layout.xml
Normal file
4
modules/menu/schemas/menu_layout.xml
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<table name="menu_layout">
|
||||
<column name="menu_srl" type="number" size="12" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="layout_srl" type="number" size="12" notnull="notnull" />
|
||||
</table>
|
||||
12
modules/menu/tpl/css/menu.css
Normal file
12
modules/menu/tpl/css/menu.css
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
@charset "utf-8";
|
||||
|
||||
h3 { margin:0 20px 0 20px; }
|
||||
.menuManagement { margin:20px; }
|
||||
.menuListZone td { vertical-align:top; }
|
||||
.menuListZone td.category_zone { padding-right:10px; }
|
||||
|
||||
#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; }
|
||||
#category_list .checkbox { margin-top:1em; border:0px; }
|
||||
|
||||
#menu_zone_info { background-color:#FFFFFF; z-index:999; display:none; overflow:hidden; padding-left:10px; border-left:1px dashed #CCCCCC; }
|
||||
#category_info { background-color:#FFFFFF; z-index:999; display:none; overflow:hidden; padding-left:10px; border-left:1px dashed #CCCCCC; }
|
||||
9
modules/menu/tpl/filter/delete_menu.xml
Normal file
9
modules/menu/tpl/filter/delete_menu.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<filter name="delete_menu" module="menu" act="procMenuAdminDelete" confirm_msg_code="confirm_delete">
|
||||
<form>
|
||||
<node target="menu_srl" required="true" />
|
||||
</form>
|
||||
<response callback_func="completeDeleteMenu">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
</response>
|
||||
</filter>
|
||||
13
modules/menu/tpl/filter/delete_menu_item.xml
Normal file
13
modules/menu/tpl/filter/delete_menu_item.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<filter name="delete_menu_item" module="menu" act="procMenuAdminDeleteItem" confirm_msg_code="confirm_delete">
|
||||
<form>
|
||||
<node target="menu_srl" required="true" />
|
||||
</form>
|
||||
<response callback_func="completeDeleteMenuItem">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="menu_title" />
|
||||
<tag name="xml_file" />
|
||||
<tag name="menu_srl" />
|
||||
<tag name="menu_item_srl" />
|
||||
</response>
|
||||
</filter>
|
||||
10
modules/menu/tpl/filter/insert_menu.xml
Normal file
10
modules/menu/tpl/filter/insert_menu.xml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<filter name="insert_menu" module="menu" act="procMenuAdminInsert" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="title" required="true" />
|
||||
</form>
|
||||
<response callback_func="completeInsertMenu">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="menu_srl" />
|
||||
</response>
|
||||
</filter>
|
||||
14
modules/menu/tpl/filter/insert_menu_item.xml
Normal file
14
modules/menu/tpl/filter/insert_menu_item.xml
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<filter name="insert_menu_item" module="menu" act="procMenuAdminInsertItem" confirm_msg_code="confirm_submit">
|
||||
<form>
|
||||
<node target="menu_srl" required="true" />
|
||||
</form>
|
||||
<response callback_func="completeInsertMenuItem">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="menu_srl" />
|
||||
<tag name="xml_file" />
|
||||
<tag name="menu_title" />
|
||||
<tag name="menu_item_srl" />
|
||||
<tag name="parent_srl" />
|
||||
</response>
|
||||
</filter>
|
||||
10
modules/menu/tpl/filter/move_menu_item.xml
Normal file
10
modules/menu/tpl/filter/move_menu_item.xml
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
<filter name="move_menu_item" module="menu" act="procMenuAdminMoveItem" confirm_msg_code="confirm_move">
|
||||
<form />
|
||||
<parameter />
|
||||
<response callback_func="completeMoveMenuItem">
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
<tag name="xml_file" />
|
||||
<tag name="source_item_srl" />
|
||||
</response>
|
||||
</filter>
|
||||
9
modules/menu/tpl/filter/update_menu_title.xml
Normal file
9
modules/menu/tpl/filter/update_menu_title.xml
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
<filter name="update_menu_title" module="menu" act="procMenuAdminUpdate" confirm_msg_code="confirm_modify">
|
||||
<form>
|
||||
<node target="menu_srl" required="true" />
|
||||
</form>
|
||||
<response>
|
||||
<tag name="error" />
|
||||
<tag name="message" />
|
||||
</response>
|
||||
</filter>
|
||||
3
modules/menu/tpl/header.html
Normal file
3
modules/menu/tpl/header.html
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<!--%import("js/board_admin.js")-->
|
||||
|
||||
<h3>{$lang->menu} <span class="gray">{$lang->cmd_management}</span></h3>
|
||||
55
modules/menu/tpl/index.html
Normal file
55
modules/menu/tpl/index.html
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<!--%import("filter/delete_menu.xml")-->
|
||||
<!--%import("js/menu_admin.js")-->
|
||||
<!--#include("header.html")-->
|
||||
|
||||
<div class="infoText">{nl2br($lang->about_menu)}</div>
|
||||
|
||||
<!-- 정보 -->
|
||||
<div class="tableSummaryType1">
|
||||
Total <strong>{number_format($total_count)}</strong>, Page <strong>{number_format($page)}</strong>/{number_format($total_page)}
|
||||
</div>
|
||||
|
||||
<!-- 삭제를 위한 임시 form -->
|
||||
<form id="fo_menu" action="./" method="get">
|
||||
<input type="hidden" name="menu_srl" value="" />
|
||||
</form>
|
||||
|
||||
<!-- 목록 -->
|
||||
<table cellspacing="0" class="tableType1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{$lang->no}</th>
|
||||
<th scope="col">{$lang->title}</th>
|
||||
<th scope="col">{$lang->regdate}</th>
|
||||
<th scope="col">{$lang->cmd_delete}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!--@foreach($menu_list as $no => $val)-->
|
||||
<tr>
|
||||
<td class="tahoma">{$no}</td>
|
||||
<td class="blue"><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 class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
|
||||
<td class="red"><a href="#" onclick="doDeleteMenu('{$val->menu_srl}');return false;">{$lang->cmd_delete}</a></td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- 버튼 -->
|
||||
<div class="fr gap1">
|
||||
<a href="{getUrl('act','dispMenuAdminInsert','module_srl','')}" class="button"><span>{$lang->cmd_make}</span></a>
|
||||
</div>
|
||||
|
||||
<!-- 페이지 네비게이션 -->
|
||||
<div class="pageNavigation">
|
||||
<a href="{getUrl('page','','module_srl','')}" class="goToFirst"><img src="../../admin/tpl/images/bottomGotoFirst.gif" alt="{$lang->first_page}" width="7" height="5" /></a>
|
||||
<!--@while($page_no = $page_navigation->getNextPage())-->
|
||||
<!--@if($page == $page_no)-->
|
||||
<span class="current">{$page_no}</span>
|
||||
<!--@else-->
|
||||
<a href="{getUrl('page',$page_no,'module_srl','')}">{$page_no}</a>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="goToLast"><img src="../../admin/tpl/images/bottomGotoLast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
|
||||
</div>
|
||||
197
modules/menu/tpl/js/menu_admin.js
Normal file
197
modules/menu/tpl/js/menu_admin.js
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
/* 메뉴 입력후 */
|
||||
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) {
|
||||
var fo_obj = xGetElementById("fo_menu");
|
||||
if(!fo_obj) return;
|
||||
fo_obj.menu_srl.value = menu_srl;
|
||||
procFilter(fo_obj, delete_menu);
|
||||
}
|
||||
|
||||
/* 메뉴 삭제 후 */
|
||||
function completeDeleteMenu(ret_obj) {
|
||||
var menu_srl = ret_obj['menu_srl'];
|
||||
alert(ret_obj['message']);
|
||||
location.href = current_url.setQuery('act','dispMenuAdminContent').setQuery('menu_srl','');
|
||||
}
|
||||
|
||||
/* 빈 메뉴 아이템 추가 */
|
||||
function doInsertMenuItem(parent_srl) {
|
||||
if(typeof(parent_srl)=='undefined') parent_srl = 0;
|
||||
var params = {node_srl:0, parent_srl:parent_srl}
|
||||
doGetMenuItemInfo('menu', params);
|
||||
deSelectNode();
|
||||
}
|
||||
|
||||
/* 메뉴 클릭시 적용할 함수 */
|
||||
function doGetMenuItemInfo(menu_id, obj) {
|
||||
// menu, menu_id, node_srl을 추출
|
||||
var fo_obj = xGetElementById("fo_menu");
|
||||
var node_srl = 0;
|
||||
var parent_srl = 0;
|
||||
|
||||
if(typeof(obj)!="undefined") {
|
||||
if(typeof(obj.getAttribute)!="undefined") {
|
||||
node_srl = obj.getAttribute("node_srl");
|
||||
} else {
|
||||
node_srl = obj.node_srl;
|
||||
parent_srl = obj.parent_srl;
|
||||
}
|
||||
}
|
||||
|
||||
var params = new Array();
|
||||
params["menu_item_srl"] = node_srl;
|
||||
params["parent_srl"] = parent_srl;
|
||||
|
||||
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
|
||||
var response_tags = new Array('error','message','tpl');
|
||||
exec_xml('menu', 'getMenuAdminTplInfo', params, completeGetMenuItemTplInfo, 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('menu_zone_info');
|
||||
xInnerHtml(obj,'');
|
||||
obj.style.display = "none";
|
||||
}
|
||||
|
||||
function completeGetMenuItemTplInfo(ret_obj, response_tags) {
|
||||
var obj = xGetElementById('menu_zone_info');
|
||||
var tpl = ret_obj['tpl'];
|
||||
xInnerHtml(obj, tpl);
|
||||
obj.style.display = 'block';
|
||||
|
||||
var fo_obj = xGetElementById("fo_menu");
|
||||
fo_obj.menu_name.focus();
|
||||
|
||||
/*
|
||||
var x = _xPos + 50;
|
||||
var y = _yPos - xHeight(obj)/2 + 80 + xScrollTop();
|
||||
xLeft(obj, x);
|
||||
xTop(obj, y);
|
||||
xRemoveEventListener(document,'mousedown',checkMousePosition);
|
||||
|
||||
if(xGetElementById('cBody') && xHeight('cBody')< y+xHeight(obj)+50) {
|
||||
xHeight('cBody', y + xHeight(obj) + 50);
|
||||
}
|
||||
|
||||
if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter();
|
||||
*/
|
||||
}
|
||||
|
||||
/* 메뉴 아이템 입력후 */
|
||||
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_srl, target_item_srl) {
|
||||
var fo_obj = xGetElementById("fo_move_menu");
|
||||
fo_obj.menu_id.value = menu_id;
|
||||
fo_obj.source_item_srl.value = source_item_srl;
|
||||
fo_obj.target_item_srl.value = target_item_srl;
|
||||
|
||||
// 이동 취소를 선택하였을 경우 다시 그림;;
|
||||
if(!procFilter(fo_obj, move_menu_item)) {
|
||||
var params = new Array();
|
||||
params["xml_file"] = xGetElementById('fo_menu').xml_file.value;
|
||||
params["source_item_srl"] = source_item_srl;
|
||||
completeMoveMenuItem(params);
|
||||
}
|
||||
}
|
||||
|
||||
function completeMoveMenuItem(ret_obj) {
|
||||
var source_item_srl = ret_obj['source_item_srl'];
|
||||
var xml_file = ret_obj['xml_file'];
|
||||
|
||||
var fo_menu = xGetElementById("fo_menu");
|
||||
if(!fo_menu) return;
|
||||
|
||||
var title = fo_menu.title.value;
|
||||
loadTreeMenu(xml_file, 'menu', "menu_zone_menu", title, '', doGetMenuItemInfo, source_item_srl, doMoveTree);
|
||||
}
|
||||
|
||||
/* 메뉴 목록 갱신 */
|
||||
function doReloadTreeMenu(menu_srl) {
|
||||
var params = new Array();
|
||||
params["menu_srl"] = menu_srl;
|
||||
|
||||
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
|
||||
var response_tags = new Array('error','message', 'xml_file', 'menu_title');
|
||||
exec_xml('menu', 'procMenuAdminMakeXmlFile', params, completeInsertMenuItem, response_tags, params);
|
||||
}
|
||||
|
||||
/* 메뉴 삭제 */
|
||||
function doDeleteMenuItem(menu_item_srl) {
|
||||
var fo_obj = xGetElementById("fo_menu");
|
||||
if(!fo_obj) return;
|
||||
|
||||
procFilter(fo_obj, delete_menu_item);
|
||||
}
|
||||
|
||||
/* 메뉴 아이템 삭제 후 */
|
||||
function completeDeleteMenuItem(ret_obj) {
|
||||
var menu_title = ret_obj['menu_title'];
|
||||
var menu_srl = ret_obj['menu_srl'];
|
||||
var menu_item_srl = ret_obj['menu_item_srl'];
|
||||
var xml_file = ret_obj['xml_file'];
|
||||
alert(ret_obj['message']);
|
||||
|
||||
loadTreeMenu(xml_file, 'menu', 'menu_zone_menu', menu_title, '', doGetMenuItemInfo, menu_item_srl, doMoveTree);
|
||||
xInnerHtml("menu_zone_info", "");
|
||||
}
|
||||
|
||||
|
||||
/* 레이아웃의 메뉴에 mid 추가 */
|
||||
function doInsertMid(mid, menu_id) {
|
||||
if(!opener) {
|
||||
window.close();
|
||||
return;
|
||||
}
|
||||
|
||||
var fo_obj = opener.xGetElementById("fo_menu");
|
||||
if(!fo_obj) {
|
||||
window.close();
|
||||
return;
|
||||
}
|
||||
|
||||
fo_obj.menu_url.value = mid;
|
||||
window.close();
|
||||
}
|
||||
26
modules/menu/tpl/menu_insert.html
Normal file
26
modules/menu/tpl/menu_insert.html
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<!--%import("filter/insert_menu.xml")-->
|
||||
<!--%import("js/menu_admin.js")-->
|
||||
<!--#include("header.html")-->
|
||||
|
||||
<form action="./" method="get" onsubmit="return procFilter(this, insert_menu)">
|
||||
|
||||
<table cellspacing="0" class="tableType2 gap1">
|
||||
<tr>
|
||||
<th scope="col">{$lang->cmd_menu_insert}</th>
|
||||
<td>{nl2br($lang->about_menu_management)}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="col">{$lang->title}</th>
|
||||
<td>
|
||||
<input type="text" name="title" value="{$menu_info->title}" class="inputTypeText" />
|
||||
<p>{$lang->about_title}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- 버튼 -->
|
||||
<div class="tRight gap1">
|
||||
<span class="button"><input type="submit" value="{$lang->cmd_submit}" accesskey="s" /></span>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
82
modules/menu/tpl/menu_item_info.html
Normal file
82
modules/menu/tpl/menu_item_info.html
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
<input type="hidden" name="menu_item_srl" value="{$item_info->menu_item_srl}" />
|
||||
<input type="hidden" name="parent_srl" value="{$item_info->parent_srl}" />
|
||||
|
||||
<table cellspacing="0" class="tableType2">
|
||||
<col width="140" />
|
||||
<col width="*" />
|
||||
<!--@if($item_info->parent_menu_name)-->
|
||||
<tr>
|
||||
<th scope="row">{$lang->parent_menu_name}</th>
|
||||
<td>{$item_info->parent_menu_name}</td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
<tr>
|
||||
<th scope="row" scope="row">{$lang->menu_name}</th>
|
||||
<td>
|
||||
<input type="text" name="menu_name" value="{htmlspecialchars($item_info->name)}" class="inputTypeText"/>
|
||||
<p>{$lang->about_menu_name}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_url}</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>
|
||||
<p class="clear">{$lang->about_menu_url}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_open_window}</th>
|
||||
<td>
|
||||
<input type="checkbox" name="menu_open_window" value="Y" <!--@if($item_info->open_window=="Y")-->checked="checked"<!--@end--> />
|
||||
<p>{$lang->about_menu_open_window}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_expand}</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">{$lang->menu_img_btn}</th>
|
||||
<td>{$lang->about_menu_img_btn}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_normal_btn}</th>
|
||||
<td><input type="text" name="menu_normal_btn" value="{htmlspecialchars($item_info->normal_btn)}" class="inputTypeText" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_hover_btn}</th>
|
||||
<td><input type="text" name="menu_hover_btn" value="{htmlspecialchars($item_info->hover_btn)}" class="inputTypeText" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_active_btn}</th>
|
||||
<td><input type="text" name="menu_active_btn" value="{htmlspecialchars($item_info->active_btn)}" class="inputTypeText" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">{$lang->menu_group_srls}</th>
|
||||
<td>
|
||||
<!--@foreach($group_list as $key=>$val)-->
|
||||
<input type="checkbox" name="group_srls" value="{$key}" id="group_{$key}" <!--@if(is_array($item_info->group_srls)&&in_array($key, $item_info->group_srls))-->checked="checked"<!--@end-->/>
|
||||
<label for="group_{$key}">{$val->title}</label>
|
||||
<!--@end-->
|
||||
<p>{$lang->about_menu_group_srls}</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="fl gap1">
|
||||
<!--@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>
|
||||
</div>
|
||||
|
||||
<div class="fr gap1">
|
||||
<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>
|
||||
91
modules/menu/tpl/menu_management.html
Normal file
91
modules/menu/tpl/menu_management.html
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
<!--%import("filter/update_menu_title.xml")-->
|
||||
<!--%import("filter/insert_menu_item.xml")-->
|
||||
<!--%import("filter/delete_menu_item.xml")-->
|
||||
<!--%import("filter/move_menu_item.xml")-->
|
||||
<!--%import("css/menu.css")-->
|
||||
<!--%import("js/menu_admin.js")-->
|
||||
<!--#include("header.html")-->
|
||||
|
||||
<div class="menuManagement">
|
||||
|
||||
<!-- 메뉴 이동을 위해 임시로 사용하는 form -->
|
||||
<form id="fo_move_menu" action="./" method="get">
|
||||
<input type="hidden" name="menu_id" />
|
||||
<input type="hidden" name="source_item_srl" />
|
||||
<input type="hidden" name="target_item_srl" />
|
||||
</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}" />
|
||||
<table cellspacing="0" class="tableType3">
|
||||
<tr>
|
||||
<th scope="col">{$lang->title}</th>
|
||||
<td>
|
||||
<div class="fl">
|
||||
<input type="text" name="title" value="{htmlspecialchars($menu_info->title)}" class="inputTypeText" />
|
||||
</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">{$lang->menu_management}</th>
|
||||
<td class="left">{nl2br($lang->about_menu_management)}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
<!--@else-->
|
||||
<table cellspacing="0" class="tableType3">
|
||||
<tr>
|
||||
<th scope="col">{$lang->title}</th>
|
||||
<td class="left">
|
||||
{$menu_info->title}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="col">{$lang->menu_management}</th>
|
||||
<td class="left">{nl2br($lang->about_menu_management)}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<!--@end-->
|
||||
|
||||
<div class="gap1">
|
||||
<form id="fo_menu" action="./" method="get" onsubmit="return procFilter(this, insert_menu_item)" class="clear">
|
||||
<input type="hidden" name="title" value="{$menu_info->title}" />
|
||||
<input type="hidden" name="menu_srl" value="{$menu_info->menu_srl}" />
|
||||
<input type="hidden" name="xml_file" value="{$menu_info->xml_file}" />
|
||||
<input type="hidden" name="php_file" value="{$menu_info->php_file}" />
|
||||
|
||||
<table class="menuListZone">
|
||||
<tr>
|
||||
<td class="category_zone">
|
||||
<div id="category_list">
|
||||
<div id="menu_zone_menu"></div>
|
||||
<p><input type="checkbox" id="menu_enable_move" class="checkbox" /> <label for="menu_enable_move">{$lang->cmd_enable_move_menu}</label></p>
|
||||
</div>
|
||||
</td>
|
||||
<td class="menu_zone">
|
||||
<div id="menu_zone_info"></div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div class="fl gap1">
|
||||
<a href="#" onclick="doInsertMenuItem(0);return false;" class="button"><span>{$lang->cmd_insert}</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>
|
||||
<a href="#" onclick="doReloadTreeMenu('{$menu_info->menu_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<script type="text/javascript">
|
||||
loadTreeMenu("{$menu_info->xml_file}", "menu", "menu_zone_menu", "{$menu_info->title}", '', doGetMenuItemInfo, 0, doMoveTree);
|
||||
</script>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
58
modules/menu/tpl/mid_list.html
Normal file
58
modules/menu/tpl/mid_list.html
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
<!--%import("js/menu_admin.js")-->
|
||||
<div id="popHeadder" class="w700">
|
||||
<h1>{$lang->cmd_search_mid}</h1>
|
||||
</div>
|
||||
|
||||
<div id="popBody" class="w700">
|
||||
<form action="./" method="get">
|
||||
<input type="hidden" name="module" value="{$module}" />
|
||||
<input type="hidden" name="act" value="{$act}" />
|
||||
|
||||
<table cellspacing="0" class="tableType5">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="row" colspan="2" class="nowrap">
|
||||
<select name="module_category_srl" class="w5">
|
||||
<option value="">{$lang->module_category}</option>
|
||||
<!--@foreach($module_category as $key => $val)-->
|
||||
<option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<select name="target_module" class="w5">
|
||||
<option value="">{$lang->module}</option>
|
||||
<!--@foreach($module_list as $key => $val)-->
|
||||
<option value="{$val->module}" <!--@if($target_module ==$val->module)-->selected="selected"<!--@end-->>{$val->module}</option>
|
||||
<!--@end-->
|
||||
</select>
|
||||
<span class="button"><input type="submit" name="go_button" value="GO" /></span>
|
||||
</th>
|
||||
<th scope="row">{$lang->mid}</th>
|
||||
<th scope="row">{$lang->cmd_select}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!--@foreach($mid_list as $key => $val)-->
|
||||
<tr>
|
||||
<td>
|
||||
<!--@if(!$val->module_category_srl)-->
|
||||
{$lang->not_exists}
|
||||
<!--@else-->
|
||||
{$module_category[$val->module_category_srl]->title}
|
||||
<!--@end-->
|
||||
</td>
|
||||
<td class="tahoma">{$val->module}</td>
|
||||
<td class="tahoma">{$val->browser_title} ({$key})</td>
|
||||
<td class="blue tCenter"><a href="#" onclick="doInsertMid('{$key}','{$menu_id}'); return false;">{$lang->cmd_select}</a></td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="popFooter" class="w700">
|
||||
<div class="tCenter gap1">
|
||||
<a href="#" onclick="window.close(); return false;" class="button"><span>{$lang->cmd_close}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue