며칠 전에 토픽을 하나 남겼었는데요.
또 다시 도피성 코딩병이 도져서 키보드를 타닥타닥 거려봤습니다.
제가 전문가면 모듈이나 PR을 완성하고 짜잔~ 하고 공개를 하면 좋겠는데, 실력이나 경험이 별로 없다보니 가능한 수준에서 코드를 만들어보고 "검증과 조언을 얻고자" 단계별로 기록을 남겨볼까 합니다.
(테스트용이다보니 보안이나 오류 이슈가 다수 포함되어 있을 거예요.)
현재까지는 로그인한 회원을 기준으로 이 회원이 다른 회원들과 주고받은 회원별 최신 쪽지들을 중심으로 리스트를 구현해봤습니다.
1. 먼저 회원번호별(주로 로그인한 회원)로 쪽지 전체(받은 쪽지, 보낸 쪽지, 보관 쪽지)를 가져오는 쿼리입니다.
<query id="getMessagesByMemberSrl" action="select"> <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; } $args = new stdClass(); // 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 함수 같은 곳에
// TEST $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 쿼리까지 짜서 리스트를 계층적으로 소팅해주는 게 더 멋진 것 같은데 그렇게 하면 진짜 제대로 일 벌리는 거 같아서 엄두가 안 나네요 흐흐
- (별다른 문제가 없다면 다음번에는 쪽지 리스트를 클릭할 때 해당 회원과 주고받은 쪽지 리스트를 출력해주는 팁과 구현 방법에 대해 코딩을 해보고 그에 대한 기록도 남겨보겠습니다.)
메리 크리스마스 그리고 신정