Q&A

12/3

아.. 문제가 묘해졌습니다 ㅠㅠ

 

즉, 포인트가 부족하다면, '포인트가 부족하여 추천할 수 없습니다. 현재 포인트는 %d 입니다 ' 라는 메세지가 나오면서 추천할 수 없도록 하는 것이 기능의 목적인데..

 

어떨 때에는 20포인트 까도록 설정했는데 17포인트만 가지고 있는 회원도 추천을 할 수 있게 되어버리네요..

물론 어 ? 왜 추천이 되버리지 하고 포인트 다시 17포인트 만들어놓고 다른 게시물을 눌러보면 그 때는 또  '포인트가 부족하여 추천할 수 없습니다. 현재 포인트는 %d 입니다 ' 라고 뜹니다..

그래서 당황하여 다른 게시물을 눌러보면   '포인트가 부족하여 추천할 수 없습니다. 현재 포인트는 %d 입니다 ' 라고 뜨지 않고 그저 '추천할 수 없습니다' 라고 뜨기도 하네요

 

그저 일정 이하의 포인트에서 추천할 수 없도록 만드는 것 뿐인데 작동이 묘해졌으니 어떻게하면 좋을까요

이 난제는 해결이 가능한 것일까요?...

 

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

11/22

추천할 때 마다 추천한 자의 포인트가 깎이는 기능구현 문제(2)에서 얻은 날아라님의 기여로 

일단 추천할 때마다 추천한 자의 포인트가 깎이게끔 되었습니다 ^ㅇ^

몇 주 기간을 두며 지켜본 바로는 작동은 제대로 되는 듯 합니다!

 

다만 안내문이 살짝 오작동하는 면이 있네요 이것을 바로잡아 주실 분 찾습니다 ㅠ_ㅜ

 

상황은 즉

아래 코드를 사용하면, 일단 포인트는 정상적으로 깎입니다.

 

문제가 되는 부분은 시간이 충분히(어느정도인지 현재까지 파악못함) 지난 상황에서 (그러나 이게 필수조건)

이미 추천을 통해서 포인트가 깎인 게시물은 재차 추천해봐야 '추천할 수 없습니다' 메세지가 뜨는 것이 보통 정상상황입니다

그런데 추천버튼을 재 차 누르면, 포인트가 부족하여 추천할 수 없습니다. 현재 포인트는 %d 입니다 라는 아래 코드에 적어놓은 메세지가 뜨게 되버립니다.

 

원래 "포인트가 부족하여 ...." 이 메세지는 포인트가 추천으로 설정한 포인트 이하로 떨어질 때 나오게끔 설계된 메세지인데, 

추천이 이미 끝나서 더 이상 추천할 수 없는 상태일 때 이 메세지가 나와 버립니다' '

 

이걸 고치면 좋겠는데, 어려운 내용이 아닌지 걱정입니다

 

우회적인 다른 방법이 없을지 고민 해 봤는데, 혹시 추천을 이미 했다면, 추천버튼이 비활성화 된 상태로 표시된다던지 아에 없애버린다던지 있네요.. 이런 방법이라도 알려주신다면 적용해 보고 싶습니다 ^ ^

 


현재 까지 이 기능이 고쳐진 내용은 아래와 같습니다.

 

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

이 코드를 적용하면 추천받음에 마이너스포인트 (예 -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 updateVotedCount 에서


~ 생략 ~
// Create a member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();  <-이 부분 바로 아랫부분에 다음 내용을 추가합니다.

// 포인트가 없으면 추천불가(날아라님수정)

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


 

댓글 25

  • 포인트가 없으면 추천 불가라는 항목이, 추천하는 포인트 디비랑 모두 적용한 뒤에 올라가느냐, 아니면 전에 가느냐에 따라 틀립니다.
    update 부분을 건드리지 말고, procDocumentVoteUp 에서 $this->updateVotedCount 실행하기전에 모두 리턴 시킬 수 있는 명령을 보여줄 수 있도록 하셔야 합니다.
  • @람보
    아..문제의 핵심이 이 부분 때문이려나요..? 사실 알아듣을 수 있는 입장이 아니라 들어도 모르지만요 ..ㅎㅎ;;
  • @큰성
    디비 입력을 모두 실행하고 그 다음에 넣은거라면, 리턴 해바짜 소용없이 이미 추천이 들어간 상태고, 그 뒤에 다시 추천하게 되면 추천할 수 없습니다 이런 형태가 나올 수 있습니다.
    이건, 어느정도 순서를 익히고, 순서에 맞게 정말 중요한 부분을 제일먼저 읽어들여서 빠르게 실행을 못하도록 막아줘야 하기 때문입니다..
  • 추천시 실행 순서가,

    procDocumentVoteUp -> updateVotedCount->디비입력이후 -> triggerUpdateVotedCount 실행 -> updateVotedCount 디비입력트리거 그 이후부터 다시 실행 -> procDocumentVotedUp 마무리 부분 (return $output;) 입니다.
  • @람보
    취미생활로 만든 사이트지만 , 가벼운 비용을 치루고라도 완성하고 싶은 욕심이 있습니다..!
  • @큰성
    죄송하지만, 코어를 직접 수정하는 부분은 의뢰 받지도 않아요. 유지 보수를 하는데 사용자가 너무 어려워 지고, 해당 부분의 수정부분도 많아서, 코어를 수정하지 않은 모듈생성에 도움을 드리곤 합니다.
  • @람보

    알겠습니다 ㅠㅠ 이뤘으면 하는 기능인데

     

    그럼 요는, 포인트가 일정 이하라면 추천할 수 없게 만드는 기능은 코어에 갖춰진 기능을 변경해야 하는 것이라 어려운 일이라고 이해했는데요 

     

    위에 제가 적은 내용처럼

    예를들어  추천하면 -200포인트 씩 깎게 만든 부분. 여기까지는 괜찮은건가요? 

    만약 197포인트를 가진 사람도 추천하는 기능 <-이것만 문제라면

     

    그렇다면 우회적으로 생각해서

    문서를 열었는데, 현재 포인트 상으로 해당포인트(200포인트) 이하를 가진 사람에게는 추천버튼 자체가 비활성화(링크안걸리게?)되도록 하는 것은 어떻게 생각하시나요??

  • @큰성
    해당 기능을 구현하기 위해서 modules풀더의 최소 2개의폴더에서 수정이 이루어지기 때문에.. 님께서는 잘 이해하시고 대략 어느정도 코어 업데이트시 어떻게 하시겟지만, 코어 업데이트라는게 보안 업데이트상으로 해당 파일이 수정되는 경우도 배재할 수 없고 php7 호환때문에 아마 해당 파일의 수정이 불가피하다고 판단되요.
    그런 미래지향적인 부분을 본다면, 차라리코어는 그대로 두고, 모두 모듈로써 처리 하는게 좀 낫다고 판단되어요. 모듈로는 간단히 몇개의 메소드만으로도 실행될지도 몰라요.
  • @람보
    위에 댓글이요+_+
  • @큰성
    애초에 오류출력은 트리거에 남기는것도 아니고, update에 넣는것도 아니고 실행했을 시작단계에서 처리 하도록 해주는것이 좋습니다.
  • @람보

    흠.. 그러면
    역시 오류출력문까지는 없던걸로 하고.. 아에 추천버튼이 활성화되지 않는 쪽으로 하는 것이 날까요?..
    말은 이리 하지만, 누군가 손 내밀어 주길 기다려야겠네요 ㅎㅎ..

     

    무튼 답글 남겨주신 덕택에

    누군가 포인트관련 작업하실때 대단히 참고가 될 것 같습니다 ^^ 제가 잘 모르는 입장이긴 하지만, 그냥 들어봐도 xe에 속사정에 대해 밝으셔서 그런지, 귀중한 정보가 지금 막 나오고 있는것 정도는 알것같습니다 ㅎㅎ

     

    비록 직접적으로 해결을 볼 순 없더라도, 다른 누군가 람보님 팁을 읽고 참고가 된다면 저도 질문 남긴 보람이 있네요 ^^!!

  • @큰성

    // 포인트가 없으면 추천불가(날아라님수정)
    $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);
    이라고 되어잇는것들을 모조리
    procDocumentVoteUp 함수에서 처리하도록 도와주시면 될듯요.
    $member_point = $oPointModel->getPoint($member_srl, true);이 부분의 $member_srl자체는 선언이 되어잇지 않기 때문에.. 그 위에

    $logged_info = Context::get('logged_info');

    $member_srl = $logged_info->member_srl;

    추가하시구요..

  • @람보
    윽 제가 이렇게 하라면 그대로 따라만 할 줄 아는 수준인데
    결과물 좀 보여주실 수 없을까요?? ㅠ.ㅠ;;

    해보고 잘 되면 최종적으로는 이렇게 오늘 이 게시물처럼 깔끔하게 정리해서 xe town에 올려놓고 싶어서요..!
  • @큰성

    document.controller.php

     

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

    이렇게 수정하시고,

    function updateVotedCount($document_srl, $point = 1)

    이부분에 추가하셨던 내역

    // 포인트가 없으면 추천불가(날아라님수정)
    $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);
    

     

    부분 모조리 지우시면 되실듯 합니다

    테스트는 안해봤습니다. 

     

     

     

     

  • @람보
    일단 대단히 감사드립니다..!
    조속히 해보고 괜찮으시면 잘 정리해서 팁으로 남겨둬도 괜찮을까요..?^^
    사실 포인트를 얻은 쪽은 쉬운데
    포인트를 소진하는 쪽의 기본기능은 미진한 감이 있어서
    일종의 개인적인 숙원 같은 부분입니다..
    이 내용이 하나의 연결고리가 되서 또다른 누군가에게 좋은 아이디어가 되었으면 좋겠네요 ㅎㅎ!!

    + 이런 기능이 모듈로 개발된다면 포켓머니 수준으로는 곤란한 정도의 견적이 나오려나요..? (잘 몰라서 지레 겁먹는)
  • @큰성
    의뢰한 내용에 대해서는 견적에 따라 다르지만, 보통 모듈을 제작하는 시작단가에 따라 다를겁니다.
    거의 기본적인 XE내의 기능을 이용하고, 나머지는 기본 DB입력이나 트리거 처리로 마무리 하기 때문에..(사실상 디비 생성도 불필요할지도요.)
  • @람보
    한 며칠 놓고 추천해봤는데 문제없이 잘 작동하고 있네요 ^____^ (시간이 좀 지나야 추천문제가 생기길래 한 번 기다려봤어요)
    덕택입니다!
    제가 팁게시판에 람보님 이름도 추가해서 잘 정리해서 올려도 되나요? ^___^;;
  • @큰성
    알아서요...ㅋㅋ
  • @람보
    포인트 적립내역을 보니 또 테스트할때는 (지금도) 문제가 없었는데
    어떤 회원이 20포인트 깎고 추천할 수 있어야하는데 11포인트만으로 추천해버리네요,,
    왜 그런지 몰라서 여러번 테스트해봤으나
    이번에는 어떤 조건하에서인지, 저는 아이폰이라 아이폰만으로 테스트해봤으나 영문을 통 모르겠군요..ㅠ.ㅠ
  • @큰성
    그회원의 포인트 여부랑 등등을 알아보셔야..
  • @람보
    포인트히스토리모듈로 확인한 결과는 이렇습니다 ㅎㅎ

    가입당시 +10포인트
    로그인1회 +1포인트

    총 보유포인트는 11포인트

    인 상황에서 추천하는데 20포인트인데 추천을 해뿌렸네요 ㅇ.ㅠ
  • @큰성
    일딴 코드대로라면 오류현황을 뿜어야 할 부분인데, 어떤 이유인지는 그 사람의 시점에서 아이디를 가지고 테스트 해봐야겟죠..
    자세히는...
  • @람보
    흐음 그렇군요 ㅠ.ㅠ 그래도 일단 크게 중요한 사이트가 아니라면
    작동실패율이있다?정도 말고는 대체로 되고 있으니까요 ㅎㅎ..
  • @람보
    아, 혹시 제가 이 게시물 맨 아래에 남겨놓은 글 처럼

    차감될 포인트 이하의 포인트를 가진 사람은
    아예 추천버튼을 비활성화 시키도록 수정하는 방법좀 알려주실 수 있으실까요...?! 이 방법까지 덧붙이면
    작동이 실패할 가능성은 0프로일것 같아서요 ^_^;;;;;!
  • 람보님의 진단을 듣고 다시 한 번 글을 남겨봅니다..

    차감될 포인트 이하의 포인트를 가진 사람에게는
    문서를 열을 때, 아예 추천버튼이 비활성화(링크?버튼이 눌리지 않도록)되도록 하는 방법은 어떨지 자문을 구하고 싶습니다 ..!