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포인트) 이하를 가진 사람에게는 추천버튼 자체가 비활성화(링크안걸리게?)되도록 하는 것은 어떻게 생각하시나요??
그런 미래지향적인 부분을 본다면, 차라리코어는 그대로 두고, 모두 모듈로써 처리 하는게 좀 낫다고 판단되어요. 모듈로는 간단히 몇개의 메소드만으로도 실행될지도 몰라요.
흠.. 그러면
역시 오류출력문까지는 없던걸로 하고.. 아에 추천버튼이 활성화되지 않는 쪽으로 하는 것이 날까요?..
말은 이리 하지만, 누군가 손 내밀어 주길 기다려야겠네요 ㅎㅎ..
무튼 답글 남겨주신 덕택에
누군가 포인트관련 작업하실때 대단히 참고가 될 것 같습니다 ^^ 제가 잘 모르는 입장이긴 하지만, 그냥 들어봐도 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
이렇게 수정하시고,
이부분에 추가하셨던 내역
부분 모조리 지우시면 되실듯 합니다
테스트는 안해봤습니다.
조속히 해보고 괜찮으시면 잘 정리해서 팁으로 남겨둬도 괜찮을까요..?^^
사실 포인트를 얻은 쪽은 쉬운데
포인트를 소진하는 쪽의 기본기능은 미진한 감이 있어서
일종의 개인적인 숙원 같은 부분입니다..
이 내용이 하나의 연결고리가 되서 또다른 누군가에게 좋은 아이디어가 되었으면 좋겠네요 ㅎㅎ!!
거의 기본적인 XE내의 기능을 이용하고, 나머지는 기본 DB입력이나 트리거 처리로 마무리 하기 때문에..(사실상 디비 생성도 불필요할지도요.)
덕택입니다!
제가 팁게시판에 람보님 이름도 추가해서 잘 정리해서 올려도 되나요? ^___^;;
어떤 회원이 20포인트 깎고 추천할 수 있어야하는데 11포인트만으로 추천해버리네요,,
왜 그런지 몰라서 여러번 테스트해봤으나
이번에는 어떤 조건하에서인지, 저는 아이폰이라 아이폰만으로 테스트해봤으나 영문을 통 모르겠군요..ㅠ.ㅠ
가입당시 +10포인트
로그인1회 +1포인트
총 보유포인트는 11포인트
인 상황에서 추천하는데 20포인트인데 추천을 해뿌렸네요 ㅇ.ㅠ
자세히는...
작동실패율이있다?정도 말고는 대체로 되고 있으니까요 ㅎㅎ..
차감될 포인트 이하의 포인트를 가진 사람은
아예 추천버튼을 비활성화 시키도록 수정하는 방법좀 알려주실 수 있으실까요...?! 이 방법까지 덧붙이면
작동이 실패할 가능성은 0프로일것 같아서요 ^_^;;;;;!
람보님의 진단을 듣고 다시 한 번 글을 남겨봅니다..
차감될 포인트 이하의 포인트를 가진 사람에게는
문서를 열을 때, 아예 추천버튼이 비활성화(링크?버튼이 눌리지 않도록)되도록 하는 방법은 어떨지 자문을 구하고 싶습니다 ..!