mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-23 21:29:58 +09:00
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:
commit
30e1f57f30
1012 changed files with 8763 additions and 118447 deletions
12
addons/autolink/autolink.addon.php
Normal file
12
addons/autolink/autolink.addon.php
Normal 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');
|
||||
}
|
||||
?>
|
||||
36
addons/autolink/autolink.js
Normal file
36
addons/autolink/autolink.js
Normal 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, '<');
|
||||
content = content.replace(/>/g, '>');
|
||||
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);
|
||||
});
|
||||
});
|
||||
53
addons/autolink/conf/info.xml
Normal file
53
addons/autolink/conf/info.xml
Normal 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>
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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'];
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
} );
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
23
addons/captcha/lang/vi.lang.php
Normal file
23
addons/captcha/lang/vi.lang.php
Normal 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",
|
||||
);
|
||||
?>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
11
addons/member_communication/lang/vi.lang.php
Normal file
11
addons/member_communication/lang/vi.lang.php
Normal 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?';
|
||||
?>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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編碼。
|
||||
當您輸入所想要的編碼時,行動工具將會正確的顯示。
|
||||
|
|
|
|||
18
addons/mobile/lang/vi.lang.php
Normal file
18
addons/mobile/lang/vi.lang.php
Normal 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';
|
||||
?>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 > 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 > 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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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;
|
||||
}
|
||||
?>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
?>
|
||||
?>
|
||||
|
|
@ -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;"/>');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 데이터로 컨텐츠 생성
|
||||
|
|
|
|||
|
|
@ -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".
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
128
classes/file/FileObject.class.php
Normal file
128
classes/file/FileObject.class.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @class Handler
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief (*)Handler 클래스의 추상화 클래스
|
||||
* @brief an abstract class of (*)Handler
|
||||
**/
|
||||
|
||||
class Handler {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
// 권한 체크
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
/**
|
||||
* 캐시 타임을 제대로 이용하기 위한 헤더 파일 구함
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -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>");
|
||||
}
|
||||
);
|
||||
});
|
||||
|
|
|
|||
BIN
common/js/plugins/ui.calendar/img/buttonPaginateDuble.gif
Normal file
BIN
common/js/plugins/ui.calendar/img/buttonPaginateDuble.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 497 B |
|
|
@ -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;}
|
||||
|
|
|
|||
|
|
@ -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>\
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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 = '通報しました。';
|
||||
|
|
|
|||
|
|
@ -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의 형식이 잘못되었습니다. 숫자로만 입력하셔야 합니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -6,3 +6,4 @@ es,Español
|
|||
ru,Русский
|
||||
fr,Français
|
||||
zh-TW,中文(臺灣)
|
||||
vi,Tiếng Việt
|
||||
|
|
|
|||
|
|
@ -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
302
common/lang/vi.lang.php
Normal 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 có 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 có 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ố";
|
||||
?>
|
||||
|
|
@ -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 = '举报成功!';
|
||||
|
|
|
|||
|
|
@ -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 = '不能刪除有回覆的評論!';
|
||||
|
||||
|
|
|
|||
|
|
@ -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
26
common/tpl/redirect.html
Normal 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>
|
||||
|
|
@ -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';
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
110
libs/FirePHPCore/CHANGELOG
Normal 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
12
libs/FirePHPCore/CREDITS
Normal 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
|
|
@ -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
32
libs/FirePHPCore/README
Normal 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
261
libs/FirePHPCore/fb.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 하시는 것만으로도 사이트 운영에 유용한 기능을 연동할 수 있습니다.';
|
||||
?>
|
||||
|
|
|
|||
19
modules/addon/lang/vi.lang.php
Normal file
19
modules/addon/lang/vi.lang.php
Normal 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.';
|
||||
?>
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -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/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
83
modules/admin/lang/vi.lang.php
Normal file
83
modules/admin/lang/vi.lang.php
Normal 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.';
|
||||
?>
|
||||
|
|
@ -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-->> {$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>
|
||||
|
|
|
|||
|
|
@ -49,3 +49,4 @@ jQuery(function(){
|
|||
function doAdminLogout() {
|
||||
exec_xml('admin','procAdminLogout',new Array(), function() { location.reload(); });
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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'));
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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' => '최근수정일 ',
|
||||
|
|
|
|||
33
modules/comment/lang/vi.lang.php
Normal file
33
modules/comment/lang/vi.lang.php
Normal 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',
|
||||
);
|
||||
?>
|
||||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 = '쪽지 수신 여부를 결정할 수 있습니다.';
|
||||
?>
|
||||
|
|
|
|||
50
modules/communication/lang/vi.lang.php
Normal file
50
modules/communication/lang/vi.lang.php
Normal 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.';
|
||||
?>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
'hour' => '시간대별',
|
||||
'day' => '일별',
|
||||
'month' => '월별',
|
||||
'year' => '년도별',
|
||||
'year' => '연도별',
|
||||
);
|
||||
|
||||
$lang->total_counter = '전체현황';
|
||||
|
|
|
|||
27
modules/counter/lang/vi.lang.php
Normal file
27
modules/counter/lang/vi.lang.php
Normal 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';
|
||||
?>
|
||||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue