XE 게시판에서 입력한 사용자 정의 정보를 회원 정보로 바로 업데이트하는 방법

| 2014. 3. 4. 00:58

시작하기에 앞서, 굉장히 조악한 방법을 사용했기 때문에 웬만한 경우가 아니면 이런 방식으로 이 기능을 구현하는 것을 말리고 싶다. 막상 구현을 하다보니 분명히 이보다 더 좋은 방법이 있을 것 같긴 하지만, 아무래도 정확히 어떤 기능이 어떻게 필요한 것인지 상황에 따라 최적화된 구현법이 굉장히 달라질 수 있는 것 같다. 어쨌든 이번에 내가 구현하고자 했던 기능은 XE 게시판 게시물의 사용자 정의 확장 변수를 회원 정보의 사용자 정의 확장 변수와 "적당히" 연동시키는 것이다. 적당히에 큰 따옴표를 두른 이유는 두 정보가 양방향성으로 연동이 되지 않기 때문이다. 게시물로 올린 정보는 회원 정보로 연동이 되지만, 회원 정보에서 수정한 정보는 게시물로 연동이 되지 않는다. 만약 진정한 양방향 연동을 원한다면, 직접 구현해보진 않은 상황에서의 단순한 추측이지만, 아무래도 게시물 확장 변수라는 방식 말고 아예 다른 접근법을 시도하는 것이 좋을 것 같다. 내가 생각할 수 있는 가장 큰 이유는 우선 XE의 확장 변수 부분이 예상을 뛰어넘는 방식으로 구현이 되어 있기 때문. 무슨 말인지 모르겠다면 직접 소스 코드를 뜯어보면 되겠다.

직접 뜯어보자.

첫 번째로 내가 착안했던 점은 지난 번에 글쓴이 정보 변경 기능을 구현하면서 알게 되었던 사실로 XE 게시판의 글 쓰기 화면에서 폼 태그 안에 적당한 name 속성을 가진 폼을 넣으면 생각보다 쉽게 사용자가 입력하는 값을 DB로 날릴 수 있다는 것이다. XE 게시판에서 사용자 정의 확장 변수를 사용하면 자연스럽게 사용자가 입력하는 값을 받아올 수 있을 것이다. 그래서 필요한 사용자 정의 확장 변수를 만들고 그 값을 게시판 컨트롤러에서 받아 처리를 하려는 그 순간 문제가 발생했다.

이유가 무엇인지는 모르겠으나 XE에서는 사용자 정의 확장 변수를 입력 받을 때 그 input 폼의 고유함을 부여하기 위해 사용자가 입력했던 사용자 정의 확장 변수 고유 아이디(eid) 값을 쓰지 않고 그저 extravars1, extravars2와 같은 name 속성을 쓰고 있던 것이다. 이미 다른 게시판에서 다른 용도로 사용자 정의 확장 변수를 쓰고 있었기 때문에 extravar1 포맷은 컨트롤러에서 일반적으로 사용할 수가 없었다. 그래서 생각해낸 것이 특정 사용자 정의 확장 변수의 경우엔 input 태그의 name을 사용자가 설정한 고유 아이디 값을 쓰게끔 만드는 것이었다. 관련 코드는 classes/extravar/Extravar.class.php의 getFormHTML()이라는 메소드에서 찾을 수 있었다.

default :
	$eid = $this->eid;
	if ($eid == 'CUSTOM_EID') {
		$buff[] =' ';
	} else {
		$buff[] =' ';
	}

위 코드가 하는 일은 특정 아이디(CUSTOM_EID)를 가진 사용자 정의 확장 변수에 대해 name 속성에 별 의미 없는 extravars1 따위의 값 대신 그 자신의 고유 아이디(eid)를 출력하게끔 하는 것이다. 사실 재미 있는 것은 ㅡ 모든 경우에 대해서 테스트를 해보지 않았고 위에도 어느 정도 밝혔듯이 애초에 사용자 정의 확장 변수가 어떤 방식으로 돌아가는지 정확한 이해가 없는 상황이긴 하다  ㅡ 굳이 조건문으로 분기를 나누지 않고 그냥 $column_name을 모두 $eid로 바꾼다고 하더라도 실제 확장 변수 동작에는 오류가 없다는 것이다. 아마 언젠가의 버전 업에서는 고유 아이디를 사용하는 방식으로 바뀌지 않을까 조심스럽게 예상해본다.

그렇게 사용자 정의 확장 변수를 게시판 컨트롤러로 넘길 수 있다면 그 다음부터는 별로 어려울 것이 없다. 아래 코드는 modules/board/board.controller.php의 procBoardInsertDocument() 메소드 어딘가에 적당히 삽입하면 된다.

if ($obj->CUSTOM_EID)
{
	$extra_vars = unserialize($logged_info->extra_vars);
	$extra_vars['CUSTOM_EID'] = $obj->CUSTOM_EID;
	$logged_info->extra_vars = serialize($extra_vars);
	$update_supporter_member = executeQuery('board.updateSupporterInfo', $logged_info);
}

역시나 하드 코드가 사용된 부분이므로 다음의 업데이트에 유의해야 한다. 새롭게 추가된 updateSupporterInfo 쿼리는 코드로 옮기기가 쉽지 않으므로 해당 커밋을 직접 살펴보길 바란다. 다시 말하지만, 별 건 없다.

여러모로 맘에 들지 않는 코드이긴 하나 지금 상황에서 원하는 기능을 수행하기엔 이보다 더 최적화된 코드를 만들기도 쉽지 않을 것이다. 끝.

그리고 그 자신감의 최후는 이런 것이겠지.