Skip to content

마이로그 스킨 업데이트 가이드 (1.0.9)

조회 수 47 추천 수 0

스킨을 제작해주신 분들께 노고에 먼저 감사의 인사를 드리고, 제작하신 스킨에 개선이 필요하게 된 점 양해를 부탁드립니다.
스킨에 영향은 쉽고 최소한으로 적용코자 시도했습니다.
기본 스킨의 html 변경점을 참고하셔서 반영하시면 좋겠습니다. (css 도 조금의 변화가 있지만 따로 안내드리지 않겠습니다.)

1. getElkhabookList.html 파일의 1~66 라인에 해당되는 코드가 필요하지 않습니다.

{@
$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;
}

2. getElkhabookList.html 파일에서 다음의 코드들을 치환했습니다.

$url = $oModel->getUrl('dispMemberInfo', $_member_info->member_srl, 'getUrl'); // 단, reset 링크는 치환하지 않고 기존대로 유지함.

$url = $oModel->getUrl('dispMemberInfo', $_member_info->member_srl, 'getUrl', $_output[3] ?? '');

3. getElkhabookList.html 파일에 타인의 글/댓글이면 작성자 닉네임이 보여야 합니다.

...
{@
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;

}
...

4. 비공개 목록의 안내 메세지가 추가 되었습니다.

...
<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;
...

6. pjax js 코드가 변경 되었습니다: script.js, script.min.js

...
    $(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) {
...

7. dispMemberInfo.html 변동 사항 (첫 화면에 1개 목록만 보여지고 탭을 클릭해서 전환하시면 // $show_count = 1; 이 앞의 주석을 지워주셔야 불필요한 부하를 방지합니다.)

<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>';
}

8. procElkhabookMyConfig.html 파일이 추가 되었습니다: 전체 공개, 비공개 등 개인 설정을 가능하게 (파일 이름은 동일하게 두셔야 ajax 대응됩니다.)

<!--@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-->

9. getElkhabookList.html 내의 적절한 위치에서 위 8번에 해당되는 파일을 include 합니다.

<!--@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-->

10. js 코드가 추가 되었습니다: 전체 공개, 비공개 등 개인 설정을 가능하게

$(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;
});

- procElkhabookMyConfig.html 파일의 역할은 다음의 영상과 같습니다.

QnA. 스킨 어디를? 어떻게? 고쳐야 할지 모르겠어요.

스킨 제작자, 사용자 여러분이 불편 겪으신데 죄송한 마음입니다.
어려움이 있거나 도움이 필요하시면 말씀주세요, 성심성의껏 도움 드리겠습니다.

QnA. 저는 사용자인데 스킨을 업데이트하지 않으면요?

기존 스킨은 그대로 오류없이 사용할 수 있지만 내부적으로 글/댓글 목록을 재차 조회할 수 있습니다. 따라서 모듈 업데이트 시 스킨도 함께 업데이트 하시길 권해드립니다.
또한 1.0.9 에서 추가된 신규 기능이 반영되지 않으므로 컨텐츠 목록은 내 글, 내 댓글이 고정됩니다.

개발자

로그인해야 글을 쓸 수 있습니다.
회원 가입에 메일 인증은 필요하지 않습니다.