Q&A

회원가입시 확장변수값으로 회원그룹 자동 분류

2020.03.30 10:22
577
0
CMS/프레임워크 Rhymix 1.9
개발 언어 PHP 7.0

좀 전에 질문 올렸다가 살짝 지웠는데요. (갑자기 성공한 줄 알고요ㅋㅋㅋ)

 

제목 그대로 회원가입 받을 때,

가입자가 선택한 확장변수(예. univ)의 변수값(예. NYU)과 일치하는

회원그룹으로 자동 분류(예. 'NYU' 그룹)하는 애드온입니다.

 

오토씽님의 회원가입시 그룹 선택 애드온이 있긴 합니다만, 제 사이트에선 뭔가 작동을 안 하는 것 같아 따로 좀 만들어봤어요 :)

 

<?php
if ( !defined('__XE__') ) exit();

if (
        $called_position !== 'after_module_proc'
        || ( Context::get('act') !== 'procMemberInsert' && Context::get('act') !== 'procSocialxeInputAddInfo' )
    )
    return;

$gid = $addon_info->extra_key;
if ( !$gid ) return;

$obj = Context::getRequestVars();

$oMemberModel = getModel('member');
$groups = $oMemberModel->getGroups();

$group_srl_list = array();
foreach ( $groups as $group )
{
    if ( $group->is_admin !== 'Y' && $group->title === $obj->$gid )
    {
        $group_srl_list[] = $group->group_srl;
    }
}
if ( empty($group_srl_list) ) return;

$member_srl = $oMemberModel->getMemberSrlByNickName($obj->nick_name);
debugPrint($member_srl);
$args = new stdClass;
$args->member_srl = $member_srl;

$oDB = &DB::getInstance();
$oDB->begin();

$output = executeQuery('member.deleteMemberGroupMember', $args);
if( !$output->toBool() )
{
    $oDB->rollback();
    return $output;
}

$oMemberController = getController('member');
foreach ( $group_srl_list as $group_srl )
{
    $oMemberController->addMemberToGroup($member_srl, $group_srl);
    if( !$output->toBool() )
    {
        $oDB->rollback();
        return $output;
    }
}
$oDB->commit();
$oMemberController->_clearMemberCache($member_srl, 0);
?>

 

그런데 이게 일반회원 가입 때는 잘 되는데,

소셜XE로 가입하면 member_srl을 받아오질 못하더라구요.

위에 하이라이트된 29행 디버깅 결과, 일반가입 때는 값이 찍히고 소셜XE 때는 값이 비어 있어요.

 

어째서 이런 차이가 생기는 걸까요 흐음..

윤삼 Lv. 19
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.

댓글 8

  • 2020.03.30 10:32 #1369712
    저 코드창은 어떻게 쓰는건가요?
  • 2020.03.30 10:39 #1369728
    애드온 파일입니다~
  • 2020.03.30 11:14 #1369753
    아, syntax highlighter 말씀이군요.
    제가 정신이 팔려서;;;
    에디터의 확장 컴포넌트에 있는 거예요.
  • 2020.03.30 11:17 #1369757
    그렇군요 감사합니다
  • 2020.03.30 10:32 #1369716
    소셜로그인을 통합 가입이..
    Context::get('act') !== 'procMemberInsert'  가 아니거든요
    procSocialxeInputAddInfo 도 아니고..

    그러니 애드온에서 처음부터 제외가 되어버릴거예요
    제 예상으로는 10번줄까지도 못 갈거 같은데..
  • 2020.03.30 10:38 #1369720
    같은 위치에서 $obj랑 $group_srl_list가 찍히는 건 확인했어요.

    일반가입 때 $obj에 member_srl이 없어서 getMemberSrlByNickName을 쓴 거였는데,
    소셜 로그인에서는 getMemberSrlByNickName가 안 먹는 것 같더라구요ㅜ
  • 2020.03.30 10:46 #1369732
    확장변수 입력 기준으로 해서 procSocialxeInputAddInfo 으로 한 건데,
    그러면 혹시 procSocialxeCallback으로 잡아야 할까요?
  • 2020.03.30 13:58 #1369781

    음, 위의 방법이 왜 안 되는지는 모르겠고, 대신 getNextSequence(); 로 $member_srl 을 잡을 수도 있었을 것 같긴 한데, 

    어쨌든 라이믹스에 있는 애드온에서의 트리거 호출 기능을 활용해서 문제를 해결했습니다.

     

    ㅎㅎ코드가 훨씬 더 간단해졌네요.

    람보님의 애드온을 참조했습니다.  https://xetown.com/tips/795194

     

    <?php
    if ( !defined('RX_BASEDIR') ) return;
    if ( $called_position !== 'before_module_proc' ) return;
    if ( !$addon_info->extra_key ) return;

    $oModuleController = getController('module');
    $oModuleController->addTriggerFunction('member.insertMember', 'before', function($args)
    {
        $oAddonModel = getAdminModel('addon');
        $addon_info = $oAddonModel->getAddonInfoXml('ap_group_select');
        $gid = $addon_info->extra_vars[0]->value;

        $obj = Context::getRequestVars();
        $oMemberModel = getModel('member');
        $groups = $oMemberModel->getGroups();

        $group_srl_list = array();
        foreach ( $groups as $group )
        {
            if ( $group->is_admin !== 'Y' && $group->title === $obj->$gid )
            {
                $group_srl_list[] = $group->group_srl;
            }
        }
        if ( empty($group_srl_list) ) return;

        $args->group_srl_list = $group_srl_list;
        return $args;
    });
    ?>