웹마스터 팁

제 경우 XE 는 1.2 인가까지 쓰면서 이미지 슬라이더 등도 만들고 나름 노력했으나;

제로보드 4 가 여전히 더 편해서 다시는 안쓰기로 했었습니다.


그러다가 워드프레스로 옮겨탈까 하던 중에 제로보드 XE 가 버젼이 많이 업되어서 좋겠구나 하고 왔지요.


예약 게시판 하나 만들다가 뚜껑이 열려서 마구 헤맨 결과를 여기 적어 드립니다.


팁들로 하나씩 시리즈로 작성할게요.


참고로, 고수님들에게는 쓰레기 팁이고, 노가다로 그냥 자신의 스킨을 개조해서 쓰실 분들께는

간단하게 제작할 수 있는 팁입니다.


그러니, 고수분들은 가볍게 뒤로가기를 눌러주세요...



완전 초보분들도 따라하기 쉽게 쓸게요.




사용자 정의를 활용하여 폼 형식으로 개발하는 무식한 방법(1)


: 사용자 변수를 만든 XE가 초보 입장에서는 잘못이다.


우선 사용자 정의 변수를 만든 XE 가 이 뛰어난 기능을 엉망으로 쓰게 해둔 것에서 하나씩 보도록 하죠.



(XE 설치폴더)/modules/board/skins/해당스킨/write_form.html 파일에서 보게 되면,


<table cond="count($extra_keys)" class="et_vars exForm bd_tb">
  <caption><strong><em>*</em></strong> <small>: {$lang->is_required}</small></caption>
  <tr loop="$extra_keys=>$key,$val">
   <th scope="row"><em cond="$val->is_required=='Y'">*</em> {$val->name}</th>
     <td>
     {$val->getFormHTML()}
     </td>
  </tr>
</table>


이런 부분이 있을 것입니다.


이 부분에 간단히 코드를 추가합니다.


<table cond="count($extra_keys)" class="et_vars exForm bd_tb">
  <caption><strong><em>*</em></strong> <small>: {$lang->is_required}</small></caption>
  <tr loop="$extra_keys=>$key,$val">
   <th scope="row"><em cond="$val->is_required=='Y'">*</em> {$val->name}</th>
     <td>{$val->getFormHTML()}<br><br>
    module_srl : {$val->module_srl}, <br>
    idx : {$val->idx}, <br>
    name : {$val->name}, <br>
    type : {$val->type}, <br>
    default : {$val->default}, <br>
    desc : {$val->desc}, <br>
    is_required : {$val->is_required}, <br>
    search : {$val->search}, <br>
    value : {$val->value}, <br>
    eid : {$val->eid}, <br>
    total : {print_r($val)}
   </td>
  </tr>
</table>


이렇게 해주면 name 값을 처리하는 것이나 val 을 통해서 어떤 값들이 넘겨지게 되는 지를 확인 가능합니다.


그런데 여기에서 문제가 있죠.




<tr loop="$extra_keys=>$key,$val">
 

코드 상의 문제...라고 볼 수도 있습니다.


고수님들께서 보시기엔 아무 문제 없이 쉽게 해결하겠지만,


이렇게 되어 있어서 사용자 변수를 키값과 밸류값으로 그냥 뿌리는 형식으로 처리하면서,


 {$val->getFormHTML()}


이 함수에 넣고 그냥 폼으로 출력되게 하는 아주 간단한 구현을 해놓은 것입니다.


레이아웃이나, 메뉴 등에서만해도 끌올 등이 되는 등 아주 편한데,

이 값으로 해놓다보니, 우리 초보들은 사용자 정의를 입맛에 맞게 쓸 수가 없습니다.


간단히 설명해드리자면 idx 값에 숫자가 증가하면서 그게 인덱스가 되는 무식한 방법이죠.

그냥 사용자 정의 변수 1~n 번까지 루프 돌아서 뿌려버려~

이게 전부인 거죠.


일단 초보 단계에서 이걸 해결하는 방법은 위의 코드를 아예 주석으로 처리하고,

처리하기 전에 html 을 소스 보기로 보면서 무식하게 부분별로 형식을 지정해주는 거죠.


그런데 이렇게 한다고 해도 문제가 발생합니다.

우선, 수정을 눌렀을 때에 값 전달이 표기가 안됩니다.

그 다음으로는 입력시의 모양과 출력시의 모양이 달라집니다 -_-;


뭐, 출력시의 모양이 더 중요한 곳인 지, 입력시의 모양이 더 중요한 곳인 지는 각자의 판단에 달려있겠죠.


그래서 우선 위에 설명한 것처럼 idx 로 사용자 정의 변수를 쓰는 방식을 개조해야 합니다.



(XE설치경로)/modules/board/board.view.php 파일에서,


/**
* use context::set to setup extra variables
**/
  $oDocumentModel = getModel('document');
  $extra_keys = $oDocumentModel->getExtraKeys($this->module_info->module_srl);
  Context::set('extra_keys', $extra_keys);



이 부분을 찾아서 그 바로 아래에,

/**
* add extra variables to order(sorting) target
**/

if (is_array($extra_keys))

{
  

// extra_keys_map : extra_keys가 있을 때, 맵을 추가로 구성

   $extra_keys_map = array();

foreach($extra_keys as $val)

{

$extra_keys_map[$val->eid] = $val; // 맵에 값 할당 by diaimm

    $this->order_target[] = $val->eid;
}
      Context::set('extra_keys_map', $extra_keys_map); //맵을 view 로 전달해주는 거죠

}



이런 식으로 코드를 추가해둡니다.



아, 이런 이제서야 발견했습니다;; 확장 컴포넌트에 코드 입력이 있네요;

아놔 -_-;


// apply xml_js_filter on header
		$oDocumentController = getController('document');
		$oDocumentController->addXmlJsFilter($this->module_info->module_srl);


이 부분을 찾아서,


// if the document exists, then setup extra variabels on context
		if($oDocument->isExists() && !$savedDoc) {
			$extra_keys = $oDocument->getExtraVars();
			Context::set('extra_keys', $extra_keys);

			// 아래 코드에서 extra_keys 값이 있을 때 추가로 맵을 구성
			if (is_array($extra_keys))
			{
				$extra_keys_map = array();
				foreach($extra_keys as $val)
				{
					$extra_keys_map[$val->eid] = $val;
				}

				Context::set('extra_keys_map', $extra_keys_map);
			}
			//여기까지
		}


그 밑에 이런 식으로 추가해주는 거죠.


이렇게 해주는 이유는 앞에서 말씀드린 것처럼 기본적으로 XE 에서는 사용자 정의 변수 자체를

아주 가볍게 보고 별 쓰잘데기 없지만 원하는 사람도 있으니까... 라는 정도로 코딩을 해둔 때문입니다.

(아, 이건 그냥 초보가 느끼는 심정 그대로 썼습니다 -0-)


그냥 보면 사용자 변수 이렇게 쓰이니까, 개발자 분들은 쉽게 사용하세요 정도로 안내해준 것인 듯 한데,

초보들에게는 때에 따라서 매우 필요한 기능이 제대로 활용하기 어려우니까 쪼끔 분노게이지 상승하는 거죠.


어쨌든, view 에서 index 를 쓰게 만들어서 idx 를 이용해서 변수를 순차로 매기는 것에서 순서를 무시하고도

값을 전달하고 받는 것에 문제가 없게끔 하는 첫 작업인 거죠.


그렇게 해주면 idx 가 아닌 사용자 정의 변수 이름 그대로 쓸 수 있습니다.


예를 들어서 사용자 변수 명을 testInput 라고 만들었다고 칩니다.


  <table cond="count($extra_keys)" border="1" cellspacing="0" summary="Extra Form" class="extraVarsList" width=100%>
   <caption><em>*</em> : {$lang->is_required}</caption>
   <tr>
    <th scope="row"><em>*</em> 테스트 입력</th>
    <td> <input type="text" name="extra_vars1" value="" class="text" />
      <p>여기가 설명 부분이 되겠죠</p>
    </td>
   </tr>


게시판에 글 쓰기를 하고 앞에서 말씀드린 부분을 주석처리하기 전에 보게 되면,

이런 식으로 소스코드를 볼 수 있을 것입니다.


따라서 주석 처리를 해주고 write_form.html 자체에 저 코드를 추가하면, 아무런 이상없이 쓰게 된다는 거죠.


저기서 보게 될 중요한 점은 어디에서 testInput 는 존재하지 않습니다.

즉, 변수명은 받기만하고 쓰잘데기없는 값처럼 둔갑하는 거죠.

extra_vars1 이라고 해서 여기 숫자만 중요합니다.


뭥미?


그렇다는 것은 사용자 변수를 20개 만들었는데...


아차! 하나 빼먹음... 하는 순간...

입력 순서를 원하는대로 받으려면,


끌 올도 못하는데 새로고침 무지 하면서 올리기 버튼 눌러야 합니다.

(맨 위로 올림도 없고 그냥 무식하게 계속 올려야 합니다)

아니 이미 존재하는 모듈상에 코드가 존재하잖아요, 끌어 올리기...

모듈로 따로 개발하고 코딩한 이유가 그런 거 섞어쓰기 편하려던 목적 같은데...

객체지향... 내가 메뉴에서 마우스로 끌어 올리고 내리고 하는 코드 몰라도 그렇게 되게끔...


더 열받는 것은 잘못 누르면 다시 내려가요 ㅠㅠ


게다가 여러가지 테스트를 해보면 전화번호나 기타 값을 해보면 html 코드에 보면 id=extra_var3-1055

이런 식으로 각 기본값들에 대해서 엄청난 숫자 번호까지 매기는데, 이 값도 전혀 쓸모 없습니다.

순차적으로 이것도 그냥 인덱스죠.


그러니 무식한 코딩을 쓴 후에는 변수값 하나 추가하는 순간 멘붕인거죠.


그래서 앞에 과정을 해둔 것입니다.


위의 코드를 수정해보면,


<input type="text" name="extra_vars1" placeholder="{$extra_keys_map['testInput']->name}" style="width:155px;" value="{$extra_keys_map['testInput']->value}" class="text" />


이렇게 바꿔주는 거죠.



이제 우리가 활용하게 되는 것은,

extra_vars숫자 (사용자 정의 에서 나오는 앞의 숫자값입니다) 와 사용자 변수명이 되었습니다.


간단히 설명드리겠습니다.

placeholder 값은 당연히 입력 칸에 살짝 흐리게,

비 로그인 상태에서 글쓰기 할 때에, 비밀번호 -> 이렇게 써서 입력 받잖아요? 그런 태그 속성입니다.

사용자 정의 이름 입력할 때에 Ex) extra_vars_1 이라는 것도 마찬가지로 구현되어 있죠.

실제로는 밑줄 없습니다. 밑줄빼기도 아니고... 이건 뭐;;;


아무튼,


{$extra_keys_map['testInput']->name} 이게 사용자 변수의 입력항목 이름이 되는 거죠.


그리고 이 부분이 중요합니다.


style="width:155px;"


이게 입력 칸의 너비 조절이 되는 거죠.

size 로는 안됩니다. 원래 형식이 들어 있는 Extravar.class.php 에서 고친다고 해도 저렇게 고쳐줘야 작동합니다.


이제 이렇게 해준 상태에서,


가장 중요한 부분이죠.

이것 때문에 이 긴 글을 읽고 있는데 말입니다;



value="{$extra_keys_map['testInput']->value}"


이렇게 해주면 값 전달이 되어서 수정시에도 제대로 되겠죠.


그리고 지금은 맵을 두가지로 쓰기 때문에 루프 돌 때에도 사용자 변수명으로 if 써서 foreach 등에 끼어들기가 쉽습니다.

변수명 자체를 활용할 수 있으니까요.


오늘은 여기까지 설명하구요,


다음에는 사용자 정의 변수 형식에 우리 입맛대로 쑤셔 넣는 방법을 배우겠습니다.


그걸 해줘야, 시간이든, 해외 국제 전화번호든...

우리 넣고 싶은 값을 다 넣을 수 있죠.


코딩같은 코딩은 이번만 조금 다루고, 다음부터는 일단 무조건 노가다입니다.




태그 연관 글
  1. [2016/08/10] 묻고답하기 사용자정의(확장변수)에 입력하는 설명에 태그를 적용할 수 없을까요? by Xing *1
  2. [2016/04/02] 묻고답하기 게시판 사용자정의 이미지 첨부 by 김선희 *1
  3. [2014/08/22] 웹마스터 팁 사용자 정의를 활용하여 폼 형식으로 개발하는 무식한 방법(2) by Reminisce *5
  4. [2014/04/07] 묻고답하기 한 메뉴의 레이아웃에서 사용자 정의항목을 변경하면 일괄변경됩니다 ㅠ by ForcePlane *3
  5. [2014/04/02] 묻고답하기 위젯에서 변수명 출력 가능한가요? by 글쎄나는 *4
제목 글쓴이 날짜
고도몰과 xe 회원 연동하는 키 포인트 410contents 2014.09.03
애드온 개발중에 이상한 버그가 생길경우 [2] 銀童 2014.08.26
div 세로 중앙 정렬팁 Ansi™ 2014.09.01
카카오톡으로 보내기(깔끔한 뷰) [4] seyriz 2014.08.11
socialXE 에서 로그인시 소셜로그인과 XE 로그인 동시 구현하기 file 큐우우 2014.08.31
XE에 페이스북 소셜 댓글 연동하는 방법 (페이스북 소셜댓글 달기) 기톨닷컴 2014.08.30
카메론 플러그인 에드온이 컨텐츠(본문)을 가릴때 팁 file oscarmike 2014.08.30
게시판의 오늘 올라온 새글의 갯수를 알아내는 방법 [8] garnecia 2014.08.22
캡챠(captcha)가 안 뜰 때 Double'U' 2014.08.29
XE 업데이트 방법 - 제1편 (0.x.x / 1.0.x / 1.1.x / 1.2.x 에서 1.2.4 버전으로 업그레이드) [38] file Gekkou 2009.11.19
XE를 앱으로, 티타늄 및 폰갭(Cordova) 사용기 [1] AJKJ 2014.08.28
익명게시판에서 관리자가 글 수정시 글의 권한이 넘어가지 않도록 하기. [5] 소시덕분에힘받아요 2014.06.11
홈페이지 제작 시, 개인정보관련/회원가입약관 처리에 대해서 [1] 양파F 2014.08.23
관리자 게시판 목록에서 브라우저 제목 클릭시 새창으로 뜨도록 수정 [2] sejin7940 2014.08.26
관리자페이지의 '서버정보출력'에 '절대경로' 가 출력되게 하는 방법 [3] sejin7940 2014.08.26
XE 알림센터 Lite 사용시에 쪽지나 호출에 대해서만 알림음을 적용하기 [17] SeungXE 2014.07.06
사용자 정의를 활용하여 폼 형식으로 개발하는 무식한 방법(2) [5] Reminisce 2014.08.22
사용자 정의를 활용하여 폼 형식으로 개발하는 무식한 방법(1) [6] Reminisce 2014.08.22
CafeXE (homepage 모듈) 메뉴노출 권한오류 수정안. Xiso 2014.08.22
사이트 디자인 설정에서 레이아웃 저장이 안될시 고치는 방법 [1] LoteM대한천자 2014.07.28