Files
dnssash/adm/menu_list_update.php
T
2026-06-11 18:47:38 +09:00

133 lines
6.6 KiB
PHP

<?php
$sub_menu = "100290";
require_once './_common.php';
check_demo();
if ($is_admin != 'super') {
alert('최고관리자만 접근 가능합니다.');
}
check_admin_token();
$admin_id = $member['mb_id'];
$current_ip = $_SERVER['REMOTE_ADDR'];
$now = G5_TIME_YMDHIS;
// 1. DB에서 현재 메뉴 데이터를 모두 불러와서 me_id를 키(key)로 하는 배열로 만듭니다.
$original_menus = [];
$sql = "SELECT * FROM {$g5['menu_table']} WHERE me_deleted_at IS NULL";
$result = sql_query($sql);
while ($row = sql_fetch_array($result)) {
$original_menus[$row['me_id']] = $row;
}
$submitted_ids = []; // 화면에서 전송된 me_id 목록을 저장할 배열
$count = isset($_POST['me_id']) ? count($_POST['me_id']) : 0;
// 💡 [핵심] 임시 ID와 실제 DB ID를 매핑할 배열
$temp_id_map = [];
for ($i = 0; $i < $count; $i++) {
// 2. 화면에서 넘어온 데이터 정리
$me_id_input = isset($_POST['me_id'][$i]) ? trim($_POST['me_id'][$i]) : 0;
$me_parent_id_input = isset($_POST['me_parent_id'][$i]) ? trim($_POST['me_parent_id'][$i]) : 0;
$is_new = (strpos($me_id_input, 'new_') === 0);
$me_id = $is_new ? 0 : (int)$me_id_input;
// 💡 부모 ID가 임시 ID이면, 맵에서 실제 ID를 찾아 사용
if (strpos($me_parent_id_input, 'new_') === 0) {
$me_parent_id = isset($temp_id_map[$me_parent_id_input]) ? $temp_id_map[$me_parent_id_input] : 0;
} else {
$me_parent_id = (int)$me_parent_id_input;
}
$me_depth = isset($_POST['me_depth'][$i]) ? (int)$_POST['me_depth'][$i] : 1;
$me_name = isset($_POST['me_name'][$i]) ? strip_tags(trim($_POST['me_name'][$i])) : '';
$me_link = isset($_POST['me_link'][$i]) ? trim($_POST['me_link'][$i]) : '';
$me_target = isset($_POST['me_target'][$i]) ? strip_tags($_POST['me_target'][$i]) : 'self';
$me_order = isset($_POST['me_order'][$i]) ? (int)$_POST['me_order'][$i] : 0;
$me_use = isset($_POST['me_use'][$i]) && $_POST['me_use'][$i] == "1" ? 1 : 0;
$me_mobile_use = isset($_POST['me_mobile_use'][$i]) && $_POST['me_mobile_use'][$i] == "1" ? 1 : 0;
$me_level = isset($_POST['me_level'][$i]) ? (int)$_POST['me_level'][$i] : 1;
$me_level_opt = isset($_POST['me_level_opt'][$i]) ? (int)$_POST['me_level_opt'][$i] : 1;
if (!$me_name || !$me_link) {
continue;
}
if ($me_id) { // 3. me_id가 있으면 기존 메뉴 '수정' 처리
$submitted_ids[] = $me_id;
if (!isset($original_menus[$me_id])) continue;
$original = $original_menus[$me_id];
$changes = [];
// 원본 데이터와 비교하여 변경된 필드만 찾아냅니다.
if ($original['me_parent_id'] != $me_parent_id) $changes['me_parent_id'] = $me_parent_id;
if ($original['me_depth'] != $me_depth) $changes['me_depth'] = $me_depth;
if ($original['me_name'] != $me_name) $changes['me_name'] = $me_name;
if ($original['me_link'] != $me_link) $changes['me_link'] = $me_link;
if ($original['me_target'] != $me_target) $changes['me_target'] = $me_target;
if ($original['me_order'] != $me_order) $changes['me_order'] = $me_order;
if ($original['me_use'] != $me_use) $changes['me_use'] = $me_use;
if ($original['me_mobile_use'] != $me_mobile_use) $changes['me_mobile_use'] = $me_mobile_use;
if ($original['me_level'] != $me_level) $changes['me_level'] = $me_level;
if ($original['me_level_opt'] != $me_level_opt) $changes['me_level_opt'] = $me_level_opt;
if (!empty($changes)) {
$update_sql = "UPDATE {$g5['menu_table']} SET ";
$update_fields = [];
foreach ($changes as $key => $value) {
$update_fields[] = "{$key} = '" . sql_real_escape_string($value) . "'";
}
$update_sql .= implode(', ', $update_fields);
$update_sql .= ", me_updated_by = '{$admin_id}', me_updated_at = '{$now}' WHERE me_id = '{$me_id}'";
sql_query($update_sql);
$data_after = array_merge($original, $changes);
sql_query("INSERT INTO g5_menu_history SET me_id = '{$me_id}', mh_action = '수정', mh_data_before = '" . sql_real_escape_string(json_encode($original, JSON_UNESCAPED_UNICODE)) . "', mh_data_after = '" . sql_real_escape_string(json_encode($data_after, JSON_UNESCAPED_UNICODE)) . "', mh_editor = '{$admin_id}', mh_ip = '{$current_ip}', mh_datetime = '{$now}'");
}
} else { // 4. me_id가 없으면 '신규' 메뉴 등록 처리
$sql = "INSERT INTO {$g5['menu_table']}
SET me_parent_id = '{$me_parent_id}',
me_depth = '{$me_depth}',
me_name = '" . sql_real_escape_string($me_name) . "',
me_link = '" . sql_real_escape_string($me_link) . "',
me_target = '" . sql_real_escape_string($me_target) . "',
me_order = '{$me_order}',
me_use = '{$me_use}',
me_mobile_use = '{$me_mobile_use}',
me_level = '{$me_level}',
me_level_opt = '{$me_level_opt}',
me_created_by = '{$admin_id}',
me_updated_by = '{$admin_id}',
me_created_at = '{$now}',
me_updated_at = '{$now}'";
sql_query($sql);
$new_me_id = sql_insert_id();
// 💡 [핵심] 새로 생성된 DB ID를 임시 ID와 매핑
if ($is_new) {
$temp_id_map[$me_id_input] = $new_me_id;
}
$data_after = sql_fetch("SELECT * FROM {$g5['menu_table']} WHERE me_id = '{$new_me_id}'");
sql_query("INSERT INTO g5_menu_history SET me_id = '{$new_me_id}', mh_action = '생성', mh_data_after = '" . sql_real_escape_string(json_encode($data_after, JSON_UNESCAPED_UNICODE)) . "', mh_editor = '{$admin_id}', mh_ip = '{$current_ip}', mh_datetime = '{$now}'");
}
}
// 5. 화면에서 넘어오지 않은 메뉴는 '삭제'된 것으로 간주하고 처리 (Soft Delete)
$deleted_ids = array_diff(array_keys($original_menus), $submitted_ids);
if (!empty($deleted_ids)) {
foreach ($deleted_ids as $del_id) {
$original = $original_menus[$del_id];
sql_query("UPDATE {$g5['menu_table']} SET me_deleted_at = '{$now}', me_updated_by = '{$admin_id}', me_updated_at = '{$now}' WHERE me_id = '{$del_id}'");
sql_query("INSERT INTO g5_menu_history SET me_id = '{$del_id}', mh_action = '삭제', mh_data_before = '" . sql_real_escape_string(json_encode($original, JSON_UNESCAPED_UNICODE)) . "', mh_editor = '{$admin_id}', mh_ip = '{$current_ip}', mh_datetime = '{$now}'");
}
}
run_event('admin_menu_list_update');
goto_url('./menu_list.php');