[XE] 회원 가입 시, 사용자가 수정 불가능한 항목 설정하기

Standard

http://study.prl85.com/xe-관리자만-수정-가능한-회원-정보-항목-설정하기/
에서는 회원 정보 수정 시, 관리자만 수정 가능한 항목을 설정하는 방법을 다루고 있습니다.

이 글에서는 이를 응용하여 회원 가입 시 사용자가 수정 불가능한 항목을 설정하는 방법을 다루겠습니다.
(활용: 특정 서비스 인증키.
즉, 회원 가입/정보 수정 시 사용자가 임의로 수정할 수는 없지만, 관리자가 정한 값을 본인 회원 정보에서는 보여주고 싶은 경우)

회원 정보 수정 때만 아니라, 회원 가입시에도 동일한 함수가 항목들을 출력하는 부분을 처리합니다.

xe – modules – member – member.admin.view.php에서
function _getMemberInputTag($memberInfo, $isAdmin = false)

다만 회원 정보 수정 때와 회원 가입 때 $readonly를 처리하는 부분이 조금 다릅니다.
회원 정보 수정 시에는, 로그인된 정보에서 관리자인지를 가려내서 수정 가능/불가능 여부가 가려지지만, 회원 가입시는 로그인된 정보라는 것이 없기 때문이죠 (로그인되지 않은 상태에서만 회원 가입이 가능하기 때문).
역으로 이 점을 이용해서, 로그인된 정보가 없을 때 (=회원 가입) 원하는 항목을 수정 불가능하게 만들면 됩니다.

$readonly = '';

if (Context::get('logged_info') == null) // 회원 가입시
    $readonly = 'readonly="readonly"';

if (Context::get('logged_info')
    && Context::get('logged_info')->is_admin != 'Y') // 회원 정보 수정시 (관리자만 가능)
    $readonly = 'readonly="readonly"';

회원 가입시에만 혹은 회원 정보 수정시 (이 경우는 관리자만)에 수정이 불가능하게 하려면 해당 항목만 남겨두면 되겠지요.

나머지 사항은 위의 링크를 참고하시면 되겠습니다.

[XE] 회원 정보 수정 시, 관리자만 수정 가능한 항목 설정하기

Standard

xe – modules – member – member.admin.view.php에서
function _getMemberInputTag($memberInfo, $isAdmin = false)
이 함수가 회원정보 수정 시 항목들을 출력하는 부분을 처리하는 함수이다.

1. 기본 정보의 경우, 쭉 내려와서 if($formInfo->isDefaultForm) 아래에서 다음 부분을 찾는다.

1.1. 이메일, 홈페이지, 블로그 같이 이미 조건문에 명시적으로 나와있는 경우
여기선 예시로 이메일의 경우를 살펴본다. (1.8.2 기준 495 라인 쯤)

else if($formInfo->name == 'email_address')
{
    $formTag->type = 'email';
    $inputTag = '<input id="email_address" name="email_address" type="email" value="'.$memberInfo['email_address'].'" />';
}

else if($formInfo->name == 'email_address')
{
    $readonly = '';
    if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
        $readonly = 'readonly="readonly"';

    $formTag->type = 'email';
    $inputTag = '<input type="email" name="email_address" id="email_address" value="'.$memberInfo['email_address'].'"'.$readonly.' />';
}

수정한다.


1.2. 이름, 닉네임처럼 조건문에 나와있지 않은 경우
여기서는 예시로 이름의 경우를 살펴본다. (1.8.2 기준 510 라인 쯤)

else
{
    $formTag->type = 'text';
    $inputTag = sprintf('<input type="text" name="%s" id="%s" value="%s" />',
        $formInfo->name,
        $formInfo->name,
        $memberInfo[$formInfo->name]);
}

위에

else if ($formInfo->name == 'user_name')
{
    $readonly = '';
    if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
        $readonly = 'readonly="readonly"';

    $formTag->type = 'text';
    $inputTag = sprintf('<input type="text" name="%s" id="%s" value="%s" %s/>',
        $formInfo->name,
        $formInfo->name,
        $memberInfo[$formInfo->name],
        $readonly);
}

추가한다.

(즉, 아래와 같이 되면 된다)
Screen Shot 2015-06-16 at 3.06.29 PM

여러 항목을 추가할 때에는 추가한 항목들이 다 else 위에 있으면 된다
(else if 구문끼리의 순서는 관계 없음)


2. 확장 변수로 지정된 항목의 경우,
}//end isDefaultForm 아래에서 다음 부분을 찾는다.

$formTag->type = $extendForm->column_type;
if($extendForm->column_type == 'text')
{
    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" />';
}

수정할 확장 변수가 텍스트인 경우 if($extendForm->column_type == ‘text’)보다 먼저 조건 확인이 되어야 한다. (그래야, 다른 텍스트형 확장 변수와는 다르게 처리할 수 있으니까)

즉, 다음과 같이 내용을 추가한다 (ext_var는 원하는 확장변수의 변수명을 쓰면 된다)
(기존 if($extendForm->column_type == ‘text’) 구문이 else if로 변경된 것을 알 수 있다)

$formTag->type = $extendForm->column_type;
if($extendForm->column_name == 'ext_var')
{
    $readonly = '';
    if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
        $readonly = 'readonly="readonly"';

    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" '.$readonly.'/>';
}
else if($extendForm->column_type == 'text')
{
    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" />';
}

(여기서는 텍스트 형 변수 두 개를 처리했다.)
Screen Shot 2015-06-16 at 4.09.46 PM

팁)
– 관리자 여부와 상관없이 무조건 회원정보 수정에서 불가하게 하려면, 다음 두 줄을 없애거나 주석 처리하면 된다.

// $readonly = ”;
// if (Context::get(‘logged_info’) && Context::get(‘logged_info’)->is_admin != ‘Y’)

– 2번에서, text 형태인 것이 확실하다면 if …. else if 구조로 바꿀 필요 없이, text 조건문 안에 다음과 같이 변경해도 된다. (막상 이렇게 보니, 이게 더 효율적일 수도 있겠다 싶다.)

if($extendForm->column_type == 'text')
{
    $readonly = '';
    // 위의 그림처럼 여러 확장 변수를 처리할 경우를 대비해서, 의도적으로 if 문 분리
    if ($extendForm->column_name == 'ext_var')
    {
        if (Context::get('logged_info') && Context::get('logged_info')->is_admin != 'Y')
            $readonly = 'readonly="readonly"';
    }

    $template = '<input type="text" name="%column_name%" id="%column_name%" value="%value%" '.$readonly.'/>';
}

참고 링크)
http://www.xpressengine.com/qna/20457366