5.4 버전 내용 적용
This commit is contained in:
254
plugin/debugbar/debugbar.php
Normal file
254
plugin/debugbar/debugbar.php
Normal file
@ -0,0 +1,254 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit;
|
||||
|
||||
add_stylesheet('<link rel="stylesheet" href="'.G5_PLUGIN_URL.'/debugbar/style.css">', 0);
|
||||
?>
|
||||
<style>
|
||||
<?php if (defined('G5_IS_ADMIN') && G5_IS_ADMIN){ ?>
|
||||
.debug_bar_wrap{z-index:991001}
|
||||
<?php } ?>
|
||||
</style>
|
||||
<div class="debug_bar_wrap">
|
||||
<div class="debug_bar_text_group">
|
||||
<div class="debug_bar_btn_group"><button class="view_debug_bar debug_button">디버그</button></div>
|
||||
<div class="debug_bar_text">
|
||||
<?php echo 'PHP 실행시간 : '.$php_run_time.' | 메모리 사용량 : '.number_format($memory_usage).' bytes'; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="debug_bar_content">
|
||||
<div class="content_inner">
|
||||
|
||||
<div class="debugbar_close_btn_el"><button class="debugbar_close_btn btn">닫기</button></div>
|
||||
<div id="debugbar">
|
||||
<ul class="debugbar_tab">
|
||||
<li class="debug_tab active" data-tab="executed_query"><a href="#debug_executed_query">SQL Query</a></li>
|
||||
<li class="debug_tab" data-tab="hook_info"><a href="#debug_hook_info">HOOK 정보</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div id="debug_executed_query" class="inner_debug">
|
||||
<h3 class="query_top">
|
||||
총 쿼리수 : <span><?php echo isset($g5_debug['sql']) ? count($g5_debug['sql']) : 0; ?></span>
|
||||
</h3>
|
||||
|
||||
<div class="sql_query_list">
|
||||
<table class="debug_table">
|
||||
<caption>
|
||||
쿼리 목록
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">실행순서</th>
|
||||
<th scope="col">쿼리문</th>
|
||||
<th scope="col">실행시간</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
foreach((array) $g5_debug['sql'] as $key=>$query){
|
||||
|
||||
if( empty($query) ) continue;
|
||||
|
||||
$executed_time = $query['end_time'] - $query['start_time'];
|
||||
$show_excuted_time = number_format((float)$executed_time * 1000, 2, '.', '');
|
||||
?>
|
||||
<tr>
|
||||
<td scope="row" data-label="실행순서"><?php echo $key; ?></td>
|
||||
<td class="left" data-label="쿼리문"><?php echo $query['sql']; ?></td>
|
||||
<td data-label="실행시간"><?php echo $show_excuted_time.' ms'; ?></td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="debug_hook_info" class="inner_debug">
|
||||
<?php
|
||||
$event_totals = get_hook_datas('event');
|
||||
$event_callbacks = get_hook_datas('event', 1);
|
||||
$replace_totals = get_hook_datas('replace');
|
||||
$replace_callbacks = get_hook_datas('replace', 1);
|
||||
?>
|
||||
<div class="hook_list">
|
||||
|
||||
<div class="debug_table_wrap">
|
||||
<table class="debug_table hook_table">
|
||||
<caption>
|
||||
HOOK 목록
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" width="20%">event_tag (갯수)</th>
|
||||
<th scope="col" width="60%">event_function</th>
|
||||
<th scope="col" width="10%">인수의 수</th>
|
||||
<th scope="col" width="10%">우선 순위</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
foreach((array) $event_totals as $tag=>$count){
|
||||
|
||||
if( $tag === 'count' ) continue;
|
||||
if( empty($count) ) continue;
|
||||
|
||||
$datas = array();
|
||||
if( isset($event_callbacks[$tag]) ){
|
||||
|
||||
$event_callbacks_tag = $event_callbacks[$tag];
|
||||
ksort($event_callbacks_tag);
|
||||
|
||||
foreach((array) $event_callbacks_tag as $priority=>$event_args){
|
||||
if( empty($event_args) ) continue;
|
||||
|
||||
foreach($event_args as $index=>$funcs){
|
||||
$datas[] = array(
|
||||
'priority' => $priority,
|
||||
'function' => $funcs['function'],
|
||||
'arguments' => $funcs['arguments'],
|
||||
);
|
||||
} //end foreach
|
||||
} //end foreach
|
||||
|
||||
$rowspan = $datas ? ' rowspan='.count($datas) : '';
|
||||
|
||||
$is_print = $rowspan;
|
||||
|
||||
foreach($datas as $data){
|
||||
?>
|
||||
<tr>
|
||||
<?php if ($is_print){ ?>
|
||||
<td scope="row" data-label="event_tag" <?php echo $rowspan; ?>><?php echo $tag.' <span class="hook_count">('.$count.')</span>'; ?></td>
|
||||
<?php } ?>
|
||||
<td data-label="event_function">
|
||||
<?php echo $data['function']; ?>
|
||||
</td>
|
||||
<td data-label="인수의 수"><?php echo $data['arguments']; ?></td>
|
||||
<td data-label="우선 순위"><?php echo $data['priority']; ?></td>
|
||||
</tr>
|
||||
<?php
|
||||
$is_print = '';
|
||||
} //end foreach
|
||||
} else { // else if
|
||||
?>
|
||||
<tr>
|
||||
<td scope="row" data-label="event_tag"><?php echo $tag.' <span class="hook_count">('.$count.')</span>'; ?></td>
|
||||
<td data-label="event_function"> </td>
|
||||
<td data-label="인수의 수"> </td>
|
||||
<td data-label="우선 순위"> </td>
|
||||
</tr>
|
||||
<?php
|
||||
}//end if
|
||||
} //end foreach
|
||||
?>
|
||||
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="debug_table_wrap">
|
||||
<table class="debug_table hook_table">
|
||||
<caption>
|
||||
HOOK 목록
|
||||
</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col" width="20%">replace_tag (갯수)</th>
|
||||
<th scope="col" width="60%">replace_function</th>
|
||||
<th scope="col" width="10%">인수의 수</th>
|
||||
<th scope="col" width="10%">우선 순위</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<?php
|
||||
foreach((array) $replace_totals as $tag=>$count){
|
||||
|
||||
if( $tag === 'count' ) continue;
|
||||
if( empty($count) ) continue;
|
||||
|
||||
$datas = array();
|
||||
if( isset($replace_callbacks[$tag]) ){
|
||||
|
||||
$replace_callbacks_tag = $replace_callbacks[$tag];
|
||||
ksort($replace_callbacks_tag);
|
||||
|
||||
foreach((array) $replace_callbacks_tag as $priority=>$replace_args){
|
||||
if( empty($replace_args) ) continue;
|
||||
|
||||
foreach($replace_args as $index=>$funcs){
|
||||
$datas[] = array(
|
||||
'priority' => $priority,
|
||||
'function' => $funcs['function'],
|
||||
'arguments' => $funcs['arguments'],
|
||||
);
|
||||
} //end foreach
|
||||
} //end foreach
|
||||
|
||||
$rowspan = $datas ? ' rowspan='.count($datas) : '';
|
||||
|
||||
$is_print = $rowspan;
|
||||
|
||||
foreach($datas as $data){
|
||||
?>
|
||||
<tr>
|
||||
<?php if ($is_print){ ?>
|
||||
<td scope="row" data-label="replace_tag" <?php echo $rowspan; ?>><?php echo $tag.' <span class="hook_count">('.$count.')</span>'; ?></td>
|
||||
<?php } ?>
|
||||
<td data-label="replace_function">
|
||||
<?php echo $data['function']; ?>
|
||||
</td>
|
||||
<td data-label="인수의 수"><?php echo $data['arguments']; ?></td>
|
||||
<td data-label="우선 순위"><?php echo $data['priority']; ?></td>
|
||||
</tr>
|
||||
<?php
|
||||
$is_print = '';
|
||||
} //end foreach
|
||||
} else { // else if
|
||||
?>
|
||||
<tr>
|
||||
<td scope="row" data-label="replace_tag"><?php echo $tag.' <span class="hook_count">('.$count.')</span>'; ?></td>
|
||||
<td data-label="replace_function"> </td>
|
||||
<td data-label="인수의 수"> </td>
|
||||
<td data-label="우선 순위"> </td>
|
||||
</tr>
|
||||
<?php
|
||||
}//end if
|
||||
} //end foreach
|
||||
?>
|
||||
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div> <!-- end .hook_list -->
|
||||
</div>
|
||||
|
||||
</div> <!-- end .content_inner -->
|
||||
</div> <!-- end .debug_bar_content -->
|
||||
</div> <!-- end .debug_bar_wrap -->
|
||||
<script>
|
||||
jQuery(function($){
|
||||
$(".debug_tab").on("click", function() {
|
||||
$(".inner_debug").hide();
|
||||
$(this).addClass("active").siblings().removeClass("active");
|
||||
$("#debug_" + $(this).attr('data-tab')).show();
|
||||
});
|
||||
|
||||
$(".debug_tab").on("click", "a", function(e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$(".debug_bar_wrap").on("click", ".debugbar_close_btn", function() {
|
||||
$(".view_debug_bar").trigger("click");
|
||||
})
|
||||
.on("click", ".view_debug_bar", function() {
|
||||
$(".debug_bar_content").toggle();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
0
plugin/debugbar/index.php
Normal file
0
plugin/debugbar/index.php
Normal file
51
plugin/debugbar/style.css
Normal file
51
plugin/debugbar/style.css
Normal file
@ -0,0 +1,51 @@
|
||||
.debug_bar_wrap{clear:both;display:block;position:relative;z-index:80;height:32px;background-color:#1ABC9C}
|
||||
.debug_bar_content{display:none;position:absolute;z-index:81;width:100%;top:32px;min-height:300px;overflow:hidden;background:#fff;overflow-y:scroll;box-sizing:content-box;border-top:thin solid gray}
|
||||
.debug_bar_text_group{position:relative;padding:0 20px 0 120px;line-height:32px;}
|
||||
.debug_bar_btn_group{position:absolute;top:0;left:1em;line-height:32px;text-align:left}
|
||||
.debug_bar_text{line-height:32px;display:block;width:100%;color:#fff;text-align:right;font-size:1.2em;overflow:hidden;text-overflow: ellipsis;-o-text-overflow:ellipsis;white-space:nowrap;word-wrap:normal !important}
|
||||
.sql_query_list li{padding:1em;line-height:1em}
|
||||
.debug_bar_content .content_inner{position:relative;padding:1em}
|
||||
.debug_bar_content .debug_table_wrap{margin:10px 0}
|
||||
.debugbar_tab::after{display:block;visibility:hidden;clear:both;content:""}
|
||||
.debugbar_tab li{float:left;margin-bottom:-1px;position:relative;display:block;position:relative;display:block;padding:10px 15px}
|
||||
.debugbar_tab li.debug_tab{border-bottom:2px solid #DDD}
|
||||
.debugbar_tab li.active a,.debugbar_tab li.active a:focus,.debugbar_tab li.active a:hover{border-width:0}
|
||||
.debugbar_tab li a{border:none;color:#666}
|
||||
.debugbar_tab li.active a,.debugbar_tab li a:hover{border:none;color:#4285F4!important;background:transparent}
|
||||
.debugbar_tab li a::after{content:"";background:#4285F4;height:2px;position:absolute;width:100%;left:0;bottom:-1px;transition:all 250ms ease 0;transform:scale(0)}
|
||||
.debugbar_tab li.active a::after,.debugbar_tab li:hover a::after{transform:scale(1)}
|
||||
.debugbar_tab li a::after{background:#21527d none repeat scroll 0 0;color:#fff}
|
||||
.inner_debug {display:none}
|
||||
.inner_debug h3.query_top{padding:1em;font-size:1.3em}
|
||||
#debug_executed_query{display:block}
|
||||
.lang_domain_list td .num{margin-right:10px;color:#9b9ea5;font-size:9px}
|
||||
.debugbar_close_btn_el{position:absolute;top:20px;right:20px}
|
||||
.debug_table{border:1px solid #ccc;border-collapse:collapse;margin:0;padding:0;width:100%}
|
||||
.debug_table caption{display:none}
|
||||
.debug_table tr{background:#f8f8f8;border:1px solid #ddd;padding:.35em}
|
||||
.debug_table th,.debug_table td{padding:.625em;text-align:center}
|
||||
.debug_table tbody tr:hover td{background:#c7d4dd!important}
|
||||
.debug_table tbody tr:nth-child(even){background-color:#fff}
|
||||
.debug_table td.left{text-align:left}
|
||||
.debug_table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}
|
||||
.debug_table td img{text-align:center}
|
||||
|
||||
.debug_table.hook_table th, .debug_table.hook_table td {text-align:left;border:1px solid #ddd;}
|
||||
.hook_table .hook_count{margin-left:3px;font-size:0.9em;color:#7cbc0a}
|
||||
|
||||
.debug_bar_btn_group button.debug_button{margin-top:3px}
|
||||
button.debug_button{background-color:#7fbf4d;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#7fbf4d),color-stop(100%,#63a62f));background-image:-webkit-linear-gradient(top,#7fbf4d,#63a62f);background-image:-moz-linear-gradient(top,#7fbf4d,#63a62f);background-image:-ms-linear-gradient(top,#7fbf4d,#63a62f);background-image:-o-linear-gradient(top,#7fbf4d,#63a62f);background-image:linear-gradient(top,#7fbf4d,#63a62f);border:1px solid #63a62f;border-bottom:1px solid #5b992b;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 0 #96ca6d;box-shadow:inset 0 1px 0 0 #96ca6d;color:#fff;padding:3px 0 4px;text-align:center;text-shadow:0 -1px 0 #4c9021;width:100px;font-weight:700;font-size:14px;vertical-align:top}
|
||||
button.debug_button:hover{background-color:#76b347;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#76b347),color-stop(100%,#5e9e2e));background-image:-webkit-linear-gradient(top,#76b347,#5e9e2e);background-image:-moz-linear-gradient(top,#76b347,#5e9e2e);background-image:-ms-linear-gradient(top,#76b347,#5e9e2e);background-image:-o-linear-gradient(top,#76b347,#5e9e2e);background-image:linear-gradient(top,#76b347,#5e9e2e);-webkit-box-shadow:inset 0 1px 0 0 #8dbf67;box-shadow:inset 0 1px 0 0 #8dbf67;cursor:pointer}
|
||||
button.debug_button:active{border:1px solid #5b992b;border-bottom:1px solid #538c27;-webkit-box-shadow:inset 0 0 8px 4px #548c29,0 1px 0 0 #eee;box-shadow:inset 0 0 8px 4px #548c29,0 1px 0 0 #eee}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
.debug_table{border:0}
|
||||
.debug_table caption{font-size:1.3em}
|
||||
.debug_table thead{display:none}
|
||||
.debug_table tr{border-bottom:3px solid #ddd;display:block;margin-bottom:.625em}
|
||||
.debug_table td{border-bottom:1px solid #ddd;display:block;font-size:.8em;text-align:right}
|
||||
.debug_table td.left{text-align:right}
|
||||
.debug_table td:before{content:attr(data-label);float:left;font-weight:700;text-transform:uppercase}
|
||||
.debug_table.hook_table th, .debug_table.hook_table td{border:0 none;border-bottom:1px solid #ddd;text-align:right}
|
||||
.debug_table td:last-child{border-bottom:0 !important}
|
||||
}
|
||||
Reference in New Issue
Block a user