133 lines
6.6 KiB
PHP
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'); |