update 2.3.4 for menulist

This commit is contained in:
Amberstone 2025-01-17 02:44:12 +09:00
parent c115df4ebf
commit a73228fa09
Signed by: amber
GPG key ID: 094B0E55F98D8BF1
4 changed files with 317 additions and 165 deletions

View file

@ -71,10 +71,9 @@ if ($new == 'new' || !$code) {
add_menu_list(me_name, me_link, "<?php echo $code; ?>");
});
});
function add_menu_list(name, link, code) {
var $menulist = $("#menulist", opener.document);
var ms = new Date().getTime();
const menulist = opener.document.getElementById('menulist');
const ms = new Date().getTime();
var sub_menu_class;
<?php if ($new == 'new') { ?>
sub_menu_class = " class=\"td_category\"";
@ -82,67 +81,93 @@ if ($new == 'new' || !$code) {
sub_menu_class = " class=\"td_category sub_menu_class\"";
<?php } ?>
var list = "";
list += "<tr class=\"menu_list menu_group_<?php echo $code; ?>\" data-name='" + name + "'>";
list += "<td" + sub_menu_class + ">";
list += " <input type=\"hidden\" name=\"code[]\" value=\"<?php echo $code; ?>\" />";
list += " <input type=\"hidden\" name=\"me_level[]\" value=\"\" />";
list += " <input type=\"text\" name=\"me_name[]\" value=\"" + name + "\" id=\"me_name_" + ms + "\" required class=\"required frm_input full_input\" />";
list += "</td>";
list += "<td class=\"td_numsmall\">";
list += " ";
list += "</td>";
list += "<td class=\"td_numsmall\">";
list += " <input type=\"text\" name=\"me_parent[]\" value=\"\" class=\"frm_input\" size=\"5\">";
list += "</td>";
list += "<td class=\"td_numsmall\">";
list += " <input type=\"text\" name=\"me_depth[]\" value=\"0\" class=\"frm_input\" size=\"5\">";
list += "</td>";
list += "<td></td>";
list += "<td>";
list += " <input type=\"text\" name=\"me_icon[]\" class=\"frm_input full_input\" />";
list += "</td>";
list += "<td>";
list += " <input type=\"text\" name=\"me_link[]\" value=\"" + link + "\" class=\"frm_input full_input\" />";
list += "</td>";
list += "<td class=\"td_mng\">";
list += " <select name=\"me_target[]\">";
list += " <option value=\"self\">현재창</option>";
list += " <option value=\"blank\">새창</option>";
list += " </select>";
list += "</td>";
list += "<td class=\"td_numsmall order\">";
list += " <input type=\"text\" name=\"me_order[]\" value=\"0\" required class=\"required frm_input\" size=\"5\">";
list += "</td>";
list += "<td class=\"td_numsmall\">";
list += " <input type=\"checkbox\" name=\"me_use[]\" value=\"1\" class=\"frm_input\" checked>";
list += "</td>";
list += "<td class=\"td_mngsmall\">";
list += " <button type=\"button\" class=\"btn_del_menu\"><span class=''><span class='material-icons'>delete</span></button>";
list += "</td>";
list += "</tr>";
var $menu_last = null;
if (code)
$menu_last = $menulist.find("tr.menu_group_" + code + ":last");
else
$menu_last = $menulist.find("tr.menu_list:last");
if ($menu_last.size() > 0) {
$menu_last.after(list);
} else {
if ($menulist.find("#empty_menu_list").size() > 0)
$menulist.find("#empty_menu_list").remove();
$menulist.find("table tbody").append(list);
}
$menulist.find("tr.menu_list").each(function (index) {
$(this).removeClass("bg0 bg1")
.addClass("bg" + (index % 2));
});
let list = `
<article class="menu_list menu_group_${code}"
data-name="${sub_menu_class}">
<div class="menu_reqset">
<div class="al_menu" style="width: 50px">
<span class="al_label">사용 여부</span>
<input type="checkbox" name="me_use[]" value="1" checked>
</div>
<div class="al_menu" style="width: 60px">
<span class="al_label">정렬 순서</span>
<input type="text" name="me_order[]" value="0"
class="frm_input full_input">
</div>
<div class="al_menu al_menu_name">
<span class="al_label">메뉴 이름</span>
<input type="hidden" name="code[]" value="${code}" />
<input type="hidden" name="me_level[]" value="" />
<input type="text" name="me_name[]" value="${name}" required
class="required frm_input full_input" />
</div>
<div class="al_menu al_menu_name">
<span class="al_label">링크</span>
<input type="text" name="me_link[]" value="${link}"
class="frm_input full_input" />
</div>
<div class="al_menu" style="width: 80px">
<span class="al_label">열릴 위치</span>
<select name="me_target[]" class=" frm_input full_input">
<option value="self" selected>현재창</option>
<option value="blank">새창</option>
</select>
</div>
<button type="button" class="btn_del_menu">
<span class='material-icons'>delete</span>
</button>
</div>
<div class="al_menu_listing">
<div class="al_menu" style="width: 50px">
<span class="al_label">메뉴 ID</span>
<div class="al_value">${code}</div>
</div>
<div class="al_menu" style="width: 60px">
<span class="al_label">부모 ID</span>
<input type="text" name="me_parent[]" value=""
class="frm_input full_input">
</div>
<div class="al_menu" style="width: 60px">
<span class="al_label">깊이</span>
<input type="text" name="me_depth[]" value="0"
class="frm_input full_input">
</div>
<div class="al_menu al_center" style="width: 60px">
<i class="material-icons"></i>
</div>
<div class="al_menu">
<span class="al_label">Material Icon</span>
<input type="text" name="me_icon[]" value=""
class=" frm_input full_input" />
</div>
<div class="al_menu al_center" style="width: 60px;">
</div>
<div class="al_menu">
<span class="al_label">통상 이미지</span>
<input type="file" name="me_img_file[]" class=" frm_input full_input"
style="width:80%">
</div>
<div class="al_menu al_fill">
<span class="al_label"><?= help('* 사용하지 않을 경우 공란으로 남겨두시면 됩니다.') ?></span>
<input type="text" name="me_img[]" value=""
class=" frm_input full_input" style="width:80%">
</div>
<div class="al_menu al_center" style="width: 60px;">
</div>
<div class="al_menu">
<span class="al_label">마우스 오버 이미지</span>
<input type="file" name="me_img2_file[]" class=" frm_input full_input"
style="width:80%">
</div>
<div class="al_menu al_fill">
<span class="al_label"><?= help('* 사용하지 않을 경우 공란으로 남겨두시면 됩니다.') ?></span>
<input type="text" name="me_img2[]" value=""
class=" frm_input full_input" style="width:80%">
</div>
</div>
</article>`;
menulist.innerHTML += list;
window.close();
}
</script>

View file

@ -13,10 +13,19 @@ while ($row = sql_fetch_array($menu_update)) {
if (!in_array("me_depth", $columns)) {
sql_query("ALTER TABLE {$g5['menu_table']} ADD COLUMN me_depth INT DEFAULT 0");
}
if (!in_array("me_parent", $columns)) {
sql_query("ALTER TABLE {$g5['menu_table']} ADD COLUMN me_parent VARCHAR(50) DEFAULT ''");
}
if (!in_array("me_img", $columns)) {
sql_query("ALTER TABLE {$g5['menu_table']} ADD COLUMN me_img VARCHAR(255) DEFAULT '' AFTER me_name");
}
if (!in_array("me_img2", $columns)) {
sql_query("ALTER TABLE {$g5['menu_table']} ADD COLUMN me_img2 VARCHAR(255) DEFAULT '' AFTER me_img");
}
$sql = "SELECT * FROM {$g5['menu_table']} order by me_order*1, me_id ";
$result = sql_query($sql);
@ -24,14 +33,88 @@ $g5['title'] = "메뉴설정";
include_once "./admin.head.php";
$colspan = 11;
?>
<style>
.tbl_wrap article {
display: flex;
flex-direction: column;
border: 1px solid #E0E0E0;
border-radius: 4px;
margin: 4px 0;
overflow: hidden;
}
article .menu_reqset {
display: flex;
padding: 8px;
gap: 8px;
justify-content: center;
align-items: center;
background: #F4F4F4;
}
.al_menu_listing {
display: flex;
padding: 8px;
gap: 8px;
}
article .menu_reqset .al_menu_name {
flex-grow: 1
}
article .menu_reqset button {
border: 1px solid #E0E0E0;
border-radius: 4px;
width: 48px;
height: 48px;
}
.al_menu {
display: flex;
flex-direction: column;
gap: 4px;
}
.al_menu .al_label {
line-height: 16px;
height: 16px;
}
.al_menu select,
.al_menu input {
height: 24px;
box-sizing: border-box;
}
.al_menu input[type=checkbox] {
height: 22px;
margin: 1px;
}
.al_menu_listing {
padding: 8px;
}
.al_center {
display: flex;
justify-content: center;
align-items: center;
border:1px solid #E0E0E0;
background-size: cover;
}
.al_fill {
flex-grow: 1;
}
</style>
<div class="local_desc01 local_desc">
<p><strong>주의!</strong> 메뉴설정 작업 반드시 <strong>확인</strong> 누르셔야 저장됩니다.</p>
</div>
<div class="local_desc01 local_desc">
<p><strong>주의!</strong> 메뉴설정 작업 반드시 <strong>상단의 저장 버튼</strong> 누르셔야 저장됩니다.</p>
<p>아이콘 항목에 사용할 구글 아이콘 이름을 입력해주세요. ( ex. <span style="color:red">&lt;span
class="material-icons"&gt;<strong>home</strong>&lt;/span&gt;</span> <strong>home</strong> 입력하기 )</p>
</div>
<div class="local_desc01 local_desc">
<p>아이콘, 이미지 스킨이 지원하는 쪽이 출력됩니다. 라이트 계열의 스킨에서는 아이콘이, 퍼스널 계열의 스킨에서는 이미지가 출력됩니다.</p>
</div>
<form name="fmenulist" id="fmenulist" method="post" action="./menu_list_update.php"
onsubmit="return fmenulist_submit(this);" enctype="multipart/form-data">
<input type="hidden" name="token" value="">
@ -47,104 +130,111 @@ $colspan = 11;
</div>
<div id="menulist" class="tbl_head01 tbl_wrap">
<table>
<caption><?php echo $g5['title']; ?> 목록</caption>
<colgroup>
<col style="width:140px;">
<col style="width:80px;">
<col style="width:80px;">
<col style="width:80px;">
<col style="width:50px;">
<col style="width:150px;">
<col>
<col style="width:100px;">
<col style="width:80px;">
<col style="width:80px;">
<col style="width:80px;">
</colgroup>
<thead>
<tr>
<th scope="col">메뉴</th>
<th scope="col">ID</th>
<th scope="col">부모 ID</th>
<th scope="col">깊이</th>
<th scope="col" colspan="2">아이콘</th>
<th scope="col">링크</th>
<th scope="col">새창</th>
<th scope="col">순서</th>
<th scope="col">사용</th>
<th scope="col">관리</th>
</tr>
</thead>
<tbody>
<?php
for ($i = 0; $row = sql_fetch_array($result); $i++) {
$bg = 'bg' . ($i % 2);
$sub_menu_class = '';
if (strlen($row['me_code']) == 4) {
$sub_menu_class = ' sub_menu_class';
$sub_menu_info = '<span class="sound_only">' . $row['me_name'] . '의 서브</span>';
$sub_menu_ico = '<span class="sub_menu_ico"></span>';
}
<?php
for ($i = 0; $row = sql_fetch_array($result); $i++) {
$bg = 'bg' . ($i % 2);
$sub_menu_class = '';
if (strlen($row['me_code']) == 4) {
$sub_menu_class = ' sub_menu_class';
$sub_menu_info = '<span class="sound_only">' . $row['me_name'] . '의 서브</span>';
$sub_menu_ico = '<span class="sub_menu_ico"></span>';
}
$search = ['"', "'"];
$replace = ['&#034;', '&#039;'];
$me_name = str_replace($search, $replace, $row['me_name']);
?>
<tr class="<?php echo $bg; ?> menu_list menu_group_<?php echo substr($row['me_code'], 0, 2); ?>"
data-name="<?php echo $me_name; ?>">
$search = ['"', "'"];
$replace = ['&#034;', '&#039;'];
$me_name = str_replace($search, $replace, $row['me_name']);
?>
<article class="<?php echo $bg; ?> menu_list menu_group_<?php echo substr($row['me_code'], 0, 2); ?>"
data-name="<?php echo $me_name; ?>">
<div class="menu_reqset">
<div class="al_menu" style="width: 50px">
<span class="al_label">사용 여부</span>
<input type="checkbox" name="me_use[]" id="me_use_<?php echo $i; ?>" value="1" <?= $row['me_use'] == 1 ? "checked" : ""; ?>>
</div>
<div class="al_menu" style="width: 60px">
<span class="al_label">정렬 순서</span>
<input type="text" name="me_order[]" value="<?php echo $row['me_order'] ?>" id="me_order_<?php echo $i; ?>"
class="frm_input full_input">
</div>
<div class="al_menu al_menu_name<?php echo $sub_menu_class; ?>">
<span class="al_label">메뉴 이름</span>
<td class="td_category<?php echo $sub_menu_class; ?>">
<input type="hidden" name="code[]" value="<?php echo substr($row['me_code'], 0, 2) ?>" />
<input type="hidden" name="me_level[]" value="<?php echo $row['me_level'] ?>" />
<input type="text" name="me_name[]" value="<?php echo get_sanitize_input($me_name); ?>" required
class="required frm_input full_input" />
</td>
<td class="td_mng">
<?=$row['me_code']?>
</td>
<td class="td_mng">
<input type="text" name="me_parent[]" value="<?=$row['me_parent']?>" id="me_parent_<?=$i?>" class="frm_input full_input">
</td>
<td class="td_mng">
<input type="text" name="me_depth[]" value="<?=$row['me_depth']?>" id="me_depth_<?=$i?>" class="frm_input full_input">
</td>
<td>
<i class="material-icons"><?= $row['me_icon'] ?></i>
</td>
<td class="txt-left">
<input type="text" name="me_icon[]" value="<?php echo get_text($row['me_icon']) ?>"
class=" frm_input full_input" />
</td>
<td>
<input type="text" name="me_link[]" value="<?php echo $row['me_link'] ?>" id="me_link_<?php echo $i; ?>"
class="frm_input full_input" />
</td>
<td class="td_mng">
<select name="me_target[]" class=" frm_input full_input">
<option value="self" <?php echo get_selected($row['me_target'], 'self'); ?>>현재창</option>
<option value="blank" <?php echo get_selected($row['me_target'], 'blank'); ?>>새창</option>
</select>
</td>
<td class="td_num order">
<input type="text" name="me_order[]" value="<?php echo $row['me_order'] ?>" id="me_order_<?php echo $i; ?>"
class="frm_input full_input">
</td>
<td class="td_mng">
<input type="checkbox" name="me_use[]" id="me_use_<?php echo $i; ?>" value="1" <?= $row['me_use'] == 1 ? "checked" : ""; ?>>
</td>
<td class="td_mng">
<button type="button" class="btn_del_menu"><span class='material-icons'>delete</span></button>
</td>
</tr>
<?php
}
<input type="hidden" name="code[]" value="<?php echo substr($row['me_code'], 0, 2) ?>" />
<input type="hidden" name="me_level[]" value="<?php echo $row['me_level'] ?>" />
<input type="text" name="me_name[]" value="<?php echo get_sanitize_input($me_name); ?>" required
class="required frm_input full_input" />
</div>
<div class="al_menu al_menu_name<?php echo $sub_menu_class; ?>">
<span class="al_label">링크</span>
<input type="text" name="me_link[]" value="<?php echo $row['me_link'] ?>" id="me_link_<?php echo $i; ?>"
class="frm_input full_input" />
</div>
<div class="al_menu" style="width: 80px">
<span class="al_label">열릴 위치</span>
<select name="me_target[]" class=" frm_input full_input">
<option value="self" <?php echo get_selected($row['me_target'], 'self'); ?>>현재창</option>
<option value="blank" <?php echo get_selected($row['me_target'], 'blank'); ?>>새창</option>
</select>
</div>
<button type="button" class="btn_del_menu">
<span class='material-icons'>delete</span>
</button>
</div>
<div class="al_menu_listing">
<div class="al_menu" style="width: 50px">
<span class="al_label">메뉴 ID</span>
<div class="al_value"><?= $row['me_code'] ?></div>
</div>
<div class="al_menu" style="width: 60px">
<span class="al_label">부모 ID</span>
<input type="text" name="me_parent[]" value="<?= $row['me_parent'] ?>" id="me_parent_<?= $i ?>"
class="frm_input full_input">
</div>
<div class="al_menu" style="width: 60px">
<span class="al_label">깊이</span>
<input type="text" name="me_depth[]" value="<?= $row['me_depth'] ?>" id="me_depth_<?= $i ?>"
class="frm_input full_input">
</div>
<div class="al_menu al_center" style="width: 60px">
<i class="material-icons"><?= $row['me_icon'] ?></i>
</div>
<div class="al_menu">
<span class="al_label">Material Icon</span>
<input type="text" name="me_icon[]" value="<?php echo get_text($row['me_icon']) ?>"
class=" frm_input full_input" />
</div>
<div class="al_menu al_center" style="width: 60px; background-image: url('<?=$row['me_img']?>');">
</div>
<div class="al_menu">
<span class="al_label">통상 이미지</span>
<input type="file" name="me_img_file[]" id="me_img_file_<?php echo $i; ?>" class=" frm_input full_input"
style="width:80%">
</div>
<div class="al_menu al_fill">
<span class="al_label"><?= help('* 사용하지 않을 경우 공란으로 남겨두시면 됩니다.') ?></span>
<input type="text" name="me_img[]" value="<?php echo $row['me_img'] ?>" id="me_img_<?php echo $i; ?>"
class=" frm_input full_input" style="width:80%">
</div>
<div class="al_menu al_center" style="width: 60px; background-image: url('<?=$row['me_img2']?>');">
</div>
<div class="al_menu">
<span class="al_label">마우스 오버 이미지</span>
<input type="file" name="me_img2_file[]" id="me_img2_file_<?php echo $i; ?>" class=" frm_input full_input"
style="width:80%">
</div>
<div class="al_menu al_fill">
<span class="al_label"><?= help('* 사용하지 않을 경우 공란으로 남겨두시면 됩니다.') ?></span>
<input type="text" name="me_img2[]" value="<?php echo $row['me_img2'] ?>" id="me_img2_<?php echo $i; ?>"
class=" frm_input full_input" style="width:80%">
</div>
</div>
</article>
<?php
}
if ($i == 0)
echo '<tr id="empty_menu_list"><td colspan="' . $colspan . '" class="empty_table">자료가 없습니다.</td></tr>';
?>
</tbody>
</table>
if ($i == 0)
echo '<tr id="empty_menu_list"><td colspan="' . $colspan . '" class="empty_table">자료가 없습니다.</td></tr>';
?>
</div>
</form>

View file

@ -16,16 +16,51 @@ $group_code = null;
$primary_code = null;
$count = count($_POST['code']);
$site_path = G5_DATA_PATH . '/site';
$site_url = G5_DATA_URL . '/site';
@mkdir($site_path, G5_DIR_PERMISSION);
@chmod($site_path, G5_DIR_PERMISSION);
EventHandler::triggerEvent("amber.admin.menu_list_update_before");
for ($i = 0; $i < $count; $i++) {
$img_link = "";
$img_link2 = "";
$img_link = $_POST['me_img'][$i];
if ($_FILES['me_img_file']['name'][$i]) {
if (!preg_match("/\.(gif|jpg|png)$/i", $_FILES['me_img_file']['name'][$i])) {
alert("이미지가 gif, jpg, png 파일이 아닙니다.");
} else {
$exp = explode(".", $_FILES['me_img_file']['name'][$i]);
$exp = $exp[count($exp) - 1];
$image_name = time() . $i . "." . $exp;
upload_file($_FILES['me_img_file']['tmp_name'][$i], $image_name, $site_path);
$img_link = $site_url . "/" . $image_name;
}
}
$img_link2 = $_POST['me_img2'][$i];
if ($_FILES['me_img2_file']['name'][$i]) {
if (!preg_match("/\.(gif|jpg|png)$/i", $_FILES['me_img2_file']['name'][$i])) {
alert("이미지가 gif, jpg, png 파일이 아닙니다.");
} else {
$exp = explode(".", $_FILES['me_img2_file']['name'][$i]);
$exp = $exp[count($exp) - 1];
$image_name = time() . $i . "_o." . $exp;
upload_file($_FILES['me_img2_file']['tmp_name'][$i], $image_name, $site_path);
$img_link2 = $site_url . "/" . $image_name;
}
}
$_POST = array_map_deep('trim', $_POST);
if (preg_match('/^javascript/i', preg_replace('/[ ]{1,}|[\t]/', '', $_POST['me_link'][$i]))) {
$_POST['me_link'][$i] = G5_URL;
}
$_POST['me_link'][$i] = is_array($_POST['me_link']) ? clean_xss_tags(clean_xss_attributes(preg_replace('/[ ]{2,}|[\t]/', '', $_POST['me_link'][$i])), 1) : '';
$code = strip_tags($_POST['code'][$i]);
$me_name = strip_tags($_POST['me_name'][$i]);
// kve-2021-0755 gnuboard 3a3434104c
@ -63,15 +98,17 @@ for ($i = 0; $i < $count; $i++) {
// 메뉴 등록
$sql = "INSERT INTO {$g5['menu_table']}
SET me_code = '{$me_code}',
me_icon = '{$_POST['me_icon'][$i]}',
me_name = '{$me_name}',
me_link = '{$me_link}',
me_img = '{$img_link}',
me_img2 = '{$img_link2}',
me_icon = '{$_POST['me_icon'][$i]}',
me_target = '" . sql_real_escape_string(strip_tags($_POST['me_target'][$i])) . "',
me_order = '" . sql_real_escape_string(strip_tags($_POST['me_order'][$i])) . "',
me_use = '" . sql_real_escape_string(strip_tags($_POST['me_use'][$i])) . "',
me_depth = '{$me_depth}',
me_parent = '{$me_parent}'";
sql_query($sql);
}

View file

@ -7,7 +7,7 @@
********************/
define('G5_VERSION', '아보카도 에디션 : Amber');
define('G5_GNUBOARD_VER', '2.3.3');
define('G5_GNUBOARD_VER', '2.3.4');
define('G5_AMBER', true);
define('_GNUBOARD_', true);