스킨을 제작해주신 분들께 노고에 먼저 감사의 인사를 드리고, 제작하신 스킨에 개선이 필요하게 된 점 양해를 부탁드립니다.
스킨에 영향은 쉽고 최소한으로 적용코자 시도했습니다.
기본 스킨의 html 변경점을 참고하셔서 반영하시면 좋겠습니다. (css 도 조금의 변화가 있지만 따로 안내드리지 않겠습니다.)
{@
$oModel = getModel('elkhabook'); // for ajax
$elkhabook_config = $oModel->getConfig(); // for ajax
$board = $board ?? ''; // for ajax
$output = [];
$module_srl = 0;
$page = isset($page)? (INT)$page : 0;
$cpage = isset($cpage)? (INT)$cpage : 0;
$epage = isset($epage)? (INT)$epage : 0;
$_module_info = NULL;
if($board != ''):
$oModuleModel = getModel('module'); // for ajax
$_module_info = $oModuleModel->getModuleInfoByMid($board);
$match = FALSE;
foreach($elkhabook_config->doc_list as $regex => $val):
if(preg_match($regex, $board)):
$match = TRUE;
break;
endif;
endforeach;
if(!$match):
$board = '';
endif;
if($match && is_object($_module_info) && $_module_info->module_srl && $_module_info->mid==$board):
if(!(INT)$cpage)
$output['document'] = [
'<a href="'.getUrl('','mid',$_module_info->mid).'">'.$oModel->getBrowserTitle($_module_info->module_srl).'</a>'
,$oModel->getDocList($_member_info->member_srl, (INT)$page, $_module_info->module_srl)
,'page'
];
if(!(INT)$page)
$output['comment'] = [
'<a href="'.getUrl('','mid',$_module_info->mid).'">'.$oModel->getBrowserTitle($_module_info->module_srl).'</a> - ' . $lang->comment
,$oModel->getCmtList($_member_info->member_srl, (INT)$cpage, $_module_info->module_srl)
,'cpage'
];
$module_srl = $_module_info->module_srl;
endif;
endif;
if(!count($output)):
if(!(INT)$cpage && !(INT)$epage)
$output['document'] = [
$lang->document
,$oModel->getDocList($_member_info->member_srl, (INT)$page)
,'page'
];
if(!(INT)$page && !(INT)$epage)
$output['comment'] = [
$lang->comment
,$oModel->getCmtList($_member_info->member_srl, (INT)$cpage)
,'cpage'
];
if(!(INT)$cpage && !(INT)$page && count($elkhabook_config->elkhatalk_rooms))
$output['chat'] = [
'채팅'
,$oModel->getChatList($_member_info->member_srl, (INT)$epage)
,'epage'
];
endif;
}
$url = $oModel->getUrl('dispMemberInfo', $_member_info->member_srl, 'getUrl'); // 단, reset 링크는 치환하지 않고 기존대로 유지함.
$url = $oModel->getUrl('dispMemberInfo', $_member_info->member_srl, 'getUrl', $_output[3] ?? '');
...
{@
if(!isset($obj->elkhatalk)):
$info_arr = [
'voted_count' => $obj->get('voted_count') ?: 0,
'blamed_count' => abs($obj->get('blamed_count') ?: 0),
'comment_count' => $obj->get('comment_count') ?: 0,
'readed_count' => $obj->get('readed_count') ?: 0,
];
if(array_sum($info_arr)):
echo '<p class="p info">';
foreach($info_arr as $info_arr_key => $info_arr_val):
if(!$info_arr_val)
continue;
echo sprintf('<span class="tooltip %s"><span class="label">%s </span>%s</span> ', $info_arr_key, \Context::getLang($info_arr_key), number_format($info_arr_val));
endforeach;
echo '</p>';
endif;
endif;
$buff = [];
if($_member_info->member_srl != $obj->get('member_srl')):
$nick_name = '';
if($obj->get('member_srl') > 0):
$author_info = \MemberModel::getMemberInfoByMemberSrl($obj->get('member_srl'));
if(($author_info->member_srl ?? 0) == $obj->get('member_srl'))
$nick_name = $author_info->nick_name;
endif;
if(!strlen($nick_name))
$nick_name = $obj->getNickName();
$buff[] = sprintf('<span class="tooltip author"><span class="label">%s </span><a href="%s" onclick="return false;" class="member_%d">%s</a></span> ', $lang->author, $oModel->getUrl('dispMemberInfo', $obj->get('member_srl'), 'getUrl'), $obj->get('member_srl'), $nick_name);
endif;
if(!isset($obj->elkhatalk)):
$info_arr = [
'voted_count' => $obj->get('voted_count') ?: 0,
'blamed_count' => abs($obj->get('blamed_count') ?: 0),
'comment_count' => $obj->get('comment_count') ?: 0,
'readed_count' => $obj->get('readed_count') ?: 0,
];
foreach($info_arr as $info_arr_key => $info_arr_val)
if($info_arr_val)
$buff[] = sprintf('<span class="tooltip %s"><span class="label">%s </span>%s</span> ', $info_arr_key, \Context::getLang($info_arr_key), number_format($info_arr_val));
endif;
if(count($buff)):
echo '<p class="p info">' . implode(' ', $buff). '</p>';
endif;
}
...
...
<div class="docs-ajax">
<!--@if(is_array($_output[1]->data) && count($_output[1]->data))-->
<!--@if(!$_output[1]->toBool())-->
<p class="msg">
{@
echo $_output[1]->getMessage();
if(strlen($_output[4][0] ?? '')):
echo ' [' . \Context::getLang('elkhabook_contents_'.$_output[4][0]) . ']';
endif;
}
</p>
<!--@else if(is_array($_output[1]->data) && count($_output[1]->data))-->
{@
$regdate = 0;
$regdate2= 0;
...
...
$(document).on('click', 'a.getElkhabookList[href]', function(e) {
var params = {
'board' : this.href.getQuery('board'),
'page': '',
'cpage': '',
'epage': ''
};
var page = Number(this.href.getQuery('page'));
var cpage = Number(this.href.getQuery('cpage'));
var epage = Number(this.href.getQuery('epage'));
if(page)
params.page = page;
else if(cpage)
params.cpage = cpage;
else if(epage)
params.epage = epage;
window.getElkhabookList(params);
return false;
});
window.getElkhabookList = function(params)
{
params.member_srl = window.elkhabook_member_srl;
$.exec_json('elkhabook.getElkhabookList', params, function(p){
if(typeof(p.getElkhabookList) == 'string')
{
var url = location.href.setQuery('board', params.board).setQuery('page', params.page).setQuery('cpage', params.cpage).setQuery('epage', params.epage);
history.pushState(p, '', url);
$('.elkhabook > .sidebar_r.getElkhabookList').html(p.getElkhabookList);
}
else
{
alert(p.message);
}
});
};
var params = {
'board' : this.href.getQuery('board'),
'doc_type' : this.href.getQuery('doc_type'),
'member_srl' : window.elkhabook_member_srl
};
if(params.doc_type === '')
{
var matches = this.href.match(/\/([a-z]+)[^/]*$/); // 짧은 주소만 지원
if(matches !== null)
{
params.doc_type = matches[1];
}
}
var page = Number(this.href.getQuery('page'));
var cpage = Number(this.href.getQuery('cpage'));
var epage = Number(this.href.getQuery('epage'));
if(page)
params.page = page;
else if(cpage)
params.cpage = cpage;
else if(epage)
params.epage = epage;
var url = this.href;
var $getElkhabookList = $('.elkhabook > .getElkhabookList');
params.show_count = $getElkhabookList.data('show_count');
$.exec_json('elkhabook.getElkhabookList', params, function(p){
if(typeof(p.getElkhabookList) == 'string')
{
history.pushState(p, '', url); // history.replaceState(null, url);
$getElkhabookList.html(p.getElkhabookList);
}
else
{
alert(p.message);
}
});
return false;
});
window.addEventListener('popstate', function(e) {
...
<div class="sidebar_r getElkhabookList">
{@
$oModel->getElkhabookList();
echo $oModel->get('getElkhabookList');
}
</div>
{@
// $show_count = 1; // 초기 화면이 탭 형태로 1개만 보여진다면 이 값에 1 선언합니다. 예를들어 2 값을 넣으면 3번째 목록부터 빈 값을 제공하여 부하가 덜 발생합니다.
$oModel->getElkhabookList();
echo '<div class="sidebar_r getElkhabookList" data-show_count="'.($show_count ?? 99).'">' . $oModel->get('getElkhabookList') . '</div>';
}
<!--@if(count($my_config) >= 2)--><!--// 옵션을 변경할 수 있다면. -->
<div class="li doc_types getElkhabookMyConfig" data-name="{strip_tags($name)}">
<a href="javascript:void(0);">{@
echo \Context::getLang('elkhabook_contents_' . $my_config[0]);
}</a>
<div class="ul1">
<ul>
<!--@foreach($my_config as $key => $val)--><!--@if($key)-->
<li class="li1"><a href="javascript:void(0);" onclick="return false;" class="procElkhabookMyConfig" data-name="{strip_tags($name)}" data-contents="{$val}">{@
echo \Context::getLang('elkhabook_contents_' . $val);
}</a></li>
<!--@endif--><!--@endforeach-->
</ul>
<span class="span">{$lang->elkhabook_contents_help}</span>
</div>
</div>
<!--@elseif(strlen($my_config[0] ?? ''))--><!--// 1개의 옵션만 있다면. -->
<span class="li">{@ echo \Context::getLang('elkhabook_contents_' . $my_config[0]); }</span>
<!--@endif-->
<!--@if($_member_info->member_srl == ($logged_info->member_srl ?? 0) && count($my_config = $_output[4] ?? []) && strlen($name = $_output[3][1] ?? ''))-->
<include target="procElkhabookMyConfig.html" />
<!--@endif-->
$(document).on('click', '.procElkhabookMyConfig', function(e){
var params = {
'name': $(this).data('name'),
'contents': $(this).data('contents')
};
$.exec_json('elkhabook.procElkhabookMyConfig', params, function(p){
if(typeof(p.procElkhabookMyConfig) == 'string')
{
$('.getElkhabookMyConfig[data-name]').each(function(){
if($(this).data('name') === params.name)
{
this.outerHTML = p.procElkhabookMyConfig;
return false;
}
});
}
setTimeout(function(){
alert(p.message);
}, 1);
});
return false;
});
스킨 제작자, 사용자 여러분이 불편 겪으신데 죄송한 마음입니다.
어려움이 있거나 도움이 필요하시면 말씀주세요, 성심성의껏 도움 드리겠습니다.
기존 스킨은 그대로 오류없이 사용할 수 있지만 내부적으로 글/댓글 목록을 재차 조회할 수 있습니다. 따라서 모듈 업데이트 시 스킨도 함께 업데이트 하시길 권해드립니다.
또한 1.0.9 에서 추가된 신규 기능이 반영되지 않으므로 컨텐츠 목록은 내 글, 내 댓글이 고정됩니다.