웹마스터 팁
추천 취소 기능 만들기
2013.09.11 19:32
XE의 문서읽기 화면에서 추천을 하지 않았을 경우에는 추천버튼이 나타나게 하고,
추천을 한 경우에는 추천취소버튼이 나타나도록 해보겠습니다.
XE 스킨을 간단하게라도 다룰수 있어야 따라하실 수 있습니다.
XE의 기본 게시판 스킨인 default 를 기준으로 설명합니다.
1. 문서 내용 밑에 추천 버튼 만들기
먼저 게시판스킨의 _read.html파일을 엽니다. (default스킨 이라면 modules/board/skins/default/_read.html)
default스킨 기준으로 {$oDocument->getContent(false)}와 같이 본문내용을 출력해주는 부분을 찾습니다.
또는 각자 사용하고 있는 스킨에서 추천버튼을 자체적으로 출력한다면 추천버튼이 나오는 부분을 찾습니다.
sketchbook 스킨 을 예로 들면
<!--// Vote --> <div cond="$mi->votes!='N'" class="rd_vote"> <a class="bg_f_f9 bd_login" href="#" onclick="doCallModuleAction('document','procDocumentVoteUp','{$oDocument->document_srl}');return false"|cond="$is_logged" style="border:2px solid #{$mi->color};color:#{$mi->color};"> <b>♥ {$oDocument->get('voted_count')}</b> <p>{$lang->cmd_vote}</p> </a>
이 부분이 추천버튼 입니다.
이제 본문내용을 출력하는 부분(_read.html파일의 44번째줄) 밑에 추천/비추천 버튼을 아래와 같이 만듭니다.
</form> <!--@else--> {$oDocument->getContent(false)} <!--// 추천/추천취소 버튼 만들기 --> <!--@if($is_logged)--> {@ // document_voted_log 테이블에서서 현재 로그인한 사용자의 추천 로그 확인 $args->document_srl = $document_srl; $args->member_srl = $logged_info->member_srl; $args->point = 1; $output = executeQuery('document.getDocumentVotedLogInfoWithPoint',$args); } <!--@end--> <!--@if($output->data->count)--> <a href="javascript:void(0)" onclick="doCallModuleAction('document','procDocumentVoteUpRemove','{$document_srl}');return false;">추천취소</a> <!--@else--> <a href="javascript:void(0)" onclick="doCallModuleAction('document','procDocumentVoteUp','{$document_srl}');return false;">추천</a> <!--@end--> <!--@end--> </div> <!-- /READ BODY --> <!-- READ FOOTER -->
설명
$output = executeQuery('document.getDocumentVotedLogInfoWithPoint',$args); 는 document모듈의 getDocumentVotedLogInfoWithPoint라는 쿼리를 $args라는 인자와 함께 실행시켜주고 결과값을 $output 에 담는 코드입니다. (해당쿼리는 XE에있는 기본 쿼리가 아닌 사용저 정의 쿼리입니다.)
그리고 밑에 $output->data>count를 통해서 쿼리 결과값의 count라는 컬럼값을 불러옵니다.
count의 값이 1이면 현재 로그인한 사용자가 추천한 로그가 document_voted_log 테이블에 1개 있다는 뜻이고
즉 사용자가 추천한 기록이 있으므로 '추천취소' 버튼을 보여줍니다.
추천버튼을 눌렀을때 실행되는 자바스크립트함수 doCallModuleAction()는 xe.js에 정의 되어있는데 XE 모듈의 액션을 xml로 요청하는 역활을 합니다.
2. document 모듈의 쿼리 만들기
추천로그를 검색하는 쿼리와 추천로그를 삭제하는 쿼리 두개를 새로 만듭니다.
modules/document/queris/getDocumentVotedLogInfoWithPoint.xml 파일을 아래와 같이 만듭니다.
<query id="getDocumentVotedLogInfo" action="select"> <tables> <table name="document_voted_log" /> </tables> <columns> <column name="count(*)" alias="count" /> </columns> <conditions> <condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" /> <group pipe="and"> <condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" /> <condition operation="equal" column="ipaddress" var="ipaddress" pipe="and" /> <condition operation="equal" column="point" var="point" pipe="and" /> </group> </conditions> </query>
그리고
modules/document/queris/deleteDocumentVotedLogWithMemberSrl.xml 파일을 아래와 같이 만듭니다.
<query id="deleteDocumentVotedLogWithMemberSrl" action="delete"> <tables> <table name="document_voted_log" /> </tables> <conditions> <condition operation="in" column="document_srl" var="document_srl" filter="number" notnull="notnull" /> <condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" pipe="and" /> <condition operation="equal" column="point" var="point" filter="number" notnull="notnull" pipe="and" /> </conditions> </query>
3. document 모듈의 controller 함수 선언하기
추천취소 기능을 수행할 함수를 modules/document/document.controller.php 파일에 새로 선언합니다.(제일 밑에)
// 추천 취소하기 function procDocumentVoteUpRemove() { // 로그인 정보가 없으면 리턴 $member_srl = $_SESSION['member_srl']; if(!$member_srl) return new Object(0, 'No Logged User Information'); // args $args->document_srl = Context::get('target_srl'); // doCallModuleAction의 전달값 받기 // 추천 점수 삭감 $oDocumentModel = &getModel('document'); $oDocument = $oDocumentModel->getDocument($args->document_srl, false, false); // 현재 문서 가져오기 $args->voted_count = $oDocument->get('voted_count') - 1; $output = executeQuery('document.updateVotedCount', $args); if(!$output->toBool()) return new Object(0, 'Failed to update vote count'); // 추천 로그 삭제 $args->point = 1; // 삭제할 로그의 추천점수(추천 : 1, 비추천 : -1) $args->member_srl = $member_srl; // 삭제할 로그의 member_srl $output = executeQuery('document.deleteDocumentVotedLogWithMemberSrl', $args); if(!$output->toBool()) return new Object(0, 'Failed to remove log'); // 세션 삭제 $_SESSION['voted_document'][$args->document_srl] = false; return new Object(0, '추천을 취소하였습니다.'); }
그리고 위 함수를 doCallModuleAction()의 함수에서 사용하기 위해 document 모듈 정보에 등록합니다.
modules/document/conf/module.xml 파일을 열어서 27번째줄 아래에 다음과 같이 한 줄을 추가해 주세요.
<actions> <action name="dispDocumentPrint" type="view" standalone="true" /> <action name="dispDocumentPreview" type="view" standalone="true" /> <action name="dispDocumentManageDocument" type="view" standalone="true" /> <action name="dispTempSavedList" type="view" standalone="true" /> <action name="getDocumentCategories" type="model" standalone="true" /> <action name="getDocumentMenu" type="model" standalone="true" /> <action name="procDocumentVoteUp" type="controller" standalone="true" /> <action name="procDocumentVoteUpRemove" type="controller" standalone="true" /> <action name="procDocumentVoteDown" type="controller" standalone="true" /> <action name="procDocumentDeclare" type="controller" standalone="true" /> <action name="procDocumentAddCart" type="controller" standalone="true" /> <action name="procDocumentManageCheckedDocument" type="controller" standalone="true" /> <action name="procDocumentInsertModuleConfig" type="controller" standalone="true" />
4. 결과 화면
아래처럼 본문내용 밑에 추천/추천취소 버튼이 나타납니다.
추천 취소할 때
- [2017/08/11] 묻고답하기 글,댓글 추천 log에 member_srl이 있다가 없다가하네요. (버그일까요?) *1
- [2015/05/31] 묻고답하기 추천시에 '몇번째로 추천하였습니다.' 확인창 뜨게하는법. *4
- [2014/05/12] 묻고답하기 관리자에게만 추천 버튼 보이게 하는 방법은 무엇일까요? *3
- [2012/04/26] 묻고답하기 송동우님 한번 더 다시 봐주세요~ (추천인 포인트 관련) *2
- [2011/11/18] 웹마스터 팁 비회원도 추천가능하게 하기 (1.5기준설명) *3
댓글 5
-
Google + 나 페이스북 좋아요가 생각나는군요.
-
웃는기차
2014.06.29 23:27
작업의뢰를 해야 얻을 수 있는 수준의 정보를 공개해주셔서 정말 감사합니다. ^^
-
은둔초보
2015.02.22 12:02
저는 이 게시글을 추천합니다:) 바로 적용해볼게요. 감사합니다!
-
은둔초보
2015.02.22 13:08
자신의 글에 추천 버튼이 나오는 걸 방지하기 위해 다음과 같은 조건을 추가로 달았습니다.
(기존의 코드에서는 어차피 추천할 수 없다고 경고창이 나오긴 하지만.. 그걸 막으려고 ㅎㅎ)
<!--@if($output->data->count)-->
<!--로그인 및 이미 추천한 경우-->
...
<!--@else if($is_logged && $oDocument->get('member_srl') != $logged_info->member_srl ) -->
<!--로그인하여 추천이 가능한 경우이면서 내 글이 아닌 경우-->
....
<!--@else-->
<!--비로그인 사용자는 추천을 할 수 없음-->
....
<!--@end-->
제목 | 글쓴이 | 날짜 |
---|---|---|
XE 1.2.1에서 xe_default 게시판 스킨 사용시 IE에서 글입력폼이 안보일 때 [2] | 현의느낌 | 2009.04.28 |
XE 위키에 최근 접속 페이지 정보 출력
![]() | 개돌 | 2009.04.27 |
[질문]회원가입시 음력생일입력 가능 한가요? [1] | 신정 | 2009.04.27 |
초보 xe1.1.5에대한질문 [3] | 울프 | 2009.04.26 |
스프링노트 연동기를 써 보았습니다. | amyjang | 2009.04.23 |
플래시 랜덤하게 불러오기 [9] | 선비숨결 | 2009.04.21 |
BNU님의 Planner XE 1.2 버젼(일정관리)
[9]
![]() | 개돌 | 2009.04.21 |
다양한 언어로 홈페이지 서비스하기 - 무식한 방법 [4] | 멀리서 | 2009.04.21 |
포인트 부족하면 글 조회 안되게 하는 법 [6] | 뚱님*^^* | 2009.04.18 |
첨부파일 안올라갈 경우..
[5]
![]() | 양갱; | 2009.04.18 |
홈페이지 타이틀이 $user_lang->home ,freeboard등으로 나오는 문제 수정방법(자체해결) [1] | 정박사닷컴 | 2009.04.18 |
폰트가 작아져요
[2]
![]() | 황소111 | 2009.04.17 |
해당 Cafe 회원에 가입후 Cafe 회원목록에 나타나지 않음...... | 뉴욕에서 | 2009.04.16 |
페이지 및 게시판 메뉴 경로
[2]
![]() | 자반튀김 | 2009.04.15 |
제로보드4, xe 버전 바이러스에 대한 질문 [1] | 투자혁명 | 2009.04.15 |
게시판에서 확장 변수를 쓰는 경우 1.2.0 이상 버전으로 업그레이드하기 전에 패치하시기 바랍니다.
[5]
![]() | mooo | 2009.04.14 |
XpressEngine 1.2.1 r6096 트리거 목록 [2] [1] | mooo | 2009.04.13 |
[1.2.0] content 위젯 사용시 rss리더 새창에 뛰우기 [1] | 늘같이 | 2009.04.10 |
비밀글 댓글이 최신댓글 위젯에 노출되는 문제 수정방법 [1] | 얼터1 | 2009.04.10 |
주민등록 입력 폼 1.2.0
[55]
![]() | 개돌 | 2009.04.10 |
추천취소라니~! 신기하네요.