웹마스터 팁

에고.. 왠지 버젼이 바뀔때 마다 기존에 적은걸 다시 적는 기분이 드네요 ㅡㅡ;;
기존에 올렸던 주민등록 입력 폼에 많은 분들이 문의 해주신 내용들과 불편했던 내용들을 한꺼번에 다시 한번 정리 했습니다.
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
제목 글쓴이 날짜
주민등록 입력 폼 1.2.0 [55] file 개돌 2009.04.10
http://www.도메인주소/~as/xe/ 로 로그인 접속후~ [3] wjnam 2009.09.07
팝업창 띄우기 [16] 레망 2008.03.16
[수정] 쉽게 간단하게(?) 플래시 그래프를 게시판에 넣어 보세요 ^^ [3] 상오기 2009.08.27
에디터 본문 및 댓글 입력 글자크기 줄이기 [5] HIKARU 2008.11.24
에디터의 옵션 설정하기.. 컴포넌트 보이지 않게 등.. [4] 지허 2007.10.01
http 두번 븥는 문제 .. 위젯 스타일 스퀘어 페이스 more 버그입니다. [2] 최영석222 2009.07.25
이전글,다음글 얻기 (검색결과 까지 포함) (수정) [8] 라르게덴 2008.06.05
[초보팁] 우리말 수정하기(예제: 가입창 이름란 삭제) [3] 블루파티 2008.08.19
블로그, 홈페이지 가입시 자동 입력되는 http:// 없애기 [2] 류영무 2008.09.09
페이지 모듈에도 게시판제목 처럼 다는 쉬운방법... [2] 만쓰별(정만) 2009.01.23
홈페이지 주소 깔끔하게 사용하기 [초보용] [14] 똑디 2007.10.13
XOOPS (News Module) → XE 자료 옮기기 [3] file June Oh 2009.08.17
Cooliris Embed a Wall 위젯 v2.0에 동영상 반영시키기 [3] file 철쌤 2009.08.08
하드 압축 하실때 tar cvfpz 쓰시는분들..... [3] 우리아기 2009.08.13
통합검색에서 확장변수 검색하기 [5] StyleD 2008.10.12
회원 팝업메뉴에서 작성글 클릭시 다른 아이디 검색 안되게 하기 [3] 절망린 2009.07.03
사이트 주소로 접속했을때 XE폴더로 이동하기 #2 [15] 베니 2008.03.28
[비나무님글 ] xe_official_v2 레이아웃 사이트맵 없애는 방법 [3] 토니박스 2009.07.29
상단로그인..? [10] 빽짱구 2008.04.15