script path 찾는 함수를 일단 0.2.8로 rollback. 차후 보다 자세한 환경에서 테스트후 원위치

git-svn-id: http://xe-core.googlecode.com/svn/trunk@3723 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2008-02-19 16:28:53 +00:00
commit 3d0791f854
741 changed files with 9023 additions and 10858 deletions

View file

@ -1,9 +1,17 @@
RewriteEngine On
# image...
RewriteRule ^([a-zA-Z0-9_]+)/files/attach/images/(.*) ./files/attach/images/$2 [L]
RewriteRule ^([a-zA-Z0-9_]+)/modules/(.*) ./modules/$2 [L]
RewriteRule ^([a-zA-Z0-9_]+)/common/(.*) ./common/$2 [L]
RewriteRule ^(.+)/files/attach/images/(.*) ./files/attach/images/$2 [L]
RewriteRule ^(.+)/files/attach/menu_button/(.*) ./files/attach/menu_button/$2 [L]
RewriteRule ^(.+)/files/member_extra_info/(.*) ./files/member_extra_info/$2 [L]
RewriteRule ^(.+)/files/cache/(.*) ./files/cache/$2 [L]
RewriteRule ^(.+)/modules/(.*) ./modules/$2 [L]
RewriteRule ^(.+)/common/css/(.*) ./common/css/$2 [L]
RewriteRule ^(.+)/common/js/(.*) ./common/js/$2 [L]
RewriteRule ^(.+)/common/tpl/(.*) ./common/tpl/$2 [L]
RewriteRule ^(.+)/widgets/(.*) ./widgets/$2 [L]
RewriteRule ^(.+)/layouts/(.*) ./layouts/$2 [L]
RewriteRule ^(.+)/addons/(.*) ./addons/$2 [L]
# page
RewriteRule ^([a-zA-Z0-9_]+)/([[:digit:]]+)page$ ./index.php?mid=$1&page=$2 [L]

View file

@ -119,8 +119,21 @@
// 파일 업로드
case 'metaWeblog.newMediaObject' :
// 파일 업로드 권한 체크
if(!$this->grant->fileupload) {
printContent( getXmlRpcFailure(1, 'no permission') );
$oFileModel = &getModel('file');
$file_module_config = $oFileModel->getFileModuleConfig($this->module_srl);
if(is_array($file_module_config->download_grant) && count($file_module_config->download_grant)>0) {
$logged_info = Context::get('logged_info');
if($logged_info->is_admin != 'Y') {
$is_permitted = false;
for($i=0;$i<count($file_module_config->download_grant);$i++) {
$group_srl = $file_module_config->download_grant[$i];
if($logged_info->group_list[$group_srl]) {
$is_permitted = true;
break;
}
}
if(!$is_permitted) printContent( getXmlRpcFailure(1, 'no permission') );
}
}
$fileinfo = $params[3]->value->struct->member;

View file

@ -33,9 +33,9 @@
</description>
<description xml:lang="en">
This blogApi addon supports metaWeblog.
Toggling this with use option lets RSD tag be exposed for each module.
By using this option, it lets the RSD tag to be exposed to each module.
URL to the api is http://setup_path/module_name/api.
Only selecting use option enables RSD tag and api to behave.
RSD tag and the api will work only if u use this addon.
</description>
<description xml:lang="es">
Este blogApi addon soporta el metaWeblog.

View file

@ -27,7 +27,7 @@
</description>
<description xml:lang="en">
This addon logs access information based on the basic counter module within Zeroboard XE.
It is necessary for aggregation of access information to turn on this addon.
The access information will be collected only if you turn on this addon.
</description>
<description xml:lang="es">
Este addon contador básico de Zeroboard XE permite llevar la información de acceso a la página web de los visitantes.

View file

@ -13,7 +13,7 @@
**/
// called_position가 before_module_init 이고 module이 admin이 아닐 경우
if($called_position == 'before_module_init' && !$GLOBALS['__counter_addon_called__']) {
if($called_position == 'before_module_init' && !$GLOBALS['__counter_addon_called__'] && !in_array(Context::get('act'), array('procCounterExecute','procFileDelete'))) {
if($this->module != 'admin') Context::addJsFile('./modules/counter/tpl/js/counter.js');
$GLOBALS['__counter_addon_called__'] = true;
}

View file

@ -3,12 +3,14 @@
<title xml:lang="ko">Google Analytics</title>
<title xml:lang="zh-CN">Google Analytics</title>
<title xml:lang="en">Google Analytics</title>
<title xml:lang="es">Google Analytics</title>
<title xml:lang="ru">Google Analytics</title>
<title xml:lang="jp">Google Analyticsアドオン</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 9. 19">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">Zero</name>
<name xml:lang="en">Zero</name>
<name xml:lang="es">Zero</name>
<name xml:lang="ru">Zero</name>
<name xml:lang="jp">Zero</name>
<description xml:lang="ko">
@ -18,7 +20,10 @@
可以添加Google Analytics代码。
</description>
<description xml:lang="en">
Google Analytics
This addon inserts Google Analytics code to site.
</description>
<description xml:lang="es">
Este addon inserciones Google Analytics código de sitio.
</description>
<description xml:lang="ru">
Google Analytics
@ -32,11 +37,13 @@
<title xml:lang="ko">uacct</title>
<title xml:lang="zh-CN">uacct</title>
<title xml:lang="en">uacct</title>
<title xml:lang="es">Uacct</title>
<title xml:lang="ru">uacct</title>
<title xml:lang="jp">uacct</title>
<description xml:lang="ko">Google Analytics 코드의 _uacct 값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入Google Analytics代码的_uacct值。</description>
<description xml:lang="en">Google Analytics _uacct</description>
<description xml:lang="en">Please input _uacct from Google Analytics code.</description>
<description xml:lang="es">Por favor, de entrada _uacct código de Google Analytics.</description>
<description xml:lang="ru">Google Analytics _uacct</description>
<description xml:lang="jp">Google Analyticsコードの「_uacct」の値を入力してください。</description>
</var>

View file

@ -1,18 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">LemonPen XE 애드온</title>
<title xml:lang="en">LemonPen XE Addon</title>
<title xml:lang="es">LemonPen XE addon</title>
<title xml:lang="ru">LemonPen XE Addon</title>
<title xml:lang="jp">LemonPen XE アドオン</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 12. 10">
<name xml:lang="ko">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="jp">zero</name>
<description xml:lang="ko">활성화 하시면 레몬펜을 사이트에 달 수 있습니다.</description>
<description xml:lang="en">You can insert LemonPen to the site when you enable this.</description>
<description xml:lang="es">Puede insertar LemonPen al sitio cuando este se activa.</description>
<description xml:lang="ru">Вы можете вставить LemonPen к месту, когда вы позволили это.</description>
<description xml:lang="jp">機能をオンにすると、レモンペンをサイト上で使うことが出来ます。 (LemonPenOpenmaru社提供)</description>
</author>
<extra_vars>
<var name="sid">
<title xml:lang="ko">sid</title>
<title xml:lang="en">sid</title>
<title xml:lang="es">sid</title>
<title xml:lang="ru">sid</title>
<title xml:lang="jp">sid</title>
<description xml:lang="ko">레몬펜에에서 사이트 등록시 발급받은 sid값을 입력해주세요.</description>
<description xml:lang="ko">레몬펜에서 사이트 등록시 발급받은 sid값을 입력해주세요.</description>
<description xml:lang="en">Please input sid value that you got after registering at the LemonPen website.</description>
<description xml:lang="es">Por favor, de entrada sid valor que había que hacer después de registrarse en el sitio web LemonPen.</description>
<description xml:lang="ru">Введите замороженный ценности, которые вы получили после регистрации на сайте LemonPen.</description>
<description xml:lang="jp">レモンペンのサイトで発行されたsidを入力してください。 (LemonPenOpenmaru社提供)</description>
</var>
</extra_vars>

View file

@ -12,10 +12,26 @@
* before_display_content 에서만 요청이 됩니다.
**/
if(Context::get('module')=='admin' || $called_position != 'before_module_init') return;
if(Context::getResponseMethod()=="XMLRPC") return;
$sid = $addon_info->sid;
// 모듈의 실행 이후에 script를 추가함
if(Context::get('module')!='admin' && $called_position == 'after_module_proc' ) {
if($this->getLayoutFile() != 'popup_layout.html') {
$sid = $addon_info->sid;
if($sid) {
Context::addHtmlFooter(sprintf('<script src="http://script.lemonpen.com/site/lemonpen.js?sid=%s" type="text/javascript" charset="UTF-8"></script>', $sid));
$GLOBALS['__lemonpen_is_called__'] = true;
}
}
return;
}
// Context::addJsFile()을 이용하면 끝
if($sid) Context::addHtmlFooter(sprintf('<script src="http://script.lemonpen.com/site/lemonpen.js?sid=%s" type="text/javascript" charset="UTF-8"></script>', $sid));
// 제로보드XE의 문서와 permant link를 레몬펜의 규약에 맞춰서 출력
if($GLOBALS['__lemonpen_is_called__'] && $called_position == 'before_display_content') {
// 글 본문을 링크
$output = preg_replace('/<div class="document_([0-9]+)_([0-9]+) xe_content">/is','<div class="document_$1_$2 xe_content hentry"><a href="'.getUrl('','document_srl',"$1").'" rel="bookmark" style="display:none;">'.getUrl('','document_srl',"$1").'</a>', $output);
// 댓글 본문을 링크
$output = preg_replace('/<div class="comment_([0-9]+)_([0-9]+) xe_content">/is','<div class="comment_$1_$2 xe_content hentry"><a href="'.getUrl('','document_srl',"$1").'" rel="bookmark" style="display:none;">'.getUrl('','document_srl',"$1").'</a>', $output);
}
?>

View file

@ -3,7 +3,7 @@
<title xml:lang="ko">사용자 추가 정보 및 커뮤니케이션 기능 활성화</title>
<title xml:lang="jp">会員情報・コミュニティアドオン</title>
<title xml:lang="zh-CN">用户扩展信息</title>
<title xml:lang="en">Addon for enabling facilities for providing additional information about users and communicating</title>
<title xml:lang="en">Enabling additional information about users and the communication function.</title>
<title xml:lang="es">Addon para activar la función de la Información addcional del usuario y de la comunicación.</title>
<title xml:lang="ru">Аддон для предоставления дополнительной информации о пользователях и коммуникации</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
@ -44,13 +44,13 @@
5. 呼出MemberModel::getMemberMenu时添加[加为好友]菜单。
</description>
<description xml:lang="en">
Among other information about users, this addon displays image name, image mark, and signature.
In case of you not use this information, this stands apart from basic information so runtime should be reduced.
To expose image name, image mark, and signature, please turn on this addon.
1. Just before displaying user information, this will figure out unique key of member from the definition of "&amp;lt;div class="member_{unique key of member}"&amp;gt;....&amp;lt;/div&amp;gt;" and replace image name and/or image mark if they exsist.
2. Just before displaying, this is gonna locate the definition of "&amp;lt;div class="document_{unique key of document}"&amp;gt;...&amp;lt;/div&amp;gt;" and insert the signature below it.
3. When arrived a new slip, this will popup it.
4. This makes available to send a slip if the target is a member when MemberModel::getMemberMenu is called.
Among other information about users, this addon displays image name, image mark, and signature.
This addon is normally turned off to reduce loading time.
To display image name, image mark, and the signature, please turn on this addon.
1. Right before displaying, this addon will seek for the unique key of the member from &amp;lt;div class="member_{unique key of member}"&amp;gt;....&amp;lt;/div&amp;gt; and will replace the content with the image name and/or image mark if they exist.
2. Right before displaying, this addon will search for &amp;lt;div class="document_{unique key of document}"&amp;gt;...&amp;lt;/div&amp;gt; and will display the signature in the bottom of the article.
3. When a new msessage is arrived, this will display the message in the popup window.
4. This makes available to send a message if the target is a member when MemberModel::getMemberMenu is called.
5. This adds a menu for registering as a friend when MemberModel::getMemberMenu is called.
</description>
<description xml:lang="es">

View file

@ -1,3 +1,3 @@
<?php
$lang->alert_new_message_arrived = 'Ha llegado un nuevo mensaje. ¢¯Desea leer ahora?';
$lang->alert_new_message_arrived = 'Usted tiene un nuevo mensaje. Quiere comprobar ahora?';
?>

View file

@ -9,9 +9,6 @@
* 1. 출력되기 직전 <div class="member_회원번호">....</div> 정의가 부분을 찾아 회원번호를 구해서
* 이미지이름, 이미지마크가 있는지를 확인하여 있으면 내용을 변경해버립니다.
*
* 2. 출력되기 직전 <div class="document_회원번호">...</div> 정의된 곳을 찾아 글의 내용이라 판단,
* 하단에 서명을 추가합니다.
*
* 3. 새로운 쪽지가 왔을 경우 팝업으로 띄움
*
* 4. MemberModel::getMemberMenu 호출시 대상이 회원일 경우 쪽지 보내기 기능 추가합니다.
@ -26,14 +23,12 @@
**/
if($called_position == "before_display_content") {
// 기본적인 기능이라 MemberController 에 변경 코드가 있음
$oMemberController = &getController('member');
// 회원 이미지이름/ 마크/ 찾아서 대체할 함수를 담고 있는 파일을 include
require_once('./addons/member_extra_info/member_extra_info.lib.php');
// 1. 출력문서중에서 <div class="member_번호">content</div>를 찾아 MemberController::transImageName() 를 이용하여 이미지이름/마크로 변경
$output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oMemberController, 'transImageName'), $output);
$output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', 'memberTransImageName', $output);
// 2. 출력문서중에 <!--AfterDocument(문서번호,회원번호)--> 를 찾아서 member_controller::transSignature()를 이용해서 서명을 추가
$output = preg_replace_callback('/<!--AfterDocument\(([0-9]+),([0-9]+)\)-->/i', array($oMemberController, 'transSignature'), $output);
/**
* 3 기능 수행 : 시작할때 새쪽지가 왔는지 검사
@ -90,9 +85,12 @@
// 대상 회원의 정보를 가져옴
$target_member_info = $this->getMemberInfoByMemberSrl($member_srl);
if(!$target_member_info->member_srl) return;
// 로그인된 사용자 정보를 구함
$logged_info = Context::get('logged_info');
// 4. 쪽지 발송 메뉴를 만듬
if( $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $this->isFriend($member_srl))) {
if( $logged_info->is_admin == 'Y' || $target_member_info->allow_message =='Y' || ($target_member_info->allow_message == 'F' && $this->isFriend($member_srl))) {
$menu_str = Context::getLang('cmd_send_message');
$menu_link = sprintf('%s?module=member&amp;act=dispMemberSendMessage&amp;receiver_srl=%s',Context::getRequestUri(),$member_srl);
$menu_list .= sprintf("\n%s,%s,popopen('%s','sendMessage')", Context::getRequestUri().'/modules/member/tpl/images/icon_write_message.gif', $menu_str, $menu_link);

View file

@ -0,0 +1,40 @@
<?php
/**
* @brief div 또는 span에 member_번호 있을때 해당 회원 번호에 맞는 이미지이름이나 닉이미지를 대체
**/
function memberTransImageName($matches) {
// 회원번호를 추출하여 0보다 찾으면 본문중 text만 return
$member_srl = $matches[3];
if($member_srl<0) return $matches[5];
// 회원이 아닐경우(member_srl = 0) 본문 전체를 return
$nick_name = $matches[5];
if(!$member_srl) return $matches[0];
// 전역변수에 미리 설정한 데이터가 있다면 그걸 return
if(!$GLOBALS['_transImageNameList'][$member_srl]->cached) {
$GLOBALS['_transImageNameList'][$member_srl]->cached = true;
$image_name_file = sprintf('./files/member_extra_info/image_name/%s%d.gif', getNumberingPath($member_srl), $member_srl);
$image_mark_file = sprintf('./files/member_extra_info/image_mark/%s%d.gif', getNumberingPath($member_srl), $member_srl);
if(file_exists($image_name_file)) $GLOBALS['_transImageNameList'][$member_srl]->image_name_file = $image_name_file;
else $image_name_file = '';
if(file_exists($image_mark_file)) $GLOBALS['_transImageNameList'][$member_srl]->image_mark_file = $image_mark_file;
else $image_mark_file = '';
} else {
$image_name_file = $GLOBALS['_transImageNameList'][$member_srl]->image_name_file;
$image_mark_file = $GLOBALS['_transImageNameList'][$member_srl]->image_mark_file;
}
// 이미지이름이나 마크가 없으면 원본 정보를 세팅
if(!$image_name_file && !$image_mark_file) return $matches[0];
$text = $nick_name = htmlspecialchars(strip_tags($nick_name));
// 이미지 이름이 있을 경우
if($image_name_file) $text = sprintf('<img src="%s" border="0" alt="id: %s" title="id: %s" style="vertical-align:middle;margin-right:3px" />', $image_name_file, $nick_name, $nick_name);
if($image_mark_file) $text = sprintf('<img src="%s" border="0" alt="id: %s" title="id : %s" style="vertical-align:middle;margin-right:3px"/>%s', $image_mark_file, $nick_name, $nick_name, $text);
return sprintf('<span class="nowrap member_%d" style="cursor:pointer">%s</span>',$member_srl, $text);
}
?>

View file

@ -22,7 +22,7 @@
必须在设置中输入openid provider相关值后再使用。
</description>
<description xml:lang="en">
This addon enables you to use your own domian name as an OpenID.
This addon enables you to use your own domain name as an OpenID.
Just be sure to set the values related with openid provider before using.
</description>
<description xml:lang="es">

View file

@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">포인트 활성화 애드온</title>
<title xml:lang="zh-CN">积分插件</title>
<title xml:lang="jp">ポイントシステム用アドオン</title>
<title xml:lang="en">Addon for activating point</title>
<title xml:lang="es">Addon para activar los puntos</title>
<title xml:lang="ru">Аддон для активации поинтов</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 7. 26">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">Zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
포인트시스템 모듈에 설정된 내용을 바탕으로 글작성/삭제/댓글작성/삭제/파일업로드/삭제/다운로드등의 행동에 대해서 포인트를 기록합니다.
</description>
<description xml:lang="zh-CN">
以积分系统模块中设置的内容为基础,对发表/删除新帖,发表/删除评论,上传/下载/删除/文件等动作记录为积分。
</description>
<description xml:lang="jp">
ポイントシステムモジュールで設定された内容を基に、書き込み作成・削除/コメント作成・削除/ファイルアップロード・削除/ダウンロードなどのユーザの活動に対してそれぞれのポイント付与ができます。
</description>
<description xml:lang="en">
This addon records point on writing/deleting/adding comments/deleting comments/uploading/downloading following to point system module.
</description>
<description xml:lang="es">
Este addon registra los puntos de acuerdo a la acción de escribir/borrar/agregar comentarios/borrar comentarios/subir_archivo/bajar_archivo,etc., siguiendo el módulo de sistema de puntos.
</description>
<description xml:lang="ru">
Этот аддон записыват поинты при написании/удалении/добавлении комментариев/удалении комментариев/закачки/скачки согласно модулю системы поинтов.
</description>
</author>
</addon>

View file

@ -1,8 +0,0 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @brief 포인트 애드온은 포인트 모듈의 trigger 기능으로 인하여 이상 사용하지 않음
**/
return;
?>

View file

@ -26,8 +26,8 @@
レベルアイコンは、「モジュール&gt;ポイントシステム」で選択できます。
</description>
<description xml:lang="en">
This addon displays level icon in front of user name when point system is using.
You can choose level icon on Module &gt; Point System.
This addon displays level icon in front of the user name when you are using the point system.
You can choose the level icon on Module &gt; Point System.
</description>
<description xml:lang="es">
Este addon muestra el nivel del ícono delante del nombre del usuario cuando es usado el sistema de puntos.

View file

@ -12,6 +12,8 @@
// before_display_content 가 아니면 return
if($called_position != "before_display_content") return;
require_once('./addons/point_level_icon/point_level_icon.lib.php');
$oPointController = &getController('point');
$output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', array($oPointController, 'transLevelIcon'), $output);
$output = preg_replace_callback('!<(div|span)([^\>]*)member_([0-9\-]+)([^\>]*)>(.*?)\<\/(div|span)\>!is', 'pointLevelIconTrans', $output);
?>

View file

@ -0,0 +1,46 @@
<?php
/**
* @brief 포인트 아이콘 변경을 위한 함수.
**/
function pointLevelIconTrans($matches) {
$member_srl = $matches[3];
if($member_srl<1) return $matches[0];
if(!isset($GLOBALS['_pointLevelIcon'][$member_srl])) {
// 포인트 설정을 구해옴
if(!$GLOBALS['_pointConfig']) {
$oModuleModel = &getModel('module');
$GLOBALS['_pointConfig'] = $oModuleModel->getModuleConfig('point');
}
$config = $GLOBALS['_pointConfig'];
// 포인트 모델을 구해 놓음
if(!$GLOBALS['_pointModel']) $GLOBALS['_pointModel'] = getModel('point');
$oPointModel = &$GLOBALS['_pointModel'];
// 포인트를 구함
$point = $oPointModel->getPoint($member_srl);
// 레벨을 구함
$level = $oPointModel->getLevel($point, $config->level_step);
$text = $matches[5];
// 레벨 아이콘의 위치를 구함
$level_icon = sprintf("./modules/point/icons/%s/%d.gif", $config->level_icon, $level);
// 최고 레벨이 아니면 다음 레벨로 가기 위한 per을 구함
if($level < $config->max_level) {
$next_point = $config->level_step[$level+1];
if($next_point > 0) $per = (int)($point / $next_point*100);
}
$title = sprintf("%s:%s%s %s, %s:%s/%s", Context::getLang('point'), $point, $config->point_name, $per?"(".$per."%)":"", Context::getLang('level'), $level, $config->max_level);
$text = sprintf('<span class="nowrap member_%s" style="cursor:pointer"><img src="%s" alt="%s" title="%s" style="vertical-align:middle;margin-right:3px"/>%s</span>', $member_srl, $level_icon, $title, $title, $text);
$GLOBALS['_pointLevelIcon'][$member_srl] = $text;
}
return $GLOBALS['_pointLevelIcon'][$member_srl];
}
?>

View file

@ -2,7 +2,7 @@
<addon version="0.1">
<title xml:lang="ko">레인보우 링크 애드온</title>
<title xml:lang="zh-CN">Rainbow 链接</title>
<title xml:lang="en">Addon for rainbow links</title>
<title xml:lang="en">Rainbow Link Addon</title>
<title xml:lang="es">Adición Enlace Arco Iris</title>
<title xml:lang="jp">レインボーリンクアドオン</title>
<title xml:lang="ru">Аддон для радужных ссылок</title>
@ -22,7 +22,7 @@
此插件的rainbow.js文件版权属于 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;
</description>
<description xml:lang="en">
This addon adds a file named &quot;rainbow.js&quot; to headers, then linked text will get chameleon(rainbow) color change effect.
This addon will insert the &quot;rainbow.js&quot; file to the header, which will make the linked text to get the chameleon(rainbow) color change effect.
&quot;rainbow.js&quot; Copyrightⓒ2007 &lt;a href=&quot;http://www.dynamicdrive.com&quot; target=&quot;_blank&quot;&gt;Dynamicdrive.com&lt;/a&gt;.
</description>
<description xml:lang="es">

View file

@ -4,12 +4,14 @@
<title xml:lang="jp">リファラー コレクター</title>
<title xml:lang="zh-CN">反向链接统计</title>
<title xml:lang="en">Referer Collector</title>
<title xml:lang="es">Referer Collector</title>
<title xml:lang="ru">Сборщик рефералов</title>
<author email_address="haneul0318@gmail.com" link="http://haneul.zetyx.net" date="2007. 11. 26">
<name xml:lang="ko">haneul</name>
<name xml:lang="jp">Haneul</name>
<name xml:lang="zn-CN">haneul</name>
<name xml:lang="en">haneul</name>
<name xml:lang="es">haneul</name>
<name xml:lang="ru">haneul</name>
<description xml:lang="ko">
Referer log를 수집합니다.
@ -22,6 +24,9 @@
</description>
<description xml:lang="en">
Collect referer log and statistics.
</description>
<description xml:lang="es">
Recoger referer log y estadísticas.
</description>
<description xml:lang="ru">
Собирает лог рефералов и статистику.

View file

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<addon version="0.1">
<title xml:lang="ko">스팸필터 애드온</title>
<title xml:lang="zh-CN">垃圾过滤</title>
<title xml:lang="en">Addon for filtering spam</title>
<title xml:lang="es">Addon para filtrar los Spam</title>
<title xml:lang="jp">スパムフィルター(SpamFilter)アドオン</title>
<title xml:lang="ru">Аддон для фильтрации спама</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="en">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
SpamFilter 모듈을 이용하여 글/코멘트/트랙백 등록 이전에 스팸 필터링 및 도배 방지를 합니다.
자세한 설정은 &quot; 스팸필터 모듈&quot; 에서 해주세요.
</description>
<description xml:lang="zh-CN">
利用垃圾过滤模块在发表主题/评论/引用之前进行垃圾过滤。
请在&quot; 垃圾过滤模块&quot;中详细设置。
</description>
<description xml:lang="en">
This addon filters spam and prevents users from cluttering before saving entries, comments, or trackbacks to database by setting SpamFilter module.
You can set up more details on &quot;Spam Filter module&quot;.
</description>
<description xml:lang="es">
Este addon filtra y previene de los documentos/ commentarios/ trackback no deseado antes de ser agregados.
Para la configuración más detallada, debe hacerse en el &quot; Módulo de Filtro de Spam&quot;.
</description>
<description xml:lang="jp">
SpamFilterモジュールを利用して書き込み・コメント・トラックバックが登録される前にフィルタリングを行います。
更に悪質な連続書き込みやロボットによる自動書き込みなどを防ぐことができます。
詳細な設定は &quot; スパムフィルターモジュール &quot; で行ってください。
</description>
<description xml:lang="ru">
Этот аддон фильтрует спам и предотвращает беспорядок перед сохранением элементов, комментариев или трекбеков в базу данных посредством установки модуля Фильтра Спама.
Вы можете установить детали на странице &quot;Модуля Спам Фильтра&quot;.
</description>
</author>
</addon>

View file

@ -1,6 +0,0 @@
<?php
/**
* 2007. 12. 7 스팸필터 모듈에서 trigger 기능으로 /댓글/엮인글 처리하도록 하여 이상 사용하지 않도록 변경
**/
return;
?>

View file

@ -80,7 +80,7 @@
list($lang_prefix, $lang_text) = explode(',',$val);
$lang_text = trim($lang_text);
$lang_supported[$lang_prefix] = $lang_text;
if(!$this->lang_type && ereg($lang_prefix, strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']))) {
if(!$this->lang_type && preg_match('/'.$lang_prefix.'/i',$_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$this->lang_type = $lang_prefix;
setcookie('lang_type', $this->lang_type, time()+60*60*24*365, '/');
}
@ -106,10 +106,20 @@
$this->_setUploadedArgument();
// 인증관련 데이터를 Context에 설정
$oMember = getModel('member');
if($oMember->isLogged()) {
$oMemberModel = &getModel('member');
// 로그인되어 있지 않고 자동로그인 키값이 있으면 자동 로그인 체크
if(Context::isInstalled() && !$oMemberModel->isLogged() && $_COOKIE['xeak']) {
$oMemberController = &getController('member');
$oMemberController->doAutologin();
}
// 로그인되어 있으면 로그인 정보 기록
if($oMemberModel->isLogged()) {
$this->_set('is_logged', true);
$this->_set('logged_info', $_SESSION['logged_info']);
// 로그인 되어 있지 않으면 먼저 자동 로그인을 체크 비로그인 상태 기록
} else {
$this->_set('is_logged', false);
$this->_set('logged_info', NULL);
@ -504,7 +514,7 @@
**/
function _setUploadedArgument() {
if($this->_getRequestMethod() != 'POST') return;
if(!eregi("^multipart\/form-data", $_SERVER['CONTENT_TYPE'])) return;
if(!preg_match("/multipart\/form-data/i",$_SERVER['CONTENT_TYPE'])) return;
if(!$_FILES) return;
foreach($_FILES as $key => $val) {
@ -575,7 +585,7 @@
} elseif($var_count == 2) {
asort($var_keys);
$target = implode('.',$var_keys);
if($target=='act.mid' && !ereg('([A-Z]+)',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']);
if($target=='act.mid' && !preg_match('/([A-Z]+)/',$get_vars['act'])) return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['act']);
elseif($target=='document_srl.mid') return sprintf('%s%s/%s',$this->path,$get_vars['mid'],$get_vars['document_srl']);
elseif($target=='act.document_srl') return sprintf('%s%s/%s',$this->path,$get_vars['document_srl'],$get_vars['act']);
elseif($target=='mid.page') return sprintf('%s%s/page/%s',$this->path,$get_vars['mid'],$get_vars['page']);
@ -609,11 +619,7 @@
* @brief 요청이 들어온 URL에서 argument를 제거하여 return
**/
function getRequestUri() {
$hostname = $_SERVER['HTTP_HOST'];
//$port = $_SERVER['SERVER_PORT'];
//if($port!=80) $hostname .= ":{$port}";
$path = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);
return sprintf("http://%s%s",$hostname,$path);
return sprintf("http://%s%s",$_SERVER['HTTP_HOST'], getScriptPath());
}
/**
@ -717,8 +723,7 @@
**/
function _addJsFile($file) {
if(in_array($file, $this->js_files)) return;
if(!eregi("^http:\/\/",$file)) $file = str_replace(realpath("."), ".", realpath($file));
//if(!preg_match('/^http:\/\//i',$file)) $file = str_replace(realpath("."), ".", realpath($file));
$this->js_files[] = $file;
}
@ -753,7 +758,7 @@
function _addCSSFile($file) {
if(in_array($file, $this->css_files)) return;
if(!eregi("^http:\/\/",$file)) $file = str_replace(realpath("."), ".", realpath($file));
//if(preg_match('/^http:\/\//i',$file)) $file = str_replace(realpath("."), ".", realpath($file));
$this->css_files[] = $file;
}
@ -868,17 +873,8 @@
// body 내의 <style ..></style>를 header로 이동
$content = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'moveStyleToHeader'), $content);
// <br> 코드 변환
$content = preg_replace('/<br([^>\/]*)(\/>|>)/i','<br$1 />', $content);
// 몇가지 대문자 태그를 소문자로 변경
//$content = preg_replace_callback('!<(\/){0,1}([A-Z]+)([^>]*?)>!s',array($this,'transTagToLowerCase'), $content);
// <img ...> 코드를 <img ... /> 코드로 변환
$content = preg_replace('/<img(.*?)(\/){0,1}>/i','<img$1 />', $content);
// blogapi tool에서 삽입된 코드 삭제
//$content = str_replace('atomicselection="true"','',$content);
// <img|br> 코드 변환
$content = preg_replace('/<(img|br)([^>\/]*)(\/>|>)/i','<$1$2 />', $content);
return $content;
}
@ -894,8 +890,8 @@
* @brief <!--Meta:파일이름.(css|js)--> 변경
**/
function transMeta($matches) {
if(eregi('\.css$', $matches[1])) $this->addCSSFile($matches[1]);
elseif(eregi('\.js$', $matches[1])) $this->addJSFile($matches[1]);
if(substr($matches[1],'-4')=='.css') $this->addCSSFile($matches[1]);
elseif(substr($matches[1],'-3')=='.js') $this->addJSFile($matches[1]);
}
/**

View file

@ -15,6 +15,8 @@
class DB {
var $count_cache_path = './files/cache/db';
var $cond_operation = array( ///< 조건문에서 조건을 등호로 표시하는 변수
'equal' => '=',
'more' => '>=',
@ -83,7 +85,7 @@
for($i=0;$i<count($supported_list);$i++) {
$db_type = $supported_list[$i];
if(version_compare(phpversion(), '5.0') < 0 && eregi('pdo',$db_type)) continue;
if(version_compare(phpversion(), '5.0') < 0 && preg_match('/pdo/i',$db_type)) continue;
$class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1)));
$class_file = sprintf("./classes/db/%s.class.php", $class_name);
@ -220,9 +222,11 @@
// 일단 cache 파일을 찾아본다
$cache_file = sprintf('%s%s.cache.php', $this->cache_file, $query_id);
if(file_exists($cache_file)) $cache_time = filemtime($cache_file);
else $cache_time = -1;
// 없으면 원본 쿼리 xml파일을 찾아서 파싱을 한다
if(!file_exists($cache_file)||filemtime($cache_file)<filemtime($xml_file)) {
// 캐시 파일이 없거나 시간 비교하여 최근것이 아니면 원본 쿼리 xml파일을 찾아서 파싱을 한다
if($cache_time<filemtime($xml_file) || $cache_time < filemtime('./classes/db/DB.class.php')) {
require_once('./classes/xml/XmlQueryParser.class.php');
$oParser = new XmlQueryParser();
$oParser->parse($query_id, $xml_file, $cache_file);
@ -250,12 +254,15 @@
// action값에 따라서 쿼리 생성으로 돌입
switch($output->action) {
case 'insert' :
$this->resetCountCache($output->tables);
$output = $this->_executeInsertAct($output);
break;
case 'update' :
$this->resetCountCache($output->tables);
$output = $this->_executeUpdateAct($output);
break;
case 'delete' :
$this->resetCountCache($output->tables);
$output = $this->_executeDeleteAct($output);
break;
case 'select' :
@ -278,24 +285,24 @@
switch($filter_type) {
case 'email' :
case 'email_address' :
if(!eregi('^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key}?$lang->{$key}:$key));
if(!preg_match('/^[_0-9a-z-]+(\.[_0-9a-z-]+)*@[0-9a-z-]+(\.[0-9a-z-]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_email, $lang->{$key}?$lang->{$key}:$key));
break;
case 'homepage' :
if(!eregi('^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key}?$lang->{$key}:$key));
if(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_homepage, $lang->{$key}?$lang->{$key}:$key));
break;
case 'userid' :
case 'user_id' :
if(!eregi('^[a-zA-Z]+([_0-9a-zA-Z]+)*$', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key}?$lang->{$key}:$key));
if(!preg_match('/^[a-zA-Z]+([_0-9a-zA-Z]+)*$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_userid, $lang->{$key}?$lang->{$key}:$key));
break;
case 'number' :
case 'numbers' :
if(!eregi('^[0-9,]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key));
if(!preg_match('/^[0-9,]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_number, $lang->{$key}?$lang->{$key}:$key));
break;
case 'alpha' :
if(!eregi('^[a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key}?$lang->{$key}:$key));
if(!preg_match('/^[a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha, $lang->{$key}?$lang->{$key}:$key));
break;
case 'alpha_number' :
if(!eregi('^[0-9a-z]+$', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key}?$lang->{$key}:$key));
if(!preg_match('/^[0-9a-z]+$/is', $val)) return new Object(-1, sprintf($lang->filter->invalid_alpha_number, $lang->{$key}?$lang->{$key}:$key));
break;
}
@ -413,7 +420,69 @@
}
return $conditions;
}
/**
* @brief 카운터 캐시 데이터 얻어오기
**/
function getCountCache($tables, $condition) {
if(!$tables) return false;
if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path);
$condition = md5($condition);
if(!is_array($tables)) $tables_str = $tables;
else $tables_str = implode('.',$tables);
$cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str);
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
$cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition);
if(!file_exists($cache_filename)) return false;
$cache_mtime = filemtime($cache_filename);
if(!is_array($tables)) $tables = array($tables);
foreach($tables as $alias => $table) {
$table_filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table) ;
if(file_exists($table_filename) && filemtime($table_filename) > $cache_mtime) return false;
}
$count = (int)FileHandler::readFile($cache_filename);
return $count;
}
/**
* @brief 카운터 캐시 데이터 저장
**/
function putCountCache($tables, $condition, $count = 0) {
if(!$tables) return false;
if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path);
$condition = md5($condition);
if(!is_array($tables)) $tables_str = $tables;
else $tables_str = implode('.',$tables);
$cache_path = sprintf('%s/%s%s', $this->count_cache_path, $this->prefix, $tables_str);
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
$cache_filename = sprintf('%s/%s.%s', $cache_path, $tables_str, $condition);
FileHandler::writeFile($cache_filename, $count);
}
/**
* @brief 카운터 캐시 리셋
**/
function resetCountCache($tables) {
if(!$tables) return false;
if(!is_dir($this->count_cache_path)) return FileHandler::makeDir($this->count_cache_path);
if(!is_array($tables)) $tables = array($tables);
foreach($tables as $alias => $table) FileHandler::writeFile( sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table), '' );
return true;
}
}
?>

View file

@ -415,7 +415,7 @@
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '"'.$this->prefix.$key.'"';
$table_list[] = '"'.$this->prefix.$val.'"';
}
// 컬럼 정리
@ -423,21 +423,21 @@
$name = $val['name'];
$value = $val['value'];
if($this->getColumnType($output->column_type,$name)!='number') {
$clen=strlen($value);
if ($clen <= $this->cutlen)
$value = "'".$this->addQuotes($value)."'";
else {
$wrk="";
$off=0;
while ($off<$clen) {
$wlen=$clen-$off;
if ($wlen>$this->cutlen) $wlen=$this->cutlen;
if ($off>0) $wrk .= "+\n";
$wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'";
$off += $wlen;
}
$value = $wrk;
}
$clen=strlen($value);
if ($clen <= $this->cutlen)
$value = "'".$this->addQuotes($value)."'";
else {
$wrk="";
$off=0;
while ($off<$clen) {
$wlen=$clen-$off;
if ($wlen>$this->cutlen) $wlen=$this->cutlen;
if ($off>0) $wrk .= "+\n";
$wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'";
$off += $wlen;
}
$value = $wrk;
}
if(!$value) $value = 'null';
} elseif(!$value || is_numeric($value)) $value = (int)$value;
@ -456,7 +456,7 @@
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = "\"".$this->prefix.$key."\" as ".$val;
$table_list[] = "\"".$this->prefix.$val."\" as ".$key;
}
// 컬럼 정리
@ -467,21 +467,21 @@
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
else {
if($output->column_type[$name]!='number') {
$clen=strlen($value);
if ($clen <= $this->cutlen)
$value = "'".$this->addQuotes($value)."'";
else {
$wrk="";
$off=0;
while ($off<$clen) {
$wlen=$clen-$off;
if ($wlen>$this->cutlen) $wlen=$this->cutlen;
if ($off>0) $wrk .= "+\n";
$wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'";
$off += $wlen;
}
$value = $wrk;
}
$clen=strlen($value);
if ($clen <= $this->cutlen)
$value = "'".$this->addQuotes($value)."'";
else {
$wrk="";
$off=0;
while ($off<$clen) {
$wlen=$clen-$off;
if ($wlen>$this->cutlen) $wlen=$this->cutlen;
if ($off>0) $wrk .= "+\n";
$wrk .= "'".$this->addQuotes(substr($value, $off, $wlen))."'";
$off += $wlen;
}
$value = $wrk;
}
}
elseif(!$value || is_numeric($value)) $value = (int)$value;
@ -503,7 +503,7 @@
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '"'.$this->prefix.$key.'"';
$table_list[] = '"'.$this->prefix.$val.'"';
}
// 조건절 정리
@ -524,7 +524,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = '"'.$this->prefix.$key.'" as '.$val;
$table_list[] = '"'.$this->prefix.$val.'" as '.$key;
}
if(!$output->columns) {
@ -573,16 +573,16 @@
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
$query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
}
else {
if (count($output->groups))
$query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
else {
if ($condition)
$query = sprintf('%s and inst_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s and inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
else
$query = sprintf('%s where inst_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s where inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
}
}
@ -609,53 +609,53 @@
/**
* @brief 현재 시점의 Stack trace를 보여줌.결과를 fetch
**/
function backtrace()
{
$output = "<div style='text-align: left;'>\n";
$output .= "<b>Backtrace:</b><br />\n";
$backtrace = debug_backtrace();
foreach ($backtrace as $bt) {
$args = '';
foreach ($bt['args'] as $a) {
if (!empty($args)) {
$args .= ', ';
}
switch (gettype($a)) {
case 'integer':
case 'double':
$args .= $a;
break;
case 'string':
$a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? '...' : '');
$args .= "\"$a\"";
break;
case 'array':
$args .= 'Array('.count($a).')';
break;
case 'object':
$args .= 'Object('.get_class($a).')';
break;
case 'resource':
$args .= 'Resource('.strstr($a, '#').')';
break;
case 'boolean':
$args .= $a ? 'True' : 'False';
break;
case 'NULL':
$args .= 'Null';
break;
default:
$args .= 'Unknown';
}
}
$output .= "<br />\n";
$output .= "<b>file:</b> {$bt['line']} - {$bt['file']}<br />\n";
$output .= "<b>call:</b> {$bt['class']}{$bt['type']}{$bt['function']}($args)<br />\n";
}
$output .= "</div>\n";
return $output;
}
function backtrace()
{
$output = "<div style='text-align: left;'>\n";
$output .= "<b>Backtrace:</b><br />\n";
$backtrace = debug_backtrace();
foreach ($backtrace as $bt) {
$args = '';
foreach ($bt['args'] as $a) {
if (!empty($args)) {
$args .= ', ';
}
switch (gettype($a)) {
case 'integer':
case 'double':
$args .= $a;
break;
case 'string':
$a = htmlspecialchars(substr($a, 0, 64)).((strlen($a) > 64) ? '...' : '');
$args .= "\"$a\"";
break;
case 'array':
$args .= 'Array('.count($a).')';
break;
case 'object':
$args .= 'Object('.get_class($a).')';
break;
case 'resource':
$args .= 'Resource('.strstr($a, '#').')';
break;
case 'boolean':
$args .= $a ? 'True' : 'False';
break;
case 'NULL':
$args .= 'Null';
break;
default:
$args .= 'Unknown';
}
}
$output .= "<br />\n";
$output .= "<b>file:</b> {$bt['line']} - {$bt['file']}<br />\n";
$output .= "<b>call:</b> {$bt['class']}{$bt['type']}{$bt['function']}($args)<br />\n";
}
$output .= "</div>\n";
return $output;
}
/**
@ -668,9 +668,13 @@
// 전체 개수를 구함
$count_query = sprintf('select count(*) as "count" from %s %s', implode(',',$table_list), $condition);
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;
@ -696,16 +700,16 @@
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
$query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s for orderby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
}
else {
if (count($output->groups))
$query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s having groupby_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
else {
if ($condition)
$query = sprintf('%s and inst_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s and inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
else
$query = sprintf('%s where inst_num() between %d and %d', $query, $start_count, $list_count);
$query = sprintf('%s where inst_num() between %d and %d', $query, $start_count + 1, $list_count + $start_count);
}
}

View file

@ -57,6 +57,7 @@
function _setDBInfo() {
$db_info = Context::getDBInfo();
$this->hostname = $db_info->db_hostname;
$this->port = $db_info->db_port;
$this->userid = $db_info->db_userid;
$this->password = $db_info->db_password;
$this->database = $db_info->db_database;
@ -71,6 +72,8 @@
// db 정보가 없으면 무시
if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return;
if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port;
// 접속시도
$this->fd = @mysql_connect($this->hostname, $this->userid, $this->password);
if(mysql_error()) {
@ -396,7 +399,7 @@
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'`';
$table_list[] = '`'.$this->prefix.$val.'`';
}
// 컬럼 정리
@ -422,7 +425,7 @@
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'` as '.$val;
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
}
// 컬럼 정리
@ -453,7 +456,7 @@
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'`';
$table_list[] = '`'.$this->prefix.$val.'`';
}
// 조건절 정리
@ -474,7 +477,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'` as '.$val;
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
}
if(!$output->columns) {
@ -547,9 +550,13 @@
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition);
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;

View file

@ -57,6 +57,7 @@
function _setDBInfo() {
$db_info = Context::getDBInfo();
$this->hostname = $db_info->db_hostname;
$this->port = $db_info->db_port;
$this->userid = $db_info->db_userid;
$this->password = $db_info->db_password;
$this->database = $db_info->db_database;
@ -71,6 +72,8 @@
// db 정보가 없으면 무시
if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return;
if(strpos($this->hostname, ':')===false && $this->port) $this->hostname .= ':'.$this->port;
// 접속시도
$this->fd = @mysql_connect($this->hostname, $this->userid, $this->password);
if(mysql_error()) {
@ -121,6 +124,7 @@
**/
function begin() {
if(!$this->isConnected() || $this->transaction_started) return;
$this->transaction_started = true;
$this->_query("begin");
}
@ -405,7 +409,7 @@
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'`';
$table_list[] = '`'.$this->prefix.$val.'`';
}
// 컬럼 정리
@ -431,7 +435,7 @@
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'` as '.$val;
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
}
// 컬럼 정리
@ -462,7 +466,7 @@
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'`';
$table_list[] = '`'.$this->prefix.$val.'`';
}
// 조건절 정리
@ -483,7 +487,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = '`'.$this->prefix.$key.'` as '.$val;
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
}
if(!$output->columns) {
@ -556,9 +560,13 @@
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition);
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;

View file

@ -57,6 +57,7 @@
function _setDBInfo() {
$db_info = Context::getDBInfo();
$this->hostname = $db_info->db_hostname;
$this->port = $db_info->db_port;
$this->userid = $db_info->db_userid;
$this->password = $db_info->db_password;
$this->database = $db_info->db_database;
@ -400,7 +401,7 @@
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
$table_list[] = $this->prefix.$val;
}
// 컬럼 정리
@ -426,7 +427,7 @@
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key.' as '.$val;
$table_list[] = $this->prefix.$val.' as '.$key;
}
// 컬럼 정리
@ -457,7 +458,7 @@
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
$table_list[] = $this->prefix.$val;
}
// 조건절 정리
@ -478,7 +479,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key .' as '.$val;
$table_list[] = $this->prefix.$val.' as '.$key;
}
if(!$output->columns) {
@ -548,9 +549,13 @@
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition);
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;

View file

@ -382,7 +382,7 @@
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
$table_list[] = $this->prefix.$val;
}
// 컬럼 정리
@ -411,7 +411,7 @@
// 대상 테이블이 1개일 경우
if($table_count == 1) {
// 테이블 정리
list($target_table) = array_keys($output->tables);
list($target_table) = array_values($output->tables);
$target_table = $this->prefix.$target_table;
// 컬럼 정리
@ -437,7 +437,7 @@
} elseif($table_count == 2) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[$val] = $this->prefix.$val;
$table_list[$val] = $this->prefix.$key;
}
list($source_table, $target_table) = array_values($table_list);
@ -474,7 +474,7 @@
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
$table_list[] = $this->prefix.$val;
}
// 조건절 정리
@ -495,7 +495,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key.' as '.$val;
$table_list[] = $this->prefix.$val.' as '.$key;
}
if(!$output->columns) {
@ -568,9 +568,13 @@
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition);
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;

View file

@ -412,7 +412,7 @@
function _executeInsertAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
$table_list[] = $this->prefix.$val;
}
// 컬럼 정리
@ -450,7 +450,7 @@
// 대상 테이블이 1개일 경우
if($table_count == 1) {
// 테이블 정리
list($target_table) = array_keys($output->tables);
list($target_table) = array_values($output->tables);
$target_table = $this->prefix.$target_table;
// 컬럼 정리
@ -476,7 +476,7 @@
} elseif($table_count == 2) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[$val] = $this->prefix.$val;
$table_list[$val] = $this->prefix.$key;
}
list($source_table, $target_table) = array_values($table_list);
@ -514,7 +514,7 @@
function _executeDeleteAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key;
$table_list[] = $this->prefix.$val;
}
// 조건절 정리
@ -536,7 +536,7 @@
// 테이블 정리
$table_list = array();
foreach($output->tables as $key => $val) {
$table_list[] = $this->prefix.$key.' as '.$val;
$table_list[] = $this->prefix.$val.' as '.$key;
}
if(!$output->columns) {
@ -609,9 +609,13 @@
// 전체 개수를 구함
$count_query = sprintf("select count(*) as count from %s %s", implode(',',$table_list), $condition);
$this->_prepare($count_query);
$count_output = $this->_execute();
$total_count = (int)$count_output->count;
$total_count = $this->getCountCache($output->tables, $condition);
if($total_count === false) {
$this->_prepare($count_query);
$count_output = $this->_execute();
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
}
$list_count = $output->list_count['value'];
if(!$list_count) $list_count = 20;

View file

@ -28,7 +28,8 @@
$this->_printHeader();
// request method에 따른 처리
$content = $this->getContent($oModule);
if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule);
else $content = $this->_toHTMLDoc($oModule);
// 요청방식에 따라 출력을 별도로
if(Context::getResponseMethod()!="XMLRPC") {
@ -86,36 +87,13 @@
function display($content) {
$content .= $this->_debugOutput();
$path = str_replace('index.php','',$_SERVER['SCRIPT_NAME']);
// commons/modules/files/widgets/layouts/addons 로 시작되는 src나 href의 값을 절대경로로 변경
$content = preg_replace('!(href|src)=("|\'){0,1}(commons|modules|widgets|layouts|addons|files)!is', '\\1=\\2'.$path.'\\3', $content);
$content = preg_replace('!(href|src)=("|\'){0,1}\.\/([a-zA-Z0-9\_^\/]+)\/!is', '\\1=\\2'.$path.'\\3/', $content);
// 출력하기 전에 trigger 호출 (after)
ModuleHandler::triggerCall('display', 'after', $content);
if($this->gz_enabled) print ob_gzhandler($content, 5);
else print $content;
}
/**
* @brief 모듈 객체의 content return
**/
function getContent(&$oModule) {
return $this->_toDoc($oModule);
}
/**
* @brief 모듈 객체의 content return
**/
function _toDoc(&$oModule) {
if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule);
else $content = $this->_toHTMLDoc($oModule);
return $content;
}
/**
* @brief RequestMethod가 XML이면 XML 데이터로 컨텐츠 생성
**/

View file

@ -14,11 +14,11 @@
**/
function readFile($file_name) {
if(!file_exists($file_name)) return;
$filesize = filesize($file_name);
if($filesize<1) return;
if(function_exists('file_get_contents')) return file_get_contents($file_name);
$fp = fopen($file_name, "r");
$buff = '';
if($fp) {
@ -263,7 +263,7 @@
}
// 디렉토리 생성
$path = preg_replace('/\/([^\.^\/]*)\.(gif|png|jpeg|bmp|wbmp)$/i','',$target_file);
$path = preg_replace('/\/([^\.^\/]*)\.(gif|png|jpg|jpeg|bmp|wbmp)$/i','',$target_file);
FileHandler::makeDir($path);
// 원본 이미지의 크기를 조절해서 임시 이미지에 넣음

View file

@ -106,7 +106,7 @@
}
function isVaildMailAddress($email_address) {
if( eregi("([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)", $email_address) ) return $email_address;
if( preg_match("/([a-z0-9\_\-\.]+)@([a-z0-9\_\-\.]+)/i", $email_address) ) return $email_address;
else return '';
}
}

View file

@ -57,9 +57,9 @@
else $this->module_srl = (int)$module_srl;
// 기본 변수들의 검사 (XSS방지를 위한 기초적 검사)
if($this->module && !eregi("^([a-z0-9\_\-]+)$",$this->module)) die(Context::getLang("msg_invalid_request"));
if($this->mid && !eregi("^([a-z0-9\_\-]+)$",$this->mid)) die(Context::getLang("msg_invalid_request"));
if($this->act && !eregi("^([a-z0-9\_\-]+)$",$this->act)) die(Context::getLang("msg_invalid_request"));
if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request"));
if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request"));
if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request"));
// 애드온 실행 (모듈 실행 전)
$called_position = 'before_module_init';
@ -73,7 +73,7 @@
// ModuleModel 객체 생성
$oModuleModel = &getModel('module');
// document_srl이 있으면 document_srl로 모듈과 모듈 정보를 구함
// document_srl만 있을 경우 document_srl로 모듈과 모듈 정보를 구함
if($this->document_srl && !$this->mid && !$this->module_srl) {
$module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl);
if($this->module && $module_info->module != $this->module) unset($module_info);
@ -102,6 +102,10 @@
Context::setBrowserTitle($module_info->browser_title);
}
// 모듈정보에 module과 mid를 강제로 지정
$this->module_info->module = $this->module;
$this->mid = $this->mid;
// 여기까지도 모듈 정보를 찾지 못했다면 깔끔하게 시스템 오류 표시
if(!$this->module) $this->error = 'msg_module_is_not_exists';
@ -143,14 +147,6 @@
return;
}
// 설정된 mid가 없을 경우 요청된 act의 standalone 여부 체크
/*
if(!$this->mid && !$xml_info->action->{$this->act}->standalone) {
$this->error = 'msg_module_is_not_standalone';
return;
}
*/
// type, grant 값 구함
$type = $xml_info->action->{$this->act}->type;
$grant = $xml_info->action->{$this->act}->grant;
@ -206,6 +202,7 @@
// 해당 모듈에 layout_srl이 있는지 확인
if($oModule->module_info->layout_srl && !$oModule->getLayoutFile()) {
// layout_srl이 있으면 해당 레이아웃 정보를 가져와 layout_path/ layout_file 위치 변경
$oLayoutModel = &getModel('layout');
$layout_info = $oLayoutModel->getLayout($oModule->module_info->layout_srl);

View file

@ -84,19 +84,31 @@
$logged_info = Context::get('logged_info');
$user_id = $logged_info->user_id;
$user_group = $logged_info->group_list;
$grant->is_admin = false;
// 로그인되어 있다면 admin 체크
if($is_logged && ($logged_info->is_admin == 'Y' || (is_array($this->module_info->admin_id)&&in_array($user_id, $this->module_info->admin_id) )) ) {
$grant->is_admin = true;
} else {
$grant->is_admin = false;
}
// 로그인되어 있다면 관리자 여부를 확인
if($is_logged) {
/* 로그인 사용자에 대한 관리자 여부는 다양한 방법으로 체크가 됨 */
// 1. 최고관리자일 경우
if($logged_info->is_admin == 'Y') {
$grant->is_admin = true;
// module.xml 에 있는 권한 정보를 정리
if($module_info->grants) {
foreach($module_info->grants as $key => $val) {
if(!$xml_info->grant->{$key}) {
$xml_info->grant->{$key}->title = $key;
// 2. 최고 관리자는 아니지만 모듈 object가 있고 admin_id 컬럼에 로그인 사용자의 아이디가 있을 경우
} elseif($this->module_info->admin_id) {
if(is_array($this->module_info->admin_id) && in_array($user_id, $this->module_info->admin_id)) $grant->is_admin = true;
// 4. 1/2번이 아닐 경우 그룹을 체크하고 직접 모듈에 요청을 하여 체크를 함. (모듈.class.php에 정의)
} else {
$manager_group = $this->module_info->grants['manager'];
if(count($user_group) && count($manager_group)) {
foreach($user_group as $group_srl => $group_info) {
if(in_array($group_srl, $manager_group)) $grant->is_admin = true;
}
}
if(!$grant->is_admin && $module_info->module) {
$oClass = &getClass($module_info->module);
if($oClass && method_exists($oClass, 'isAdmin')) $grant->is_admin = $oClass->isAdmin();
}
}
}

View file

@ -42,19 +42,20 @@
foreach($source_files as $file) {
if(!$file) continue;
$file = str_replace("\\","/",$file);
if(eregi("^http:\/\/",$file) || $file == './common/css/button.css') $files[] = $file;
if(preg_match('/^http:\/\//i', $file) || $file == './common/css/button.css') $files[] = $file;
else $targets[] = $file;
}
if(!count($targets)) return $files;
$hashed_filename = $this->getHashFilename($targets);
$optimized_info = $this->getOptimizedInfo($targets);
$filename = sprintf("%s%s.%s.php", $this->cache_path, $hashed_filename, $type);
$path = sprintf("%s%s", $this->cache_path, $optimized_info[0]);
$filename = sprintf("%s.%s.%s.php", $optimized_info[0], $optimized_info[1], $type);
$this->doOptimizedFile($filename, $targets, $type);
$this->doOptimizedFile($path, $filename, $targets, $type);
$files[] = $filename;
$files[] = $path.'/'.$filename;
return $files;
@ -62,28 +63,40 @@
/**
* @brief optimize는 대상 파일을 \n로 연결후 md5 hashing하여 파일이름의 중복을 피함
* 개별 파일과 optimizer 클래스 파일의 변경을 적용하기 위해 파일들과 Optimizer.class.php의 filemtime을 비교, 파일이름에 반영
**/
function getHashFilename($files) {
function getOptimizedInfo($files) {
// 개별 요소들 또는 Optimizer.class.php파일이 갱신되었으면 새로 옵티마이징
$count = count($files);
$last_modified = 0;
for($i=0;$i<$count;$i++) {
$mtime = filemtime($files[$i]);
if($last_modified < $mtime) $last_modified = $mtime;
}
$buff = implode("\n", $files);
return md5($buff);
return array(md5($buff), $last_modified);
}
/**
* @brief 이미 저장된 캐시 파일과의 시간등을 검사하여 새로 캐싱해야 할지를 체크
**/
function doOptimizedFile($filename, $targets, $type) {
if(!file_exists($filename)) return $this->makeOptimizedFile($filename, $targets, $type);
function doOptimizedFile($path, $filename, $targets, $type) {
// 대상 파일이 있으면 그냥 패스~
if(file_exists($path.'/'.$filename)) return;
$mtime = filemtime($filename);
foreach($targets as $file) {
if($mtime < filemtime($file)) return $this->makeOptimizedFile($filename, $targets, $type);
}
// 대상 파일이 없으면 hashed_filename으로 생성된 파일들을 모두 삭제
FileHandler::removeFilesInDir($path);
// 새로 캐시 파일을 생성
$this->makeOptimizedFile($path, $filename, $targets, $type);
}
/**
* @brief css나 js파일을 묶어서 하나의 파일로 만들고 gzip 압축이나 헤더등을 통제하기 위해서 php파일을 별도로 만들어서 진행함
**/
function makeOptimizedFile($filename, $targets, $type) {
function makeOptimizedFile($path, $filename, $targets, $type) {
/**
* 실제 css나 js의 내용을 합친 것을 구함
**/
@ -100,58 +113,85 @@
}
if($type == "css") $content_buff = '@charset "utf-8";'."\n".$content_buff;
if($type!="css" && Context::isGzEnabled()) $content_buff = ob_gzhandler($content_buff, 5);
$content_file = eregi_replace("\.php$","",$filename);
$content_filename = str_replace($this->cache_path, '', $content_file);
FileHandler::writeFile($content_file, $content_buff);
$content_filename = substr($filename, 0, -4);
FileHandler::writeFile($path.'/'.$content_filename, $content_buff);
/**
* 압축을 지원하고 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함
* 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함
**/
// php의 헤더파일 생성
// gzip 압축 체크
if($type!="css" && Context::isGzEnabled()) $gzip_header = 'header("Content-Encoding: gzip");';
// 확장자별 content-type 체크
if($type == 'css') $content_type = 'text/css';
elseif($type == 'js') $content_type = 'text/javascript';
elseif($type == 'js') $content_type = 'application/x-javascript';
$header_buff = <<<EndOfBuff
<?php
header("Content-Type: {$content_type}; charset=UTF-8");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Content-Length: ".filesize('{$content_filename}'));
{$gzip_header}
if(@file_exists("{$content_filename}")) {
@fpassthru(fopen("{$content_filename}", "r"));
// 캐시를 위한 처리
$unique = crc32($content_filename);
$size = filesize($path.'/'.$content_file);
$mtime = filemtime($path.'/'.$content_file);
// js, css 파일을 php를 통해서 출력하고 이 출력시에 헤더값을 조작하여 캐싱과 압축전송이 되도록 함 (IE6는 CSS파일일 경우 gzip압축하지 않음)
$header_buff = '<?php
$content_filename = "'.$content_filename.'";
$mtime = '.$mtime.';
$cached = false;
$type = "'.$type.'";
if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
$time = strtotime(preg_replace("/;.*$/", "", $_SERVER["HTTP_IF_MODIFIED_SINCE"]));
if($mtime == $time) {
header("HTTP/1.1 304");
$cached = true;
}
}
exit();
?>
EndOfBuff;
FileHandler::writeFile($filename, $header_buff);
if( preg_match("/MSIE 6.0/i",$_SERVER["HTTP_USER_AGENT"]) || strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip")===false || !function_exists("ob_gzhandler") ) {
$size = filesize($content_filename);
} else {
$f = fopen($content_filename,"r");
$buff = fread($f, filesize($content_filename));
fclose($f);
$buff = ob_gzhandler($buff, 5);
$size = strlen($buff);
header("Content-Encoding: gzip");
}
header("Content-Type: '.$content_type.'; charset=utf-8");
header("Date: '.substr(gmdate('r'), 0, -5).'GMT");
header("Expires: '.substr(gmdate('r', strtotime('+1 MONTH')), 0, -5).'GMT");
header("Cache-Control: private, max-age=2592000");
header("Pragma: cache");
header("Last-Modified: '.substr(gmdate('r', $mtime), 0, -5).'GMT");
header("ETag: \"'.dechex($unique).'-".dechex($size)."-'.dechex($mtime).'\"");
if(!$cached) {
if(!$buff) {
$f = fopen($content_filename,"r");
fpassthru($f);
} else print $buff;
}
?>';
FileHandler::writeFile($path.'/'.$filename, $header_buff);
}
/**
* @brief css의 경우 import/ background 등의 속성에서 사용되는 url내의 경로를 변경시켜줌
**/
function replaceCssPath($file, $str) {
$this->tmp_css_path = Context::getRequestUri().ereg_replace("^\.\/","",dirname($file))."/";
$str = preg_replace_callback('!url\(("|\')?([^\)]+)("|\')?\)!is', array($this, '_replaceCssPath'), $str);
// css 파일의 위치를 구함
$this->tmp_css_path = './'.preg_replace("/^\.\//is","",dirname($file))."/";
// url() 로 되어 있는 css 파일의 경로를 변경
$str = preg_replace_callback('!url\(("|\')?([^\)]+)("|\')?\)!is', array($this, '_replaceCssPath'), $str);
$str = preg_replace('!\/([^\/]*)\/\.\.\/!is','/', $str);
// charset 지정 문구를 제거
$str = preg_replace('!@charset([^;]*?);!is','',$str);
return $str;
}
function _replaceCssPath($matches) {
if(eregi("^(http|\/|\.\/common\/)",$matches[2])) return $matches[0];
if(preg_match("/^(http|\/|\.\/common\/)/is",$matches[2])) return $matches[0];
return sprintf('url(%s%s)', $matches[1], $this->tmp_css_path.$matches[2]);
}

View file

@ -38,7 +38,7 @@
if(__DEBUG__==3 ) $start = getMicroTime();
// 변수 체크
$tpl_path = ereg_replace('(\/+)$', '', $tpl_path).'/';
if(substr($tpl_path,-1)!='/') $tpl_path .= '/';
if(substr($tpl_filename,-5)!='.html') $tpl_filename .= '.html';
// tpl_file 변수 생성
@ -104,13 +104,13 @@
//$buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff);
// 이미지 태그 img의 src의 값이 http:// 나 / 로 시작하지 않으면 제로보드의 root경로부터 시작하도록 변경
$buff = preg_replace_callback('!(img|input)([^>]*)src=[\'"]{1}(.*?)[\'"]{1}!is', array($this, '_compileImgPath'), $buff);
$buff = preg_replace_callback('/(img|input)([^>]*)src=[\'"]{1}(?!http)(.*?)[\'"]{1}/is', array($this, '_compileImgPath'), $buff);
// 변수를 변경
$buff = preg_replace_callback('/\{[^@^ ]([^\}]+)\}/i', array($this, '_compileVarToContext'), $buff);
$buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff);
// 결과를 출력하지 않는 구문 변경
$buff = preg_replace_callback('/\{\@([^\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff);
$buff = preg_replace_callback('/\{\@([^\{\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff);
// <!--@, --> 의 변경
$buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff);
@ -145,7 +145,7 @@
$str1 = $matches[0];
$str2 = $path = $matches[3];
if(!eregi("^([a-z0-9\_\.])",$path)) return $str1;
if(!preg_match('/^([a-z0-9\_\.])/i',$path)) return $str1;
$path = preg_replace('/^(\.\/|\/)/','',$path);
$path = '<?php echo $this->tpl_path?>'.$path;
@ -205,7 +205,7 @@
$tmp_arr = explode("/", $arg);
for($i=0;$i<count($tmp_arr);$i++) {
$item1 = trim($tmp_arr[$i]);
if($item1=='.'||eregi("\.html$",$item1)) continue;
if($item1=='.'||substr($item1,-5)=='.html') continue;
$tmp2_arr = explode(".",$item1);
for($j=0;$j<count($tmp2_arr);$j++) {
@ -260,7 +260,7 @@
if(!$given_file) return;
// given_file이 lang으로 끝나게 되면 언어팩을 읽도록 함
if(ereg('lang$', $given_file)) {
if(substr($given_file, -4)=='lang') {
if(substr($given_file,0,2)=='./') $given_file = substr($given_file, 2);
$lang_dir = sprintf('%s%s', $this->tpl_path, $given_file);
if(is_dir($lang_dir)) $output = sprintf('<?php Context::loadLang("%s"); ?>', $lang_dir);
@ -343,10 +343,7 @@
@include($compiled_tpl_file);
}
$output = ob_get_contents();
ob_end_clean();
return $output;
return ob_get_clean();
}
}
?>

View file

@ -12,23 +12,51 @@
/**
* @brief 위젯 캐시 처리
**/
function getCache($sequence, $cache) {
if(!$sequence || !$cache) return;
function getCache($widget, $args) {
$cache_path = './files/cache/widget_cache/';
if(!is_dir($cache_path)) {
FileHandler::makeDir($cache_path);
return;
// widget, 캐시 번호와 캐시값이 설정되어 있는지 확인
$widget_sequence = $args->widget_sequence;
$widget_cache = $args->widget_cache;
/**
* 캐시 번호와 캐시 값이 아예 없으면 바로 데이터를 추출해서 리턴
**/
if(!$widget_cache || !$widget_sequence) {
$oWidget = WidgetHandler::getObject($widget);
if(!$oWidget) return;
return $oWidget->proc($args);
}
$cache_file = sprintf('%s%d.%s.cache', $cache_path, $sequence, Context::getLangType());
if(!file_exists($cache_file)) return;
/**
* 캐시 번호와 캐시값이 설정되어 있으면 캐시 파일을 불러오도록
**/
// 캐시 디렉토리가 없으면 생성
$cache_path = './files/cache/widget_cache/';
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
$filemtime= filemtime($cache_file);
if($filemtime + $cache*60 < time()) return;
// 캐시파일명을 구함
$cache_file = sprintf('%s%d.%s.cache', $cache_path, $widget_sequence, Context::getLangType());
$output = FileHandler::readFile($cache_file);
return $output;
// 캐시 파일이 존재하면 해당 파일의 유효성 검사
if(file_exists($cache_file)) {
$filemtime = filemtime($cache_file);
// 수정 시간을 비교해서 캐싱중이어야 하거나 WidgetHandler.class.php 파일보다 나중에 만들어 졌다면 캐시값을 return
if($filemtime + $widget_cache*60 > time() && $filemtime > filemtime('./classes/widget/WidgetHandler.class.php')) {
return FileHandler::readFile($cache_file);
}
}
// 캐시를 새로 해야 할 경우임
$oWidget = WidgetHandler::getObject($widget);
if(!$oWidget) return;
$widget_content = $oWidget->proc($args);
WidgetHandler::writeCache($widget_sequence, $widget_content);
return $widget_content;
}
/**
@ -42,128 +70,148 @@
/**
* @brief 위젯을 찾아서 실행하고 결과를 출력
* <div widget='위젯'...></div> 태그 사용 templateHandler에서 WidgetHandler::execute() 실행하는 코드로 대체하게 된다
* 태그 사용 templateHandler에서 WidgetHandler::execute() 실행하는 코드로 대체하게 된다
*
* $include_info가 true일 경우 css 코드와 위젯핸들링을 위한 코드까지 포함하도록 한다
* $include_info가 true일 경우 페이지 수정시 위젯 핸들링을 위한 코드까지 포함함
**/
function execute($widget, $args, $include_info = false) {
// 디버그를 위한 위젯 실행 시간 저장
if(__DEBUG__==3) $start = getMicroTime();
// widget중 widgetContent 는 page 모듈에 종속적인 위젯으로 직접 page.admin.controller.php를 호출하여 처리를 해야 함 (차후 정리 필요)
if($widget == 'widgetContent') {
$style = $args->style;
$body = base64_decode($args->body);
$widget_padding_left = $args->widget_padding_left;
$widget_padding_right = $args->widget_padding_right;
$widget_padding_top = $args->widget_padding_top;
$widget_padding_bottom = $args->widget_padding_bottom;
if($include_info) {
$oWidgetController = &getController('widget');
$tpl = $oWidgetController->transEditorContent($body, $args);
} else {
$tpl = sprintf('<div style="overflow:hidden;%s"><div style="padding:%s %s %s %s;">%s</div></div>', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $body);
// args값에서 urldecode를 해줌
$object_vars = get_object_vars($args);
if(count($object_vars)) {
foreach($object_vars as $key => $val) {
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right'))) continue;
$args->{$key} = utf8RawUrlDecode($val);
}
return $tpl;
// widget Box일 경우 간단히 변경만 시도함
} else if($widget == 'widgetBox') {
$style = $args->style;
$widget_padding_left = $args->widget_padding_left;
$widget_padding_right = $args->widget_padding_right;
$widget_padding_top = $args->widget_padding_top;
$widget_padding_bottom = $args->widget_padding_bottom;
if($include_info) {
$tpl = sprintf('<div class="widgetOutput" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s"><div class="widgetBoxCopy"></div><div class="widgetBoxSize"></div><div class="widgetBoxRemove"></div><div class="widgetBoxResize"></div><div class="widgetBoxResizeLeft"></div><div class="widgetBoxBorder"><div class="nullWidget" style="padding:%s %s %s %s;">', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
} else {
$tpl = sprintf('<div style="overflow:hidden;%s;"><div style="padding:%s %s %s %s;"><div>%s', $style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $body);
}
return $tpl;
}
// 설치된 위젯들에 대한 처리
if(!is_dir(sprintf('./widgets/%s/',$widget))) return;
/**
* 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함
**/
if($widget != 'widgetContent' && $widget != 'widgetBox') {
if(!is_dir(sprintf('./widgets/%s/',$widget))) return;
$cache_path = './files/cache/widget_cache/';
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
// 위젯의 내용을 담을 변수
$widget_content = WidgetHandler::getCache($widget, $args);
}
// $widget의 객체를 받음
$oWidget = WidgetHandler::getObject($widget);
if(!$oWidget) return;
/**
* 관리자가 지정한 위젯의 style을 구함
**/
// 가끔 잘못된 코드인 background-image:url(none)이 들어 있을 수가 있는데 이럴 경우 none에 대한 url을 요청하므로 무조건 제거함
$style = preg_replace('/background\-image: url\(none\)/is','', $args->style);
// 위젯 output을 생성하기 위한 변수 설정
$widget_padding_top = $args->widget_padding_top;
$widget_padding_bottom = $args->widget_padding_bottom;
// 내부 여백을 둔 것을 구해서 style문으로 미리 변경해 놓음
$widget_padding_left = $args->widget_padding_left;
$widget_padding_right = $args->widget_padding_right;
$widget_padding_top = $args->widget_padding_top;
$widget_padding_bottom = $args->widget_padding_bottom;
$inner_style = sprintf("padding:%dpx %dpx %dpx %dpx !important; padding:none !important;", $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
/**
* 출력을 위해 위젯 내용을 div로 꾸밈
* 위젯 출력물을 구함
**/
// 서비스에 사용하기 위해 위젯 정보를 포함하지 않을 경우
// 일반 페이지 호출일 경우 지정된 스타일만 꾸면서 바로 return 함
if(!$include_info) {
switch($widget) {
// 내용 직접 추가일 경우
case 'widgetContent' :
$body = base64_decode($args->body);
$output = sprintf('<div style="overflow:hidden;%s"><div style="%s" class="xe_content">%s</div></div>', $style, $inner_style, $body);
break;
// 위젯 실행
$html = $oWidget->proc($args);
$output = sprintf('<div style="overflow:hidden;%s;"><div style="%s">%s</div></div>', $args->style, $inner_style, $html);
// 위젯 박스일 경우
case 'widgetBox' :
$output = sprintf('<div style="overflow:hidden;%s;"><div style="%s"><div>', $style, $inner_style);
break;
// 위젯 sequence가 있고 위젯의 캐싱을 지정하였고 위젯정보를 담지 않도록 하였을 경우 캐시 파일을 저장
if($args->widget_sequence && $args->widget_cache) WidgetHandler::writeCache($args->widget_sequence, $output);
// 일반 위젯일 경우
default :
$output = sprintf('<div style="overflow:hidden;%s;"><div style="%s">%s</div></div>', $style, $inner_style, $widget_content);
break;
}
// 에디팅등에 사용하기 위한 목적으로 위젯 정보를 포함할 경우
// 페이지 수정시에 호출되었을 경우 위젯 핸들링을 위한 코드 추가
} else {
// 위젯 실행
//if($args->widget_sequence && $args->widget_cache) $html = WidgetHandler::getCache($args->widget_sequence, $args->widget_cache);
//if(!$html) $html = $oWidget->proc($args);
$html = $oWidget->proc($args);
switch($widget) {
// 내용 직접 추가일 경우
case 'widgetContent' :
$body = base64_decode($args->body);
$oWidgetController = &getController('widget');
// args 정리
$attribute = array();
if($args) {
foreach($args as $key => $val) {
if($key == 'class' || $key == 'style') continue;
if(strpos($val,'|@|')>0) {
$val = str_replace('|@|',',',$val);
}
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
}
$output = sprintf(
'<div class="widgetOutput" style="%s" widget_padding_left="%s" widget_padding_right="%s" widget_padding_top="%s" widget_padding_bottom="%s" widget="widgetContent">'.
'<div class="widgetSetup"></div>'.
'<div class="widgetCopy"></div>'.
'<div class="widgetSize"></div>'.
'<div class="widgetRemove"></div>'.
'<div class="widgetResize"></div>'.
'<div class="widgetResizeLeft"></div>'.
'<div class="widgetBorder">'.
'<div style="%s">'.
'%s'.
'</div><div class="clear"></div>'.
'</div>'.
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">%s</div>'.
'</div>',
$style,
$args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom,
$inner_style,
$body,
base64_encode($body)
);
break;
// 위젯 박스일 경우
case 'widgetBox' :
$output = sprintf(
'<div class="widgetOutput" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s">'.
'<div class="widgetBoxCopy"></div>'.
'<div class="widgetBoxSize"></div>'.
'<div class="widgetBoxRemove"></div>'.
'<div class="widgetBoxResize"></div>'.
'<div class="widgetBoxResizeLeft"></div>'.
'<div class="widgetBoxBorder">'.
'<div class="nullWidget" style="%s">',
$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left, $inner_style);
break;
// 일반 위젯일 경우
default :
// args 정리
$attribute = array();
if($args) {
foreach($args as $key => $val) {
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget'))) continue;
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
}
}
$output = sprintf(
'<div class="widgetOutput" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
'<div class="widgetSetup"></div>'.
'<div class="widgetCopy"></div>'.
'<div class="widgetSize"></div>'.
'<div class="widgetRemove"></div>'.
'<div class="widgetResize"></div>'.
'<div class="widgetResizeLeft"></div>'.
'<div class="widgetBorder">'.
'<div style="%s">'.
'%s'.
'</div><div class="clear"></div>'.
'</div>'.
'</div>',
$style,
$widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,
$widget, implode(' ',$attribute),
$inner_style,
$widget_content
);
break;
}
// 결과물에 있는 css Meta 목록을 구해와서 해당 css를 아예 읽어버림
require_once("./classes/optimizer/Optimizer.class.php");
$oOptimizer = new Optimizer();
preg_match_all('!<\!\-\-Meta:([^\-]*?)\-\->!is', $html, $matches);
$css_header = null;
for($i=0;$i<count($matches[1]);$i++) {
$css_file = $matches[1][$i];
$buff = FileHandler::readFile($css_file);
$css_header .= $oOptimizer->replaceCssPath($css_file, $buff)."\n";
}
if(!$html) $html = '&nbsp;';
$output = sprintf(
'<div class="widgetClass"><style type="text/css">%s</style></div>'.
'<div class="widgetOutput" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
'<div class="widgetSetup"></div>'.
'<div class="widgetCopy"></div>'.
'<div class="widgetSize"></div>'.
'<div class="widgetRemove"></div>'.
'<div class="widgetResize"></div>'.
'<div class="widgetResizeLeft"></div>'.
'<div class="widgetBorder">'.
'<div style="%s">'.
'%s'.
'</div><div class="clear"></div>'.
'</div>'.
'</div>',
$css_header,
$args->style,
$widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,
$widget, implode(' ',$attribute),
$inner_style,
$html
);
}
// 위젯 결과물 생성 시간을 debug 정보에 추가

View file

@ -46,7 +46,7 @@
$alias = $val->attrs->alias;
if(!$alias) $alias = $table_name;
$output->tables[$table_name] = $alias;
$output->tables[$alias] = $table_name;
// 테이블을 찾아서 컬럼의 속성을 구함
$table_file = sprintf('./%s/%s/schemas/%s.xml', 'modules', $module, $table_name);

View file

@ -23,7 +23,7 @@ IE7 & IE6 & Below
.nowrap { white-space:nowrap; }
/* default.css - Type Selector Definition */
* { margin:0; padding:0; }
body,p,div,ul,ol,li,dd,dt,span,fieldset,h1,h2,h3,h4,h5,h6 { margin:0; padding:0; }
html { width:100%; }
body { margin:0; font-size:.75em; _font-size:9pt; font-family:sans-serif;}
*:first-child+html body { font-size:9pt; }
@ -70,7 +70,6 @@ form { margin:0; padding:0; }
.w300 { width:300px; }
.w400 { width:400px; }
/* editor style */
a.bold { font-weight:bold; }
@ -88,15 +87,20 @@ a.bold { font-weight:bold; }
.folder_area { display: none; }
.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;}
.member_signature { margin-top:10px; border:1px solid #DDDDDD; padding:10px; overflow:hidden;}
.member_profile_image { float:left; margin-right:10px; }
/* xe content */
div.xe_content { line-height:140%; !important}
div.xe_content ol { margin-left:40px; !important}
div.xe_content ul { margin-left:40px; !important}
div.xe_content blockquote { margin-left:40px; !important}
/* xe layer */
#waitingforserverresponse { display:inline; border:2px solid #444444; background-color:#FFFFFF; padding:15px 20px 13px 20px; font-weight:bold; color:#444444; top:40px; left:40px; position:absolute; z-index:100; visibility:hidden; }
#fororiginalimageareabg { z-index:1001; background-color:#FFFFFF; width:100%; height:100%; top:0px; left:0px; position:relative; padding:20px 10px 10px 10px; border:8px solid #DDDDDD; }
#fororiginalimagearea { visibility:hidden; padding:0px; margin:0px; width:100%; height:100%; top:0px; left:0px; position:absolute; z-index:1000; text-align:left; overflow:hidden; }
#fororiginalimage { z-index:1002; }
#closeOriginalImageBtn { position:absolute; right:8px; top:5px; cursor:pointer; width:50px; height:12px; z-index:1003; }
#popup_menu_area { position:absolute; left:0px; top:0px; z-index:1003; visibility:hidden; border:2px solid #D9D9D9; background-color:#FFFFFF; padding:0; }
#popup_menu_area .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; line-height:22px;}
#popup_menu_area .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 0; white-space:nowrap; height:22px;}
#popup_menu_area .item_on { color:#333333; font-weight:bold; margin:0; cursor:pointer; padding:3px 0 3px 0; height:22px; letter-spacing:-1px; white-space:nowrap;}
#popup_menu_area .box { border:1px solid #CACACA; background-color:#FFFFFF; padding:7px; }
#popup_menu_area .item { color:#333333; cursor:pointer; margin:0; padding:3px 0 3px 0; white-space:nowrap; }
#popup_menu_area .item_on { color:#333333; font-weight:bold; margin:0; cursor:pointer; padding:3px 0 3px 0; letter-spacing:-1px; white-space:nowrap;}

View file

@ -168,15 +168,16 @@ function move_url(url, open_wnidow) {
**/
function toggleDisplay(obj, opt) {
obj = xGetElementById(obj);
if(!obj) return;
if(typeof(opt)=="undefined") opt = "inline";
if(obj.style.display == "none") obj.style.display = opt;
else obj.style.display = "none";
if(!obj.style.display || obj.style.display == "block") obj.style.display = 'none';
else obj.style.display = opt;
}
/**
* @brief 멀티미디어 출력용 (IE에서 플래쉬/동영상 주변에 점선 생김 방지용)
**/
function displayMultimedia(src, width, height, auto_start) {
function displayMultimedia(src, width, height, auto_start, flashvars) {
if(src.indexOf('files')==0) src = request_uri+src;
if(auto_start) auto_start = "true";
else auto_start = "false";
@ -185,15 +186,18 @@ function displayMultimedia(src, width, height, auto_start) {
var codebase = "";
var html = "";
if(typeof(flashvars)=="undefined") flashvars = "";
if(/\.swf/i.test(src)) {
clsid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000";
codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0";
html = ""+
"<object classid=\""+clsid+"\" codebase=\""+codebase+"\" width=\""+width+"\" height=\""+height+"\" >"+
"<object classid=\""+clsid+"\" codebase=\""+codebase+"\" width=\""+width+"\" height=\""+height+"\" flashvars=\""+flashvars+"\">"+
"<param name=\"wmode\" value=\"transparent\" />"+
"<param name=\"allowScriptAccess\" value=\"sameDomain\" />"+
"<param name=\"movie\" value=\""+src+"\" />"+
"<param name=\"quality\" value=\"high\" />"+
"<param name=\"flashvars\" value=\""+flashvars+"\" />"+
"<embed src=\""+src+"\" autostart=\""+auto_start+"\" width=\""+width+"\" height=\""+height+"\" wmode=\"transparent\"></embed>"+
"<\/object>";
} else if(/\.flv/i.test(src)) {
@ -224,10 +228,10 @@ function resizeImageContents() {
// 상위 node의 className이 document_ 또는 comment_ 로 시작하지 않으면 패스
var parent = obj.parentNode;
while(parent) {
if(parent.className && parent.className.search(/document_|comment_/i) != -1) break;
if(parent.className && parent.className.search(/xe_content|document_|comment_/i) != -1) break;
parent = parent.parentNode;
}
if (!parent || parent.className.search(/document_|comment_/i) < 0) continue;
if (!parent || parent.className.search(/xe_content|document_|comment_/i) < 0) continue;
if(parent.parentNode) xWidth(parent, xWidth(parent.parentNode));
parent.style.width = '100%';
@ -595,8 +599,8 @@ function displayPopupMenu(ret_obj, response_tags, params) {
if(!str || !func) continue;
if(icon) html += "<span class=\""+className+"\" onmouseover=\"this.className='"+className+"_on'\" onmouseout=\"this.className='"+className+"'\" style=\"background:url("+icon+") no-repeat left center; padding-left:18px;\" onclick=\""+func+"\">"+str+"</span><br />";
else html += "<span class=\""+className+"\" onmouseover=\"this.className='"+className+"_on'\" onmouseout=\"this.className='"+className+"'\" onclick=\""+func+"\">"+str+"</span><br />";
if(icon) html += "<div class=\""+className+"\" onmouseover=\"this.className='"+className+"_on'\" onmouseout=\"this.className='"+className+"'\" style=\"background:url("+icon+") no-repeat left center; padding-left:18px;\" onclick=\""+func+"\">"+str+"</div>";
else html += "<div class=\""+className+"\" onmouseover=\"this.className='"+className+"_on'\" onmouseout=\"this.className='"+className+"'\" onclick=\""+func+"\">"+str+"</div>";
}
}
loaded_popup_menu_list[menu_id] = html;
@ -936,3 +940,34 @@ var Base64 = {
}
}
/* select - option의 disabled=disabled 속성을 IE에서도 체크하기 위한 함수 */
if(xIE4Up) {
xAddEventListener(window, 'load', activateOptionDisabled);
function activateOptionDisabled(evt) {
var sels = xGetElementsByTagName('select');
for(var i=0; i < sels.length; i++){
var disabled_exists = false;
for(var j=0; j < sels[i].options.length; j++) {
if(sels[i].options[j].disabled) {
sels[i].options[j].style.color = '#CCCCCC';
disabled_exists = true;
}
}
if(!disabled_exists) continue;
sels[i].onchange = function() {
if(this.options[this.selectedIndex].disabled) {
if(this.options.length<=1) this.selectedIndex = -1;
else if(this.selectedIndex < this.options.length - 1) this.selectedIndex++;
else this.selectedIndex--;
}
}
if(sels[i].selectedIndex >= 0 && sels[i].options[ sels[i].selectedIndex ].disabled) sels[i].onchange();
}
}
}

View file

@ -44,6 +44,11 @@ function xml_response_filter(oXml, callback_func, response_tags, callback_func_a
return null;
}
if(ret_obj["redirect_url"]) {
location.href=ret_obj["redirect_url"];
return null;
}
if(!callback_func) return null;
callback_func(ret_obj, response_tags, callback_func_arg, fo_obj);

View file

@ -231,6 +231,8 @@ function XmlJsFilterCheckFieldItem() {
var equalto = item[4];
var filter = item[5].split(",");
if(typeof(this.fo_obj[target])=='undefined') continue;
for(var j=0; j<notnull_list.length; j++) {
if(notnull_list[j]==target) required = true;
}
@ -303,7 +305,7 @@ function procFilter(fo_obj, filter_func) {
// form문 안에 위지윅 에디터가 세팅되어 있을 경우 에디터의 값과 지정된 content field를 sync
var editor_sequence = fo_obj.getAttribute('editor_sequence');
if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined') {
editorRelKeys[editor_sequence]['content'].value = editorGetContent(editor_sequence);
editorRelKeys[editor_sequence]['content'].value = editorGetContent(editor_sequence);
}
filter_func(fo_obj);

View file

@ -60,6 +60,8 @@
$lang->cmd_reset = 'Reset';
$lang->cmd_remake_cache = "Re-create cache file";
$lang->cmd_publish = "Publish";
$lang->cmd_layout_setup = 'Configure layout';
$lang->cmd_layout_edit = 'Edit layout';
$lang->enable = 'Enable';
$lang->disable = 'Disable';
@ -82,7 +84,7 @@
$lang->email_address = 'Email';
$lang->homepage = 'Homepage';
$lang->blog = 'Blog';
$lang->birthday = 'Birthdate';
$lang->birthday = 'Birthday';
$lang->browser_title = 'Browser Title';
$lang->title = 'Subject';
$lang->title_content = 'Subject+Content';
@ -124,6 +126,7 @@
$lang->document_count = 'Total Articles';
$lang->page_count = 'Page Count';
$lang->list_count = 'List Count';
$lang->search_list_count = 'Search List Count';
$lang->readed_count = 'Views';
$lang->voted_count = 'Votes';
$lang->member_count = 'Member Count';
@ -147,7 +150,10 @@
$lang->use = 'Use';
$lang->notuse = 'Not use';
$lang->not_exists = "Does not exist";
$lang->not_exists = "Doesn't exist";
$lang->public = 'public';
$lang->private = 'private';
$lang->unit_sec = 'sec';
$lang->unit_min = 'min';

View file

@ -21,16 +21,16 @@
$lang->cmd_comment_registration = 'Agregar commentarios';
$lang->cmd_insert = 'Insertar';
$lang->cmd_save = 'Guardar';
$lang->cmd_load = '불러오기';
$lang->cmd_load = 'Carga';
$lang->cmd_input = 'Ingresar';
$lang->cmd_search = 'Buscar';
$lang->cmd_cancel = 'Cancelar';
$lang->cmd_back = 'Atrás';
$lang->cmd_vote = 'Recomendar';
$lang->cmd_vote_down = '비추천';
$lang->cmd_declare = '신고';
$lang->cmd_cancel_declare = '신고 취소';
$lang->cmd_declared_list = '신고 목록';
$lang->cmd_vote_down = 'Critique';
$lang->cmd_declare = 'Acusan';
$lang->cmd_cancel_declare = 'Cancelar acusan';
$lang->cmd_declared_list = 'Lista acusaciones';
$lang->cmd_copy = 'Copia';
$lang->cmd_move = 'Mover';
$lang->cmd_move_up = 'Arriba';
@ -48,7 +48,7 @@
$lang->cmd_close = 'Cerrar';
$lang->cmd_open = 'Abrir';
$lang->cmd_setup = 'Configuración';
$lang->cmd_addition_setup = '추가 설정';
$lang->cmd_addition_setup = 'Configurar';
$lang->cmd_option = 'Opción';
$lang->cmd_apply = 'Aplicar';
$lang->cmd_open_calendar = 'Abrir el calendario';
@ -57,8 +57,10 @@
$lang->cmd_scrap = 'Scrap';
$lang->cmd_preview = 'Previo';
$lang->cmd_reset = 'Rehacer';
$lang->cmd_remake_cache = "캐시파일 재생성";
$lang->cmd_publish = "발행";
$lang->cmd_remake_cache = "Re-crear el archivo caché";
$lang->cmd_publish = "Publicar";
$lang->cmd_layout_setup = 'Configuración del diseño';
$lang->cmd_layout_edit = 'Editar el diseño';
$lang->enable = 'Activar';
$lang->disable = 'Desactivar';
@ -85,8 +87,8 @@
$lang->browser_title = 'Título del navegador';
$lang->title = 'Título';
$lang->title_content = 'Título+Contenido';
$lang->topic = '주제';
$lang->replies = '응답';
$lang->topic = 'Tema';
$lang->replies = 'Responder';
$lang->content = 'Contenidos';
$lang->document = 'Documentos';
$lang->comment = 'Commentarios';
@ -123,13 +125,14 @@
$lang->document_count = 'Cantidad de documentos';
$lang->page_count = 'Cantidad de páginas';
$lang->list_count = 'Cantidad de listas';
$lang->search_list_count = 'Buscar lista Conde';
$lang->readed_count = 'Leídos';
$lang->voted_count = 'Recomendados';
$lang->member_count = 'Cantidad de usuarios';
$lang->date = 'Fecha';
$lang->regdate = 'Fecha publicada';
$lang->last_update = 'Ultima actualización';
$lang->last_post = '최근 등록';
$lang->last_post = 'Último mensaje';
$lang->signup_date = 'Fecha del registro';
$lang->last_login = 'Ultima conección';
$lang->first_page = 'Primera página';
@ -148,6 +151,9 @@
$lang->notuse = 'No usar';
$lang->not_exists = 'No existe';
$lang->public = 'Público';
$lang->private = 'Privado';
$lang->unit_sec = 'segundo';
$lang->unit_min = 'minuto';
$lang->unit_hour = 'hora';
@ -178,7 +184,7 @@
$lang->msg_module_is_not_standalone = 'Módulo solicitado no puede ser ejecutado independientemente';
$lang->success_registed = 'Agregado con éxito';
$lang->success_declared = '신고되었습니다';
$lang->success_declared = 'Acusado con éxito';
$lang->success_updated = 'Actualizado con éxito';
$lang->success_deleted = 'Boarrado con éxito';
$lang->success_voted = 'Recomendado con éxito';
@ -186,13 +192,13 @@
$lang->success_sended = 'Enviado con éxito';
$lang->success_reset = 'Reajustado con éxito';
$lang->success_leaved = 'Abandonado con éxito';
$lang->success_saved = '저장되었습니다';
$lang->success_saved = 'Guardado correctamente';
$lang->fail_to_delete = 'No puede ser borrado';
$lang->fail_to_move = 'No puede ser movido';
$lang->failed_voted = 'No puede ser recomendado';
$lang->failed_declared = '신고를 하실 수 없습니다';
$lang->failed_declared = 'No se ha podido acusar';
$lang->fail_to_delete_have_children = 'No puede ser borrado, ya que el mensaje posee respuestas ';
$lang->confirm_submit = '¿Está seguro que desea enviar?';

View file

@ -59,6 +59,8 @@
$lang->cmd_reset = '초기화';
$lang->cmd_remake_cache = "캐시파일 재생성";
$lang->cmd_publish = "발행";
$lang->cmd_layout_setup = '레이아웃 설정';
$lang->cmd_layout_edit = '레이아웃 편집';
$lang->enable = 'Permettre';
$lang->disable = 'Neutraliser';
@ -122,6 +124,7 @@
$lang->document_count = 'Nombre Total des Articles';
$lang->page_count = 'Nombre de Pages';
$lang->list_count = 'Nombre de Listes';
$lang->search_list_count = '검색 목록 수';
$lang->readed_count = 'Nombre de Fois Lues';
$lang->voted_count = 'Nombre de Voix';
$lang->member_count = 'Nombre de Membres';
@ -147,6 +150,9 @@
$lang->notuse = 'Ne pas Utiliser';
$lang->not_exists = 'n\'Existe Pas';
$lang->public = 'public';
$lang->private = 'private';
$lang->unit_sec = 'sec';
$lang->unit_min = 'min';
$lang->unit_hour = 'heur';

View file

@ -60,6 +60,8 @@
$lang->cmd_reset = '初期化';
$lang->cmd_remake_cache = "キャッシュファイル再生成";
$lang->cmd_publish = "発行";
$lang->cmd_layout_setup = 'レイアウト設定';
$lang->cmd_layout_edit = 'レイアウト編集';
$lang->enable = '可能';
$lang->disable = '不可';
@ -124,6 +126,7 @@
$lang->document_count = '書き込み数';
$lang->page_count = 'ページ数';
$lang->list_count = 'リスト数';
$lang->search_list_count = '검색 목록 수';
$lang->readed_count = '照合数';
$lang->voted_count = '推薦数';
$lang->member_count = '会員数';
@ -149,6 +152,9 @@
$lang->notuse = '未使用';
$lang->not_exists = 'なし';
$lang->public = 'public';
$lang->private = 'private';
$lang->unit_sec = '秒';
$lang->unit_min = '分';
$lang->unit_hour = '時';

View file

@ -60,6 +60,8 @@
$lang->cmd_reset = '초기화';
$lang->cmd_remake_cache = "캐시파일 재생성";
$lang->cmd_publish = "발행";
$lang->cmd_layout_setup = '레이아웃 설정';
$lang->cmd_layout_edit = '레이아웃 편집';
$lang->enable = '가능';
$lang->disable = '불가능';
@ -124,6 +126,7 @@
$lang->document_count = '글수';
$lang->page_count = '페이지수';
$lang->list_count = '목록 수';
$lang->search_list_count = '검색 목록 수';
$lang->readed_count = '조회수';
$lang->voted_count = '추천수';
$lang->member_count = '회원수';
@ -149,6 +152,9 @@
$lang->notuse = '미사용';
$lang->not_exists = '없음';
$lang->public = '공개';
$lang->private = '비공개';
$lang->unit_sec = '초';
$lang->unit_min = '분';
$lang->unit_hour = '시';

View file

@ -3,4 +3,4 @@ en,English
zh-CN,中文
jp,日本語
es,Español
ru,Русский
ru,Русский

View file

@ -60,6 +60,8 @@
$lang->cmd_reset = 'Сброс';
$lang->cmd_remake_cache = "Пере-создать файл кэша";
$lang->cmd_publish = "Опубликовать";
$lang->cmd_layout_setup = 'Конфигурировать лейаут';
$lang->cmd_layout_edit = 'Редактировать лейаут';
$lang->enable = 'Включено';
$lang->disable = 'Выключено';
@ -124,6 +126,7 @@
$lang->document_count = 'Всего статей';
$lang->page_count = 'Кол-во страниц';
$lang->list_count = 'Кол-во списков';
$lang->search_list_count = 'Поиск Список кол';
$lang->readed_count = 'Хиты';
$lang->voted_count = 'Голоса';
$lang->member_count = 'Кол-во пользователей';
@ -149,6 +152,9 @@
$lang->notuse = 'Не использовать';
$lang->not_exists = "Не существует";
$lang->public = 'общественности';
$lang->private = 'частный';
$lang->unit_sec = 'сек.';
$lang->unit_min = 'мин.';
$lang->unit_hour = 'ч.';

View file

@ -60,6 +60,8 @@
$lang->cmd_reset = '初始化';
$lang->cmd_remake_cache = "重新生成缓冲文件";
$lang->cmd_publish = "发表";
$lang->cmd_layout_setup = '布局设置';
$lang->cmd_layout_edit = '编辑布局';
$lang->enable = '可用';
$lang->disable = '禁用';
@ -124,6 +126,7 @@
$lang->document_count = '帖子数';
$lang->page_count = '页数';
$lang->list_count = '目录数';
$lang->search_list_count = '搜索目录';
$lang->readed_count = '查看';
$lang->voted_count = '推荐';
$lang->member_count = '会员数';
@ -149,6 +152,9 @@
$lang->notuse = '未使用';
$lang->not_exists = '无';
$lang->public = 'public';
$lang->private = 'private';
$lang->unit_sec = '秒';
$lang->unit_min = '分';
$lang->unit_hour = '时';

View file

@ -2,7 +2,7 @@
<html lang="{Context::getLangType()}" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="generator" content="zeroboard xe (http://www.zeroboard.com)" version="{__ZBXE_VERSION__}"/>
<meta name="generator" content="zeroboardXE {__ZBXE_VERSION__}"/>
<!--@if($module_info->module)--><meta name="module" content="{$module_info->module}" />
<!--@end--><!--@if($module_info->skin)--><meta name="module_skin" content="{$module_info->skin}" />
<!--@end--><!--@if($layout_info->title)--><meta name="layout" content="{$layout_info->title} ({$layout_info->layout})" />

View file

@ -14,7 +14,7 @@
* 내용은 제로보드XE의 버전을 관리자 페이지에 표시하기 위한 용도이며
* config.inc.php의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '0.2.8');
define('__ZBXE_VERSION__', '0.2.9');
/**
* @brief 디버깅 메세지 출력

View file

@ -256,8 +256,8 @@
* @brief 월이름을 return
**/
function getMonthName($month, $short = true) {
$short_month = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
$long_month = array("January","February","March","April","May","June","July","August","September","October","November","December");
$short_month = array('','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
$long_month = array('','January','February','March','April','May','June','July','August','September','October','November','December');
return !$short?$long_month[$month]:$short_month[$month];
}
@ -463,4 +463,55 @@
return sprintf("%08lx%08lx", $nr, $nr2);
}
/**
* 현재 요청받은 스크립트 경로를 return
**/
function getScriptPath() {
//if(function_exists('php_sapi_name') && php_sapi_name()=='cgi') return preg_replace('/index.php/i','',$_SERVER['PATH_INFO']);
return preg_replace('/index.php/i','',$_SERVER['SCRIPT_NAME']);
}
/**
* javascript의 escape의 php unescape 함수
* Function converts an Javascript escaped string back into a string with specified charset (default is UTF-8).
* Modified function from http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps
**/
function utf8RawUrlDecode ($source) {
$decodedStr = "";
$pos = 0;
$len = strlen ($source);
while ($pos < $len) {
$charAt = substr ($source, $pos, 1);
if ($charAt == '%') {
$pos++;
$charAt = substr ($source, $pos, 1);
if ($charAt == 'u') {
// we got a unicode character
$pos++;
$unicodeHexVal = substr ($source, $pos, 4);
$unicode = hexdec ($unicodeHexVal);
$decodedStr .= _code2utf($unicode);
$pos += 4;
}
else {
// we have an escaped ascii character
$hexVal = substr ($source, $pos, 2);
$decodedStr .= chr (hexdec ($hexVal));
$pos += 2;
}
} else {
$decodedStr .= $charAt;
$pos++;
}
}
return $decodedStr;
}
function _code2utf($num){
if($num<128)return chr($num);
if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
return '';
}
?>

View file

@ -14,7 +14,7 @@
* zeroboard XE 오픈 프로젝트로 개발되는 오픈 소스입니다.\n
* 자세한 내용은 아래 링크를 참조하세요.
* - 공식홈페이지 : http://www.zeroboard.com
* - 오픈프로젝트 사이트 : http://spring.zeroboard.com
* - zbXE 포럼 : http://www.zeroboard.com/forum_main
* - 이슈트래킹 : http://trac.zeroboard.com
* - SVN Repository : http://svn.zeroboard.com/zeroboard_xe/trunk
* - document : http://doc.zeroboard.com

View file

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<layout version="0.1">
<title xml:lang="ko">제로보드XE 블로그 기본 스킨</title>
<title xml:lang="jp">ZBXEブログのデフォルトスキン</title>
<title xml:lang="zh-CN">Zeroboard XE博客默认皮肤</title>
<title xml:lang="en">Default Skin of Zeroboard XE blog</title>
<title xml:lang="es">Cuidado de la Piel por defecto de Zeroboard XE blog</title>
<title xml:lang="ru">По умолчанию Кожа Zeroboard XE блоге</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<description xml:lang="ko">
제로보드XE 블로그 기본 스킨입니다.
디자인 : 서기정 (http://blog.naver.com/addcozy)
HTML/CSS : 정찬명 (http://naradesign.net)
</description>
<description xml:lang="jp">
ゼロボードXEブログの基本スキンです。
デザイン:ソギジョン (http://blog.naver.com/addcozy)
HTML/CSSジョンチャンミョン (http://naradesign.net)
</description>
<description xml:lang="zh-CN">
Zeroboard XE博客默认皮肤。
设计 : Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Chan-Myung Jeong (http://naradesign.net)
</description>
<description xml:lang="en">
This is default skin of Zeroboard XE blog.
Design : Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Chan-Myung Jeong (http://naradesign.net)
</description>
<description xml:lang="es">
Esto es por defecto de la piel Zeroboard XE blog.
Diseño: Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML / CSS: Jeong Chan-Myung (http://naradesign.net)
</description>
<description xml:lang="ru">
Это умолчанию кожи Zeroboard XE блоге.
Дизайн: Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML / CSS: Jeong Chan-Myung (http://naradesign.net)
</description>
</author>
<extra_vars>
<var name="colorset" type="select">
<title xml:lang="ko">컬러셋</title>
<title xml:lang="jp">カラーセット</title>
<title xml:lang="zh-CN">颜色</title>
<title xml:lang="en">Colorset</title>
<title xml:lang="es">Set de Colores</title>
<title xml:lang="ru">Colorset</title>
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するカラーセットを選択してください。</description>
<description xml:lang="zh-CN">请选择颜色。</description>
<description xml:lang="en">Please select a colorset you want.</description>
<description xml:lang="ru">Выберите colorset хотите.</description>
<description xml:lang="es">Seleccione set de colores que desea.</description>
<options name="white">
<title xml:lang="ko">하얀색(기본)</title>
<title xml:lang="jp">白色(基本)</title>
<title xml:lang="zh-CN">白色(默认)</title>
<title xml:lang="en">White (default)</title>
<title xml:lang="es">Blanco (por defecto)</title>
<title xml:lang="ru">Белые (по умолчанию)</title>
<value>white</value>
</options>
<options name="cyan">
<title xml:lang="ko">청록색</title>
<title xml:lang="jp">青緑</title>
<title xml:lang="zh-CN">青绿色</title>
<title xml:lang="en">Cyan</title>
<title xml:lang="es">Cian</title>
<title xml:lang="ru">Cyan</title>
<value>cyan</value>
</options>
<options name="green">
<title xml:lang="ko">초록색</title>
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">绿色</title>
<title xml:lang="en">Green</title>
<title xml:lang="es">Verde</title>
<title xml:lang="ru">Green</title>
<value>green</value>
</options>
<options name="red">
<title xml:lang="ko">빨간색</title>
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">红色</title>
<title xml:lang="en">Red</title>
<title xml:lang="es">Roja</title>
<title xml:lang="ru">Красный</title>
<value>red</value>
</options>
<options name="purple">
<title xml:lang="ko">보라색</title>
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">紫色</title>
<title xml:lang="en">Purple</title>
<title xml:lang="es">Púrpura</title>
<title xml:lang="ru">Фиолетовый</title>
<value>purple</value>
</options>
</var>
<var name="target_mid" type="text">
<title xml:lang="ko">기본 모듈</title>
<title xml:lang="jp">기본 모듈</title>
<title xml:lang="zh-CN">기본 모듈</title>
<title xml:lang="en">Basic module</title>
<title xml:lang="es">Módulo Básico</title>
<title xml:lang="ru">Основной модуль</title>
<description xml:lang="ko">기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다</description>
<description xml:lang="jp">기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다</description>
<description xml:lang="zh-CN">기본 모듈을 지정해주시면 레이아웃에서 표시되는 위젯들이 정상적으로 동작을 하게 됩니다</description>
<description xml:lang="en">The widgets that are being displayed in the layout will work properly if you select the basic module</description>
<description xml:lang="es">Los reproductores que se muestran en el diseño funcionará correctamente si selecciona el módulo básico</description>
<description xml:lang="ru">В виджеты, которые отображаются в формате будет работать правильно, если вы выбираете основной модуль</description>
</var>
<var name="top_title" type="text">
<title xml:lang="ko">상단 제목</title>
<title xml:lang="jp">上段タイトル</title>
<title xml:lang="zh-CN">博客标题</title>
<title xml:lang="en">Top Title</title>
<title xml:lang="es">Top Título</title>
<title xml:lang="ru">Рейтинг Название</title>
<description xml:lang="ko">레이아웃의 상단에 표시할 제목을 입력하세요.</description>
<description xml:lang="jp">レイアウト上段に表示させるタイトルを入力してください。</description>
<description xml:lang="zh-CN">请输入博客主标题。</description>
<description xml:lang="en">Please input title which will be displayed on top of layout.</description>
<description xml:lang="es">Introduce el título que se mostrará en la parte superior de diseño.</description>
<description xml:lang="ru">Введите название, которое будет отображаться в верхней части формы.</description>
</var>
<var name="sub_title" type="text">
<title xml:lang="ko">부제</title>
<title xml:lang="jp">サブタイトル</title>
<title xml:lang="zh-CN">副标题</title>
<title xml:lang="en">Subtitle</title>
<title xml:lang="es">Subtítulo</title>
<title xml:lang="ru">Подзаголовок</title>
<description xml:lang="ko">레이아웃의 상단에 큰 제목 아래 부제목을 입력하세요.</description>
<description xml:lang="jp">レイアウトの上段にメインタイトルの下のサブタイトルを入力してください。</description>
<description xml:lang="zh-CN">请输入副标题。</description>
<description xml:lang="en">Please input subtitle which will be displayed under the top title.</description>
<description xml:lang="es">Por favor, de entrada subtítulo que se mostrará bajo el título arriba.</description>
<description xml:lang="ru">Введите субтитров, которые будут отображаться в верхней заголовок.</description>
</var>
<var name="logo_image" type="image">
<title xml:lang="ko">로고이미지</title>
<title xml:lang="jp">ロゴイメージ</title>
<title xml:lang="zh-CN">LOGO图片</title>
<title xml:lang="en">Logo Image</title>
<title xml:lang="es">Imagen Logo</title>
<title xml:lang="ru">Изображения логотипа</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요.</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力してください。</description>
<description xml:lang="zh-CN">上传博客LOGO图片。</description>
<description xml:lang="en">Please input logo image which will be displayed on top of layout.</description>
<description xml:lang="es">Introduce el logotipo imagen que se mostrará en la parte superior de diseño.</description>
<description xml:lang="ru">Введите логотипа изображение, которое будет отображаться в верхней части формы.</description>
</var>
<var name="profile_image" type="image">
<title xml:lang="ko">프로필 이미지</title>
<title xml:lang="jp">プロフィールイメージ</title>
<title xml:lang="zh-CN">博客个性图片</title>
<title xml:lang="en">Profile Image</title>
<title xml:lang="es">Perfil de Imagen</title>
<title xml:lang="ru">Профиль Изображение</title>
<description xml:lang="ko">프로필 이미지를 입력해 주세요 (가로 사이즈는 160px이 가장 보기 좋습니다)</description>
<description xml:lang="jp">プロフィールイメージを入力してください横幅は「160px」が一番適しています</description>
<description xml:lang="zh-CN">请输入博客个性图片(推荐宽度160px)。</description>
<description xml:lang="en">Please input profile image (It is recommended to set width as 160px)</description>
<description xml:lang="es">Por favor, el perfil de entrada de imagen (Se recomienda configurar el ancho de 160px)</description>
<description xml:lang="ru">Введите профиля изображения (Рекомендуется устанавливать ширину, 160px)</description>
</var>
<var name="background_image" type="image">
<title xml:lang="ko">배경 이미지</title>
<title xml:lang="jp">背景イメージ</title>
<title xml:lang="zh-CN">背景图片</title>
<title xml:lang="en">Background Image</title>
<title xml:lang="es">Imagen de fondo</title>
<title xml:lang="ru">Фоновое изображение</title>
<description xml:lang="ko">배경 이미지를 사용하시려면 등록해주세요.</description>
<description xml:lang="jp">背景イメージを使う場合は、登録してください。</description>
<description xml:lang="zh-CN">要想使用背景图片请在这里上传。</description>
<description xml:lang="en">Please input if you want to use background image.</description>
<description xml:lang="es">Entre, por favor, si desea utilizar la imagen de fondo.</description>
<description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description>
</var>
<var name="profile" type="textarea">
<title xml:lang="ko">프로필</title>
<title xml:lang="jp">プロフィール</title>
<title xml:lang="zh-CN">简介</title>
<title xml:lang="en">Profile</title>
<title xml:lang="es">Perfil</title>
<title xml:lang="ru">Профиль</title>
<description lang="ko">간단한 프로필을 입력해주세요</description>
<description lang="jp">簡単なプロフィールを入力してください。</description>
<description lang="zh-CN">请输入简单介绍。</description>
<description lang="en">Please input your simple profile</description>
<description lang="es">Por favor, introduzca su perfil simple</description>
<description lang="ru">Введите простое профиль</description>
</var>
</extra_vars>
<menus>
<menu name="top_menu" default="true">
<title xml:lang="ko">상단 메뉴</title>
<title xml:lang="jp">上段メニュー</title>
<title xml:lang="zh-CN">菜单</title>
<title xml:lang="en">Top Menu</title>
<title xml:lang="es">Menú superior</title>
<title xml:lang="ru">Главное меню</title>
<maxdepth>1</maxdepth>
</menu>
</menus>
</layout>

View file

@ -0,0 +1,14 @@
@charset "utf-8";
.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;}
#bodyWrap #header #globalNavigation li.on a { color:#2895c0;}
#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/cyan/blogHeaderVr.gif) no-repeat right center;}
#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/cyan/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;}
/* account Navigation */
#blogAccountNavigation li.join a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.myInfo a { background:url(../images/cyan/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/cyan/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -0,0 +1,14 @@
@charset "utf-8";
.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;}
#bodyWrap #header #globalNavigation li.on a { color:#38b549;}
#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/green/blogHeaderVr.gif) no-repeat right center;}
#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/green/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;}
/* account Navigation */
#blogAccountNavigation li.join a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.myInfo a { background:url(../images/green/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/green/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -27,28 +27,30 @@ a { text-decoration:none; }
#bodyWrap #accountNavigation li a { display:block; float:left; padding:0 .75em; color:#888888; white-space:nowrap;}
/* account Navigation */
#blogAccountNavigation { float:right; margin:1em; }
#blogAccountNavigation li { float:left; margin-left:7px; list-style:none; padding-top:3px;}
#blogAccountNavigation { float:right; margin:10px 10px 0 0; }
#blogAccountNavigation li { float:left; margin-left:7px; list-style:none; }
#blogAccountNavigation li a { font-size:12px; white-space:nowrap; color:#666666; text-decoration:none;}
#blogAccountNavigation li.setup a { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.admin a { background:url(../images/common/iconAdmin.gif) no-repeat left top; padding-left:12px; }
#blogAccountNavigation li.listType { margin-left:5px; }
#blogAccountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 5px; padding-left:8px; _padding-top:5px;}
#blogAccountNavigation li.write a { background:url(../images/common/iconWrite.gif) no-repeat left center; padding-left:14px;}
*:first-child+html #blogAccountNavigation li.loginAndLogout { padding-top:5px; }
#blogAccountNavigation li.admin { background:url(../images/common/iconAdmin.gif) no-repeat left 1px; padding-left:12px; }
#blogAccountNavigation li.setup { background:url(../images/common/iconSetup.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.layout_setup { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; }
#blogAccountNavigation li.layout_edit { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; }
#blogAccountNavigation li.myinfo { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; }
#blogAccountNavigation li.loginAndLogout { background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left 1px; padding-left:8px; }
#blogAccountNavigation li.write { background:url(../images/common/iconWrite.gif) no-repeat left top; padding-left:14px;}
/* Blog header Child*/
#bodyWrap #header h1 { font-size:2em; padding:.8em 0 .2em 30px; letter-spacing:-.05em;}
#bodyWrap #header h1 { position:relative; left:20px; top:30px; font-size:2em; letter-spacing:-.05em;}
#bodyWrap #header h1 a { font-family:Tahoma; color:#53554a;}
#bodyWrap #header #tagLine { padding:0 0 0 30px; color:#7e7f77;}
#bodyWrap #header #tagLine { position:relative; left:20px; top:30px; color:#7e7f77;}
#bodyWrap #header #globalNavigation { float:right; padding:1em 1em 1em 0; overflow:hidden;}
#bodyWrap #header #globalNavigation { line-height:11pt; font-size:9pt; float:right; overflow:hidden; margin:45px 3px 0 0; }
#bodyWrap #header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/blogHeaderVr.gif) no-repeat left center;}
#bodyWrap #header #globalNavigation li a { display:block; float:left; padding:0 .75em; font-weight:bold; font-family:Tahoma; color:#54564b; white-space:nowrap;}
#bodyWrap #header #globalNavigation li a { display:block; float:left; padding:0 7px; font-weight:bold; color:#54564b; white-space:nowrap;}
/* Column Left & Right Common Child */
.boxTypeA { position:relative; border:1px solid #e0e1db; margin-bottom:.7em;}
.boxTypeB h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; font-family:Tahoma;}
.boxTypeB h2 { position:relative; border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; font-size:1em; color:#54564b; font-family:Tahoma;}
*:first-child+html .boxTypeB h2 { height:20px;}
.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;}
.boxTypeB .showHide { position:relative;}
@ -67,8 +69,6 @@ div#profile dl#hello dt a { color:#333333;}
div#profile dl#hello dd { color:#777777; margin-bottom:1em;}
div#profile ul#admin { overflow:hidden; height:1.2em;}
div#blog_category { background-color:#FFFFFF; }
/* Search Box */
div#searchBox { margin-bottom:.7em; overflow:hidden; width:100%;}
div#searchBox fieldset { border:none;}
@ -79,3 +79,10 @@ div#searchBox .imgBtn {vertical-align:middle; _position:relative; top:-4px; }
/* powered by zbxe */
#poweredbyzbxe { text-align:center; margin-top:2em; }
#poweredbyzbxe img { width:138px; height:35px; border:0;}
/* widget common css */
.category_widget { border:1px solid #e0e1db; margin-bottom:10px; padding:15px 5px 10px 5px; overflow:hidden;}
.blog_widget_ h2 { border-left:1px solid #ffffff; border-right:1px solid #ffffff; padding:7px 0 0 12px; height:21px; _height:20px; font-size:1em; color:#54564b; }
.blog_widget_ .items { padding:10px; overflow:hidden;}
.blog_widget_ .items li { font-size:.9em; display:block; color:#a4a4a4; margin-right:.1em; line-height:150%; overflow:hidden; white-space:nowrap; list-style:none; width:100%; padding:3px 0 3px 0;}
.blog_widget_ .items li a { color:#a4a4a4; margin-right:1em; }

View file

@ -0,0 +1,14 @@
@charset "utf-8";
.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;}
#bodyWrap #header #globalNavigation li.on a { color:#b1ae00;}
#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/purple/blogHeaderVr.gif) no-repeat right center;}
#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/purple/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;}
/* account Navigation */
#blogAccountNavigation li.join a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.myInfo a { background:url(../images/purple/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/purple/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -0,0 +1,14 @@
@charset "utf-8";
.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;}
#bodyWrap #header #globalNavigation li.on a { color:#fe3614;}
#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/red/blogHeaderVr.gif) no-repeat right center;}
#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/red/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;}
/* account Navigation */
#blogAccountNavigation li.join a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.myInfo a { background:url(../images/red/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/red/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

@ -0,0 +1,14 @@
@charset "utf-8";
.boxTypeB { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em;}
#bodyWrap #header #globalNavigation li.on a { color:#fe3614;}
#bodyWrap #accountNavigation li { float:left; margin-right:-1px; background:url(../images/white/blogHeaderVr.gif) no-repeat right center;}
#bodyWrap #header { clear:both; height:9.5em; margin:10px 10px .5em 10px; border:1px solid #e0e1dc; border-bottom:none; background:#fbfbfb url(../images/white/blogHeaderLine.gif) no-repeat left bottom; overflow:hidden;}
/* account Navigation */
#blogAccountNavigation li.join { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
#blogAccountNavigation li.myInfo { background:url(../images/white/iconMyInfo.gif) no-repeat left top; padding-left:14px; }
/* widget common css */
.blog_widget_ { position:relative; border:1px solid #e0e1db; background:url(../images/white/bgBoxTypeB.gif) repeat-x left top; margin-bottom:.7em; }

View file

Before

Width:  |  Height:  |  Size: 43 B

After

Width:  |  Height:  |  Size: 43 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 101 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 88 B

After

Width:  |  Height:  |  Size: 88 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

View file

Before

Width:  |  Height:  |  Size: 46 B

After

Width:  |  Height:  |  Size: 46 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 988 B

After

Width:  |  Height:  |  Size: 988 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 155 B

After

Width:  |  Height:  |  Size: 155 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 207 B

After

Width:  |  Height:  |  Size: 207 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 91 B

After

Width:  |  Height:  |  Size: 91 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 198 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 205 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 96 B

After

Width:  |  Height:  |  Size: 96 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 199 B

After

Width:  |  Height:  |  Size: 199 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 197 B

After

Width:  |  Height:  |  Size: 197 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 125 B

After

Width:  |  Height:  |  Size: 125 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 196 B

After

Width:  |  Height:  |  Size: 196 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 96 B

After

Width:  |  Height:  |  Size: 96 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 307 B

After

Width:  |  Height:  |  Size: 307 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 200 B

After

Width:  |  Height:  |  Size: 200 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 181 B

After

Width:  |  Height:  |  Size: 181 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 44 B

After

Width:  |  Height:  |  Size: 44 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 125 B

After

Width:  |  Height:  |  Size: 125 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

Before After
Before After

View file

@ -1,10 +1,5 @@
<!-- 레이아웃과 연동될 css 파일 import -->
<!--%import("css/layout.css")-->
<!--%import("css/blog_tree_menu.css")-->
<!-- JS 파일 로드 -->
<!--%import("js/blog.js")-->
<!--%import("js/blog_tree_menu.js")-->
<!-- 컬러셋 체크 -->
<!--@if(!$layout_info->colorset)-->
@ -12,7 +7,6 @@
<!--@end-->
<!-- CSS 파일 로드 (컬러셋에 따라서) -->
<!--%import("css/common.css")-->
<!--@if($layout_info->colorset == "cyan")--> <!--%import("css/cyan.css")-->
<!--@elseif($layout_info->colorset == "red")--> <!--%import("css/red.css")-->
<!--@elseif($layout_info->colorset == "green")--> <!--%import("css/green.css")-->
@ -26,14 +20,6 @@
</style>
<!--@end-->
<script type="text/javascript">
// 블로그 카테고리를 js/blog_tree_menu.js를 이용해서 표시
blogLoadTreeMenu("{$layout_info->category_xml_file}", "{$layout_info->category_name?$layout_info->category_name:'categories'}", "{getUrl('','mid',$layout_info->mid)}");
</script>
<!-- 상단 텍스트 출력 -->
{$layout_info->header_text}
<div id="bodyWrap">
<!-- 상단 타이틀 및 메뉴 -->
@ -43,42 +29,44 @@
<ul id="blogAccountNavigation">
<!--@if(!$is_logged)-->
<!-- 비로그인 상태 -->
<li class="join"><a href="{getUrl('mid',$layout_info->mid,'act','dispMemberSignUpForm')}">{$lang->cmd_signup}</a></li>
<li class="join"><a href="{getUrl('mid',$layout_info->target_mid,'act','dispMemberSignUpForm')}">{$lang->cmd_signup}</a></li>
<li class="loginAndLogout"><a href="{getUrl('act','dispMemberLoginForm')}">{$lang->cmd_login}</a></li>
<!--@else-->
<!-- 로그인 되었을 때 -->
<!-- 관리자이면 설정 버튼 출력 -->
<!--@if($grant->is_admin)-->
<li class="write"><a href="{getUrl('mid', $layout_info->mid, 'act','dispBlogWrite','document_srl','')}">{$lang->cmd_write}</a></li>
<li class="setup"><a href="{getUrl('mid',$layout_info->mid,'act','dispBlogAdminBlogInfo')}">{$lang->cmd_setup}</a></li>
<li class="write"><a href="{getUrl('mid', $layout_info->target_mid, 'act','dispBoardWrite','document_srl','')}">{$lang->cmd_write}</a></li>
<!--@end-->
<!-- 최고관리자이면 관리자 페이지 버튼 출력 -->
<!--@if($logged_info->is_admin == 'Y')-->
<li class="admin"><a href="{getUrl('','module','admin','act','dispBlogAdminContent')}" onclick="window.open(this.href); return false;">{$lang->cmd_management}</a></li>
<li class="admin"><a href="{getUrl('','module','admin')}" onclick="window.open(this.href); return false;">{$lang->cmd_management}</a></li>
<!--@end-->
<li class="myInfo"><a href="{getUrl('act','dispMemberInfo')}">{$lang->cmd_view_member_info}</a></li>
<!--@if($grant->is_admin)-->
<li class="setup"><a href="{getUrl('act','dispBoardAdminBoardInfo')}">{$lang->cmd_setup}</a></li>
<li class="layout_setup"><a href="{getUrl('','mid',$layout_info->target_mid,'act','dispLayoutAdminModify','layout_srl',$layout_info->layout_srl)}">{$lang->cmd_layout_setup}</a></li>
<li class="layout_edit"><a href="{getUrl('','mid',$layout_info->target_mid,'act','dispLayoutAdminEdit','layout_srl',$layout_info->layout_srl)}">{$lang->cmd_layout_edit}</a></li>
<!--@end-->
<li class="myinfo"><a href="{geturl('act','dispMemberInfo')}">{$lang->cmd_view_member_info}</a></li>
<li class="loginAndLogout"><a href="{getUrl('act','dispMemberLogout')}">{$lang->cmd_logout}</a></li>
<!--@end-->
<!--@if($rss_url)-->
<li class="rss"><a href="{$rss_url}"><img src="./images/common/iconRss.gif" alt="RSS" width="13" height="13" /></a></li>
<!--@end-->
<!--@if($mid == $layout_info->target_mid)-->
<li class="skin_info"><a href="{getUrl('','module','module','act','dispModuleSkinInfo','selected_module',$module_info->module, 'skin', $module_info->skin)}" onclick="popopen(this.href,'skinInfo'); return false;"><img src="./images/common/buttonHelp.gif" alt="Skin Info" width="13" height="13"/></a></li>
<!--@if($rss_url)-->
<li class="rss"><a href="{$rss_url}"><img src="./images/common/iconRss.gif" alt="rss" width="13" height="13" /></a></li>
<!--@end-->
<li class="tag_info"><a href="{getUrl('act','dispBoardTagList')}"><img src="./images/common/iconAllTags.gif" alt="Tag list" width="13" height="13"/></a></li>
<!--@end-->
</ul>
<h1>
<!--@if($layout_info->logo_image)-->
<a href="{getUrl('','mid',$layout_info->mid)}"><img src="{$layout_info->logo_image}" border="0" alt="{$layout_info->browser_title}"/></a>
<a href="{getUrl('','mid',$layout_info->target_mid)}"><img src="{$layout_info->logo_image}" border="0" alt="{$layout_info->browser_title}"/></a>
<!--@end-->
<!--@if($layout_info->top_title)-->
<a href="{getUrl('','mid',$layout_info->mid)}">{$layout_info->top_title}</a>
<a href="{getUrl('','mid',$layout_info->target_mid)}">{$layout_info->top_title}</a>
<!--@end-->
</h1>
@ -88,8 +76,8 @@
<!-- top_menu 시작 -->
<ul id="globalNavigation">
<!--@foreach($top_menu->list as $key => $val)--><!--@if($val['text'])-->
<li <!--@if($val['selected'])--> class="on" <!--@end--> ><a href="{$val['href']}" <!--@if($val['open_window']=='Y')-->onclick="window.open(this.href);return false;"<!--@end-->>{$val['text']}</a></li>
<!--@foreach($top_menu->list as $key => $val)--><!--@if($val['link'])-->
<li <!--@if($val['selected'])--> class="on" <!--@end--> ><a href="{$val['href']}" <!--@if($val['open_window']=='Y')-->onclick="window.open(this.href);return false;"<!--@end-->>{$val['link']}</a></li>
<!--@end--><!--@end-->
</ul>
</div>
@ -117,34 +105,36 @@
<!-- 검색폼 -->
<div id="searchBox">
<form action="{getUrl()}" method="post">
<input type="hidden" name="mid" value="{$layout_info->mid}" />
<input type="hidden" name="mid" value="{$layout_info->target_mid}" />
<input name="search_keyword" type="text" class="inputTypeText w140" size="4" value="<!--@if(!$search_target)-->{htmlspecialchars($search_keyword)}<!--@end-->" />
<input type="image" alt="search" src="./images/common/find_button.gif" class="imgBtn" />
</form>
</div>
<!-- 카테고리 출력 -->
<div id="blog_category"></div>
<!-- 왼쪽 위젯 출력 위치 -->
<!-- 카테고리 출력 -->
<div class="category_widget">
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="category" skin="default" mid_list="{$layout_info->target_mid}" />
</div>
<!-- 최근문서 출력 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_document" skin="blog_newest_document" title="Recent Articles" order_target="list_order" order_type="desc" list_count="10" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_document" skin="blog_newest_document" title="Recent Articles" order_target="list_order" order_type="desc" list_count="10" mid_list="{$layout_info->target_mid}" />
<!-- 최근댓글 출력 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_comment" skin="blog_newest_comment" title="Recent Comments" list_count="10" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_comment" skin="blog_newest_comment" title="Recent Comments" list_count="10" mid_list="{$layout_info->target_mid}" />
<!-- 엮인글들 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_trackback" skin="blog_newest_trackback" title="Recent Trackbacks" list_count="5" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="newest_trackback" skin="blog_newest_trackback" title="Recent Trackbacks" list_count="5" mid_list="{$layout_info->target_mid}" />
<!-- 꼬리표들 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="tag_list" skin="blog_tag_list" title="Site Tags" list_count="60" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="tag_list" skin="blog_tag_list" title="Site Tags" list_count="60" mid_list="{$layout_info->target_mid}" />
<!-- 월별 현황들 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="archive_list" skin="blog_archive_list" title="Archives" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="archive_list" skin="blog_archive_list" title="Archives" mid_list="{$layout_info->target_mid}" />
<!-- 달력 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="calendar" skin="blog_calendar_list" mid_list="{$layout_info->mid}" />
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="calendar" skin="blog_calendar_list" mid_list="{$layout_info->target_mid}" />
<!-- 카운터 -->
<img src="./images/common/blank.gif" class="zbxe_widget_output" widget="image_counter" widget_margin_left="5px" widget_margin_bottom="10px" graph_width="170" graph_height="100" day_range="5" />
@ -165,6 +155,3 @@
</div>
</div>
<!-- 하단 텍스트 출력 -->
{$layout_info->footer_text}

Some files were not shown because too many files have changed in this diff Show more