add trunk (from sandbox)

git-svn-id: http://xe-core.googlecode.com/svn/trunk@6859 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
haneul 2009-10-13 04:12:09 +00:00
commit 30e1f57f30
1012 changed files with 8763 additions and 118447 deletions

View file

@ -0,0 +1,12 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file autolink.addon.php
* @author zero (zero@nzeo.com)
* @brief 자동 링크 애드온
**/
if($called_position == 'after_module_proc' && Context::getResponseMethod()!="XMLRPC") {
Context::addJsFile('./addons/autolink/autolink.js');
}
?>

View file

@ -0,0 +1,36 @@
jQuery(function($) {
var url_regx = /((http|https|ftp|news|telnet|irc):\/\/(([0-9a-z\-._~!$&'\(\)*+,;=:]|(%[0-9a-f]{2}))*\@)?((\[(((([0-9a-f]{1,4}:){6}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|(::([0-9a-f]{1,4}:){5}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|(([0-9a-f]{1,4})?::([0-9a-f]{1,4}:){4}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){3}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){2}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4})|((([0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::))|(v[0-9a-f]+.[0-9a-z\-._~!$&'\(\)*+,;=:]+))\])|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))|(([0-9a-z\-._~!$&'\(\)*+,;=]|(%[0-9a-f]{2}))+))(:[0-9]*)?(\/([0-9a-z\-._~!$&'\(\)*+,;=:@]|(%[0-9a-f]{2}))*)*(\?([0-9a-z\-._~!$&'\(\)*+,;=:@\/\?]|(%[0-9a-f]{2}))*)?(#([0-9a-z\-._~!$&'\(\)*+,;=:@\/\?]|(%[0-9a-f]{2}))*)?)/i;
function replaceHrefLink(obj) {
var obj_list = obj.childNodes;
for(var i = 0; i < obj_list.length; ++i) {
var obj = obj_list[i];
var pObj = obj.parentNode;
if(!pObj) continue;
var pN = pObj.nodeName.toLowerCase();
if($.inArray(pN, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style']) != -1) continue;
if(obj.nodeType == 3 && obj.length >= 10) {
var content = obj.nodeValue;
if(!/(http|https|ftp|news|telnet|irc):\/\//i.test(content)) continue;
content = content.replace(/</g, '&lt;');
content = content.replace(/>/g, '&gt;');
content = content.replace(url_regx, '<a href="$1" onclick="window.open(this.href); return false;">$1</a>');
$(obj).replaceWith(content);
delete(content);
} else if(obj.nodeType == 1 && obj.childNodes.length) {
replaceHrefLink(obj);
}
}
}
$('.xe_content').each(function() {
replaceHrefLink(this);
});
});

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">자동 링크 애드온</title>
<title xml:lang="jp">自動リンクアドオン</title>
<title xml:lang="en">Auto Link</title>
<title xml:lang="vi">Auto Link</title>
<title xml:lang="zh-CN">自动链接插件</title>
<title xml:lang="es">auto vínculo addon</title>
<title xml:lang="ru">авто ссылка аддон</title>
<title xml:lang="ge">Auto-Link Addon</title>
<title xml:lang="zh-TW">自動連結</title>
<description xml:lang="ko">
글과 댓글의 내용 중 URL 문자열에 링크를 걸어주는 애드온입니다.
</description>
<description xml:lang="jp">
書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ、または同一ウィンドウに開くメニュが現れるアドオンです。
</description>
<description xml:lang="en">
This addon makes a link to a string that starts with http.
</description>
<description xml:lang="vi">
Addon này sẽ tự động tạo ra một đường Link khi gặp chuỗi kí tự 'http' có trong bài viết.
</description>
<description xml:lang="zh-CN">
主题及评论中以http开始的字符串自动转换为链接。并且鼠标移到链接上方时将出现可选(新窗/本页面)提示框。
</description>
<description xml:lang="es">
Los comentarios que comienzan con http naeyongjung tema común de la cadena para vincular automáticamente a colgar el puntero del ratón sobre cada uno de los vínculos y saechang Ciudad y aparecen en el menú de add-on de decoración.
</description>
<description xml:lang="ru">
Комментарии, которые начинаются с http naeyongjung темой общей строки автоматически ссылку повесить мышь над каждой ссылке и saechang Сити и появляться на меню добавить-на украшения.
</description>
<description xml:lang="ge">
Kommentare beginnen mit http naeyongjung Thema der gemeinsamen String automatisch Link zu hängen Sie mit der Maus über die einzelnen Links und saechang Stadt und auf dem Menü des Add-On Dekoration.
</description>
<description xml:lang="zh-TW">
是種可將主題和評論內容中的URL網址字串自動轉換成連結的附加元件。
</description>
<version>0.1</version>
<date>2008-04-22</date>
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="zh-TW">zero</name>
</author>
</addon>

View file

@ -285,8 +285,17 @@
// 글 수정
case 'metaWeblog.editPost' :
$tmp_val = $params[0]->value->string->body;
if(!$tmp_val) $tmp_val = $params[0]->value->i4->body;
if(!$tmp_val) {
$content = getXmlRpcFailure(1, 'no permission');
break;
}
$tmp_arr = explode('/', $tmp_val);
$document_srl = array_pop($tmp_arr);
if(!$document_srl) {
$content = getXmlRpcFailure(1, 'no permission');
break;
}
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl);

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">BlogAPIアドオン</title>
<title xml:lang="zh-CN">BlogAPI</title>
<title xml:lang="en">Addon for BlogAPI</title>
<title xml:lang="vi">BlogAPI Addon</title>
<title xml:lang="ge">Addon für BlogAPI</title>
<title xml:lang="es">Addon para BlogAPI</title>
<title xml:lang="ru">Аддон для BlogAPI</title>
@ -32,6 +33,12 @@
URL to the api is http://setup_path/module_name/api.
RSD tag and the api will work only if u use this addon.
</description>
<description xml:lang="vi">
Addon BlogAPI này hỗ trợ metaWeblog..
Bằng việc sử dụng tùy chọn này, Tag RSD sẽ được hiển thị đến mỗi Module.
URL cho API có dạng http://setup_path/module_name/api.
RSD Tag và API chỉ làm việc khi Addon này được kích hoạt.
</description>
<description xml:lang="ge">
Diese blogApi addon metaWeblog unterstützt.
Durch die Verwendung dieser Option, die es ermöglicht RSD Tag ausgesetzt werden jedes Modul.
@ -61,6 +68,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>

View file

@ -24,7 +24,6 @@
Context::addHtmlHeader('<script type="text/javascript"> var captchaTargetAct = new Array("'.implode('","',$target_acts).'"); </script>');
// 캡챠 인증이 되지 않은 세션이면 실행 시작
if(!$_SESSION['captcha_authed']) {
@ -32,7 +31,7 @@
Context::loadLang(_XE_PATH_.'addons/captcha/lang');
// 캡챠 세션 세팅
if(Context::get('act')=='setCaptchaSession') {
if(Context::get('captcha_action')=='setCaptchaSession') {
$f = FileHandler::readDir('./addons/captcha/icon');
shuffle($f);
$key = rand(0,count($f)-1);
@ -50,7 +49,7 @@
exit();
// 캡챠 이미지 출력
} else if(Context::get('act')=='captchaImage') {
} else if(Context::get('captcha_action')=='captchaImage') {
$f = FileHandler::readDir('./addons/captcha/icon');
shuffle($f);
$keyword = $_SESSION['captcha_keyword'];
@ -82,7 +81,7 @@
exit();
// 캡챠 이미지 점검
} else if(Context::get('act')=='captchaCompare') {
} else if(Context::get('captcha_action')=='captchaCompare') {
$x = Context::get('mx');
$y = Context::get('my');
$sx = $_SESSION['captcha_x'];

View file

@ -45,7 +45,10 @@ var calledArgs = null;
if(doCheck) {
calledArgs = {'module':module,'act':act,'params':params,'callback_func':callback_func,'response_tags':response_tags,'callback_func_arg':callback_func_arg,'fo_obj':fo_obj};
oldExecXml('captcha','setCaptchaSession',new Array(),captchaXE.show,new Array('error','message','about','keyword'));
var params = new Array();
params['captcha_action'] = 'setCaptchaSession';
params['mid'] = current_mid;
oldExecXml(module, act, params, captchaXE.show,new Array('error','message','about','keyword'));
} else {
oldExecXml(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj);
}
@ -77,7 +80,7 @@ var calledArgs = null;
margin:"0 0 10px 0",
cursor:"pointer"
})
.attr("src", request_uri.setQuery('act','captchaImage').setQuery('rnd',Math.round(Math.random() * 6)))
.attr("src", current_url.setQuery('captcha_action','captchaImage').setQuery('rnd',Math.round(Math.random() * 6)))
.click (captchaXE.compare)
.focus( function() { this.blur(); } );
@ -99,9 +102,11 @@ var calledArgs = null;
var x = e.pageX - posX - 20;
var y = e.pageY - posY - 20;
var params = new Array();
params["mx"] = x;
params["my"] = y;
oldExecXml('captcha','captchaCompare',params, function() {
params['mx'] = x;
params['my'] = y;
params['captcha_action'] = 'captchaCompare';
params['mid'] = current_mid;
oldExecXml(calledArgs.module,calledArgs.act,params, function() {
$("#captcha_screen").css({ display:"none" });
oldExecXml(calledArgs.module, calledArgs.act, calledArgs.params, calledArgs.callback_func, calledArgs.response_tags, calledArgs.callback_func_arg, calledArgs.fo_obj);
} );

View file

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">Captcha 애드온</title>
<title xml:lang="en">CAPTCHA addon</title>
<title xml:lang="vi">Captcha Addon</title>
<title xml:lang="zh-CN">验证码插件</title>
<title xml:lang="jp">Captchaアドオン</title>
<title xml:lang="zh-TW">圖形驗證</title>
@ -8,6 +10,14 @@
프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다.
로그인하지 않은 경우에만 해당됩니다.
</description>
<description xml:lang="en">
To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment.
This addon applies only to not-logged-in users.
</description>
<description xml:lang="vi">
Addon này tạo ra một hình ảnh xác nhận khi đăng kí, gửi bài, hay viết bình luận nếu thành viên không đăng nhập.
Addon này chỉ hoạt động khi được kích hoạt.
</description>
<description xml:lang="zh-CN">
为了解决互联网垃圾而开发的验证码机制。
非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。
@ -27,26 +37,36 @@
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-TW">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
</author>
<extra_vars>
<var name="target" type="select">
<title xml:lang="ko">Captcha 표시 대상</title>
<title xml:lang="en">Captcha Target</title>
<title xml:lang="vi">Mục tiêu Captcha hiển thị</title>
<title xml:lang="zh-CN">应用对象</title>
<title xml:lang="jp">Captchaを表示する対象</title>
<title xml:lang="zh-TW">選擇目標</title>
<description xml:lang="ko">글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다</description>
<description xml:lang="en">You may specify targets CAPTCHA work. It's not applied when administrator writes.</description>
<description xml:lang="vi">Khi gửi bài, bình luận, Capcha sẽ hiển thị để xác nhận hành động của người sử dụng. Chức năng này không hoạt động với người quản lý.</description>
<description xml:lang="zh-CN">可以指定验证码应用对象(管理员除外)。</description>
<description xml:lang="jp">管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。</description>
<description xml:lang="zh-TW">除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。</description>
<options value="">
<title xml:lang="ko">로그인하지 않은 사용자</title>
<title xml:lang="en">Not logged-in users</title>
<title xml:lang="vi">Người dùng chưa đăng nhập</title>
<title xml:lang="zh-CN">非登录用户</title>
<title xml:lang="jp">ログインしてないユーザー</title>
<title xml:lang="zh-TW">非用戶</title>
</options>
<options value="all">
<title xml:lang="ko">모든 사용자</title>
<title xml:lang="en">All users</title>
<title xml:lang="vi">Tất cả mọi người</title>
<title xml:lang="zh-CN">所有用户</title>
<title xml:lang="jp">すべてのユーザー</title>
<title xml:lang="zh-TW">所有用戶</title>
@ -54,21 +74,29 @@
</var>
<var name="act_type" type="select">
<title xml:lang="ko">동작 방식</title>
<title xml:lang="en">How it works</title>
<title xml:lang="vi">Sử dụng</title>
<title xml:lang="zh-CN">验证方式</title>
<title xml:lang="jp">動作方式</title>
<title xml:lang="zh-TW">行為模式</title>
<description xml:lang="ko">"1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다</description>
<description xml:lang="en">If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes.</description>
<description xml:lang="vi">Nếu chọn "Chỉ một lần" thì sau lần hiển thị đó Capcha sẽ không hiển thị với người sử dụng đó nữa.</description>
<description xml:lang="zh-CN">"一次"就是每个IP只出现一次验证。</description>
<description xml:lang="jp">「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。</description>
<description xml:lang="zh-TW">選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。</description>
<options value="onetime">
<title xml:lang="ko">1번만 동작</title>
<title xml:lang="vi">Chỉ một lần</title>
<title xml:lang="en">once</title>
<title xml:lang="zh-CN">一次</title>
<title xml:lang="jp">1回だけ表示</title>
<title xml:lang="zh-TW">單次</title>
</options>
<options value="everytime">
<title xml:lang="ko">매번 동작</title>
<title xml:lang="en">every time</title>
<title xml:lang="vi">Luôn sử dụng</title>
<title xml:lang="zh-CN">每次</title>
<title xml:lang="jp">毎回表示</title>
<title xml:lang="zh-TW">每次</title>
@ -76,21 +104,29 @@
</var>
<var name="apply_find_account" type="select">
<title xml:lang="ko">비밀번호 찾기 적용</title>
<title xml:lang="en">applying to an action finding account</title>
<title xml:lang="vi">Khi lấy lại mật khẩu</title>
<title xml:lang="zh-CN">비밀번호 찾기 적용</title>
<title xml:lang="jp">비밀번호 찾기 적용</title>
<title xml:lang="zh-TW">비밀번호 찾기 적용</title>
<description xml:lang="ko">적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="en">If you set this option as apply, CAPTCHA will work for finding account action, too.</description>
<description xml:lang="vi">Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này.</description>
<description xml:lang="zh-CN">적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="jp">적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<options value="">
<title xml:lang="ko">적용하지 않음</title>
<title xml:lang="en">Not apply</title>
<title xml:lang="vi">Không áp dụng</title>
<title xml:lang="zh-CN">적용하지 않음</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
</options>
<options value="apply">
<title xml:lang="ko">적용</title>
<title xml:lang="en">Apply</title>
<title xml:lang="vi">Áp dụng</title>
<title xml:lang="zh-CN">적용</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>
@ -98,21 +134,29 @@
</var>
<var name="apply_resend_auth_mail" type="select">
<title xml:lang="ko">인증 메일 재발송 적용</title>
<title xml:lang="en">apply to an action resending authmail</title>
<title xml:lang="vi">Khi lấy lại mã kích hoạt</title>
<title xml:lang="zh-CN">인증 메일 재발송 적용</title>
<title xml:lang="jp">인증 메일 재발송 적용</title>
<title xml:lang="zh-TW">인증 메일 재발송 적용</title>
<description xml:lang="ko">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="en">If you set this option as apply, CAPTCHA will work for resending authmail action, too.</description>
<description xml:lang="vi">Nếu áp dụng, khi thành viên cần lấy lại mã kích hoạt thành viên, Capcha sẽ hiện thị để xác nhận việc này.</description>
<description xml:lang="zh-CN">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="jp">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<options value="">
<title xml:lang="ko">적용하지 않음</title>
<title xml:lang="en">Not apply</title>
<title xml:lang="vi">Không áp dụng</title>
<title xml:lang="zh-CN">적용하지 않음</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
</options>
<options value="apply">
<title xml:lang="ko">적용</title>
<title xml:lang="en">Apply</title>
<title xml:lang="vi">Áp dụng</title>
<title xml:lang="zh-CN">적용</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>

View file

@ -0,0 +1,23 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->about_captcha = "Xin chọn một ảnh mà có tên được liệt kê ở dưới:";
$lang->target_captcha = array(
"airplane" => "Máy bay",
"apple" => "Trái táo",
"book" => "Sách",
"camera" => "Camera",
"dog" => "Con chó",
"earth" => "Trái đất",
"flag" => "Lá cờ",
"mobile" =>"Di động",
"note" => "Nốt nhạc",
"skeleton" => "Xương",
);
?>

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">アクセスカウンターアドオン</title>
<title xml:lang="zh-CN">网站访问统计</title>
<title xml:lang="en">Counter Addon</title>
<title xml:lang="vi">Counter Addon</title>
<title xml:lang="ge">Counter Addon</title>
<title xml:lang="es">Addon contador básico</title>
<title xml:lang="ru">Аддон для базового счетчика</title>
@ -24,6 +25,10 @@
This addon logs access information based on the basic counter module within XE.
The access information will be collected only if you turn on this addon.
</description>
<description xml:lang="vi">
Addon này sẽ tổng hợp tất cả những lượt truy cập vào Website qua Module Counter có sẵn bên trong XE.
Thông tin truy nhập chỉ được tập hợp khi bạn bật Addon này..
</description>
<description xml:lang="ge">
Dieses Addon-Logs Zugriff auf Informationen basiert auf den grundlegenden Zähler-Modul innerhalb XE.
Der Zugang zu Informationen wird nur erhoben, wenn Sie über dieses Addon.
@ -45,6 +50,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">コミュニケーション</title>
<title xml:lang="zh-CN">会员交流</title>
<title xml:lang="en">Communication</title>
<title xml:lang="vi">Truyền thông</title>
<title xml:lang="ge">커뮤니케이션</title>
<title xml:lang="es">커뮤니케이션</title>
<title xml:lang="ru">커뮤니케이션</title>
@ -22,6 +23,10 @@
This addon enables communication module in order to use message or friend function.
Please enable this addon in case you want to use those functions.
</description>
<description xml:lang="vi">
Addon này cho phép sử dụng Module truyền thông để sử dụng tin nhắn hay chức năng bạn bè.
Hãy kích hoạt nếu bạn muốn sử dụng chức năng này.
</description>
<description xml:lang="ge">
커뮤니케이션 모듈의 기능을 활성화 시켜 쪽지나 친구기능을 사용할 수 있도록 해줍니다.
쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
@ -45,6 +50,7 @@
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>

View file

@ -0,0 +1,11 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->alert_new_message_arrived = 'Bạn có một tin nhắn mới. bạn có muốn kiểm tra ngay bây giờ không?';
?>

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">会員情報拡張表示</title>
<title xml:lang="zh-CN">用户扩展信息</title>
<title xml:lang="en">Extra Member Info</title>
<title xml:lang="vi">Bổ xung thông tin thành viên</title>
<title xml:lang="ge">회원 확장 정보 출력</title>
<title xml:lang="es">회원 확장 정보 출력</title>
<title xml:lang="ru">회원 확장 정보 출력</title>
@ -20,14 +21,17 @@
<description xml:lang="en">
This addon displays a member's image name, image mark.
</description>
<description xml:lang="vi">
Addon này sẽ hiển thị hình ảnh thay thế tên và hình đánh dấu của thành viên.
</description>
<description xml:lang="ge">
회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요.
This addon displays a member's image name, image mark.
</description>
<description xml:lang="es">
회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요.
This addon displays a member's image name, image mark.
</description>
<description xml:lang="ru">
회원이 등록한 이미지이름, 이미지마크를 사용하기 위해서는 이 애드온을 활성화 시키세요.
This addon displays a member's image name, image mark.
</description>
<description xml:lang="zh-TW">
可將用戶資料中的暱稱圖片、用戶圖示、簽名檔等資料顯示到頁面當中。
@ -37,6 +41,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">モバイルXEアドオン</title>
<title xml:lang="zh-CN">手机XE插件</title>
<title xml:lang="en">Mobile XE</title>
<title xml:lang="vi">Mobile XE</title>
<title xml:lang="zh-TW">XE行動上網</title>
<description xml:lang="ko">
모바일에서 접속시 헤더 정보를 분석하여 메뉴 - 모듈의 관계를 이용하여 WAP 태그로 출력하는 애드온입니다.
@ -21,6 +22,10 @@
This addon displays WAP tag by analyzing header information on mobile connection.
Only wml, hdml, mhtml formats are provided.
</description>
<description xml:lang="vi">
Addon này hiển thị WAP Tag bởi việc phân tích thông tin khi kết nối bằng di động.
Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml.
</description>
<description xml:lang="zh-TW">
透過行動工具上網時會將網頁轉換為WAP標籤顯示。
只限於 wml, hdml, mhtml格式。
@ -33,15 +38,17 @@
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="zh-TW">zero</name>
</author>
<history version="0.1.1" date="2009-05-23">
<author email_address="misol221@paran.com" link="http://www.imsoo.net">
<name xml:lang="ko">misol</name>
<name xml:lang="jp">misol</name>
<name xml:lang="jp">misol</name>
<name xml:lang="zh-CN">misol</name>
<name xml:lang="en">misol</name>
<name xml:lang="vi">misol</name>
<name xml:lang="zh-TW">misol</name>
</author>
<log>언어선택 추가(WML, mHTML)</log>
@ -55,6 +62,7 @@
<title xml:lang="jp">文字コード</title>
<title xml:lang="zh-CN">编码</title>
<title xml:lang="en">Charset</title>
<title xml:lang="vi">Charset</title>
<title xml:lang="zh-TW">編碼</title>
<description xml:lang="ko">
모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다.
@ -72,10 +80,15 @@
默认编码为UTF-8。
</description>
<description xml:lang="en">
utf-8 cannot be read for mobile tools.
utf-8 may be read with mobile tools.
Mobile tools will display correct charset when you input charset you want.
Default charset is UTF-8.
</description>
<description xml:lang="vi">
UTF-8 không thể đọc được cho các công cụ di động.
Những công cụ di động sẽ trình bày Charset đúng khi bạn nhập vào Charset bạn muốn.
Charset mặc định là UTF-8.
</description>
<description xml:lang="zh-TW">
行動工具無法讀取utf-8編碼。
當您輸入所想要的編碼時,行動工具將會正確的顯示。

View file

@ -0,0 +1,18 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
// lang select by misol
$lang->president_lang = 'Chọn ngôn ngữ';
$lang->select_lang = 'Chọn ngôn ngữ';
$lang->lang_return = 'Trở lại';
$lang->cmd_go_upper = 'Lên trên';
$lang->cmd_go_home = 'Về trang chủ';
$lang->cmd_view_sitemap = 'Xem sơ đồ Web';
?>

View file

@ -3,6 +3,7 @@
<title xml:lang="ko">OpenID delegation ID</title>
<title xml:lang="zh-CN">OpenID</title>
<title xml:lang="en">OpenID Delegation ID</title>
<title xml:lang="vi">OpenID Delegation ID</title>
<title xml:lang="ge">OpenID Delegation ID</title>
<title xml:lang="es">Delegación ID para OpenID</title>
<title xml:lang="jp">OpenIDアドオン</title>
@ -20,6 +21,10 @@
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="vi">
Addon này cho phép bạn sử dụng tên miền của mình như một OpenID.
Hãy kiểm tra để đặt giá trị liên quan với OpenID trước khi sử dụng.
</description>
<description xml:lang="ge">
Dieses Addon ermöglicht es Ihnen, mit Ihrem eigenen Domain-Namen als OpenID.
Einfach sicher sein, dass die Werte im Zusammenhang mit OpenID-Provider, bevor Sie.
@ -47,6 +52,7 @@
<name xml:lang="ko">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="jp">zero</name>
@ -59,6 +65,7 @@
<title xml:lang="ko">server</title>
<title xml:lang="zh-CN">server</title>
<title xml:lang="en">server</title>
<title xml:lang="vi">Server</title>
<title xml:lang="ge">server</title>
<title xml:lang="es">Servidor</title>
<title xml:lang="jp">server</title>
@ -66,7 +73,8 @@
<title xml:lang="zh-TW">server</title>
<description xml:lang="ko">openid.server 값을 입력해 주세요.</description>
<description xml:lang="zh-CN">请输入 openid.server 值。</description>
<description xml:lang="en">Please input your openid.server value.</description>
<description xml:lang="vi">Hãy nhập OpenID Server của bạn.</description>
<description xml:lang="en">Please input your openid.server value.</description>
<description xml:lang="ge">Bitte geben Sie Ihre openid.server Wert.</description>
<description xml:lang="es">Ingrese el valor del openid.server.</description>
<description xml:lang="jp">openid.server値を入力して下さい。</description>
@ -76,6 +84,7 @@
<var name="delegate">
<title xml:lang="ko">delegate</title>
<title xml:lang="en">delegate</title>
<title xml:lang="vi">Delegate</title>
<title xml:lang="ge">delegate</title>
<title xml:lang="zh-CN">delegate</title>
<title xml:lang="es">delegado</title>
@ -84,7 +93,8 @@
<title xml:lang="zh-TW">delegate</title>
<description xml:lang="ko">openid.delegate값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入 openid.delegate 值。</description>
<description xml:lang="en">Please input your openid.delegate value.</description>
<description xml:lang="vi">Hãy nhập OpenID Delegate của bạn.</description>
<description xml:lang="en">Please input your openid.delegate value.</description>
<description xml:lang="ge">Bitte geben Sie Ihre openid.delegate Wert.</description>
<description xml:lang="es">Ingresar el valor del openid.delegate</description>
<description xml:lang="jp">openid.delegate値を入力して下さい。</description>
@ -95,6 +105,7 @@
<title xml:lang="ko">xrds</title>
<title xml:lang="zh-CN">xrds</title>
<title xml:lang="en">xrds</title>
<title xml:lang="vi">xrds</title>
<title xml:lang="ge">xrds</title>
<title xml:lang="es">xrds</title>
<title xml:lang="jp">xrds</title>
@ -103,6 +114,7 @@
<description xml:lang="ko">X-XRDS-Location값을 입력해주세요.</description>
<description xml:lang="zh-CN">请输入 X-XRDS-Location 值。</description>
<description xml:lang="en">Please input your X-XRDS-Location value.</description>
<description xml:lang="vi">Hãy nhập X-XRDS-Location của bạn.</description>
<description xml:lang="ge">Bitte geben Sie Ihre X-XRDS-Standort Wert.</description>
<description xml:lang="es">Ingresar el valor de X-XRDS-Location</description>
<description xml:lang="jp">X-XRDS-Location値を入力して下さい。</description>

View file

@ -4,6 +4,7 @@
<title xml:lang="zh-CN">积分级别图标</title>
<title xml:lang="jp">ポイントレベルアイコン表示アドオン</title>
<title xml:lang="en">Point Level Icon</title>
<title xml:lang="vi">Icon cấp độ của điểm</title>
<title xml:lang="ge">Point-Level-Symbol</title>
<title xml:lang="es">Addon para mostar el nivel del ícono</title>
<title xml:lang="ru">Аддон для отображения иконки уровня</title>
@ -24,6 +25,10 @@
This addon displays level icon in front of the user name when you are using the point system.
You can choose the level icon in Module &gt; Point System.
</description>
<description xml:lang="vi">
Addon này sẽ hiển thị Icon cấp độ trước tên người sử dụng khi bạn sử dụng hệ thống tính điểm.
Bạn có thể chọn Icon cấp độ tại Module &gt; cỉa hệ thống điểm.
</description>
<description xml:lang="ge">
Dieses Addon zeigt Level Icon vor dem Benutzernamen, wenn Sie die Punkte-System.
Sie können wählen, der Level Icon in Modul> Point-System.
@ -48,6 +53,7 @@
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="ge">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="ru">zero</name>

View file

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">리퍼러 수집기</title>
<title xml:lang="jp">リファラーコレクター</title>
<title xml:lang="zh-CN">反向链接统计</title>
<title xml:lang="en">Referer Collector</title>
<title xml:lang="ge">Referer Collector</title>
<title xml:lang="es">Referer Collector</title>
<title xml:lang="ru">Сборщик рефералов</title>
<title xml:lang="zh-TW">反向連結統計</title>
<description xml:lang="ko">Referer log를 수집합니다.</description>
<description xml:lang="jp">リファラーログを収集します。</description>
<description xml:lang="zh-CN">记录反向链接统计数据。</description>
<description xml:lang="en">Collect referer log and statistics.</description>
<description xml:lang="ge">Sammeln Sie Referer-Log und Statistik.</description>
<description xml:lang="es">Recoger referer log y estadísticas.</description>
<description xml:lang="ru">Собирает лог рефералов и статистику.</description>
<description xml:lang="zh-TW">紀錄反向連結統計資料。</description>
<version>0.1</version>
<date>2007-11-26</date>
<author email_address="haneul0318@gmail.com" link="http://seungyeop.kr">
<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="ge">haneul</name>
<name xml:lang="es">haneul</name>
<name xml:lang="ru">haneul</name>
<name xml:lang="zn-TW">haneul</name>
</author>
</addon>

View file

@ -1,15 +0,0 @@
<?php
if(!defined("__ZBXE__")) exit();
/**
* @file referer.addon.php
* @author haneul (haneul0318@gmail.com)
**/
// called_position가 before_module_init 이고 module이 admin이 아닐 경우
if($called_position == 'before_module_init' && !$GLOBALS['__referer_addon_called__']) {
$oController = &getController('referer');
$oController->procRefererExecute();
$GLOBALS['__referer_addon_called__'] = true;
}
?>

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">本文内イメージリーサイズアドオン</title>
<title xml:lang="zh-CN">内容区图片缩放插件</title>
<title xml:lang="en">Image Resizer</title>
<title xml:lang="vi">Thay đổi cỡ hình ảnh</title>
<title xml:lang="es">Imagen de control add-on bonmunnae</title>
<title xml:lang="ru">Image контроля добавить-на bonmunnae</title>
<title xml:lang="ge">Image-Add-on bonmunnae</title>
@ -17,7 +18,10 @@
<description xml:lang="zh-CN">
自动调整主题内容区内的图片大小,点击将显示原始大小的插件。
</description>
<description xml:lang="en">
<description xml:lang="vi">
Addon này sẽ lấy lại kích thước nguyên bản của hình ảnh trong bài viết hoặc bình luận khi bạn bấm vào hình.
</description>
<description xml:lang="en">
This addon resizes images inserted in the article, and shows original image when you click on them.
</description>
<description xml:lang="es">
@ -37,6 +41,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="es">zero</name>

View file

@ -2,7 +2,7 @@
if(!defined("__ZBXE__")) exit();
/**
* @file reaize_image.addon.php
* @file resize_image.addon.php
* @author zero (zero@nzeo.com)
* @brief 본문내 이미지 조절 애드온
**/
@ -11,4 +11,4 @@
Context::loadJavascriptPlugin('ui');
Context::addJsFile('./addons/resize_image/js/resize_image.js',false);
}
?>
?>

View file

@ -11,7 +11,7 @@
var $content = null;
function isFromSmartPhone() {
return Context::get('smartphone') || preg_match('/(iPopd|iPhone|PPC)/',$_SERVER['HTTP_USER_AGENT']);
return Context::get('smartphone') || preg_match('/(iPod|iPhone|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']);
}
function haveSmartphoneModule($module) {
@ -75,9 +75,9 @@
}
function procSmartPhone($msg = null) {
if(preg_match('/(iPopd|iPhone)/',$_SERVER['HTTP_USER_AGENT'])) {
if(preg_match('/(iPod|iPhone)/',$_SERVER['HTTP_USER_AGENT'])) {
Context::addHtmlHeader('<meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>');
} else if(preg_match('/PPC/',$_SERVER['HTTP_USER_AGENT'])) {
} else if(preg_match('/SCH\-M[0-9]+/',$_SERVER['HTTP_USER_AGENT'])) {
Context::addHtmlHeader('<meta name="viewport" content="width=240; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>');
}

View file

@ -2,6 +2,7 @@
<addon version="0.2">
<title xml:lang="ko">SmartPhone XE 애드온</title>
<title xml:lang="en">SmartPhone XE</title>
<title xml:lang="vi">SmartPhone XE</title>
<title xml:lang="zh-TW">SmartPhone XE</title>
<title xml:lang="jp">SmartPhone XE アドオン</title>
<description xml:lang="ko">
@ -10,6 +11,9 @@
<description xml:lang="en">
This addon displays the best screen for users who use smartphones like IPhone (touch).
</description>
<description xml:lang="vi">
Addon này sẽ hiển thị Website trên màn hình iPhone một cách tốt nhất khi người dùng sử dụng SmartPhone để truy cập (iPhone cảm ứng)
</description>
<description xml:lang="zh-TW">
以 IPhone (touch) 和 smartphone 瀏覽時會以最適當的畫面顯示。
</description>
@ -21,6 +25,7 @@
<author email_address="haneul0318@gmail.com" link="http://seungyeop.kr">
<name xml:lang="ko">haneul</name>
<name xml:lang="en">haneul</name>
<name xml:lang="vi">haneul</name>
<name xml:lang="zh-TW">haneul</name>
<name xml:lang="jp">haneul</name>
</author>

View file

@ -85,6 +85,11 @@
// site_module_info를 구함
$oModuleModel = &getModel('module');
$site_module_info = $oModuleModel->getDefaultMid();
// site_module_info의 site_srl = 0 일 경우 db_config의 default_url과 비교
if($site_module_info->site_srl == 0 && $site_module_info->domain != $this->db_info->default_url) {
$site_module_info->domain = $this->db_info->default_url;
}
Context::set('site_module_info', $site_module_info);
if($site_module_info->site_srl && isSiteID($site_module_info->vid)) Context::set('vid', $site_module_info->vid);
@ -103,6 +108,7 @@
// 관리자 설정 언어값에 등록된 것이 아니라면 기본 언어로 변경
if(!$this->lang_type) $this->lang_type = "en";
if(is_array($lang_supported)&&!isset($lang_supported[$this->lang_type])) $this->lang_type = 'en';
Context::set('lang_supported', $lang_supported);
$this->setLangType($this->lang_type);
@ -316,7 +322,15 @@
static $lang_selected = null;
if(is_null($lang_selected)) {
$orig_lang_file = _XE_PATH_.'common/lang/lang.info';
$selected_lang_file = _XE_PATH_.'files/cache/lang_selected.info';
$selected_lang_file = _XE_PATH_.'files/config/lang_selected.info';
if(!file_exists($selected_lang_file) || !filesize($selected_lang_file)) {
$old_selected_lang_file = _XE_PATH_.'files/cache/lang_selected.info';
if(file_exists($old_selected_lang_file)) {
FileHandler::copyFile($old_selected_lang_file, $selected_lang_file);
FileHandler::removeFile($old_selected_lang_file);
}
}
if(!file_exists($selected_lang_file) || !filesize($selected_lang_file)) {
$buff = FileHandler::readFile($orig_lang_file);
FileHandler::writeFile($selected_lang_file, $buff);
@ -443,13 +457,15 @@
**/
function getBrowserTitle() {
$oContext = &Context::getInstance();
return $oContext->_getBrowserTitle();
return htmlspecialchars($oContext->_getBrowserTitle());
}
/**
* @brief 사이트 title return
**/
function _getBrowserTitle() {
$oModuleController = &getController('module');
$oModuleController->replaceDefinedLangCode($this->site_title);
return $this->site_title;
}
@ -761,16 +777,17 @@
/**
* @brief 요청받은 url에 args_list를 적용하여 return
**/
function getUrl($num_args=0, $args_list=array(), $domain = null) {
function getUrl($num_args=0, $args_list=array(), $domain = null, $encode = true) {
$oContext = &Context::getInstance();
return $oContext->_getUrl($num_args, $args_list, $domain);
return $oContext->_getUrl($num_args, $args_list, $domain, $encode);
}
/**
* @brief 요청받은 url에 args_list를 적용하여 return
**/
function _getUrl($num_args=0, $args_list=array(), $domain = null) {
function _getUrl($num_args=0, $args_list=array(), $domain = null, $encode = true) {
static $site_module_info = null;
static $current_info = null;
// 가상 사이트 정보를 구함
if(is_null($site_module_info)) $site_module_info = Context::get('site_module_info');
@ -790,9 +807,10 @@
// $domain값이 있을 경우 현재 요청된 도메인과 비교해서 동일할 경우 제거 그렇지 않으면 http 프로토콜을 제거하고 제일 뒤에 / 를 붙임
if($domain) {
$domain_info = parse_url($domain);
$current_info = parse_url($_SERVER['HTTP_HOST'].getScriptPath());
if($domain_info['host'].$domain_info['path']==$current_info['host'].$current_info['path']) unset($domain);
else {
if(is_null($current_info)) $current_info = parse_url(($_SERVER['HTTPS']=='on'?'https':'http').'://'.$_SERVER['HTTP_HOST'].getScriptPath());
if($domain_info['host'].$domain_info['path']==$current_info['host'].$current_info['path']) {
unset($domain);
} else {
$domain = preg_replace('/^(http|https):\/\//i','', trim($domain));
if(substr($domain,-1) != '/') $domain .= '/';
}
@ -879,20 +897,28 @@
}
}
// XE가 설치된 절대 경로를 구해서 query를 완성
// 항상 SSL을 이용하고 현재 SSL이 아닌 경우 https에 대한 prefix를 붙임
if(Context::get('_use_ssl')=='always') {
if($_SERVER['HTTPS']!='on') $query = $this->getRequestUri(ENFORCE_SSL, $domain).$query;
$query = $this->getRequestUri(ENFORCE_SSL, $domain).$query;
// 상황에 따라 혹은 지정된 대상만 SSL 취급될 경우
} elseif(Context::get('_use_ssl')=='optional') {
$ssl_mode = RELEASE_SSL;
if($get_vars['act'] && $this->_isExistsSSLAction($get_vars['act'])) $ssl_mode = ENFORCE_SSL;
$query = $this->getRequestUri($ssl_mode, $domain).$query;
// SSL 을 사용하지 않을 경우
} else {
// SSL상태인데 대상이 SSL이 아닌 경우
if($_SERVER['HTTPS']=='on') $query = $this->getRequestUri(ENFORCE_SSL, $domain).$query;
// SSL 상태가 아니면 domain값에 따라 query 완성
if($_SERVER['HTTPS']=='on' ) $query = $this->getRequestUri(ENFORCE_SSL, $domain).$query;
// $domain 값이 있을 경우
else if($domain) $query = $this->getRequestUri(FOLLOW_REQUEST_SSL, $domain).$query;
// $domain 값이 없을 경우
else $query = getScriptPath().$query;
}
return htmlspecialchars($query);
if($encode) return htmlspecialchars($query);
return $query;
}
/**
@ -903,7 +929,6 @@
// HTTP Request가 아니면 패스
if(!isset($_SERVER['SERVER_PROTOCOL'])) return ;
if(Context::get('_use_ssl') == "always") $ssl_mode = ENFORCE_SSL;
if($domain) $domain_key = md5($domain);
@ -1087,6 +1112,10 @@
* @brief js file을 추가
**/
function _addJsFile($file, $optimized, $targetie,$index) {
if(strpos($file,'://')===false && substr($file,0,1)!='/' && substr($file,0,1)!='.') $file = './'.$file;
$file = str_replace(array('/./','//'),'/',$file);
while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file);
if(in_array($file, $this->js_files)) return;
if(is_null($index)) $index=count($this->js_files);
@ -1181,6 +1210,10 @@
* @brief CSS file 추가
**/
function _addCSSFile($file, $optimized, $media, $targetie, $index) {
if(strpos($file,'://')===false && substr($file,0,1)!='/' && substr($file,0,1)!='.') $file = './'.$file;
$file = str_replace(array('/./','//'),'/',$file);
while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file);
if(in_array($file, $this->css_files)) return;
if(is_null($index)) $index=count($this->css_files);

View file

@ -2,22 +2,22 @@
/**
* @class DB
* @author zero (zero@nzeo.com)
* @brief DB* 상위 클래스
* @brief base class of db* classes
* @version 0.1
*
* XE의 DB 사용은 xml을 이용하여 이루어짐을 원칙으로 한다.
* xml의 종류에는 query xml, schema xml있다.
* query xml의 경우 DB::executeQuery() method를 이용하여 xml파일을 php code로 compile한 후에 실행이 된다.
* query xml고유한 query id를 가지며 생성은 module에서 이루어진다.
* usage of db in XE is via xml
* there are 2 types of xml - query xml, schema xml
* in case of query xml, DB::executeQuery() method compiles xml file into php code and then execute it
* query xml has unique query id, and will be created in module
*
* queryid = 모듈.쿼리명
* queryid = module_name.query_name
**/
class DB {
var $count_cache_path = 'files/cache/db';
var $cond_operation = array( ///< 조건문에서 조건을 등호로 표시하는 변수
var $cond_operation = array( ///< operations for condition
'equal' => '=',
'more' => '>=',
'excess' => '>',
@ -32,28 +32,30 @@
var $result = NULL; ///< result
var $errno = 0; ///< 에러 발생시 에러 코드 (0이면 에러가 없다고 정의)
var $errstr = ''; ///< 에러 발생시 에러 메세지
var $query = ''; ///< 가장 최근에 수행된 query string
var $elapsed_time = 0; ///< 가장 최근에 수행된 query 의 실행시간
var $errno = 0; ///< error code (0 means no error)
var $errstr = ''; ///< error message
var $query = ''; ///< query string of latest executed query
var $elapsed_time = 0; ///< elapsed time of latest executed query
var $transaction_started = false; ///< 트랙잭션 처리 flag
var $transaction_started = false; ///< transaction flag
var $is_connected = false; ///< DB에 접속이 되었는지에 대한 flag
var $is_connected = false; ///< is db connected
var $supported_list = array(); ///< 지원하는 DB의 종류, classes/DB/DB***.class.php 를 이용하여 동적으로 작성됨
var $supported_list = array(); ///< list of supported db, (will be written by classes/DB/DB***.class.php)
var $cache_file = 'files/cache/queries/'; ///< query cache파일의 위치
var $cache_file = 'files/cache/queries/'; ///< location of query cache
/**
* @brief DB를 상속받는 특정 db type의 instance를 생성 return
* @brief returns instance of certain db type
* @param[in] $db_type type of db
* @return instance
**/
function &getInstance($db_type = NULL) {
if(!$db_type) $db_type = Context::getDBType();
if(!$db_type && Context::isInstalled()) return new Object(-1, 'msg_db_not_setted');
if(!$GLOBALS['__DB__']) {
$class_name = sprintf("DB%s%s", strtoupper(substr($db_type,0,1)), strtolower(substr($db_type,1)));
$class_name = sprintf("DB%s%s", strtoupper(substr($db_type, 0, 1)), strtolower(substr($db_type,1)));
$class_file = sprintf("%sclasses/db/%s.class.php", _XE_PATH_, $class_name);
if(!file_exists($class_file)) new Object(-1, 'msg_db_not_setted');
@ -67,6 +69,7 @@
/**
* @brief constructor
* @return none
**/
function DB() {
$this->count_cache_path = _XE_PATH_.$this->count_cache_path;
@ -74,7 +77,8 @@
}
/**
* @brief 지원 가능한 DB 목록을 return
* @brief returns list of supported db
* @return list of supported db
**/
function getSupportedList() {
$oDB = new DB();
@ -82,7 +86,8 @@
}
/**
* @brief 지원 가능한 DB 목록을 return
* @brief returns list of supported db
* @return list of supported db
**/
function _getSupportedList() {
$db_classes_path = _XE_PATH_."classes/db/";
@ -90,8 +95,8 @@
$supported_list = FileHandler::readDir($db_classes_path, $filter, true);
sort($supported_list);
// 구해진 클래스의 객체 생성후 isSupported method를 통해 지원 여부를 판단
for($i=0;$i<count($supported_list);$i++) {
// after creating instance of class, check is supported
for($i = 0; $i < count($supported_list); $i++) {
$db_type = $supported_list[$i];
if(version_compare(phpversion(), '5.0') < 0 && preg_match('/pdo/i',$db_type)) continue;
@ -109,7 +114,7 @@
$obj = null;
$obj->db_type = $db_type;
$obj->enable = $oDB->isSupported()?true:false;
$obj->enable = $oDB->isSupported() ? true : false;
$this->supported_list[] = $obj;
}
@ -118,7 +123,9 @@
}
/**
* @brief 지원하는 DB인지에 대한 check
* @brief check if the db_type is supported
* @param[in] $db_type type of db to check
* @return true: is supported, false: is not supported
**/
function isSupported($db_type) {
$supported_list = DB::getSupportedList();
@ -126,24 +133,30 @@
}
/**
* @brief 접속되었는지 return
* @brief check if is connected
* @return true: connected, false: not connected
**/
function isConnected() {
return $this->is_connected?true:false;
return $this->is_connected ? true : false;
}
/**
* @brief 로그 남김
* @brief start recording log
* @return none
**/
function actStart($query) {
$this->setError(0,'success');
$this->setError(0, 'success');
$this->query = $query;
$this->act_start = getMicroTime();
$this->elapsed_time = 0;
}
/**
* @brief finish recording log
* @return none
**/
function actFinish() {
if(!$this->query ) return;
if(!$this->query) return;
$this->act_finish = getMicroTime();
$elapsed_time = $this->act_finish - $this->act_start;
$this->elapsed_time = $elapsed_time;
@ -152,7 +165,7 @@
$log['query'] = $this->query;
$log['elapsed_time'] = $elapsed_time;
// 에러 발생시 에러 로그를 남김 (__DEBUG_DB_OUTPUT__이 지정되어 있을경우)
// leave error log if an error occured (if __DEBUG_DB_OUTPUT__ is defined)
if($this->isError()) {
$log['result'] = 'Failed';
$log['errno'] = $this->errno;
@ -173,7 +186,7 @@
}
$GLOBALS['__db_queries__'][] = $log;
// __LOG_SLOW_QUERY__ 가 정해져 있다면 시간 체크후 쿼리 로그 남김
// if __LOG_SLOW_QUERY__ if defined, check elapsed time and leave query log
if(__LOG_SLOW_QUERY__>0 && $elapsed_time > __LOG_SLOW_QUERY__) {
$buff = '';
$log_file = _XE_PATH_.'files/_db_slow_query.php';
@ -181,7 +194,7 @@
$buff = '<?php exit();?>'."\n";
}
$buff .= sprintf("%s\t%s\n\t%0.6f sec\n\n", date("Y-m-h H:i"), $this->query, $elapsed_time);
if($fp = fopen($log_file,'a')) {
if($fp = fopen($log_file, 'a')) {
fwrite($fp, $buff);
fclose($fp);
}
@ -190,7 +203,10 @@
}
/**
* @brief 에러발생시 에러 메세지를 남기고 debug 모드일때는 GLOBALS 변수에 에러 로깅
* @brief set error
* @param[in] $errno error code
* @param[in] $errstr error message
* @return none
**/
function setError($errno = 0, $errstr = 'success') {
$this->errno = $errno;
@ -198,14 +214,16 @@
}
/**
* @brief 오류가 발생하였는지 return
* @brief check if an error occured
* @return true: error, false: no error
**/
function isError() {
return $this->errno===0?false:true;
return $this->errno === 0 ? false : true;
}
/**
* @brief 에러결과를 Object 객체로 return
* @brief returns object of error info
* @return object of error
**/
function getError() {
return new Object($this->errno, $this->errstr);
@ -213,19 +231,20 @@
/**
* @brief query xml 파일을 실행하여 결과를 return
*
* query_id = module.queryname
* query_id에 해당하는 xml문(or 캐싱파일) 찾아서 컴파일 실행
* @param[in] $query_id query id (module.queryname
* @param[in] $args arguments for query
* @return result of query
* @remarks this function finds xml file or cache file of $query_id, compiles it and then execute it
**/
function executeQuery($query_id, $args = NULL) {
if(!$query_id) return new Object(-1, 'msg_invalid_queryid');
$id_args = explode('.', $query_id);
if(count($id_args)==2) {
if(count($id_args) == 2) {
$target = 'modules';
$module = $id_args[0];
$id = $id_args[1];
} elseif(count($id_args)==3) {
} elseif(count($id_args) == 3) {
$target = $id_args[0];
if(!in_array($target, array('addons','widgets'))) return;
$module = $id_args[1];
@ -236,37 +255,45 @@
$xml_file = sprintf('%s%s/%s/queries/%s.xml', _XE_PATH_, $target, $module, $id);
if(!file_exists($xml_file)) return new Object(-1, 'msg_invalid_queryid');
// 캐쉬파일을 찾아 본다
$cache_file = $this->checkQueryCacheFile($query_id,$xml_file);
// look for cache file
$cache_file = $this->checkQueryCacheFile($query_id, $xml_file);
// 쿼리를 실행한다
// execute query
return $this->_executeQuery($cache_file, $args, $query_id);
}
/**
* @brief 캐쉬파일을 찾아 본다
*
* @brief look for cache file
* @param[in] $query_id query id for finding
* @param[in] $xml_file original xml query file
* @return cache file
**/
function checkQueryCacheFile($query_id,$xml_file){
// 일단 cache 파일을 찾아본다
// first try finding cache file
$cache_file = sprintf('%s%s%s.cache.php', _XE_PATH_, $this->cache_file, $query_id);
if(file_exists($cache_file)) $cache_time = filemtime($cache_file);
else $cache_time = -1;
// 캐시 파일이 없거나 시간 비교하여 최근것이 아니면 원본 쿼리 xml파일을 찾아서 파싱을 한다
if($cache_time<filemtime($xml_file) || $cache_time < filemtime(_XE_PATH_.'classes/db/DB.class.php')) {
// if there is no cache file or is not new, find original xml query file and parse it
if($cache_time < filemtime($xml_file) || $cache_time < filemtime(_XE_PATH_.'classes/db/DB.class.php')) {
require_once(_XE_PATH_.'classes/xml/XmlQueryParser.class.php');
$oParser = new XmlQueryParser();
$oParser->parse($query_id, $xml_file, $cache_file);
}
return $cache_file;
}
/**
* @brief 쿼리문을 실행하고 결과를 return한다
* @brief execute query and return the result
* @param[in] $cache_file cache file of query
* @param[in] $source_args arguments for query
* @param[in] $query_id query id
* @return result of query
**/
function _executeQuery($cache_file, $source_args, $query_id) {
global $lang;
@ -277,10 +304,10 @@
$output = @include($cache_file);
if( (is_a($output, 'Object')||is_subclass_of($output,'Object'))&&!$output->toBool()) return $output;
if( (is_a($output, 'Object') || is_subclass_of($output, 'Object')) && !$output->toBool()) return $output;
$output->_tables = ($output->_tables && is_array($output->_tables)) ? $output->_tables : array();
// action값에 따라서 쿼리 생성으로 돌입
// execute appropriate query
switch($output->action) {
case 'insert' :
$this->resetCountCache($output->tables);
@ -302,14 +329,18 @@
if($this->errno != 0 ) $output = new Object($this->errno, $this->errstr);
else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object();
$output->add('_query', $this->query);
$output->add('_elapsed_time', sprintf("%0.5f",$this->elapsed_time));
$output->add('_elapsed_time', sprintf("%0.5f", $this->elapsed_time));
return $output;
}
/**
* @brief $val을 $filter_type으로 검사
* XmlQueryParser에서 사용하도록
* @brief check $val with $filter_type
* @param[in] $key key value
* @param[in] $val value of $key
* @param[in] $filter_type type of filter to check $val
* @return object
* @remarks this function is to be used from XmlQueryParser
**/
function checkFilter($key, $val, $filter_type) {
global $lang;
@ -317,24 +348,24 @@
switch($filter_type) {
case 'email' :
case 'email_address' :
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));
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(!preg_match('/^(http|https)+(:\/\/)+[0-9a-z_-]+\.[^ ]+$/is', $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(!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));
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(!preg_match('/^(-?)[0-9,]+$/is', $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(!preg_match('/^[a-z]+$/is', $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(!preg_match('/^[0-9a-z]+$/is', $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;
}
@ -342,32 +373,41 @@
}
/**
* @brief 컬럼의 타입을 구해옴
* 컬럼의 경우 a.b 같이 되어 있는 경우가 있어서 별도 함수가 필요
* @brief returns type of column
* @param[in] $column_type_list list of column type
* @param[in] $name name of column type
* @return column type of $name
* @remarks columns are usually like a.b, so it needs another function
**/
function getColumnType($column_type_list, $name) {
if(strpos($name,'.')===false) return $column_type_list[$name];
list($prefix, $name) = explode('.',$name);
if(strpos($name, '.') === false) return $column_type_list[$name];
list($prefix, $name) = explode('.', $name);
return $column_type_list[$name];
}
/**
* @brief 이름, , operation, type으로 값을 변경
* like, like_prefix의 경우 value자체가 변경됨
* type == number가 아니면 addQuotes() 하고 ' ' 묶음
* @brief returns the value of condition
* @param[in] $name name of condition
* @param[in] $value value of condition
* @param[in] $operation operation this is used in condition
* @param[in] $type type of condition
* @param[in] $column_type type of column
* @return well modified $value
* @remarks if $operation is like or like_prefix, $value itself will be modified
* @remarks if $type is not 'number', call addQuotes() and wrap with ' '
**/
function getConditionValue($name, $value, $operation, $type, $column_type) {
if($type == 'number') {
if(strpos($value,',')===false && strpos($value,'(')===false) return (int)$value;
if(strpos($value, ',') === false && strpos($value, '(') === false) return (int)$value;
return $value;
}
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) {
list($table_name, $column_name) = explode('.',$value);
if(strpos($name, '.') !== false && strpos($value, '.') !== false) {
list($table_name, $column_name) = explode('.', $value);
if($column_type[$column_name]) return $value;
}
$value = preg_replace('/(^\'|\'$){1}/','',$value);
$value = preg_replace('/(^\'|\'$){1}/', '', $value);
switch($operation) {
case 'like_prefix' :
@ -391,8 +431,11 @@
}
/**
* @brief 이름, , operation으로 조건절 작성
* 조건절을 완성하기 위해 세부 조건절 마다 정리를 해서 return
* @brief returns part of condition
* @param[in] $name name of condition
* @param[in] $value value of condition
* @param[in] $operation operation that is used in condition
* @return detail condition
**/
function getConditionPart($name, $value, $operation) {
switch($operation) {
@ -407,7 +450,7 @@
case 'in' :
case 'notin' :
case 'notequal' :
// 변수가 세팅되지 않고, 문자열이나 숫자형이 아니면 리턴
// if variable is not set or is not string or number, return
if(!isset($value)) return;
if($value === '') return;
if(!in_array(gettype($value), array('string', 'integer'))) return;
@ -453,7 +496,9 @@
}
/**
* @brief condition key를 return
* @brief returns condition key
* @param[in] $output result of query
* @return array of conditions of $output
**/
function getConditionList($output) {
$conditions = array();
@ -471,7 +516,10 @@
}
/**
* @brief 카운터 캐시 데이터 얻어오기
* @brief returns counter cache data
* @param[in] $tables tables to get data
* @param[in] $condition condition to get data
* @return count of cache data
**/
function getCountCache($tables, $condition) {
return false;
@ -502,7 +550,11 @@
}
/**
* @brief 카운터 캐시 데이터 저장
* @brief save counter cache data
* @param[in] $tables tables to save data
* @param[in] $condition condition to save data
* @param[in] $count count of cache data to save
* @return none
**/
function putCountCache($tables, $condition, $count = 0) {
return false;
@ -523,7 +575,9 @@
}
/**
* @brief 카운터 캐시 리셋
* @brief reset counter cache data
* @param[in] $tables tables to reset cache data
* @return true: success, false: failed
**/
function resetCountCache($tables) {
return false;
@ -534,14 +588,19 @@
foreach($tables as $alias => $table) {
$filename = sprintf('%s/cache.%s%s', $this->count_cache_path, $this->prefix, $table);
FileHandler::removeFile($filename);
FileHandler::writeFile( $filename, '' );
FileHandler::writeFile($filename, '');
}
return true;
}
/**
* @brief returns supported database list
* @return list of supported database
**/
function getSupportedDatabase(){
$result = array();
if(function_exists('mysql_connect')) $result[] = 'MySQL';
if(function_exists('cubrid_connect')) $result[] = 'Cubrid';
if(function_exists('ibase_connect')) $result[] = 'FireBird';
@ -549,6 +608,7 @@
if(function_exists('sqlite_open')) $result[] = 'sqlite2';
if(function_exists('mssql_connect')) $result[] = 'MSSQL';
if(function_exists('PDO')) $result[] = 'sqlite3(PDO)';
return $result;
}

View file

@ -322,16 +322,16 @@
$table_name = $this->prefix.$table_name;
$query = sprintf('create class %s;', $table_name);
$query = sprintf('create class "%s";', $table_name);
$this->_query($query);
$query = sprintf("call change_owner('%s','%s') on class db_root;", $table_name, $this->userid);
$this->_query($query);
/*$query = sprintf("call change_owner('%s','%s') on class db_root;", $table_name, $this->userid);
$this->_query($query); */
if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column;
else $columns = $xml_obj->table->column;
$query = sprintf("alter class %s add attribute ", $table_name);
$query = sprintf("alter class \"%s\" add attribute ", $table_name);
foreach($columns as $column) {
$name = $column->attrs->name;
@ -352,7 +352,7 @@
break;
}
if($default && !is_numeric($default)) $default = "'".$default."'";
if($default && (!is_numeric($default) || $default[0] == "+")) $default = "'".$default."'";
$column_schema[] = sprintf('"%s" %s%s %s %s',
$name,
@ -384,7 +384,7 @@
if(count($index_list)) {
foreach($index_list as $key => $val) {
$query = sprintf("create index %s_%s on %s (%s);", $table_name, $key, $table_name, '"'.implode('","',$val).'"');
$query = sprintf("create index \"%s_%s\" on %s (%s);", $table_name, $key, $table_name, '"'.implode('","',$val).'"');
$this->_query($query);
}
}
@ -422,11 +422,13 @@
$value = $this->getConditionValue($name, $value, $operation, $type, $column_type);
if(!$value) {
$value = $v['value'];
if(strpos($value, ".") == false) $valuetmp = $value;
else $valuetmp = '"'.str_replace('.', '"."', $value).'"';
$value = $v['value'];
if (strpos ($value, '(')) $valuetmp = $value;
elseif (strpos ($value, ".") === false) $valuetmp = $value;
else $valuetmp = '"'.str_replace('.', '"."', $value).'"';
} else $valuetmp = $value;
if(strpos($name, ".") == false) $nametmp = '"'.$name.'"';
if (strpos ($name, '(')) $nametmp = $name;
elseif (strpos ($name, ".") === false) $nametmp = '"'.$name.'"';
else $nametmp = '"'.str_replace('.', '"."', $name).'"';
$str = $this->getConditionPart($nametmp, $valuetmp, $operation);
if($sub_condition) $sub_condition .= ' '.$pipe.' ';
@ -488,7 +490,7 @@
function _executeUpdateAct($output) {
// 테이블 정리
foreach($output->tables as $key => $val) {
$table_list[] = "\"".$this->prefix.$val."\" as ".$key;
$table_list[] = '"'.$this->prefix.$val.'" as "'.$key.'"';
}
// 컬럼 정리
@ -496,10 +498,10 @@
if(!isset($val['value'])) continue;
$name = $val['name'];
$value = $val['value'];
for ($i = 0; $i < $key; $i++) { // 한문장에 같은 속성에 대한 중복 설정은 큐브리드에서는 허용치 않음
if ($output->columns[$i]['name'] == $name) break;
}
if ($i < $key) continue; // 중복이 발견되면 이후의 설정은 무시
for ($i = 0; $i < $key; $i++) { // 한문장에 같은 속성에 대한 중복 설정은 큐브리드에서는 허용치 않음
if ($output->columns[$i]['name'] == $name) break;
}
if ($i < $key) continue; // 중복이 발견되면 이후의 설정은 무시
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
else {
if($output->column_type[$name]!='number') {
@ -565,12 +567,12 @@
$left_join = array();
// why???
$left_tables= (array)$output->left_tables;
$left_tables = (array)$output->left_tables;
foreach($left_tables as $key => $val) {
$condition = $this->_getCondition($output->left_conditions[$key],$output->column_type);
if($condition){
$left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as "'.$key . '" on (' . $condition . ')';
$left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" "'.$key . '" on (' . $condition . ')';
}
}
@ -580,21 +582,29 @@
$column_list = array();
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
$click_count = '%s';
if($val['click_count'] && count($output->conditions)>0){
$click_count = 'incr(%s)';
}
$alias = $val['alias'] ? sprintf('"%s"',$val['alias']) : null;
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
if($alias) $column_list[] = sprintf('"%s" as "%s"', $name, $alias);
else $column_list[] = sprintf('"%s"',$name);
$name = sprintf($click_count,$name);
if($alias) $column_list[] = sprintf('%s as %s', $name, $alias);
else $column_list[] = sprintf('%s',$name);
} else {
if(strpos($name,'.')!=false) {
list($prefix, $name) = explode('.',$name);
$deli=($name == '*') ? "" : "\"";
if($alias) $column_list[] = sprintf("%s.$deli%s$deli as \"%s\"", $prefix, $name, $alias);
else $column_list[] = sprintf("%s.$deli%s$deli",$prefix,$name);
$prefix = sprintf('"%s"',$prefix);
$name = ($name == '*') ? $name : sprintf('"%s"',$name);
$column_list[] = sprintf($click_count,sprintf('%s.%s', $prefix, $name)) . ($alias ? sprintf(' as %s',$alias) : '');
} else {
if($alias) $column_list[] = sprintf('%s as "%s"', $name, $alias);
else $column_list[] = sprintf('%s',$name);
$column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : '');
}
}
}
@ -607,7 +617,19 @@
$query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if (count ($output->groups)) {
foreach ($output->groups as &$value) {
if (strpos ($value, '.')) {
$tmp = explode ('.', $value);
$tmp[0] = sprintf ('"%s"', $tmp[0]);
$tmp[1] = sprintf ('"%s"', $tmp[1]);
$value = implode ('.', $tmp);
}
elseif (strpos ($value, '(')) $value = $value;
else $value = sprintf ('"%s"', $value);
}
$query .= sprintf(' group by %s', implode(',',$output->groups));
}
// list_count를 사용할 경우 적용
if($output->list_count['value']) {
@ -617,7 +639,16 @@
if ($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf('%s %s', $val[0]=='count'?'count(*)':$val[0], $val[1]);
if (strpos ($val[0], '.')) {
$tmpval = explode ('.', $val[0]);
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
$val[0] = implode ('.', $tmpval);
}
elseif (strpos ($val[0], '(')) $val[0] = $val[0];
elseif ($val[0] == 'count') $val[0] = 'count (*)';
else $val[0] = sprintf ('"%s"', $val[0]);
$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 + 1, $list_count + $start_count);
@ -637,7 +668,16 @@
if($output->order) {
foreach($output->order as $key => $val) {
$index_list[] = sprintf('%s %s', $val[0]=='count'?'count(*)':$val[0], $val[1]);
if (strpos ($val[0], '.')) {
$tmpval = explode ('.', $val[0]);
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
$val[0] = implode ('.', $tmpval);
}
elseif (strpos ($val[0], '(')) $val[0] = $val[0];
elseif ($val[0] == 'count') $val[0] = 'count (*)';
else $val[0] = sprintf ('"%s"', $val[0]);
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);
}
@ -757,10 +797,31 @@
$query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if (count ($output->groups)) {
foreach ($output->groups as &$value) {
if (strpos ($value, '.')) {
$tmp = explode ('.', $value);
$tmp[0] = sprintf ('"%s"', $tmp[0]);
$tmp[1] = sprintf ('"%s"', $tmp[1]);
$value = implode ('.', $tmp);
}
elseif (strpos ($value, '(')) $value = $value;
else $value = sprintf ('"%s"', $value);
}
$query .= sprintf(' group by %s', implode(',',$output->groups));
}
if ($output->order) {
foreach($output->order as $key => $val) {
if (strpos ($val[0], '.')) {
$tmpval = explode ('.', $val[0]);
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
$val[0] = implode ('.', $tmpval);
}
elseif (strpos ($val[0], '(')) $val[0] = $val[0];
elseif ($val[0] == 'count') $val[0] = 'count (*)';
else $val[0] = sprintf ('"%s"', $val[0]);
$index_list[] = sprintf('%s %s', $val[0], $val[1]);
}
if(count($index_list)) $query .= ' order by '.implode(',',$index_list);

View file

@ -83,7 +83,7 @@
$this->fd = @ibase_connect($host, $this->userid, $this->password);
if(ibase_errmsg()) {
$this->setError(ibase_errcode(), ibase_errmsg());
return;
return $this->is_connected = false;
}
// Firebird 버전 확인후 2.0 이하면 오류 표시
@ -94,7 +94,8 @@
}
else {
$this->setError(ibase_errcode(), ibase_errmsg());
return;
@ibase_close($this->fd);
return $this->is_connected = false;
}
$pos = strpos($server_info, "Firebird");
@ -105,7 +106,8 @@
if($ver < "2.0") {
$this->setError(-1, "XE cannot be installed under the version of firebird 2.0. Current firebird version is ".$ver);
return;
@ibase_close($this->fd);
return $this->is_connected = false;
}
// 접속체크
@ -117,7 +119,9 @@
**/
function close() {
if(!$this->isConnected()) return;
ibase_close($this->fd);
@ibase_commit($this->fd);
@ibase_close($this->fd);
$this->transaction_started = false;
}
/**
@ -186,18 +190,11 @@
$string = trim(substr($string, $no1+1, $no2-$no1-1));
}
// 테이블.필드
if(($no1 = strpos($string,'.'))!==false) {
$tmpString1 = substr($string, 0, $no1); // table
$tmpString2 = substr($string, $no1+1, strlen($string)-$no1+1); // field
// (테이블.컬럼) 구조 일때 처리
preg_match("/((?i)[a-z0-9_-]+)[.]((?i)[a-z0-9_\-\*]+)/", $string, $matches);
$tmpString1 = trim($tmpString1);
$tmpString2 = trim($tmpString2);
$tmpString1 = $this->addDoubleQuotes($tmpString1);
if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2);
$string = $tmpString1.".".$tmpString2;
if($matches) {
$string = $this->addDoubleQuotes($matches[1]).".".$this->addDoubleQuotes($matches[2]);
}
else {
$string = $this->addDoubleQuotes($string);
@ -217,37 +214,32 @@
$tok = strtok(",");
}
foreach($values as $val) {
if(($no1 = strpos($val,'.'))!==false) {
$tmpString1 = substr($val, 0, $no1); // table
$tmpString2 = substr($val, $no1+1, strlen($val)-$no1+1); // field
$tmpString1 = trim($tmpString1);
$tmpString2 = trim($tmpString2);
foreach($values as $val1) {
// (테이블.컬럼) 구조 일때 처리
preg_match("/((?i)[a-z0-9_-]+)[.]((?i)[a-z0-9_\-\*]+)/", $val1, $matches);
if($matches) {
$isTable = false;
foreach($tables as $key => $val) {
if($key == $tmpString1) $isTable = true;
if($val == $tmpString1) $isTable = true;
foreach($tables as $key2 => $val2) {
if($key2 == $matches[1]) $isTable = true;
if($val2 == $matches[1]) $isTable = true;
}
if($isTable) {
$tmpString1 = $this->addDoubleQuotes($tmpString1);
if($tmpString2 != "*") $tmpString2 = $this->addDoubleQuotes($tmpString2);
$return[] = $tmpString1.".".$tmpString2;
$return[] = $this->addDoubleQuotes($matches[1]).".".$this->addDoubleQuotes($matches[2]);
}
else {
$return[] = $tmpString1.".".$tmpString2;
$return[] = $val1;
}
}
else if(!is_numeric($val)) {
if(strpos($val, "'") !== 0)
$return[] = "'".$val."'";
else if(!is_numeric($val1)) {
if(strpos($val1, "'") !== 0)
$return[] = "'".$val1."'";
else
$return[] = $val;
$return[] = $val1;
}
else {
$return[] = $val;
$return[] = $val1;
}
}
@ -258,20 +250,26 @@
* @brief 트랜잭션 시작
**/
function begin() {
if(!$this->isConnected() || $this->transaction_started) return;
$this->transaction_started = true;
}
/**
* @brief 롤백
**/
function rollback() {
//@ibase_rollback($this->fd);
if(!$this->isConnected() || !$this->transaction_started) return;
@ibase_rollback($this->fd);
$this->transaction_started = false;
}
/**
* @brief 커밋
**/
function commit() {
//@ibase_commit($this->fd);
if(!$force && (!$this->isConnected() || !$this->transaction_started)) return;
@ibase_commit($this->fd);
$this->transaction_started = false;
}
/**
@ -367,13 +365,11 @@
$query = sprintf("select rdb\$relation_name from rdb\$relations where rdb\$system_flag=0 and rdb\$relation_name = '%s%s';", $this->prefix, $target_name);
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if(!$tmp)
{
@ibase_rollback($this->fd);
if(!$tmp) {
if(!$this->transaction_started) @ibase_rollback($this->fd);
return false;
}
//commit();
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
return true;
}
@ -382,7 +378,10 @@
**/
function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) {
$type = $this->column_type[$type];
if(strtoupper($type)=='INTEGER') $size = '';
if(strtoupper($type)=='INTEGER') $size = null;
else if(strtoupper($type)=='BIGINT') $size = null;
else if(strtoupper($type)=='BLOB SUB_TYPE TEXT SEGMENT SIZE 32') $size = null;
else if(strtoupper($type)=='VARCHAR' && !$size) $size = 256;
$query = sprintf("ALTER TABLE \"%s%s\" ADD \"%s\" ", $this->prefix, $table_name, $column_name);
if($size) $query .= sprintf(" %s(%s) ", $type, $size);
@ -391,8 +390,7 @@
if($notnull) $query .= " NOT NULL ";
$this->_query($query);
//commit();
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
}
/**
@ -401,6 +399,7 @@
function dropColumn($table_name, $column_name) {
$query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name);
$this->_query($query);
if(!$this->transaction_started) @ibase_commit($this->fd);
}
@ -410,10 +409,13 @@
function isColumnExists($table_name, $column_name) {
$query = sprintf("SELECT RDB\$FIELD_NAME as \"FIELD\" FROM RDB\$RELATION_FIELDS WHERE RDB\$RELATION_NAME = '%s%s'", $this->prefix, $table_name);
$result = $this->_query($query);
if($this->isError()) return;
if($this->isError()) {
if(!$this->transaction_started) @ibase_rollback($this->fd);
return false;
}
$output = $this->_fetch($result);
//commit();
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
if($output) {
$column_name = strtolower($column_name);
@ -435,8 +437,8 @@
$query = sprintf('CREATE %s INDEX "%s" ON "%s%s" ("%s");', $is_unique?'UNIQUE':'', $index_name, $this->prefix, $table_name, implode('", "',$target_columns));
$this->_query($query);
//commit();
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
}
/**
@ -445,6 +447,8 @@
function dropIndex($table_name, $index_name, $is_unique = false) {
$query = sprintf('DROP INDEX "%s" ON "%s%s"', $index_name, $this->prefix, $table_name);
$this->_query($query);
if(!$this->transaction_started) @ibase_commit($this->fd);
}
@ -469,9 +473,14 @@
$result = $this->_query($query);
if($this->isError()) return;
$output = $this->_fetch($result);
//commit();
@ibase_commit($this->fd);
if(!$output) return;
if(!$output) {
if(!$this->transaction_started) @ibase_rollback($this->fd);
return false;
}
if(!$this->transaction_started) @ibase_commit($this->fd);
if(!is_array($output)) $output = array($output);
for($i=0;$i<count($output);$i++) {
if(trim($output[$i]->KEY_NAME) == $index_name) return true;
@ -529,6 +538,8 @@
$auto_increment = $column->attrs->auto_increment;
if($this->column_type[$type]=='INTEGER') $size = null;
else if($this->column_type[$type]=='BIGINT') $size = null;
else if($this->column_type[$type]=='BLOB SUB_TYPE TEXT SEGMENT SIZE 32') $size = null;
else if($this->column_type[$type]=='VARCHAR' && !$size) $size = 256;
$column_schema[] = sprintf('"%s" %s%s %s %s',
@ -558,8 +569,7 @@
$schema = sprintf("CREATE TABLE \"%s\" (%s%s); \n", $table_name, "\n", implode($column_schema, ",\n"));
$output = $this->_query($schema);
//commit();
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
if(!$output) return false;
if(count($index_list)) {
@ -574,8 +584,7 @@
$schema = sprintf("CREATE INDEX \"%s\" ON \"%s\" (\"%s\");",
$index_name, $table_name, implode($val, "\",\""));
$output = $this->_query($schema);
//commit();
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
if(!$output) return false;
}
}
@ -583,7 +592,7 @@
foreach($auto_increment_list as $increment) {
$schema = sprintf('CREATE GENERATOR GEN_%s_ID;', $table_name);
$output = $this->_query($schema);
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
if(!$output) return false;
// Firebird에서 auto increment는 generator를 만들어 insert 발생시 트리거를 실행시켜
@ -610,7 +619,7 @@
**/
function getCondition($output) {
if(!$output->conditions) return;
$condition = $this->_getCondition($output->conditions,$output->column_type,$output->tables);
$condition = $this->_getCondition($output->conditions,$output->column_type,$output->_tables);
if($condition) $condition = ' where '.$condition;
return $condition;
}
@ -671,6 +680,7 @@
$value = str_replace("'", "`", $value);
if($output->column_type[$name]=="text" || $output->column_type[$name]=="bigtext"){
if(!isset($val['value'])) continue;
$blh = ibase_blob_create($this->fd);
ibase_blob_add($blh, $value);
$value = ibase_blob_close($blh);
@ -687,7 +697,7 @@
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $questions));
$result = $this->_query($query, $value_list);
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
return $result;
}
@ -739,7 +749,7 @@
$query = sprintf("update %s set %s %s;", implode(',',$table_list), implode(',',$column_list), $condition);
$result = $this->_query($query, $values);
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
return $result;
}
@ -758,7 +768,7 @@
$query = sprintf("delete from %s %s;", implode(',',$table_list), $condition);
$result = $this->_query($query);
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
return $result;
}
@ -780,7 +790,7 @@
$left_tables= (array)$output->left_tables;
foreach($left_tables as $key => $val) {
$condition = $this->getLeftCondition($output->left_conditions[$key],$output->column_type,$output->tables);
$condition = $this->getLeftCondition($output->left_conditions[$key],$output->column_type,$output->_tables);
if($condition){
$left_join[] = $val . ' "'.$this->prefix.$output->_tables[$key].'" as "'.$key.'" on (' . $condition . ')';
}
@ -794,6 +804,7 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if($alias == "")
$column_list[] = $this->autoQuotes($name);
@ -843,9 +854,20 @@
$query .= ";";
$result = $this->_query($query);
if($this->isError()) return;
if($this->isError()) {
if(!$this->transaction_started) @ibase_rollback($this->fd);
return;
}
$data = $this->_fetch($result, $output);
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$buff = new Object();
$buff->data = $data;
@ -890,7 +912,7 @@
if($total_count === false) {
$result = $this->_query($count_query);
$count_output = $this->_fetch($result);
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $condition, $total_count);
@ -940,6 +962,8 @@
$result = $this->_query($query);
if($this->isError()) {
if(!$this->transaction_started) @ibase_rollback($this->fd);
$buff = new Object();
$buff->total_count = 0;
$buff->total_page = 0;
@ -974,7 +998,7 @@
$data[$virtual_no--] = $tmp;
}
@ibase_commit($this->fd);
if(!$this->transaction_started) @ibase_commit($this->fd);
$buff = new Object();
$buff->total_count = $total_count;

View file

@ -3,7 +3,7 @@
/**
* @class DBMSSQL
* @author zero (zero@nzeo.com)
* @brief MSSQL ADODB로
* @brief MSSQL driver로 수정 sol (sol@ngleader.com)
* @version 0.1
**/
@ -12,10 +12,10 @@
/**
* DB를 이용하기 위한 정보
**/
var $conn = NULL;
var $rs = NULL;
var $database = NULL; ///< database
var $prefix = 'xe'; ///< XE에서 사용할 테이블들의 prefix (한 DB에서 여러개의 XE 설치 가능)
var $conn = NULL;
var $database = NULL; ///< database
var $prefix = 'xe'; ///< XE에서 사용할 테이블들의 prefix (한 DB에서 여러개의 XE 설치 가능)
var $param = array();
/**
* @brief mssql 에서 사용될 column type
@ -46,8 +46,7 @@
* @brief 설치 가능 여부를 return
**/
function isSupported() {
return false;
if(!class_exists('COM')) return false;
if (!extension_loaded("sqlsrv")) return false;
return true;
}
@ -73,22 +72,31 @@
// db 정보가 없으면 무시
if(!$this->hostname || !$this->database) return;
$this->conn = new COM("ADODB.Connection",NULL,CP_UTF8);
//$this->conn = new COM("ADODB.Connection");
$this->conn->open( sprintf('Provider=sqloledb;Data Source=%s;Initial Catalog=%s;Network Library=dbmssocn;User ID=%s;Password=%s;', $this->hostname, $this->database, $this->userid, $this->password));
// 접속체크
$this->is_connected = true;
//sqlsrv_configure( 'WarningsReturnAsErrors', 0 );
//sqlsrv_configure( 'LogSeverity', SQLSRV_LOG_SEVERITY_ALL );
//sqlsrv_configure( 'LogSubsystems', SQLSRV_LOG_SYSTEM_ALL );
$this->conn = sqlsrv_connect( $this->hostname,
array( 'Database' => $this->database,'UID'=>$this->userid,'PWD'=>$this->password ));
// 접속체크
if($this->conn){
$this->is_connected = true;
}else{
$this->is_connected = false;
}
}
/**
* @brief DB접속 해제
**/
function close() {
if(!$this->isConnected()) return;
if($this->is_connected == false) return;
$this->commit();
$this->conn->close();
$this->rs = $this->conn = null;
sqlsrv_close($this->conn);
$this->conn = null;
}
/**
@ -96,7 +104,8 @@
**/
function addQuotes($string) {
if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string));
if(!is_numeric($string)) $string = str_replace("'","''",$string);
//if(!is_numeric($string)) $string = str_replace("'","''",$string);
return $string;
}
@ -104,30 +113,30 @@
* @brief 트랜잭션 시작
**/
function begin() {
return;
if(!$this->isConnected() || $this->transaction_started) return;
if($this->is_connected == false || $this->transaction_started) return;
if(sqlsrv_begin_transaction( $this->conn ) === false) return;
$this->transaction_started = true;
$this->_query("BEGIN TRANSACTION XE_Transaction");
}
/**
* @brief 롤백
**/
function rollback() {
return;
if(!$this->isConnected() || !$this->transaction_started) return;
$this->transaction_started = false;
$this->_query("ROLLBACK TRANSACTION XE_Transaction");
if($this->is_connected == false || !$this->transaction_started) return;
$this->transaction_started = false;
sqlsrv_rollback( $this->conn );
}
/**
* @brief 커밋
**/
function commit($force = false) {
return;
if(!$force && (!$this->isConnected() || !$this->transaction_started)) return;
if(!$force && ($this->is_connected == false || !$this->transaction_started)) return;
$this->transaction_started = false;
$this->_query("COMMIT TRANSACTION XE_Transaction");
sqlsrv_commit( $this->conn );
}
/**
@ -140,47 +149,63 @@
* return\n
**/
function _query($query) {
if(!$this->isConnected() || !$query) return;
$this->rs = new COM("ADODB.Recordset");
$this->rs->CursorLocation=3;
if($this->is_connected == false || !$query) return;
$_param = array();
if(count($this->param)){
foreach($this->param as $k => $o){
if($o['type'] == 'number'){
$_param[] = &$o['value'];
}else{
$_param[] = array(&$o['value'], SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('utf-8'));
}
}
}
// 쿼리 시작을 알림
$this->actStart($query);
// 쿼리 문 실행
//try {
//@$this->rs->open($query,$this->conn,0,1,1);
//} catch(Exception $e) {
//$this->setError('MSSQL Error in '.$query);
//}
// 쿼리 문 실행
$result = false;
if(count($_param)){
$result = @sqlsrv_query($this->conn, $query, $_param);
}else{
$result = @sqlsrv_query($this->conn, $query);
}
// 오류 체크
if(!$result) $this->setError(print_r(sqlsrv_errors(),true));
// 쿼리 실행 종료를 알림
$this->actFinish();
$this->param = array();
return $result;
}
/**
* @brief 결과를 fetch
**/
function _fetch() {
if(!$this->isConnected() || $this->isError() || !$this->rs) return;
function _fetch($result) {
if(!$this->isConnected() || $this->isError() || !$result) return;
$c = sqlsrv_num_fields($result);
$m = null;
$output = array();
$k = (int)$this->rs->Fields->Count;
for($i=0;!$this->rs->EOF;$this->rs->MoveNext(),$i++){
while(sqlsrv_fetch($result)){
if(!$m) $m = sqlsrv_field_metadata($result);
unset($row);
for($j=0;$j<$k;$j++){
$row->{$this->rs[$j]->name} = $this->rs[$j]->value;
}
$output[$i]=$row;
}
$this->rs->close();
$this->rs = null;
if(count($output)==1) return $output[0];
for($i=0;$i<$c;$i++){
$row->{$m[$i]['Name']} = sqlsrv_get_field( $result, $i, SQLSRV_PHPTYPE_STRING( 'utf-8' ));
}
$output[] = $row;
}
if(count($output)==1) return $output[0];
return $output;
}
/**
@ -189,9 +214,12 @@
function getNextSequence() {
$query = sprintf("insert into %ssequence (seq) values (ident_incr('%ssequence'))", $this->prefix, $this->prefix);
$this->_query($query);
$query = sprintf("select ident_current('%ssequence')+1 as sequence", $this->prefix);
$this->_query($query);
$tmp = $this->_fetch();
$result = $this->_query($query);
$tmp = $this->_fetch($result);
return $tmp->sequence;
}
@ -200,8 +228,9 @@
**/
function isTableExists($target_name) {
$query = sprintf("select name from sysobjects where name = '%s%s' and xtype='U'", $this->prefix, $this->addQuotes($target_name));
$this->_query($query);
$tmp = $this->_fetch();
$result = $this->_query($query);
$tmp = $this->_fetch($result);
if(!$tmp) return false;
return true;
}
@ -237,9 +266,9 @@
**/
function isColumnExists($table_name, $column_name) {
$query = sprintf("select syscolumns.name as name from syscolumns, sysobjects where sysobjects.name = '%s%s' and sysobjects.id = syscolumns.id and syscolumns.name = '%s'", $this->prefix, $table_name, $column_name);
$this->_query($query);
$result = $this->_query($query);
if($this->isError()) return;
$tmp = $this->_fetch();
$tmp = $this->_fetch($result);
if(!$tmp->name) return false;
return true;
}
@ -272,9 +301,9 @@
function isIndexExists($table_name, $index_name) {
$query = sprintf("select sysindexes.name as name from sysindexes, sysobjects where sysobjects.name = '%s%s' and sysobjects.id = sysindexes.id and sysindexes.name = '%s'", $this->prefix, $table_name, $index_name);
$this->_query($query);
$result = $this->_query($query);
if($this->isError()) return;
$tmp = $this->_fetch();
$tmp = $this->_fetch($result);
if(!$tmp->name) return false;
return true;
@ -386,6 +415,7 @@
function _getCondition($conditions,$column_type) {
$condition = '';
foreach($conditions as $val) {
$sub_condition = '';
foreach($val['condition'] as $v) {
@ -397,6 +427,7 @@
if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name);
$operation = $v['operation'];
$value = $v['value'];
$type = $this->getColumnType($column_type,$name);
$pipe = $v['pipe'];
@ -414,6 +445,75 @@
return $condition;
}
function getConditionValue($name, $value, $operation, $type, $column_type) {
if($type == 'number') {
if(strpos($value,',')===false && strpos($value,'(')===false){
if(is_integer($value)){
$this->param[] = array('type'=>'number','value'=>(int)$value);
return '?';
}else{
return $value;
}
}
}
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) {
list($table_name, $column_name) = explode('.',$value);
if($column_type[$column_name]){
return $value;
}
}
switch($operation) {
case 'like_prefix' :
$value = preg_replace('/(^\'|\'$){1}/','',$value);
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
$value = "? + '%'";
break;
case 'like_tail' :
$value = preg_replace('/(^\'|\'$){1}/','',$value);
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
$value = "'%' + ?";
break;
case 'like' :
$value = preg_replace('/(^\'|\'$){1}/','',$value);
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
$value = "'%' + ? + '%'";
break;
case 'notin' :
preg_match_all('/,?\'([^\']*)\'/',$value,$match);
$val = array();
foreach($match[1] as $k => $v){
$this->param[] = array('type'=>$column_type[$name],'value'=>trim($v));
$val[] ='?';
}
$value = join(',',$val);
break;
case 'in' :
preg_match_all('/,?\'([^\']*)\'/',$value,$match);
$val = array();
foreach($match[1] as $k => $v){
$this->param[] = array('type'=>$column_type[$name],'value'=>trim($v));
$val[] ='?';
}
$value = join(',',$val);
break;
default:
$value = preg_replace('/(^\'|\'$){1}/','',$value);
$this->param[] = array('type'=>$column_type[$name],'value'=>$value);
$value = '?';
break;
}
return $value;
}
/**
* @brief insertAct 처리
**/
@ -428,13 +528,21 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$value = $val['value'];
if($output->column_type[$name]!='number') {
$value = "'".$this->addQuotes($value)."'";
if(!$value) $value = 'null';
} elseif(!$value || is_numeric($value)) $value = (int)$value;
$value = $this->addQuotes($value);
if(!$value) $value = '';
} elseif(is_numeric($value)){
if(!$value) $value = '';
$value = (int)$value;
} elseif(!$value){
$value = '';
}
$column_list[] = '['.$name.']';
$value_list[] = $value;
$value_list[] = '?';
$this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value);
}
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
@ -450,18 +558,33 @@
foreach($output->tables as $key => $val) {
$table_list[] = '['.$this->prefix.$val.']';
}
// 컬럼 정리
// 컬럼 정리
foreach($output->columns as $key => $val) {
if(!isset($val['value'])) continue;
$name = $val['name'];
$value = $val['value'];
if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value;
else {
if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'";
elseif(!$value || is_numeric($value)) $value = (int)$value;
if(strpos($name,'.')!==false&&strpos($value,'.')!==false){
$column_list[] = $name.' = '.$value;
} else {
if($output->column_type[$name]!='number'){
$value = $this->addQuotes($value);
if(!$value) $value = '';
$this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value);
$column_list[] = sprintf("[%s] = ?", $name);
}elseif(!$value || is_numeric($value)){
$value = (int)$value;
$this->param[] = array('type'=>$output->column_type[$name], 'value'=>$value);
$column_list[] = sprintf("[%s] = ?", $name);
}else{
if(!$value) $value = '';
$column_list[] = sprintf("[%s] = %s", $name, $value);
}
$column_list[] = sprintf("[%s] = %s", $name, $value);
}
}
@ -522,6 +645,8 @@
$name = $val['name'];
if(preg_match('/^substr\(/i',$name)) $name = preg_replace('/^substr\(/i','substring(',$name);
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
@ -536,8 +661,7 @@
}
$condition = $this->getCondition($output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
// list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가
@ -555,7 +679,15 @@
$query = sprintf("%s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition);
if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups));
if(count($output->groups)){
foreach($output->groups as $k => $v ){
if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v);
}
$query .= sprintf(' group by %s', implode(',',$output->groups));
}
if($output->order && !preg_match('/count\(\*\)/i',$columns) ) {
foreach($output->order as $key => $val) {
@ -568,10 +700,18 @@
// list_count를 사용할 경우 적용
if($output->list_count['value']) $query = sprintf('select top %d %s', $output->list_count['value'], $query);
else $query = "select ".$query;
$this->_query($query);
$result = $this->_query($query);
if($this->isError()) return;
$data = $this->_fetch();
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$data = $this->_fetch($result);
$buff = new Object();
$buff->data = $data;
@ -587,14 +727,28 @@
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
// 전체 개수를 구함
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
if(count($output->groups)){
foreach($output->groups as $k => $v ){
if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v);
}
$count_condition = sprintf('%s group by %s', $condition, implode(', ', $output->groups));
}else{
$count_condition = $condition;
}
$total_count = $this->getCountCache($output->tables, $count_condition);
if($total_count === false) {
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
if (count($output->groups)) $count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
$this->_query($count_query);
$count_output = $this->_fetch();
$total_count = (int)$count_output->count;
$param = $this->param;
$result = $this->_query($count_query);
$this->param = $param;
$count_output = $this->_fetch($result);
$total_count = (int)$count_output->count;
$this->putCountCache($output->tables, $count_condition, $total_count);
}
@ -628,8 +782,13 @@
// group by 절 추가
if(count($output->groups)) $group .= sprintf('group by %s', implode(',',$output->groups));
if(count($output->groups)){
foreach($output->groups as $k => $v ){
if(preg_match('/^substr\(/i',$v)) $output->groups[$k] = preg_replace('/^substr\(/i','substring(',$v);
}
$group .= sprintf('group by %s', implode(',',$output->groups));
}
// order 절 추가
$order_targets = array();
if($output->order) {
@ -655,9 +814,12 @@
}
// 1차로 order 대상에 해당 하는 값을 가져옴
$param = $this->param;
$first_query = sprintf("select %s from (select top %d %s from %s %s %s %s %s) xet", implode(',',$first_columns), $start_count, implode(',',$first_sub_columns), implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order);
$this->_query($first_query);
$tmp = $this->_fetch();
$result = $this->_query($first_query);
$this->param = $param;
$tmp = $this->_fetch($result);
// 1차에서 나온 값을 이용 다시 쿼리 실행
@ -672,7 +834,8 @@
$query = sprintf('select top %d %s from %s %s %s %s %s', $list_count, $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $group, $order);
}
$this->_query($query);
$result = $this->_query($query);
if($this->isError()) {
$buff = new Object();
$buff->total_count = 0;
@ -684,15 +847,14 @@
return $buff;
}
$virtual_no = $total_count - ($page-1)*$list_count;
for($i=0;!$this->rs->EOF;$this->rs->MoveNext(),$i++){
unset($row);
for($j=0;$j<$this->rs->Fields->Count;$j++){
$row->{$this->rs[$j]->name} = $this->rs[$j]->value;
}
$data[$virtual_no--] = $row;
}
$this->rs = null;
$virtual_no = $total_count - ($page-1)*$list_count;
$output = $this->_fetch($result);
if(!is_array($output)) $output = array($output);
foreach($output as $k => $v) {
$data[$virtual_no--] = $v;
}
$buff = new Object();
$buff->total_count = $total_count;

View file

@ -519,6 +519,7 @@
}
}
$click_count = array();
if(!$output->columns) {
$columns = '*';
} else {
@ -526,6 +527,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
@ -572,6 +575,14 @@
$result = $this->_query($query);
if($this->isError()) return;
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$data = $this->_fetch($result);
$buff = new Object();

View file

@ -537,6 +537,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
@ -584,6 +586,15 @@
$result = $this->_query($query);
if($this->isError()) return;
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$data = $this->_fetch($result);
$buff = new Object();

View file

@ -675,6 +675,8 @@ class DBPostgresql extends DB
foreach ($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if (substr($name, -1) == '*') {
$column_list[] = $name;
} elseif (strpos($name, '.') === false && strpos($name, '(') === false) {
@ -758,6 +760,15 @@ class DBPostgresql extends DB
$result = $this->_query($query);
if ($this->isError())
return;
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$data = $this->_fetch($result);
$buff = new Object();

View file

@ -544,6 +544,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
@ -590,6 +592,14 @@
$result = $this->_query($query);
if($this->isError()) return;
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$data = $this->_fetch($result);
$buff = new Object();

View file

@ -587,6 +587,8 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$alias = $val['alias'];
if($val['click_count']) $click_count[] = $val['name'];
if(substr($name,-1) == '*') {
$column_list[] = $name;
} elseif(strpos($name,'.')===false && strpos($name,'(')===false) {
@ -635,6 +637,13 @@
$data = $this->_execute();
if($this->isError()) return;
if(count($click_count)>0 && count($output->conditions)>0){
$_query = '';
foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c);
$_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition);
$this->_query($_query);
}
$buff = new Object();
$buff->data = $data;
return $buff;

View file

@ -29,7 +29,8 @@
) $this->gz_enabled = true;
// request method에 따른 컨텐츠 결과물 추출
if(Context::getRequestMethod() == 'XMLRPC') $output = $this->_toXmlDoc($oModule);
if(Context::get('xeVirtualRequestMethod')=='xml') $output = $this->_toVirtualXmlDoc($oModule);
else if(Context::getRequestMethod() == 'XMLRPC') $output = $this->_toXmlDoc($oModule);
else if(Context::getRequestMethod() == 'JSON') $output = $this->_toJSON($oModule);
else $output = $this->_toHTMLDoc($oModule);
@ -80,6 +81,11 @@
$output = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
if(preg_match('/MSIE/i',$_SERVER['HTTP_USER_AGENT']) && (Context::get("_use_ssl")=='optional'||Context::get("_use_ssl")=="always")) {
Context::addHtmlFooter('<iframe id="xeTmpIframe" name="xeTmpIframe" style="width:1px;height:1px;position:absolute;top:-2px;left:-2px;"></iframe>');
}
}
}
@ -178,6 +184,34 @@
return $json;
}
/**
* @brief RequestMethod가 virtualXML이면 성공, 실패, redirect에 대해 컨텐츠 생성
**/
function _toVirtualXmlDoc(&$oModule) {
$error = $oModule->getError();
$message = $oModule->getMessage();
$redirect_url = $oModule->get('redirect_url');
$request_uri = Context::get('xeRequestURI');
$request_url = Context::get('xeVirtualRequestUrl');
if(substr($request_url,-1)!='/') $request_url .= '/';
if($error === 0) {
if($message != 'success') $output->message = $message;
if($redirect_url) $output->url = $redirect_url;
else $output->url = $request_uri;
} else {
if($message != 'fail') $output->message = $message;
}
$html = '<script type="text/javascript">'."\n";
if($output->message) $html .= 'alert("'.$output->message.'");'."\n";
if($output->url) {
$url = preg_replace('/#(.+)$/i','',$output->url);
$html .= 'self.location.href = "'.$request_url.'common/tpl/redirect.html?redirect_url='.urlencode($url).'";'."\n";
}
$html .= '</script>'."\n";
return $html;
}
/**
* @brief RequestMethod가 XML이면 XML 데이터로 컨텐츠 생성

View file

@ -20,7 +20,7 @@
/**
* @brief constructor
**/
function ExtraVar($module_srl) {
function ExtraVar($module_srl) {
$this->module_srl = $module_srl;
}
@ -32,7 +32,7 @@
if(!is_array($extra_keys) || !count($extra_keys)) return;
foreach($extra_keys as $key => $val) {
$obj = null;
$obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid);
$obj = new ExtraItem($val->module_srl, $val->idx, $val->name, $val->type, $val->default, $val->desc, $val->is_required, $val->search, $val->value, $val->eid);
$this->keys[$val->idx] = $obj;
}
}
@ -197,7 +197,7 @@
// 전화번호
case 'tel' :
$buff .=
$buff .=
'<input type="text" name="'.$column_name.'" value="'.$value[0].'" size="4" class="tel" />'.
'<input type="text" name="'.$column_name.'" value="'.$value[1].'" size="4" class="tel" />'.
'<input type="text" name="'.$column_name.'" value="'.$value[2].'" size="4" class="tel" />';
@ -230,7 +230,7 @@
$buff .= '</select>';
break;
// radio
// radio
case 'radio' :
$buff .= '<ul>';
foreach($default as $v) {
@ -246,13 +246,13 @@
// datepicker javascript plugin load
Context::loadJavascriptPlugin('ui.datepicker');
$buff .=
$buff .=
'<input type="hidden" name="'.$column_name.'" value="'.$value.'" />'.
'<input type="text" id="date_'.$column_name.'" value="'.zdate($value,'Y-m-d').'" readonly="readonly" class="date" />'."\n".
'<script type="text/javascript">'."\n".
'(function($){'."\n".
' $(function(){'."\n".
' var option = { gotoCurrent: false,yearRange:\'-100:+10\', onSelect:function(){'."\n".
' var option = { changeMonth:true, changeYear:true, gotoCurrent: false,yearRange:\'-100:+10\', onSelect:function(){'."\n".
' $(this).prev(\'input[type="hidden"]\').val(this.value.replace(/-/g,""))}'."\n".
' };'."\n".
' $.extend(option,$.datepicker.regional[\''.Context::getLangType().'\']);'."\n".

View file

@ -2,15 +2,15 @@
/**
* @class FileHandler
* @author zero (zero@nzeo.com)
* @brief 파일시스템을 쉽게 사용하기 위한 method를 모은 클래스
*
* 굳이 class로 만들필요는 없는데.. 소스 코드의 관리를 위하여..
* @brief contains methods for accessing file system
**/
class FileHandler extends Handler {
/**
* @brief 대상 파일, 디렉토리의 절대경로를 반환
* @brief changes path of target file, directory into absolute path
* @param[in] $source path
* @return absolute path
**/
function getRealPath($source) {
$temp = explode('/', $source);
@ -19,7 +19,13 @@
}
/**
* @brief 특정 디렉토리를 복사
* @brief copy a directory to target
* @param[in] $source_dir path of source directory
* @param[in] $target_dir path of target dir
* @param[in] $filter
* @param[in] $type
* @remarks if target directory does not exist, this function creates it
* @return none
**/
function copyDir($source_dir, $target_dir, $filter=null,$type=null){
$source_dir = FileHandler::getRealPath($source_dir);
@ -48,6 +54,13 @@
}
}
/**
* @brief copy a file to target
* @param[in] $source path of source file
* @param[in] $target path of target file
* @param[in] $force Y: overwrite
* @return none
**/
function copyFile($source, $target, $force='Y'){
$source = FileHandler::getRealPath($source);
$target_dir = FileHandler::getRealPath(dirname($target));
@ -58,7 +71,9 @@
}
/**
* @brief 파일의 내용을 읽어서 return
* @brief returns the content of the file
* @param[in] $file_name path of target file
* @return the content of the file. if target file does not exist, this function returns nothing.
**/
function readFile($file_name) {
$file_name = FileHandler::getRealPath($file_name);
@ -82,7 +97,11 @@
}
/**
* @brief $buff의 내용을 파일에 쓰기
* @brief write $buff into the specified file
* @param[in] $file_name path of target file
* @param[in] $buff content to be writeen
* @param[in] $mode a(append) / w(write)
* @return none
**/
function writeFile($file_name, $buff, $mode = "w") {
$file_name = FileHandler::getRealPath($file_name);
@ -100,7 +119,9 @@
}
/**
* @brief 파일 삭제
* @brief remove a file
* @param[in] $file_name path of target file
* @return none
**/
function removeFile($file_name) {
$file_name = FileHandler::getRealPath($file_name);
@ -108,7 +129,11 @@
}
/**
* @brief 파일이름이나 디렉토리명이나 위치 변경
* @brief rename a file
* @param[in] $source path of source file
* @param[in] $target path of target file
* @remarks In order to move a file, use this function.
* @return none
**/
function rename($source, $target) {
$source = FileHandler::getRealPath($source);
@ -117,14 +142,24 @@
}
/**
* @brief 특정 디렉토리를 이동
* @brief move a directory
* @param[in] $source_dir path of source directory
* @param[in] $target_dir path of target directory
* @remarks this function just wraps rename function.
* @return none
**/
function moveDir($source_dir, $target_dir) {
FileHandler::rename($source_dir, $target_dir);
}
/**
* @brief $path내의 파일들을 return ('.', '..', '.로 시작하는' 파일들은 제외)
* @brief return list of the files in the path
* @param[in] $path path of target directory
* @param[in] $filter if specified, return only files matching with the filter
* @param[in] $to_lower if true, file names will be changed into lower case.
* @param[in] $concat_prefix if true, return file name as absolute path
* @remarks the array does not contain files, such as '.', '..', and files starting with '.'
* @return array of the filenames in the path
**/
function readDir($path, $filter = '', $to_lower = false, $concat_prefix = false) {
$path = FileHandler::getRealPath($path);
@ -155,14 +190,15 @@
}
/**
* @brief 디렉토리 생성
*
* 주어진 경로를 단계별로 접근하여 recursive하게 디렉토리 생성
* @brief creates a directory
* @param[in] $path_string path of target directory
* @return true if success. it might return nothing when ftp is used and connection to the ftp address failed.
* @remarks This function creates directories recursively, which means that if ancestors of the target directory does not exist, they will be created too.
**/
function makeDir($path_string) {
static $oFtp = null;
// safe_mode 일 경우 ftp 정보를 이용해서 디렉토리 생성
// if safe_mode is on, use FTP
if(ini_get('safe_mode') && $oFtp == null) {
if(!Context::isFTPRegisted()) return;
@ -198,7 +234,9 @@
}
/**
* @brief 지정된 디렉토리 이하 모두 파일을 삭제
* @brief remove all files under the path
* @param[in] $path path of the target directory
* @return none
**/
function removeDir($path) {
$path = FileHandler::getRealPath($path);
@ -218,7 +256,9 @@
}
/**
* @brief 지정된 디렉토리에 내용이 없으면 삭제
* @brief remove a directory only if it is empty
* @param[in] $path path of the target directory
* @return none
**/
function removeBlankDir($path) {
$item_cnt = 0;
@ -237,7 +277,10 @@
/**
* @biref 지정된 디렉토리를 제외한 모든 파일을 삭제
* @biref remove files in the target directory.
* @param[in] $path path of the target directory
* @remarks This function keeps the directory structure.
* @return none
**/
function removeFilesInDir($path) {
$path = FileHandler::getRealPath($path);
@ -253,11 +296,12 @@
}
}
$directory->close();
@rmdir($path);
}
/**
* @brief byte단위의 파일크기를 적절하게 변환해서 return
* @brief makes file size byte into KB, MB according to the size
* @param[in] $size number of the size
* @return file size string
**/
function filesize($size) {
if(!$size) return "0Byte";
@ -267,9 +311,19 @@
}
/**
* @brief 원격파일을 다운받아 return
* @brief return remote file's content via HTTP
* @param[in] $url the address of the target file
* @param[in] $body HTTP request body
* @param[in] $timeout connection timeout
* @param[in] $method GET/POST
* @param[in] $content_type content type header of HTTP request
* @param[in] $headers headers key vaule array.
* @param[in] $cookies cookies key value array.
* @param[in] $post_data request arguments array for POST method
* @return if success, the content of the target file. otherwise: none
* @remarks if the target is moved (when return code is 300~399), this function follows the location specified response header.
**/
function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array()) {
function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) {
set_include_path(_XE_PATH_."libs/PEAR");
require_once('PEAR.php');
require_once('HTTP/Request.php');
@ -278,16 +332,26 @@
$oRequest = new HTTP_Request(__PROXY_SERVER__);
$oRequest->setMethod('POST');
$oRequest->_timeout = $timeout;
$oRequest->addPostData('arg', serialize(array('Destination'=>$url, 'method'=>$method, 'body'=>$body, 'content_type'=>$content_type, "headers"=>$headers)));
$oRequest->addPostData('arg', serialize(array('Destination'=>$url, 'method'=>$method, 'body'=>$body, 'content_type'=>$content_type, "headers"=>$headers, "post_data"=>$post_data)));
} else {
$oRequest = new HTTP_Request($url);
if(!$content_type) $oRequest->addHeader('Content-Type', 'text/html');
else $oRequest->addHeader('Content-Type', $content_type);
if(count($headers)) {
foreach($headers as $key => $val) {
$oRequest->addHeader($key, $val);
}
}
if($cookies[$host]) {
foreach($cookies[$host] as $key => $val) {
$oRequest->addCookie($key, $val);
}
}
if(count($post_data)) {
foreach($post_data as $key => $val) {
$oRequest->addPostData($key, $val);
}
}
if(!$content_type) $oRequest->addHeader('Content-Type', 'text/html');
else $oRequest->addHeader('Content-Type', $content_type);
$oRequest->setMethod($method);
if($body) $oRequest->setBody($body);
@ -298,32 +362,50 @@
$code = $oRequest->getResponseCode();
$header = $oRequest->getResponseHeader();
$body = $oRequest->getResponseBody();
$response = $oRequest->getResponseBody();
if($c = $oRequest->getResponseCookies()) {
foreach($c as $k => $v) {
$cookies[$host][$v['name']] = $v['value'];
}
}
if($code == 301 || $code == 302) {
$url = $header['location'];
if($url) return FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers);
else return;
if($code > 300 && $code < 399 && $header['location']) {
return FileHandler::getRemoteResource($header['location'], $body, $timeout, $method, $content_type, $headers, $cookies, $post_data);
}
if($code != 200) return;
return $body;
return $response;
}
/**
* @brief 원격파일을 다운받아서 특정 위치에 저장
* @brief retrieves remote file, then stores it into target path.
* @param[in] $url the address of the target file
* @param[in] $target_file the location to store
* @param[in] $body HTTP request body
* @param[in] $timeout connection timeout
* @param[in] $method GET/POST
* @param[in] $content_type content type header of HTTP request
* @param[in] $headers headers key vaule array.
* @return true: success, false: failed
**/
function getRemoteFile($url, $target_filename, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array()) {
$body = FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers);
if(!$body) return;
if(!$body) return false;
$target_filename = FileHandler::getRealPath($target_filename);
FileHandler::writeFile($target_filename, $body);
return true;
}
/**
* @brief 특정 이미지 파일을 특정 위치로 옮김 (옮길때 이미지의 크기를 리사이징할 있음..)
* @brief moves an image file (resizing is possible)
* @param[in] $source_file path of the source file
* @param[in] $target_file path of the target file
* @param[in] $resize_width width to resize
* @param[in] $resize_height height to resize
* @param[in] $target_type if $target_type is set (gif, jpg, png, bmp), result image will be saved as target type
* @param[in] $thumbnail_type thumbnail type(crop, ratio)
* @return true: success, false: failed
**/
function createImageFile($source_file, $target_file, $resize_width = 0, $resize_height = 0, $target_type = '', $thumbnail_type = 'crop') {
$source_file = FileHandler::getRealPath($source_file);
@ -333,7 +415,7 @@
if(!$resize_width) $resize_width = 100;
if(!$resize_height) $resize_height = $resize_width;
// 이미지 정보를 구함
// retrieve source image's information
list($width, $height, $type, $attrs) = @getimagesize($source_file);
if($width<1 || $height<1) return;
@ -355,7 +437,7 @@
break;
}
// 이미지 정보가 정해진 크기보다 크면 크기를 바꿈 (%를 구해서 처리)
// if original image is larger than specified size to resize, calculate the ratio
if($resize_width > 0 && $width >= $resize_width) $width_per = $resize_width / $width;
else $width_per = 1;
@ -374,18 +456,18 @@
if(!$per) $per = 1;
// 타겟 파일의 type을 구함
// get type of target file
if(!$target_type) $target_type = $type;
$target_type = strtolower($target_type);
// 리사이즈를 원하는 크기의 임시 이미지를 만듬
// create temporary image with target size
if(function_exists('imagecreatetruecolor')) $thumb = @imagecreatetruecolor($resize_width, $resize_height);
else $thumb = @imagecreate($resize_width, $resize_height);
$white = @imagecolorallocate($thumb, 255,255,255);
@imagefilledrectangle($thumb,0,0,$resize_width-1,$resize_height-1,$white);
// 원본 이미지의 타입으로 임시 이미지 생성
// create temporary image having original type
switch($type) {
case 'gif' :
$source = @imagecreatefromgif($source_file);
@ -408,7 +490,7 @@
return;
}
// 원본 이미지의 크기를 조절해서 임시 이미지에 넣음
// resize original image and put it into temporary image
$new_width = (int)($width * $per);
$new_height = (int)($height * $per);
@ -425,11 +507,11 @@
else @imagecopyresized($thumb, $source, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
} else return false;
// 디렉토리 생성
// create directory
$path = dirname($target_file);
if(!is_dir($path)) FileHandler::makeDir($path);
// 파일을 쓰고 끝냄
// write into the file
switch($target_type) {
case 'gif' :
$output = @imagegif($thumb, $target_file);
@ -458,7 +540,9 @@
/**
* @brief ini 파일을 읽는다
* @brief reads ini file, and puts result into array
* @param[in] $filename path of the ini file
* @return ini array (if the target file does not exist, it returns false)
**/
function readIniFile($filename){
$filename = FileHandler::getRealPath($filename);
@ -470,11 +554,14 @@
/**
* @brief array를 ini 파일로 저장한다.
* @brief write array into ini file
* @param[in] $filename target ini file name
* @param[in] $arr array
* @return if array contains nothing it returns false, otherwise true
**/
function writeIniFile($filename,$arr){
function writeIniFile($filename, $arr){
if(count($arr)==0) return false;
FileHandler::writeFile($filename,FileHandler::_makeIniBuff($arr));
FileHandler::writeFile($filename, FileHandler::_makeIniBuff($arr));
return true;
}
@ -494,5 +581,23 @@
}
return $return;
}
/**
* @brief return file object
* @param[in] $file_name target file name
* @param[in] $mode file mode for fopen
* @remarks if the directory of the file does not exist, create it.
* @return file object
**/
function openFile($file_name, $mode)
{
$pathinfo = pathinfo($file_name);
$path = $pathinfo['dirname'];
if(!is_dir($path)) FileHandler::makeDir($path);
require_once("FileObject.class.php");
$file_object = new FileObject($file_name, $mode);
return $file_object;
}
}
?>

View file

@ -0,0 +1,128 @@
<?php
/**
* @class FileObject
* @author haneul (haneul0318@gmail.com)
* @brief file abstraction class
**/
class FileObject extends Object
{
var $fp = null; ///< file descriptor
var $path = null; ///< file path
var $mode = "r"; ///< file open mode
/**
* @brief constructor
* @param[in] $path path of target file
* @param[in] $mode file open mode
* @return file object
**/
function FileObject($path, $mode)
{
if($path != null) $this->Open($path, $mode);
}
/**
* @brief append target file's content to current file
* @param[in] $file_name path of target file
* @return none
**/
function append($file_name)
{
$target = new FileObject($file_name, "r");
while(!$target->feof())
{
$readstr = $target->read();
$this->write($readstr);
}
$target->close();
}
/**
* @brief check current file meets eof
* @return true: if eof. false: otherwise
**/
function feof()
{
return feof($this->fp);
}
/**
* @brief read from current file
* @param[in] $size size to read
* @return read bytes
**/
function read($size = 1024)
{
return fread($this->fp, $size);
}
/**
* @brief write string to current file
* @param[in] $str string to write
* @return written bytes. if failed, it returns false
**/
function write($str)
{
$len = strlen($str);
if(!$str || $len <= 0) return false;
if(!$this->fp) return false;
$written = fwrite($this->fp, $str);
return $written;
}
/**
* @brief open a file
* @param[in] $path path of target file
* @param[in] $mode file open mode
* @remarks if file is opened, close it and open the new path
* @return true if succeed, false otherwise.
*/
function open($path, $mode)
{
if($this->fp != null)
{
$this->close();
}
$this->fp = fopen($path, $mode);
if(! is_resource($this->fp) )
{
$this->fp = null;
return false;
}
$this->path = $path;
return true;
}
/**
* @brief return current file's path
* @return file path
**/
function getPath()
{
if($this->fp != null)
{
return $this->path;
}
else
{
return null;
}
}
/**
* @brief close file
* @return none
**/
function close()
{
if($this->fp != null)
{
fclose($this->fp);
$this->fp = null;
}
}
}
?>

View file

@ -2,7 +2,7 @@
/**
* @class Handler
* @author zero (zero@nzeo.com)
* @brief (*)Handler 클래스의 추상화 클래스
* @brief an abstract class of (*)Handler
**/
class Handler {

View file

@ -110,20 +110,29 @@
//if($this->module && $module_info->module != $this->module) unset($module_info);
}
// module_site_srl과 site_srl 값이 다르면 redirect 시도
if(!$this->module && !$module_info && $site_module_info->site_srl == 0 && $site_module_info->module_site_srl > 0) {
$site_info = $oModuleModel->getSiteInfo($site_module_info->module_site_srl);
header("location:".getNotEncodedSiteUrl($site_info->domain,'mid',$site_module_info->mid));
return false;
}
// 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄
if(!$module_info && !$this->module) $module_info = $site_module_info;
if(!$module_info && !$this->module && $site_module_info->module_site_srl) $module_info = $site_module_info;
// 모듈정보와 사이트 모듈정보가 다르면(다른 사이트이면) 페이지 리다이렉트
if($module_info && $module_info->site_srl != $site_module_info->site_srl) {
// 현재 요청된 모듈이 가상 사이트 모듈일 경우
if($module_info->site_srl) {
$site_info = $oModuleModel->getSiteInfo($module_info->site_srl);
$redirect_url = getSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry'));
$redirect_url = getNotEncodedSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry'));
// 가상 사이트 모듈이 아닌데 가상 사이트에서 호출되었을 경우
} else {
$db_info = Context::getDBInfo();
if(!$db_info->default_url) return die("기본 URL이 정해지지 않아서 동작을 중지합니다");
else $redirect_url = getSiteUrl($db_info->default_url, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry'));
if(!$db_info->default_url) return Context::getLang('msg_default_url_is_not_defined');
else $redirect_url = getNotEncodedSiteUrl($db_info->default_url, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry'));
}
header("location:".$redirect_url);
return false;

View file

@ -105,7 +105,7 @@
// 현재 요청된 action의 퍼미션 type(guest, member, manager, root)를 구함
$permission_target = $xml_info->permission->{$this->act};
// module.xml에 명시된 퍼미션이 없을때 ation명에 Admin이 있으면 manager로 체크
// module.xml에 명시된 퍼미션이 없을때 action명에 Admin이 있으면 manager로 체크
if(!$permission_target && substr_count($this->act, 'Admin')) $permission_target = 'manager';
// 권한 체크

View file

@ -136,6 +136,11 @@
* 실제 css나 js의 내용을 합친 것을 구함
**/
// 대상 파일의 내용을 구해오고 css 파일일 경우 url()내의 경로를 변경
$content_filename = substr($filename, 0, -4);
$file_object = FileHandler::openFile($path."/".$content_filename, "w");
if($type == 'css') $file_object->write('@charset "UTF-8";'."\n");
foreach($targets as $file) {
$str = FileHandler::readFile($file['file']);
@ -146,13 +151,12 @@
$str = $this->replaceCssPath($file['file'], $str);
if($file['media'] != 'all') $str = '@media '.$file['media'].' {'."\n".$str."\n".'}';
}
$content_buff .= $str."\n";
$file_object->write($str);
$file_object->write("\n");
unset($str);
}
if($type == 'css') $content_buff = '@charset "UTF-8";'."\n".$content_buff;
$content_filename = substr($filename, 0, -4);
FileHandler::writeFile($path.'/'.$content_filename, $content_buff);
$file_object->close();
/**
* 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함

View file

@ -2,21 +2,22 @@
/**
* @class TemplateHandler
* @author zero (zero@nzeo.com)
* @brief 템플릿 컴파일러
* @brief template compiler
* @version 0.1
*
* 정규표현식을 이용하여 템플릿 파일을 컴파일하여 php코드로 변경하고 파일을 caching하여 사용할 있도록 하는 템플릿 컴파일러
* @remarks It compiles template file by using regular expression into php
* code, and XE caches compiled code for further uses
**/
class TemplateHandler extends Handler {
var $compiled_path = './files/cache/template_compiled/'; ///< 컴파일된 캐쉬 파일이 놓일 위치
var $compiled_path = './files/cache/template_compiled/'; ///< path of compiled caches files
var $tpl_path = ''; ///< 컴파일 대상 경로
var $tpl_file = ''; ///< 컴파일 대상 파일
var $tpl_path = ''; ///< target directory
var $tpl_file = ''; ///< target filename
/**
* @brief TemplateHandler의 기생성된 객체를 return
* @brief returns TemplateHandler's singleton object
* @return TemplateHandler instance
**/
function &getInstance() {
if(__DEBUG__==3 ) {
@ -31,32 +32,36 @@
}
/**
* @brief 주어진 tpl파일의 컴파일
**/
* @brief compiles specified tpl file
* @param[in] $tpl_path path of the directory containing target template file
* @param[in] $tpl_filename target template file's name
* @param[in] $tpl_file if specified use it as template file's full path
* @return compiled result
*/
function compile($tpl_path, $tpl_filename, $tpl_file = '') {
// 디버그를 위한 컴파일 시작 시간 저장
// store the starting time for debug information
if(__DEBUG__==3 ) $start = getMicroTime();
// 변수 체크
// verify arguments
if(substr($tpl_path,-1)!='/') $tpl_path .= '/';
if(substr($tpl_filename,-5)!='.html') $tpl_filename .= '.html';
// tpl_file 변수 생성
// create tpl_file variable
if(!$tpl_file) $tpl_file = $tpl_path.$tpl_filename;
// tpl_file이 비어 있거나 해당 파일이 없으면 return
// if target file does not exist return
if(!$tpl_file || !file_exists(FileHandler::getRealPath($tpl_file))) return;
$this->tpl_path = preg_replace('/^\.\//','',$tpl_path);
$this->tpl_file = $tpl_file;
// compiled된(or 될) 파일이름을 구함
// get cached compiled file name
$compiled_tpl_file = FileHandler::getRealPath($this->_getCompiledFileName($tpl_file));
// 일단 컴파일
// compile
$buff = $this->_compile($tpl_file, $compiled_tpl_file);
// Context와 compiled_tpl_file로 컨텐츠 생성
// make a result, combining Context and compiled_tpl_file
$output = $this->_fetch($compiled_tpl_file, $buff, $tpl_path);
if(__DEBUG__==3 ) $GLOBALS['__template_elapsed__'] += getMicroTime() - $start;
@ -65,7 +70,10 @@
}
/**
* @brief 주어진 파일을 컴파일 바로 return
* @brief compile specified file and immediately return
* @param[in] $tpl_path path of the directory containing target template file
* @param[in] $tpl_filename target template file's name
* @return
**/
function compileDirect($tpl_path, $tpl_filename) {
$this->tpl_path = $tpl_path;
@ -78,7 +86,10 @@
}
/**
* @brief tpl_file이 컴파일이 되어 있는 것이 있는지 체크
* @brief compile if necessary
* @param[in] $tpl_path path of the directory containing target template file
* @param[in] $tpl_filename target template file's name
* @return if compiled file exists and it is newer than template file return nothing, otherwise compiled result
**/
function _compile($tpl_file, $compiled_tpl_file) {
if(!file_exists($compiled_tpl_file)) return $this->_compileTplFile($tpl_file, $compiled_tpl_file);
@ -89,52 +100,57 @@
}
/**
* @brief tpl_file을 compile
* @brief compile tpl_file file
* @param[in] $tpl_file path of tpl file
* @param[in] $compiled_tpl_file if specified, write compiled result into the file
* @return compiled result
**/
function _compileTplFile($tpl_file, $compiled_tpl_file = '') {
// tpl 파일을 읽음
// read tpl file
$buff = FileHandler::readFile($tpl_file);
if(!$buff) return;
// include 변경 <!--#include($filename)-->
// replace include <!--#include($filename)-->
$buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff);
// 이미지 태그 img의 src의 값이 ./ 또는 파일이름으로 바로 시작하면 경로 변경
// if value of src in img/input tag starts with ./ or with filename replace the path
$buff = preg_replace_callback('/<(img|input)([^>]*)src=[\'"]{1}(.*?)[\'"]{1}/is', array($this, '_compileImgPath'), $buff);
// 변수를 변경
// replace variables
$buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff);
// 결과를 출력하지 않는 구문 변경
// replace parts not displaying results
$buff = preg_replace_callback('/\{\@([^\{\}]+)\}/i', array($this, '_compileVarToSilenceExecute'), $buff);
// <!--@, --> 의 변경
// replace <!--@, -->
$buff = preg_replace_callback('!<\!--@(.*?)-->!is', array($this, '_compileFuncToCode'), $buff);
// <!--// ~ --> 주석문 제거
// remove comments <!--// ~ -->
$buff = preg_replace('!(\n?)( *?)<\!--//(.*?)-->!is', '', $buff);
// import xml filter/ css/ js/ 언어파일 <!--%import("filename"[,optimized=true|false][,media="media"][,targetie="lt IE 6|IE 7|gte IE 8|..."])--> (media는 css에만 적용)
// import xml filter/ css/ js/ files <!--%import("filename"[,optimized=true|false][,media="media"][,targetie="lt IE 6|IE 7|gte IE 8|..."])--> (media is applied to only css)
$buff = preg_replace_callback('!<\!--%import\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?\)-->!is', array($this, '_compileImportCode'), $buff);
// unload css/ js <!--%unload("filename"[,optimized=true|false][,media="media"][,targetie="lt IE 6|IE 7|gte IE 8|..."])--> (media는 css에만 적용)
// unload css/ js <!--%unload("filename"[,optimized=true|false][,media="media"][,targetie="lt IE 6|IE 7|gte IE 8|..."])--> (media is applied to only css)
$buff = preg_replace_callback('!<\!--%unload\(\"([^\"]*?)\"(,optimized\=(true|false))?(,media\=\"([^\"]*)\")?(,targetie=\"([^\"]*)\")?\)-->!is', array($this, '_compileUnloadCode'), $buff);
// javascript plugin import
$buff = preg_replace_callback('!<\!--%load_js_plugin\(\"([^\"]*?)\"\)-->!is', array($this, '_compileLoadJavascriptPlugin'), $buff);
// 파일에 쓰기 전에 직접 호출되는 것을 방지
// prevent from calling directly before writing into file
$buff = sprintf('%s%s%s','<?php if(!defined("__ZBXE__")) exit();?>',"\n",$buff);
// 컴파일된 코드를 파일에 저장
// write compiled code into file
if($compiled_tpl_file) FileHandler::writeFile($compiled_tpl_file, $buff);
return $buff;
}
/**
* @brief {$와 } 안의 $... 변수를 Context::get(...) 으로 변경
* @brief replace $... variables in { } into Context::get(...)
* @param[in] $matches match
* @return replaced result
**/
function _compileVarToContext($matches) {
$str = trim(substr($matches[0],1,strlen($matches[0])-2));
@ -149,7 +165,7 @@
} else {
list($class, $method) = explode('::',$func);
if(!class_exists($class) || !in_array($method, get_class_methods($class))) {
// 서버 환경에 따라서 class, method가 대소문자 구별을 할때와 하지 않을때가 있음
// within some environment, name of classes and methods may be case-sensitive
list($class, $method) = explode('::',strtolower($func));
if(!class_exists($class) || !in_array($method, get_class_methods($class))) {
return $matches[0];
@ -164,7 +180,9 @@
}
/**
* @brief 이미지의 경로를 변경
* @brief change image path
* @param[in] $matches match
* @return changed result
**/
function _compileImgPath($matches) {
static $real_path = null;
@ -187,7 +205,9 @@
}
/**
* @brief {@ } 안의 @... 함수를 print func(..) 변경
* @brief replace @... function in { } into print func(..)
* @param[in] $matches match
* @return replaced result
**/
function _compileVarToSilenceExecute($matches) {
if(strtolower(trim(str_replace(array(';',' '),'', $matches[1])))=='return') return '<?php return; ?>';
@ -195,7 +215,9 @@
}
/**
* @brief <!--@, --> 사이의 구문을 php코드로 변경
* @brief changed content in <!--@, --> into php code
* @param[in] $matches match
* @return changed result
**/
function _compileFuncToCode($matches) {
static $idx = 0;
@ -253,10 +275,12 @@
}
/**
* @brief <!--#include $path-->를 변환
* @brief replace <!--#include $path-->
* @param[in] $matches match
* @return replaced result
**/
function _compileIncludeToCode($matches) {
// include하려는 대상문자열에 변수가 있으면 변수 처리
// if target string to include contains variables handle them
$arg = str_replace(array('"','\''), '', $matches[1]);
if(!$arg) return;
@ -276,19 +300,19 @@
$arg = implode("/",$tmp_arr);
if(substr($arg,0,2)=='./') $arg = substr($arg,2);
// 1단계로 해당 tpl 내의 파일을 체크
// step1: check files in the template directory
$source_filename = sprintf("%s/%s", dirname($this->tpl_file), $arg);
// 2단계로 root로부터 경로를 체크
// step2: check path from root2단계로 root로부터 경로를 체크
if(!file_exists($source_filename)) $source_filename = './'.$arg;
if(!file_exists($source_filename)) return;
// path, filename으로 분리
// split into path and filename
$tmp_arr = explode('/', $source_filename);
$filename = array_pop($tmp_arr);
$path = implode('/', $tmp_arr).'/';
// include 시도
// try to include
$output = sprintf(
'<?php%s'.
'$oTemplate = &TemplateHandler::getInstance();%s'.
@ -308,10 +332,12 @@
}
/**
* @brief <!--%filename--> 확장자를 봐서 js filter/ css/ js 파일을 include하도록 수정
* @brief modify to include js filter/ css/ js according to extension of <!--%filename-->
* @param[in] $matches match
* @return modified result
**/
function _compileImportCode($matches) {
// 현재 tpl 파일의 위치를 구해서 $base_path에 저장하여 적용하려는 xml file을 찾음
// find xml file
$base_path = $this->tpl_path;
$given_file = trim($matches[1]);
if(!$given_file) return;
@ -323,32 +349,32 @@
if(!$targetie) $targetie = '';
else $optimized = 'false';
// given_file이 lang으로 끝나게 되면 언어팩을 읽도록 함
// if given_file ends with lang, load language pack
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);
// load lang이 아니라면 xml, css, js파일을 읽도록 시도
// otherwise try to load xml, css, js file
} else {
if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file);
else $source_filename = $given_file;
// path와 파일이름을 구함
// get filename and path
$tmp_arr = explode("/",$source_filename);
$filename = array_pop($tmp_arr);
$base_path = implode("/",$tmp_arr)."/";
// 확장자를 구함
// get the ext
$tmp_arr = explode(".",$filename);
$ext = strtolower(array_pop($tmp_arr));
// 확장자에 따라서 파일 import를 별도로
// according to ext., import the file
switch($ext) {
// xml js filter
case 'xml' :
// XmlJSFilter 클래스의 객체 생성후 js파일을 만들고 Context::addJsFile처리
// create an instance of XmlJSFilter class, then create js and handle Context::addJsFile
$output = sprintf(
'<?php%s'.
'require_once("./classes/xml/XmlJsFilter.class.php");%s'.
@ -390,8 +416,10 @@
}
/**
* @brief javascript 플러그인 import
* javascript 플러그인의 경우 optimized = false로 동작하도록 고정시킴
* @brief import javascript plugin
* @param[in] $matches match
* @return result loading the plugin
* @remarks javascript plugin works as optimized = false
**/
function _compileLoadJavascriptPlugin($matches) {
$base_path = $this->tpl_path;
@ -400,10 +428,12 @@
}
/**
* @brief <!--%filename--> 확장자를 봐서 css/ js 파일을 제거하도록 수정
* @brief remove loading part of css/ js file
* @param[in] $matches match
* @return removed result
**/
function _compileUnloadCode($matches) {
// 현재 tpl 파일의 위치를 구해서 $base_path에 저장하여 적용하려는 xml file을 찾음
// find xml file
$base_path = $this->tpl_path;
$given_file = trim($matches[1]);
if(!$given_file) return;
@ -418,17 +448,16 @@
if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file);
else $source_filename = $given_file;
// path와 파일이름을 구함
// get path and file name
$tmp_arr = explode("/",$source_filename);
$filename = array_pop($tmp_arr);
$base_path = implode("/",$tmp_arr)."/";
// 확장자를 구함
// get an ext.
$tmp_arr = explode(".",$filename);
$ext = strtolower(array_pop($tmp_arr));
// 확장자에 따라서 파일 import를 별도로
switch($ext) {
// css file
case 'css' :
@ -454,14 +483,20 @@
}
/**
* @brief $tpl_file로 compiled_tpl_file이름을 return
* @brief return compiled_tpl_file's name accroding to template file name
* @param[in] $tpl_file template file name
* @return compiled template file's name
**/
function _getCompiledFileName($tpl_file) {
return sprintf('%s%s.compiled.php',$this->compiled_path, md5($tpl_file));
}
/**
* @brief ob_* 함수를 이용하여 fetch...
* @brief fetch using ob_* function
* @param[in] $compiled_tpl_file path of compiled template file
* @param[in] $buff if buff is not null, eval it instead of including compiled template file
* @param[in] $tpl_path set context's tpl path
* @return result string
**/
function _fetch($compiled_tpl_file, $buff = NULL, $tpl_path = '') {
$__Context = &$GLOBALS['__Context__'];
@ -469,10 +504,8 @@
if($_SESSION['is_logged']) $__Context->logged_info = $_SESSION['logged_info'];
// ob_start를 시킨후 컴파일된 tpl파일을 include하고 결과를 return
ob_start();
// tpl파일을 compile하지 못할 경우 $buff로 넘어온 값을 eval시킴 (미설치시에나..)
if($buff) {
$eval_str = "?>".$buff;
eval($eval_str);

View file

@ -113,7 +113,6 @@
$output->page_count = $out->page_count;
$output->page = $out->page;
$column_count = count($output->columns);
$condition_count = count($output->conditions);
@ -125,7 +124,6 @@
}
$buff .= ' );'."\n";
// php script 생성
$buff .= '$output->_tables = array( ';
foreach($output->tables as $key => $val) {
@ -133,8 +131,6 @@
}
$buff .= ' );'."\n";
if(count($output->left_tables)){
$buff .= '$output->left_tables = array( ';
foreach($output->left_tables as $key => $val) {
@ -143,7 +139,6 @@
$buff .= ' );'."\n";
}
// column 정리
if($column_count) {
$buff .= '$output->columns = array ( ';
@ -169,8 +164,6 @@
$buff .= ' );'."\n";
}
// order 정리
if($output->order) {
$buff .= '$output->order = array(';
@ -247,11 +240,7 @@
FileHandler::writeFile($cache_file, $buff);
}
function _setColumn($columns){
if(!$columns) {
$output->column[] = array("*" => "*");
} else {
@ -274,13 +263,13 @@
"minlength" => $val->attrs->minlength,
"maxlength" => $val->attrs->maxlength,
"alias" => $val->attrs->alias,
"click_count" => $val->attrs->click_count,
);
}
}
return $output;
}
function _setConditions($conditions){
// 조건절 정리
@ -359,35 +348,50 @@
return $output;
}
function _getColumn($columns){
$buff = '';
$str = '';
$print_vars = array();
foreach($columns as $key => $val) {
$str = 'array("name"=>"%s","alias"=>"%s"';
$print_vars = array();
$print_vars[] = $val['name'];
$print_vars[] = $val['alias'];
$val['default'] = $this->getDefault($val['name'], $val['default']);
if($val['var'] && strpos($val['var'],'.')===false) {
if($val['default']) $buff .= sprintf('array("name"=>"%s", "alias"=>"%s", "value"=>$args->%s?$args->%s:%s),%s', $val['name'], $val['alias'], $val['var'], $val['var'], $val['default'] ,"\n");
else $buff .= sprintf('array("name"=>"%s", "alias"=>"%s", "value"=>$args->%s),%s', $val['name'], $val['alias'], $val['var'], "\n");
if($val['default']){
$str .= ',"value"=>$args->%s?$args->%s:%s';
$print_vars[] = $val['var'];
$print_vars[] = $val['var'];
$print_vars[] = $val['default'];
}else{
$str .= ',"value"=>$args->%s';
$print_vars[] = $val['var'];
}
if($val['default']) $default_list[$val['var']] = $val['default'];
if($val['notnull']) $notnull_list[] = $val['var'];
if($val['minlength']) $minlength_list[$val['var']] = $val['minlength'];
if($val['maxlength']) $maxlength_list[$val['var']] = $val['maxlength'];
} else {
if($val['default']) $buff .= sprintf('array("name"=>"%s", "alias"=>"%s", "value"=>%s),%s', $val['name'], $val['alias'], $val['default'] ,"\n");
else $buff .= sprintf('array("name"=>"%s", "alias"=>"%s",),%s', $val['name'], $val['alias'], "\n");
if($val['default']){
$str .= ',"value"=>%s';
$print_vars[] = $val['default'];
}
}
if($val['click_count']){
$str .= ',"click_count"=>$args->%s';
$print_vars[] = $val['click_count'];
}
$str .= '),%s';
$print_vars[] = "\n";
$buff .= vsprintf($str, $print_vars);
}
return $buff;
}
function _getConditions($conditions){
$buff = '';
foreach($conditions as $key => $val) {
@ -414,16 +418,11 @@
return $buff;
}
/**
* @brief column, condition등의 key에 default 값을 세팅
**/
function getDefault($name, $value) {
$db_info = Context::getDBInfo ();
if(!$value) return;
$str_pos = strpos($value, '(');
if($str_pos===false) return '"'.$value.'"';
@ -446,20 +445,31 @@
break;
case 'plus' :
$args = abs($args);
$val = sprintf('"%s+%d"', $name, $args);
if ($db_info->db_type == 'cubrid') {
$val = sprintf ('"\\"%s\\"+%d"', $name, $args);
} else {
$val = sprintf('"%s+%d"', $name, $args);
}
break;
case 'minus' :
$args = abs($args);
$val = sprintf('"%s-%d"', $name, $args);
break;
case 'multiply' :
if ($db_info->db_type == 'cubrid') {
$val = sprintf ('"\\"%s\\"-%d"', $name, $args);
} else {
$val = sprintf('"%s-%d"', $name, $args);
}
break;
case 'multiply' :
$args = intval($args);
$val = sprintf('"%s*%d"', $name, $args);
if ($db_info->db_type == 'cubrid') {
$val = sprintf ('"\\"%s\\"*%d"', $name, $args);
} else {
$val = sprintf('"%s*%d"', $name, $args);
}
break;
}
return $val;
}
}
?>

View file

@ -459,9 +459,13 @@ function _displayMultimedia(src, width, height, options) {
if(/\.(gif|jpg|jpeg|bmp|png)$/i.test(src)){
html = '<img src="'+src+'" width="'+width+'" height="'+height+'" />';
} else if(/\.swf$/i.test(src)) {
} else if(/\.flv$/i.test(src) || /\.mov$/i.test(src) || /\.moov$/i.test(src) || /\.m4v$/i.test(src)) {
html = '<embed src="'+request_uri+'common/tpl/images/flvplayer.swf" allowfullscreen="true" autostart="'+autostart+'" width="'+width+'" height="'+height+'" flashvars="&file='+src+'&width='+width+'&height='+height+'&autostart='+autostart+'" wmode="'+params.wmode+'" />';
} else 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";
if(typeof(enforce_ssl)=='undefined'){ codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; }
else { codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; }
html = '<object classid="'+clsid+'" codebase="'+codebase+'" width="'+width+'" height="'+height+'" flashvars="'+params.flashvars+'">';
html += '<param name="movie" value="'+src+'" />';
for(var name in params) {
@ -472,8 +476,6 @@ function _displayMultimedia(src, width, height, options) {
html += ''
+ '<embed src="'+src+'" autostart="'+autostart+'" width="'+width+'" height="'+height+'" flashvars="'+params.flashvars+'" wmode="'+params.wmode+'"></embed>'
+ '</object>';
} else if(/\.flv$/i.test(src) || /\.mov$/i.test(src) || /\.moov$/i.test(src) || /\.m4v$/i.test(src)) {
html = '<embed src="'+request_uri+'common/tpl/images/flvplayer.swf" allowfullscreen="true" autostart="'+autostart+'" width="'+width+'" height="'+height+'" flashvars="&file='+src+'&width='+width+'&height='+height+'&autostart='+autostart+'" wmode="'+params.wmode+'" />';
} else {
html = '<embed src="'+src+'" autostart="'+autostart+'" width="'+width+'" height="'+height+'"';
if(params.wmode == 'transparent') {
@ -962,3 +964,14 @@ function replaceOuterHTML(obj, html) {
function getOuterHTML(obj) {
return jQuery(obj).html().trim();
}
jQuery(function(){
jQuery(".lang_code").each(
function()
{
var objText = jQuery(this);
var targetName = objText.attr("name");
objText.after("<a href='"+request_uri.setQuery('module','module').setQuery('act','dispModuleAdminLangcode').setQuery('target',targetName)+"' class='buttonSet buttonSetting' onclick='popopen(this.href);return false;'><span>find_langcode</span></a>");
}
);
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

View file

@ -10,8 +10,12 @@
.ui-calendar caption .today span{text-decoration:underline;}
.ui-calendar caption .navi{ position:absolute; top:10px; border:0; padding:0; width:17px; height:18px; background-color:transparent; background-image:url(./img/buttonPaginate.gif); background-repeat:no-repeat; cursor:pointer;}
.ui-calendar caption .navi span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;}
.ui-calendar caption .navi.prev{ left:0; background-position:left top;}
.ui-calendar caption .navi.next{ right:0; background-position:right top;}
.ui-calendar caption .navi.prev{ left:20px; background-position:left top;}
.ui-calendar caption .navi.next{ right:20px; background-position:right top;}
.ui-calendar caption .navi.prev_year,
.ui-calendar caption .navi.next_year{ width:22px; background-image:url(./img/buttonPaginateDuble.gif); }
.ui-calendar caption .navi.prev_year{ left:0; background-position:left top;}
.ui-calendar caption .navi.next_year{ right:0; background-position:right top;}
.ui-calendar th,
.ui-calendar td{ border:0; text-align:center;}
.ui-calendar th{ color:#666; background:#f2f2f2; padding:3px 8px;}

View file

@ -61,6 +61,8 @@ $.extend(Calendar.prototype, {
today : 'Today',
prevmonth : 'Prev Month',
nextmonth : 'Next Month',
prevyear : 'Prev Year',
nextyear : 'Next Year',
close : 'Close'
}, options.lang||{});
@ -137,7 +139,7 @@ $.extend(Calendar.prototype, {
v['weeks'] = [];
var d = new Date(cal.date.getTime()), w = [];
var last = (v.m!=2)? (v.m%2?31:30) : ((new Date(v.yyyy,v.m-1,29)).getMonth()==v.m?29:28); // 마지막 날
var last = (v.m!=2)? ((v.m+(v.m>7?1:0))%2?31:30) : ((new Date(v.yyyy,v.m-1,29)).getMonth()==v.m?29:28); // 마지막 날
d.setDate(1); // 1일로 설정 후 1일의 요일을 가져온다.
var start = d.getDay(), end = last+start;
@ -173,6 +175,8 @@ $.extend(Calendar.prototype, {
} else {
obj.find('button.prev').click(function(){ $.calendar._prevMonth(obj) });
obj.find('button.next').click(function(){ $.calendar._nextMonth(obj) });
obj.find('button.prev_year').click(function(){ $.calendar._prevYear(obj) });
obj.find('button.next_year').click(function(){ $.calendar._nextYear(obj) });
}
obj.find('td>button').click(function(){ $.calendar._selectDate(obj, $(this)) });
},
@ -244,10 +248,14 @@ $.extend(Calendar.prototype, {
this._draw(obj);
},
_prevYear : function(obj) {
this._draw(obj);
var cal = calendars[this._getuid(obj)];
cal.date.setFullYear(cal.date.getFullYear()-1);
this._draw(obj);
},
_nextYear : function(obj) {
var cal = calendars[this._getuid(obj)];
cal.date.setFullYear(cal.date.getFullYear()+1);
this._draw(obj);
}
@ -294,6 +302,8 @@ template.calendar = '<button type="button" class="close"><span>{lang.close_layer
<button type="button" class="today">{lang.today}</button>\
<button type="button" class="navi prev"><span>{lang.prevmonth}</span></button>\
<button type="button" class="navi next"><span>{lang.nextmonth}</span></button>\
<button type="button" class="navi prev_year"><span>{lang.prevyear}</span></button>\
<button type="button" class="navi next_year"><span>{lang.nextyear}</span></button>\
</span>\
</caption>\
<thead>\

View file

@ -94,6 +94,88 @@ function zGetXmlHttp() {
}
function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj) {
// ssl action
if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && typeof(this.params['act'])!='undefined') {
var action = this.params['act'];
for(i=0;i<ssl_actions.length;i++) {
if(ssl_actions[i]==action) {
var url = request_uri;
if(typeof(default_url)!='undefined' && default_url) url = default_url;
var port = 443;
if(typeof(https_port)!='undefined' && https_port != 443) port = https_port;
var _u1 = xCreateElement('a');
_u1.href = url;
var targetUrl = 'https://';
targetUrl += _u1.hostname.replace(/:([0-9]+)$/,'');
if(port != 443) targetUrl += ':'+port;
if(_u1.pathname[0] != "/") targetUrl += "/";
targetUrl += _u1.pathname;
targetUrl = targetUrl.replace(/\/$/,'');
this.xml_path = targetUrl + '/index.php';
}
}
}
var _u1 = xCreateElement('a');
_u1.href = location.href;
var _u2 = xCreateElement('a');
_u2.href = this.xml_path;
// 현 url과 ajax call 대상 url의 schema 또는 port가 다르면 직접 form 전송
if(_u1.protocol != _u2.protocol || _u1.port != _u2.port) {
var fr = xGetElementById('xeTmpIframe');
if(!fr) {
fr = xCreateElement('iframe');
fr.style.position = 'absolute';
fr.style.left = '-1px';
fr.style.top = '1px';
fr.style.width = '1px';
fr.style.height = '1px';
fr.name = fr.id = 'xeTmpIframe';
document.body.appendChild(fr);
}
var fo = xGetElementById('xeVirtualForm');
if(fo) document.body.removeChild(fo);
fo = xCreateElement('form');
fo.id = 'xeVirtualForm';
fo.action = this.xml_path;
fo.method = 'post';
fo.target = 'xeTmpIframe';
var i = xCreateElement('input');
i.type = 'hidden';
i.name = 'xeVirtualRequestMethod';
i.value = 'xml';
fo.appendChild(i);
var j = xCreateElement('input');
j.type = 'hidden';
j.name = 'xeRequestURI';
j.value = location.href.replace(/#(.*)$/i,'');
fo.appendChild(j);
var k = xCreateElement('input');
k.type = 'hidden';
k.name = 'xeVirtualRequestUrl';
k.value = request_uri;
fo.appendChild(k);
for (var key in this.params) {
if(!this.params.hasOwnProperty(key)) continue;
var i = xCreateElement('input');
i.type = 'hidden';
i.name = key;
i.value = this.params[key];
fo.appendChild(i);
}
document.body.appendChild(fo);
fo.submit();
return;
}
var rd = "";
rd += "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
+ "<methodCall>\n"
@ -108,16 +190,6 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
rd += "</params>\n"
+ "</methodCall>\n";
// ssl action
if(typeof(ssl_actions)!='undefined' && typeof(ssl_actions.length)!='undefined' && typeof(this.params['act'])!='undefined' && /^https:\/\//i.test(location.href) ) {
var action = this.params['act'];
for(i=0;i<ssl_actions.length;i++) {
if(ssl_actions[i]==action) {
this.xml_path = this.xml_path.replace(/^http:\/\//i,'https://');
break;
}
}
}
if(this.objXmlHttp.readyState!=0) {
this.objXmlHttp.abort();

View file

@ -225,8 +225,9 @@
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_not_permitted_act = 'You do not have permission to execute requested action';
$lang->msg_module_is_not_exists = "Start the module is not enabled.\nSetup the start module on the administrator page.";
$lang->msg_module_is_not_exists = "Couldn't find requested module.\nPlease contact the administrator";
$lang->msg_module_is_not_standalone = 'Requested module cannot be executed independently';
$lang->msg_default_url_is_not_defined = 'Default URL is not define';
$lang->success_registed = 'Registered successfully';
$lang->success_declared = 'Accused successfully';

View file

@ -231,8 +231,9 @@
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_not_permitted_act = 'No está permitodo para ejecutar esta acción';
$lang->msg_module_is_not_exists = "Inicie el módulo no está habilitado.\nEl inicio de instalación del módulo en el administrador de la página.";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = 'El Módulo requerido no funciona solo.';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = 'Registrado con éxito';
$lang->success_declared = 'Denuncia registrada con éxito';

View file

@ -225,8 +225,9 @@
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_not_permitted_act = 'Vous n\'êtes pas autorisés à exécuter l\'action que vous avez demandé.';
$lang->msg_module_is_not_exists = "Démarrez le module n'est pas activé.\nLe lancement du module d'installation de l'administrateur sur la page.";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = 'Le module demandé ne peut pas être exécuté indépendamment.';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = 'Enregistré avec succès';
$lang->success_declared = 'Accusé avec succès';

View file

@ -225,8 +225,9 @@
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_not_permitted_act = 'Sie haben keine Berechtigung zur Ausführung angeforderte Aktion';
$lang->msg_module_is_not_exists ="Starten Sie das Modul nicht aktiviert ist.\nEinstellen der Start-Modul auf der Seite Administrator.";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = 'Gewünschte Modul kann nicht ausgeführt werden unabhängig';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = 'Anmeldungsdatum';
$lang->success_declared = 'Accused erfolgreich';

View file

@ -225,8 +225,9 @@
$lang->msg_invalid_format = '正しくないフォーマットです。';
$lang->msg_not_permitted_act = '現在の操作は実行する権限がありません。';
$lang->msg_module_is_not_exists = "モジュールの起動を有効にされていません。\n管理者ページにセットアップを開始するモジュール。";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = 'このモジュールはスタンドアローンでは作動しません。';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = '登録しました。';
$lang->success_declared = '通報しました。';

View file

@ -16,7 +16,7 @@
$lang->cmd_list = '목록';
$lang->cmd_prev = '이전';
$lang->cmd_next = '다음';
$lang->cmd_send_trackback = '엮인글발송';
$lang->cmd_send_trackback = '엮인글 발송';
$lang->cmd_registration = $lang->cmd_submit = '등록';
$lang->cmd_comment_registration = '댓글 등록';
$lang->cmd_insert = '추가';
@ -43,12 +43,12 @@
$lang->cmd_management = '관리';
$lang->cmd_make = '생성';
$lang->cmd_select = '선택';
$lang->cmd_select_all = '모두선택';
$lang->cmd_unselect_all = '모두해제';
$lang->cmd_reverse_all = '선택반전';
$lang->cmd_close_all = '모두닫기';
$lang->cmd_open_all = '모두열기';
$lang->cmd_reload = '다시읽기';
$lang->cmd_select_all = '모두 선택';
$lang->cmd_unselect_all = '모두 해제';
$lang->cmd_reverse_all = '선택 반전';
$lang->cmd_close_all = '모두 닫기';
$lang->cmd_open_all = '모두 열기';
$lang->cmd_reload = '다시 읽기';
$lang->cmd_close = '닫기';
$lang->cmd_open = '열기';
$lang->cmd_setup = '설정';
@ -104,9 +104,9 @@
$lang->description = '설명';
$lang->trackback = '엮인글';
$lang->tag = '태그';
$lang->allow_comment = '댓글허용';
$lang->lock_comment = '댓글잠금';
$lang->allow_trackback = '엮인글허용';
$lang->allow_comment = '댓글 허용';
$lang->lock_comment = '댓글 잠금';
$lang->allow_trackback = '엮인글 허용';
$lang->uploaded_file = '첨부';
$lang->grant = '권한';
$lang->target = '대상';
@ -119,11 +119,11 @@
$lang->notify = '알림';
$lang->order_target = '정렬대상';
$lang->order_type = '정렬방법';
$lang->order_asc = '올림차순';
$lang->order_asc = '오름차순';
$lang->order_desc = '내림차순';
$lang->file = '파일';
$lang->mid = '모듈이름';
$lang->mid = '모듈 이름';
$lang->sid = '가상 사이트 이름';
$lang->layout = '레이아웃';
$lang->widget = '위젯 ';
@ -136,30 +136,30 @@
$lang->url = 'URL';
$lang->document_url = '게시글 주소';
$lang->trackback_url = '엮인글 주소';
$lang->blog_name = '블로그이름';
$lang->blog_name = '블로그 이름';
$lang->excerpt = '발췌';
$lang->document_count = '글수';
$lang->page_count = '페이지수';
$lang->document_count = '글 수';
$lang->page_count = '페이지 수';
$lang->list_count = '목록 수';
$lang->search_list_count = '검색 목록 수';
$lang->readed_count = '조회수';
$lang->voted_count = '추천수';
$lang->comment_count = '댓글수';
$lang->member_count = '회원수';
$lang->readed_count = '조회 수';
$lang->voted_count = '추천 수';
$lang->comment_count = '댓글 수';
$lang->member_count = '회원 수';
$lang->date = '날짜';
$lang->regdate = '등록일';
$lang->last_update = '최근 수정일';
$lang->last_post = '마지막 댓글';
$lang->signup_date = '가입일';
$lang->last_login = '최근로그인';
$lang->first_page = '첫페이지';
$lang->last_page = '끝페이지';
$lang->last_login = '최근 로그인';
$lang->first_page = '첫 페이지';
$lang->last_page = '끝 페이지';
$lang->search_target = '검색대상';
$lang->search_keyword = '검색어';
$lang->is_default = '기본';
$lang->no_documents = '등록된 글이 없습니다';
$lang->no_documents = '등록된 글이 없습니다.';
$lang->board_manager = '게시판 관리';
$lang->member_manager = '회원 관리';
@ -198,56 +198,57 @@
);
$lang->time_gap = array(
'min' => '%d 분전',
'mins' => '%d 분전',
'hour' => '%d 시간전',
'hours' => '%d 시간전',
'min' => '%d 분 전',
'mins' => '%d 분 전',
'hour' => '%d 시간 전',
'hours' => '%d 시간 전',
);
// 설명 관련
$lang->about_tag = '태그 입력시 , (쉼표)를 이용하시면 복수 등록이 가능합니다';
$lang->about_layout = '레이아웃은 모듈의 껍데기를 꾸며줍니다. 상단 레이아웃 메뉴에서 관리하실 수 있습니다';
$lang->about_tag = '태그 입력 시 , (쉼표)를 이용하시면 복수 등록이 가능합니다.';
$lang->about_layout = '레이아웃은 모듈의 껍데기를 꾸며줍니다. 상단 레이아웃 메뉴에서 관리하실 수 있습니다.';
// 메지 관련
// 메지 관련
$lang->msg_call_server = '서버에 요청중입니다. 잠시만 기다려주세요.';
$lang->msg_db_not_setted = 'DB설정이 되어 있지 않습니다';
$lang->msg_db_not_setted = 'DB설정이 되어 있지 않습니다.';
$lang->msg_dbconnect_failed = "DB접속 오류가 발생하였습니다.\nDB정보를 다시 확인해주세요.";
$lang->msg_invalid_queryid = 'Query ID값이 잘못 지정되었습니다';
$lang->msg_not_permitted = '권한이 없습니다';
$lang->msg_input_password = '비밀번호를 입력하여 주세요';
$lang->msg_invalid_document = '잘못된 문서번호입니다';
$lang->msg_invalid_request = '잘못된 요청입니다';
$lang->msg_invalid_password = '비밀번호가 올바르지 않습니다';
$lang->msg_error_occured = '오류가 발생하였습니다';
$lang->msg_not_founded = '대상을 찾을 수 없습니다';
$lang->msg_no_result = '검색 결과가 없습니다';
$lang->msg_fail_to_request_open = '요청하신 연결에 실패하였습니다';
$lang->msg_invalid_format = '잘못된 형식입니다';
$lang->msg_invalid_queryid = 'Query ID값이 잘못 지정되었습니다.';
$lang->msg_not_permitted = '권한이 없습니다.';
$lang->msg_input_password = '비밀번호를 입력하세요.';
$lang->msg_invalid_document = '잘못된 문서번호입니다.';
$lang->msg_invalid_request = '잘못된 요청입니다.';
$lang->msg_invalid_password = '비밀번호가 올바르지 않습니다.';
$lang->msg_error_occured = '오류가 발생하였습니다.';
$lang->msg_not_founded = '대상을 찾을 수 없습니다.';
$lang->msg_no_result = '검색 결과가 없습니다.';
$lang->msg_fail_to_request_open = '요청하신 연결에 실패하였습니다.';
$lang->msg_invalid_format = '잘못된 형식입니다.';
$lang->msg_not_permitted_act = '요청하신 기능을 실행할 수 있는 권한이 없습니다';
$lang->msg_module_is_not_exists = "시작 모듈이 설정되어 있지 않습니다.\n관리자 페이지에서 시작 모듈을 설정해주세요";
$lang->msg_module_is_not_standalone = '요청하신 모듈은 독립적으로 동작할 수가 없습니다';
$lang->msg_not_permitted_act = '요청하신 기능을 실행할 수 있는 권한이 없습니다.';
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = '요청하신 모듈은 독립적으로 동작할 수 없습니다.';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = '등록되었습니다';
$lang->success_declared = '신고되었습니다';
$lang->success_updated = '수정되었습니다';
$lang->success_deleted = '삭제되었습니다';
$lang->success_restore = '복원되었습니다';
$lang->success_voted = '추천되었습니다';
$lang->success_blamed = '비추천되었습니다';
$lang->success_moved = '이동되었습니다';
$lang->success_sended = '발송되었습니다';
$lang->success_reset = '초기화되었습니다';
$lang->success_leaved = '탈퇴되었습니다';
$lang->success_saved = '저장되었습니다';
$lang->success_registed = '등록 되었습니다.';
$lang->success_declared = '신고 되었습니다.';
$lang->success_updated = '수정 되었습니다.';
$lang->success_deleted = '삭제되었습니다.';
$lang->success_restore = '복원 되었습니다.';
$lang->success_voted = '추천 되었습니다.';
$lang->success_blamed = '비추천 되었습니다.';
$lang->success_moved = '이동 되었습니다.';
$lang->success_sended = '발송 되었습니다.';
$lang->success_reset = '초기화 되었습니다.';
$lang->success_leaved = '탈퇴 되었습니다.';
$lang->success_saved = '저장 되었습니다.';
$lang->fail_to_delete = '삭제 실패하였습니다';
$lang->fail_to_move = '이동 실패하였습니다';
$lang->fail_to_delete = '삭제 실패하였습니다.';
$lang->fail_to_move = '이동 실패하였습니다.';
$lang->failed_voted = '추천하실 수 없습니다';
$lang->failed_blamed = '비추천하실 수 없습니다';
$lang->failed_declared = '신고 하실 수 없습니다';
$lang->fail_to_delete_have_children = '댓글이 있어서 삭제할 수 없습니다';
$lang->failed_voted = '추천 하실 수 없습니다.';
$lang->failed_blamed = '비추천 하실 수 없습니다.';
$lang->failed_declared = '신고 하실 수 없습니다.';
$lang->fail_to_delete_have_children = '댓글이 있어서 삭제할 수 없습니다.';
$lang->confirm_submit = '등록하시겠습니까?';
$lang->confirm_logout = '로그아웃하시겠습니까?';
@ -263,12 +264,12 @@
$lang->column_type_list['homepage'] = 'URL 형식';
$lang->column_type_list['email_address'] = '이메일 형식 (email)';
$lang->column_type_list['tel'] = '전화번호 형식 (phone)';
$lang->column_type_list['textarea'] = '여러줄 입력칸 (textarea)';
$lang->column_type_list['textarea'] = '여러 줄 입력칸 (textarea)';
$lang->column_type_list['checkbox'] = '다중 선택 (checkbox)';
$lang->column_type_list['select'] = '단일 선택 (select)';
$lang->column_type_list['radio'] = '라디오 버튼 (radio)';
$lang->column_type_list['kr_zip'] = '한국주소 (zip)';
$lang->column_type_list['date'] = '일자 (월일)';
$lang->column_type_list['date'] = '일자 (월일)';
//$lang->column_type_list['jp_zip'] = '일본주소 (zip)';
$lang->column_name = '입력항목 이름';
$lang->column_title = '입력항목 제목';
@ -283,30 +284,30 @@
$lang->ftp_port = 'FTP port';
$lang->cmd_check_ftp_connect = 'FTP 접속 확인';
$lang->about_ftp_info = "
FTP 정보는 다음 경우에 이용될 있습니다.<br/>
1. PHP의 safe_mode=On일 경우FTP 정보를 이용해서 XE를 정상적으로 동작할 있게 합니다.<br/>
2. 자동 업데이트등에서 FTP 정보를 이용할 있습니다.<br/>
FTP정보는 files/config/ftp.config.php 파일내에 정보가 저장됩니다.<br/>
그리고 설치 관리자 페이지에서 FTP 정보를 변경하거나 제거할 있습니다.<br />
FTP 정보는 다음 경우에 이용될 있습니다.<br />
1. PHP의 safe_mode=On일 경우, FTP 정보를 이용해서 XE가 정상적으로 동작할 있게 합니다.<br />
2. 자동 업데이트 등에서 FTP 정보를 이용할 있습니다.<br />
FTP정보는 files/config/ftp.config.php 파일 내에 정보가 저장됩니다.<br />
설치 관리자 페이지에서 FTP 정보를 변경하거나 제거할 있습니다.<br />
";
$lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode가 On일 경우 FTP 정보를 꼭 입력해주셔야 XE의 설치 및 사용이 가능합니다';
$lang->msg_ftp_not_connected = 'localhost로의 FTP 접속 오류가 발생하였습니다. ftp 포트 번호를 확인해주시거나 ftp 서비스가 가능한지 확인해주세요';
$lang->msg_ftp_invalid_auth_info = '입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요';
$lang->msg_ftp_mkdir_fail = 'FTP를 이용한 디렉토리 생성 명령 실패하였습니다. FTP 서버의 설정을 확인해주세요';
$lang->msg_ftp_chmod_fail = 'FTP를 이용한 디렉토리의 속성 변경 실패하였습니다. FTP 서버의 설정을 확인해주세요';
$lang->msg_ftp_connect_success = 'FTP 접속 및 인증 성공하였습니다';
$lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode가 On일 경우, FTP 정보를 입력하셔야 XE 설치 및 사용이 가능합니다.';
$lang->msg_ftp_not_connected = 'localhost로의 FTP 접속 오류가 발생하였습니다. FTP 포트 번호를 확인해주시거나 FTP 서비스가 가능한지 확인해주세요.';
$lang->msg_ftp_invalid_auth_info = '입력하신 FTP 정보로 로그인을 하지 못했습니다. FTP정보를 확인해주세요.';
$lang->msg_ftp_mkdir_fail = 'FTP를 이용한 디렉토리 생성 명령 실패하였습니다. FTP 서버의 설정을 확인해주세요.';
$lang->msg_ftp_chmod_fail = 'FTP를 이용한 디렉토리의 속성 변경 실패하였습니다. FTP 서버의 설정을 확인해주세요.';
$lang->msg_ftp_connect_success = 'FTP 접속 및 인증 성공하였습니다.';
// xml filter에서 사용되는 javascript용 alert msg
$lang->filter->isnull = '%s의 값을 입력해주세요';
$lang->filter->outofrange = '%s의 글자 길이를 맞추어 주세요.';
$lang->filter->equalto = '%s의 값이 잘못 되었습니다.';
$lang->filter->invalid_email = '%s의 형식이 잘못되었습니다. (예: zbxe@zeroboard.com)';
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s의 형식이 잘못되었습니다.\\n영문,숫자와 _로 만드실 수 있으며 제일 앞은 영문이어야 합니다";
$lang->filter->invalid_homepage = '%s의 형식이 잘못되었습니다. (예: http://www.zeroboard.com)';
$lang->filter->invalid_korean = '%s의 형식이 잘못되었습니다. 한글로만 입력해주셔야 합니다';
$lang->filter->invalid_korean_number = '%s의 형식이 잘못되었습니다. 한글과 숫자로만 입력해주셔야 합니다';
$lang->filter->invalid_alpha = '%s의 형식이 잘못되었습니다. 영문으로만 입력해주셔야 합니다';
$lang->filter->invalid_alpha_number = '%s의 형식이 잘못되었습니다. 영문과 숫자로만 입력해주셔야 합니다';
$lang->filter->invalid_number = '%s의 형식이 잘못되었습니다. 숫자로만 입력해주셔야 합니다';
$lang->filter->isnull = '%s을 입력해주세요.';
$lang->filter->outofrange = '%s의 글자 를 맞추어 주세요.';
$lang->filter->equalto = '%s이 잘못되었습니다.';
$lang->filter->invalid_email = '%s의 형식이 잘못되었습니다. (예: xe@xpressengine.com)';
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%s의 형식이 잘못되었습니다.\\n영문, 숫자와 _로 만드실 수 있으며, 첫 글자는 영문이어야 합니다.";
$lang->filter->invalid_homepage = '%s의 형식이 잘못되었습니다. (예: http://www.xpressengine.com)';
$lang->filter->invalid_korean = '%s의 형식이 잘못되었습니다. 한글로만 입력하셔야 합니다.';
$lang->filter->invalid_korean_number = '%s의 형식이 잘못되었습니다. 한글과 숫자로만 입력하셔야 합니다.';
$lang->filter->invalid_alpha = '%s의 형식이 잘못되었습니다. 영문으로만 입력하셔야 합니다.';
$lang->filter->invalid_alpha_number = '%s의 형식이 잘못되었습니다. 영문과 숫자로만 입력하셔야 합니다.';
$lang->filter->invalid_number = '%s의 형식이 잘못되었습니다. 숫자로만 입력하셔야 합니다.';
?>

View file

@ -6,3 +6,4 @@ es,Español
ru,Русский
fr,Français
zh-TW,中文(臺灣)
vi,Tiếng Việt

View file

@ -223,8 +223,9 @@
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_not_permitted_act = 'У Вас нет прав для исполнения запрошенного действия';
$lang->msg_module_is_not_exists = "Запустить модуль не включен.\nУстановка запуска модуля администратор странице.";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = 'Запрошенный модуль не может быть исполнен независимо';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = 'Зарегистрировано успешно';
$lang->success_declared = 'Обвинение успешно';

302
common/lang/vi.lang.php Normal file
View file

@ -0,0 +1,302 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
// words for action, which is basically used
$lang->cmd_write = 'Gửi bài mới';
$lang->cmd_reply = 'Trả lời';
$lang->cmd_delete = 'Xóa';
$lang->cmd_modify = 'Thay đổi';
$lang->cmd_edit = 'Sửa';
$lang->cmd_view = 'Xem';
$lang->cmd_view_all = 'Xem tất cả';
$lang->cmd_list = 'Danh sách';
$lang->cmd_prev = 'Trước';
$lang->cmd_next = 'Tiếp';
$lang->cmd_send_trackback = 'Gửi liên kết Web';
$lang->cmd_registration = $lang->cmd_submit = 'Gửi';
$lang->cmd_comment_registration = 'Gửi bình luận';
$lang->cmd_insert = 'Chèn';
$lang->cmd_save = 'Lưu';
$lang->cmd_load = 'Tải';
$lang->cmd_input = 'Nhập vào';
$lang->cmd_search = 'Tìm kiếm';
$lang->cmd_cancel = 'Loại bỏ';
$lang->cmd_back = 'Về trang trước';
$lang->cmd_vote = 'Bình chọn';
$lang->cmd_vote_down = 'Phê bình';
$lang->cmd_declare = 'Phạm quy';
$lang->cmd_cancel_declare = 'Loại bỏ báo cáo';
$lang->cmd_declared_list = 'Danh sách báo cáo';
$lang->cmd_copy = 'Copy';
$lang->cmd_move = 'Di chuyển';
$lang->cmd_move_up = 'Lên';
$lang->cmd_move_down = 'Xuống';
$lang->cmd_add_indent = 'Thu hẹp lề';
$lang->cmd_remove_indent = 'Mở rộng lề';
$lang->cmd_management = 'Quản lý';
$lang->cmd_make = 'Tạo mới';
$lang->cmd_select = 'Lựa chọn';
$lang->cmd_select_all = 'Chọn tất cả';
$lang->cmd_unselect_all = 'Bỏ chọn tất cả';
$lang->cmd_reverse_all = 'Đảo ngược';
$lang->cmd_close_all = 'Đóng tất cả';
$lang->cmd_open_all = 'Mở tất cả';
$lang->cmd_reload = 'Tải lại';
$lang->cmd_close = 'Đóng';
$lang->cmd_open = 'Mở';
$lang->cmd_setup = 'Cài đặt';
$lang->cmd_addition_setup = 'Cài đặt bổ xung';
$lang->cmd_option = 'Tùy chọn';
$lang->cmd_apply = 'Áp dụng';
$lang->cmd_open_calendar = 'Chọn một ngày';
$lang->cmd_send = 'Gửi đi';
$lang->cmd_print = 'In trang';
$lang->cmd_scrap = 'Phân loại';
$lang->cmd_preview = 'Xem trước';
$lang->cmd_reset = 'Thiết lập lại';
$lang->cmd_remake_cache = "Tạo File Cache mới";
$lang->cmd_publish = "Xuất bản";
$lang->cmd_layout_setup = 'Cài đặt giao diện';
$lang->cmd_layout_edit = 'Sửa giao diện';
$lang->cmd_search_by_ipaddress = 'Tìm kiếm IP';
$lang->cmd_add_ip_to_spamfilter = 'Thêm IP vào bộ lọc';
$lang->enable = 'Bật';
$lang->disable = 'Tắt';
// Essential Words
$lang->menu = 'Menu';
$lang->no = 'STT';
$lang->notice = 'Chú ý';
$lang->secret = 'Riêng tư';
$lang->category = $lang->category_srl = 'Thể loại';
$lang->none_category = 'Không có thể loại';
$lang->document_srl = 'Bài viết. STT.';
$lang->user_id = 'ID đăng nhập';
$lang->author = 'Người gửi';
$lang->password = 'Mật khẩu';
$lang->password1 = 'Mật khẩu';
$lang->password2 = 'Nhập lại mật khẩu';
$lang->admin_id = 'Admin ID';
$lang->writer = 'Người viết';
$lang->user_name = 'Tên thật';
$lang->nick_name = 'NickName';
$lang->email_address = 'Email';
$lang->homepage = 'Trang chủ';
$lang->blog = 'Blog';
$lang->birthday = 'Sinh nhật';
$lang->browser_title = 'Tiêu đề trình duyệt';
$lang->title = 'Tiêu đề';
$lang->title_content = 'TĐ+ND';
$lang->topic = 'Chủ đề';
$lang->replies = 'Trả lời';
$lang->content = 'Nội dung';
$lang->document = 'Bài viết';
$lang->comment = 'Bình luận';
$lang->description = 'Mô tả';
$lang->trackback = 'Liên kết Web';
$lang->tag = 'Tag';
$lang->allow_comment = 'Cho phép bình luận';
$lang->lock_comment = 'Khóa bình luận';
$lang->allow_trackback = 'Cho phép liên kết Web';
$lang->uploaded_file = 'File đã Upload';
$lang->grant = 'Cho phép';
$lang->target = 'Mục tiêu';
$lang->total = 'Tất cả';
$lang->total_count = 'Tổng số truy cập';
$lang->ipaddress = 'Địa chỉ IP';
$lang->path = 'Đường dẫn';
$lang->cart = 'Chọn bài';
$lang->friend = 'Bạn bè';
$lang->notify = 'Thông báo';
$lang->order_target = 'Đường dẫn đích';
$lang->order_type = 'Phân loại theo định dạng';
$lang->order_asc = 'Tăng';
$lang->order_desc = 'Không tăng';
$lang->mid = 'Tên Module';
$lang->layout = 'Giao diện';
$lang->widget = 'Widget';
$lang->module = 'Module';
$lang->skin = 'Skin';
$lang->colorset = 'Tạo màu';
$lang->extra_vars = 'Bổ xung';
$lang->domain = "Tên miền";
$lang->url = "URL";
$lang->document_url = 'URL bài viết';
$lang->trackback_url = 'URL liên kết Web';
$lang->blog_name = 'Tên Blog';
$lang->excerpt = 'Trích';
$lang->document_count = 'Số bài viết: ';
$lang->page_count = 'Số trang';
$lang->list_count = 'Số danh sách';
$lang->search_list_count = 'Tìm kiếm danh sách';
$lang->readed_count = 'Đã xem';
$lang->voted_count = 'Lượt bình chọn';
$lang->comment_count = 'Bình luận';
$lang->member_count = 'Số thành viên';
$lang->date = 'Ngày gửi';
$lang->regdate = 'Ngày gửi';
$lang->last_update = 'Cập nhật lần cuối';
$lang->last_post = 'Bài mới nhất';
$lang->signup_date = 'Ngày đăng kí';
$lang->last_login = 'Lần cuối đăng nhập';
$lang->first_page = 'Trang trước';
$lang->last_page = 'Trang sau';
$lang->search_target = 'Khu vực tìm kiếm';
$lang->search_keyword = 'Từ khóa';
$lang->is_default = 'Mặc định';
$lang->no_documents = 'Chưa có bài viết nào.';
$lang->board_manager = 'Quản lý Board';
$lang->member_manager = 'Quản lý thành viên';
$lang->layout_manager = 'Quản lý giao diện';
$lang->use = 'Sử dụng';
$lang->notuse = 'Không sử dụng';
$lang->not_exists = "Không tồn tại";
$lang->public = 'Công khai';
$lang->private = 'Riêng tư';
$lang->unit_sec = 'Giây';
$lang->unit_min = 'Phút';
$lang->unit_hour = 'Giờ';
$lang->unit_day = 'Ngày';
$lang->unit_week = 'Tuần';
$lang->unit_month = 'Tháng';
$lang->unit_year = 'Năm';
$lang->unit_week = array(
'Monday' => 'Thứ hai',
'Tuesday' => 'Thứ ba',
'Wednesday' => 'Thứ tư',
'Thursday' => 'Thứ năm',
'Friday' => 'Thứ sáu',
'Saturday' => 'Thứ bảy',
'Sunday' => 'Chủ nhật',
);
$lang->unit_meridiem = array(
'am' => 'am',
'pm' => 'pm',
'AM' => 'AM',
'PM' => 'PM',
);
$lang->time_gap = array(
'min' => '%d phút trước',
'mins' => '%d phút trước',
'hour' => '%d giờ trước',
'hours' => '%d giờ trước',
);
// Descriptions
$lang->about_tag = 'Bạn có thể thêm vào nhiều Tag bằng cách đặt dấu (,) giữa mỗi Tag.';
$lang->about_layout = 'Để trang trí giao diện bằng các Module. Bạn có thể điều chỉnh chúng bằng Menu trên đầu trang.';
// Messages
$lang->msg_call_server = 'Đang kết nối tới máy chủ, Xin vui lòng đợi! ...';
$lang->msg_db_not_setted = 'Cấu hình Database chưa được thiết lập.';
$lang->msg_dbconnect_failed = "Không thể kết nối.\nXin vui lòng kiểm tra lại thông tin Database.";
$lang->msg_invalid_queryid = 'Giá trị ID không hợp lệ';
$lang->msg_not_permitted = 'Bạn không được phép truy cập tại đây!';
$lang->msg_input_password = 'Xin vui lòng nhập mật khẩu!';
$lang->msg_invalid_document = 'Số bài viết không đúng';
$lang->msg_invalid_request = 'Yêu cầu không hợp lệ';
$lang->msg_invalid_password = 'Mật khẩu không đúng';
$lang->msg_error_occured = 'Đã có lỗi xảy ra.';
$lang->msg_not_founded = 'Không tìm thấy.';
$lang->msg_no_result = 'Không có kết quả nào được tìm thấy.';
$lang->msg_not_permitted_act = 'Bạn không được phép làm việc này.';
$lang->msg_module_is_not_exists = 'Không tìm thấy Module yêu cầu';
$lang->msg_module_is_not_standalone = 'Module yêu cầu không thể thực hiện độc lập.';
$lang->success_registed = 'Chúc mừng bạn đã đăng kí thành công!';
$lang->success_declared = 'Đã báo cáo.';
$lang->success_updated = 'Đã cập nhật xong.';
$lang->success_deleted = 'Đã xóa.';
$lang->success_voted = 'Đã bình chọn.';
$lang->success_blamed = 'Đã phê bình.';
$lang->success_moved = 'Đã chuyển.';
$lang->success_sended = 'Đã gửi.';
$lang->success_reset = 'Đã thiết lập lại.';
$lang->success_leaved = 'Tất cả các thành viên đã được xóa.';
$lang->success_saved = 'Đã lưu.';
$lang->fail_to_delete = 'Không thể xóa.';
$lang->fail_to_move = 'Không thể chuyển.';
$lang->failed_voted = 'Không thể bình chọn.';
$lang->failed_blamed = 'Không thể phê bình';
$lang->failed_declared = 'Không thể báo cáo.';
$lang->fail_to_delete_have_children = 'Xin vui lòng thử lại sau khi gỡ bỏ bài trả lời đầu tiên.';
$lang->confirm_submit = 'Bạn có chắc chắn muốn gửi?';
$lang->confirm_logout = 'Bạn có chắc chắn thoát?';
$lang->confirm_vote = 'Bạn có muốn bình chọn không??';
$lang->confirm_delete = 'Bạn chắc chắn muốn xóa?';
$lang->confirm_move = 'Bạn chắc chắn muốn chuyển?';
$lang->confirm_reset = 'Bạn chắc chắn muốn thiết lập lại?';
$lang->confirm_leave = 'Bạn chắc chắn muốn từ bỏ?';
$lang->column_type = 'Định dạng cột';
$lang->column_type_list['text'] = 'Ô nhập liệu';
$lang->column_type_list['homepage'] = 'URL';
$lang->column_type_list['email_address'] = 'Email';
$lang->column_type_list['tel'] = 'Số điện thoại';
$lang->column_type_list['textarea'] = 'Khu vực nội dung';
$lang->column_type_list['checkbox'] = 'Ô chọn (Nhiều lựa chọn)';
$lang->column_type_list['select'] = 'Ô chọn (Một lựa chọn)';
$lang->column_type_list['kr_zip'] = 'Zip Code (Korean)';
$lang->column_type_list['date'] = 'Ngày (yyyy/mm/dd)';
//$lang->column_type_list['jp_zip'] = 'zip code (Japanese)';
$lang->column_name = 'Tên cột';
$lang->column_title = 'Tiêu đề cột';
$lang->default_value = 'Giá trị mặc định';
$lang->is_active = 'Hoạt động';
$lang->is_required = 'Bắt buộc';
// ftp 관련
$lang->ftp_form_title = 'Thông tin FTP';
$lang->ftp = 'FTP';
$lang->ftp_port = 'Cổng kết nối:';
$lang->cmd_check_ftp_connect = 'Kiểm tra kết nối bằng FTP';
$lang->about_ftp_info = "
Thông tin tài khoản FTP thể được sử dụng trong các trường hợp sau: <br />
1. Nếu safe_mode của PHP mở, XE sẽ được cài đặt bằng cách sử dụng FTP. <br />
2. Tự động cập nhật thông tin sử dụng FTP. <br />
Thông tin tài khoản FTP này sẽ được lưu giữ tại: 'files/config/ftp.config.php'<br />
Sau khi cài đặt bạn thể xóa hoặc thay đổi thông tin tại Bảng điều khiển của Administrator.<br />";
$lang->msg_safe_mode_ftp_needed = "Nếu safe_mode của PHP mở, bạn nên nhập thông tin của FTP để cài đặt XE.";
$lang->msg_ftp_not_connected = "Kết nối bằng FTP không thành công. Xin vui lòng kiểm tra tài khoản và cổng kết nối!";
$lang->msg_ftp_invalid_auth_info = "Xác nhận không thành công. Xin vui lòng kiểm tra lại tên sử dụng và mật khẩu.";
$lang->msg_ftp_mkdir_fail = "Lỗi khi tạo thư mục. Xin vui lòng kiểm tra lại quyền truy cập FTP.";
$lang->msg_ftp_chmod_fail = "CHMOD không thành công. Xin vui lòng kiểm tra lại.";
$lang->msg_ftp_connect_success = "Đã xác nhận và kết nối thành công tới máy chủ bằng FTP.";
// Alert messages for Javascript using by XML filter
$lang->filter->isnull = 'Xin vui lòng nhập giá trị cho %s';
$lang->filter->outofrange = 'Xin vui lòng xếp thẳng hàng chiều dài văn bản của %s';
$lang->filter->equalto = "Giá trị của %s không hợp lệ";
$lang->filter->invalid_email = "Định dạng của %s không hợp lệ. Ví dụ: emailname@yahoo.com";
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "Định dạng của %s Không hợp lệ.\\nGiá trị hợp lệ bao gồm các kí tự từ a-z, các chữ số và dấu gạch dưới (_).";
$lang->filter->invalid_homepage = "Định dạng của %s không hợp lệ. Đúng sẽ là: http://vietxe.net hoặc http://www.vietxe.net";
$lang->filter->invalid_korean = "Định dạng của %s không hợp lệ. Nội dung này bắt buộc phải sử dụng tiếng Hàn Quốc";
$lang->filter->invalid_korean_number = "Định dạng của %s không hợp lệ. Nội dung này bắt buộc phải sử dụng tiếng Hàn Quốc hoặc các chữ số";
$lang->filter->invalid_alpha = "Định dạng của %s không hợp lệ. Chỉ sử dụng các kí tự từ a-z";
$lang->filter->invalid_alpha_number = "Định dạng của %s không hợp lệ. Chỉ sử dụng các kí tự từ a-z và các chữ số";
$lang->filter->invalid_number = "Định dạng của %s không hợp lệ. Chỉ sử dụng các chữ số";
?>

View file

@ -225,8 +225,9 @@
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_not_permitted_act = '没有权限执行 action命令';
$lang->msg_module_is_not_exists = "启动模块没有启用。\n安装启动模块的管理员网页。";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = '您请求的模块不能单独执行';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = '提交成功!';
$lang->success_declared = '举报成功!';

View file

@ -225,8 +225,9 @@
$lang->msg_invalid_format = '格式錯誤';
$lang->msg_not_permitted_act = '沒有權限執行';
$lang->msg_module_is_not_exists = "還沒有啟用模組。\n請在管理員頁面中啟用模組。";
$lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다";
$lang->msg_module_is_not_standalone = '您請求的模組不能單獨執行';
$lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다';
$lang->success_registed = '成功送出!';
$lang->success_declared = '檢舉成功!';
@ -244,8 +245,8 @@
$lang->fail_to_delete = '刪除成功!';
$lang->fail_to_move = '移動成功!';
$lang->failed_voted = '無法推薦!';
$lang->failed_blamed = '無法反對!';
$lang->failed_voted = '無法推薦!';
$lang->failed_blamed = '無法反對!';
$lang->failed_declared = '無法檢舉!';
$lang->fail_to_delete_have_children = '不能刪除有回覆的評論!';

View file

@ -53,13 +53,15 @@
<script type="text/javascript">//<![CDATA[
var current_url = "{$current_url}";
var request_uri = "{$request_uri}";
<!--@if($vid)-->var xeVid = "{$vid}";<!--@end-->
<!--@if($vid)-->var xeVid = "{$vid}";<!--@end-->
var current_mid = "{$mid}";
var waiting_message = "{$lang->msg_call_server}";
var ssl_actions = new Array(<!--@if(count($ssl_actions))-->"{implode('","',$ssl_actions)}"<!--@end-->);
var default_url = "{Context::getDefaultUrl()}";
<!--@if(Context::get("_http_port"))-->var http_port = {Context::get("_http_port")};<!--@end-->
<!--@if(Context::get("_https_port"))-->var https_port = {Context::get("_https_port")};<!--@end-->
<!--@if(Context::get("_use_ssl") && Context::get("_use_ssl") == "always")-->var enforce_ssl = true;<!--@end-->
//]]></script>
{Context::getHtmlHeader()}

26
common/tpl/redirect.html Normal file
View file

@ -0,0 +1,26 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<script type="text/javascript">
var idx = location.href.indexOf('?');
var url = parent.location.href;
if(idx > -1 ) {
var query_string = location.href.substr(idx+1, location.href.length);
var args = {};
query_string.replace(/([^=]+)=([^&]*)(&|$)/g, function() { args[arguments[1]] = arguments[2]; });
url = unescape(args['redirect_url']);
if(typeof(url)=="undefined" || !url) url = "../../";
}
if(typeof(opener)!='undefined' && opener) {
opener.location.href = url;
self.close();
} else {
parent.location.href = url;
}
</script>
</body>
</html>

View file

@ -13,7 +13,7 @@
* @brief XE의 전체 버전 표기
* 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '1.2.4');
define('__ZBXE_VERSION__', '1.2.6');
/**
* @brief zbXE가 설치된 장소의 base path를 구함
@ -52,7 +52,7 @@
* @brief 디버그 메세지의 출력 장소
* 0 : files/_debug_message.php 연결하여 출력
* 1 : HTML 최하단에 주석으로 출력 (Response Method가 HTML )
* 2 : Firebug 콘솔에 출력 (PHP >= 5.2.0. Firebug/FirePHP 플러그인 필요)
* 2 : Firebug 콘솔에 출력 (PHP 4 & 5. Firebug/FirePHP 플러그인 필요)
**/
if(!defined('__DEBUG_OUTPUT__')) define('__DEBUG_OUTPUT__', 0);
@ -103,7 +103,7 @@
/**
* @brief Firebug 콘솔 출력 사용시 관련 파일 require
**/
if((__DEBUG_OUTPUT__ == 2) && version_compare(PHP_VERSION, '5.2.0', '>=')) {
if((__DEBUG_OUTPUT__ == 2) && version_compare(PHP_VERSION, '6.0.0') === -1) {
require _XE_PATH_.'libs/FirePHPCore/FirePHP.class.php';
}

View file

@ -219,6 +219,48 @@
return Context::getUrl($num_args, $args_list);
}
function getNotEncodedUrl() {
$num_args = func_num_args();
$args_list = func_get_args();
if(!$num_args) return Context::getRequestUri();
return Context::getUrl($num_args, $args_list, null, false);
}
/**
* @brief getUrl() 값에 request uri를 추가하여 reutrn
* full url을 얻기 위함
**/
function getFullUrl() {
$num_args = func_num_args();
$args_list = func_get_args();
$request_uri = Context::getRequestUri();
if(!$num_args) return $request_uri;
$url = Context::getUrl($num_args, $args_list);
if(!preg_match('/^http/i',$url)){
preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
return substr($match[0],0,-1).$url;
}
return $url;
}
function getNotEncodedFullUrl() {
$num_args = func_num_args();
$args_list = func_get_args();
$request_uri = Context::getRequestUri();
if(!$num_args) return $request_uri;
$url = Context::getUrl($num_args, $args_list);
if(!preg_match('/^http/i',$url)){
preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
$url = Context::getUrl($num_args, $args_list, null, false);
return substr($match[0],0,-1).$url;
}
return $url;
}
/**
* @brief Context::getUrl() 쓰기 쉽게 함수로 선언
* @return string
@ -238,6 +280,40 @@
return Context::getUrl($num_args, $args_list, $domain);
}
function getNotEncodedSiteUrl() {
$num_args = func_num_args();
$args_list = func_get_args();
if(!$num_args) return Context::getRequestUri();
$domain = array_shift($args_list);
$num_args = count($args_list);
return Context::getUrl($num_args, $args_list, $domain, false);
}
/**
* @brief getSiteUrl() 값에 request uri를 추가하여 reutrn
* full url을 얻기 위함
**/
function getFullSiteUrl() {
$num_args = func_num_args();
$args_list = func_get_args();
$request_uri = Context::getRequestUri();
if(!$num_args) return $request_uri;
$domain = array_shift($args_list);
$num_args = count($args_list);
$url = Context::getUrl($num_args, $args_list, $domain);
if(!preg_match('/^http/i',$url)){
preg_match('/^(http|https):\/\/([^\/]+)\//',$request_uri,$match);
return substr($match[0],0,-1).$url;
}
return $url;
}
/**
* @brief 가상사이트의 Domain이 url형식인지 site id인지 return
**/
@ -368,6 +444,11 @@
elseif($format == 'Y-m-d H:i:s') $format = 'M d, Y H:i:s';
elseif($format == 'Y-m-d H:i') $format = 'M d, Y H:i';
break;
case 'vi' :
if($format == 'Y-m-d') $format = 'd-m-Y';
elseif($format == 'Y-m-d H:i:s') $format = 'H:i:s d-m-Y';
elseif($format == 'Y-m-d H:i') $format = 'H:i d-m-Y';
break;
}
}
@ -399,9 +480,9 @@
}
/**
* @brief 간단한 console debugging 함수
* @param buff 출력하고자 하는 object
* @param display_line 구분자를 출력할 것인지에 대한 플래그 (기본:true)
* @brief prints debug messages
* @param debug_output target object to be printed
* @param display_line boolean flag whether to print seperator (default:true)
* @return none
*
* ./files/_debug_message.php 파일에 $buff 내용을 출력한다.
@ -416,9 +497,16 @@
$file_name = array_pop(explode(DIRECTORY_SEPARATOR, $first['file']));
$line_num = $first['line'];
if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '5.2.0', '>=')) {
if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) {
if(!isset($firephp)) $firephp = FirePHP::getInstance(true);
$label = sprintf('[%s:%d] ', $file_name, $line_num);
if(function_exists("memory_get_usage"))
{
$label = sprintf('[%s:%d] (m:%s)', $file_name, $line_num, FileHandler::filesize(memory_get_usage()));
}
else
{
$label = sprintf('[%s:%d] ', $file_name, $line_num);
}
// FirePHP 옵션 체크
if($display_option === 'TABLE') $label = $display_option;
@ -433,7 +521,14 @@
} else {
$debug_file = _XE_PATH_.'files/_debug_message.php';
$debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true));
if(function_exists("memory_get_usage"))
{
$debug_output = sprintf("[%s %s:%d] - mem(%s)\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, FileHandler::filesize(memory_get_usage()), print_r($debug_output, true));
}
else
{
$debug_output = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($debug_output, true));
}
if($display_option === true) $debug_output = str_repeat('=', 40)."\n".$debug_output.str_repeat('-', 40);
$debug_output = "\n<?php\n/*".$debug_output."*/\n?>\n";

View file

@ -12,7 +12,7 @@
* XE 오픈 프로젝트로 개발되는 오픈 소스입니다.\n
* 자세한 내용은 아래 링크를 참조하세요.
* - 공식홈페이지 : http://www.xpressengine.com
* - SVN Repository : http://svn.xpressengine.com/XpressEngine/trunk
* - SVN Repository : http://svn.xpressengine.net/xe
* \n
* "XpressEngine (XE)" 자유 소프트웨어입니다. \n
* 소프트웨어의 피양도자는 자유 소프트웨어 재단이 공표한 GNU 일반 공중 사용 허가서 2 또는 \n

View file

@ -8,6 +8,7 @@
<title xml:lang="es">Diseño oficial de la página web de XE</title>
<title xml:lang="zh-CN">XE 官方网站布局</title>
<title xml:lang="zh-TW">XE 官方網站版面</title>
<title xml:lang="vi">Giao diện chính thức của XE</title>
<description xml:lang="ko">
XE 공식 사이트 레이아웃입니다.
디자인 : 이소라
@ -55,6 +56,12 @@
設計 : So-Ra Lee
HTML/CSS : Chan-Myung Jeong
版面設計 : zero
</description>
<description xml:lang="vi">
Đây là giao diện chính thức của XE.
Thiết kế bởi: So-Ra Lee
HTML/CSS : Chan-Myung Jeong
Quản lý : zero
</description>
<version>0.1</version>
<date>2007-08-01</date>
@ -69,6 +76,7 @@
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="zh-TW">zero</name>
<name xml:lang="vi">zero</name>
</author>
<extra_vars>
@ -81,6 +89,7 @@
<title xml:lang="ge">Colorset</title>
<title xml:lang="ru">Colorset</title>
<title xml:lang="es">Set de colores</title>
<title xml:lang="vi">Màu sắc</title>
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するカラーセットを選択して下さい。</description>
<description xml:lang="zh-CN">请选择颜色。</description>
@ -89,6 +98,7 @@
<description xml:lang="ge">Bitte wählen Sie ein colorset Sie wollen.</description>
<description xml:lang="ru">Выберите colorset хотите.</description>
<description xml:lang="es">Seleccione set de colores que desea.</description>
<description xml:lang="vi">Hãy chọn màu sắc bạn muốn.</description>
<options value="default">
<title xml:lang="ko">기본</title>
<title xml:lang="jp">デフォルト</title>
@ -98,6 +108,7 @@
<title xml:lang="es">Básico</title>
<title xml:lang="zh-CN">默认</title>
<title xml:lang="zh-TW">預設</title>
<title xml:lang="vi">Cơ bản</title>
</options>
<options value="black">
<title xml:lang="ko">검은색</title>
@ -108,6 +119,7 @@
<title xml:lang="es">Negro</title>
<title xml:lang="zh-CN">黑色</title>
<title xml:lang="zh-TW">黑色</title>
<title xml:lang="vi">Black</title>
</options>
<options value="white">
<title xml:lang="ko">하얀색</title>
@ -118,6 +130,7 @@
<title xml:lang="es">Blanco</title>
<title xml:lang="zh-CN">白色</title>
<title xml:lang="zh-TW">白色</title>
<title xml:lang="vi">White</title>
</options>
</var>
<var name="logo_image" type="image">
@ -129,6 +142,7 @@
<title xml:lang="ge">Logobildes</title>
<title xml:lang="ru">Изображения логотипа</title>
<title xml:lang="es">Imagen del logotipo</title>
<title xml:lang="vi">Hình Logo</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다)</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。)</description>
<description xml:lang="zh-CN">请输入显示在布局顶部的LOGO图片(高度为23px的透明图片为适)。</description>
@ -137,6 +151,7 @@
<description xml:lang="ge">Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 23px wird empfohlen).</description>
<description xml:lang="ru">Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 23px рекомендуется.)</description>
<description xml:lang="es">Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px.</description>
<description xml:lang="vi">Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 23px.)</description>
</var>
<var name="index_url" type="text">
<title xml:lang="ko">홈 페이지 URL</title>
@ -147,6 +162,7 @@
<title xml:lang="ge">Homepage URL</title>
<title xml:lang="ru">Домашняя страница URL</title>
<title xml:lang="es">URL de la página web</title>
<title xml:lang="vi">URL Trang chủ</title>
<description xml:lang="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
<description xml:lang="jp">ロゴをクリックした時に移動するホームページのURLを入力して下さい。</description>
<description xml:lang="zh-CN">点击网站LOGO时要移动的页面URL。</description>
@ -155,6 +171,7 @@
<description xml:lang="ge">Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo</description>
<description xml:lang="ru">Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип</description>
<description xml:lang="es">Ingresar el URL de la página web para redireccionar al pulsar el logotipo</description>
<description xml:lang="vi">Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo</description>
</var>
<var name="background_image" type="image">
<title xml:lang="ko">배경 이미지</title>
@ -165,6 +182,7 @@
<title xml:lang="ge">Hintergrundbild</title>
<title xml:lang="ru">Фоновое изображение</title>
<title xml:lang="es">Imagen de fondo</title>
<title xml:lang="vi">Hình nền</title>
<description xml:lang="ko">배경 이미지를 사용하시려면 등록해주세요.</description>
<description xml:lang="jp">背景イメージを使う場合は、登録して下さい。</description>
<description xml:lang="zh-CN">要想使用背景图片请在这里上传。</description>
@ -173,6 +191,7 @@
<description xml:lang="ge">Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild.</description>
<description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description>
<description xml:lang="es">Ingresar imagen de fondo si desea usar.</description>
<description xml:lang="vi">Hãy nhập hình nền nếu bạn muốn sử dụng.</description>
</var>
</extra_vars>
@ -186,6 +205,7 @@
<title xml:lang="ge">Top Menü</title>
<title xml:lang="ru">Верхнее меню</title>
<title xml:lang="es">Menú Principal</title>
<title xml:lang="vi">Menu trên</title>
</menu>
<menu name="bottom_menu" maxdepth="1">
<title xml:lang="ko">하단 메뉴 </title>
@ -196,6 +216,7 @@
<title xml:lang="ge">Bottom-Menü</title>
<title xml:lang="ru">Внизу меню</title>
<title xml:lang="es">Menú Inferior </title>
<title xml:lang="vi">Menu dưới</title>
</menu>
</menus>
</layout>

110
libs/FirePHPCore/CHANGELOG Normal file
View file

@ -0,0 +1,110 @@
2008-06-14 - Release Version: 0.3.1
- (Issue 108) ignore class name case in object filter
2009-05-11 - Release Version: 0.3
2009-05-01 - Release Version: 0.3.rc.1
- (Issue 90) PHP4 compatible version of FirePHPCore
- (Issue 98) Thrown exceptions don't send an HTTP 500 if the FirePHP exception handler is enabled
- (Issue 85) Support associative arrays in encodeTable method in FirePHP.class.php
- (Issue 66) Add a new getOptions() public method in API
- (Issue 82) Define $this->options outside of __construct
- (Issue 72) Message error if group name is null
- (Issue 68) registerErrorHandler() and registerExceptionHandler() should returns previous handlers defined
- (Issue 69) Add the missing register handler in the triumvirate (error, exception, assert)
- (Issue 75) [Error & Exception Handling] Option to not exit script execution
- (Issue 83) Exception handler can't throw exceptions
- (Issue 80) Auto/Pre collapsing groups AND Custom group row colors
2008-11-09 - Release Version: 0.2.1
- (Issue 70) Problem when logging resources
2008-10-21 - Release Version: 0.2.0
- Updated version to 0.2.0
- Switched to using __sleep instead of __wakeup
- Added support to exclude object members when encoding
- Add support to enable/disable logging
2008-10-17 - Release Version: 0.2.b.8
- New implementation for is_utf8()
- (Issue 55) maxObjectDepth Option not working correctly when using TABLE and EXCEPTION Type
- Bugfix for max[Object|Array]Depth when encoding nested array/object graphs
- Bugfix for FB::setOptions()
2008-10-16 - Release Version: 0.2.b.7
- (Issue 45) Truncate dump when string have non utf8 cars
- (Issue 52) logging will not work when firephp object gets stored in the session.
2008-10-16 - Release Version: 0.2.b.6
- (Issue 37) Display file and line information for each log message
- (Issue 51) Limit output of object graphs
- Bugfix for encoding object members set to NULL|false|''
2008-10-14 - Release Version: 0.2.b.5
- Updated JsonStream wildfire protocol to be more robust
- (Issue 33) PHP error notices running demos
- (Issue 48) Warning: ReflectionProperty::getValue() expects exactly 1 parameter, 0 given
2008-10-08 - Release Version: 0.2.b.4
- Bugfix for logging objects with recursion
2008-10-08 - Release Version: 0.2.b.3
- (Issue 43) Notice message in 0.2b2
- Added support for PHP's native json_encode() if available
- Revised object encoder to detect object recursion
2008-10-07 - Release Version: 0.2.b.2
- (Issue 28) Need solution for logging private and protected object variables
- Added trace() and table() aliases in FirePHP class
- (Issue 41) Use PHP doc in FirePHP
- (Issue 39) Static logging method for object oriented API
2008-10-01 - Release Version: 0.2.b.1
- Added support for error and exception handling
- Updated min PHP version for PEAR package to 5.2
- Added version constant for library
- Gave server library it's own wildfire plugin namespace
- Migrated communication protocol to Wildfire JsonStream
- Added support for console groups using "group" and "groupEnd"
- Added support for log, info, warn and error logging aliases
- (Issue 29) problem with TRACE when using with error_handler
- (Issue 33) PHP error notices running demos
- (Issue 12) undefined index php notice
- Removed closing ?> php tags
- (Issue 13) the code in the fb() function has a second return statement that will never be reached
2008-07-30 - Release Version: 0.1.1.3
- Include __className property in JSON string if variable was an object
- Bugfix - Mis-spelt "Exception" in JSON encoding code
2008-06-13 - Release Version: 0.1.1.1
- Bugfix - Standardize windows paths in stack traces
- Bugfix - Display correct stack trace info in windows environments
- Bugfix - Check $_SERVER['HTTP_USER_AGENT'] before returning
2008-06-13 - Release Version: 0.1.1
- Added support for FirePHP::TRACE log style
- Changed license to New BSD License
2008-06-06 - Release Version: 0.0.2
- Bugfix - Added usleep() to header writing loop to ensure unique index
- Bugfix - Ensure chunk_split does not generate trailing "\n" with empty data header
- Added support for FirePHP::TABLE log style

12
libs/FirePHPCore/CREDITS Normal file
View file

@ -0,0 +1,12 @@
_______________________________
F i r e P H P C o r e
Current Development
-------------------
Christoph Dorn <christoph@christophdorn.com>
Michael Day <manveru.alma@gmail.com>
If you've done work on FirePHPCore and you are not listed here,
please feel free to add yourself.

File diff suppressed because it is too large Load diff

View file

@ -1,58 +1,29 @@
Software License Agreement (New BSD License)
Copyright (c) 2006-2008, Christoph Dorn
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Christoph Dorn nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Software License Agreement (New BSD License)
Copyright (c) 2006-2008, Christoph Dorn
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Christoph Dorn nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Software License Agreement (New BSD License)
Copyright (c) 2006-2009, Christoph Dorn
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Christoph Dorn nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

32
libs/FirePHPCore/README Normal file
View file

@ -0,0 +1,32 @@
Version: 0.3.1
------------------------------------------------------
Requirements
------------------------------------------------------
Client Side:
- Firefox - http://www.getfirefox.com/
- Firebug - http://www.getfirebug.com/
- FirePHP - http://www.firephp.org/
Server Side:
- PHP 5 (complete functionality)
- PHP 4 (most functionality)
------------------------------------------------------
Install Tutorial
------------------------------------------------------
http://www.firephp.org/HQ/Install.htm
------------------------------------------------------
Support
------------------------------------------------------
http://forum.firephp.org/

261
libs/FirePHPCore/fb.php Normal file
View file

@ -0,0 +1,261 @@
<?php
/* ***** BEGIN LICENSE BLOCK *****
*
* This file is part of FirePHP (http://www.firephp.org/).
*
* Software License Agreement (New BSD License)
*
* Copyright (c) 2006-2009, Christoph Dorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of Christoph Dorn nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK *****
*
* @copyright Copyright (C) 2007-2009 Christoph Dorn
* @author Christoph Dorn <christoph@christophdorn.com>
* @license http://www.opensource.org/licenses/bsd-license.php
* @package FirePHP
*/
require_once dirname(__FILE__).'/FirePHP.class.php';
/**
* Sends the given data to the FirePHP Firefox Extension.
* The data can be displayed in the Firebug Console or in the
* "Server" request tab.
*
* @see http://www.firephp.org/Wiki/Reference/Fb
* @param mixed $Object
* @return true
* @throws Exception
*/
function fb()
{
$instance = FirePHP::getInstance(true);
$args = func_get_args();
return call_user_func_array(array($instance,'fb'),$args);
}
class FB
{
/**
* Enable and disable logging to Firebug
*
* @see FirePHP->setEnabled()
* @param boolean $Enabled TRUE to enable, FALSE to disable
* @return void
*/
public static function setEnabled($Enabled) {
$instance = FirePHP::getInstance(true);
$instance->setEnabled($Enabled);
}
/**
* Check if logging is enabled
*
* @see FirePHP->getEnabled()
* @return boolean TRUE if enabled
*/
public static function getEnabled() {
$instance = FirePHP::getInstance(true);
return $instance->getEnabled();
}
/**
* Specify a filter to be used when encoding an object
*
* Filters are used to exclude object members.
*
* @see FirePHP->setObjectFilter()
* @param string $Class The class name of the object
* @param array $Filter An array or members to exclude
* @return void
*/
public static function setObjectFilter($Class, $Filter) {
$instance = FirePHP::getInstance(true);
$instance->setObjectFilter($Class, $Filter);
}
/**
* Set some options for the library
*
* @see FirePHP->setOptions()
* @param array $Options The options to be set
* @return void
*/
public static function setOptions($Options) {
$instance = FirePHP::getInstance(true);
$instance->setOptions($Options);
}
/**
* Get options for the library
*
* @see FirePHP->getOptions()
* @return array The options
*/
public static function getOptions() {
$instance = FirePHP::getInstance(true);
return $instance->getOptions();
}
/**
* Log object to firebug
*
* @see http://www.firephp.org/Wiki/Reference/Fb
* @param mixed $Object
* @return true
* @throws Exception
*/
public static function send()
{
$instance = FirePHP::getInstance(true);
$args = func_get_args();
return call_user_func_array(array($instance,'fb'),$args);
}
/**
* Start a group for following messages
*
* Options:
* Collapsed: [true|false]
* Color: [#RRGGBB|ColorName]
*
* @param string $Name
* @param array $Options OPTIONAL Instructions on how to log the group
* @return true
*/
public static function group($Name, $Options=null) {
$instance = FirePHP::getInstance(true);
return $instance->group($Name, $Options);
}
/**
* Ends a group you have started before
*
* @return true
* @throws Exception
*/
public static function groupEnd() {
return self::send(null, null, FirePHP::GROUP_END);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::LOG
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function log($Object, $Label=null) {
return self::send($Object, $Label, FirePHP::LOG);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::INFO
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function info($Object, $Label=null) {
return self::send($Object, $Label, FirePHP::INFO);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::WARN
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function warn($Object, $Label=null) {
return self::send($Object, $Label, FirePHP::WARN);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::ERROR
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function error($Object, $Label=null) {
return self::send($Object, $Label, FirePHP::ERROR);
}
/**
* Dumps key and variable to firebug server panel
*
* @see FirePHP::DUMP
* @param string $Key
* @param mixed $Variable
* @return true
* @throws Exception
*/
public static function dump($Key, $Variable) {
return self::send($Variable, $Key, FirePHP::DUMP);
}
/**
* Log a trace in the firebug console
*
* @see FirePHP::TRACE
* @param string $Label
* @return true
* @throws Exception
*/
public static function trace($Label) {
return self::send($Label, FirePHP::TRACE);
}
/**
* Log a table in the firebug console
*
* @see FirePHP::TABLE
* @param string $Label
* @param string $Table
* @return true
* @throws Exception
*/
public static function table($Label, $Table) {
return self::send($Table, $Label, FirePHP::TABLE);
}
}

View file

@ -2,6 +2,7 @@
<module version="0.2">
<title xml:lang="ko">애드온</title>
<title xml:lang="en">Addon</title>
<title xml:lang="vi">Addon</title>
<title xml:lang="es">Addon</title>
<title xml:lang="zh-CN">插件管理</title>
<title xml:lang="jp">アドオン</title>
@ -10,6 +11,7 @@
<title xml:lang="zh-TW">附加元件</title>
<description xml:lang="ko">애드온을 등록하거나 사용/미사용을 설정하는 애드온 관리 모듈입니다.</description>
<description xml:lang="en">This module is for maintaining addons which can toggle use and disuse states.</description>
<description xml:lang="vi">Module này dành cho việc bảo trì những Addon đang sử dụng và không sử dụng.</description>
<description xml:lang="es">Este Módulo es para agregar Addons, como también el manejo de ellos.</description>
<description xml:lang="zh-CN">登录插件或设置启用/禁用插件的管理模块。</description>
<description xml:lang="jp">アドオンの「登録、使用・未使用」などを設定する管理モジュールです。</description>
@ -23,6 +25,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">zero</name>

View file

@ -7,11 +7,11 @@
$lang->addon = '애드온';
$lang->addon_info = '애드온정보';
$lang->addon_info = '애드온 정보';
$lang->addon_maker = '애드온 제작자';
$lang->addon_license = '라이선스';
$lang->addon_history = '변경 이력';
$lang->about_addon_mid = '애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제시 모든 대상에서 사용 가능합니다)';
$lang->about_addon = '애드온은 html결과물을 출력하기 보다 동작을 제어하는 역할을 합니다.<br />원하시는 애드온을 on/ off하시는 것만으로 사이트 운영에 유용한 기능을 연동할 수 있습니다.';
$lang->about_addon_mid = '애드온이 사용될 대상을 지정할 수 있습니다.<br />(모두 해제 시 모든 대상에서 사용 가능합니다.)';
$lang->about_addon = '애드온은 HTML결과물을 출력하기보다는 동작을 제어하는 역할을 합니다.<br />원하시는 애드온을 ON/OFF 하시는 것만으로도 사이트 운영에 유용한 기능을 연동할 수 있습니다.';
?>

View file

@ -0,0 +1,19 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->addon = "Addon";
$lang->addon_info = 'Thông tin về Addon';
$lang->addon_maker = 'Tác giả của Addon';
$lang->addon_license = 'Giấy phép';
$lang->addon_history = 'Lịch sử';
$lang->about_addon_mid = "Addon có thể chọn những vị trí.<br />(Tất cả những vị trí mà chưa Addon nào sử dụng.)";
$lang->about_addon = 'Addon có nhiệm vụ hiển thị và kiểm soát kết quả HTML.<br />Bạn có thể mở hoặc tắt bất cứ Addon nào bạn muốn.';
?>

View file

@ -95,7 +95,7 @@
// 네트웍 상태로 데이터를 가져오지 못할 상황을 고려해 일단 filemtime을 변경하여 관리자 페이지 refresh시에 다시 읽ㅇ 오지 않도록 함
// 뉴스를 보지는 못하지만 관리자 페이지 접속은 이상없도록 함
FileHandler::writeFile($cache_file,'');
FileHandler::getRemoteFile($newest_news_url, $cache_file);
FileHandler::getRemoteFile($newest_news_url, $cache_file, null, 1, 'GET', 'text/html', array('REQUESTURL'=>getFullUrl('')));
}
if(file_exists($cache_file)) {
@ -268,17 +268,6 @@
Context::set('ftp_info', Context::getFTPInfo());
$oModuleModel = &getModel('module');
$site_args->site_srl = 0;
$list = $oModuleModel->getMidList($site_args);
$mid_list = array();
if(count($list)) {
foreach($list as $key => $val) {
$mid_list[$val->module][$key] = $val;
}
}
Context::set('mid_list', $mid_list);
$site_args->site_srl = 0;
$output = executeQuery('module.getSiteInfo', $site_args);
Context::set('start_module', $output->data);

View file

@ -2,6 +2,7 @@
<module version="0.2">
<title xml:lang="ko">관리자 모듈</title>
<title xml:lang="en">Administrator Module</title>
<title xml:lang="vi">Administrator Module</title>
<title xml:lang="es">Módulo del administrador</title>
<title xml:lang="zh-CN">管理员模块</title>
<title xml:lang="jp">管理者用モジュール</title>
@ -9,6 +10,7 @@
<title xml:lang="zh-TW">管理員模組</title>
<description xml:lang="ko">각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다.</description>
<description xml:lang="en">This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator.</description>
<description xml:lang="vi">Module này hiển thị những đặc tính của những Module, và cho phép bạn sử dụng một chút quyền của Administrator bở việc áp dụng giao diện cho Administrator.</description>
<description xml:lang="es">Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador.</description>
<description xml:lang="zh-CN">列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。</description>
<description xml:lang="jp">各モジュールを機能別に並べ、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。</description>
@ -21,6 +23,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">zero</name>

View file

@ -76,6 +76,6 @@
$lang->about_use_ssl = "If you choose 'optional', SSL will be used for actions such as sign up / changing information. And for 'always', your site will be served only via https.";
$lang->server_ports = "Server port";
$lang->about_server_ports = "If your web-server uses other than 80 for HTTP, 443 for HTTPS, you should specify server ports";
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->use_db_session = 'Use Session DB';
$lang->about_db_session = 'It will use php session with DB when authenticating.<br/>Websites with infrequent usage of web server may expect faster response when this function is disabled.<br/>However session DB will make it unable to get current users, so you cannot use related functions.';
?>

View file

@ -9,7 +9,7 @@
$lang->admin_index = '관리자 초기 페이지';
$lang->control_panel = '제어판';
$lang->start_module = '시작 모듈';
$lang->about_start_module = '사이트 접속시 기본으로 호출될 모듈을 지정할 수 있습니다.';
$lang->about_start_module = '사이트 접속 시 기본으로 호출될 모듈을 지정할 수 있습니다.';
$lang->module_category_title = array(
'service' => '서비스 관리',
@ -28,7 +28,7 @@
$lang->env_setup = '환경 설정';
$lang->default_url = '기본 URL';
$lang->about_default_url = 'XE 가상 사이트(cafeXE등)의 기능을 사용할때 기본 URL을 입력해 주셔야 가상 사이트간 인증 연동이 되고 게시글/모듈등의 연결이 정상적으로 이루어집니다. (ex: http://도메인/설치경로)';
$lang->about_default_url = 'XE 가상 사이트(cafeXE 등)의 기능을 사용할 때 기본 URL을 입력하셔야 가상 사이트간 인증 연동이 되고 게시글, 모듈 등의 연결이 정상적으로 이루어집니다. (예: http://도메인/설치경로)';
$lang->env_information = '환경 정보';
@ -46,37 +46,36 @@
$lang->addon_name = '애드온 이름';
$lang->version = '버전';
$lang->author = '제작자';
$lang->table_count = '테이블수';
$lang->installed_path = '설치경로';
$lang->table_count = '테이블 수';
$lang->installed_path = '설치 경로';
$lang->cmd_shortcut_management = '메뉴 편집하기';
$lang->msg_is_not_administrator = '관리자만 접속이 가능합니다';
$lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다';
$lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수 없습니다';
$lang->msg_is_not_administrator = '관리자만 접속이 가능합니다.';
$lang->msg_manage_module_cannot_delete = '모듈, 애드온, 레이아웃, 위젯 모듈의 바로가기는 삭제 불가능합니다.';
$lang->msg_default_act_is_null = '기본 관리자 Action이 지정되어 있지 않아 바로가기 등록을 할 수 없습니다.';
$lang->welcome_to_xe = 'XE 관리자';
$lang->about_admin_page = "관리자 페이지는 아직 미완성입니다.\n클로즈 베타동안 좋은 의견 받아서 꼭 필요한 컨텐츠를 채우도록 하겠습니다.";
$lang->about_lang_env = '위 설정한 언어셋을 처음 방문하는 사용자들에게 동일하게 적용하기 위해서는 원하는 언어로 변경후 아래 [저장] 버튼을 클릭하시면 됩니다';
$lang->about_lang_env = '처음 방문하는 사용자들의 언어 설정을 동일하게 하려면, 원하는 언어로 변경 후 아래 [저장] 버튼을 클릭하시면 됩니다.';
$lang->xe_license = 'XE는 GPL을 따릅니다';
$lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다';
$lang->xe_license = 'XE는 GPL을 따릅니다.';
$lang->about_shortcut = '자주 사용하는 모듈에 등록된 모듈의 바로가기를 삭제할 수 있습니다.';
$lang->yesterday = '어제';
$lang->today = '오늘';
$lang->cmd_lang_select = '언어선택';
$lang->about_cmd_lang_select = '선택된 언어들만 서비스 됩니다';
$lang->about_recompile_cache = '쓸모 없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다';
$lang->about_cmd_lang_select = '선택된 언어들만 서비스 됩니다.';
$lang->about_recompile_cache = '쓸모 없어졌거나 잘못된 캐시파일들을 정리할 수 있습니다.';
$lang->use_ssl = 'SSL 사용';
$lang->ssl_options = array(
'none' => '사용안함',
'none' => '사용 안함',
'optional' => '선택적으로',
'always' => '항상사용'
'always' => '항상 사용'
);
$lang->about_use_ssl = '선택적으로에서는 회원가입/정보수정등의 지정된 action에서 SSL을 사용하고 항상 사용은 모든 서비스가 SSL을 이용하게 됩니다.';
$lang->about_use_ssl = '\'선택적으로\'는 회원가입, 정보수정 등의 지정된 action에서 SSL을 사용하고 \'항상 사용\'은 모든 서비스에 SSL을 사용 합니다.';
$lang->server_ports = '서버포트지정';
$lang->about_server_ports = 'HTTP는 80, HTTPS는 443이외의 다른 포트를 사용하는 경우에 포트를 지정해주어야합니다.';
$lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.';
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
?>

View file

@ -0,0 +1,83 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->admin_info = 'Thông tin Administrator';
$lang->admin_index = 'Trang chủ Admin';
$lang->control_panel = 'Bảng điều khiển';
$lang->start_module = 'Module trang chủ';
$lang->about_start_module = 'Bạn có thể chọn một Module và đặt là trang chủ của Website.';
$lang->module_category_title = array(
'service' => 'Thiết lập dịch vụ',
'member' => 'Thiết lập thành viên',
'content' => 'Thiết lập nội dung',
'statistics' => 'Thống kê',
'construction' => 'Xây dựng giao diện',
'utility' => 'Thiết lập tiện ích',
'interlock' => 'Tiện ích nâng cao',
'accessory' => 'Dịch vụ phụ',
'migration' => 'Chuyển đổi dữ liệu',
'system' => 'Thiết lập hệ thống',
);
$lang->newest_news = "Tin mới nhất";
$lang->env_setup = "Thiết lập ";
$lang->default_url = "URL mặc định";
$lang->about_default_url = "Nếu bạn sử dụng tính năng trang Web ảo (Ví dụ: PlanetXE, cafeXE), hãy chọn URL mặc định (địa chỉ trang chủ), khi khi kích hoạt SSO với thư mục hay Module làm việc.";
$lang->env_information = "Thông tin";
$lang->current_version = "Phiên bản";
$lang->current_path = "Thư mục cài đặt";
$lang->released_version = "Phiên bản mới nhất";
$lang->about_download_link = "Đã có phiên bản mới nhất của Zerboard XE.\n hãy bấm vào Link để Download.";
$lang->item_module = "Danh sách Module";
$lang->item_addon = "Danh sách Addon";
$lang->item_widget = "Danh sách Widget";
$lang->item_layout = "Danh sách Layout";
$lang->module_name = "Tên Module";
$lang->addon_name = "Tên Addon";
$lang->version = "Phiên bản";
$lang->author = "Thiết kế";
$lang->table_count = "Table";
$lang->installed_path = "Thư mục đã cài đặt";
$lang->cmd_shortcut_management = "Sửa Menu";
$lang->msg_is_not_administrator = 'Dành riêng Administrator';
$lang->msg_manage_module_cannot_delete = 'Không thể xóa những phím tắt của Module, Addon, Layout, Widget.';
$lang->msg_default_act_is_null = 'Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.';
$lang->welcome_to_xe = 'Chào mừng bạn đến với trang quản lý của XE!';
$lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\nChúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng.";
$lang->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại.";
$lang->xe_license = 'XE sử dụng giấy phép GPL';
$lang->about_shortcut = 'Bạn có thể loại bỏ phím tắt của Module được sử dụng thường xuyên trên danh sách.';
$lang->yesterday = "Hôm qua";
$lang->today = "Hôm nay";
$lang->cmd_lang_select = "Ngôn ngữ";
$lang->about_cmd_lang_select = "Chỉ chọn được những ngôn ngữ có sẵn.";
$lang->about_recompile_cache = "Bạn có thể sắp xếp lại File Cache cho những việc đã làm hoặc bị lỗi.";
$lang->use_ssl = "Sử dụng SSL";
$lang->ssl_options = array(
'none' => "Không sử dụng",
'optional' => "Tùy chỉnh",
'always' => "Luôn luôn"
);
$lang->about_use_ssl = "Nếu bạn chọn 'Tùy chỉnh', SSL sẽ sử dụng và những công việc như đăng kí, sửa thông tin thành viên, .<br />Chỉ chọn 'Luôn luôn' khi Website của bạn đang chạy trên Server có hỗ trợ https.";
$lang->server_ports = "Cổng kết nối";
$lang->about_server_ports = "Nếu Host của bạn sử dụng cổng khác cổng mặc định 80 cho HTTP, 443 cho HTTPS, bạn nên xác định và nhập chính xác cổng kết nối.";
$lang->use_db_session = 'Xác nhận Database';
$lang->about_db_session = 'PHP sẽ xác nhận với Database. Có thể cải thiện được tốc độ của Website.';
?>

View file

@ -6,6 +6,15 @@
<!--%import("../../install/lang")-->
<!--%import("../../install/tpl/js/install_admin.js",optimized=false)-->
<script type="text/javascript">
function insertSelectedModule(id, module_srl, mid, browser_title) {
var obj= xGetElementById('_'+id);
var sObj = xGetElementById(id);
sObj.value = module_srl;
obj.value = browser_title+' ('+mid+')';
}
</script>
<div class="content">
<!--@if($logged_info->is_admin == 'Y')-->
<p class="path">
@ -33,19 +42,13 @@
</td>
</tr>
<tr>
<th><div>{$lang->start_module}</div></th>
<th scope="row"><div>{$lang->start_module}</div></th>
<td>
<select name="index_module_srl" class="w200">
<!--@foreach($mid_list as $key => $val)-->
<option value="" disabled="disabled">{$key}</option>
<!--@foreach($val as $k => $v)-->
<option value="{$v->module_srl}" <!--@if($start_module->index_module_srl==$v->module_srl)-->selected="selected"<!--@end-->>&nbsp; &nbsp;{$v->mid} ({$v->browser_title})</option>
<!--@end-->
<!--@endforeach-->
</select>
<p>{$lang->about_start_module}</p>
<input type="hidden" name="index_module_srl" id="target_module" value="{$start_module->index_module_srl}" />
<input type="text" name="_target_module" id="_target_module" class="inputTypeText w300" value="{$start_module->mid} ({$start_module->browser_title})" readonly="readonly" /><a href="{getUrl('','module','module','act','dispModuleSelectList','id','target_module','type','single')}" onclick="popopen(this.href,'ModuleSelect');return false;" class="button green"><span>{$lang->cmd_select}</span></a>
</td>
</tr>
<tr>
<th><div>{$lang->use_optimizer}</div></th>
<td>

View file

@ -49,3 +49,4 @@ jQuery(function(){
function doAdminLogout() {
exec_xml('admin','procAdminLogout',new Array(), function() { location.reload(); });
}

View file

@ -116,7 +116,7 @@
// 변수 정리
if($type) $title = "[".$type."] ";
$title .= cut_str(strip_tags($content), 30, '...');
$content = sprintf('%s<br /><br />from : <a href="%s#comment_%s" onclick="window.open(this.href);return false;">%s</a>',$content, $oDocument->getPermanentUrl(), $this->get('comment_srl'), $oDocument->getPermanentUrl());
$content = sprintf('%s<br /><br />from : <a href="%s#comment_%s" onclick="window.open(this.href);return false;">%s</a>',$content, getFullUrl('','document_srl',$this->get('document_srl')), $this->get('comment_srl'), getFullUrl('','document_srl',$this->get('document_srl')));
$receiver_srl = $this->get('member_srl');
$sender_member_srl = $logged_info->member_srl;
@ -256,7 +256,7 @@
function getPermanentUrl() {
$url = getUrl('','document_srl',$this->get('document_srl')).'#comment_'.$this->get('comment_srl');
if(substr($url,0,1)=='/') $url = substr(Context::getRequestUri(),0,-1).$url;
if(substr($url,0,1)=='/') return substr(Context::getRequestUri(),0,-1).$url;
return $url;
}

View file

@ -344,6 +344,7 @@
$args->list_count = $obj->list_count?$obj->list_count:20;
$args->page_count = $obj->page_count?$obj->page_count:10;
$args->s_module_srl = $obj->module_srl;
$args->exclude_module_srl = $obj->exclude_module_srl;
// 검색 옵션 정리
$search_target = $obj->search_target?$obj->search_target:trim(Context::get('search_target'));

View file

@ -4,6 +4,7 @@
<title xml:lang="jp">コメント</title>
<title xml:lang="zh-CN">评论管理</title>
<title xml:lang="en">Comment</title>
<title xml:lang="vi">Bình luận</title>
<title xml:lang="es">Commentarios</title>
<title xml:lang="ru">Комментарии</title>
<title xml:lang="zh-TW">評論</title>
@ -11,6 +12,7 @@
<description xml:lang="jp">掲示板やブログなどのコメントを管理するモジュールです。</description>
<description xml:lang="zh-CN">管理版面或博客评论的模块。</description>
<description xml:lang="en">Module for managing board/blog's comments</description>
<description xml:lang="vi">Module quản lý bình luận của bài viết và sổ lưu niệm</description>
<description xml:lang="es">Es el módulo para manejar commentarios en blog o boletínes.</description>
<description xml:lang="ru">Модуль для управления комментариями форума/блога.</description>
<description xml:lang="zh-TW">管理討論板或部落格評論的模組。</description>
@ -21,6 +23,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>

View file

@ -5,25 +5,25 @@
* @brief 댓글(comment) 모듈의 기본 언어팩
**/
$lang->cmd_comment_do = '이 댓글을..';
$lang->cmd_comment_do = '이 댓글을...';
$lang->comment_list = '댓글 목록';
$lang->cmd_toggle_checked_comment = '선택항목 반전';
$lang->cmd_toggle_checked_comment = '선택항목 반전';
$lang->cmd_delete_checked_comment = '선택항목 삭제';
$lang->comment_count = '댓글 수';
$lang->about_comment_count = '댓글을 정해진 수 만큼만 표시하고 그 이상일 경우 목록으로 이동할 수 있게 합니다.';
$lang->msg_cart_is_null = '삭제할 글을 선택해주세요';
$lang->msg_checked_comment_is_deleted = '%d개의 댓글이 삭제되었습니다';
$lang->msg_cart_is_null = '삭제할 글을 선택해주세요.';
$lang->msg_checked_comment_is_deleted = '%d개의 댓글이 삭제되었습니다.';
$lang->search_target_list = array(
'content' => '내용',
'user_id' => '아이디',
'user_name' => '이름',
'nick_name' => '닉네임',
'member_srl' => '회원번호',
'email_address' => '이메일주소',
'member_srl' => '회원 번호',
'email_address' => '이메일 주소',
'homepage' => '홈페이지',
'regdate' => '등록일',
'last_update' => '최근수정일 ',

View file

@ -0,0 +1,33 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->cmd_comment_do = 'Bình chọn / Phê bình';
$lang->comment_list = 'Danh sách bình luận';
$lang->cmd_delete_checked_comment = 'Xóa những bình luận đã chọn';
$lang->comment_count = 'Số bình luận';
$lang->about_comment_count = 'Hiển thị số bình luận được gửi, và nó sẽ tạo một danh sách nếu có nhiều bình luận.';
$lang->msg_cart_is_null = 'Xin hãy chọn một bài viết để xóa.';
$lang->msg_checked_comment_is_deleted = '%d bình luận đã được xóa.';
$lang->search_target_list = array(
'content' => 'Nội dung',
'user_id' => 'ID người gửi',
'user_name' => 'Tên',
'nick_name' => 'Nickname',
'member_srl' => 'Mã số người gửi',
'email_address' => 'Email',
'homepage' => 'Trang chủ',
'regdate' => 'Ngày',
'last_update' => 'Cập nhật lần cuối',
'ipaddress' => 'IP',
);
?>

View file

@ -7,6 +7,7 @@
</columns>
<conditions>
<condition operation="in" column="module_srl" var="s_module_srl" />
<condition operation="notin" column="module_srl" var="exclude_module_srl" pipe="and" />
<group pipe="and">
<condition operation="like" column="content" var="s_content" pipe="or" />
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />

View file

@ -4,7 +4,7 @@
<table name="member" alias="member" />
</tables>
<columns>
<column name="*" />
<column name="comments.*" />
</columns>
<conditions>
<condition operation="like" column="member.user_id" var="s_user_id" notnull="notnull" />

View file

@ -17,7 +17,6 @@
<column name="homepage" var="homepage" filter="homepage" maxlength="250" />
<column name="uploaded_count" var="uploaded_count" default="0" />
<column name="last_update" var="last_update" default="curdate()" />
<column name="ipaddress" var="ipaddress" default="ipaddress()" />
</columns>
<conditions>
<condition operation="equal" column="comment_srl" var="comment_srl" filter="number" notnull="notnull" />

View file

@ -4,11 +4,13 @@
<title xml:lang="jp">コミュニケーション</title>
<title xml:lang="zh-CN">会员交流</title>
<title xml:lang="en">Communication</title>
<title xml:lang="vi">Liên lạc</title>
<title xml:lang="zh-TW">交流</title>
<description xml:lang="ko">회원들간의 쪽지, 친구기능을 담당하는 모듈입니다.</description>
<description xml:lang="jp">会員間にメッセージや友達管理などコミュニティ機能を提供します。</description>
<description xml:lang="zh-CN">管理在线会员间短信息及好友功能的模块。</description>
<description xml:lang="en">This module is for managing message, friend functions.</description>
<description xml:lang="vi">Module quản lý tin nhắn và bạn bè.</description>
<description xml:lang="zh-TW">管理線上會員間短訊及好友功能的模組。</description>
<version>0.1</version>
<date>2008-05-30</date>
@ -16,6 +18,7 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>

View file

@ -1,12 +1,12 @@
<?php
/**
* @file ko.lang.php
* @file modules/communication/lang/ko.lang.php
* @author zero (zero@nzeo.com)
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
$lang->communication = '커뮤니케이션';
$lang->about_communication = '회원간의 쪽지나 친구 관리등 커뮤니케이션 기능을 수행하는 모듈입니다';
$lang->about_communication = '회원 간의 쪽지나 친구 관리 등 커뮤니케이션 기능을 수행하는 모듈입니다.';
$lang->allow_message = '쪽지 수신 허용';
$lang->allow_message_type = array(
@ -21,7 +21,7 @@
'T' => '보관함',
);
$lang->readed_date = '읽은 시간';
$lang->readed_date = '읽은 시간';
$lang->sender = '보낸이';
$lang->receiver = '받는이';
@ -37,12 +37,12 @@
$lang->cmd_add_friend_group = '친구 그룹 추가';
$lang->cmd_rename_friend_group = '친구 그룹 이름 변경';
$lang->msg_no_message = '쪽지가 없습니다';
$lang->message_received = '쪽지가 왔습니다';
$lang->msg_no_message = '쪽지가 없습니다.';
$lang->message_received = '쪽지가 왔습니다.';
$lang->msg_title_is_null = '쪽지 제목을 입력해주세요';
$lang->msg_content_is_null = '내용을 입력해주세요';
$lang->msg_allow_message_to_friend = '친구에게만 쪽지 수신을 허용한 사용자라서 쪽지 발송을 하지 못했습니다';
$lang->msg_disallow_message = '쪽지 수신을 거부한 사용자라서 쪽지 발송을 하지 못했습니다';
$lang->about_allow_message = '쪽지 수신 여부를 결정할 수 있습니다';
$lang->msg_title_is_null = '쪽지 제목을 입력해주세요.';
$lang->msg_content_is_null = '내용을 입력해주세요.';
$lang->msg_allow_message_to_friend = '친구에게만 쪽지 발송을 허용한 사용자라서 쪽지 발송을 하지 못했습니다.';
$lang->msg_disallow_message = '쪽지 수신을 거부한 사용자라서 쪽지 발송을 하지 못했습니다.';
$lang->about_allow_message = '쪽지 수신 여부를 결정할 수 있습니다.';
?>

View file

@ -0,0 +1,50 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->communication = 'Thông báo';
$lang->about_communication = 'Module này thực hiện chức năng giao tiếp, tin nhắn hay bạn bè.';
$lang->allow_message = 'Nhận tin nhắn';
$lang->allow_message_type = array(
'Y' => 'Nhận tất cả',
'N' => 'Từ chối tất cả',
'F' => 'Chỉ bạn bè',
);
$lang->message_box = array(
'R' => 'Đã nhận',
'S' => 'Gửi',
'T' => 'Hòm thư',
);
$lang->readed_date = "Ngày đọc";
$lang->sender = 'Người gửi';
$lang->receiver = 'Người nhận';
$lang->friend_group = 'Nhóm bạn';
$lang->default_friend_group = 'Nhóm mặc định';
$lang->cmd_send_message = 'Gửi tin nhắn';
$lang->cmd_reply_message = 'Trả lời tin nhắn';
$lang->cmd_view_friend = 'Bạn bè';
$lang->cmd_add_friend = 'Thêm bạn';
$lang->cmd_view_message_box = 'Hộp tin nhắn';
$lang->cmd_store = "Lưu";
$lang->cmd_add_friend_group = 'Thêm nhóm bạn';
$lang->cmd_rename_friend_group = 'Sử tên nhóm';
$lang->msg_no_message = 'Không có tin nhắn nào.';
$lang->message_received = 'Bạn có tin nhắn mới.';
$lang->msg_title_is_null = 'Xin vui lòng nhập tiêu đề của tin nhắn.';
$lang->msg_content_is_null = 'Xin vui lòng nhập nội dung.';
$lang->msg_allow_message_to_friend = "Không thể gửi vì người nhận chỉ chấp nhận những tin nhắn từ bạn bè của họ.";
$lang->msg_disallow_message = 'Không thể gửi vì người nhận đã từ chối nhận tin nhắn.';
$lang->about_allow_message = 'Bạn có thể đồng ý nhận tin nhắn.';
?>

View file

@ -44,7 +44,7 @@
<tr>
<th class="button">
<!--@if($message->message_type != "S" && $message->member_srl != $logged_info->member_srl)-->
<a href="#" onclick="doSendMessage('{$message->sender_srl}','{$message->message_srl}');return false;" class="button black strong"><span>{$lang->cmd_reply}</span></a>
<a href="#" onclick="doSendMessage('{$message->sender_srl}','{$message->message_srl}');return false;" class="button black strong"><span>{$lang->cmd_reply_message}</span></a>
<!--@end-->
<!--@if($message->message_type == "R")-->
<a href="#" onclick="doStoreMessage('{$message->message_srl}');return false;" class="button green"><span>{$lang->cmd_store}</span></a>

View file

@ -4,6 +4,7 @@
<title xml:lang="zh-CN">默认皮肤</title>
<title xml:lang="jp">基本スキン</title>
<title xml:lang="en">Default Skin</title>
<title xml:lang="vi">Skin Mặc định</title>
<title xml:lang="es">Por defecto piel</title>
<title xml:lang="ru">기본 스킨</title>
<title xml:lang="zh-TW">預設面板</title>
@ -23,6 +24,10 @@
Design : Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Chan-Myung Jeong (http://naradesign.net)
</description>
<description xml:lang="vi">
Thiết kế: Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML/CSS : Chan-Myung Jeong (http://naradesign.net)
</description>
<description xml:lang="es">
Diseño: Ki-Jeong Seo (http://blog.naver.com/addcozy)
HTML / CSS: Jeong Chan-Myung (http://naradesign.net)
@ -43,6 +48,7 @@
<name xml:lang="jp">NHN</name>
<name xml:lang="zh-CN">(株)NHN</name>
<name xml:lang="en">NHN Corp</name>
<name xml:lang="vi">NHN Corp</name>
<name xml:lang="es">NHN Corp</name>
<name xml:lang="ru">NHN Корп</name>
<name xml:lang="zh-TW">NHN Corp</name>
@ -54,6 +60,7 @@
<title xml:lang="zh-CN">默认</title>
<title xml:lang="jp">デフォルト</title>
<title xml:lang="en">default</title>
<title xml:lang="vi">Mặc định</title>
<title xml:lang="es">Por defecto</title>
<title xml:lang="ru">умолчанию</title>
<title xml:lang="zh-TW">預設</title>
@ -63,6 +70,7 @@
<title xml:lang="jp">青緑</title>
<title xml:lang="zh-CN">青绿色</title>
<title xml:lang="en">cyan</title>
<title xml:lang="vi">Cyan</title>
<title xml:lang="es">Cian</title>
<title xml:lang="ru">бирюзовый</title>
<title xml:lang="zh-TW">青綠色</title>
@ -72,6 +80,7 @@
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">绿色</title>
<title xml:lang="en">green</title>
<title xml:lang="vi">Green</title>
<title xml:lang="es">Verde</title>
<title xml:lang="ru">зеленый</title>
<title xml:lang="zh-TW">綠色</title>
@ -81,6 +90,7 @@
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">红色</title>
<title xml:lang="en">red</title>
<title xml:lang="vi">Red</title>
<title xml:lang="es">Roja</title>
<title xml:lang="ru">красный</title>
<title xml:lang="zh-TW">紅色</title>
@ -90,6 +100,7 @@
<title xml:lang="jp"></title>
<title xml:lang="zh-CN">紫色</title>
<title xml:lang="en">purple</title>
<title xml:lang="vi">Purple</title>
<title xml:lang="es">Púrpura</title>
<title xml:lang="ru">Лиловый</title>
<title xml:lang="zh-TW">紫色</title>
@ -98,6 +109,7 @@
<title xml:lang="ko">검은색</title>
<title xml:lang="jp"></title>
<title xml:lang="en">Black</title>
<title xml:lang="vi">Black</title>
<title xml:lang="ru">Черного</title>
<title xml:lang="es">Negro</title>
<title xml:lang="zh-CN">黑色</title>

View file

@ -3,6 +3,7 @@
<title xml:lang="ko">접속통계</title>
<title xml:lang="zh-CN">访问统计</title>
<title xml:lang="en">Counter</title>
<title xml:lang="vi">Counter</title>
<title xml:lang="es">Contador</title>
<title xml:lang="jp">アクセスカウンター</title>
<title xml:lang="ru">Базовый счетчик</title>
@ -10,6 +11,7 @@
<description xml:lang="ko">기본 접속 통계 프로그램입니다.</description>
<description xml:lang="zh-CN">默认访问统计程序。</description>
<description xml:lang="en">Basic connection statistics program.</description>
<description xml:lang="vi">Chương trình thống kê kết nối cơ bản.</description>
<description xml:lang="es">Programa básico para la estadística de la conección.</description>
<description xml:lang="jp">デフォルトアクセス統計のプログラムです。</description>
<description xml:lang="ru">Базовая программа статистики подключений.</description>
@ -23,6 +25,7 @@
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="zh-TW">zero</name>

View file

@ -26,10 +26,16 @@
* @brief 설치가 이상이 없는지 체크하는 method
**/
function checkUpdate() {
$db_info = Context::getDbInfo ();
// 카운터에 site_srl추가
$oDB = &DB::getInstance();
if(!$oDB->isColumnExists('counter_log', 'site_srl')) return true;
if(!$oDB->isIndexExists('counter_log','idx_site_counter_log')) return true;
if ($db_info->db_type == 'cubrid') {
if(!$oDB->isIndexExists('counter_log', $oDB->prefix.'counter_log_idx_site_counter_log')) return true;
}
else {
if(!$oDB->isIndexExists('counter_log','idx_site_counter_log')) return true;
}
return false;
}
@ -37,12 +43,19 @@
* @brief 업데이트 실행
**/
function moduleUpdate() {
$db_info = Context::getDBInfo ();
// 카운터에 site_srl추가
$oDB = &DB::getInstance();
if(!$oDB->isColumnExists('counter_log', 'site_srl'))
$oDB->addColumn('counter_log','site_srl','number',11,0,true);
if(!$oDB->isIndexExists('counter_log','idx_site_counter_log'))
$oDB->addIndex('counter_log','idx_site_counter_log',array('site_srl','ipaddress'),false);
if ($db_info->db_type == 'cubrid') {
if(!$oDB->isIndexExists('counter_log',$oDB->prefix.'counter_log_idx_site_counter_log'))
$oDB->addIndex('counter_log',$oDB->prefix.'counter_log_idx_site_counter_log',array('site_srl','ipaddress'),false);
}
else {
if(!$oDB->isIndexExists('counter_log','idx_site_counter_log'))
$oDB->addIndex('counter_log','idx_site_counter_log',array('site_srl','ipaddress'),false);
}
return new Object(0, 'success_updated');
}

View file

@ -54,7 +54,7 @@
**/
function insertLog($site_srl=0) {
$args->regdate = date("YmdHis");
$args->user_agent = $_SERVER['HTTP_USER_AGENT'];
$args->user_agent = substr ($_SERVER['HTTP_USER_AGENT'], 0, 250);
$args->site_srl = $site_srl;
return executeQuery('counter.insertCounterLog', $args);
}

View file

@ -11,7 +11,7 @@
'hour' => '시간대별',
'day' => '일별',
'month' => '월별',
'year' => '도별',
'year' => '도별',
);
$lang->total_counter = '전체현황';

View file

@ -0,0 +1,27 @@
<?php
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
░░ * @Website: http://vietxe.net ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
$lang->counter = "Lượt truy cập";
$lang->cmd_select_date = 'Chọn ngày';
$lang->cmd_select_counter_type = array(
'hour' => 'Theo giờ',
'day' => 'Theo ngày',
'month' => 'Theo tháng',
'year' => 'Theo năm',
);
$lang->total_counter = 'Tổng số lượt truy cập';
$lang->selected_day_counter = 'Số truy cập trong ngày';
$lang->unique_visitor = 'Số lượt xem';
$lang->pageview = 'Số trang';
$lang->today = 'Hôm nay';
$lang->yesterday = 'Hôm qua';
?>

View file

@ -33,6 +33,8 @@
(function($){
$(function(){
var option = {
changeMonth: true,
changeYear: true,
gotoCurrent: false
,yearRange:'-100:+10'
,showOn:"button"

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