팁/튜토리얼

추천할 때 마다 추천한 자의 포인트가 깎이는 기능 by 날아라님, 람보님

2015.12.08 15:23
846
0

xe를 운영하시다 보면,

 

포인트를 주는 기능은 괜찮은 것 같은데,

포인트를 깎는 기능은 또 다른 모듈이나, 아이디어(복권, 게임 등)를 이용하지 않으면 별달리 방법이 없다는 것을 느낍니다

 

개인적으로는 xe가 오픈소스라지만, 코어에서도 운영자의 사이트가 어느정도 상업화 가능한 수준의 가능성을 열어둬야 한다고 생각합니다. (쇼핑몰모듈처럼)

그래야 단순한 취미에서 하나의 사업모델로 욕심이 생기고, 의뢰로 이어지지 않나.. 합니다.

 

상업화 가능성이라 해봐야 제가 목적한 정도는, 그저 포인트인플레이션을 막고, 포인트 소비를 재미있게 혹은 기능성있게 해보자에 초점을 맞춘 정도입니다.

마치 별풍선?쏴주듯이 추천쏴주고 그걸로 명예를 얻는 것도 재미있지 않나 하는 생각도 하고 있습니다.

 

이런 사정 속에서, 그 기본 기능인 추천기능을 활용해서 포인트를 깎을 수 있도록 뛰어나신 분들에게 도움을 구했습니다.

그 결과 탄생한 것이 이 팁입니다.

날아라님과 람보님께 다시 한 번 감사를 드리구요!

 

이 글을 보시는 개발자님이 영감을 얻어서 좋은 프로그램 만들어주시면 좋겠네요 ^^

 

안타깝게도 스킨수준의 수정이 아닌 고급팁이기때문에 코어를 건드립니다.

만약 나중에 코어업데이트를 하게 되는경우 내용이 바뀌어서 작동이 안될 수도 있습니다. ㅠ.ㅠ 

수정법은 아래와 같습니다.

-------------------------------------------

LOG

12/9 테스트를 며칠 간 해보았는데,

원인미상의 조건에서 설정된 포인트에 도달하지 못하는 경우에도 추천이 되어버리는 경우가 있네요.. 

(-20포인트 설정했음에도 11포인트 가진사람이 추천가능하게 됨)

하지만 흔한 상황은 아닌 것 같습니다. 원인을 몰라서 안타깝네요

 

12/12 혹시 만약 기능작동이 잘 안될것을 대비해서 추천버튼이 적용된 포인트 미만일 때 눌리지 않도록 기능추가를

람보님과 상담하였고, 그 결과를 제 나름대로 쉽게 소화해 보았습니다(스케치북 스킨)

-방법-

_read.html 에서 

<div cond="$mi->votes!='N'" class="rd_vote">

이 구문과

<a cond="!$mi->votes" class="blamed bd_login" href="#" onclick="doCallModuleAction('document','procDocumentVoteDown','{$oDocument->document_srl}');return false;"|cond="$is_logged">

이 구문 사이에 아래 코드로 교체 합니다!

 

{@
$member_srl = $logged_info->member_srl;
$oPointModel = getModel('point');
$point = $oPointModel->getPoint($member_srl);
$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('point');
$module_config = $oModuleModel->getModulePartConfig('point', $module_info->module_srl);
if($module_config['voted']) $voted = $module_config['voted'];
else $voted = $config->voted;
}        
<!--@if(abs($voted) <= $point)-->
<a class="bd_login" href="#" onclick="doCallModuleAction('document','procDocumentVoteUp','{$oDocument->document_srl}');return false;"|cond="$is_logged" style="color: #FFF;background-color: #555;" >
    <b><i class="fa fa-heart"></i></b>
    <span>{$lang->cmd_vote}</span>
</a>
<!--@else-->
<a class="bd_login" style="color: #FFF;background-color: #555;">
    <b><i class="fa fa-heart"></i></b>
    <span>{$lang->cmd_vote}</span>
</a>
<!--@end-->

 

-------------------------------------------

 


modules/point/point.controller.php 에서 아래 코드로 수정

이 코드를 적용하면 관리자메뉴에서 모듈별 포인트설정에서 추천받음에 마이너스 포인트 (예 -200)를 입력하실 때,

추천한 사람의 포인트를 해당 포인트만큼(-200) 포인트를 깎게 됩니다.


 

function triggerUpdateVotedCount(&$obj)
{
$module_srl = $obj->module_srl;
$member_srl = $obj->member_srl;
if(!$module_srl || !$member_srl) return new Object();

// 추천자 정보 구함
$logged_info = Context::get('logged_info');
$vote_member_srl = $logged_info->member_srl;

$oModuleModel = getModel('module');
$config = $oModuleModel->getModuleConfig('point');
$module_config = $oModuleModel->getModulePartConfig('point', $module_srl);

$oPointModel = getModel('point');
$vote_cur_point = $oPointModel->getPoint($vote_member_srl, true);

if( $obj->point > 0 )
{
$point = $module_config['voted'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->voted;
}
else
{
$point = $module_config['blamed'];
if(strlen($point) == 0 && !is_int($point)) $point = $config->blamed;
}

if(!$point) return new Object();
// Increase the point
$vote_cur_point += $point;
$this->setPoint($vote_member_srl,$vote_cur_point);

return new Object();
}

 

 


 

modules/document/document.controller.php 에서 아래 코드로 수정

아래 코드를 적용하면, 문서에서 추천을 하는 경우, 설정한 포인트에 미치지 못하는 경우 포인트가 부족하여 추천할 수 없다는 메세지를 출력합니다. 설정한 포인트 이상에서는 추천에 문제가 생기지 않습니다 ^^

 


파일을 여신 후

function procDocumentVoteUp() 를 검색하셔서 나오는 내용이..

    {
        if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');

        $document_srl = Context::get('target_srl');
        if(!$document_srl) return new Object(-1, 'msg_invalid_request');

        $oDocumentModel = getModel('document');
        $oDocument = $oDocumentModel->getDocument($document_srl, false, false);
        $module_srl = $oDocument->get('module_srl');
        if(!$module_srl) return new Object(-1, 'msg_invalid_request');

        $oModuleModel = getModel('module');
        $document_config = $oModuleModel->getModulePartConfig('document',$module_srl);
        if($document_config->use_vote_up=='N') return new Object(-1, 'msg_invalid_request');

        $point = 1;
        $output = $this->updateVotedCount($document_srl, $point);
        $this->add('voted_count', $output->get('voted_count'));
        return $output;
    }

이렇게 되어있을 것입니다. 이 부분을 통채로 아래처럼 바꾸는 작업을 하셔야 합니다.

 

 

function procDocumentVoteUp()
{
   if(!Context::get('is_logged')) return new Object(-1, 'msg_invalid_request');

   $logged_info = Context::get('logged_info');
   $member_srl = $logged_info->member_srl;
   // 포인트가 없으면 추천불가(날아라님수정)
   $oModuleModel = getModel('module');
   $mid = Context::get('mid');
   $module_srl = $oModuleModel->getModuleSrlByMid($mid);
   $module_config = $oModuleModel->getModulePartConfig('point', $module_srl);
   $vote_point = abs($module_config['voted']);
   // 포인트가 없으면 추천불가
   $oPointModel = &getModel('point');
   $member_point = $oPointModel->getPoint($member_srl, true);
   $failed_voted = sprintf("포인트가 부족하여 추천할 수 없습니다. 현재 포인트는 %d 입니다", $member_point);
   if($member_point < $vote_point ) return new Object(-1, $failed_voted);
   
   $document_srl = Context::get('target_srl');
   if(!$document_srl) return new Object(-1, 'msg_invalid_request');

   $oDocumentModel = getModel('document');
   $oDocument = $oDocumentModel->getDocument($document_srl, false, false);
   $module_srl = $oDocument->get('module_srl');
   if(!$module_srl) return new Object(-1, 'msg_invalid_request');

   $oModuleModel = getModel('module');
   $document_config = $oModuleModel->getModulePartConfig('document',$module_srl);
   if($document_config->use_vote_up=='N') return new Object(-1, 'msg_invalid_request');

   $point = 1;
   $output = $this->updateVotedCount($document_srl, $point);
   $this->add('voted_count', $output->get('voted_count'));
   return $output;
}

댓글 4