질문/조언질답게시판
Extra Form
PHP PHP 7.2
CMS XpressEngine

/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`

디비에는 해당 테이블이 추천로그를 기록하는 거 같았습니다.

 

document_srl member_srl ipaddress regdate point  
151 4 123.41.142.202 20181111001704 1
205 4 123.41.142.202 20181111004503 1
265 708 123.170.29.60 20181114142942 1

 

지금 로그인한 회원 $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개만 할 줄 알면 되는거 맞나요?

TAG •
  • ?
    cancel 이예요 ^^
    추천이 procDocumentVoteUp 함수이고, updateVotedCount 를 참고하니
    취소함수는... 이 두 함수 분석해서 반대로 구현하면 될거예요

    물론 더 제대로 만들려면..
    추천시 포인트가 증가하게 되어있더면, 추천취소시 포인트가 차감되도록 하는 기능까지 만들어야겠죠
    이걸 굳이 trigger 로 추가하고 point 모듈을 고칠필요없이, 그냥 취소함수에 같이 다 넣어버리면 됩니다

    만든걸 조금 변형하면, 비추천 취소 기능을 추가로 만들 수도 있고요
    더 나아가면 댓글의 추천취소 / 댓글의 비추천취소까지도 있네요 ^^
  • ? profile
    글자 수정했습니다^^
    포인트 부분도 있을 수 있겠지만 제 능력 밖이라 일단 이 정도라도 해볼려고요;
    저 4가지 작업이 기본 맞죠?;;

    VoteUp함수에서 $point=1 부분을 동일한 코드 사용해서 -1로 해볼려고요.

    먼저 1번에서 막히는데,
    디비에서 {$query} 출력하니깐 array 로 뜨는데 저기서 어떻게 더 해야할지 모르겠습니다;
  • profile profile
    Array로 뜬다면 배열이 들어있을 테니, 안에 뭐가 들었는지 print_r이나 var_dump 등으로 정확하게 확인해서 그 구조에 맞게 {$query[0]->abcd} 이런 식으로 고쳐야겠지요.

    아무튼 스킨에서 쿼리를 실행하고 있다면 뭔가 크게 잘못된 거라고 봐야 합니다...
  • profile profile
    모듈이나 애드온을 아직 만드는걸 몰라서 스킨단에서 테스트로 개발 후에 그렇게 해보려고요^^;
  • profile
    추천시 추천했는지 아닌지를 확인하는 함수도 필요하고요. 이런 부분 하나하나 세세하게 확인해보셔야.. 정확하게 구현이 가능합니다.

    라이믹스를 참고하시면 추천을 햇을때 추천취소 버튼이 어덯게 만들어지는지 그 함수가 어떻게 작동하는지 확인해보세요..
  • profile profile
    디비에서 vote_log 테이블에서 로그인한 회원이 해당 글, 해당 회원이 있으면 차감하는 버튼을 출력하려고요.
  • profile

    controller에 함수를 추가하여 웹에서 호출하려면 module.xml에도 해당 함수명을 등록해야 합니다. 안 그러면 "잘못된 요청입니다."라고 나와요.

    procDocumentVoteCancel() 함수 내에서도 뭔가 문제가 있으면 자세히 구분하지 않고 무조건 "잘못된 요청입니다."를 반환하고 있으니, module.xml에 등록하지 않아서 오류가 나면 어디가 문제인지 파악하기가 쉽지 않습니다. 미리 알려드려요^^

  • profile profile
    /modules/document/conf/module.xml
    <action name="procDocumentVoteCancel" type="controller" />

    감사합니다;
  • ?
    그냥 라이믹스 쓰는게 속 편합니다 ㅎㅎ
  • profile
    1번까지는 성공!;

    {@
    $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-->
  • profile

    2번까지 했는데 이미 추천한 경우는 비추천도 안되는군요. 이게 어디에 있는지 ㅠ

    modules/document/document.controller.php (1151)

    // Update the voted count

    이 부분이군요

  • profile
    https://github.com/xpressengine/xe-core/issues/1865
    깃헙에도 관련 이슈가 있었네요..

    https://www.xpressengine.com/tip/22318021
    관련모듈도 있지만 취소기능은없네요

    https://www.xpressengine.com/tip/22318021
    팁을 찾았습니다;

서버에 요청 중입니다. 잠시만 기다려 주십시오...