Fix #2070 add class support to menu items

This commit is contained in:
Kijin Sung 2023-09-12 22:01:28 +09:00
parent 1ec0d74e77
commit 3ddf1392f9
9 changed files with 70 additions and 20 deletions

View file

@ -133,3 +133,5 @@ $lang->no_use_skin = 'Will not use any skin';
$lang->menu_desc = 'Description';
$lang->menu_icon = 'Icon';
$lang->about_menu_icon = 'If and how the icon code is interpreted is up to the layout designer.';
$lang->menu_class = 'HTML Class';
$lang->about_menu_class = 'If and how the class name is interpreted is up to the layout designer.';

View file

@ -24,11 +24,11 @@ $lang->depth = '단계';
$lang->parent_menu_name = '상위 메뉴명';
$lang->menu_name = '메뉴 이름';
$lang->menu_srl = '메뉴 고유 번호';
$lang->menu_id = '메뉴 ID';
$lang->menu_url = '메뉴 URL';
$lang->menu_id = $lang->menu_url;
$lang->browser_title = '브라우저 제목';
$lang->about_browser_title = '브라우저 제목에 나타나는 값입니다. RSS/Trackback에서도 사용됩니다.';
$lang->menu_type = '메뉴 타입';
$lang->menu_url = '연결 url';
$lang->menu_open_window = '메뉴 클릭시 새 창으로 열기';
$lang->menu_self_window = '현재창 열기';
$lang->menu_expand = '늘 펼쳐진 상태로 있게 합니다';
@ -149,3 +149,5 @@ $lang->no_use_skin = '스킨 사용 안 함';
$lang->menu_desc = '메뉴 설명';
$lang->menu_icon = '메뉴 아이콘';
$lang->about_menu_icon = '아이콘 코드를 어떻게 해석하는지는 레이아웃에 따라 다를 수 있습니다.';
$lang->menu_class = '메뉴 클래스';
$lang->about_menu_class = '메뉴 클래스를 어떻게 사용하는지는 레이아웃에 따라 다를 수 있습니다.';

View file

@ -560,6 +560,7 @@ class menuAdminController extends menu
}
$args->icon = trim($request->menu_icon ?? '') ?: '';
$args->class = trim(preg_replace('/[^a-z0-9\x20_-]/', '', $request->menu_class ?? ''));
$args->desc = trim($request->menu_desc ?? '') ?: '';
$args->menu_item_srl = getNextSequence();
@ -595,6 +596,7 @@ class menuAdminController extends menu
else $args->name = $request->menu_name;
$args->icon = trim($request->menu_icon ?? '') ?: '';
$args->class = trim(preg_replace('/[^a-z0-9\x20_-]/', '', $request->menu_class ?? ''));
$args->desc = trim($request->menu_desc ?? '') ?: '';
if($request->module_id && strncasecmp('http', $request->module_id, 4) === 0)
@ -780,6 +782,7 @@ class menuAdminController extends menu
}
$args->icon = trim($request->menu_icon ?? '') ?: '';
$args->class = trim(preg_replace('/[^a-z0-9\x20_-]/', '', $request->menu_class ?? ''));
$args->desc = trim($request->menu_desc ?? '') ?: '';
unset($args->group_srls);
@ -1949,6 +1952,7 @@ class menuAdminController extends menu
$url = escape($node->url);
$icon = Rhymix\Framework\Filters\HTMLFilter::clean($node->icon ?? '', true);
$class = Rhymix\Framework\Filters\HTMLFilter::clean($node->class ?? '', true);
$desc = Rhymix\Framework\Filters\HTMLFilter::clean($node->desc ?? '', true);
$desc = preg_replace('/(\$user_lang)->(userLang[0-9]+)/', '$1->$2', $desc);
if(preg_match('/^([0-9a-zA-Z\_\-]+)$/', $node->url))
@ -1997,7 +2001,7 @@ class menuAdminController extends menu
}
$attribute = sprintf(
'node_srl="%d" parent_srl="%d" menu_name_key=%s text="<?php if(%s) { %s }?>" url="<?php print(%s?%s:"")?>" href="<?php print(%s?%s:"")?>" is_shortcut=%s icon=%s desc=%s open_window=%s expand=%s normal_btn=%s hover_btn=%s active_btn=%s link="<?php if(%s) {?>%s<?php }?>"',
'node_srl="%d" parent_srl="%d" menu_name_key=%s text="<?php if(%s) { %s }?>" url="<?php print(%s?%s:"")?>" href="<?php print(%s?%s:"")?>" is_shortcut=%s icon=%s class=%s desc=%s open_window=%s expand=%s normal_btn=%s hover_btn=%s active_btn=%s link="<?php if(%s) {?>%s<?php }?>"',
$menu_item_srl,
($node->parent_srl) ? $node->parent_srl : '',
var_export(escape($node->name ?: '', true, true), true),
@ -2009,6 +2013,7 @@ class menuAdminController extends menu
$href,
var_export($is_shortcut, true),
var_export($icon, true),
var_export($class, true),
var_export($desc, true),
var_export($open_window, true),
var_export($expand, true),
@ -2095,6 +2100,7 @@ class menuAdminController extends menu
$href = escape($node->href ?? '', false);
$url = escape($node->url ?? '', false);
$icon = Rhymix\Framework\Filters\HTMLFilter::clean($node->icon ?? '', true);
$class = Rhymix\Framework\Filters\HTMLFilter::clean($node->class ?? '', true);
$desc = Rhymix\Framework\Filters\HTMLFilter::clean($node->desc ?? '', true);
$desc = preg_replace('/(\$user_lang)-&gt;(userLang[0-9]+)/', '$1->$2', $desc);
if(preg_match('/^([0-9a-zA-Z\_\-]+)$/i', $node->url))
@ -2157,6 +2163,7 @@ class menuAdminController extends menu
"url" => (%s ? %s : ""),
"is_shortcut" => %s,
"icon" => %s,
"class" => %s,
"desc" => %s,
"open_window" => %s,
"normal_btn" => %s,
@ -2178,6 +2185,7 @@ class menuAdminController extends menu
var_export($url, true),
var_export($is_shortcut, true),
var_export($icon, true),
var_export($class, true),
var_export($desc, true),
var_export($open_window, true),
var_export($normal_btn, true),

View file

@ -40,6 +40,12 @@ class menu extends ModuleObject
return true;
}
// 2023. 09. 12 add column class
if(!$oDB->isColumnExists('menu_item', 'class'))
{
return true;
}
return false;
}
@ -62,6 +68,12 @@ class menu extends ModuleObject
{
$oDB->addColumn('menu_item', 'icon', 'varchar', 250, null, false, 'name');
}
// 2023. 09. 12 add column class
if(!$oDB->isColumnExists('menu_item', 'class'))
{
$oDB->addColumn('menu_item', 'class', 'varchar', 250, null, false, 'icon');
}
}
/**

View file

@ -8,6 +8,7 @@
<column name="menu_srl" var="menu_srl" filter="number" notnull="notnull" />
<column name="name" var="name" notnull="notnull" />
<column name="icon" var="icon" />
<column name="class" var="class" />
<column name="desc" var="desc" />
<column name="url" var="url" />
<column name="is_shortcut" var="is_shortcut" notnull="notnull" default="N" />
@ -20,4 +21,4 @@
<column name="listorder" var="listorder" notnull="notnull" />
<column name="regdate" var="regdate" default="curdate()" />
</columns>
</query>
</query>

View file

@ -7,6 +7,7 @@
<column name="parent_srl" var="parent_srl" />
<column name="name" var="name" />
<column name="icon" var="icon" />
<column name="class" var="class" />
<column name="desc" var="desc" />
<column name="url" var="url" />
<column name="is_shortcut" var="is_shortcut" />

View file

@ -4,6 +4,7 @@
<column name="menu_srl" type="number" notnull="notnull" index="idx_menu_srl" />
<column name="name" type="text" />
<column name="icon" type="varchar" size="250" />
<column name="class" type="varchar" size="250" />
<column name="desc" type="varchar" size="250" />
<column name="url" type="varchar" size="250" />
<column name="is_shortcut" type="char" size="1" default="N" />
@ -15,4 +16,4 @@
<column name="group_srls" type="text" />
<column name="listorder" type="number" default="0" index="idx_listorder" />
<column name="regdate" type="date" index="idx_regdate" />
</table>
</table>

View file

@ -160,7 +160,7 @@ padding:0;list-style:none}
.col .clone ul ul{padding-left:8px;margin-left:8px}
.col .clone ul ul li{background-position:-90px 10px;background-repeat:repeat-y}
.col .clone ul ul li:only-child,
.col .clone ul ul li:last-child{background:none}
.col .clone ul ul li:last-child{background:none}
.col .clone ul ul li:only-child>a:before{background-position:-36px 0}
.col .clone li.x_disabled>a{color:#999;text-decoration:none;cursor:not-allowed}
.col .clone li.x_selected>a{color:#000;font-weight:bold;text-decoration:underline}
@ -201,7 +201,7 @@ padding:0;list-style:none}
.download ._pagination>.x_pagination a:hover,
.download ._pagination>.x_pagination a:focus{font-weight:bold}
.download ._pagination>.x_pagination .x_active>a{color:#000}
.download .starRating,
.download .starRating,
.download .starRating>i{display:inline-block;height:15px;background:transparent url(../../../admin/tpl/img/starRating.png) no-repeat;overflow:hidden}
.download .starRating{width:79px;vertical-align:middle}
.download .starRating>i{font-size:0;line-height:0;vertical-align:top;text-indent:-100px;*text-indent:0;background-position:0 -15px}
@ -279,6 +279,7 @@ padding:0;list-style:none}
#default [for="lang_menuDesc"],
#default [for="lang_pageTitle"],
#default [for="menuIcon"],
#default [for="menuClass"],
#default [for="mid2"]{font-weight:bold;}
#default .btnBoth{position:relative;margin:5px 0;box-sizing:border-box;width:100%;}
/* Auth */
@ -331,11 +332,11 @@ padding:0;list-style:none}
/* Layout */
#layout li ul._edit_menu {display:none}
#layout li.selected ul._edit_menu {display:block}
#layout .list,
#layout .list,
#skin .list{position:relative}
#layout .mask,
#layout .mask,
#skin .mask{display:none;position:absolute;width:100%;height:100%;left:0;top:0;background:#fff;opacity:.5;filter:alpha(opacity=50);z-index:99}
#layout .disabled>.mask,
#layout .disabled>.mask,
#skin .disabled>.mask{display:block;cursor:not-allowed}
/* Full Setup */
#fullSetup .x_btn-group{position:absolute;right:4px;margin: 0 5px;}

View file

@ -191,11 +191,20 @@
</div>
</li>
<li>
<div class="x_input-append">
<label for="menuIcon2">{$lang->menu_icon}</label>
<input id="menuIcon2" class="_menuIcon" type="text" />
<label for="menuIcon2">{$lang->menu_icon} <a href="#help_menuIcon2" class="x_icon-question-sign" data-admin-toggle="#help_menuIcon2">{$lang->help}</a></label>
<div id="help_menuIcon2" class="x_alert x_alert-info">
<button type="button" class="x_close" data-admin-hide="#help_menuIcon2">×</button>
<p>{$lang->about_menu_icon}</p>
</div>
<p>{$lang->about_menu_icon}</p>
<input id="menuIcon2" class="_menuIcon" type="text" />
</li>
<li>
<label for="menuClass2">{$lang->menu_class} <a href="#help_menuClass2" class="x_icon-question-sign" data-admin-toggle="#help_menuClass2">{$lang->help}</a></label>
<div id="help_menuClass2" class="x_alert x_alert-info">
<button type="button" class="x_close" data-admin-hide="#help_menuClass2">×</button>
<p>{$lang->about_menu_class}</p>
</div>
<input id="menuClass2" class="_menuClass" type="text" />
</li>
<li>
<div class="multilingual x_input-append">
@ -204,7 +213,7 @@
</div>
</li>
<li class="typePage">
<label for="mid1">{$lang->menu_id} <a href="#help_menuId" class="x_icon-question-sign" data-admin-toggle="#mid1_help">{$lang->help}</a></label>
<label for="mid1">{$lang->menu_url} <a href="#help_menuId" class="x_icon-question-sign" data-admin-toggle="#mid1_help">{$lang->help}</a></label>
<div id="mid1_help" class="x_alert x_alert-info">
<button type="button" class="x_close" data-admin-hide="#mid1_help">×</button>
<p>{$lang->about_menu_id} {$lang->about_new_menu_id}</p>
@ -261,11 +270,20 @@
</div>
</li>
<li>
<div class="x_input-append">
<label for="menuIcon">{$lang->menu_icon}</label>
<input id="menuIcon" class="_menuIcon" type="text" />
<label for="menuIcon">{$lang->menu_icon} <a href="#help_menuIcon" class="x_icon-question-sign" data-admin-toggle="#help_menuIcon">{$lang->help}</a></label>
<div id="help_menuIcon" class="x_alert x_alert-info">
<button type="button" class="x_close" data-admin-hide="#help_menuIcon">×</button>
<p>{$lang->about_menu_icon}</p>
</div>
<p style="width:220px;min-width:100%">{$lang->about_menu_icon}</p>
<input id="menuIcon" class="_menuIcon" type="text" />
</li>
<li>
<label for="menuClass">{$lang->menu_class} <a href="#help_menuClass" class="x_icon-question-sign" data-admin-toggle="#help_menuClass">{$lang->help}</a></label>
<div id="help_menuClass" class="x_alert x_alert-info">
<button type="button" class="x_close" data-admin-hide="#help_menuClass">×</button>
<p>{$lang->about_menu_class}</p>
</div>
<input id="menuClass" class="_menuClass" type="text" />
</li>
<li>
<div class="multilingual x_input-append">
@ -1867,6 +1885,7 @@ jQuery(function($){
$('#add_menu ._save').bind("click", function(){
var sMenuName = $('#add_menu ._menuName').val();
var sMenuIcon = $('#add_menu ._menuIcon').val();
var sMenuClass = $('#add_menu ._menuClass').val();
var sMenuDesc = $('#add_menu ._menuDesc').val();
var sUrl = $('#add_menu ._mid').val();
var sTargetKey = "module_id";
@ -1917,6 +1936,7 @@ jQuery(function($){
params['menu_name_key'] = "";
params['menu_name'] = sMenuName;
params['menu_icon'] = sMenuIcon;
params['menu_class'] = sMenuClass;
params['menu_desc'] = sMenuDesc;
params['module_type'] = sSelectedModuleName;
params['menu_open_window'] = "N";
@ -1952,6 +1972,7 @@ jQuery(function($){
$(this).find('#menuName').val(htInfo.sMenuNameKey.match(/\$user_lang->/) ? htInfo.sMenuNameKey : htInfo.sText);
$(this).find('#menuIcon').val(htInfo.icon);
$(this).find('#menuClass').val(htInfo.class);
$(this).find('#menuDesc').val(htInfo.desc);
//menu_name_key
@ -2007,6 +2028,7 @@ jQuery(function($){
var sMenuName = $('#default ._menuName').val();
var sMenuIcon = $('#default ._menuIcon').val();
var sMenuClass = $('#default ._menuClass').val();
var sMenuDesc = $('#default ._menuDesc').val();
var sMID;
@ -2034,11 +2056,11 @@ jQuery(function($){
params['menu_item_srl'] = sSelectedMenuSrl;
params['menu_name'] = sMenuName;
params['menu_icon'] = sMenuIcon;
params['menu_class'] = sMenuClass;
params['menu_desc'] = sMenuDesc;
params['menu_open_window'] = sNewWindow;
params['menu_expand'] = sLeaveUnfolded;
params['browser_title'] = sBrowserTitle;
//console.log(params);return;
$.exec_json("menu.procMenuAdminUpdateItem", params, function(htData){
// select currently selected menu
$._xeAdminVar.sSelectOnload = $._xeAdminVar.sSelectedMenuSrl;