묻고답하기
쪽지함에서 안읽은 쪽지 리스트를 뿌려주게 하려면 어떡해 해야 할까요?
2016.02.09 01:52
쪽지함에서 "받은쪽지함", "보낸쪽지함", "쪽지보관함" 이렇게 표시하는것은
message_type이 R,T,S 이렇게 3가지 구분만
1. /index.php?act=dispCommunicationMessages&mid=mypage&message_type=R
2. /index.php?act=dispCommunicationMessages&mid=mypage&message_type=T
3. /index.php?act=dispCommunicationMessages&mid=mypage&message_type=S
위와 같이 해주면 됩니다.
그런데 저는 읽지 않은 쪽지를 표시해주고 싶어서
/index.php?act=dispCommunicationMessages&mid=mypage&message_type=R&readed=N
위와 같이 끝에 readed=N 을 입력해주었지만 출력이 되지 않습니다.
communication/communication.view.php 파일에 Context::set('message_list', $output->data); 이부분하고 뭔가 관련이 있어 보이는데..
또한 skins/default/messages.html 파일에서
<tr loop="$message_list => $no,$val"> 이부분에서 $message_list 가 바로 위에랑 연관이 분명 있는데
communication/communication.view.php 이부분에서 따로 어떻게 설정을 해줘야 하는지 잘 모르겠네요...ㅠ.ㅠ
이거 아시는분 있으시면 꼭좀 답변 부탁드립니다.
2시간넘게 삽질 해봤지만 삽질의 한계를 느꼇네요 ㅠ.ㅠ 안읽은 쪽지 갯수 확인하는것은 쉬웠는데 안읽은 메세지 출력하는것은 꽤 어려운 문제인것 같습니다.
댓글 6
-
마이웹
2016.02.09 17:10
-
졸라맨
2016.02.09 18:16
음 그게 아니라, xe 는 php에서 xe자체 문법을 사용하고 있으며,
쿼리도 xe의 내부xml방식으로 쿼리를 날리고 있습니다.
그리고 db에는 readed 라는 필드가 있구요.
별도로 php안에서 mysql질의문으로 select문으로 불러와서 리스트를 뿌려줄순 있겟찌만
그러면 이게 받은쪽지함, 보낸쪽지함, 쪽지보관함과 같이 심플하게 연동해서 쓸수가 없게 됩니다.
비효율적이라는것이죠.
받은쪽지함, 보낸쪽지함, 쪽지보관함은 message_type 으로 통일되기 떄문에 R이나 S나 T로 수정하면 될일이지만
readed는 어떻게 되는지 모르겠습니다.
-
마이웹
2016.02.09 18:30
현재 제가 알기로는 XE 코어에서 getNotReceivedMessage.xml 쿼리가 없기 때문에
그것을 직접 만들어서 적용하는 방식으로 가시거나 해야되는 문제라는 것이죠.
1. 코어에서 직접 수정하거나
2. addon이나 module trigger를 사용해야 될것 같습니다.
아무튼 근본 문제는 DB에서 readed 필드에서 != 'Y'를 불러오는 DB 쿼리를 실행하는 단위가 필요하다는 것이죠.
그것이 무엇이 되었던 말이죠.
-
졸라맨
2016.02.09 19:08
제가 질문한 거에 대해서 방식을 이해를 잘 못한것 같네요.
skins/default/messages.html 이파일에서 보낸쪽지함, 받은쪽지함, 쪽지보관함에 대한 리스트를 표시해주고 있구요.
communication/communication.view.php 이 파일에서 위에 리스트를 뿌려주는 프로그래밍이 일괄적으로 들어있습니다.
이 안에서 readed 에 관련된 항목을 어떻게 넣어서 xml 쿼리하고 연동하느냐가 관건인 문제입니다.
질문의 요지를 정확히 이해하시고 답변 달아 주시는것이 좋을듯 합니다.
-
마이웹
2016.02.09 20:14
아~ 죄송합니다.
queries 디렉토리에 getNotReadedMessages.xml 파일로 해서 아래의 내용으로 업로드하신후
<query id="getNotReadedMessages" action="select">
<tables>
<table name="member_message" alias="message" />
<table name="member" alias="member" />
</tables>
<columns>
<column name="message.*" />
<column name="member.user_id" />
<column name="member.member_srl" />
<column name="member.nick_name" />
<column name="member.user_name" />
</columns>
<conditions>
<condition operation="equal" column="message.receiver_srl" var="member_srl" notnull="notnull" />
<condition operation="equal" column="message.message_type" var="message_type" default="R" pipe="and" />
<condition operation="notequal" column="message.readed" var="readed" default="Y" notnull="notnull" pipe="and" />
<condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
</conditions>
<navigation>
<index var="sort_index" default="message.list_order" order="asc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>
communication.view.php에 아래의 멤버함수를 정의 합니다.
function dispCommunicationNotReadedMessages()
{
// Error appears if not logged-in
if(!Context::get('is_logged'))
{
return $this->stop('msg_not_logged');
}$logged_info = Context::get('logged_info');
/*if(!array_key_exists('dispCommunicationNotReadedMessages', $logged_info->menu_list))
{
return $this->stop('msg_invalid_request');
}*/// Set the variables
$message_srl = Context::get('message_srl');
$message_type = Context::get('message_type');$message_type = 'R';
Context::set('message_type', $message_type);
$oCommunicationModel = getModel('communication');// extract contents if message_srl exists
if($message_srl)
{
$columnList = array('message_srl', 'sender_srl', 'receiver_srl', 'message_type', 'title', 'content', 'readed', 'regdate');
$message = $oCommunicationModel->getSelectedMessage($message_srl, $columnList);if($message->receiver_srl != $logged_info->member_srl)
{
return $this->stop('msg_invalid_request');
}
if($message->message_srl == $message_srl && ($message->receiver_srl == $logged_info->member_srl || $message->sender_srl == $logged_info->member_srl))
{
stripEmbedTagForAdmin($message->content, $message->sender_srl);
Context::set('message', $message);
}
}// Extract a list
$columnList = array('message_srl', 'readed', 'title', 'member.member_srl', 'member.nick_name', 'message.regdate', 'readed_date');
$output = $oCommunicationModel->getNotReadedMessages($message_type, $columnList);// set a template file
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('message_list', $output->data);
Context::set('page_navigation', $output->page_navigation);$oSecurity = new Security();
$oSecurity->encodeHTML('message_list..nick_name');$this->setTemplateFile('messages');
}
그리고 communication.model.php에 아래의 멤버함수를 정의합니다.
function getNotReadedMessages($columnList = array())
{
$logged_info = Context::get('logged_info');
$args = new stdClass();$args->member_srl = $logged_info->member_srl;
$args->message_type = 'R';
// Other variables
$args->sort_index = 'message.list_order';
$args->page = Context::get('page');
$args->list_count = 20;
$args->page_count = 10;
return executeQuery('communication.getNotReadedMessages', $args, $columnList);
}
그리고 mesage.html 스킨에서 적절히 호출하면 되지 않을까 생각합니다.
-
졸라맨
2016.02.10 00:20
다른 xe고수분에게 의뢰해서 해결했으니, 다른분들 참고 하시면 될것 같습니다.
단순히 안읽은 쪽지 갯수 구하는게 아닌, 안읽은 쪽지 내용들을 출력하기 위해서는 아래내용을 변경해야 합니다.
1. modules/communiction/communition.view.php
69라인쯤에 $readed = Context::get('readed'); 항목 추가
118라인쯤에 $output = $oCommunicationModel->getMessages($message_type, $columnList, $readed); 로 변경
2. modules/communiction/communition.model.php
237라인쯤에 function getMessages($message_type = "R", $columnList = array(), $readed = null) 로 변경
247 라인쯤에 $args->readed = $readed; 추가
3. modules/communition/queries/getReceivedMessages.xml
17라인쯤에 <condition operation="equal" column="message.readed" var="readed" pipe="and" /> 추가
4. 주소창에 index.php?act=dispCommunicationMessages&mid=mypage&message_type=R&readed=N
위와 같이 입력하면 안읽은 메세지가 출력됩니다.
유료로 알아낸 꿀팁 알려드립니다.
이건 DB와 관련된 부분인데 php에서 해결하려고 해서 문제가 안풀리신듯 합니다.
XE 코어에서 읽지않은 메세지에 대한 DB처리가 없던지 있는데도 못찾으셨는지 모르겠지만
질문하신대로 mysql에 readed == 'N' 라는 조건문에 해당하는 쿼리를 실행해서 불러오면 될것 같습니다.