XE에서는 스크랩수를 출력하는 변수를 기본적으로 제공하지 않고 있습니다.
기진곰님 曰, 스크랩 갯수를 집계하려면 documents 테이블에 필드를 하나 더 추가해야 하는데, 데이터가 많이 쌓여 있는 테이블에 필드를 추가하면 타임아웃이 발생할 수 있기 때문에 현재 documents, comments, files, member 등의 테이블 구조에는 모라토리엄(?)이 걸려 있는 상태입니다. 같은 이유로 #97 (신고 갯수 표시) 이슈도 현재로서는 처리가 불가합니다.
참조 : https://github.com/rhymix/rhymix/issues/880
1. 문서의 스크랩 횟수를 표시하고 싶으면 어떻게 해야할까요?
$args = new stdClass();
$args->document_srl = $oDocument->document_srl;
$output = executeQuery('member.getScrapDocument', $args);
echo $output->data->count . '번 스크랩되었습니다.';
https://xetown.com/rxe_tip/136572
https://code.google.com/p/xe-core/issues/detail?id=2120
각 글마다 스크랩한 수 추가하는 소스
1) xe_documents DB 에 항목 추가
scrapped_count - bigint(11) - default 0
2) modules/member/member.controller.php 에서
function procMemberScrapDocument() { 안에
$this->setError(-1); 위에다가 추가
// scrapped_count 증가 위해서 추가 (sejin7940)
$args->scrapped_count = $oDocument->get('scrapped_count');
$args->scrapped_count+=1;
$output = executeQuery('member.updateScrappedCount', $args);
3) modules/member/member.controller.php 에서
function procMemberDeleteScrap() { 안에서
return executeQuery('member.deleteScrapDocument', $args); 위에다가 추가
// scrapped_count 증가 위해서 추가 (sejin7940)
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl);
$args->scrapped_count = $oDocument->get('scrapped_count');
$args->scrapped_count = $args->scrapped_count - 1;
$output = executeQuery('member.updateScrappedCount', $args);
4) modules/member/queries/updateScrappedCount.xml 추가
<query id="updateScrappedCount" action="update">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="scrapped_count" var="scrapped_count" default="plus(1)" />
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
</conditions>
</query>
3. 글을 스크랩한 회원 목록을 추출할 수 있는 방법이 있을까요?
https://www.xpressengine.com/qna/20628488
{@
$oDB = &DB::getInstance();
$query = $oDB->_query('select * from xe_member_scrap where document_srl = '.$document_srl);
$result = $oDB->_fetch($query);
$oMemberModel =& getModel('member');
}
이렇게 쿼리 날리고
출력하는 곳에서는
<block cond="is_array($result)">
<!--@foreach($result as $key=>$val)-->
{@ $scrap_info = $oMemberModel->getMemberInfoByMemberSrl($val->member_srl)}
{$scrap_info->nick_name}
<!--@end-->
</block>
<block cond="!is_array($result)">
{@ $scrap_info = $oMemberModel->getMemberInfoByMemberSrl($result->member_srl)}
{$scrap_info->nick_name}
</block>
제가 찾아본 방법들은 이런 것들이 있었는데 이것들을 참조해서 만들어보았습니다.
만드는 방법은 위에서 살펴본 대로 2가지가 있습니다.
xml 쿼리문을 활용하는 것과 직접 sql 쿼리문을 코드에 삽입하는 방법.
이미 기존에 만들어져 있는 쿼리문을 활용하는 것은 원하는 값을 출력하는데 적절하지 않기 때문에 원하는 결과를 출력해주기 위해서는 새로운 쿼리문이 담긴 xml 파일을 생성해야 합니다.
혹은 sql 쿼리문을 명령어에 집어넣는 방식으로 작업 가능한데, 아직 저는 디비 관련해서는 초보이기 때문에 있는 쿼리문을 적절히 조합해서 새로운 xml 쿼리문을 생성해서 작업해보도록 하겠습니다.
마켓플레이스 모듈의 스크랩은 기존 XE의 문서 모듈의 스크랩과 다른 스크랩 테이블을 사용하고 있습니다.
xe_marketplace_wishlist 테이블에서 document_srl 이라는 필드값이 스크랩 수와 관련 있습니다.
document_srl 이 동일한 값을 모두 count 해서 출력해주면 마켓플레이스 모듈의 스크랩 횟수가 되는 겁니다.
새로운 xml 쿼리문을 작성해봅시다.
./modules/marketplace/queries/getWishlistItem.xml
<query id="getWishlistItem" action="select"> <tables> <table name="marketplace_wishlist" /> </tables> <columns> <column name="marketplace_wishlist.*" /> </columns> <conditions> <condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" pipe="and" /> <condition operation="equal" column="member_srl" var="member_srl" filter="number" notnull="notnull" pipe="and" /> </conditions> </query>
이 쿼리문은 기존에 있는 xml 파일인데 우리는 여기서 member_srl 값은 필요없으니, 저 condition 조건문을 빼버리고 새로운 xml 파일을 만들어봅시다.
./modules/marketplace/queries/getWishlistDocument.xml
<query id="getWishlistDocument" action="select"> <tables> <table name="marketplace_wishlist" /> </tables> <columns> <column name="marketplace_wishlist.*" /> </columns> <conditions> <condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" /> </conditions> </query>
원래 쿼리문에서는 member_srl 을 조건으로 뒀는데 해당 조건문을 빼버렸습니다.
그리고 실행문을 작성합니다.
{@ $args = new stdClass(); $args->document_srl = $oDocument->document_srl; $output = executeQuery('marketplace.getWishlistDocument', $args); echo count($output->data). '번 스크랩되었습니다.'; } <pre> {print_r($output)} </pre>
{print_r($output)} 부분은 확인용으로 넣어둔거니 실제 사용시에는 지워도 됩니다.
그럼 이렇게 완성!
보너스~ 또 다른 쿼리문.
<query id="getWishlistDocument" action="select"> <tables> <table name="marketplace_wishlist" /> </tables> <columns> <column name="count(document_srl)" alias="count" /> </columns> <conditions> <condition operation="equal" column="document_srl" var="document_srl" notnull="notnull" /> </conditions> </query>
이번에는 columns에서 document_srl 을 직접 count 하는 쿼리문입니다.
conditions는 동일합니다.
실행문은 다음과 같습니다.
{@ $args = new stdClass(); $args->document_srl = $oDocument->document_srl; $output = executeQuery('marketplace.getWishlistDocument', $args); echo $output->data->count. '번 스크랩되었습니다.'; }
화면 출력은 아래와 같습니다.
실행문에서 직접 쿼리문을 짜서 출력하는 것도 해보고 싶은데 이거 하느라 밤을 꼴딱 새버렸네요..