팝업기능 추가하려면 (인쇄기능 안 쓸경우 - 초간단)
1. popup이라는 게시판 생성 및 권한 설정
2.
3. modules/document/tpl/print_page.html의 window.print() 스크립트 부분을 주석 처리
1:1 게시판용 자동 비밀글 체크(http://www.zeroboard.com/?mid=zbxe_qna&search_target=title&search_keyword=%EB%B9%84%EB%B0%80%EA%B8%80&document_srl=15941771)
게시판 확장변수를 더 다양하게 ¶
음악, 이미지(http://www.zeroboard.com/?mid=zbxe_user_tip&search_target=title&search_keyword=%ED%99%95%EC%9E%A5&document_srl=16568133)
추가할 것들 :
한국 유선전화 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는 || 연산자로 결합할 수 있다.)
{htmlspecialchars($val->value)}
{htmlspecialchars($val->value)}
{htmlspecialchars($val->value[0])}<br />
{htmlspecialchars($val->value[1])}
{zdate($val->value,"Y-m-d H:i:s")}
/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
하지만 그대로 적용시 현 버전에서는 사용 불가)
{@ $val->default = explode(',',$val->default) }
<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}')">
<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>
<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>
</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}')"/>
<input type="radio" name="{$val->column_name}" value="{$v}" <!--@if($v == $val->value)-->checked="checked" />{$v}
<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>
<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;
}
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> 사이에 아래 내용을 껴넣는다.
{@ $_comment_list = $document->getComments() }
<tr class="bg{($no+1)%2+1}">
<td class="num"><img src="./images/common/iconArrowD8.gif" border="0" alt="" />A</td>
<td> </td>
<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>
<td class="reading"> </td>
<td class="recommend">{$comment->get('voted_count')!=0?$comment->get('voted_count'):' '}</td>
<td class="date">{$comment->getRegdate('Y-m-d')}</td>
<td class="date">{zdate($comment->get('last_update'),'Y-m-d H:i')}</td>
</div>
</tr>
워터마크 적용하기 ¶
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:
<?
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);
}
?>
라이트박스 적용하기 ¶
LightBox2 Download(http://www.huddletogether.com/projects/lightbox2/) 2.03 기존 사용 버전
현재는 더 가볍고, 기능이 많으며 사용하는 라이브러리들이 더 최신인
lightbox slideshow(http://www.justinbarkhuff.com/lab/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이므로 라이센스 표기를 해 준다.)
끝으로 목록 파일(기본 스킨의 경우 style.gallery.html)에서 다음 내용 수정
line 99 :
{@$uploaded_files = $document->getUploadedFiles()}
{@$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>
<a href="{$file->download_url}" rel="lightbox[roadtrip]" title="{$document->getTitleText(0)}"></a>
{@$i++}
그누보드 적용 참고(http://www.sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=7619)