Extra Form
PHP PHP 7.2
CMS XpressEngine

<?php
    if(!defined('__XE__')) exit();
    if($this->act=='procMemberLeave')
    {
        $oMemberModel = getModel('member');
        $signoutMemberInfo = $oMemberModel->getMemberInfoByMemberSrl(질문1);
        $group = array('정회원','정회원+','우수회원','특별회원','관리그룹');
        foreach($group as $val)
        {
            if(in_array($val, $signoutMemberInfo->group_list))
            {
                $block_ok = true;
                break;
            }
        }
        질문2 : 금지닉네임에 넣는 코드 구현 
        $args->nick_name = $nick_name;
        $args->description = '';
        $qOut = executeQuery('member.insertDeniedNickName', $args);

 }

 

 

 

준회원은 활동 이력이 아예 없는 회원이라 금지 닉네임에 넣지 않고 있습니다. 

 

애드온으로 위와 같이 구현하고 싶은데요.

 

로그인 회원이 아닌 다른 관리자가 회원을 삭제하고 하는 경우가 많아서 실제 탈퇴(삭제) 되는 회원번호를 가져와서 처리하는 부분이 필요합니다.  모듈에서는 함수에 (obj) 가 있고 $obj->member_srl 이렇게 하던데 지금 애드온에서는..... (질문1)

 

그리고 여기서 구해진 회원의 닉네임을 시제 금지닉네임에 넣어주는 것이 필요한데 여기는 전혀 모르겠네요. (질문2)

 

(질문3)

지금 보니  procMemberLeave  act 자체가 잘못되었을 수도 있다고 의심이 되는데요. 이 act가 혹시 회원이 실제 탈퇴할때만 사용되는 act 인가요? 그럼 관리자가 삭제하던 다른 모듈에서 삭제하던 회원이 삭제되는 것 까지 모두 적용되는 act는 따로 있나요?

 

  • profile

    회원 삭제만 해도 procMemberLeave(탈퇴), procMemberAdminDelete(관리자 단일회원 삭제), procMemberAdminSelectedMemberManage(관리자 다중회원 삭제) 3개의 act를 사용하는데요, 각각 member_srl를 가져오는 방법이 다르기에 애드온으로 처리시 복잡해질 수밖에 없습니다. 또한 코어 이외 서드파티 모듈에서 deleteMember를 직접 호출하는경우 대응할수 없게 됩니다.

    결국 member.deleteMember before 트리거에서 작업하는것이 제일 편리한데요, 라이믹스는 addTriggerFunction 함수를 통해 애드온에서도 트리거 사용이 가능하지만 XE는 아직 불가능하므로 모듈로 작업하셔야 합니다.

     

    시간이 난다면 작업해 보겠습니다만 큰 기대는 하지 말아주세요(요즘 본업으로 매우 바빠서 다른걸 건드릴 시간이 있을지 모르겠네요)

  • profile profile
    저도 애드온으로는 뭔가 작업이 난해할 것이라는 생각이 기울고 있었어요. 최근 개발중인 회원가입부가모듈(초대장기능)에서 탈퇴관련 함수가 있어 거기에 이 것을 추가해 주면 어떨까 합니다. 이게 가장 간단하고 여러자료를 쓰지 않고도 해결이 되는 방법일 듯 합니다.
  • profile
    @람보 님 모듈 기능에 이것 넣어서 모듈의 사용성 UP! 해보시죠!
  • profile
    아 새로 만들고 있는 모듈에 기능을 넣기 전에 기존 사용중인 회원가입확장모듈(난달아님)에 기능을 넣어서 해볼수 있겠네요.


    /**
    * @brief 회원 DB 삭제 전 트리거
    **/
    function triggerDeleteMember(&$obj) {
    $member_srl = $obj->member_srl;

    // 회원정보
    $oMemberModel = &getModel('member');
    $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);

    // join_extend 테이블에서 회원정보 삭제
    $args->member_srl = $member_srl;
    $output = executeQuery('join_extend.deleteMemberInfo', $args);
    if (!$output->toBool()) return $output;

    // 관리자 통보
    // 회원확장 모듈에서 회원가입 중단시에도
    // deleteMember를 실행하지만 이때는 통보하지 않는다.
    if (Context::get('act') != 'procMemberInsert')
    $this->procNotifyAdmin('signout', $member_info);

    return new BaseObject();
    }


    여기에 끼워 넣기 하면 가능할까요??
  • profile

    function triggerDeleteMember(&$obj) {
                $member_srl = $obj->member_srl;

                // 회원정보
                $oMemberModel = &getModel('member');
                $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
                
                // join_extend 테이블에서 회원정보 삭제
                $args->member_srl = $member_srl;
                $output = executeQuery('join_extend.deleteMemberInfo', $args);
                if (!$output->toBool()) return $output;
                
                
                $group = array('정회원','정회원+','우수회원','특별회원','관리그룹');
                foreach($group as $val)
                {
                    if(in_array($val, $member_info->group_list))
                    {
                        $block_ok = true;
                        break;
                    }
                }
                
                if ($block_ok  == 'true'){
                $args->nick_name = $member_info->nick_name;
                $args->description = '';

               $output = executeQuery('member.insertDeniedNickName', $args);

               if (!$output->toBool()) return $output;
                }

                // 관리자 통보
                // 회원확장 모듈에서 회원가입 중단시에도
                // deleteMember를 실행하지만 이때는 통보하지 않는다.
                if (Context::get('act') != 'procMemberInsert')
                    $this->procNotifyAdmin('signout', $member_info);
                
                return new BaseObject();
            }

     

     

    붉은색 부분을 추가했는데 이렇게 하면 문제 없이 될지 궁금하네요.

    - 일단 기능적으로는 해당그룹 회원만 삭제 시 금지닉네임에 잘 들어가는 것 까지 확인했습니다.

     - 제가 넣은 코드가 엉뚱하거나 혹은 다른 문제가 생기는건지 검토가 되시면 알려주세요.

  • ?
    누군가가 괜찮은 닉네임을 보유하고 있다가 탈퇴해버리면, 영구적으로 사용할 수 없는 닉네임이라

    기간 뒤에 풀어주지 않는한..

    애매하긴 하겠군요..

    물론 사칭의 걱정을 줄 수 있어서 좋긴하겠지만
  • ? profile
    저는 흔적을 모두 없애주지 않는한 다른 누군가가 또 닉네임을 돌려서 쓰는 것 자체가 이해가 안가는 운영자라서요 ㅋ
    그런 걱정은 안해요. 저희 2500개가 금지되어있습니다 ㅋ
  • ? profile
    그리고 등록일이 함께 저장되어 운영자 입맛에 맞게 오래전에 금지된거는 풀어주는 정책을 쓰셔도 되구요. 영구적은 선택사항이죠.

    그리고 탈퇴후 재가입, 이전 닉사용 2가지를 금지해 놓으면 나름 울컥 탈퇴를 조금 완화 할 수 있어요.
  • profile ?
    사이트 특상 사이트마다 다를듯합니다
    게임 커뮤니티라면 게임상에서 쓰는 닉네임 예를들어 게임상에 보스급 네임드 닉네임으로 게임 아이디를 만들고 리니지 같은경우는 닉네임 거래하는 경우도 있어서

    기간 설정이 있다면 도입할 만 할 것 같아요
  • ? profile
    db에서 날짜로 정렬해서 지워주시면 됩니다.