웹마스터 팁

에고.. 왠지 버젼이 바뀔때 마다 기존에 적은걸 다시 적는 기분이 드네요 ㅡㅡ;;
기존에 올렸던 주민등록 입력 폼에 많은 분들이 문의 해주신 내용들과 불편했던 내용들을 한꺼번에 다시 한번 정리 했습니다.
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
제목 글쓴이 날짜
XE 1.2.1에서 xe_default 게시판 스킨 사용시 IE에서 글입력폼이 안보일 때 [2] 현의느낌 2009.04.28
XE 위키에 최근 접속 페이지 정보 출력 file 개돌 2009.04.27
[질문]회원가입시 음력생일입력 가능 한가요? [1] 신정 2009.04.27
초보 xe1.1.5에대한질문 [3] 울프 2009.04.26
스프링노트 연동기를 써 보았습니다. amyjang 2009.04.23
플래시 랜덤하게 불러오기 [9] 선비숨결 2009.04.21
BNU님의 Planner XE 1.2 버젼(일정관리) [9] file 개돌 2009.04.21
다양한 언어로 홈페이지 서비스하기 - 무식한 방법 [4] 멀리서 2009.04.21
포인트 부족하면 글 조회 안되게 하는 법 [6] 뚱님*^^* 2009.04.18
첨부파일 안올라갈 경우.. [5] file 양갱; 2009.04.18
홈페이지 타이틀이 $user_lang->home ,freeboard등으로 나오는 문제 수정방법(자체해결) [1] 정박사닷컴 2009.04.18
폰트가 작아져요 [2] file 황소111 2009.04.17
해당 Cafe 회원에 가입후 Cafe 회원목록에 나타나지 않음...... 뉴욕에서 2009.04.16
페이지 및 게시판 메뉴 경로 [2] file 자반튀김 2009.04.15
제로보드4, xe 버전 바이러스에 대한 질문 [1] 투자혁명 2009.04.15
게시판에서 확장 변수를 쓰는 경우 1.2.0 이상 버전으로 업그레이드하기 전에 패치하시기 바랍니다. [5] file mooo 2009.04.14
XpressEngine 1.2.1 r6096 트리거 목록 [2] [1] mooo 2009.04.13
[1.2.0] content 위젯 사용시 rss리더 새창에 뛰우기 [1] 늘같이 2009.04.10
비밀글 댓글이 최신댓글 위젯에 노출되는 문제 수정방법 [1] 얼터1 2009.04.10
주민등록 입력 폼 1.2.0 [55] file 개돌 2009.04.10