웹마스터 팁

에고.. 왠지 버젼이 바뀔때 마다 기존에 적은걸 다시 적는 기분이 드네요 ㅡㅡ;;
기존에 올렸던 주민등록 입력 폼에 많은 분들이 문의 해주신 내용들과 불편했던 내용들을 한꺼번에 다시 한번 정리 했습니다.
1.2.0 버젼 기준으로 좀더 세세하게 다시 수정 하였습니다.

첨부 파일은 1.2.0 full 새로 다운 받아서 아래 내용만 수정 하였습니다.
아래 내용 작성 끝나면 다시 삭제될 자료 ;;;


1. DB Tool
개인 서버 사용자 -
http://www.navicat.com/download.html -  non-commercial(Free) - lite version  으로 다운 받으시면 됩니다.
비 상업사이트에 한해 무료 제공인듯 합니다.
해당 sql서버에 직접 접속이 가능하다면 프로그램은 개인 로컬PC에 설치하고 원격으로 서버에 접속도 가능합니다.

호스팅 업체 사용자 -
http://www.phpmyadmin.net/home_page/downloads.php
설치 후 웹페이지를 통해 접속하는 프로그램입니다.

아래 설명은 navicat 기준으로 설명합니다.


1. DBTool 을 사용하여 xe_member 테이블의 디자인 보기를 선택합니다.

jumin1.JPG 

2. insert field 를 (필드 삽입)을 선택하여  jumin - char(13) 으로 필드를 생성 합니다.
 jumin2.JPG 
 
3.  /xe/modules/member/skins/default/filter/signup.xml
<filter name="signup" module="member" act="procMemberInsert" extend_filter="member.getJoinFormList" confirm_msg_code="confirm_submit">
    <form>
        <node target="user_id" required="true" minlength="2" maxlength="80" filter="userid" />
        <node target="password1" required="true" minlength="6" maxlength="20" />
        <node target="password2" required="true" minlength="6" maxlength="20" equalto="password1" />
        <node target="user_name" required="true" minlength="2" maxlength="40" />
        <node target="nick_name" required="true" minlength="2" maxlength="40" />
        <node target="email_address" required="true" minlength="1" maxlength="200" filter="email"/>
  <node target="jumin" required="true" minlength="13" maxlength="13" filter="jumin"/>
    </form>
    <parameter>
        <param name="accept_agreement" target="accept_agreement" />
        <param name="member_srl" target="member_srl" />
        <param name="user_id" target="user_id" />
        <param name="password" target="password1" />
        <param name="user_name" target="user_name" />
        <param name="nick_name" target="nick_name" />
  <param name="jumin" target="jumin" />
        <param name="homepage" target="homepage" />
        <param name="blog" target="blog" />
        <param name="birthday" target="birthday" />
        <param name="allow_mailing" target="allow_mailing" />
        <param name="email_address" target="email_address" />
    </parameter>
    <response callback_func="completeInsert">
        <tag name="error" />
        <tag name="message" />
        <tag name="redirect_url" />
    </response>
</filter>


4. /xe/modules/member/queries/insertMember.xml
<query id="insertMember" action="insert">
    <tables>
        <table name="member" />
    </tables>
    <columns>
        <column name="member_srl" var="member_srl" filter="number" notnull="notnull" />
        <column name="user_id" var="user_id" filter="userid" notnull="notnull" />
        <column name="email_address" var="email_address" filter="email" notnull="notnull" />
        <column name="password" var="password" notnull="notnull" />
        <column name="email_id" var="email_id" notnull="notnull" />
        <column name="email_host" var="email_host" notnull="notnull" />
        <column name="user_name" var="user_name" notnull="notnull" minlength="1" maxlength="40" />
        <column name="nick_name" var="nick_name" notnull="notnull" minlength="1" maxlength="40" />
        <column name="homepage" var="homepage" />
  <column name="jumin" var="jumin" />
        <column name="blog" var="blog" />
        <column name="birthday" var="birthday" />
        <column name="allow_mailing" var="allow_mailing" default="Y" />
        <column name="allow_message" var="allow_message" default="Y" />
        <column name="denied" var="denied" default="N" />
        <column name="limit_date" var="limit_date" />
        <column name="regdate" var="regdate" default="curdate()" />
        <column name="last_login" var="last_login" default="curdate()" />
        <column name="is_admin" var="is_admin" default="N" />
        <column name="description" var="description" />
        <column name="extra_vars" var="extra_vars" />
    </columns>
</query>

5. /xe/modules/member/queries/getMemberSrl.xml
<query id="getMemberSrl" action="select">
    <tables>
        <table name="member" />
    </tables>
    <columns>
        <column name="member_srl" />
    </columns>
    <conditions>
        <condition operation="equal" column="user_id" var="user_id" pipe="and" />
        <condition operation="equal" column="email_address" var="email_address" pipe="and" />
        <condition operation="equal" column="nick_name" var="nick_name" pipe="and" />
  <condition operation="equal" column="jumin" var="jumin" pipe="and" />
    </conditions>
</query>

6.xe/modules/member/tpl/js/signup_check.js 
- line 17
function memberSetEvent() {
    var fo_obj = xGetElementById('fo_insert_member');
    for(var node_name in fo_obj) {
        var obj = fo_obj[node_name];
        if(!obj || typeof(obj.nodeName)=="undefined" || obj.nodeName != "INPUT") continue;
        if(node_name != "user_id" && node_name != "nick_name" && node_name != "email_address" && node_name!="jumin") continue;

        xAddEventListener(obj, 'blur', memberCheckValue);
    }
}

7. /xe/modules/member/lang/ko.lang.php
-line 80
$lang->search_target_list = array(
        'user_id' => '아이디',
        'user_name' => '이름',
        'nick_name' => '닉네임',
        'email_address' => '메일주소',
  'jumin' => 주민등록번호,
        'regdate' => '가입일시',
        'regdate_more' => '가입일시(이상)',
        'regdate_less' => '가입일시(이하)',
        'last_login' => '최근로그인일시',
        'last_login_more' => '최근로그인일시(이상)',
        'last_login_less' => '최근로그인일시(이하)',
        'extra_vars' => '확장변수',
    );
// 관리자 페이지에서 주민등록번호로 검사 필드 추가

 - line 142 ~ 143  /   line 165
$lang->msg_exists_jumin = '이미 존재하는 주민등록번호입니다. 계정도용이 의심 될 경우 관리자에게 연락 주세요.';
$lang->msg_false_jumin_no = '잘못된 주민등록번호 형식입니다.';
$lang->about_jumin = '- 를 제외한 숫자 13자리를 입력해 주세요.';


8. /xe/common/lang/ko.lang.php
 - line 89
$lang->jumin = '주민등록번호';

 - line 299
$lang->filter->invalid_jumin = '잘못된 %s 형식입니다.';

9. /xe/modules/member/skins/default/signup_form.html
- line 67
<tr>
  <th><div>{$lang->jumin}</div></th>
  <td>
   <input type="password" name="jumin" id="jumin" value="" maxlength="13" class="inputTypeText"/> <input type="checkbox" name="foreigner" value="1" /> 외국인 (*외국인인 경우 체크 하세요)
   <p>{$lang->about_jumin}</p>
  </td>
 </tr>


10. /xe/modules/member/member.controller.php
 - line 501 ~ 514
/**
         * @brief 회원 가입시 특정 항목들에 대한 값 체크
         **/
        function procMemberCheckValue() {
            $name = Context::get('name');
            $value = Context::get('value');
            if(!$value) return;

            $oMemberModel = &getModel('member');

            // 로그인 여부 체크
            $logged_info = Context::get('logged_info');


            switch($name) {
                case 'user_id' :
                        // 금지 아이디 검사
                        if($oMemberModel->isDeniedID($value)) return new Object(0,'denied_user_id');

                        // 중복 검사
                        $member_srl = $oMemberModel->getMemberSrlByUserID($value);
                        if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_user_id');
                    break;
                case 'nick_name' :
                        // 중복 검사
                        $member_srl = $oMemberModel->getMemberSrlByNickName($value);
                        if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_nick_name');
                       
                    break;
                case 'email_address' :
                        // 중복 검사
                        $member_srl = $oMemberModel->getMemberSrlByEmailAddress($value);
                        if($member_srl && $logged_info->member_srl != $member_srl ) return new Object(0,'msg_exists_email_address');
                    break;
    case 'jumin' :    // 주민등록 번호 검사
      // 형식 검사
      if($oMemberModel->isTrueNumber($value)==false) return new Object(0,'msg_false_jumin_no');
      //중복 검사
      $member_srl = $oMemberModel->getMemberSrlByJumin($value);
      if($member_srl && $logged_info->member_srl != $member_srl) return new Object(0,'msg_exists_jumin');
     break;
    case 'jumin2' :   // 외국인 번호 검사.
      // 형식 검사
      if($oMemberModel->isTrueNumber2($value)==false) return new Object(0,'msg_false_jumin_no');
      //중복 검사
      $member_srl = $oMemberModel->getMemberSrlByJumin($value);
      if($member_srl && $logged_info->member_srl != $member_srl) return new Object(0,'msg_exists_jumin');
     break;

            }
        }
// 외국인가입이 필요없는 경우는  case  'jumin2' : 아래는 삭제 하셔도 됩니다.

 - line 532
/**
         * @brief 회원 가입
         **/
        function procMemberInsert() {
            $oModuleModel = &getModel('module');
            $config = $oModuleModel->getModuleConfig('member'+ '+ ');

            // 관리자가 회원가입을 허락하였는지 검사
            if($config->enable_join != 'Y'+ ') return $this->stop('msg_signup_disabled');

            // 약관에 동의하였는지 검사 (약관이 있을 경우만)
            if($config->agreement && Context::get('+ 'accept_agreement')!='Y') return $this->stop('msg_accept_agreement');

            // 필수 정보들을 미리 추출
            $args = Context::gets('user_id','user_name','nick_name','jumin','homepage','blog','birthday','email_address','password','allow_mailing');
            $args->member_srl = getNextSequence();

            // 넘어온 모든 변수중에서 몇가지 불필요한 것들 삭제
            $all_args = Context::getRequestVars();
            unset($all_args->module);
            unset($all_args->act);
            unset($all_args->is_admin);
            unset($all_args->description);
            unset($all_args->group_srl_list);
            unset($all_args->body);
            unset($all_args->accept_agreement);
            unset($all_args->signature);

            // 메일 인증 기능 사용시 회원 상태를 denied로 설정
            if ($config->enable_confirm == 'Y') $args->denied = 'Y';

            // 모든 request argument에서 필수 정보만 제외 한 후 추가 데이터로 입력
            $extra_vars = delObjectVars($all_args, $args);
            $args->extra_vars = serialize($extra_vars);

            // member_srl의 값에 따라 insert/update
            $output = $this->insertMember($args);
            if(!$output->toBool()) return $output;

            // 로그인 시킴
            if ($config->enable_confirm != 'Y') $this->doLogin($args->user_id);

            $this->add('+ 'member_srl', $args->member_srl);
            if($config->redirect_url) $this->add('+ 'redirect_url', $config->redirect_url);
            if ($config->enable_confirm == 'Y') {
                $msg = sprintf(Context::getLang('msg_confirm_mail_sent'), $args->email_address);
                $this->setMessage($msg);
            }
            else $this->setMessage('success_registed');
        }

 - line 1444
/**
         * @brief member 테이블에 사용자 추가
         **/
        function insertMember(&$args, $password_is_hashed = false) {
            // trigger 호출 (before)
            $output = ModuleHandler::triggerCall('member.insertMember', 'before', $args);
            if(!$output->toBool()) return $output;

            // 멤버 설정 정보에서 가입약관 부분을 재확인
            $oModuleModel = &getModel('module');
            $config = $oModuleModel->getModuleConfig('member');

            $logged_info = Context::get('logged_info');

            // 임시 제한 일자가 있을 경우 제한 일자에 내용 추가
            if($config->limit_day) $args->limit_date = date("YmdHis", time()+$config->limit_day*60*60*24);

            // 입력할 사용자의 아이디를 소문자로 변경
            $args->user_id = strtolower($args->user_id);

            // 필수 변수들의 조절
            if($args->allow_mailing!='Y') $args->allow_mailing = 'N';
            if($args->denied!='Y') $args->denied = 'N'+ ';
            $args->allow_message= 'Y';

            if($logged_info->is_admin == 'Y') {
                if($args->is_admin!='Y') $args->is_admin = 'N';
            } else {
                unset($args->is_admin);
            }

            list($args->email_id, $args->email_host) = explode('@', $args->email_address);

            // 홈페이지, 블로그의 주소 검사
            if($args->homepage && !preg_match("/^http:\/\//i",$args->homepage)) $args->homepage = 'http://'.$args->homepage;
            if($args->blog && !preg_match("/^http:\/\//i",$args->blog)) $args->blog = 'http://'+ '.$args->blog;

            // 모델 객체 생성
            $oMemberModel = &getModel('member');

            // 금지 아이디인지 체크
            if($oMemberModel->isDeniedID($args->user_id)) return new Object(-1,'denied_user_id');

            // 아이디, 닉네임, email address 의 중복 체크
            $member_srl = $oMemberModel->getMemberSrlByUserID($args->user_id);
            if($member_srl) return new Object(-1,'msg_exists_user_id');

            $member_srl = $oMemberModel->getMemberSrlByNickName($args->nick_name);
            if($member_srl) return new Object(-1,'msg_exists_nick_name');

            $member_srl = $oMemberModel->getMemberSrlByEmailAddress($args->email_address);
            if($member_srl) return new Object(-1,'msg_exists_email_address');
   
   $member_srl = $oMemberModel->getMemberSrlByJumin($args->jumin);
   if($member_srl) return new Object(-1, 'msg_exists_jumin');

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

            // DB에 입력
            $args->member_srl = getNextSequence();
            if($args->password && !$password_is_hashed) $args->password = md5($args->password);
            elseif(!$args->password) unset($args->password);

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

            // 입력된 그룹 값이 없으면 기본 그룹의 값을 등록
            if(!$args->group_srl_list) {
                $default_group = $oMemberModel->getDefaultGroup(0);

                // 기본 그룹에 추가
                $output = $this->addMemberToGroup($args->member_srl,$default_group->group_srl);
                if(!$output->toBool()) {
                    $oDB->rollback();
                    return $output;
                }

            // 입력된 그룹 값이 있으면 해당 그룹의 값을 등록
            } else {
                $group_srl_list = explode('|@|', $args->group_srl_list);
                for($i=0;$i<count($group_srl_list);$i++) {
                    $output = $this->addMemberToGroup($args->member_srl,$group_srl_list[$i]);

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

            // 메일 인증 모드 사용시(가입된 회원이 denied일 때) 인증 메일 발송
            if ($args->denied == 'Y') {
                // 인증 DB에 데이터를 넣음
                $auth_args->user_id = $args->user_id;
                $auth_args->member_srl = $args->member_srl;
                $auth_args->new_password = $args->password;
                $auth_args->auth_key = md5(rand(0, 999999));
                $auth_args->is_register = 'Y';

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

                // 메일 내용을 구함
                Context::set('auth_args', $auth_args);
                Context::set('member_info', $args);
               
             $member_config = $oModuleModel->getModuleConfig('member');
             if(!$member_config->skin) $this->member_config->skin = "default";
             if(!$member_config->colorset) $this->member_config->colorset = "white";
 
             Context::set('member_config', $member_config);
            
             $tpl_path = sprintf('%sskins/%s', $this->module_path, $member_config->skin);
             if(!is_dir($tpl_path)) $tpl_path = sprintf('%sskins/%s', $this->module_path, 'default');
            
             $oTemplate = &TemplateHandler::getInstance();
                $content = $oTemplate->compile($tpl_path, 'confirm_member_account_mail');

                // 사이트 웹마스터 정보를 구함
                $oModuleModel = &getModel('module');
                $member_config = $oModuleModel->getModuleConfig('member');

                // 메일 발송
                $oMail = new Mail();
                $oMail->setTitle( Context::getLang('msg_confirm_account_title') );
                $oMail->setContent($content);
                $oMail->setSender( $member_config->webmaster_name?$member_config->webmaster_name:'webmaster', $member_config->webmaster_email);
                $oMail->setReceiptor( $args->user_name, $args->email_address );
                $oMail->send();
            }

            // trigger 호출 (after)
            if($output->toBool()) {
                $trigger_output = ModuleHandler::triggerCall('member.insertMember', 'after', $args);
                if(!$trigger_output->toBool()) {
                    $oDB->rollback();
                    return $trigger_output;
                }
            }

            $oDB->commit(true);

            $output->add('member_srl', $args->member_srl);
            return $output;
        }

11. /xe/modules/member/member.model.php
 - line 244
/**
    * @brief jumin에 해당하는 member_srl을 구함
   **/
   function getMemberSrlByJumin($jumin){
    $args->jumin = $jumin;
    $output = executeQuery('member.getMemberSrl', $args);
    return $output->data->member_srl;
   }


 - line 270 ~ 321
/**
   * @brief 주민등록번호 형식 확인
   **/
  function isTrueNumber($jumin){
   $total = 0;
   for($i=0;$i<13;$i++){
    $sval = substr($jumin, $i, 1);
    if($i < 8){
     $total = $total + ($sval * ($i+2));
    }
    if($i > 7 && $i < 12){
     $total = $total + ($sval * ($i-6));
    }
   }
   $total = $total % 11;
   $total2 = 11 - $total;
   if($total2 > 9) $total2 = $total2 % 10;
   $total = substr($jumin, 12, 1);
   if($total == $total2) return true;
   else return false;
  }
  
  /**
   * @brief 외국인번호 확인
   **/
  function isTrueNumber2($jumin){
   for($i=0;$i<13;$i++){
    $buf[$i] = (int)substr($jumin, $i, 1);
   }
   $odd = (int)$buf[7] * 10 + (int)$buf[8];
   if($odd % 2 != 0){
    return false;
   }
   if(($buf[11] != 6) && ($buf[11] != 7) && ($buf[11] != 8) && ($buf[11] != 9)){
    return false;
   }
   $multi = "2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5";
   $multipliers = str_split(",", $multi);
   $sum = 0;
   for($i=0;$i<12;$i++){
    $sum += (int)$bnf[$i] *= (int)$multipliers[$i];
   }   
   $sum = 11 - ($sum % 11);
   if($sum >= 10) $sum -= 10;
   $sum += 2;
   if($sum >= 10) $sum -=10;
   if($sum != $buf[12]) {
    return false;
   } else {
    return true; 
   }
  }

 // 외국인 가입이필요없는 경우 외국인 번호 체크 삭제

12. /xe/common/js/xml-js_filter.js
 - line 192 ~ 19
function XmlJsFilterExecuteFilter(filter, value) {
    switch(filter) {
        case "email" :
        case "email_address" :
                var regx = /^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*$/;
                return regx.test(value);
            break;
        case "userid" :
        case "user_id" :
                var regx = /^[a-zA-Z]+([_0-9a-zA-Z]+)*$/;
                return regx.test(value);
            break;
        case "homepage" :
                var regx = /^(http|https|ftp|mms):\/\/[0-9a-z-]+(\.[_0-9a-z-\/\~]+)+(:[0-9]{2,4})*$/;      
                return regx.test(value);
            break;
        case "korean" :
                var regx = /^[가-힣]*$/;
                return regx.test(value);
            break;
        case "korean_number" :
                var regx = /^[가-힣0-9]*$/;
                return regx.test(value);
            break;
        case "alpha" :
                var regx = /^[a-zA-Z]*$/;
                return regx.test(value);
            break;
        case "alpha_number" :
                var regx = /^[a-zA-Z][a-zA-Z0-9\_]*$/;
                return regx.test(value);
            break;
        case "number" :
    return !isNaN(value);
   break;
  case "jumin" :
    return juminChk(value);
   break;
case "jumin2" :
    return juminChk2(value);
   break;

    }

    return null;
}

 - line 203 ~ 247
function juminChk(val) {
 var total = 0;
 var sval;
 for(i=0;i<13;i++) {
  sval = val.substr(i, 1);
  if(i < 8) {
   total = total + (sval * (i + 2));
  }
  if(i > 7 && i < 12) {
   total = total + (sval * (i - 6));
  }
 }
 total = total % 11;
 var total2 = 11 - total;
 if(total2 > 9) total = total2 % 10;
 total = val.charAt(12);
 
 if(total == total2) return true;
 else return false;
}

function juminChk2(val) {
 var sum = 0;
 var odd = 0;
 var buf = new Array(13);
 for(i=0;i<13;i++) buf[i] = parseInt(reg_no.charAt(i));
 odd = buf[7] * 10 + buf[8];
 if(odd % 2 != 0) {
  return false;
 } 
 if((buf[11] != 6) && (buf[11] != 7) && (buf[11] != 8) && (buf[11] != 9)) {
  return false;
 }
 var multipliers = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5];
 for(i=0,sum=0;i<12;i++) sum += (buf[i] *= multipliers[i]);
 sum = 11 - (sum % 11);
 if(sum >= 10) sum -= 10;
 sum += 2;
 if(sum >= 10) sum -= 10;
 if(sum != buf[12]) {
  return false;
 } else {
  return true; 
 }
}

 - line 306 ~ 310
function XmlJsFilterCheckFieldItem() {
    for(var i=0; i<extra_vars.length;i++) {
        var name = extra_vars[i];
        this.addFieldItem(name, false, 0, 0, "", "");
    }

    for(var i=0; i<this.field.length;i++) {
        var item = this.field[i];
        var target = item[0];
        var required = item[1];
        var minlength = item[2];
        var maxlength = item[3];
        var equalto = item[4];
        var filter = item[5].split(",");

        if(typeof(this.fo_obj[target])=='undefined') continue;

        for(var j=0; j<notnull_list.length; j++) {
            if(notnull_list[j]==target) required = true;
        }

        var value = this.getValue(target);
        if(!required && !value) continue;
        if(required && !value && this.fo_obj[target]) return this.alertMsg(target,'isnull');

        if(minlength>0 && maxlength>0 && (value.length < minlength || value.length > maxlength)) return this.alertMsg(target, 'outofrange', minlength, maxlength);

        if(equalto) {
            var equalto_value = this.getValue(equalto);
            if(equalto_value != value) return this.alertMsg(target, 'equalto');
        }

        if(filter.length && filter[0]) {
            for(var j=0;j<filter.length;j++) {
                var filter_item = filter[j];
    if(filter_item == 'jumin') {
     if(document.getElementById(filter_item).form.foreigner.checked == true){
      filter_item = 'jumin2';
     }
    }

                if(!this.executeFilter(filter_item, value)) return this.alertMsg(target, "invalid_"+filter_item);
            }
        }
    }
    return true;
}

//외국인 번호를  체크하실게 아니면 역시  jumin2 관련 된 부분은 삭제 가능합니다.

 

 

/// CONAN 의 삭제 요청에 삭제 대신 관련 설명을 추가하도록 하겠습니다.

아래 13번 항목은 관리자 페이지에서 주민등록 번호를 출력하는 부분이며

14번 항목은 개인정보 항목에서 주민등록 번호를 출력하는 부분입니다.

개인적으로는 뒷자리를 1****** 으로 표시하여 사용하고 있습니다만.

다른 사용자가 주민등록번호를 보는것을 원치 않으실 경우 아래 항목은 적용하지 마시길 바랍니다.

{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 1)}******

위와 같이 적용할 경우 890123-1******   형식으로 출력됩니다.

아래 13,14 항목을 적용하지 않으셔도 사용상에 문제는 발생하지 않습니다.
13. /xe/modules/member/tpl/member_info.html
 - line 97 ~ 100
<tr>
 <th scope="row"><div>{$lang->jumin}</div></th>
 <td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>


14. /xe/modules/member/skins/default/member_info.html
 - line 37 ~ 40
<tr>
  <th><div>{$lang->jumin}</div></th>
  <td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
 </tr>


15. /xe/modules/member/member.admin.model.php  // 관리자 페이지에서 주민등록번호로 검사
 - line 74 ~ 76
/**
         * @brief 회원 목록을 구함
         **/
        function getMemberList() {
            // 검색 옵션 정리
            $args->is_admin = Context::get('is_admin')=='Y'?'Y':'';
            $args->is_denied = Context::get('is_denied')=='Y'?'Y':'';
            $args->selected_group_srl = Context::get('selected_group_srl');

            $search_target = trim(Context::get('search_target'));
            $search_keyword = trim(Context::get('search_keyword'));

            if($search_target && $search_keyword) {
                switch($search_target) {
                    case 'user_id' :
                            if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
                            $args->s_user_id = $search_keyword;
                        break;
                    case 'user_name' :
                            if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
                            $args->s_user_name = $search_keyword;
                        break;
                    case 'nick_name' :
                            if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
                            $args->s_nick_name = $search_keyword;
                        break;
                    case 'email_address' :
                            if($search_keyword) $search_keyword = str_replace(' ','%',$search_keyword);
                            $args->s_email_address = $search_keyword;
                        break;
                    case 'regdate' :
                            $args->s_regdate = ereg_replace("[^0-9]","",$search_keyword);
                        break;
                    case 'regdate_more' :
                            $args->s_regdate_more = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
                        break;
                    case 'regdate_less' :
                            $args->s_regdate_less = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
                        break;
                    case 'last_login' :
                            $args->s_last_login = $search_keyword;
                        break;
                    case 'last_login_more'+ ' :
                            $args->s_last_login_more = substr(ereg_replace("[^0-9]","",$search_keyword) . '+ '00000000000000',0,14);
                        break;
                    case 'last_login_less' :
                            $args->s_last_login_less = substr(ereg_replace("[^0-9]","",$search_keyword) . '00000000000000',0,14);
                        break;
                    case 'extra_vars' :
                            $args->s_extra_vars = ereg_replace("[^0-9]","",$search_keyword);
                        break;
     case 'jumin' :   // 검색대상이 jumin 이면..
       $args->s_jumin = ereg_replace("[^0-9]","",$search_keyword);
      break;

                }
            }

            // selected_group_srl이 있으면 query id를 변경 (table join때문에)
            if($args->selected_group_srl) {
                $query_id = 'member.getMemberListWithinGroup';
                $args->sort_index = "member.member_srl";
            } else {
                $query_id = 'member.getMemberList';
                $args->sort_index = "member_srl";
            }

            // 기타 변수들 정리
            $args->page = Context::get('page'+ ');
            $args->list_count = 40;
            $args->page_count = 10;
            return executeQuery($query_id, $args);
        }


16 . /xe/modules/member/quries/getMemberList.xml
 - line 16
<query id="getMemberList" action="select">
    <tables>
        <table name="member" />
    </tables>
    <columns>
        <column name="*" />
    </columns>
    <conditions>
        <condition operation="equal" column="is_admin" var="is_admin" />
        <condition operation="equal" column="denied" var="is_denied" pipe="and" />
        <group pipe="and">
            <condition operation="like" column="user_id" var="s_user_id" />
            <condition operation="like" column="user_name" var="s_user_name" pipe="or" />
            <condition operation="like" column="nick_name" var="s_nick_name" pipe="or" />
            <condition operation="like" column="email_address" var="s_email_address" pipe="or" />
   <condition operation="like" column="jumin" var="s_jumin" pipe="or" />
            <condition operation="like" column="extra_vars" var="s_extra_vars" pipe="or" />
            <condition operation="like_prefix" column="regdate" var="s_regdate" pipe="or" />
            <condition operation="like_prefix" column="last_login" var="s_last_login" pipe="or" />
            <condition operation="more" column="member.regdate" var="s_regdate_more" pipe="or" />
            <condition operation="less" column="member.regdate" var="s_regdate_less" pipe="or" />
            <condition operation="more" column="member.last_login" var="s_last_login_more" pipe="or" />
            <condition operation="less" column="member.last_login" var="s_last_login_less" pipe="or" />
        </group>
    </conditions>
    <navigation>
        <index var="sort_index" default="member_srl" order="desc" />
        <list_count var="list_count" default="20" />
        <page_count var="page_count" default="10" />
        <page var="page" default="1" />
    </navigation>
</query>



추가로 첨부파일에  /xe/modules/member/  폴더를 압축한 파일 첨부 합니다.

- 위 내용은 주민등록 번호가 필수 입력 사항이 아닙니다.
 
// 덧 :  이거 하느라 하느 업무의 반을 날려먹었군요 ㅎㅎ 오늘 좀 여유가 있어서 정리해봅니다.
그 동안 제가 올린 주민등록번호 입력 폼 게시물을 보고 고생 하셨던 분들에게 좀 더 도움이 되시길 바랍니다.

 

 

** 첨부 파일을 다운 받으시는 분들은 

** 아래 항목은 관리자 페이지에서 회원의 주민등록 번호를 볼수 있는 기능이니 보안관련 문제가 발생 할수 있습니다.

아래 내용을 적용하지 않으셔도 사용에 문제는 발생하지 않습니다.

13. /xe/modules/member/tpl/member_info.html
 - line 97 ~ 100
<tr>
 <th scope="row"><div>{$lang->jumin}</div></th>
 <td>{substr($member_info->jumin, 0, 6)} - {substr($member_info->jumin, 6, 7)}</td>
</tr>

첨부 파일 중 위 소스를 확인 하여 꼭 수정해 주세요 첨부 파일에 $ 기호가 누락되어있습니다.

태그 연관 글
  1. [2009/02/16] 웹마스터 팁 주민등록번호 입력 폼 추가 (1.1.5 기준) by 개돌 *39
제목 글쓴이 날짜
회원설정에 레이아웃 설정이 생겼습니다. 회원정보보기페이지 레이아웃 설정 가능 [2] 똑디 2012.10.04
관리자의 회원정보 수정 페이지에 '가입일/최근접속일' 추가하기 [6] file showjean 2012.09.17
XE와 마인크래프트 서버 화이트리스트 연동하기 [9] file 연가시먹었다 2012.08.25
회원정보 페이지에 작성 댓글 보기 추가하기 [7] file 늘푸른이 2012.07.12
관리자 페이지 회원/회원설정 추가정보에 추가한 전화번호를 회원목록에 추가하기(수정) [1] 늘푸른이 2012.07.08
관리자에서 그룹검색을 이용한 회원목록 제대로 안 보일때.. [2] sejin7940 2012.06.01
회원가입시 항목 설명부분에 html 태그를 쓰고플 경우 [3] sejin7940 2012.05.24
회원가입폼 비밀번호 찾기 질문/답변 삭제및 필수항목 선택 (송동우님 팁) [8] 때린데 또때려 2012.04.09
회원가입폼 비밀번호 찾기 질문/답변 삭제및 필수항목 선택 (송동우님 팁) 때린데 또때려 2012.04.08
XE를 처음 설치하면 기본적으로 필요한 자료들 - 초보자용 V2013-05-20 [11] Treasurej 2012.03.26
그룹별 회원정보 검색 & 회원의 추가가입폼 복수 검색 팁 (XE 1.5) sejin7940 2012.03.22
쪽지함 모바일에서 pc로 안넘기고 모바일 레이아웃에서 띄우는법&질문 [5] file 제발도와주세요 2012.03.20
[공유]로그인 하지 않아도 게시판에서 회원정보 출력 하기 (가입품 확장변수 포함) [6] file rminkim 2012.03.20
ie9에서 회원가입폼 클릭이 안될때 엔키오 2012.03.01
XE 1.5 이상으로 DB 이전시 일부 DB가 빠질 경우 - 내용추가(0203) [7] sejin7940 2012.02.02
1.5.x 버전에서 migration tool 동작불가 문제 [1] 모노소프트 2012.01.13
확정변수 로 프린트 페이지 꾸미기(/print_page.html) 세상의지배자 2011.12.26
코어 1.5.1에서 회원정보에 성별아이콘 쓰기 file 늘푸른이 2011.12.10
Xe 1.5.1로 사이트 꾸미기 part 1 [25] file 황비 2011.12.04
직접 ftp를 이용하여 게시물과 회원정보등 데이터 베이스 백업이 가능한가요 [1] 뉴늅 2011.09.06