팝업기능 추가하려면 (인쇄기능 안 쓸경우 - 초간단)
1. popup이라는 게시판 생성 및 권한 설정
2.
3. modules/document/tpl/print_page.html의 window.print() 스크립트 부분을 주석 처리


게시판 확장변수를 더 다양하게


추가할 것들 :
한국 유선전화 kr_tel
한국 무선전화 kr_mobile
한국주소(zip) kr_zip
단일 선택(radio) radio
주민등록번호 형식 regnum
일시 (년월일시분초) datetime


과정 :
/zbxe/modules/board/tpl/board_insert.html line 214 :
(if($key != 'kr_zip' 부분 제거)
<? //... <select name="extra_vars_{$i}_type"> <!--@foreach($lang->column_type_list as $key => $val)--> <option value="{$key}" <!--@if($extra_vars_type==$key)-->selected="selected"<!--@end-->>{$lang->column_type_list[$key]}</option> <!--@end--> </select> //... ?>

/zbxe/modules/board/board.admin.view.php line 79 dispBoardAdminBoardInfo() ->
/zbxe/modules/board/tpl/board_insert.html line 210 ->
/zbxe/common/lang/ko.lang.php line 218 :
<?php //... $lang->column_type_list['kr_tel'] = '한국 유선전화 (kr_tel)'; $lang->column_type_list['kr_mobile'] = '한국 무선전화 (kr_mobile)'; $lang->column_type_list['radio'] = '단일 선택(radio)'; $lang->column_type_list['regnum'] = '주민등록번호 형식 (regnum)'; $lang->column_type_list['datetime'] = '일시 (년월일시분초)'; //... ?>
/zbxe/modules/board/skins/xe_board/extra_var_value.html :
(phone_kr, mobile_kr과 tel, select와 radio는 || 연산자로 결합할 수 있다.)
<!-- ... --> <!-- 한국 유선전화, 한국 무선전화 --> <!--@elseif($val->type == 'kr_tel' || $val->type == 'kr_mobile')--> {htmlspecialchars($val->value)} &nbsp; <!-- 단일 선택(radio) --> <!--@elseif($val->type == 'radio')--> {htmlspecialchars($val->value)} &nbsp; <!-- 한국주소 (zip) --> <!--@elseif($val->type == 'kr_zip')--> {htmlspecialchars($val->value[0])}<br /> {htmlspecialchars($val->value[1])} &nbsp; <!-- 일시 입력 --> <!--@elseif($val->type == 'datetime')--> {zdate($val->value,"Y-m-d H:i:s")} &nbsp; <!-- ... -->

/zbxe/modules/board/skins/xe_board/write_form.html 최상단 :
<!--%import("js/extra_var_form.js")-->

/zbxe/modules/board/skins/xe_board/extra_var_form.html :
(한국주소의 출처는 http://www.bluegate.kr/?document_srl=17081&mid=zbxetip&listStyle=webzine&sort_index=readed_count&order_type=desc
하지만 그대로 적용시 현 버전에서는 사용 불가)
<!-- ... --> <!--%import("js/extra_var_form.js")--> <!-- ... --> <!-- mmx900 : 원본 코드에 radio만 추가했다. --> <!-- type=select,radio,checkbox이고 기본값이 , 로 연결되어 있으면 , 를 기준으로 explode하여 배열로 만든다 --> <!--@if(in_array($val->type,array('select','radio','checkbox'))&&strpos($val->default,",")!==false)--> {@ $val->default = explode(',',$val->default) } <!--@end--> <!-- ... --> <!-- 한국 유선전화, 무선전화 --> <!--@elseif($val->type == 'kr_tel' || $val->type == 'kr_mobile')--> <input type="hidden" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" /> {@ $val->value = explode('-',$val->value) } <select name="tmp_{$val->column_name}_0" onblur="krtel_changed('{$val->column_name}')"> <!--@if($val->type == 'kr_tel')--> <option value="02">02</option> <option value="031">031</option> <option value="032">032</option> <option value="033">033</option> <option value="041">041</option> <option value="042">042</option> <option value="043">043</option> <option value="051">051</option> <option value="052">052</option> <option value="053">053</option> <option value="061">061</option> <option value="062">062</option> <option value="063">063</option> <option value="064">064</option> <!--@else--> <option value="010">010</option> <option value="011">011</option> <option value="016">016</option> <option value="017">017</option> <option value="018">018</option> <option value="019">019</option> <!--@end--> </select> <input type="text" name="tmp_{$val->column_name}_1" value="{htmlspecialchars($val->value[1])}" size="4" maxlength="4" class="inputTypeText" onblur="krtel_changed('{$val->column_name}')"/> <input type="text" name="tmp_{$val->column_name}_2" value="{htmlspecialchars($val->value[2])}" size="4" maxlength="4" class="inputTypeText" onblur="krtel_changed('{$val->column_name}')"/> <!-- 단일 선택 (radio) --> <!--@elseif($val->type == 'radio')--> <!--@if($val->default)--> <!--@foreach($val->default as $v)--> <input type="radio" name="{$val->column_name}" value="{$v}" <!--@if($v == $val->value)-->checked="checked"<!--@end--> />{$v} <!--@end--> <!--@end--> <!-- 일시 입력 --> <!--@elseif($val->type == 'datetime')--> <input type="hidden" name="{$val->column_name}" id="date_{$val->column_name}" value="{$val->value}" /> <div class="display_date" id="str_{$val->column_name}">{zdate($val->value,"Y-m-d H:i:s")}</div> <script type="text/javascript"> Calendar.setup( { firstDay : 0, inputField : "date_{$val->column_name}", ifFormat : "%Y%m%d%H%M%S", displayArea : "str_{$val->column_name}", daFormat : "%Y-%m-%d %H:%M:%S", showsTime : true, timeFormat : 24}); </script> <!-- 한국주소 (zip) --> <!--@elseif($val->type == 'kr_zip')--> <div class="krZip"> <div id="zone_address_1_{$val->column_name}" style="display:<!--@if($val->value[0])-->inline<!--@else-->none<!--@end-->;"> <input type="text" name="{$val->column_name}" value="{$val->value[0]}" class="inputTypeText w400"/> <a href="#" onclick="doHideKrZipList('{$val->column_name}'); return false;" class="button"><span>{$lang->cmd_cancel}</span></a> </div> <div id="zone_address_list_{$val->column_name}" style="display:none"> <select name="_tmp_address_list_{$val->column_name}" class="w300"></select> <a href="#" onclick="doSelectKrZip('{$val->column_name}'); return false;" class="button"><span>{$lang->cmd_select}</span></a> <a href="#" onclick="doHideKrZipList('{$val->column_name}'); return false;" class="button"><span>{$lang->cmd_cancel}</span></a> </div> <div id="zone_address_search_{$val->column_name}" style="display:<!--@if($val->value[0])-->none<!--@else-->inline<!--@end-->;"> <input type="text" name="_tmp_address_search_{$val->column_name}" class="inputTypeText w400" value="" /> <a href="#" onclick="doSearchKrZip('{$val->column_name}'); return false;" class="button"><span>{$lang->cmd_search}</span></a> </div> <div class="address2"> <input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[1])}" class="inputTypeText w400" /> </div> </div> <!-- ... -->

/zbxe/modules/board/skins/xe_board/js/extra_var_form.js :
/* 유-무선 전화번호 관련 */ function krtel_changed(column_name){ var fw = xGetElementById('fo_write'); fw[column_name].value = fw["tmp_" + column_name + "_0"].value + "-" + fw["tmp_" + column_name + "_1"].value + "-" + fw["tmp_" + column_name + "_2"].value; } /* 한국 우편 번호 관련 */ /* /modules/member/tpl/js/krzip_search.js 복사하여 fo_insert_member를 fo_write으로 전환, 잘못된 입력시 경고메시지 추가 */ function doHideKrZipList(column_name) { var zone_list_obj = xGetElementById('zone_address_list_'+column_name); var zone_search_obj = xGetElementById('zone_address_search_'+column_name); var zone_addr1_obj = xGetElementById('zone_address_1_'+column_name); var addr1_obj = xGetElementById('fo_write')[column_name][0]; var field_obj = xGetElementById('fo_write')['_tmp_address_search_'+column_name]; zone_addr1_obj.style.display = 'none'; zone_list_obj.style.display = 'none'; zone_search_obj.style.display = 'inline'; addr1_obj.value = ''; field_obj.focus(); } function doSelectKrZip(column_name) { var zone_list_obj = xGetElementById('zone_address_list_'+column_name); var zone_search_obj = xGetElementById('zone_address_search_'+column_name); var zone_addr1_obj = xGetElementById('zone_address_1_'+column_name); var sel_obj = xGetElementById('fo_write')['_tmp_address_list_'+column_name]; var value = sel_obj.options[sel_obj.selectedIndex].value; var addr1_obj = xGetElementById('fo_write')[column_name][0]; var addr2_obj = xGetElementById('fo_write')[column_name][1]; addr1_obj.value = value; zone_search_obj.style.display = 'none'; zone_list_obj.style.display = 'none'; zone_addr1_obj.style.display = 'inline'; addr2_obj.focus(); } function doSearchKrZip(column_name) { var field_obj = xGetElementById('fo_write')['_tmp_address_search_'+column_name]; var addr = field_obj.value; if(!addr){ alert("동 이름을 입력해주세요. (예: 인계동)"); return; } var params = new Array(); params['addr'] = addr; params['column_name'] = column_name; var response_tags = new Array('error','message','address_list'); exec_xml('krzip', 'getKrzipCodeList', params, completeSearchKrZip, response_tags, params); } function completeSearchKrZip(ret_obj, response_tags, callback_args) { if(!ret_obj['address_list']) { alert(alert_msg['address']); return; } var address_list = ret_obj['address_list'].split("\n"); var column_name = callback_args['column_name']; var zone_list_obj = xGetElementById('zone_address_list_'+column_name); var zone_search_obj = xGetElementById('zone_address_search_'+column_name); var zone_addr1_obj = xGetElementById('zone_address_1_'+column_name); var sel_obj = xGetElementById('fo_write')['_tmp_address_list_'+column_name]; for(var i=0;i<address_list.length;i++) { var opt = new Option(address_list[i],address_list[i],false,false); sel_obj.options[i] = opt; } for(var i=address_list.length-1;i<sel_obj.options.length;i++) { sel_obj.remove(i); } sel_obj.selectedIndex = 0; zone_search_obj.style.display = 'none'; zone_addr1_obj.style.display = 'none'; zone_list_obj.style.display = 'inline'; }

계층형 게시판 만들기

xe_board 스킨 style.list.html의 121행(1.0.0 기준) </tr>과 <!@end> 사이에 아래 내용을 껴넣는다.
<!-- 계층형 답글 목록 출력 --> <!--@if($document->getCommentCount())--> {@ $_comment_list = $document->getComments() } <!--@foreach($_comment_list as $key => $comment)--> <tr class="bg{($no+1)%2+1}"> <!--@if($module_info->display_number!='N')--><td class="num"><!--@if($document_srl == $document->document_srl)--><img src="./images/common/iconArrowD8.gif" border="0" alt="" /><!--@else-->A<!--@end--></td><!--@end--> <!--@if($grant->is_admin)--><td>&nbsp;</td><!--@end--> <td class="title"><a href="{getUrl('document_srl',$document->document_srl, 'listStyle', $listStyle, 'cpage','')}#comment_{$comment->comment_srl}"> {@$tmp = str_repeat("[RE]",$comment->get('depth') + 1)}{$tmp} {@$tmp = explode("<BR",$comment->getContent(false,false))}{strip_tags($tmp[0])}</a></td> <!--@if($module_info->display_author!='N')--><td class="author"><div class="member_{$comment->get('member_srl')}">{$comment->getNickName()}</div></td><!--@end--> <!--@if($module_info->display_readed_count!='N')--><td class="reading">&nbsp;</td><!--@end--> <!--@if($module_info->display_voted_count!='N')--><td class="recommend">{$comment->get('voted_count')!=0?$comment->get('voted_count'):'&nbsp;'}</td><!--@end--> <!--@if($module_info->display_regdate!='N')--><td class="date">{$comment->getRegdate('Y-m-d')}</td><!--@end--> <!--@if($module_info->display_last_update=='Y')--><td class="date">{zdate($comment->get('last_update'),'Y-m-d H:i')}</td><!--@end--> </div> </tr> <!--@end--> <!--@end-->

워터마크 적용하기

1. /images/logo_mark.gif를 업로드
2. 제로XE 소스 수정
/zbxe/modules/file/file.controller.php line 359:
<? //... // 파일 이동 if(!$manual_insert&&!move_uploaded_file($file_info['tmp_name'], $filename)) return false; elseif($manual_insert) @copy($file_info['tmp_name'], $filename); // 워터마킹 <-- 추가된 부분 if(eregi("\.(jpg|jpeg)$", $file_info['name'])) { $this->waterMark($filename,"../images/logo_mark.gif"); } // 사용자 정보를 구함 $oMemberModel = &getModel('member'); $member_srl = $oMemberModel->getLoggedMemberSrl(); //... ?>
같은 파일, 클래스 내 아무데나 :
/zbxe/modules/file/file.controller.php line 359:
<? //... //출처 : 푸름빠덜님 그누스킨 http://sir.co.kr/bbs/board.php?bo_table=g4_skin&wr_id=28315 //##add060613 이미지합성함수 function waterMark($fileInHD, $wmFile, $transparency = 90, $jpegQuality = 90, $margin = 5) { $wmImg = imageCreateFromGIF($wmFile); $jpegImg = imageCreateFromJPEG($fileInHD); $wmX=imageSX($jpegImg) - imageSX($wmImg); $wmY=imageSY($jpegImg) - imageSY($wmImg); imageCopyMerge($jpegImg, $wmImg, $wmX, $wmY, 0, 0, imageSX($wmImg), imageSY($wmImg), $transparency); ImageJPEG($jpegImg, $fileInHD, $jpegQuality); } //##add060613 이미지합성함수 //... ?>


라이트박스 적용하기

[http]LightBox2 Download 2.03 기존 사용 버전
현재는 더 가볍고, 기능이 많으며 사용하는 라이브러리들이 더 최신인 [http]lightbox slideshow으로 변경.
아래 방법은 둘 모두에서 잘 동작한다.
(lightbox slideshow에서는 lightbox.css를 열어 images/... 경로를 ./images/...로 모두 바꾸어 준다.

1. lightbox2를 받아 스킨 디렉터리 아래에 설치. (여기서는 ./lightbox/에 설치하기로 한다.)
2. 다음 두 파일을 생성
js/for_lightbox.js :
//레이아웃 경로로 작성한다. var fileLoadingImage = "/zbxe/modules/board/skins/xe_board_lightbox/lightbox/images/loading.gif"; var fileBottomNavCloseImage = "/zbxe/modules/board/skins/xe_board_lightbox/lightbox/images/closelabel.gif";
css/for_lightbox.css :
#prevLink, #nextLink{background-image: url(./lightbox/images/blank.gif);} #prevLink:hover, #prevLink:visited:hover { background-image: url(./lightbox/images/prevlabel.gif);} #nextLink:hover, #nextLink:visited:hover { background-image: url(./lightbox/images/nextlabel.gif);}

3. 스킨의 적당한 곳(기본 스킨의 경우 : header.html 등)에 다음 내용을 추가 :
(CCA 2.5이므로 라이센스 표기를 해 준다.)
<!-- Lightbox2 by Lokesh Dhakar (CCA 2.5) : http://www.huddletogether.com/projects/lightbox2/ --> <!--%import("lightbox/js/prototype.js")--> <!--%import("lightbox/js/scriptaculous.js")--> <!--%import("lightbox/js/effects.js")--> <!--%import("lightbox/js/lightbox.js")--> <!--%import("lightbox/css/lightbox.css")--> <!-- lightbox 추가 설정 --> <!--%import("js/for_lightbox.js")--> <!--%import("css/for_lightbox.css")-->

끝으로 목록 파일(기본 스킨의 경우 style.gallery.html)에서 다음 내용 수정
line 99 :
{@$uploaded_files = $document->getUploadedFiles()} {@$i = 0} <!--@foreach($uploaded_files as $file)--> <!--@if($i == 0)--> <a href="{$file->download_url}" rel="lightbox[roadtrip]" title="{$document->getTitleText(0)}"><img src="{$document->getThumbnail($module_info->thumbnail_width, $module_info->thumbnail_height, $module_info->thumbnail_type)}" border="0" alt="" class="thumb"/></a> <!--@else--> <!--lightbox에서 slide show를 사용하기 위해 나머지 파일들도 모조리 링크를 건다.--> <a href="{$file->download_url}" rel="lightbox[roadtrip]" title="{$document->getTitleText(0)}"></a> <!--@end--> {@$i++} <!--@end-->

powered by Moniwiki | themed by clockoon
last modified 2008-12-30 10:44:13
Processing time 2.0957 sec