쪽지 리스트를 대화상대별로 출력 (1) - 대화상대 리스트 뽑아봅기
며칠 전에 토픽을 하나 남겼었는데요.
또 다시 도피성 코딩병이 도져서 키보드를 타닥타닥 거려봤습니다.
제가 전문가면 모듈이나 PR을 완성하고 짜잔~ 하고 공개를 하면 좋겠는데, 실력이나 경험이 별로 없다보니 가능한 수준에서 코드를 만들어보고 "검증과 조언을 얻고자" 단계별로 기록을 남겨볼까 합니다.
(테스트용이다보니 보안이나 오류 이슈가 다수 포함되어 있을 거예요.)
현재까지는 로그인한 회원을 기준으로 이 회원이 다른 회원들과 주고받은 회원별 최신 쪽지들을 중심으로 리스트를 구현해봤습니다.
1. 먼저 회원번호별(주로 로그인한 회원)로 쪽지 전체(받은 쪽지, 보낸 쪽지, 보관 쪽지)를 가져오는 쿼리입니다.
<tables>
<table name="member_message" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<group>
<group>
<condition operation="equal" column="receiver_srl" var="member_srl" notnull="notnull" />
<condition operation="in" column="message_type" default="R, T" />
</group>
<group pipe="or">
<condition operation="equal" column="sender_srl" var="member_srl" notnull="notnull" />
<condition operation="equal" column="message_type" default="S" />
</group>
</group>
<group>
<condition operation="search" column="title" var="s_title" />
<condition operation="search" column="content" var="s_content" />
<group>
<condition operation="search" column="title" var="s_title_content" />
<condition operation="search" column="content" var="s_title_content" pipe="or" />
</group>
</group>
</conditions>
</query>
2. 다음으로 해당 쿼리를 실행할 함수를 communication.model.php에 추가해봅니다. 이 함수를 통해 회원의 전체 쪽지를 가져올 수 있습니다.
/**
* get a message list by member_srl
* @param int $member_srl
* @param string $search_target
* @param string $search_keyword
* @return Object
*/
public static function getMessageListByMemberSrl($member_srl = null, $search_target = null, $search_keyword = null)
{
if(!$member_srl)
{
$logged_info = Context::get('logged_info');
$member_srl = $logged_info->member_srl;
}
// Search conditions
if ($search_target && $search_keyword)
{
$args->{'s_' . $search_target} = $search_keyword;
}
// Other variables
$args->member_srl = $member_srl;
// Get messages from DB
$output = executeQueryArray('communication.getMessagesByMemberSrl', $args);
return $output;
}
3. 그 다음, 위 리스트를 기반으로 대화상대별로 최신 쪽지의 정보가 들어 있는 별도의 리스트를 만들어줍니다(다소 무식함 주의).
* get a message list by last_message_srl
* @param int $member_srl
* @return Object
*/
public static function getMessageHeadList($member_srl = null, $search_target = null, $search_keyword = null)
{
if(!$member_srl)
{
$logged_info = Context::get('logged_info');
$member_srl = $logged_info->member_srl;
}
$output = self::getMessagesByMemberSrl($member_srl, $search_target, $search_keyword);
if (!$output->toBool())
{
return $output;
}
$message_list = array();
foreach ($output->data as $val)
{
$partner_srl = ($val->message_type === 'S') ? $val->receiver_srl: $val->sender_srl;
if (!isset($message_list[$partner_srl]))
{
$message_list[$partner_srl] = new stdClass();
$message_list[$partner_srl]->member_srl = $member_srl;
$message_list[$partner_srl]->partner_srl = $partner_srl;
$message_list[$partner_srl]->message_count = 0;
$message_list[$partner_srl]->unread_count = 0;
}
if (!isset($message_list[$partner_srl]->last_message_srl))
{
$message_list[$partner_srl]->last_message_srl = $val->message_srl;
$message_list[$partner_srl]->message_type = $val->message_type;
$message_list[$partner_srl]->regdate = $val->regdate;
}
else
{
if ($val->message_srl > $message_list[$partner_srl]->last_message_srl)
{
$message_list[$partner_srl]->last_message_srl = $val->message_srl;
$message_list[$partner_srl]->message_type = $val->message_type;
$message_list[$partner_srl]->regdate = $val->regdate;
}
}
if (!isset($message_list[$partner_srl]->first_message_srl))
{
$message_list[$partner_srl]->first_message_srl = $val->message_srl;
}
else
{
$message_list[$partner_srl]->first_message_srl = min($val->message_srl, $message_list[$partner_srl]->first_message_srl);
}
$message_list[$partner_srl]->message_count++;
if ($val->readed === 'N')
{
$message_list[$partner_srl]->unread_count++;
}
}
$last_message_srl_list = array_column($message_list, 'last_message_srl');
array_multisort($last_message_srl_list, SORT_DESC, $message_list);
return $message_list;
}
* 소결 : 이렇게 하면 대강 카톡의 채팅방 리스트 같은 게 구현 가능해집니다. communication.view.php 파일의 dispCommunicationMessages 함수 같은 곳에
$message_head_list = CommunicationModel::getMessageHeadList($logged_info->member_srl, $search_target, $search_keyword);
if (!empty($message_head_list))
{
foreach ($message_head_list as $key => $val)
{
$message_head_list[$key]->message = CommunicationModel::getSelectedMessage($val->last_message_srl);
}
}
debugPrint($message_head_list);
이렇게 하고 (최신 메시지의 객체 정보까지 입혀서) 디버깅을 해보면 아래와 같이 예쁘게 정렬된 모습을 볼 수가 있네요.
요렇게 불가능하지만은 않다는 건 알게 됐습니다.
- 뭐가 효율적이고 뭐가 비효율적인지 모르는 선무당이어서 일단 우당탕탕해봤습니다.
- 댓글 리스트(comment_list)처럼 따로 db테이블을 만들고 그에 대응하는 xml 쿼리까지 짜서 리스트를 계층적으로 소팅해주는 게 더 멋진 것 같은데 그렇게 하면 진짜 제대로 일 벌리는 거 같아서 엄두가 안 나네요 흐흐
- (별다른 문제가 없다면 다음번에는 쪽지 리스트를 클릭할 때 해당 회원과 주고받은 쪽지 리스트를 출력해주는 팁과 구현 방법에 대해 코딩을 해보고 그에 대한 기록도 남겨보겠습니다.)

댓글 10
메리 크리스마스 그리고 신정
게시판 메모 스킨을 저런 카톡 대화형식으로 정렬되게 만들면 단톡방 느낌으로 꾸밀수도 있겠다는 생각이 드네요
관련 이야기가 나온지 꽤 된 걸로 아는데 게시판 스킨 만드시는 분들이 좀 시도를 해보면 좋을 텐데요.
근데 쪽지함을 카톡처럼 꾸미려면... 쪽지가 답글인 경우 원글(original message)까지 content에 포함돼 있어서 정규식으로 원글 부분만 제거하고 보여주든가 해야 할 것 같더라구요.
그리고 그게 가능하려면 스킨 작업이 원활할 수 있도록 php단에서 작업이 체계적이고 직관적으로 잘 되어야 하는데, 워낙 발코딩이어서ㅜㅜ
라이믹스 코어에서 윤삼님 코드 훔쳐가려고 눈에 불을 켜고 지켜보고 있습니다... ㅋㅋㅋ
부끄럽습니다.
그치만 이 모든 것은 코어의 것이니, 코어의 것은 코어에게로! 완전 감사하고 영광이죠ㅡㅜ