최근 판매되기 시작한 타임라인 플러스 모듈에 관해 언급해 드린 적이 있습니다. 이 타임라인 플러스 모듈의 장점 중 하나인 조건을 OR 로 사용할 수 있다는 점인데요.
https://rxtip.kr/rx_story/3214
이건 인기글 선정시 조회 100번 된 게시글 혹은 추천 10개 받은 게시글 둘다 인기글로 뽑을 수 있는 OR 조건이 작동한다는 것 입니다.
그런데 메인 위젯에서 이러한 인기글,베스트글 중 최신글을 뽑으려 한다면 위젯에서 보통 이 OR, AND 조건을 지원하지 않기 때문에 아쉬운대로 조회수, 또는 추천수 높은 수 우선 정렬하는 방식으로 대체 했습니다.
그런데 오늘 위젯도 타임라인 플러스 모듈의 게시판에서 처럼 조회수,추천수 2가지 기준을 OR 또는 AND 로 작동하게 고쳐 보았습니다.
추천이 없는데도 올라온 글은 기준 조회수보다 높은 조회를 보였기 때문입니다. 저희는 OR를 선택
타임라인 모듈의 설정을 가져와서 그대로 타임라인 모듈의 쿼리를 사용하는 방식으로 하면 좋겠지만 위젯에서 쿼리를 별도로 추가하는 방식으로 간단히 추천,조회 항목만 적용한 간단한 팁입니다.
저희는 comely 위젯을 고쳤습니다. 다른 위젯도 같은 방식으로 고치시면 되니 따라서 고쳐보세요.
우선 위젯 코드를 작성할때 이 타임라인 처럼 적용할 건지에 관한 설정을 추가로 만들어 주어야 합니다.
위젯의 conf 폴더에 보면 info.xml 이 있습니다.
아래의 내용을 추가해 주세요.
<var id="timeline_select"> <type>select</type> <name xml:lang="ko">타임라인용 쿼리 선택</name> <description xml:lang="ko">타임라인 조건을 선택할 수 있습니다.</description> <options> <value>N</value> <name xml:lang="ko">사용 안함</name> </options> <options> <value>O</value> <name xml:lang="ko">OR</name> </options> <options> <value>A</value> <name xml:lang="ko">AND</name> </options> </var> <var id="s_readed_count" type="text"> <name xml:lang="ko">조회수 이상</name> <description xml:lang="ko">설정된 조회수 이상의 게시글을 불러옵니다.</description> </var> <var id="s_voted_count" type="text"> <name xml:lang="ko">추천수 이상</name> <description xml:lang="ko">설정된 추천수 이상의 게시글을 불러옵니다.</description> </var>
타임라인 이라는 용어는 타임라인 처럼 이라고 이해하면 더 쉽겠습니다.
기본 사용 안함이고 사용하고 싶은 OR, AND 조건을 선택하게 되어 있습니다. 기존에 삽입된 위젯코드에는 이 항목을 추가해줘야 동작하겠죠?
그리고 위젯의 php 에서 쿼리 부분을 저 선택에 맞춰 쿼리를 다르게 하면 되는데요. 이를 위해 OR용 쿼리파일과 AND의 쿼리파일을 새롭게 만들어 쿼리(queries) 폴더에 업로드 합니다.
<query id="getNewestDocumentsOr" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" notnull="notnull" pipe="and" />
<condition operation="more" column="regdate" var="regdate" pipe="and" />
<condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" />
<condition operation="in" column="status" var="statusList" pipe="and" />
<condition operation="equal" column="documents.is_notice" var="is_notice" pipe="and" default="N" filter="alpha" />
<group pipe="and">
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
</group>
</conditions>
<navigation>
<index var="sort_index" default="documents.list_order" order="order_type" />
<list_count var="list_count" default="20" />
</navigation>
</query>
파란색은 위치가 변경된 것이고 붉은색은 추가가 된 것입니다. 물론 사용하는 위젯에 따라 쿼리의 내용이 약간 다를 수 있으니 이점은 참고해서..
위 파일을 getNewestDocumentsOr.xml 파일로 저장한 다음 위젯의 쿼리(queries)폴더에 업로드 합니다. (따로 첨부해 드리겠습니다.)
<query id="getNewestDocumentsAnd" action="select">
<tables>
<table name="documents" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="in" column="documents.module_srl" var="module_srl" filter="number" notnull="notnull" pipe="and" />
<condition operation="more" column="regdate" var="regdate" pipe="and" />
<condition operation="equal" column="documents.category_srl" var="category_srl" pipe="and" />
<condition operation="in" column="status" var="statusList" pipe="and" />
<condition operation="equal" column="documents.is_notice" var="is_notice" pipe="and" default="N" filter="alpha" />
<group pipe="and">
<condition operation="more" column="readed_count" var="s_readed_count" pipe="and" />
<condition operation="more" column="voted_count" var="s_voted_count" pipe="and" />
</group>
</conditions>
<navigation>
<index var="sort_index" default="documents.list_order" order="order_type" />
<list_count var="list_count" default="20" />
</navigation>
</query>
이 파일은 getNewestDocumentsAnd.xml 파일로 저장해서 쿼리 폴더에 업로드 합니다.
이제 위젯의 php 파일에 쿼리부분을 수정해 줍니다.
if($args->timeline_select == 'O')
{
$obj->s_readed_count = $args->s_readed_count;
$obj->s_voted_count = $args->s_voted_count;
$output = executeQueryArray('widgets.comely_widget.getNewestDocumentsOr', $obj);
}
else if($args->timeline_select == 'A')
{
$obj->s_readed_count = $args->s_readed_count;
$obj->s_voted_count = $args->s_voted_count;
$output = executeQueryArray('widgets.comely_widget.getNewestDocumentsAnd', $obj);
}
else
{
$output = executeQueryArray('widgets.comely_widget.getNewestDocuments', $obj); // 원래 쿼리
}
원래 쿼리 를 위와 같이 조건을 걸어 원하는 옵션에 맞게 쿼리를 할수 있도록 코드를 바꿔 줍니다. 원래 쿼리 외 부분이 전부 추가된 부분입니다.
여기도 마찬가지로 다른 위젯이라면 쿼리 경로와 변수를 적절히 바꿔주세요.
('widgets.comely_widget.getNewestDocuments', $obj)
comely_widget. -> 위젯폴더명
widget.getNewestDocuments' -> 쿼리파일명
$obj -> 다른 변수로 사용되었을 수 있습니다.
이렇게 바꾸고 나면 이제 원하는 추천 조회 OR 또는 AND 조건에 맞는 게시글을 뽑아서 보여 줄 수 있습니다.
기존 코드에는 새로 생긴 변수가 없을때니 적용하고 싶으면 추가해 주면 됩니다. 아니면 위젯 코드를 새로 생성해서 새로운 부분만 골라서 넣으면 되구요.
이렇게 OR 50 10 으로 넣으면 위젯코드에는
timeline_select="O" s_readed_count="50" s_voted_count="10"
요런부분이 추가되어 코드가 만들어지게 되는 겁니다.
그럼 잘 따라하셔서 성공하시길 기원합니다!
ps. timline_select <-- 오타이나 동작에는 크게 상관 없습니다. 일괄적으로 오타가 나있으니... 거슬리는 분은 바꾸세요 ㅋ timeline_select
바꾸면 위젯코드 새로 생성해서 변수 바뀐거로 적용하셔야 합니다. (이 글에서 오타는 16시 51분에 모두 수정했습니다.)
* karius님께서 제보해주셔서 확인되었습니다. 쿼리 파일 getNewestDocumentsOr.xml 의 코드가 잘못되어 있어 수정한 파일로 교체 해서 업로드 했습니다. 이전에 받으셨다면 교체해야 합니다. (2021.1.11 14:20)
후.. 어렵네요...
저같은경우 기본 content 위젯에 snax slow 스킨을 사용중인데 가능할까요??