Extra Form
PHP PHP 7.0
CMS Rhymix

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

 

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

가입자가 선택한 확장변수(예. 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 때는 값이 비어 있어요.

 

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

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

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

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

    음, 위의 방법이 왜 안 되는지는 모르겠고, 대신 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;
    });
    ?>