[WORDPRESS로 환자 DATABASE 만들기] #2. 환자별 자료 등록하기, Codex 이용

준비작업

#0. 환자별 자료등록을 위해 CPT로 medicaldata라는 type을 만들었다. 그리고 역시 Has Archive를 true로 했다. 일단 전체보기가 있으면 좋을 듯 하여.

#1. 환자별 자료 등록을 위해 content-patients.php에 코드에 링크를 걸어준다.

<tr><td><?=$pts_id?></td><td><a href='<?=get_site_url()?>/data_upload/<?=$pts_id?>'>자료 등록</a></td></tr>

#2. 일단 위의 링크처럼 전제조건은 /data_upload 라는 페이지가 우선 있어야 한다.

WPF를 통해 다음과 같이 페이지를 만들어줬다.

WPF를 통해 폼을 만들 때 Post setting에서 해당 post type을 ‘medicaldata’로 해줘야 한다

Untitled-1

일단 환자 ID 쓰는 부분은 없다.


Codex를 이용한 주소창을 통한 데이터 입력받기

Contents~.php를 바꾸고 난 뒤 archives를 보면, link 주소가 /data_upload/2016080304 등으로 되어있는데, 이 부분을 우리는 ID로 이용한다.

굳이 이렇게 안하고 data_upload?id=1111111 이럴수도 있는데, 이러면 멋있지 않으니까…

function.php 수정하여 Codex 규칙 적용

function add_rewrite_rules($rules) {
    $NewRules['data_upload/([^/]+)$'] = 'index.php?pagename=data_upload&pts_id=$matches[1]';
    $rules = $NewRules + $rules;
    return $rules;
}
// hook add_rewrite_rules function into rewrite_rules_array
add_filter('rewrite_rules_array', 'add_rewrite_rules');

function my_flush_rules(){
	$rules = get_option( 'rewrite_rules' );

	if ( ! isset( $rules['data_upload/([^/]+)$'] ) ) {
		global $wp_rewrite;
	   	$wp_rewrite->flush_rules();
	}
}

add_action( 'wp_loaded','my_flush_rules' );

코드는 의외로 간단하다. 정규표현식으로 data_upload/뒤에 붙은 문자를 원래 워드프레스 ‘페이지’로 들어가는 접근 경로로 이용해주는 것이다.

이 예제에서는 pid 라는 변수로 이용했다. pts_id 라는 변수로 했다. pid라는 변수는 포스트를 edit할때 그 포스트 아이디로 사용하기 때문이다.

<1>

function add_query_vars($vars) 
{   
    $vars[] = "pts_id"; 
    return $vars;
}

<2>

add_filter( 'init', 'add_more_query_var' );
function add_more_query_var()
{
    global $wp;
    $wp->add_query_var( 'pts_id' );
}

function.php에 pts_id라는 값을 사용할 것이 때문에 두번째 줄을 추가해준다. 아마도 php에서 $_GET[‘pts_id’] 라고 쓰던 것에 대한 내부적 처리일듯 하다.

(2017.05.28 : 2번째 방식이 더 잘 듣는 것 같다)

my_flush_rule 함수는 내가 정의한 codex 규칙이 없으면 flush(갱신이라고 해야하나?)를 하는데 이 함수가 없으면 적용이 안되더라. 위의 pid->pts_id로 수정하다 보니까 rule이 수정이 바로 안되는 현상이 발생. 그럴 땐 page.php에서

print_r( get_option(‘rewrite_rules’) ); 함수를 이용해서 rule이 잘 등록되었는지 확인, 잘 안되어있으면

global $wp_rewrite;
$wp_rewrite->flush_rules();

이 부분을 if 바깥쪽으로 빼서 강제로 한번 실행시켜 주면 된다.

 

Page.php 수정

#4.  그럼 이제 테마의 page.php 파일을 바꿔줄 것이다.

위의 codex처럼 되었으면 data_upload 페이지로 접근할 때만 pts_id 라는 변수가 있는 것이다.

따라서

if(isset($wp_query->query_vars['pts_id'])) 
	{
	    $pts_id = urldecode($wp_query->query_vars['pts_id']);
	    echo $pts_id;
	}

이 코드를 넣어주면 다음과 같이

Untitled-1

숫자가 잘 출력이 된다. pid 값이 옳은지 검증하는 부분은 잘 만들면 될 것 같고..

function.php 수정하여 Field 만들기

#4. 이제 저 값을 이용해 field를 만든다. hooking을 이용하면 된다.

용어의 헷갈림을 피하기 위해 pts_id를 pts_rec_id로 바꾸는 작업등 몇가지만 했다.

특이사항은 global $pts_id 인데, 이건 page.php파일에서 정의된 $pts_id를 이용하기 위함이다. 우연히 넣어봤는데 잘된다..아마 loading 순서가 page.php 이후에 function이 읽히는건가?…

function medical_record_pid( $form_id, $post_id, $form_settings ) { 
    if ( $post_id ) {     //포스팅 수정일 경우
    	//echo "포스트 수정 ".$post_id;
        $em = get_post_meta($post_id, 'pts_rec_id');        
        $pts_rec_id  = $em[0];
    }
    else                  //신규 포스팅의 경우
    {
        global $pts_id;
    	$pts_rec_id = $pts_id;
    }
    ?>    
 <li class="wpuf-el pts_id" data-label="DB 등록번호">        <div class="wpuf-label">
            <label for="wpuf-pts_id">DB 등록번호 <span class="required">*</span></label>
        </div>
        
        <div class="wpuf-fields">
            <input class="textfield wpuf_pts_id_28" id="pts_id" readonly="readonly" type="text" data-required="yes" data-type="text" name="pts_rec_id" placeholder="" value="<?=$pts_rec_id ?>" size="40"  />
            <span class="wpuf-help"></span>

                    </div>

                <script type="text/javascript">

            wpuf_conditional_items.push();

        </script>
        </li>
    <?php
}
add_action( 'medical_record_pid_hook', 'medical_record_pid',10,3);

/**** 이하는 DB저장을 위한 함수 ****/
function wpufe_update_record_pid( $post_id ) {
    if ( isset( $_POST['pts_rec_id'] ) ) {
        update_post_meta( $post_id, 'pts_rec_id', $_POST['pts_rec_id']); 
    }
}
 
add_action( 'wpuf_edit_post_after_update', 'wpufe_update_record_pid' );
add_action( 'wpuf_add_post_after_insert', 'wpufe_update_record_pid' );

이렇게 하면 다음과 같이Untitled-1

잘들어가지는 것 확인. 이제 예시로 몇개 작성해본다.

 

Medicaldata Archive 수정

이제 medicaldata 아카이브를 봐본다.

Untitled-1

값이 잘 들어왔다. 이 부분을 바꾸는 것은 다시 첫번째 포스팅의 반복이다.

#6.

테마의 archive-patients.php를 복사해서 archive-medicaldata.php로 만들고,

content-medicaldata.php를 만들어서 살짝만 수정해준다.

	<?php 	
			$pts_rec_id = get_post_meta($post->ID, 'pts_rec_id')[0];			
			$title = get_the_title($post->ID);
	?>
	<tr><td><?=$pts_rec_id?></td><td><?=$title?></td></tr>

이렇게 해서

Untitled-1

하면 완성, 아래 4개는 잘못만들어진 데이터다. 막 만들다보니..


다음 포스팅 에서는 & References

#1. pts_id 와 pts_rec_id가 동일한 data만 추출하는 것. 그래야 그 환자의 자료만 볼 수 있을테니까.

#2. 레코드 삭제버튼

#3. 환자 데이터를 삭제할때 하위 레코들도 함께 삭제하기(귀찮을 것 같다)

#4. 환자등록시 주민등록번호를 받아서 암호화 시켜 저장하고, 주민등록번호로 환자 record를 찾을 수 있게 하기.

암호화는 gnuboard시절에는 md4 알고리즘을 썼었는데,

http://www.openeg.co.kr/329 를 보니, SHA-1, MD5는 권고하지 않는다고?..

만약 폐쇄된 네크워크에서 데이터베이스를 구성하려면 MD5나 SHA-1로도 어느정도 구색이 나겠지만,

그리하여 검색하다보니

Password Hashing and Encryption In PHP; MD5, SHA1, SHA256, BCrypt

사이트에 좋은 예제가 있다.

Salts를 이용한 security라고, 결국에는 데이터 자체가 훔쳐지는 것은 어떻게 하지 못해도, 그 데이터의 원래 내용이 뭔지 모르게 함에 그 목적이 있는 것이니.

 

http://www.yes24.com/24/goods/8921236?scode=032&OzSrank=1

개인적으로 전문적인 컴퓨터 지식이 많지 않은 나같은 일반인이 암호화에 대해 이해하기로는 링크를 걸은 ‘미래를 바꾼 아홉 가지 알고리즘’ 이라는 책을 강력히 추천한다. 여기에 암호화 파트를 보면 대강이나마 어떤식으로 암호화가 구현되는지 알 수 있을 것이다.

Leave a Reply

Your email address will not be published.