며칠 전에 토픽을 하나 남겼었는데요.

또 다시 도피성 코딩병이 도져서 키보드를 타닥타닥 거려봤습니다.

제가 전문가면 모듈이나 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);

 

이렇게 하고 (최신 메시지의 객체 정보까지 입혀서) 디버깅을 해보면 아래와 같이 예쁘게 정렬된 모습을 볼 수가 있네요.

스크린샷 2023-12-17 162052.png

 

요렇게 불가능하지만은 않다는 건 알게 됐습니다.

- 뭐가 효율적이고 뭐가 비효율적인지 모르는 선무당이어서 일단 우당탕탕해봤습니다.

- 댓글 리스트(comment_list)처럼 따로 db테이블을 만들고 그에 대응하는 xml 쿼리까지 짜서 리스트를 계층적으로 소팅해주는 게 더 멋진 것 같은데 그렇게 하면 진짜 제대로 일 벌리는 거 같아서 엄두가 안 나네요 흐흐

- (별다른 문제가 없다면 다음번에는 쪽지 리스트를 클릭할 때 해당 회원과 주고받은 쪽지 리스트를 출력해주는 팁과 구현 방법에 대해 코딩을 해보고 그에 대한 기록도 남겨보겠습니다.)

윤삼

profile
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
  • profile
    항상 응원합니다.
    메리 크리스마스 그리고 신정
  • profile profile
    네, 연말연시 건강하고 알차게 보내세요~~
  • profile
    수고 많으십니다 윤삼님
    게시판 메모 스킨을 저런 카톡 대화형식으로 정렬되게 만들면 단톡방 느낌으로 꾸밀수도 있겠다는 생각이 드네요
  • profile profile
    보통은 댓글단을 그렇게 꾸미죠?
    관련 이야기가 나온지 꽤 된 걸로 아는데 게시판 스킨 만드시는 분들이 좀 시도를 해보면 좋을 텐데요.
    근데 쪽지함을 카톡처럼 꾸미려면... 쪽지가 답글인 경우 원글(original message)까지 content에 포함돼 있어서 정규식으로 원글 부분만 제거하고 보여주든가 해야 할 것 같더라구요.
  • profile
    확실히 쪽지가 대화함처럼 된다면 나중에 개인간 쪽지가 필요한 메뉴들에서 엄청나게 유용하게 사용될것 같네요.
  • profile profile
    예쁜 스킨이 나오는 게 관건일 거 같아요.
    그리고 그게 가능하려면 스킨 작업이 원활할 수 있도록 php단에서 작업이 체계적이고 직관적으로 잘 되어야 하는데, 워낙 발코딩이어서ㅜㅜ
  • profile
    능력자십니다 역시
  • profile profile
    ㅎㅎ 그냥 흉내만 내는 수준입니다~
  • profile

    라이믹스 코어에서 윤삼님 코드 훔쳐가려고 눈에 불을 켜고 지켜보고 있습니다... ㅋㅋㅋ

  • profile profile

    부끄럽습니다. 1f633.png

    그치만 이 모든 것은 코어의 것이니, 코어의 것은 코어에게로! 완전 감사하고 영광이죠ㅡㅜ