<?php
if (!defined('_GNUBOARD_')) exit;
add_stylesheet('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">', 0);
include_once(G5_LIB_PATH.'/thumbnail.lib.php');
// 외부 스타일시트 연결 (나. 항목의 내용을 이 파일에 저장하세요)
add_stylesheet('<link rel="stylesheet" href="'.$board_skin_url.'/style.view.css">', 0);
$view_content = get_view_thumbnail($view['content']);
$is_run = ($view['x2_run'] == '1' || $view['x2_run'] == '실행' || strtolower($view['x2_run']) == 'run');
// DB 이벤트 정보 조회
$real_evt_sql = " SELECT * FROM information_schema.EVENTS WHERE EVENT_NAME = '".sql_real_escape_string($view['wr_subject'])."' ";
$real_evt = sql_fetch($real_evt_sql);
$db_status = isset($real_evt['STATUS']) ? $real_evt['STATUS'] : 'NOT FOUND';
$db_type = isset($real_evt['EVENT_TYPE']) ? $real_evt['EVENT_TYPE'] : '-';
$db_definer= isset($real_evt['DEFINER']) ? $real_evt['DEFINER'] : '-';
$db_starts = isset($real_evt['STARTS']) ? $real_evt['STARTS'] : '-';
$db_ends = isset($real_evt['ENDS']) ? $real_evt['ENDS'] : 'FOREVER';
$db_definition = isset($real_evt['EVENT_DEFINITION']) ? $real_evt['EVENT_DEFINITION'] : '';
$master_value = trim((string)$view['x2_db_master']) !== '' ? $view['x2_db_master'] : '-';
$captain_value = trim((string)$view['x2_db_table']) !== ''
? $view['x2_db_table']
: (trim((string)$view['x2_db_table_name']) !== '' ? $view['x2_db_table_name'] : '-');
$filter_ca_url = (trim((string)$view['ca_name']) !== '') ? G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sfl=ca_name&stx='.urlencode($view['ca_name']) : '';
$filter_ca2_url = (trim((string)$view['x2_ca2']) !== '') ? G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sfl=x2_ca2&stx='.urlencode($view['x2_ca2']) : '';
$filter_ca3_url = (trim((string)$view['x2_ca3']) !== '') ? G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&sfl=x2_ca3&stx='.urlencode($view['x2_ca3']) : '';
if (isset($real_evt['INTERVAL_VALUE']) && isset($real_evt['INTERVAL_FIELD'])) {
$db_interval = $real_evt['INTERVAL_VALUE'] . ' ' . $real_evt['INTERVAL_FIELD'];
} else {
$db_interval = '-';
}
$status_class = '';
if ($db_status == 'ENABLED') $status_class = 'status-run';
else if ($db_status == 'DISABLED' || $db_status == 'SLAVESIDE_DISABLED') $status_class = 'status-stop';
// ==========================================================================
// [CORE] UPBIT DB 커넥션을 이용한 LAST_EXECUTED 조회 (기존 로직 대체)
// ==========================================================================
global $db_upbit;
$last_executed_time = '-';
if ($db_upbit && isset($view['wr_subject'])) {
$sql_exec = " SELECT LAST_EXECUTED
FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = 'upbit_data'
AND EVENT_NAME = '".sql_real_escape_string($view['wr_subject'])."' ";
try {
if ($db_upbit instanceof mysqli) {
$res_e = mysqli_query($db_upbit, $sql_exec);
if ($res_e) {
$row_e = mysqli_fetch_assoc($res_e);
$last_executed_time = (isset($row_e['LAST_EXECUTED']) && $row_e['LAST_EXECUTED']) ? $row_e['LAST_EXECUTED'] : '-';
}
} else if ($db_upbit instanceof PDO) {
$stmt_e = $db_upbit->query($sql_exec);
if ($stmt_e) {
$row_e = $stmt_e->fetch(PDO::FETCH_ASSOC);
$last_executed_time = (isset($row_e['LAST_EXECUTED']) && $row_e['LAST_EXECUTED']) ? $row_e['LAST_EXECUTED'] : '-';
}
}
} catch (Exception $e) {
$last_executed_time = '-';
}
}
?>
<article id="VIEW">
<header class="Board-Info-Header">
<div class="header-titles">
<span class="bo-table-name"><?php echo mb_strtoupper($bo_table); ?></span>
<div class="bo-subject-main">
<i class="fa-solid fa-microchip"></i><?php echo $board['bo_subject']; ?>
</div>
</div>
<div class="Btns-Right">
<button onclick="location.href='<?php echo $list_href; ?>'" class="List-Btn-Footer"><i class="fa-solid fa-list"></i> 목록</button>
<?php if ($update_href) { ?><button onclick="location.href='<?php echo $update_href; ?>'" class="List-Btn-Footer"><i class="fa-solid fa-pen-to-square"></i> 수정</button><?php } ?>
<?php if ($write_href) { ?><button onclick="location.href='<?php echo $write_href; ?>'" class="Write-Btn"><i class="fa-solid fa-pen"></i> 글쓰기</button><?php } ?>
</div>
</header>
<section class="Data-Dashboard-Section">
<div class="info-box subject-box">
<div class="subject-box-top">
<div class="subject-main-info">
<span class="label"><i class="fa-solid fa-bolt"></i> 이벤트</span>
<div class="subject-main-line">
<span class="subject-main-event"><?php echo get_text($view['wr_subject']); ?></span>
<?php if(isset($view['wr_subject_kor']) && $view['wr_subject_kor']) { ?>
<span class="subject-main-kor"><?php echo get_text($view['wr_subject_kor']); ?></span>
<?php } ?>
<span class="subject-option-icons">
<?php if (!empty($view['x2_top'])) { ?><i class="fa-solid fa-circle-up option-icon option-icon--top" title="우선"></i><?php } ?>
<?php if (!empty($view['x2_label'])) { ?><i class="fa-solid fa-tag option-icon option-icon--label" title="라벨"></i><?php } ?>
<?php if (!empty($view['x2_core'])) { ?><i class="fa-solid fa-gem option-icon option-icon--core" title="핵심"></i><?php } ?>
</span>
</div>
</div>
<div class="subject-sub-info">
<span class="label"><i class="fa-solid fa-diagram-project"></i> 대장</span>
<div class="value accent-blue"><?php echo get_text($captain_value); ?></div>
<button type="button" class="event-edit-btn" onclick="openEventEditor('<?php echo $bo_table; ?>', '<?php echo (int)$wr_id; ?>');">
<i class="fa-solid fa-pen"></i> 이벤트 편집
</button>
</div>
</div>
<?php if(isset($view['wr_1']) && $view['wr_1']) { ?>
<div class="subject-extra-info">
<i class="fa-solid fa-circle-info"></i>
<?php echo get_text($view['wr_1']); ?>
</div>
<?php } ?>
<div class="subject-meta-row">
<div class="subject-meta-item">
<span class="meta-label"><i class="fa-regular fa-clock"></i> 타임스탬프</span>
<span class="meta-value"><?php echo date("Y-m-d H:i:s", strtotime($view['wr_datetime'])); ?></span>
</div>
<div class="subject-meta-item">
<span class="meta-label"><i class="fa-solid fa-layer-group"></i> 원장</span>
<span class="meta-value"><?php echo get_text($master_value); ?></span>
</div>
</div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-power-off"></i> 관리 설정</span>
<div class="value <?php echo $is_run ? 'status-run' : 'status-stop'; ?>">
<i class="fa-solid fa-circle-dot"></i>
<?php echo $is_run ? '가동 중' : '중지됨'; ?>
</div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-database"></i> DB 엔진 상태</span>
<div class="value <?php echo $status_class; ?>">
<?php echo $db_status; ?>
</div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-sitemap"></i> 이벤트 종류</span>
<div class="value"><?php echo $db_type; ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-stopwatch"></i> 실행 간격</span>
<div class="value"><?php echo $db_interval; ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-user-gear"></i> 정의자</span>
<div class="value definer-text"><?php echo $db_definer; ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-folder-tree"></i> 카테고리</span>
<div class="value"><?php echo ($view['ca_name']) ? $view['ca_name'] : '없음'; ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-layer-group"></i> 종류</span>
<div class="value"><?php echo ($view['x2_ca2']) ? $view['x2_ca2'] : '-'; ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-shapes"></i> 형태</span>
<div class="value"><?php echo ($view['x2_ca3']) ? $view['x2_ca3'] : '-'; ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-layer-group"></i> 원장</span>
<div class="value"><?php echo get_text($master_value); ?></div>
</div>
<div class="info-box">
<span class="label"><i class="fa-solid fa-diagram-project"></i> 대장</span>
<div class="value"><?php echo get_text($captain_value); ?></div>
</div>
<div class="info-box full-row-flex">
<div class="time-range-group">
<div class="time-item">
<span class="label"><i class="fa-solid fa-play"></i> 시작 일시</span>
<div class="value starts-time"><?php echo $db_starts; ?></div>
</div>
<div class="time-item">
<span class="label"><i class="fa-solid fa-flag-checkered"></i> 종료 일시</span>
<div class="value ends-time"><?php echo $db_ends; ?></div>
</div>
</div>
<div class="last-altered-group">
<span class="label"><i class="fa-solid fa-pen-ruler"></i> 최종 수정</span>
<div class="value altered-time">
<?php echo isset($real_evt['LAST_ALTERED']) ? $real_evt['LAST_ALTERED'] : '-'; ?>
</div>
</div>
</div>
</section>
<div class="View-Content View-Content--update">
<span class="label"><i class="fa-solid fa-clock-rotate-left"></i> 마지막 실행</span>
<div class="value">
<i class="fa-solid fa-clock-rotate-left"></i>
<?php echo get_text($view['wr_subject']); ?> : <span class="dynamic-update-value"><?php echo $last_executed_time; ?></span>
</div>
</div>
<div class="View-Content View-Content--update-meta">
<div class="meta-mini-item">
<span class="label"><i class="fa-solid fa-building-columns"></i> 거래소</span>
<?php if ($filter_ca_url) { ?>
<a href="<?php echo $filter_ca_url; ?>" class="value meta-mini-link"><?php echo get_text($view['ca_name']); ?></a>
<?php } else { ?>
<div class="value">-</div>
<?php } ?>
</div>
<div class="meta-mini-item">
<span class="label"><i class="fa-solid fa-layer-group"></i> 종류</span>
<?php if ($filter_ca2_url) { ?>
<a href="<?php echo $filter_ca2_url; ?>" class="value meta-mini-link"><?php echo get_text($view['x2_ca2']); ?></a>
<?php } else { ?>
<div class="value">-</div>
<?php } ?>
</div>
<div class="meta-mini-item">
<span class="label"><i class="fa-solid fa-shapes"></i> 형태</span>
<?php if ($filter_ca3_url) { ?>
<a href="<?php echo $filter_ca3_url; ?>" class="value meta-mini-link"><?php echo get_text($view['x2_ca3']); ?></a>
<?php } else { ?>
<div class="value">-</div>
<?php } ?>
</div>
</div>
<?php if ($db_definition) { ?>
<div class="View-Content">
<div class="content-head-tools">
<span class="label"><i class="fa-solid fa-file-code"></i> DB 이벤트 정의</span>
<div class="content-tools">
<button type="button" class="content-tool-btn" onclick="copyContentById('db_definition_block')"><i class="fa-solid fa-copy"></i> 복사</button>
<button type="button" class="content-tool-btn" onclick="downloadContentById('db_definition_block', 'db_event_definition.txt')"><i class="fa-solid fa-download"></i> 다운로드</button>
</div>
</div>
<pre id="db_definition_block" class="code-block View-Content--definition definition-scroll"><?php echo htmlspecialchars($db_definition); ?></pre>
</div>
<?php } ?>
<?php if ($view_content || $view['file']['count']) { ?>
<div class="View-Content View-Content--extra-green">
<span class="label"><i class="fa-solid fa-circle-info"></i> 상세 내용</span>
<div class="View-Body-Inner">
<div id="bo_v_atc">
<div id="bo_v_img">
<?php
if ($view['file']['count']) {
for ($i=0; $i<count($view['file']); $i++) {
if (isset($view['file'][$i]['view']) && $view['file'][$i]['view']) {
echo get_view_thumbnail($view['file'][$i]['view']);
}
}
}
?>
</div>
<div id="bo_v_con" class="value">
<?php echo $view_content; ?>
</div>
</div>
</div>
</div>
<?php } ?>
<?php if (isset($view['x2_content']) && trim($view['x2_content'])) { ?>
<div class="View-Content View-Content--extra-blue">
<div class="content-head-tools">
<span class="label"><i class="fa-solid fa-note-sticky"></i> 추가 설명</span>
<div class="content-tools">
<button type="button" class="content-tool-btn" onclick="copyContentById('x2_content_block')"><i class="fa-solid fa-copy"></i> 복사</button>
<button type="button" class="content-tool-btn" onclick="downloadContentById('x2_content_block', 'x2_content.txt')"><i class="fa-solid fa-download"></i> 다운로드</button>
</div>
</div>
<div id="x2_content_block" class="value content-lined-box content-scroll"><?php echo nl2br(stripslashes($view['x2_content'])); ?></div>
</div>
<?php } ?>
<?php if (isset($view['x2_content_2']) && trim($view['x2_content_2'])) { ?>
<div class="View-Content View-Content--extra-blue">
<span class="label"><i class="fa-solid fa-triangle-exclamation"></i> 특정 사항</span>
<div class="value content-lined-box content-scroll"><?php echo nl2br(stripslashes($view['x2_content_2'])); ?></div>
</div>
<?php } ?>
<?php if (isset($view['x2_memo']) && trim($view['x2_memo'])) { ?>
<div class="View-Content View-Content--extra-blue">
<div class="content-head-tools">
<span class="label"><i class="fa-solid fa-note-sticky"></i> 메모</span>
<?php if (isset($view['x2_memo_clean']) && trim($view['x2_memo_clean'])) { ?>
<span class="memo-delete-badge" title="메모 삭제"><i class="fa-solid fa-trash-can"></i> 삭제</span>
<?php } ?>
</div>
<div id="x2_memo_block" class="value content-lined-box content-scroll <?php echo (isset($view['x2_memo_clean']) && trim($view['x2_memo_clean'])) ? 'memo-deleted-content' : ''; ?>"><?php echo nl2br(stripslashes($view['x2_memo'])); ?></div>
</div>
<?php } ?>
<div class="View-Attached-Data">
<?php
for ($i=1; $i<=count($view['link']); $i++) {
if ($view['link'][$i]) {
$link = cut_str($view['link'][$i], 70);
?>
<a href="<?php echo $view['link_href'][$i] ?>" target="_blank" class="data-item">
<div class="data-info">
<i class="fa-solid fa-link"></i>
<span class="data-name"><?php echo $link ?></span>
</div>
<span class="data-meta">링크 연결 <i class="fa-solid fa-arrow-up-right-from-square"></i></span>
</a>
<?php
}
}
?>
<?php
if ($view['file']['count']) {
for ($i=0; $i<count($view['file']); $i++) {
if (isset($view['file'][$i]['source']) && !isset($view['file'][$i]['view'])) {
?>
<a href="<?php echo $view['file'][$i]['href']; ?>" class="data-item">
<div class="data-info">
<i class="fa-solid fa-download"></i>
<div>
<span class="data-name"><?php echo $view['file'][$i]['source']; ?></span>
<?php if($view['file'][$i]['bf_content']) { ?>
<span class="file-desc"><?php echo $view['file'][$i]['bf_content']; ?></span>
<?php } ?>
</div>
</div>
<div class="data-meta">
<span class="file-size"><?php echo $view['file'][$i]['size']; ?></span>
<span>다운로드: <?php echo $view['file'][$i]['download']; ?></span>
</div>
</a>
<?php
}
}
}
?>
</div>
<?php if ($view['x2_tag']) { ?>
<div class="Custom-Tag-Area">
<?php
$tags = explode(',', $view['x2_tag']);
foreach($tags as $tag_val) {
$tag_val = trim($tag_val);
if($tag_val) {
echo '<a href="'.G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&stx='.urlencode($tag_val).'&sfl=wr_subject||wr_content" class="x2-tag-item">#'.$tag_val.'</a>';
}
}
?>
</div>
<?php } ?>
<nav class="Post-Navigation">
<?php if ($prev_href) { ?>
<a href="<?php echo $prev_href; ?>" class="nav-prev">
<span class="nav-label"><i class="fa-solid fa-chevron-left"></i> 이전글</span>
<p class="nav-subject"><?php echo $prev_wr_subject; ?></p>
</a>
<?php } else { ?>
<div class="nav-empty nav-prev">첫 번째 게시물입니다.</div>
<?php } ?>
<?php if ($next_href) { ?>
<a href="<?php echo $next_href; ?>" class="nav-next">
<span class="nav-label">다음글 <i class="fa-solid fa-chevron-right"></i></span>
<p class="nav-subject"><?php echo $next_wr_subject; ?></p>
</a>
<?php } else { ?>
<div class="nav-empty nav-next">마지막 게시물입니다.</div>
<?php } ?>
</nav>
<footer class="View-Bottom-Control">
<div class="Admin-Control">
<?php if ($delete_href) { ?><button onclick="if(confirm('정말 삭제하시겠습니까?')) location.href='<?php echo $delete_href; ?>';" class="List-Btn-Footer">삭제</button><?php } ?>
<?php if ($copy_href) { ?><button onclick="window.open('<?php echo $copy_href; ?>', 'copy_win', 'width=600,height=500');" class="List-Btn-Footer">복사</button><?php } ?>
<?php if ($move_href) { ?><button onclick="window.open('<?php echo $move_href; ?>', 'move_win', 'width=600,height=500');" class="List-Btn-Footer">이동</button><?php } ?>
</div>
<button onclick="location.href='<?php echo $list_href; ?>'" class="List-Btn-Footer">
<i class="fa-solid fa-list-ul"></i> 목록으로 돌아가기
</button>
</footer>
<div id="eventEditorModal" class="event-modal" aria-hidden="true">
<div class="event-modal__backdrop" onclick="closeEventEditorModal()"></div>
<div class="event-modal__dialog" role="dialog" aria-modal="true" aria-label="이벤트 편집">
<div class="event-modal__head">
<strong><i class="fa-solid fa-pen-to-square"></i> 마리아DB 이벤트 편집</strong>
<button type="button" class="event-modal__close" onclick="closeEventEditorModal()"><i class="fa-solid fa-xmark"></i></button>
</div>
<iframe id="eventEditorFrame" class="event-modal__frame" src="about:blank" title="event editor"></iframe>
</div>
</div>
</article>
<?php include_once($board_skin_path.'/view/view.script.php'); ?>