CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 7.2 |
/modules/board/skins/sketchbook5/_read.html
<a class="bd_login btn-vote-good" href="#" onclick="doCallModuleAction('document','procDocumentVoteUp','{$oDocument->document_srl}');return false;"|cond="$is_logged" style="border:0px solid #{$mi->color};color:#{$mi->color};"> <b><i class="fa fa-heart"></i> {$oDocument->get('voted_count')}</b> <p>{$lang->cmd_vote}</p> </a>
위 코드는 추천하는 코드입니다.
로그인한 회원이 이미 추천한 경우는 추천취소하는 코드를 넣으면 될 거 같더군요.
SELECT * FROM `xe_document_voted_log`
디비에는 해당 테이블이 추천로그를 기록하는 거 같았습니다.
지금 로그인한 회원 $member_srl=$logged_info->member_srl 이
해당 게시물 번호 document_srl 의 member_srl 에 동일한 값이 있으면
<!--@if( )-->
<a href="javascript:();" onclick="doCallModuleAction('document','procDocumentVoteCancel','{$oDocument->document_srl}');return false;"|cond="$is_logged"> {$oDocument->get('voted_count')} / 추천취소 </a>
<!--@end-->
이런 식으로 doCallModuleAction에서 procDocumentVoteCancel라는 함수를 추가해넣어서..
클릭하면 추천수를 빼고
xe_document_voted_log 테이블에서 document_srl이 같고, member_srl이 같은 값을 빼주는 식으로 하면 될거 같은데요..
1. 저 테이블에서 해당 document_srl 이 같고, member_srl이 같은 값 조건문 작성방법
{@ $oDB = &DB::getInstance(); $query = $oDB->_query('select * from xe_document_voted_log where member_srl = '.$logged_info->member_srl.' AND document_srl = '.$oDocument->document_srl.' '); $result = $oDB->_fetch($query); //$oMemberModel =& getModel('member'); //$member_info = $oMemberModel->getMemberInfoByMemberSrl($val->sender_srl); } {$result}
2. procDocumentVoteCancel 함수 작성방법
modules/document/document.controller.php
function procDocumentVoteCancel() { if(!Context::get('is_logged')) return new BaseObject(-1, 'msg_invalid_request'); $document_srl = Context::get('target_srl'); if(!$document_srl) return new BaseObject(-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 BaseObject(-1, 'msg_invalid_request'); $oModuleModel = getModel('module'); $document_config = $oModuleModel->getModulePartConfig('document',$module_srl); if($document_config->use_vote_up=='N') return new BaseObject(-1, 'msg_invalid_request'); $point = -1; $output = $this->updateVotedCount($document_srl, $point); $this('voted_count', $output->get('voted_count')); return $output; }
3. 해당 게시물 추천수 차감 방법
4. xe_document_vote_log 테이블에서 document_srl이 같고, member_srl이 같은 값을 빼주는 방법
이 4개만 할 줄 알면 되는거 맞나요?

eond
Lv. 13
# 라이믹스 스킨 제작은 어디? >>>> XE 레이아웃, 라이믹스 스킨제작은 이온디에서 커스터마이징해드립니다.
# 빠른 라이믹스 커뮤니티용 호스팅을 찾고 계신가요? >>>> 이온디호스팅 서비스는 PHP8 & Redis 서버 캐시를 활용하여 라이믹스에 최적화된 호스팅 서비스를 제공해드립니다. (서버세팅시 웹패널, 내도메인메일서비스도 함께 구축해드립니다.)
https://eond.com
# 빠른 라이믹스 커뮤니티용 호스팅을 찾고 계신가요? >>>> 이온디호스팅 서비스는 PHP8 & Redis 서버 캐시를 활용하여 라이믹스에 최적화된 호스팅 서비스를 제공해드립니다. (서버세팅시 웹패널, 내도메인메일서비스도 함께 구축해드립니다.)
https://eond.com
댓글 12
추천이 procDocumentVoteUp 함수이고, updateVotedCount 를 참고하니
취소함수는... 이 두 함수 분석해서 반대로 구현하면 될거예요
물론 더 제대로 만들려면..
추천시 포인트가 증가하게 되어있더면, 추천취소시 포인트가 차감되도록 하는 기능까지 만들어야겠죠
이걸 굳이 trigger 로 추가하고 point 모듈을 고칠필요없이, 그냥 취소함수에 같이 다 넣어버리면 됩니다
만든걸 조금 변형하면, 비추천 취소 기능을 추가로 만들 수도 있고요
더 나아가면 댓글의 추천취소 / 댓글의 비추천취소까지도 있네요 ^^
포인트 부분도 있을 수 있겠지만 제 능력 밖이라 일단 이 정도라도 해볼려고요;
저 4가지 작업이 기본 맞죠?;;
VoteUp함수에서 $point=1 부분을 동일한 코드 사용해서 -1로 해볼려고요.
먼저 1번에서 막히는데,
디비에서 {$query} 출력하니깐 array 로 뜨는데 저기서 어떻게 더 해야할지 모르겠습니다;
아무튼 스킨에서 쿼리를 실행하고 있다면 뭔가 크게 잘못된 거라고 봐야 합니다...
라이믹스를 참고하시면 추천을 햇을때 추천취소 버튼이 어덯게 만들어지는지 그 함수가 어떻게 작동하는지 확인해보세요..
controller에 함수를 추가하여 웹에서 호출하려면 module.xml에도 해당 함수명을 등록해야 합니다. 안 그러면 "잘못된 요청입니다."라고 나와요.
procDocumentVoteCancel() 함수 내에서도 뭔가 문제가 있으면 자세히 구분하지 않고 무조건 "잘못된 요청입니다."를 반환하고 있으니, module.xml에 등록하지 않아서 오류가 나면 어디가 문제인지 파악하기가 쉽지 않습니다. 미리 알려드려요^^
<action name="procDocumentVoteCancel" type="controller" />
감사합니다;
{@
$oDB = &DB::getInstance();
$query = $oDB->_query('select * from xe_document_voted_log where member_srl = '.$logged_info->member_srl.' AND document_srl = '.$oDocument->document_srl.'');
$result = $oDB->_fetch($query);
//$oMemberModel =& getModel('member');
//$member_info = $oMemberModel->getMemberInfoByMemberSrl($val->sender_srl);
//$memberSrl = $logged_info->member_srl;
//$documentSrl = $oDocument->document_srl;
//$query = $oDB->_query('select * from xe_document_voted_log where member_srl = '.$memberSrl.' AND document_srl = '.$documentSrl.'');
//$sql = 'select * from xe_document_voted_log where member_srl = '.$logged_info->member_srl.' AND document_srl = '.$oDocument->document_srl.'';
//$query = $oDB->_query($sql);
}
<!--@if($result->member_srl==$logged_info->member_srl)-->
<a href="javascript:();" onclick="doCallModuleAction('document','procDocumentVoteCancle','{$oDocument->document_srl}');return false;"|cond="$is_logged">
{$oDocument->get('voted_count')} / 추천취소
</a>
<!--@else-->
<a class="bd_login btn-vote-good" href="#" onclick="doCallModuleAction('document','procDocumentVoteUp','{$oDocument->document_srl}');return false;"|cond="$is_logged" style="border:0px solid #{$mi->color};color:#{$mi->color};">
<b><i class="fa fa-heart"></i> {$oDocument->get('voted_count')}</b>
<p>{$lang->cmd_vote}</p>
</a>
<!--@end-->
2번까지 했는데 이미 추천한 경우는 비추천도 안되는군요. 이게 어디에 있는지 ㅠ
modules/document/document.controller.php (1151)
// Update the voted count
이 부분이군요
깃헙에도 관련 이슈가 있었네요..
https://xe1.xpressengine.com/tip/22318021
관련모듈도 있지만 취소기능은없네요
https://xe1.xpressengine.com/tip/22318021
팁을 찾았습니다;