copy 1.3.1 to trunk

git-svn-id: http://xe-core.googlecode.com/svn/trunk@6989 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
haneul 2009-11-25 10:42:58 +00:00
commit f1951a6f0e
92 changed files with 3693 additions and 373 deletions

View file

@ -31,6 +31,7 @@
},
API_AUTOLINK : function(oSender, params) {
var textNode = params[0];
if(!$(textNode).parent().length || $(textNode).parent().get(0).nodeName.toLowerCase() == 'a') return;
var content = textNode.nodeValue;
var dummy = $('<span>');
@ -44,20 +45,31 @@
},
extractTargets : function(obj) {
var thisPlugin = this;
var wrap = $('.xe_content', obj);
if(wrap.length) {
this.extractTargets(wrap);
return;
}
$(obj)
.contents()
.each(function(){
var node_name = this.nodeName.toLowerCase();
if($.inArray(node_name, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style', 'iframe', 'button', 'img', 'embed', 'object', 'ins']) != -1) return;
// FIX ME : When this meanless code wasn't executed, url_regex do not run correctly. why?
url_regex.exec('');
if (!$(this).is('a,pre,xml,code,script,style,:input')) {
if (this.nodeType == 3 && url_regex.test(this.nodeValue)) { // text node
thisPlugin.targets.push(this);
} else {
thisPlugin.extractTargets(this);
}
if(this.nodeType == 3) { // text node
var content = this.nodeValue;
if(content.length < 5) return;
if(!/(http|https|ftp|news|telnet|irc):\/\//i.test(content)) return;
thisPlugin.targets.push(this);
} else {
thisPlugin.extractTargets(this);
}
});
}

View file

@ -18,7 +18,7 @@
if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return;
if($addon_info->target != 'all' && Context::get('is_logged')) return;
$target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory');
$target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory','procTextyleInsertComment');
if($addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount';
if($addon_info->apply_resend_auth_mail=='apply') $target_acts[] = 'procMemberResendAuthMail';
@ -102,7 +102,6 @@
exit();
}
Context::addJsFile('./addons/captcha/captcha.js',false);
// 게시판/ 이슈트래커의 글쓰기/댓글쓰기 액션 호출시 세션 비교

View file

@ -25,7 +25,7 @@ var calledArgs = null;
});
$('<div id="captchaBox" style="display:none;*zoom:1;overflow:hidden;height:200px;">'+
'<img src="" id="captcha_image" />'+
'<img src="about:blank" id="captcha_image" />'+
'<p style="color:#666;width:250px;padding:0;margin:10px 0 20px 0; " id="captchaAbout">&nbsp;</p>'+
'<p style="color:#DDD;width:250px;font-size:15px;padding:0; margin:0 0 10px; font-weight:bold; text-align:center;" id="captchaText">&nbsp;</p>'+
'</div>').appendTo(captchaXE);

View file

@ -34,130 +34,130 @@
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">zero</name>
<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="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="zh-CN">应用对象</title>
<title xml:lang="jp">Captchaを表示する対象</title>
<title xml:lang="zh-TW">選擇目標</title>
<title xml:lang="zh-CN">应用对象</title>
<title xml:lang="jp">Captchaを表示する対象</title>
<title xml:lang="zh-TW">選擇目標</title>
<title xml:lang="en">Captcha Target</title>
<title xml:lang="vi">Mục tiêu Captcha hiển thị</title>
<description xml:lang="ko">글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다</description>
<description xml:lang="zh-CN">可以指定验证码应用对象(管理员除外)。</description>
<description xml:lang="jp">管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。</description>
<description xml:lang="zh-TW">除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。</description>
<description xml:lang="zh-CN">可以指定验证码应用对象(管理员除外)。</description>
<description xml:lang="jp">管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。</description>
<description xml:lang="zh-TW">除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。</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>
<options value="">
<title xml:lang="ko">로그인하지 않은 사용자</title>
<title xml:lang="zh-CN">非登录用户</title>
<title xml:lang="jp">ログインしてないユーザー</title>
<title xml:lang="zh-TW">非用戶</title>
<title xml:lang="zh-CN">非登录用户</title>
<title xml:lang="jp">ログインしてないユーザー</title>
<title xml:lang="zh-TW">非用戶</title>
<title xml:lang="en">Not logged-in users</title>
<title xml:lang="vi">Người dùng chưa đăng nhập</title>
</options>
<options value="all">
<title xml:lang="ko">모든 사용자</title>
<title xml:lang="zh-CN">所有用户</title>
<title xml:lang="jp">すべてのユーザー</title>
<title xml:lang="zh-TW">所有用戶</title>
<title xml:lang="zh-CN">所有用户</title>
<title xml:lang="jp">すべてのユーザー</title>
<title xml:lang="zh-TW">所有用戶</title>
<title xml:lang="en">All users</title>
<title xml:lang="vi">Tất cả mọi người</title>
</options>
</var>
<var name="act_type" type="select">
<title xml:lang="ko">동작 방식</title>
<title xml:lang="zh-CN">验证方式</title>
<title xml:lang="jp">動作方式</title>
<title xml:lang="zh-TW">行為模式</title>
<title xml:lang="zh-CN">验证方式</title>
<title xml:lang="jp">動作方式</title>
<title xml:lang="zh-TW">行為模式</title>
<title xml:lang="en">How it works</title>
<title xml:lang="vi">Sử dụng</title>
<description xml:lang="ko">"1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다</description>
<description xml:lang="zh-CN">"一次"就是每个IP只出现一次验证。</description>
<description xml:lang="jp">「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。</description>
<description xml:lang="zh-TW">選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。</description>
<description xml:lang="zh-CN">"一次"就是每个IP只出现一次验证。</description>
<description xml:lang="jp">「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。</description>
<description xml:lang="zh-TW">選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。</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>
<options value="onetime">
<title xml:lang="ko">1번만 동작</title>
<title xml:lang="zh-CN">一次</title>
<title xml:lang="jp">1回だけ表示</title>
<title xml:lang="zh-TW">單次</title>
<title xml:lang="zh-CN">一次</title>
<title xml:lang="jp">1回だけ表示</title>
<title xml:lang="zh-TW">單次</title>
<title xml:lang="vi">Chỉ một lần</title>
<title xml:lang="en">once</title>
</options>
<options value="everytime">
<title xml:lang="ko">매번 동작</title>
<title xml:lang="zh-CN">每次</title>
<title xml:lang="jp">毎回表示</title>
<title xml:lang="zh-TW">每次</title>
<title xml:lang="zh-CN">每次</title>
<title xml:lang="jp">毎回表示</title>
<title xml:lang="zh-TW">每次</title>
<title xml:lang="en">every time</title>
<title xml:lang="vi">Luôn sử dụng</title>
</options>
</var>
<var name="apply_find_account" type="select">
<title xml:lang="ko">비밀번호 찾기 적용</title>
<title xml:lang="zh-CN">应用到查找密码功能</title>
<title xml:lang="jp">비밀번호 찾기 적용</title>
<title xml:lang="zh-TW">비밀번호 찾기 적용</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>
<description xml:lang="ko">적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-CN">启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。</description>
<description xml:lang="jp">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</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>
<title xml:lang="ko">비밀번호 찾기 적용</title>
<title xml:lang="zh-CN">应用到查找密码功能</title>
<title xml:lang="jp">비밀번호 찾기 적용</title>
<title xml:lang="zh-TW">비밀번호 찾기 적용</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>
<description xml:lang="ko">적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-CN">启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。</description>
<description xml:lang="jp">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</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>
<options value="">
<title xml:lang="ko">적용하지 않음</title>
<title xml:lang="zh-CN">不启用</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
<title xml:lang="zh-CN">不启用</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
<title xml:lang="en">Not apply</title>
<title xml:lang="vi">Không áp dụng</title>
</options>
<options value="apply">
<title xml:lang="ko">적용</title>
<title xml:lang="zh-CN">启用</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>
<title xml:lang="zh-CN">启用</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>
<title xml:lang="en">Apply</title>
<title xml:lang="vi">Áp dụng</title>
</options>
</var>
<var name="apply_resend_auth_mail" type="select">
<title xml:lang="ko">인증 메일 재발송 적용</title>
<title xml:lang="zh-CN">应用到认证邮件重新发送功能</title>
<title xml:lang="jp">인증 메일 재발송 적용</title>
<title xml:lang="zh-TW">인증 메일 재발송 적용</title>
<title xml:lang="zh-CN">应用到认证邮件重新发送功能</title>
<title xml:lang="jp">인증 메일 재발송 적용</title>
<title xml:lang="zh-TW">인증 메일 재발송 적용</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>
<description xml:lang="ko">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-CN">启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。</description>
<description xml:lang="jp">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-CN">启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。</description>
<description xml:lang="jp">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</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>
<options value="">
<title xml:lang="ko">적용하지 않음</title>
<title xml:lang="zh-CN">不启用</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
<title xml:lang="zh-CN">不启用</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
<title xml:lang="en">Not apply</title>
<title xml:lang="vi">Không áp dụng</title>
</options>
<options value="apply">
<title xml:lang="ko">적용</title>
<title xml:lang="zh-CN">启用</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>
<title xml:lang="zh-CN">启用</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>
<title xml:lang="en">Apply</title>
<title xml:lang="vi">Áp dụng</title>
</options>

View file

@ -121,11 +121,14 @@ function getScreen() {
prevbtn.css("visibility", (this.index>0)?"visible":"hidden");
nextbtn.css("visibility", (this.index<this.list.size()-1)?"visible":"hidden");
imgframe.attr("src", this.list.eq(this.index).attr("src"))
.css({
left : Math.round( Math.max( (clientWidth-imgframe.width()-14)/2, 0 ) ) + "px",
top : Math.round( Math.max( (clientHeight-imgframe.height()-14)/2, 0 ) ) + "px"
});
//textyle 이미지 리사이즈 처리
var src = this.list.eq(this.index).attr("rawsrc");
if(!src) src = this.list.eq(this.index).attr("src");
imgframe.attr("src", src).css({
left : Math.round( Math.max( (clientWidth-imgframe.width()-14)/2, 0 ) ) + "px",
top : Math.round( Math.max( (clientHeight-imgframe.height()-14)/2, 0 ) ) + "px"
});
};
// 스크린을 닫는 상황

View file

@ -11,7 +11,12 @@
var $content = null;
function isFromSmartPhone() {
return Context::get('smartphone') || preg_match('/(iPod|iPhone|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']);
if(Context::get('full_browse') || $_COOKIE["FullBrowse"])
{
return false;
}
return Context::get('smartphone') || preg_match('/(iPod|iPhone|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']);
}
function haveSmartphoneModule($module) {

View file

@ -19,7 +19,7 @@
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 瀏覽時會以最適當的畫面顯示。
用iPhone(touch)和智慧型手機瀏覽時會以最適當的畫面顯示。
</description>
<description xml:lang="jp">
IPhone(touch)など、スマートフォンからアクセスした時、最適化されたインターフェースで表示させます。
@ -29,7 +29,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="zh-CN">haneul</name>
<name xml:lang="zh-CN">haneul</name>
<name xml:lang="vi">haneul</name>
<name xml:lang="zh-TW">haneul</name>
<name xml:lang="jp">haneul</name>

View file

@ -3,7 +3,16 @@
if(Context::get('module')=='admin') return;
require_once(_XE_PATH_.'addons/smartphone/classes/smartphone.class.php');
if($called_position == "before_module_init")
{
require(_XE_PATH_.'addons/smartphone/classes/smartphone.class.php');
if(Context::get('full_browse'))
{
setcookie("FullBrowse", 1);
}
}
if(!smartphoneXE::isFromSmartPhone()) return;
if($called_position == 'after_module_proc' ) {

View file

@ -10,6 +10,7 @@
</div>
<div class="smartPhoneToolBar">
<div class="buttons">
<!--@if($parent_url)-->
<a href="{$parent_url}"><img src="./images/btnTop.png" class="smartPhoneBtn" alt="Top" /></a>
<!--@end-->
@ -18,4 +19,8 @@
<!--@if($next_url)--><a href="{$next_url}"><img src="./images/btnNext.png" class="smartPhoneBtn" alt="Next" /></a><!--@end-->
<a href="#" onclick="showXEMenu();"><img src="./images/btnMenu.png" class="smartPhoneBtn" alt="Menu" /></a>
</div>
<div class="rightbuttons">
<a href="#" onclick="setFullBrowse();" class="button blue"><span>PC Version</span></a>
</div>
</div>

View file

@ -22,6 +22,16 @@ body {
-webkit-box-sizing: border-box;
}
.smartPhoneToolBar .buttons
{
float: left;
}
.smartPhoneToolBar .rightbuttons
{
float: right; margin-right:5px; margin-top:5px;
}
.smartPhoneTitleBar h1 {
white-space:nowrap;
overflow: hidden;
@ -187,3 +197,4 @@ body {
letter-spacing:0px;
}

View file

@ -1,5 +1,9 @@
var xeSmartMenu = null;
var xeSmartUpperMenu = null;
function setFullBrowse() {
location.href = current_url.setQuery('full_browse',1);
}
function showXEMenu() {
if(!xeSmartMenu) {

View file

@ -584,28 +584,28 @@
foreach($output->columns as $key => $val) {
$name = $val['name'];
$click_count = '%s';
if($val['click_count'] && count($output->conditions)>0){
$click_count = 'incr(%s)';
}
$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) {
$name = sprintf($click_count,$name);
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);
$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) : '');
$column_list[] = sprintf($click_count,sprintf('%s.%s', $prefix, $name)) . ($alias ? sprintf(' as %s',$alias) : '');
} else {
$column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : '');
$column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : '');
}
}
}

View file

@ -73,15 +73,15 @@
// db 정보가 없으면 무시
if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return;
// 접속시도
// 접속시도
if($this->port){
$this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database, $this->port);
$this->fd = @mysqli_connect($this->hostname, $this->userid, $this->password, $this->database, $this->port);
}else{
$this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database);
$this->fd = @mysqli_connect($this->hostname, $this->userid, $this->password, $this->database);
}
$error = mysqli_connect_errno();
if($error) {
$this->setError($error);
$this->setError($error,mysqli_connect_error());
return;
}
mysqli_set_charset($this->fd,'utf8');
@ -421,22 +421,20 @@
$table_list[] = '`'.$this->prefix.$val.'`';
}
// 컬럼 정리
// 컬럼 정리
foreach($output->columns as $key => $val) {
$name = $val['name'];
$value = $val['value'];
$value_list = array();
if($output->column_type[$name]!='number') {
$value = "'".$this->addQuotes($value)."'";
if(!$value) $value = 'null';
} elseif(!$value || is_numeric($value)) $value = (int)$value;
$column_list[] = '`'.$name.'`';
$value_list[] = $value;
}
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
$query = sprintf("insert into %s (%s) values (%s)", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
return $this->_query($query);
}
@ -450,7 +448,7 @@
$table_list[] = '`'.$this->prefix.$val.'` as '.$key;
}
// 컬럼 정리
// 컬럼 정리
foreach($output->columns as $key => $val) {
if(!isset($val['value'])) continue;
$name = $val['name'];

View file

@ -62,6 +62,7 @@
* @return none
**/
function copyFile($source, $target, $force='Y'){
setlocale(LC_CTYPE, 'en_US.UTF8', 'ko_KR.UTF8');
$source = FileHandler::getRealPath($source);
$target_dir = FileHandler::getRealPath(dirname($target));
$target = basename($target);

View file

@ -51,7 +51,7 @@
if(!$module_srl) $this->module_srl = (int)Context::get('module_srl');
else $this->module_srl = (int)$module_srl;
$this->entry = Context::get('entry');
$this->entry = Context::convertEncodingStr(Context::get('entry'));
// Validate variables to prevent XSS
if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request"));

View file

@ -0,0 +1,142 @@
/**
* jquery.qtip.debug. The jQuery tooltip plugin debugger
*
* Debug mode logs all tooltip events and error messages to the
* global $.fn.qtip.log object, as well as creates an array of
* references to all tooltips on the page.
*
* If a console is present, such as firebug (http://getfirebug.com),
* Opera's inbuilt Drangonfly, or IE8's internal Web Developer tool,
* errors will be reported to the console based on your set report
* mask, which is explained in details below.
*
*
* Copyright (c) 2009 Craig Thompson
* http://craigsworks.com
*
* Licensed under MIT
* http://www.opensource.org/licenses/mit-license.php
*
* Launch : February 2009
* Version : 1.0.0-rc3
* Released: Friday 27th April, 2009 - 23:30
*/
/* DEBUG MODE - OFF BY DEFAULT - set to true to enable debugging */
$.fn.qtip.debug = true;
if($.fn.qtip.debug)
{
// Create new debug constants
$.fn.qtip.constants =
{
/* Error messages */
NO_TOOLTIP_PRESENT: 'No tooltip is present on the selected element. Cannot proceed with API call.',
TOOLTIP_NOT_RENDERED: 'Tooltip has not yet been rendered! Cannot proceed with API call.',
NO_VALID_CONTENT: 'No valid content was provided in the options. Using blank content.',
TOOLTIP_IS_DISABLED: 'Tooltip is disabled, cannot proceed with API call.',
TOOLTIP_ALREADY_DISABLED: 'Tooltip is already disabled.',
TOOLTIP_ALREADY_ENABLED: 'Tooltip is already enabled.',
CANVAS_VML_NOT_SUPPORTED: 'Niether canvas or VML are supported, corner and tips will not be drawn.',
STYLE_NOT_DEFINED: 'No such style is defined in the global styles object.',
INVALID_AREA_SHAPE: 'The AREA element used as your target has an invalid area shape. Possible values are: rect, circle, poly.',
CANNOT_FOCUS_STATIC: 'Focusing static elements is not possible as they don\'t have z-index properties.',
CANNOT_POSITION_STATIC: 'Positioning static elements is not possible as they don\'t have left or top properties.',
NO_CONTENT_PROVIDED: 'You must specify some content with which to update.',
/* Event messages */
EVENT_RENDERED: '(Event) Tooltip has been rendered.',
EVENT_SHOWN: '(Event) Tooltip has been shown.',
EVENT_HIDDEN: '(Event) Tooltip has been hidden.',
EVENT_FOCUSED: '(Event) Tooltip has been focused.',
EVENT_DISABLED: '(Event) Tooltip has been disabled.',
EVENT_ENABLED: '(Event) Tooltip has been enabled.',
EVENT_DESTROYED: '(Event) Tooltip has been destroyed.',
EVENT_POSITION_UPDATED: '(Event) Tooltip position has been updated.',
EVENT_CONTENT_UPDATED: '(Event) Tooltip contents have been updated.',
EVENT_CONTENT_LOADED: '(Event) Tooltip contents have been loaded from specified URL.',
EVENT_TITLE_UPDATED: '(Event) Tooltip title has been updated.',
EVENT_STYLE_UPDATED: '(Event) Tooltip style has been updated.',
EVENT_WIDTH_UPDATED: '(Event) Tooltip width has been updated.'
};
// Define qTip log object
$.fn.qtip.log = {
/* CONSOLE REPORTING MASK
To use this functionality you need a console installed, such as firebug:
http://getfirebug.com
This mask determines what errors are reported to the console. Possible values are:
7 = Errors, warnings and messages
6 = Errors and warnings
5 = Errors and messages
4 = Errors only
3 = Warnings and messages
2 = Warnings only
1 = Messages only
*/
report: 7,
/* DO NOT ALTER ANYTHING BELOW HERE! */
qtips: [],
messages: [],
errors: [],
/* Error handler function */
error: function(type, message, method)
{
var self = this;
// Format type string
switch(type)
{
case 1:
var typeString = 'info';
var addTo = 'messages';
break;
case 2:
var typeString = 'warn';
var addTo = 'messages';
break;
default: case 4:
var typeString = 'error';
var addTo = 'errors';
break;
}
// Format time
var DateObj = new Date();
var time = DateObj.getHours() + ':' +
DateObj.getMinutes() + ':' +
DateObj.getSeconds();
// Log the error into the log array
$.fn.qtip.log[addTo].push({
time: time,
message: message,
api: self,
callee: self[method] || method || null
});
// If debug mode is enabled, display the error
if($.fn.qtip.log.report & type > 0)
{
var logMessage = 'qTip '
+ ((typeof self.id !== 'undefined') ? '['+self.id+']' : '')
+ ': ' + message;
// Check console is present
if(window.console) window.console[typeString](logMessage);
// Check for Opera Dragonfly
else if($.browser.opera && window.opera.postError) window.opera.postError(logMessage);
}
return self;
}
};
};

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
jquery.qtip.min.js

View file

@ -0,0 +1,61 @@
/**
* @brief Watch Input box
* @author taggon (http://mygony.com)
**/
(function($){
var class_name = '_watch_input';
$.fn.watch_input = function(settings)
{
if (this.length == 0) return false;
if (this.length > 1) {
this.each(function(){ $(this).watch_input(settings) });
return true;
}
if (!$.isFunction(settings.oninput)) return false;
if (this.hasClass(class_name)) return false;
this[0].__wi_oninput = settings.oninput;
this.addClass(class_name).keydown(_onkeydown).focus(_onfocus).blur(_onblur);
return this;
};
var timer = null, val = '', ie=$.browser.msie;
function _onkeydown(event)
{
if ($(this).val() != val) {
val = $(this).val();
this.__wi_oninput();
}
}
function _onfocus(event)
{
var self = $(this);
val = self.val();
if (ie) return true;
(function fn() {
if ( (self.val() != val) && $.isFunction(self[0].__wi_oninput) ) {
val = self.val();
self[0].__wi_oninput();
}
timer = setTimeout(arguments.callee, 100);
})();
}
function _onblur(event)
{
val = '';
if (!ie && timer) {
clearTimeout(timer);
timer = null;
}
}
})(jQuery);

View file

@ -0,0 +1 @@
jquery.watchinput.js

View file

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

313
common/lang/mn.lang.php Normal file
View file

@ -0,0 +1,313 @@
<?php
/**
* @file common/lang/ko.lang.php
* @author zero (zero@nzeo.com)
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
// 기본적으로 사용되는 action 언어
$lang->cmd_write = 'Бичих';
$lang->cmd_reply = 'Хариу';
$lang->cmd_delete = 'Устгах';
$lang->cmd_modify = 'Засах';
$lang->cmd_edit = 'Өөрчлөх';
$lang->cmd_view = 'Харах';
$lang->cmd_view_all = 'Бүгдийг харах';
$lang->cmd_list = 'Жагсаалт';
$lang->cmd_prev = 'Өмнөх';
$lang->cmd_next = 'Дараах';
$lang->cmd_send_trackback = 'Холбоотой бичлэг илгээх';
$lang->cmd_registration = $lang->cmd_submit = 'Оруулах';
$lang->cmd_comment_registration = 'Коммент бичих';
$lang->cmd_insert = 'Нэмэх';
$lang->cmd_save = 'Хадгалах';
$lang->cmd_load = 'Дуудах';
$lang->cmd_input = 'Оруулах';
$lang->cmd_search = 'Хайх';
$lang->cmd_find = 'Хайх';
$lang->cmd_replace = 'Солих';
$lang->cmd_confirm = 'ОК';
$lang->cmd_cancel = 'Устгах';
$lang->cmd_back = 'Буцах';
$lang->cmd_vote = 'Санал болгох';
$lang->cmd_vote_down = 'Санал болгохгүй';
$lang->cmd_declare = 'Мэдээлэх';
$lang->cmd_cancel_declare = 'Мэдэгдлийг устгах';
$lang->cmd_declared_list = 'Мэдээлсэн жагсаалт';
$lang->cmd_copy = 'Хуулах';
$lang->cmd_move = 'Шилжих';
$lang->cmd_move_up = 'Дээш';
$lang->cmd_move_down = 'Доош';
$lang->cmd_add_indent = 'Нэмж оруулах';
$lang->cmd_remove_indent = 'Хасах';
$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_close = 'Хаах';
$lang->cmd_open = 'Нээх';
$lang->cmd_setup = 'Тохируулга';
$lang->cmd_addition_setup = 'Нэмэлт тохируулга';
$lang->cmd_option = 'Опшион';
$lang->cmd_apply = 'Хэрэгжүүлэх';
$lang->cmd_open_calendar = 'Календар сонгох';
$lang->cmd_send = 'Илгээх';
$lang->cmd_print = 'Хэвлэх';
$lang->cmd_scrap = 'Скрап';
$lang->cmd_preview = 'Урьдчилан харах';
$lang->cmd_reset = 'Дахин тохируулах';
$lang->cmd_remake_cache = "cache файл дахин хийх";
$lang->cmd_publish = "Олгох";
$lang->cmd_layout_setup = 'Лэйаут тохируулах';
$lang->cmd_layout_edit = 'Лэйаут өөрчлөх';
$lang->cmd_search_by_ipaddress = 'IP хаягаар хайх';
$lang->cmd_add_ip_to_spamfilter = 'Спэм филтерт IPнэмэх';
$lang->enable = 'Боломжтой';
$lang->disable = 'Боломжгүй';
// 기본 단어
$lang->menu = 'Menu';
$lang->no = 'Дугаар';
$lang->notice = 'Зарлал';
$lang->secret = 'Нууц';
$lang->category = $lang->category_srl = 'Категори';
$lang->none_category = 'Категори байхгүй';
$lang->none_image = 'No image';
$lang->document_srl = 'Баримтын дугаар';
$lang->user_id = 'ID';
$lang->author = 'Бичсэн';
$lang->password = 'Нууц дугаар';
$lang->password1 = 'Нууц дугаар';
$lang->password2 = 'Нууц дугаар шалгах';
$lang->admin_id = 'Хариуцагч ID';
// $lang->writer = 'Бичлэг оруулагч';
$lang->writer = 'Нэр';
$lang->user_name = 'Нэр';
$lang->nick_name = 'Ник';
$lang->email_address = 'Мэйл хаяг';
$lang->homepage = 'Вебхуудас';
$lang->blog = 'Блог';
$lang->birthday = 'Төрсөн өдөр';
$lang->browser_title = 'Browser гарчиг';
$lang->title = 'Гарчиг';
$lang->title_content = 'Гарчиг+ Агуулга';
$lang->topic = 'Сэдэв';
$lang->replies = 'Хариулах';
$lang->content = 'Агуулга';
$lang->document = 'Бичлэг';
$lang->comment = 'Коммент';
$lang->description = 'Тайлбар';
$lang->trackback = 'Холбоотой бичлэг';
$lang->tag = 'tag';
$lang->allow_comment = 'Коммент зөвшөөрнө';
$lang->lock_comment = 'Коммент түгжих';
$lang->allow_trackback = 'Холбоотой бичлэг зөвшөөрнө';
$lang->uploaded_file = 'Файл оруулах';
$lang->grant = 'Эрх';
$lang->target = 'Зорилго';
$lang->total = 'Нийт';
$lang->total_count = 'Нийт тоо';
$lang->ipaddress = 'IP хаяг';
$lang->path = 'Байрлал';
$lang->cart = 'Сонгосон төрөл';
$lang->friend = 'Найз';
$lang->notify = 'Мэдээлэх';
$lang->order_target = 'Цэгцлэх зорилго';
$lang->order_type = 'Цэгцлэх арга';
$lang->order_asc = 'Багаас ихрүү';
$lang->order_desc = 'Ихээс бага руу';
$lang->file = 'file';
$lang->mid = 'Модиул нэр';
$lang->sid = 'Тvр сайтын нэр';
$lang->layout = 'Лэйаут';
$lang->widget = 'Вижет ';
$lang->module = 'Модиул';
$lang->skin = 'Скин';
$lang->colorset = 'Өнгө тохируулах';
$lang->extra_vars = 'Өргөжүүлэх тоо';
$lang->domain = 'Domain';
$lang->url = 'URL';
$lang->document_url = 'Бичлэгийн хаяг';
$lang->trackback_url = 'Холбоотой бичлэгний хаяг';
$lang->blog_name = 'Блог нэр';
$lang->excerpt = 'excerpt';
$lang->document_count = 'Бичлэгийн тоо';
$lang->page_count = 'Хуудасны тоо';
$lang->list_count = 'Жагсаалтын тоо';
$lang->search_list_count = 'Хайлтын жагсаалт';
$lang->readed_count = 'Уншсан';
$lang->voted_count = 'vote';
$lang->comment_count = 'Комментын тоо';
$lang->member_count = 'Гишүүдийн тоо';
$lang->date = 'Date';
$lang->regdate = 'Оруулсан өдөр';
$lang->last_update = 'Сүүлд засварласан өдөр';
$lang->last_post = 'Хамгийн сүүлд оруулсан';
$lang->signup_date = 'Бүртгүүлсэн өдөр';
$lang->last_login = 'Хамгийн сүүлд нэвтэрсэн';
$lang->first_page = 'Эхний хуудас';
$lang->last_page = 'Сүүлчийн хуудас';
$lang->search_target = 'Хайх зорилго';
$lang->search_keyword = 'Хайх үг';
$lang->is_default = 'Үндсэн';
$lang->no_documents = 'Оруулсан бичлэг байхгүй';
$lang->board_manager = 'Board удирдах';
$lang->member_manager = 'Гишүүн удирдах';
$lang->layout_manager = 'Лэйаут удирдах';
$lang->use = 'Хэрэглэх';
$lang->notuse = 'Хэрэглэхгүй';
$lang->not_exists = 'Байхгүй';
$lang->public = 'Нийтийн';
$lang->private = 'Нууцлах';
$lang->unit_sec = 'Секунд';
$lang->unit_min = 'Минут';
$lang->unit_hour = 'Цаг';
$lang->unit_day = 'Өдөр';
$lang->unit_week = 'Долоо хоног';
$lang->unit_month = 'Сар';
$lang->unit_year = 'Жил';
$lang->unit_week = array(
'Monday' => 'Да',
'Tuesday' => 'Мя',
'Wednesday' => 'Лха',
'Thursday' => 'Пv',
'Friday' => 'Ба',
'Saturday' => 'Бя',
'Sunday' => 'Ня',
);
$lang->unit_meridiem = array(
'am' => 'eглee',
'pm' => 'орой',
'AM' => 'eглee',
'PM' => 'орой',
);
$lang->time_gap = array(
'min' => '%d минутын eмнe',
'mins' => '%d минутын eмнe',
'hour' => '%d цагийн eмнe',
'hours' => '%d цагийн eмнe',
);
// 설명 관련
$lang->about_tag = 'tag оруулахдаа таслал ашиглавал давтан оруулж болно';
$lang->about_layout = 'Лэйаут нь модиулын гадаад байдлыг чимж өгнө. Дээрх лэйаут менюнээс удирдаж болно';
// 메세지 관련
$lang->msg_call_server = 'Сервер ачаалж байна. Түр хүлээнэ үү.';
$lang->msg_db_not_setted = 'DB тохируулга хийгдээгүй байна.';
$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 = 'Холболт амжилтгvй боллоо.';
$lang->msg_invalid_format = 'Буруу хэлбэр байна.';
$lang->msg_not_permitted_act = 'Хүсэлт гаргасан үйлдлийг хэрэгжүүлэх эрх байхгүй.';
$lang->msg_module_is_not_exists = 'Хүссэн модиулыг олж чадсангүй';
$lang->msg_module_is_not_standalone = 'Хүсэлт гаргасан модиул нь бие даан хэрэгжих боломжгүй';
$lang->success_registed = 'Бүртгэгдсэн';
$lang->success_declared = 'Мэдээлэгдсэн';
$lang->success_updated = 'Засварлагдсан';
$lang->success_deleted = 'Устгагдсан';
$lang->success_voted = 'Санал болгогдсон';
$lang->success_blamed = 'Санал болгогдоогүй';
$lang->success_moved = 'Шилжсэн';
$lang->success_sended = 'Илгээгдсэн';
$lang->success_reset = 'Reset';
$lang->success_leaved = 'Гишүүнээс гарсан';
$lang->success_saved = 'Хадгалагдсан';
$lang->fail_to_delete = 'Устгалт амжилтгүй боллоо';
$lang->fail_to_move = 'Шилжилт амжилтгүй боллоо';
$lang->failed_voted = 'Санал болгох боломжгүй';
$lang->failed_blamed = 'Санал болгохгүй байх боломжгүй';
$lang->failed_declared = 'Мэдээлэх боломжгүй';
$lang->fail_to_delete_have_children = 'Хариулт бичлэг байгаа тул устгах боломжгүй';
$lang->confirm_submit = 'Оруулах уу?';
$lang->confirm_logout = 'Гарах уу?';
$lang->confirm_vote = 'Санал болгох уу?';
$lang->confirm_delete = 'Устгах уу?';
$lang->confirm_move = 'Шилжих үү?';
$lang->confirm_reset = 'Reset хийх үү?';
$lang->confirm_leave = 'Гишүүнээс гарах уу?';
$lang->column_type = 'Хэлбэр';
$lang->column_type_list['text'] = 'Нэг мөрөөр оруулах (text)';
$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['checkbox'] = 'Олон сонголт хийх (checkbox)';
$lang->column_type_list['select'] = 'Ганц сонголт хийх (select)';
$lang->column_type_list['radio'] = 'Нэг eдeр сонгох(radio)';
$lang->column_type_list['kr_zip'] = 'Солонгос хаяг (zip)';
$lang->column_type_list['date'] = 'Онсар (Жил сар өдөр)';
//$lang->column_type_list['jp_zip'] = '일본주소 (zip)';
$lang->column_name = 'Баганын нэр';
$lang->column_title = 'Баганын гарчиг';
$lang->default_value = 'Үндсэн байдал';
$lang->is_active = 'Идэвхжүүлэх';
$lang->is_required = 'Заавал бөглөх';
$lang->eid = 'eгeдлийн нэр';
// ftp 관련
$lang->ftp_form_title = 'FTP мэдээлэл оруулах';
$lang->ftp = 'FTP';
$lang->ftp_port = 'FTP port';
$lang->cmd_check_ftp_connect = 'FTP холболт шалгах';
$lang->about_ftp_info = "
FTP мэдээлэл нь дараах тохиолдолд хэрэглэгдэх боломжтой.<br />
1. PHP의 safe_mode=Onбайх тохиолдолд , FTP мэдээллийг ашиглан XE-г бvрэн ажиллуулахаар болгож болно.<br />
2. Автомат опдэйт хийх зэрэгт FTP мэдээллийг ашиглаж болно.<br />
Тус FTP мэпээлэл нь files/config/ftp.config.php файл дотор хадгалагдна.<br />
Идэвхжvvлсэний дараа хариуцагчийн хуудаснаас FTP мэдээллийг eeрчлeх болон устгаж болно.<br />
";
$lang->msg_safe_mode_ftp_needed = 'PHP의 safe_mode가 Onбайх тохиолдолд , FTP мэдээллийг заавал оруулснаар XE идэвжvvлэх болон хэрэглэх боломжтой болно.';
$lang->msg_ftp_not_connected = 'localhost-ын FTP холболт амжилтгvй боллоо. FTP дугаараа шалгах буюу эсвэл FTP vйлчилгээг ашиглах боломжтой эсэхээ шалгана уу.';
$lang->msg_ftp_invalid_auth_info = 'Таны оруулсан FTP мэдээллээр нэвтэрч чадсангvй. FTPмэдээллээ шалгана уу.';
$lang->msg_ftp_mkdir_fail = 'FTP-г ашиглан eгсeн eгeгдлийг биелvvлж чадсангvй. FTP серверийн идэвхжvvлэлтээ шалгана уу.';
$lang->msg_ftp_chmod_fail = 'FTP-г ашиглан eeрчлeлтийг хийж чадсангvй. FTP серверийн идэвхжvvлэлтээ шалгана уу.';
$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 Латин vсэг, тоо болон '_'-р оруулж болох бeгeeд эхлэл нь vсэг байх шаардлагатай. ";
$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-ын хэлбэр буруу байна. Зөвхөн тоогоор оруулах ёстой.';
?>

View file

@ -126,7 +126,7 @@
$lang->mid = '模組名稱';
$lang->sid = '網站名稱';
$lang->layout = '版面';
$lang->widget = 'Widget ';
$lang->widget = 'Widget';
$lang->module = '模組';
$lang->skin = '面板';
$lang->colorset = '顏色設定';
@ -297,9 +297,9 @@
$lang->msg_ftp_chmod_fail = '修改資料夾權限失敗。請確認FTP主機設置。';
$lang->msg_ftp_connect_success = 'FTP連線成功。';
$lang->ftp_path_title = 'FTP 경로 정보 입력';
$lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로';
$lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정';
$lang->ftp_path_title = '請輸入FTP路經';
$lang->msg_ftp_installed_realpath = '安裝XE時的絕對路經';
$lang->msg_ftp_installed_ftp_realpath = '請輸入安裝XE時的FTP絕對路經';
// 在xml filter中所使用的JavaScript警告訊息

View file

@ -13,7 +13,7 @@
* @brief XE의 전체 버전 표기
* 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '1.3.0');
define('__ZBXE_VERSION__', '1.3.1');
/**
* @brief zbXE가 설치된 장소의 base path를 구함
@ -46,7 +46,7 @@
* 2 : 소요시간, Request/Response info 출력
* 4 : DB 쿼리 내역 출력
**/
if(!defined('__DEBUG__')) define('__DEBUG__', 0);
if(!defined('__DEBUG__')) define('__DEBUG__', 1);
/**
* @brief 디버그 메세지의 출력 장소
@ -110,7 +110,7 @@
/**
* @brief 간단하게 사용하기 위한 함수 정의한 파일 require
**/
require_once(_XE_PATH_.'config/func.inc.php');
require(_XE_PATH_.'config/func.inc.php');
if(__DEBUG__) define('__StartTime__', getMicroTime());
@ -120,21 +120,21 @@
* @TODO : PHP5 기반으로 바꾸게 되면 _autoload() 이용할 있기에 제거 대상
**/
if(__DEBUG__) define('__ClassLoadStartTime__', getMicroTime());
require_once(_XE_PATH_.'classes/object/Object.class.php');
require_once(_XE_PATH_.'classes/extravar/Extravar.class.php');
require_once(_XE_PATH_.'classes/handler/Handler.class.php');
require_once(_XE_PATH_.'classes/xml/XmlParser.class.php');
require_once(_XE_PATH_.'classes/xml/XmlJsFilter.class.php');
require_once(_XE_PATH_.'classes/context/Context.class.php');
require_once(_XE_PATH_.'classes/db/DB.class.php');
require_once(_XE_PATH_.'classes/file/FileHandler.class.php');
require_once(_XE_PATH_.'classes/widget/WidgetHandler.class.php');
require_once(_XE_PATH_.'classes/editor/EditorHandler.class.php');
require_once(_XE_PATH_.'classes/module/ModuleObject.class.php');
require_once(_XE_PATH_.'classes/module/ModuleHandler.class.php');
require_once(_XE_PATH_.'classes/display/DisplayHandler.class.php');
require_once(_XE_PATH_.'classes/template/TemplateHandler.class.php');
require_once(_XE_PATH_.'classes/mail/Mail.class.php');
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
require(_XE_PATH_.'classes/object/Object.class.php');
require(_XE_PATH_.'classes/extravar/Extravar.class.php');
require(_XE_PATH_.'classes/handler/Handler.class.php');
require(_XE_PATH_.'classes/xml/XmlParser.class.php');
require(_XE_PATH_.'classes/xml/XmlJsFilter.class.php');
require(_XE_PATH_.'classes/context/Context.class.php');
require(_XE_PATH_.'classes/db/DB.class.php');
require(_XE_PATH_.'classes/file/FileHandler.class.php');
require(_XE_PATH_.'classes/widget/WidgetHandler.class.php');
require(_XE_PATH_.'classes/editor/EditorHandler.class.php');
require(_XE_PATH_.'classes/module/ModuleObject.class.php');
require(_XE_PATH_.'classes/module/ModuleHandler.class.php');
require(_XE_PATH_.'classes/display/DisplayHandler.class.php');
require(_XE_PATH_.'classes/template/TemplateHandler.class.php');
require(_XE_PATH_.'classes/mail/Mail.class.php');
require(_XE_PATH_.'classes/page/PageHandler.class.php');
if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
?>

View file

@ -36,7 +36,7 @@
/**
* @brief 필요한 설정 파일들을 include
**/
require_once('./config/config.inc.php');
require('./config/config.inc.php');
/**
* @brief Context 객체를 생성하여 초기화

View file

@ -89,7 +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>
<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>
@ -98,7 +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>
<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>
@ -108,7 +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>
<title xml:lang="vi">Cơ bản</title>
</options>
<options value="black">
<title xml:lang="ko">검은색</title>
@ -119,7 +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>
<title xml:lang="vi">Black</title>
</options>
<options value="white">
<title xml:lang="ko">하얀색</title>
@ -130,7 +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>
<title xml:lang="vi">White</title>
</options>
</var>
<var name="logo_image" type="image">
@ -142,7 +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>
<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>
@ -162,7 +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>
<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>
@ -171,7 +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>
<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>
@ -182,7 +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>
<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>
@ -191,7 +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>
<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>
@ -205,7 +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>
<title xml:lang="vi">Menu trên</title>
</menu>
<menu name="bottom_menu" maxdepth="1">
<title xml:lang="ko">하단 메뉴 </title>
@ -216,7 +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>
<title xml:lang="vi">Menu dưới</title>
</menu>
</menus>
</layout>

View file

@ -0,0 +1,73 @@
<?php
class adminAdminModel extends admin
{
var $pwd;
function getSFTPList()
{
$ftp_info = Context::getFTPInfo();
$connection = ssh2_connect('localhost', $ftp_info->ftp_port);
if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password))
{
return new Object(-1,'msg_ftp_invalid_auth_info');
}
$sftp = ssh2_sftp($connection);
$curpwd = "ssh2.sftp://$sftp".$this->pwd;
$dh = opendir($curpwd);
$list = array();
while(($file = readdir($dh)) !== false) {
if(is_dir($curpwd.$file))
{
$file .= "/";
}
else
{
continue;
}
$list[] = $file;
}
closedir($dh);
$this->add('list', $list);
}
function getAdminFTPList()
{
set_time_limit(5);
require_once(_XE_PATH_.'libs/ftp.class.php');
$ftp_info = Context::getFTPInfo();
$this->pwd = Context::get('pwd');
if($ftp_info->sftp == 'Y')
{
return $this->getSFTPList();
}
$oFtp = new ftp();
if($oFtp->ftp_connect('localhost', $ftp_info->ftp_port)){
if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) {
$_list = $oFtp->ftp_rawlist($this->pwd);
$oFtp->ftp_quit();
}
}
$list = array();
if(count($_list) == 0 || !$_list[0]) {
$oFtp = new ftp();
if($oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)){
if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) {
$_list = $oFtp->ftp_rawlist($this->pwd);
$oFtp->ftp_quit();
}
}
}
if($_list){
foreach($_list as $k => $v){
if(strpos($v,'d') === 0) $list[] = substr(strrchr($v,' '),1) . '/';
}
}
$this->add('list', $list);
}
}
?>

View file

@ -78,6 +78,10 @@
if($db_info->https_port) Context::set('https_port', $db_info->https_port);
Context::setBrowserTitle("XE Admin Page");
// add javascript tooltip plugin - gony
Context::loadJavascriptPlugin('qtip');
Context::loadJavascriptPlugin('watchinput');
}
/**
@ -254,6 +258,8 @@
function dispAdminConfig() {
$db_info = Context::getDBInfo();
Context::set('sftp_support', function_exists(ssh2_sftp));
Context::set('selected_lang', $db_info->lang_type);
Context::set('default_url', $db_info->default_url);
@ -261,43 +267,26 @@
Context::set('langs', Context::loadLangSupported());
Context::set('lang_selected', Context::loadLangSelected());
Context::set('ftp_info', Context::getFTPInfo());
$ftp_info = Context::getFTPInfo();
Context::set('ftp_info', $ftp_info);
$site_args->site_srl = 0;
$output = executeQuery('module.getSiteInfo', $site_args);
Context::set('start_module', $output->data);
$pwd = Context::get('pwd');
if(!$pwd) $pwd = '/';
Context::set('pwd',$pwd);
require_once(_XE_PATH_.'libs/ftp.class.php');
$ftp_info = Context::getFTPInfo();
$oFtp = new ftp();
if($oFtp->ftp_connect('localhost', $ftp_info->ftp_port)){
if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) {
$_list = $oFtp->ftp_rawlist($pwd);
$oFtp->ftp_quit();
}
}
$list = array();
if(count($_list) == 0 || !$_list[0]) {
$oFtp = new ftp();
if($oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)){
if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) {
$_list = $oFtp->ftp_rawlist($pwd);
$oFtp->ftp_quit();
}
}
}
if($_list){
foreach($_list as $k => $v){
if(strpos($v,'d') === 0) $list[] = substr(strrchr($v,' '),1) . '/';
if(!$pwd) {
if($ftp_info->sftp == 'Y')
{
$pwd = _XE_PATH_;
}
else
{
$pwd = '/';
}
}
Context::set('list',$list);
Context::set('pwd',$pwd);
Context::set('layout','none');
$this->setTemplateFile('config');
}

View file

@ -8,5 +8,6 @@
<action name="procAdminRecompileCacheFile" type="controller" standalone="true" />
<action name="procAdminLogout" type="controller" standalone="true" />
<action name="getAdminFTPList" type="model" standalone="true" />
</actions>
</module>

View file

@ -78,4 +78,5 @@
$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 = '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.';
$lang->sftp = "Use SFTP";
?>

View file

@ -80,4 +80,5 @@
$lang->about_server_ports = "80 de HTTP, HTTPS al puerto 443 si se utiliza otro que se especifique lo contrario, el puerto va a necesitar.";
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->sftp = "Use SFTP";
?>

View file

@ -79,4 +79,5 @@
$lang->about_server_ports = "Si l'on ne veut pas utiliser le port 80 pour HTTP mais un autre port, ou bien, si l'on ne veut pas utiliser le port 443 pour HTTPS mais un autre port, on doit déclarer les ports.";
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->sftp = "Use SFTP";
?>

View file

@ -78,4 +78,5 @@
$lang->about_server_ports = '一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。';
$lang->use_db_session = 'DBで認証セッション管理';
$lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。<br />ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。<br />また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。';
$lang->sftp = "Use SFTP";
?>

View file

@ -78,4 +78,5 @@
$lang->about_server_ports = 'HTTP는 80, HTTPS는 443 이 아닌, 다른 포트를 사용할 경우에 포트를 지정해 주어야 합니다.';
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증 시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용률이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다.<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->sftp = 'SFTP 사용';
?>

View file

@ -79,4 +79,5 @@
$lang->about_server_ports = "HTTP는 80, HTTPS는 443이외의 다른 포트를 사용하는 경우에 포트를 지정해주어야합니다.";
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->sftp = "Use SFTP";
?>

View file

@ -80,4 +80,5 @@
$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.';
$lang->sftp = "Use SFTP";
?>

View file

@ -78,4 +78,5 @@
$lang->about_server_ports = "使用除HTTP80, HTTPS443以外的端口时必须得指定该服务器端口号。";
$lang->use_db_session = 'DB储存认证会话';
$lang->about_db_session = '用DB储存认证时的PHP会话。<br/>服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。<br/>只是无法统计在线会员。';
$lang->sftp = "Use SFTP";
?>

View file

@ -35,7 +35,7 @@
$lang->current_version = "安裝版本";
$lang->current_path = "安裝路徑";
$lang->released_version = "最新版本";
$lang->about_download_link = "官方網站已發佈新版本。\n請按[下載]下載最新版本。";
$lang->about_download_link = "官方網站已發佈新版本。\n請按[下載]下載最新版本。";
$lang->item_module = "模組列表";
$lang->item_addon = "元件列表";
@ -79,4 +79,5 @@
$lang->about_server_ports = "HTTP預設埠口是『80』、HTTPS是『443』如果想使用其他的埠口的話請自行設定。";
$lang->use_db_session = 'DB session認證';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->sftp = "使用 SFTP";
?>

View file

@ -26,6 +26,10 @@
<div class="body">
<div class="extension e1">
<div class="section">
<div id="search_nav">
<input type="text" size="12" />
<button type="button"></button>
</div>
<ul class="navigation">
<!--@foreach($lang->module_category_title as $key => $val)-->
<li id="module_{$key}" class="<!--@if($selected_module_category == $key)-->open<!--@end-->"><a href="#" onclick="toggleModuleMenu('{$key}'); return false;">{$val}</a>

View file

@ -6,14 +6,21 @@
<!--%import("./filter/install_ftp_path.xml")-->
<!--%import("../../install/lang")-->
<!--%import("../../install/tpl/js/install_admin.js",optimized=false)-->
<!--%import("./js/config.js")-->
<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+')';
obj.value = decodeURIComponent(browser_title.replace(/\+/g," "))+' ('+mid+')';
}
<!--@if($ftp_info && $ftp_info->ftp_password && $ftp_info->ftp_user)-->
var pwd = '{$pwd}';
params = new Array();
params['pwd'] = pwd;
exec_xml('admin','getAdminFTPList', params, completeGetFtpInfo, new Array('list','error','message'));
<!--@end-->
</script>
<div class="content">
@ -46,7 +53,7 @@
<th scope="row"><div>{$lang->start_module}</div></th>
<td>
<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>
<input type="text" name="_target_module" id="_target_module" class="inputTypeText w300" value="{$start_module->mid} ({htmlspecialchars($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>
@ -120,22 +127,30 @@
</table>
</form>
<h4 class="xeAdmin">{$lang->ftp_form_title}</h4>
<h4 class="xeAdmin" id="ftpSetup">{$lang->ftp_form_title}</h4>
<p class="summary">{$lang->about_ftp_info}</p>
<form action="./" method="post" onsubmit="return procFilter(this, install_ftp_info);" id="ftp_form">
{@ $nCols = 3; }
<table cellspacing="0" class="rowTable">
<tr>
<th><div><label for="textfield21">{$lang->user_id}</label></div></th>
<th><div><label for="textfield22">{$lang->password}</label></div></th>
<th><div><label for="textfield24">{$lang->ftp_port}</label></div></th>
<!--@if($sftp_support)-->
{@ $nCols += 1; }
<th><div><label for="checkbox25">{$lang->sftp}</label></div></th>
<!--@end-->
</tr>
<tr>
<td><input type="text" id="textfield21" name="ftp_user" value="{$ftp_info->ftp_user}" class="inputTypeText" /></td>
<td><input id="textfield22" type="password" name="ftp_password" value="{$ftp_info->ftp_password}" class="inputTypeText" /></td>
<td><input id="textfield24" type="text" name="ftp_port" value="{$ftp_info->ftp_port}" class="inputTypeText" /></td>
<!--@if($sftp_support)-->
<td><input type="checkbox" id="checkbox25" name="sftp" value="Y" <!--@if($ftp_info->sftp=="Y")-->checked="checked"<!--@end--> /></td>
<!--@end-->
</tr>
<tr>
<th colspan="3" class="button">
<th colspan="{$nCols}" class="button">
<span class="button blue"><input type="button" value="{$lang->cmd_check_ftp_connect}" onclick="doCheckFTPInfo(); return false;"/></span>
<span class="button black strong"><input type="submit" value="{$lang->cmd_registration}" /></span>
</th>
@ -143,11 +158,12 @@
</table>
</form>
<!--@if($ftp_info && $ftp_info->ftp_password && $ftp_info->ftp_user)-->
<h4 class="xeAdmin" id="ftp_setup">{$lang->ftp_path_title}</h4>
<h4 class="xeAdmin" id="ftpSetup">{$lang->ftp_path_title}</h4>
<form action="./" method="get" onsubmit="return procFilter(this, install_ftp_path)">
<input type="hidden" name="ftp_user" value="{$ftp_info->ftp_user}" />
<input type="hidden" name="ftp_password" value="{$ftp_info->ftp_password}" />
<input type="hidden" name="ftp_port" value="{$ftp_info->ftp_port}" />
<input type="hidden" name="sftp" value="{$ftp_info->sftp}" />
<table cellspacing="0" class="rowTable">
<tr>
@ -158,20 +174,14 @@
<tr>
<th scope="col" rowspan="2"><div>{$lang->msg_ftp_installed_ftp_realpath}</div></th>
<td>
<input type="text" name="ftp_root_path" value="<!--@if($pwd && $pwd!='/')-->{$pwd}<!--@else-->{$ftp_info->ftp_root_path}<!--@end-->" class="inputTypeText w400" />
<input type="text" name="ftp_root_path" value="<!--@if($pwd)-->{$pwd}<!--@else-->{$ftp_info->ftp_root_path}<!--@end-->" class="inputTypeText w400" />
</td>
</tr>
<tr>
<tr id="ftplist">
<td>
<!--@if($list)-->
<ul>
<!--@foreach($list as $k => $v)-->
<!--@if($v)-->
<li> <a href="{getUrl('pwd',$pwd.$v)}#ftp_setup">{$v}</a></li>
<!--@end-->
<!--@end-->
</ul>
<!--@end-->
<div class="serverresponse">
Waiting to load information
</div>
</td>
</tr>
<tr class="row2">

View file

@ -200,4 +200,15 @@
.adminLeftContent { float:left; width:60%; margin-right:2%; _margin-right:1.9%;}
.adminRightExtra { float:left; width:38%; }
.serverresponse { background: #FFFFFF url(../../../../common/tpl/images/loading.gif) no-repeat scroll 5px 5px; height:30px; padding-left:25px; padding-top:5px; }
#search_nav { border:3px solid #ccc; margin:0 0 5px 0;}
#search_nav input { border:0; height:17px; width:128px; padding:3px 0 0 4px; vertical-align:middle;}
#search_nav button { padding:0; border:0; height:17px; width:17px; background:transparent url(../img/buttonSearch.gif) no-repeat center; vertical-align:middle;}
#search_nav button.close {background:transparent url(../img/buttonClose.gif) no-repeat center;}
.e1 .section ._result{ list-style:none; margin:10px 0 0 0; padding:0;}
.e1 .section ._result li{ margin:0;}
.e1 .section ._result a{ display:block; color:#767676; padding:4px 5px 4px 10px;}
.e1 .section ._result a:hover,
.e1 .section ._result a:active,
.e1 .section ._result a:focus{ background:#f8f8f8;}

View file

@ -3,6 +3,7 @@
<node target="ftp_user" required="true" />
<node target="ftp_password" required="true" />
<node target="ftp_port" required="true" />
<node target="sftp" />
</form>
<response callback_func="completeMessage">
<tag name="error" />

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

View file

@ -31,7 +31,7 @@ function toggleModuleAddon(target) {
}
}
// 언어 목록 toggle
// toggle language list
function toggleAdminLang() {
var obj = xGetElementById("adminLang");
if(!obj) return;
@ -39,14 +39,121 @@ function toggleAdminLang() {
else obj.style.display = 'block';
}
// string to regex(초성검색용)
function str2regex(str) {
// control chars
str = str.replace(/([\[\]\{\}\(\)\*\-\+\!\?\^\|\\])/g, '\\$1');
jQuery(function(){
// find consonants and replace it
str = str.replace(/[ㄱ-ㅎ]/g, function(c){
var c_order = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'.indexOf(c);
var ch_first = String.fromCharCode(0xAC00 + c_order*21*28 + 0 + 0);
var ch_last = String.fromCharCode(0xAC00 + c_order*21*28 + 20*28 + 27);
return '['+ch_first+'-'+ch_last+']';
});
return new RegExp(str, 'ig');
}
jQuery(function($){
// paint table rows
jQuery("table.rowTable tr").attr('class','').filter(":nth-child(even)").attr('class','bg1');
// set menu tooltip - taggon
$('ul.navigation:first > li').each(function(){
var texts = [];
$(this).find('li').each(function(){
texts.push($(this).text());
});
if (!texts.length) return true;
$(this).find('>a').qtip({
content : texts.join(', '),
position : {
corner : {
target:'rightMiddle',
tooltip:'leftMiddle'
},
adjust : {
x : -30
}
},
style : {
name : 'cream',
tip : true,
textAlign : 'center',
padding : 5,
border : {
radius : 2
}
}
});
});
// menu search
var nav = $('#search_nav + ul.navigation');
var inp = $('#search_nav input[type=text]:first');
var btn = $('#search_nav button:first');
var result = $('<ul class="_result" />');
nav.after( result.hide() );
inp.keydown(function(event){
if (event.keyCode == 27) { // ESC
$(this).val('');
if ($.browser.msie) $(this).keypress();
}
})
.watch_input({
oninput : function() {
var str = $.trim( $(this).val() );
if (str.length == 0) {
nav.show();
result.hide();
btn.removeClass('close');
return false;
}
// remove all sub nodes
result.empty();
var regex = str2regex(str);
nav.find('li li > a').each(function(){
var text = $(this).text();
if (regex.exec(text) != null) {
$(this).parent().clone().appendTo(result);
}
// fix regular expression bug
regex.exec('');
});
nav.hide();
result.show();
btn.addClass('close');
}
});
// cancel search
btn.click(function(){
if ($(this).hasClass('close')) {
$(this).removeClass('close');
inp.focus();
inp.val('');
inp.keydown();
}
return false;
});
});
// 로그아웃
// logout
function doAdminLogout() {
exec_xml('admin','procAdminLogout',new Array(), function() { location.reload(); });
}

View file

@ -0,0 +1,35 @@
function completeGetFtpInfo(ret_obj)
{
var e = jQuery("#ftplist").empty();
var list = "";
for(var i=0;i<ret_obj['list']['item'].length;i++)
{
var v = ret_obj['list']['item'][i];
if(v == "../")
{
if(pwd == "/")
{
continue;
}
arr = pwd.split("/");
arr.pop();
arr.pop();
arr.push("");
target = arr.join("/");
list = list + "<li><a href='"+current_url.setQuery('pwd',target)+"#ftpSetup'>"+v+"</a></li>";
}
else if( v == "./")
{
continue;
}
else
{
list = list + "<li><a href='"+current_url.setQuery('pwd',pwd+v)+"#ftpSetup'>"+v+"</a></li>";
}
}
list = "<td><ul>"+list+"</ul></td>";
e.append(jQuery(list));
}

View file

@ -14,11 +14,6 @@
var $url;
var $download_path;
function ModuleInstaller(&$package)
{
$this->package =& $package;
}
function _download()
{
if($this->package->path == ".")
@ -45,11 +40,37 @@
FileHandler::writeFile($this->download_file, $buff);
}
function installModule()
{
$path_array = explode("/", $this->package->path);
$target_name = array_pop($path_array);
$type = substr(array_pop($path_array), 0, -1);
if($type == "module")
{
$oModuleModel = &getModel('module');
$oInstallController = &getController('install');
$module_path = ModuleHandler::getModulePath($target_name);
if($oModuleModel->checkNeedInstall($target_name))
{
$oInstallController->installModule($target_name, $module_path);
}
if($oModuleModel->checkNeedUpdate($target_name))
{
$oModule = &getModule($target_name, 'class');
if(method_exists($oModule, 'moduleUpdate'))
{
$oModule->moduleUpdate();
}
}
}
}
function install()
{
$this->_download();
$file_list = $this->_unPack();
$this->_copyDir($file_list);
$this->installModule();
FileHandler::removeDir($this->temp_dir);
return;
@ -70,6 +91,53 @@
return $file_list;
}
}
class SFTPModuleInstaller extends ModuleInstaller {
function SFTPModuleInstaller(&$package)
{
$this->package =& $package;
}
function _copyDir(&$file_list){
$ftp_info = Context::getFTPInfo();
if(!$ftp_info->ftp_user || !$ftp_info->ftp_password || !$ftp_info->sftp || $ftp_info->sftp != 'Y') return new Object(-1,'msg_ftp_invalid_auth_info');
$connection = ssh2_connect('localhost', $ftp_info->ftp_port);
if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password))
{
return new Object(-1,'msg_ftp_invalid_auth_info');
}
$sftp = ssh2_sftp($connection);
$target_dir = $ftp_info->ftp_root_path.$this->target_path;
foreach($file_list as $k => $file){
$org_file = $file;
if($this->package->path == ".")
{
$file = substr($file,3);
}
$path = FileHandler::getRealPath("./".$this->target_path."/".$file);
$pathname = dirname($target_dir."/".$file);
if(!file_exists(FileHandler::getRealPath($real_path)))
{
ssh2_sftp_mkdir($sftp, $pathname, 0755, true);
}
ssh2_scp_send($connection, FileHandler::getRealPath($this->download_path."/".$org_file), $target_dir."/".$file);
}
}
}
class FTPModuleInstaller extends ModuleInstaller {
function FTPModuleInstaller(&$package)
{
$this->package =& $package;
}
function _copyDir(&$file_list){
$ftp_info = Context::getFTPInfo();
if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_ftp_invalid_auth_info');
@ -83,7 +151,7 @@
return new Object(-1,'msg_ftp_invalid_auth_info');
}
$_list = $oFtp->ftp_rawlist($ftp_config->ftp_root_path);
$_list = $oFtp->ftp_rawlist($ftp_info->ftp_root_path);
if(count($_list) == 0 || !$_list[0]) {
$oFtp->ftp_quit();
$oFtp = new ftp();
@ -94,8 +162,7 @@
}
}
$ftp_config = Context::getFTPInfo();
$target_dir = $ftp_config->ftp_root_path.$this->target_path;
$target_dir = $ftp_info->ftp_root_path.$this->target_path;
foreach($file_list as $k => $file){
$org_file = $file;
@ -107,7 +174,7 @@
$path_list = explode('/', dirname($this->target_path."/".$file));
$real_path = "./";
$ftp_path = $ftp_config->ftp_root_path;
$ftp_path = $ftp_info->ftp_root_path;
for($i=0;$i<count($path_list);$i++)
{
@ -126,7 +193,6 @@
return new Object();
}
}
class autoinstallAdminController extends autoinstall {
@ -236,10 +302,18 @@
$package_srls = Context::get('package_srl');
$oModel =& getModel('autoinstall');
$packages = explode(',', $package_srls);
$ftp_info = Context::getFTPInfo();
foreach($packages as $package_srl)
{
$package = $oModel->getPackage($package_srl);
$oModuleInstaller = new ModuleInstaller($package);
if($ftp_info->sftp && $ftp_info->sftp == 'Y')
{
$oModuleInstaller = new SFTPModuleInstaller($package);
}
else
{
$oModuleInstaller = new FTPModuleInstaller($package);
}
$oModuleInstaller->install();
}
$this->setMessage('success_installed');

View file

@ -97,10 +97,10 @@
}
else {
$package->depends[$key]->installed = true;
$package->depends[$key]->cur_version = $packages[$dep->package_srl]->version;
if(version_compare($dep->version, $packages[$dep->package_srl]->version, ">"))
$package->depends[$key]->cur_version = $packages[$dep->package_srl]->current_version;
if(version_compare($dep->version, $packages[$dep->package_srl]->current_version, ">"))
{
$package->need_update = true;
$package->depends[$key]->need_update = true;
$package->package_srl .= ",". $dep->package_srl;
}
else

View file

@ -3,24 +3,28 @@
<title xml:lang="ko">쉬운 설치</title>
<title xml:lang="en">Easy-Installation</title>
<title xml:lang="vi">Cài đặt tự động</title>
<title xml:lang="zh-TW">自動安裝</title>
<title xml:lang="zh-CN">在线安装</title>
<description xml:lang="ko">관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. </description>
<description xml:lang="en">With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. </description>
<description xml:lang="ko">관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다.</description>
<description xml:lang="en">With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click.</description>
<description xml:lang="vi">Với Module này, bạn có thể cập nhật và cài đặt các phiên bản một cách tự động. Bao gồm Module, Layout, Widget, Addon, ... từ trang chủ XE bằng một bấm chuột.</description>
<description xml:lang="zh-TW">With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click.</description>
<description xml:lang="zh-CN">很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。</description>
<version>0.1</version>
<date>2009-11-11</date>
<category>system</category>
<author email_address="haneul0318@gmail.com" link="http://www.seungyeop.kr">
<name xml:lang="ko">haneul</name>
<name xml:lang="zh-CN">haneul</name>
<name xml:lang="en">haneul</name>
<name xml:lang="vi">haneul</name>
<name xml:lang="zh-TW">haneul</name>
<name xml:lang="zh-CN">haneul</name>
</author>
<author email_address="sol@ngleader.com" link="http://ngleader.com">
<name xml:lang="ko">sol</name>
<name xml:lang="en">sol</name>
<name xml:lang="vi">sol</name>
<name xml:lang="zh-TW">sol</name>
<name xml:lang="zh-CN">sol</name>
</author>
</module>

View file

@ -27,4 +27,5 @@
$lang->description_install = "Installation process also install/update programs which this program depends on";
$lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)";
$lang->path = "Path";
$lang->cmd_download = "Download";
?>

View file

@ -27,4 +27,5 @@
$lang->description_install = "설치를 진행하면, 이 프로그램이 의존하고 있는 모든 프로그램을 업데이트/설치 합니다.";
$lang->description_download = "FTP를 이용할 수 없는 경우, 직접 다운로드 하여 해당 path에 설치하셔야 합니다. (한칸 상위에서 압축을 푸시면 됩니다. ./modules/board의 경우 ./modules에서 tar를 푸세요)";
$lang->path = "설치경로";
$lang->cmd_download = "다운로드";
?>

View file

@ -27,4 +27,5 @@
$lang->description_install = "Quá trình Cài đặt / Cập nhật này phụ thuộc vào ";
$lang->description_download = "Khi FTP không được mở, bạn nên tải về và giả nén, sau đó Upload theo đường dẫn. (Nếu đường dẫn là ./modules/board, thì giải nén vào ./modules)";
$lang->path = "Đường dẫn";
$lang->cmd_download = "Download";
?>

View file

@ -27,4 +27,5 @@
$lang->current_version = "Installed version";
$lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)";
$lang->path = "Path";
$lang->cmd_download = "Download";
?>

View file

@ -0,0 +1,31 @@
<?php
/**
* @file zh-TW.lang.php
* @author sol (sol@ngleader.com) 翻譯royallin
* @brief 自動安裝(autoinstall)模組正體中文語言
**/
$lang->autoinstall = '自動安裝';
$lang->about_autoinstall = '可幫助您安裝/更新XE程式及面板。';
$lang->package_update = '最近更新';
$lang->package_downloaded_count = '下載次數';
$lang->need_update = "需要更新。";
$lang->order_newest = "最新發表";
$lang->order_popular = "熱門";
$lang->order_download = "下載";
$lang->success_installed = "安裝成功";
$lang->view_all_package = "全部檢視";
$lang->description_ftp_note = "請先將FTP設定好否則無法執行自動安裝功能。";
$lang->description_update = "如果您最近不是用自動安裝模組更新或安裝,請點擊更新按鈕更新。";
$lang->install = "安裝";
$lang->update = "更新";
$lang->depending_programs = "This program depends on ";
$lang->require_update = "需要更新";
$lang->require_installation = "需要安裝";
$lang->description_install = "Installation process also install/update programs which this program depends on";
$lang->current_version = "安裝版本";
$lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)";
$lang->path = "路徑";
$lang->cmd_download = "Download";
?>

View file

@ -8,14 +8,14 @@
<dt><strong>{$lang->depending_programs} :</strong></dt>
<dd> {$dep->title} ver. {$dep->version} -
<!--@if($dep->installed)-->{$lang->current_version}: {$dep->cur_version} <!--@if($dep->need_update)--> ({$lang->require_update})<!--@end--> <!--@else-->{$lang->require_installation}<!--@end-->
<!--@if($dep->need_update || !$dep->installed)--><a href="http://download.xpressengine.com/?module=resourceapi&act=procResourceapiDownload&package_srl={$dep->package_srl}">{$lang->download}</a> ({$lang->path} : {$dep->path})<!--@end-->
<!--@if($show_ftp_note && ($dep->need_update || !$dep->installed))--><a href="http://download.xpressengine.com/?module=resourceapi&act=procResourceapiDownload&package_srl={$dep->package_srl}">{$lang->cmd_download}</a> ({$lang->path} : {$dep->path})<!--@end-->
</dd>
</dl>
<!--@end-->
<!--@if($show_ftp_note)-->
<p class="warning">{$lang->description_download}. (<a href="{getUrl('','module','admin','act','dispAdminConfig')}#ftpSetup">FTP Setup</a>) </p>
<p>{$lang->path} : {$package->path}</p>
<p><a href="http://download.xpressengine.com/?module=resourceapi&act=procResourceapiDownload&package_srl={$package->package_srl}" class="button large green strong"><span>{$lang->download}</span></a></p>
<p><a href="http://download.xpressengine.com/?module=resourceapi&act=procResourceapiDownload&package_srl={$package->package_srl}" class="button large green strong"><span>{$lang->cmd_download}</span></a></p>
<!--@else-->
<p>{$lang->description_install}. </p>
<p><!--@if(!$package->installed || $package->need_update)--><a href="#" onclick="doInstallPackage('{$package->package_srl}')" class="button large green strong"><span>{$lang->install}</span></a><!--@end--></p>

View file

@ -621,7 +621,7 @@
if(!is_null($document_srl)) $obj->document_srl = $document_srl;
if(!is_null($var_idx)) $obj->var_idx = $var_idx;
if(!is_null($lang_code)) $obj->lang_code = $lang_code;
if(!is_null($eid)) $obj->lang_code = $eid;
if(!is_null($eid)) $obj->eid = $eid;
$output = executeQuery('document.deleteDocumentExtraVars', $obj);
return $output;
}

View file

@ -7,5 +7,6 @@
<condition operation="equal" column="document_srl" var="document_srl" filter="number" pipe="and" />
<condition operation="equal" column="var_idx" var="var_idx" filter="number" pipe="and" />
<condition operation="equal" column="lang_code" var="lang_code" pipe="and" />
<condition operation="equal" column="eid" var="eid" pipe="and" />
</conditions>
</query>

View file

@ -218,7 +218,7 @@
$lang->edit->materials = '글감보관함';
$lang->edit->temporary_savings = '暫存檔列表';
$lang->edit->drag_here = '아래의 단락추가 툴바에서 원하는 유형의 단락을 추가해 글 쓰기를 시작하세요.<br />글감 보관함에 글이 있으면 이곳으로 끌어 넣기 할 수 있습니다.';
$lang->edit->drag_here = 'You can start writting with a selected paragraph from paragraph toolbar below.<br />如果有暫存文章,可直接拖曳進行編輯。';
$lang->edit->paging_prev = '前頁';
$lang->edit->paging_next = '次頁';

View file

@ -196,6 +196,11 @@ function editorGetContentTextarea_xe(editor_sequence) {
// 파이어폭스의 경우 의미없는 <br>이 컨텐트 마지막에 추가될 수 있다.
str = str.replace(/<br ?\/?>$/i, '');
// 이미지 경로를 수정한다. - 20091125
str = str.replace(/src\s?=\s?(["']?)(?:\.\.\/)+(files\/attach\/)/ig, function(m0,m1,m2){
return 'src='+(m1||'')+m2;
});
return str;
}

View file

@ -6,7 +6,7 @@
<title xml:lang="vi">XpressEditor Skin</title>
<title xml:lang="jp">XpressEditorスキン</title>
<title xml:lang="zh-CN">XpressEditor皮肤</title>
<title xml:lang="zh-TW">XpressEditor面板</title> 
<title xml:lang="zh-TW">XpressEditor面板</title>
<description xml:lang="ko">
XpressEditor based on SmartEditor Basic by 행복한고니
</description>
@ -32,11 +32,11 @@
<date>2009-03-22</date>
<author email_address="gonom9@gmail.com" link="http://mygony.com">
<name xml:lang="ko">행복한고니</name>
<name xml:lang="es">gony</name>
<name xml:lang="en">gony</name>
<name xml:lang="es">gony</name>
<name xml:lang="en">gony</name>
<name xml:lang="vi">gony</name>
<name xml:lang="jp">gony</name>
<name xml:lang="zh-CN">gony</name>
<name xml:lang="zh-CN">gony</name>
<name xml:lang="zh-TW">gony</name>
</author>
<colorset>
@ -67,7 +67,7 @@
<title xml:lang="ru">White Text Editor(Auto Line Break)</title>
<title xml:lang="es">Editor de texto en blanco (Auto de línea)</title>
<title xml:lang="zh-CN">白色文本编辑器(使用HTML自动换行)</title>
<title xml:lang="zh-TW">白色文字編輯器(Auto Line Break)</title>
<title xml:lang="zh-TW">白色文字編輯器(使用HTML自動換行)</title>
</color>
<color name="black_texteditor">
<title xml:lang="ko">검은색 텍스트편집기(HTML 사용, 자동 줄 바꿈)</title>
@ -77,7 +77,7 @@
<title xml:lang="ru">Black Text Editor(Auto Line Break)</title>
<title xml:lang="es">Editor de texto negro (salto de línea automático)</title>
<title xml:lang="zh-CN">黑色文本编辑器(使用HTML自动换行)</title>
<title xml:lang="zh-TW">黑色文字編輯器(Auto Line Break)</title>
<title xml:lang="zh-TW">黑色文字編輯器(使用HTML自動換行)</title>
</color>
<color name="white_text_usehtml">
<title xml:lang="ko">하얀색 텍스트편집기(HTML 사용, 자동 줄 바꿈 안함)</title>
@ -87,7 +87,7 @@
<title xml:lang="ru">White Text Editor(Use HTML)</title>
<title xml:lang="es">Editor de texto en blanco (Uso de HTML)</title>
<title xml:lang="zh-CN">白色文本编辑器(使用HTML不自动换行)</title>
<title xml:lang="zh-TW">白色文字編輯器(Use HTML)</title>
<title xml:lang="zh-TW">白色文字編輯器(使用HTML不自動換行)</title>
</color>
<color name="black_text_usehtml">
<title xml:lang="ko">검은색 텍스트편집기(HTML 사용, 자동 줄 바꿈 안함)</title>
@ -97,7 +97,7 @@
<title xml:lang="ru">Black Text Editor(Use HTML)</title>
<title xml:lang="es">Editor de texto negro (Uso de HTML)</title>
<title xml:lang="zh-CN">黑色文本编辑器(使用HTML不自动换行)</title>
<title xml:lang="zh-TW">黑色文字編輯器(Use HTML)</title>
<title xml:lang="zh-TW">黑色文字編輯器(使用HTML不自動換行)</title>
</color>
<color name="white_text_nohtml">
<title xml:lang="ko">하얀색 텍스트편집기(HTML 사용 안함, 자동 줄 바꿈)</title>
@ -107,7 +107,7 @@
<title xml:lang="ru">White Text Editor(No HTML)</title>
<title xml:lang="es">Editor de texto en blanco (no HTML)</title>
<title xml:lang="zh-CN">白色文本编辑器(不使用HTML自动换行)</title>
<title xml:lang="zh-TW">白色文字編輯器(No HTML)</title>
<title xml:lang="zh-TW">白色文字編輯器(不使用HTML自動換行)</title>
</color>
<color name="black_text_nohtml">
<title xml:lang="ko">검은색 텍스트편집기(HTML 사용 안함, 자동 줄 바꿈)</title>
@ -117,7 +117,7 @@
<title xml:lang="ru">Black Text Editor(No HTML)</title>
<title xml:lang="es">Editor de texto negro (no HTML)</title>
<title xml:lang="zh-CN">黑色文本编辑器(不使用HTML自动换行)</title>
<title xml:lang="zh-TW">黑色文字編輯器(No HTML)</title>
<title xml:lang="zh-TW">黑色文字編輯器(不使用HTML自動換行)</title>
</color>
</colorset>
</skin>

View file

@ -14,6 +14,10 @@
XE默认样式。
主题显示及编辑不会受到任何影响,即原样输出。
</description>
<description xml:lang="zh-TW">
XE預設樣式。
主題顯示和編輯不會受到影響。
</description>
<description xml:lang="jp">
XEの基本ドキュメント書式です。
そのまま表示されるだけで、編集・出力には影響しません。
@ -29,7 +33,8 @@
<date>2009-05-23</date>
<author email_address="webmaster@naradesign.net" link="http://naradesign.net">
<name xml:lang="ko">정찬명</name>
<name xml:lang="zh-CN">Chan-Myung Jeong</name>
<name xml:lang="zh-CN">Chan-Myung Jeong</name>
<name xml:lang="zh-TW">Chan-Myung Jeong</name>
<name xml:lang="jp">Chan-Myung Jeong</name>
<name xml:lang="en">Chan-Myung Jeong</name>
<name xml:lang="vi">Chan-Myung Jeong</name>

View file

@ -2,9 +2,9 @@
<skin version="0.2">
<title xml:lang="ko">XE 기본 서식 (하얀 배경)</title>
<title xml:lang="zh-CN">XE默认样式(白色背景)</title>
<title xml:lang="zh-TW">XE預設樣式(白色背景)</title>
<title xml:lang="vi">XE Mặc định (Nền sáng)</title>
<title xml:lang="jp">XEデフォルトスタイル(白色背景)</title>
<title xml:lang="zh-TW">XE預設樣式(白色背景)</title>
<description xml:lang="ko">
XE 기본 문서 서식입니다.
문서 수정중에는 각 요소들이 구분되어 보입니다.
@ -13,6 +13,10 @@
XE默认样式。
在编辑文档时,可清晰地区分各标签区域。
</description>
<description xml:lang="zh-TW">
XE編輯器預設樣式。
編輯檔案時,可以清楚地區分各標籤。
</description>
<description xml:lang="vi">
Trang mẫu mặc định của XE.
Nó sẽ hiển thị trong phần sửa đổi bài viết.
@ -21,17 +25,13 @@
XEのデフォルトドキュメントのスタイルです。
ドキュメント編集中には、各要素が区分されて見えます。
</description>
<description xml:lang="zh-TW">
XE編輯器預設樣式。
문서 수정중에는 각 요소들이 구분되어 보입니다.
</description>
<version>0.0.1</version>
<date>2009-04-17</date>
<author email_address="webmaster@naradesign.net" link="http://naradesign.net">
<name xml:lang="ko">정찬명</name>
<name xml:lang="zh-CN">Chan-Myung Jeong</name>
<name xml:lang="zh-CN">Chan-Myung Jeong</name>
<name xml:lang="zh-TW">Chan-Myung Jeong</name>
<name xml:lang="jp">Chan-Myung Jeong</name>
<name xml:lang="vi">Chan-Myung Jeong</name>
<name xml:lang="zh-TW">Chan-Myung Jeong</name>
</author>
</skin>

View file

@ -2,9 +2,9 @@
<skin version="0.2">
<title xml:lang="ko">XE 기본 서식 (검은 배경)</title>
<title xml:lang="zh-CN">XE默认格式(黑色背景)</title>
<title xml:lang="zh-TW">XE預設樣式(黑色背景)</title>
<title xml:lang="vi">XE Mặc định (Nền tối)</title>
<title xml:lang="jp">XEデフォルトスタイル(黒色背景)</title>
<title xml:lang="zh-TW">XE預設樣式(黑色背景)</title>
<description xml:lang="ko">
XE 기본 문서 서식입니다.
문서 수정중에는 각 요소들이 구분되어 보입니다.
@ -13,6 +13,10 @@
XE默认格式。
在编辑文档时,可清晰地区分各标签区域。
</description>
<description xml:lang="zh-TW">
XE編輯器預設樣式。
編輯檔案時,可清楚地區分各標籤。
</description>
<description xml:lang="vi">
Mẫu mặc định của XE.
Nó sẽ hiển thị trong phần sửa đổi bài viết.
@ -21,17 +25,13 @@
XEのデフォルトドキュメントのスタイルです。
ドキュメント編集中には、各要素が区分されて見えます。
</description>
<description xml:lang="zh-TW">
XE編輯器預設樣式。
문서 수정중에는 각 요소들이 구분되어 보입니다.
</description>
<version>0.0.1</version>
<date>2009-04-17</date>
<author email_address="webmaster@naradesign.net" link="http://naradesign.net">
<name xml:lang="ko">정찬명</name>
<name xml:lang="zh-CN">Chan-Myung Jeong</name>
<name xml:lang="zh-TW">Chan-Myung Jeong</name>
<name xml:lang="jp">Chan-Myung Jeong</name>
<name xml:lang="vi">Chan-Myung Jeong</name>
<name xml:lang="zh-TW">Chan-Myung Jeong</name>
</author>
</skin>

View file

@ -119,14 +119,14 @@
<!-- 페이지 네비게이션 -->
<div class="pagination a1">
<a href="{getUrl('page','','module_srl','')}" class="prevEnd">{$lang->first_page}</a>
<a href="{getUrl('page','')}" class="prevEnd">{$lang->first_page}</a>
<!--@while($page_no = $page_navigation->getNextPage())-->
<!--@if($page == $page_no)-->
<strong>{$page_no}</strong>
<!--@else-->
<a href="{getUrl('page',$page_no,'module_srl','')}">{$page_no}</a>
<a href="{getUrl('page',$page_no)}">{$page_no}</a>
<!--@end-->
<!--@end-->
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="nextEnd">{$lang->last_page}</a>
<a href="{getUrl('page',$page_navigation->last_page)}" class="nextEnd">{$lang->last_page}</a>
</div>

View file

@ -153,6 +153,7 @@
$startPos = strpos($this->buff, $this->itemStartTag);
if($startPos !== false) {
$this->buff = substr($this->buff, $startPos);
$this->buff = preg_replace("/\>/",">\r\n",$this->buff,1);
break;
} elseif($this->endTag) {
$endPos = strpos($this->buff, $this->endTag);

View file

@ -63,7 +63,10 @@
$buff = '';
while (!feof($oExtract->fd)) {
$str = fgets($oExtract->fd, 1024);
if(substr($str,0,strlen('<category>'))=='<category>') $started = true;
if(strstr($str, '<category>')) {
$started = true;
$str = strstr($str, '<category>');
}
if(substr($str,0,strlen('<post ')) == '<post ') break;
if ($started) $buff .= $str;
}
@ -80,7 +83,10 @@
$buff = '';
while (!feof($oExtract->fd)) {
$str = fgets($oExtract->fd, 1024);
if(substr($str,0,strlen('<guestbook>'))=='<guestbook>') $started = true;
if(strstr($str, '<guestbook>')) {
$started = true;
$str = strstr($str, '<guestbook>');
}
if ($started) {
$pos = strpos($str, '</guestbook>');
if ($pos !== false) {
@ -94,7 +100,6 @@
$guestbook_filename = sprintf('%s/%s', $oExtract->cache_path, 'guestbook.xml');
FileHandler::writeFile($guestbook_filename, $buff);
// 개별 아이템 구함
$output = $oExtract->set($xml_file,'<blog', '</blog>', '<post ', '</post>');
if($output->toBool()) $oExtract->saveItems();
@ -145,7 +150,8 @@
$target_module = Context::get('target_module');
$guestbook_target_module = Context::get('guestbook_target_module');
$this->unit_count = Context::get('unit_count');
// index파일이 있는지 확인
$index_file = './files/cache/importer/'.$key.'/index';
if(!file_exists($index_file)) return new Object(-1, 'msg_invalid_xml_file');
@ -154,9 +160,12 @@
case 'ttxml' :
if(!$target_module) return new Object(-1,'msg_invalid_request');
$oModuleModel = &getModel('module');
$target_module_info = $oModuleModel->getModuleInfoByModuleSrl($target_module);
require_once('./modules/importer/ttimport.class.php');
$oTT = new ttimport();
$cur = $oTT->importModule($key, $cur, $index_file, $this->unit_count, $target_module, $guestbook_target_module, $user_id);
$cur = $oTT->importModule($key, $cur, $index_file, $this->unit_count, $target_module, $guestbook_target_module, $user_id, $target_module_info->module);
break;
case 'message' :
$cur = $this->importMessage($key, $cur, $index_file);

View file

@ -15,7 +15,7 @@
/**
* @brief module.xml 형식의 데이터 import
**/
function importModule($key, $cur, $index_file, $unit_count, $module_srl, $guestbook_module_srl, $user_id) {
function importModule($key, $cur, $index_file, $unit_count, $module_srl, $guestbook_module_srl, $user_id, $module_name=null) {
// 필요한 객체 미리 생성
$this->oXmlParser = new XmlParser();
@ -62,77 +62,8 @@
// 관리자 정보를 구함
$oMemberModel = &getModel('member');
$member_info = $oMemberModel->getMemberInfoByUserID($user_id);
// 방명록 정보를 입력함
$guestbook_file = preg_replace('/index$/i', 'guestbook.xml', $index_file);
if (file_exists($guestbook_file)) {
// xmlParser객체 생성
$xmlDoc = $this->oXmlParser->loadXmlFile($guestbook_file);
// 방명록 정보를 처리
if($guestbook_module_srl && $xmlDoc->guestbook->comment) {
$comment = $xmlDoc->guestbook->comment;
if(!is_array($comment)) $comment = array($comment);
foreach($comment as $key => $val) {
$obj = null;
$obj->module_srl = $guestbook_module_srl;
$obj->document_srl = getNextSequence();
$obj->uploaded_count = 0;
$obj->is_notice = 'N';
$obj->is_secret = $val->secret->body=='1'?'Y':'N';
$obj->content = nl2br($val->content->body);
// 본문에서 제목 추출
$obj->title = cut_str(strip_tags($obj->content),20,'...');
if ($obj->title == '') $obj->title = 'Untitled';
$obj->allow_comment = 'Y';
$obj->allow_trackback = 'N';
$obj->regdate = date("YmdHis",$val->written->body);
$obj->last_update = date("YmdHis", $val->written->body);
if(!$obj->last_update) $obj->last_update = $obj->regdate;
$obj->tags = '';
$obj->readed_count = 0;
$obj->voted_count = 0;
if ($val->commenter->attrs->id) {
$obj->password = '';
$obj->nick_name = $member_info->nick_name;
$obj->user_name = $member_info->user_name;
$obj->user_id = $member_info->user_id;
$obj->member_srl = $member_info->member_srl;
$obj->email_address = $member_info->email_address;
$obj->homepage = $member_info->homepage;
}
else {
$obj->password = $val->password->body;
$obj->nick_name = $val->commenter->name->body;
$obj->member_srl = 0;
$homepage = $val->commenter->homepage->body;
}
$obj->ipaddress = $val->commenter->ip->body;
$obj->list_order = $obj->update_order = $obj->document_srl*-1;
$obj->lock_comment = 'N';
$obj->notify_message = 'N';
$obj->trackback_count = 0;
$obj->comment_count = 0;
if($val->comment) {
$child_comment = $val->comment;
if(!is_array($child_comment)) $child_comment = array($child_comment);
foreach($child_comment as $k => $v) {
$result = $this->insertComment($v, $module_srl, $obj->document_srl, $member_info, 0);
if($result !== false) $obj->comment_count++;
}
}
// 문서 입력
$output = executeQuery('document.insertDocument', $obj);
}
}
FileHandler::removeFile($guestbook_file);
}
$author_xml_id = 0;
if(!$cur) $cur = 0;
// index파일을 염
@ -183,7 +114,9 @@
}
$xmlDoc = $this->oXmlParser->parse('<post>'.$buff);
$author_xml_id = $xmlDoc->post->author->body;
if($xmlDoc->post->category->body) {
$tmp_arr = explode('/',$xmlDoc->post->category->body);
$category = trim($tmp_arr[count($tmp_arr)-1]);
@ -270,7 +203,7 @@
$comment = $xmlDoc->post->comment;
if(!is_array($comment)) $comment = array($comment);
foreach($comment as $key => $val) {
$parent_srl = $this->insertComment($val, $module_srl, $obj->document_srl, $member_info, 0);
$parent_srl = $this->insertComment($val, $module_srl, $obj->document_srl, $member_info, 0, $author_xml_id);
if($parent_srl === false) continue;
$obj->comment_count++;
@ -278,7 +211,7 @@
$child_comment = $val->comment;
if(!is_array($child_comment)) $child_comment = array($child_comment);
foreach($child_comment as $k => $v) {
$result = $this->insertComment($v, $module_srl, $obj->document_srl, $member_info, $parent_srl);
$result = $this->insertComment($v, $module_srl, $obj->document_srl, $member_info, $parent_srl, $author_xml_id);
if($result !== false) $obj->comment_count++;
}
}
@ -314,9 +247,138 @@
if(count($category_list)) foreach($category_list as $key => $val) $oDocumentController->updateCategoryCount($module_srl, $val->category_srl);
// 방명록 정보를 입력함
$guestbook_file = preg_replace('/index$/i', 'guestbook.xml', $index_file);
if (file_exists($guestbook_file)) {
// xmlParser객체 생성
$xmlDoc = $this->oXmlParser->loadXmlFile($guestbook_file);
// 방명록 정보를 처리
if($guestbook_module_srl && $xmlDoc->guestbook->comment) {
$comment = $xmlDoc->guestbook->comment;
if(!is_array($comment)) $comment = array($comment);
if($module_name =='textyle'){
foreach($comment as $key => $val) {
$textyle_guestbook_srl = getNextSequence();
if($val->comment) {
$child_comment = $val->comment;
if(!is_array($child_comment)) $child_comment = array($child_comment);
foreach($child_comment as $k => $v) {
$result = $this->insertTextyleGuestbookItem($v, $module_srl, $member_info,0,$textyle_guestbook_srl,$author_xml_id);
}
}
$result = $this->insertTextyleGuestbookItem($val, $module_srl, $member_info,$textyle_guestbook_srl,0,$author_xml_id);
}
}else{
foreach($comment as $key => $val) {
$obj = null;
$obj->module_srl = $guestbook_module_srl;
$obj->document_srl = getNextSequence();
$obj->uploaded_count = 0;
$obj->is_notice = 'N';
$obj->is_secret = $val->secret->body=='1'?'Y':'N';
$obj->content = nl2br($val->content->body);
// 본문에서 제목 추출
$obj->title = cut_str(strip_tags($obj->content),20,'...');
if ($obj->title == '') $obj->title = 'Untitled';
$obj->allow_comment = 'Y';
$obj->allow_trackback = 'N';
$obj->regdate = date("YmdHis",$val->written->body);
$obj->last_update = date("YmdHis", $val->written->body);
if(!$obj->last_update) $obj->last_update = $obj->regdate;
$obj->tags = '';
$obj->readed_count = 0;
$obj->voted_count = 0;
if ($author_xml_id && $val->commenter->attrs->id == $author_xml_id) {
$obj->password = '';
$obj->nick_name = $member_info->nick_name;
$obj->user_name = $member_info->user_name;
$obj->user_id = $member_info->user_id;
$obj->member_srl = $member_info->member_srl;
$obj->email_address = $member_info->email_address;
$obj->homepage = $member_info->homepage;
}
else {
$obj->password = $val->password->body;
$obj->nick_name = $val->commenter->name->body;
$obj->member_srl = 0;
$homepage = $val->commenter->homepage->body;
}
$obj->ipaddress = $val->commenter->ip->body;
$obj->list_order = $obj->update_order = $obj->document_srl*-1;
$obj->lock_comment = 'N';
$obj->notify_message = 'N';
$obj->trackback_count = 0;
$obj->comment_count = 0;
if($val->comment) {
$child_comment = $val->comment;
if(!is_array($child_comment)) $child_comment = array($child_comment);
foreach($child_comment as $k => $v) {
$result = $this->insertComment($v, $module_srl, $obj->document_srl, $member_info, 0,$author_xml_id);
if($result !== false) $obj->comment_count++;
}
}
// 문서 입력
$output = executeQuery('document.insertDocument', $obj);
}
}
}
FileHandler::removeFile($guestbook_file);
}
return $idx-1;
}
function insertTextyleGuestbookItem($val, $module_srl, $member_info, $textyle_guestbook_srl,$parent_srl = 0, $author_xml_id=null) {
$tobj = null;
if($textyle_guestbook_srl>0){
$tobj->textyle_guestbook_srl = $textyle_guestbook_srl;
}else{
$tobj->textyle_guestbook_srl = getNextSequence();
}
$tobj->module_srl = $module_srl;
$tobj->is_secret = $val->secret->body=='1'?1:-1;
$tobj->content = nl2br($val->content->body);
if($author_xml_id && $val->commenter->attrs->id == $author_xml_id) {
$tobj->password = '';
$tobj->nick_name = $member_info->nick_name;
$tobj->user_name = $member_info->user_name;
$tobj->user_id = $member_info->user_id;
$tobj->member_srl = $member_info->member_srl;
$tobj->homepage = $member_info->homepage;
$tobj->email_address = $member_info->email_address;
} else {
$tobj->password = $val->password->body;
$tobj->nick_name = $val->commenter->name->body;
$tobj->homepage = $val->commenter->homepage->body;
$tobj->member_srl = 0;
}
$tobj->last_update = $tobj->regdate = date("YmdHis",$val->written->body);
$tobj->ipaddress = $val->commenter->ip->body;
if($parent_srl>0){
$tobj->parent_srl = $parent_srl;
$tobj->list_order = $tobj->parent_srl * -1;
}else{
$tobj->list_order = $tobj->textyle_guestbook_srl*-1;
}
$output = executeQuery('textyle.insertTextyleGuestbook', $tobj);
if($output->toBool()) return $tobj->textyle_guestbook_srl;
return false;
}
/**
* @brief 첨부파일 정리
**/
@ -468,7 +530,7 @@
/**
* @brief 댓글 입력
**/
function insertComment($val, $module_srl, $document_srl, $member_info, $parent_srl = 0) {
function insertComment($val, $module_srl, $document_srl, $member_info, $parent_srl = 0, $author_xml_id) {
$tobj = null;
$tobj->comment_srl = getNextSequence();
$tobj->module_srl = $module_srl;
@ -477,7 +539,7 @@
$tobj->notify_message = 'N';
$tobj->content = nl2br($val->content->body);
$tobj->voted_count = 0;
if ($val->commenter->attrs->id) {
if ($author_xml_id && $val->commenter->attrs->id == $author_xml_id) {
$tobj->password = '';
$tobj->nick_name = $member_info->nick_name;
$tobj->user_name = $member_info->user_name;
@ -552,7 +614,7 @@
$obj->sequence = $idx;
$obj->parent = $parent;
$category[$priority] = $obj;
$category[$idx] = $obj;
$this->arrangeCategory($val, $category, $idx, $idx);
}

View file

@ -119,9 +119,10 @@
* @brief FTP 정보 등록
**/
function procInstallAdminSaveFTPInfo() {
$ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','ftp_root_path');
$ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','ftp_root_path','sftp');
$ftp_info->ftp_port = (int)$ftp_info->ftp_port;
if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21;
if(!$ftp_info->sftp) $ftp_info->sftp = 'N';
$buff = '<?php if(!defined("__ZBXE__")) exit();'."\n";
foreach($ftp_info as $key => $val) {
$buff .= sprintf("\$ftp_info->%s = '%s';\n", $key, str_replace("'","\\'",$val));

View file

@ -117,22 +117,34 @@
}
function procInstallCheckFtp() {
$ftp_info = Context::gets('ftp_user','ftp_password','ftp_port');
$ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','sftp');
$ftp_info->ftp_port = (int)$ftp_info->ftp_port;
if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21;
if(!$ftp_info->sftp) $ftp_info->sftp = 'N';
if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_safe_mode_ftp_needed');
require_once(_XE_PATH_.'libs/ftp.class.php');
$oFtp = new ftp();
if(!$oFtp->ftp_connect('localhost', $ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected');
if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) {
$oFtp->ftp_quit();
return new Object(-1,'msg_ftp_invalid_auth_info');
if($ftp_info->sftp == 'Y')
{
$connection = ssh2_connect('localhost', $ftp_info->ftp_port);
if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password))
{
return new Object(-1,'msg_ftp_invalid_auth_info');
}
}
else
{
require_once(_XE_PATH_.'libs/ftp.class.php');
$oFtp = new ftp();
if(!$oFtp->ftp_connect('localhost', $ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected');
$oFtp->ftp_quit();
if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) {
$oFtp->ftp_quit();
return new Object(-1,'msg_ftp_invalid_auth_info');
}
$oFtp->ftp_quit();
}
$this->setMessage('msg_ftp_connect_success');
}

View file

@ -233,6 +233,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => 'Utilizando las funciones mysql*() de PHP usar DB mysql.<br />La transacción es desabilitado ya que DB(Bases de Datos) está creado por myisam.',
'mysqli' => 'Utilizando las funciones mysqli*() de PHP usar DB mysql.<br />La transacción es desabilitado ya que DB(Bases de Datos) está creado por myisam.',
'mysql_innodb' => 'Utilizando innodb usar BD mysql.<br />La transacción es hablilitado para innodb',
'sqlite2' => 'Soporta sqlite2, el cual almacena los datos en archivos <br />En la instalacion, es necesario crear archivo de BD en un lugar inaccesible de la web.<br />(Testeo de la estabilización no realizada)',
'sqlite3_pdo' => 'A través de PDO de PHP soporta sqlite2 <br />En la instalación, es necesario crear archivo de BD en un lugar inaccesible de la web.',

View file

@ -191,6 +191,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => 'Utilisera fonction mysql*() pour utiliser la base de données de mysql.<br />La transaction sera invalidé parce que le fichier de Base de Données est créé par myisam.',
'mysqli' => 'Utilisera fonction mysqli*() pour utiliser la base de données de mysql.<br />La transaction sera invalidé parce que le fichier de Base de Données est créé par myisam.',
'mysql_innodb' => 'Utilisera innodb pour utiliser Base de Données de mysql.<br />La transaction sera validé pour innodb',
'sqlite2' => 'Surpporter sqlite2 qui conserve les données dans les fichiers.<br />Quand vous installez, vous devez créer le fichier de Base de Données dans une place que l\'on ne peut pas accéder par web.<br />(Jamais testé sur stabilization)',
'sqlite3_pdo' => 'Supporter sqlite3 PDO de PHP.<br />Quand vous installez, vous devez cr?r le fichier de Base de Données dans une place que l\'on ne peut pas accéder par Web.',

View file

@ -229,6 +229,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => 'MySQL DBでPHPの「mysql*()」関数を利用してデータの入出力を行います。<br />DBは「myisam」タイプで作成されるため、トランザクション処理は出来ません。',
'mysqli' => 'MySQL DBでPHPの「mysqli*()」関数を利用してデータの入出力を行います。<br />DBは「myisam」タイプで作成されるため、トランザクション処理は出来ません。',
'mysql_innodb' => 'MySQL DBで「innodb」タイプでデータの入出力を行います。<br />「innodb」ではトランザクションの処理が行えます。',
'sqlite2' => 'ファイルタイプデータベースである「sqlite2」をサポートします。<br />インストール時、セキュリティのため、DBファイルはウェブがらアクセス出来ない場所に作成して下さい。<br />(安定化までのテストは行われていません)',
'sqlite3_pdo' => 'PHPのPDOを経由うして「sqlite3」をサポートします。<br />インストール時、セキュリティのため、DBファイルはウェブからアクセス出来ない場所に作成して下さい。',

View file

@ -228,8 +228,9 @@ EndOfLicense;
$lang->cmd_ignore = '무시';
$lang->db_desc = array(
'mysql' => 'mysql DB를 php의 mysql*()함수를 이용하여 사용합니다.<br />DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.',
'mysql_innodb' => 'mysql DB를 innodb를 이용하여 사용합니다.<br />innodb는 트랜잭션을 사용할 수 있습니다.',
'mysql' => 'MySQL DB를 php의 mysql*()함수를 이용하여 사용합니다.<br />DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.',
'mysqli' => 'MySQLi DB를 php의 mysql*()함수를 이용하여 사용합니다.<br />DB 파일은 myisam으로 생성되기에 트랜잭션이 이루어지지 않습니다.',
'mysql_innodb' => 'MySQL DB를 innodb를 이용하여 사용합니다.<br />innodb는 트랜잭션을 사용할 수 있습니다.',
'sqlite2' => '파일로 데이터를 저장하는 sqlite2를 지원합니다.<br />설치 시 DB파일은 웹에서 접근할 수 없는 곳에 생성하여 주셔야 합니다.<br />(안정화 테스트가 되지 않았습니다.)',
'sqlite3_pdo' => 'PHP의 PDO로 sqlite3를 지원합니다.<br />설치 시 DB파일은 웹에서 접근할 수 없는 곳에 생성하여 주셔야 합니다.',
'cubrid' => 'CUBRID DB를 이용합니다. <a href="http://xe.xpressengine.net/18180659" onclick="window.open(this.href);return false;" class="manual">manual</a>',

View file

@ -321,6 +321,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => 'Используем mysql*() функцию, чтобы использовать базу данных mysql.<br />Транзакция отключена из-за того, что файл базы данных создан посредством myisam.',
'mysqli' => 'Используем mysqli*() функцию, чтобы использовать базу данных mysql.<br />Транзакция отключена из-за того, что файл базы данных создан посредством myisam.',
'mysql_innodb' => 'Используем innodb чтобы использовать базу данных mysql.<br />Транзакция включена для innodb',
'sqlite2' => 'Поддерживает sqlite2, которая сохраняет данные в файл.<br />Устанавливая, следует размещать файл базы данных в недоступном с веб месте.<br />(Никогда не тестировалось на стабильность)',
'sqlite3_pdo' => 'Поддерживает sqlite3 посредством PHP\'s PDO.<br />Устанавливая, следует размещать файл базы данных в недоступном с веб месте.',

View file

@ -137,6 +137,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => 'Dùng chức năng <b>mysql*()</b> để sử dụng MySql Database.<br />Giao dịch được vô hiệu hóa bởi File Database được tạo ra bởi myisam.',
'mysqli' => 'Dùng chức năng <b>mysqli*()</b> để sử dụng MySql Database.<br />Giao dịch được vô hiệu hóa bởi File Database được tạo ra bởi myisam.',
'mysql_innodb' => 'Dùng chức năng <b>innodb</b> để sử dụng MySql Database.<br />Giao dịch được kích hoạt cho innodb',
'sqlite2' => 'Hỗ trợ <b>sqlite2</b> khi lưu Database thành File.<br />Khi cài đặt, File Database phải được tạo ra tại chỗ không sử dụng được từ Web.<br />(Không khẳng định sẽ hoạt động ổn định)',
'sqlite3_pdo' => 'Hỗ trợ <b>sqlite3</b> bởi PDO của PHP.<br />Khi cài đặt, File Database phải được tạo ra tại chỗ không sử dụng được từ Web.',

View file

@ -220,6 +220,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => '利用php的 mysql*()函数使用mysql DB。<br />DB数据是以myisam生成因此不能实现transaction。',
'mysqli' => '利用php的 mysqli*()函数使用mysql DB。<br />DB数据是以myisam生成因此不能实现transaction。',
'mysql_innodb' => '利用innodb使用mysql DB。<br />innodb可以使用transaction。',
'sqlite2' => '支持用文件形式保存数据的sqlite2。<br />安装时DB文件应在web不能访问的地方生成。<br />(还没有通过安全的测试)',
'sqlite3_pdo' => '用PHP的 PDO支持 sqlite3。<br />安装时DB文件应在web不能访问的地方生成。',

View file

@ -221,6 +221,7 @@ EndOfLicense;
$lang->db_desc = array(
'mysql' => '利用PHP的『mysql*()』函數使用MySQL資料庫。<br />利用『myisam』建立資料庫檔案因此不能實現transaction。',
'mysqli' => '利用PHP的『mysqli*()』函數使用MySQL資料庫。<br />利用『myisam』建立資料庫檔案因此不能實現transaction。',
'mysql_innodb' => '利用『innodb』使用 mysql 資料庫。<br />innodb可以使用 transaction。',
'sqlite2' => '支援用檔案形式保存數據的『sqlite2』。<br />安裝時,資料庫數據應建立在 web無法訪問的地方。<br />(尚未通過安全測試)',
'sqlite3_pdo' => '用 PHP的 PDO支援『sqlite3』。<br />安裝時,資料庫數據應建立在網頁無法訪問的地方。',

View file

@ -0,0 +1,51 @@
<!--%import("filter/mysql.xml")-->
<!--%import("js/install_admin.js")-->
<!--#include("header.html")-->
<form action="./" method="post" onsubmit="return procFilter(this, install)">
<input type="hidden" name="db_type" value="{$db_type}" />
<h2 class="xeAdmin">{$lang->form_title}</h2>
<table cellspacing="0" class="tableType7">
<col width="100" />
<col width="160" />
<col />
<tr>
<th rowspan="6" class="hr" scope="row">{$db_type}</th>
<th class="second" scope="row"><label for="textfield11">{$lang->db_hostname}</label></th>
<td><input type="text" name="db_hostname" value="localhost" class="inputTypeText w100" id="textfield11" /></td>
</tr>
<tr>
<th class="second" scope="row"><label for="textfield12">{$lang->db_port}</label></th>
<td><input type="text" name="db_port" value="3306" class="inputTypeText w100" id="textfield12" /></td>
</tr>
<tr>
<th class="second" scope="row"><label for="textfield13">{$lang->db_userid}</label></th>
<td><input type="text" name="db_userid" value="" class="inputTypeText w100" id="textfield13" /></td>
</tr>
<tr>
<th class="second" scope="row"><label for="textfield14">{$lang->db_password}</label></th>
<td><input type="password" name="db_password" value="" class="inputTypeText w100" id="textfield14" /></td>
</tr>
<tr>
<th class="second" scope="row"><label for="textfield15">{$lang->db_database}</label></th>
<td><input type="text" name="db_database" value="" class="inputTypeText w100" id="textfield15" /></td>
</tr>
<tr>
<th class="second hr" scope="row"><label for="textfield16">{$lang->db_table_prefix}</label></th>
<td class="hr"><input type="text" name="db_table_prefix" value="xe" class="inputTypeText w100" id="textfield16" /></td>
</tr>
<!--#include("form.install.html")-->
</table>
<div class="buttonCenter">
<span class="button blue"><input type="submit" value="{$lang->cmd_registration}" /></span>
</div>
</form>
<!--#include("footer.html")-->

View file

@ -1692,6 +1692,7 @@
// 그룹 정보가 있으면 그룹 정보를 변경
if($args->group_srl_list) {
$group_srl_list = explode('|@|', $args->group_srl_list);
$args->site_srl = 0;
// 일단 해당 회원의 모든 그룹 정보를 삭제
$output = executeQuery('member.deleteMemberGroupMember', $args);

View file

@ -5,5 +5,6 @@
<conditions>
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" filter="number" />
<condition operation="equal" column="group_srl" var="group_srl" filter="number" pipe="and" />
<condition operation="equal" column="site_srl" var="site_srl" filter="number" pipe="and" />
</conditions>
</query>

View file

@ -11,7 +11,7 @@
<table cellspacing="0" class="rowTable">
<tr>
<th scope="row"><div>{$lang->group_title}</div></th>
<td class="left"><input type="text" name="title" class="inputTypeText w400" value="{$selected_group->title}"/></td>
<td class="left"><input type="text" name="title" id="title" class="inputTypeText w400 lang_code" value="{$selected_group->title}"/></td>
</tr>
<!--@if($selected_group->is_default!='Y' && $selected_group->is_admin!='Y')-->
<tr class="row2">

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<module>
<grants />
<permissions />
@ -6,6 +6,7 @@
<action name="dispRssAdminIndex" type="view" index="true" standalone="true" admin_index="true" />
<action name="rss" type="view" standalone="true" />
<action name="atom" type="view" standalone="true" />
<action name="procRssAdminToggleActivate" type="controller" standalone="true" />
<action name="procRssAdminInsertConfig" type="controller" standalone="true" />
<action name="procRssAdminInsertModuleConfig" type="controller" standalone="true" />
</actions>

View file

@ -114,6 +114,30 @@
}
/**
* @brief Feed 전체 포함/미포함 체인지
**/
function procRssAdminToggleActivate() {
$oRssModel = &getModel('rss');
// mid값을 받아옴
$module_srl = Context::get('module_srl');
if($module_srl) {
$config = $oRssModel->getRssModuleConfig($module_srl);
if($config->open_total_feed == 'T_N') {
$this->setRssModuleConfig($module_srl, $config->open_rss, 'T_Y', $config->feed_description, $config->feed_copyright);
$this->add("open_total_feed", 'T_Y');
}
else {
$this->setRssModuleConfig($module_srl, $config->open_rss, 'T_N', $config->feed_description, $config->feed_copyright);
$this->add("open_total_feed", 'T_N');
}
}
$this->add("module_srl", $module_srl);
}
/**
* @brief RSS모듈의 전체 Feed 설정용 함수
**/

View file

@ -1,32 +1,37 @@
<?php
/**
* @class rssAdminView
* @author misol (misol221@paran.com)
* @brief rss 모듈의 admin view class
* @author misol (misol@korea.ac.kr)
* @brief rss 모듈의 admin view class
**/
class rssAdminView extends rss {
/**
* @brief 초기화
* @brief 초기화
**/
function init() {
// 템플릿 경로 지정
// 템플릿 경로 지정
$this->setTemplatePath($this->module_path.'tpl');
}
/**
* @brief 관리자 페이지 초기화면
* @brief 관리자 페이지 초기화면
**/
function dispRssAdminIndex() {
$oModuleModel = &getModel('module');
$rss_config = $oModuleModel->getModulePartConfigs('rss');
$total_config = $oModuleModel->getModuleConfig('rss');
$oRssModel = &getModel('rss');
if($rss_config) {
foreach($rss_config as $module_srl => $config) {
if($config) {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
$site = $oModuleModel->getSiteInfo($module_info->site_srl);
if(!strpos($site->domain, '.')) $vid = $site->domain;
else $site = null;
if($site) $feed_config[$module_srl]['url'] = $oRssModel->getModuleFeedUrl($vid, $module_info->mid, 'rss');
$feed_config[$module_srl]['mid'] = $module_info->mid;
$feed_config[$module_srl]['open_feed'] = $config->open_rss;
$feed_config[$module_srl]['open_total_feed'] = $config->open_total_feed;

View file

@ -37,22 +37,8 @@
$rss_config = $oRssModel->getRssModuleConfig($current_module_srl);
if($rss_config->open_rss != 'N') {
if(Context::isAllowRewrite()) {
$request_uri = Context::getRequestUri();
// 가상 사이트 변수가 있고 이 변수가 mid와 다를때. (vid와 mid는 같을 수 없다고 함)
if(Context::get('vid') && Context::get('vid') != Context::get('mid')) {
Context::set('rss_url', Context::getRequestUri().Context::get('vid').'/'.Context::get('mid').'/rss');
Context::set('atom_url', Context::getRequestUri().Context::get('vid').'/'.Context::get('mid').'/atom');
}
else {
Context::set('rss_url', $request_uri.Context::get('mid').'/rss');
Context::set('atom_url', $request_uri.Context::get('mid').'/atom');
}
}
else {
Context::set('rss_url', getUrl('','mid',Context::get('mid'),'act','rss'));
Context::set('atom_url', getUrl('','mid',Context::get('mid'),'act','atom'));
}
Context::set('rss_url', $oRssModel->getModuleFeedUrl(Context::get('vid'), Context::get('mid'), 'rss'));
Context::set('atom_url', $oRssModel->getModuleFeedUrl(Context::get('vid'), Context::get('mid'), 'atom'));
}
if(Context::isInstalled() && $site_module_info->mid == Context::get('mid') && $total_config->use_total_feed != 'N') {

View file

@ -9,6 +9,25 @@
**/
class rssModel extends rss {
/**
* @brief Feed url 생성.
**/
function getModuleFeedUrl($vid = null, $mid, $format) {
if(Context::isAllowRewrite()) {
$request_uri = Context::getRequestUri();
// 가상 사이트 변수가 있고 이 변수가 mid와 다를때. (vid와 mid는 같을 수 없다고 함)
if($vid && $vid != $mid) {
return $request_uri.$vid.'/'.$mid.'/'.$format;
}
else {
return $request_uri.$mid.'/'.$format;
}
}
else {
return getUrl('','mid',$mid,'act',$format);
}
}
/**
* @brief 특정 모듈의 rss 설정을 return

17
modules/rss/tpl/js/rss.js Normal file
View file

@ -0,0 +1,17 @@
function doToggleRss(module_srl) {
var params = new Array();
params['module_srl'] = module_srl;
var response_tags = new Array('error','message','module_srl','open_total_feed');
exec_xml('rss','procRssAdminToggleActivate',params, doChangeIcon ,response_tags );
}
function doChangeIcon(ret_obj, response_tags) {
var obj = document.getElementById('dotogglerss_'+ret_obj['module_srl']);
if(ret_obj['open_total_feed'] == 'T_N') {
obj.className = "buttonSet buttonDisable";
} else {
obj.className = "buttonSet buttonActive";
}
}

View file

@ -1,3 +1,4 @@
<!--%import("js/rss.js")-->
<h3 class="xeAdmin">{$lang->total_feed} <span class="gray">{$lang->cmd_management}</span></h3>
<!--%import("filter/insert_rss_config.xml")-->
@ -69,11 +70,11 @@
</tr>
</thead>
<tbody>
<!--@foreach($feed_config as $config)-->
<!--@foreach($feed_config as $module_srl => $config)-->
<tr>
<th>{$config['mid']}</th>
<th><!--@if($config['url'])--><a href="{$config['url']}"><!--@endif-->{$config['mid']}<!--@if($config['url'])--></a><!--@endif--></th>
<td>{$lang->open_rss_types[$config['open_feed']]}</td>
<td><!--@if($config['open_total_feed'] == 'T_N')-->{$lang->notuse}<!--@else-->{$lang->use}<!--@end--></td>
<td><a id="dotogglerss_{$module_srl}" onclick="doToggleRss('{$module_srl}')" <!--@if($config['open_total_feed'] == 'T_N')-->class="buttonSet buttonDisable"><span>{$lang->notuse}<!--@else-->class="buttonSet buttonActive"><span>{$lang->use}<!--@end--></span></a></td>
</tr>
<!--@end-->
</tbody>

View file

@ -41,7 +41,7 @@
<name xml:lang="en">Article</name>
<name xml:lang="vi">Bài viết</name>
<name xml:lang="zh-CN">主题</name>
<name xml:lang="zh-TW">主題</name>
<name xml:lang="zh-TW">主題</name>
<name xml:lang="jp">書き込み</name>
</options>
<options>
@ -50,7 +50,7 @@
<name xml:lang="en">Comment</name>
<name xml:lang="vi">Bình luận</name>
<name xml:lang="zh-CN">评论</name>
<name xml:lang="zh-TW">評論</name>
<name xml:lang="zh-TW">評論</name>
<name xml:lang="jp">コメント</name>
</options>
<options>
@ -59,7 +59,7 @@
<name xml:lang="en">Attached Image</name>
<name xml:lang="vi">Hình đính kèm</name>
<name xml:lang="zh-CN">图片</name>
<name xml:lang="zh-TW">圖片</name>
<name xml:lang="zh-TW">圖片</name>
<name xml:lang="jp">添付イメージ</name>
</options>
<options>
@ -68,7 +68,7 @@
<name xml:lang="en">Trackback</name>
<name xml:lang="vi">Liên kết Web</name>
<name xml:lang="zh-CN">引用</name>
<name xml:lang="zh-TW">引用</name>
<name xml:lang="zh-TW">引用</name>
<name xml:lang="jp">トラックバック</name>
</options>
<options>
@ -77,7 +77,7 @@
<name xml:lang="en">Feed (RSS/ATOM)</name>
<name xml:lang="vi">Feed (RSS/ATOM)</name>
<name xml:lang="zh-CN">Feed (RSS/ATOM)</name>
<name xml:lang="zh-TW">Feed (RSS/ATOM)</name>
<name xml:lang="zh-TW">Feed (RSS/ATOM)</name>
<name xml:lang="jp">Feed (RSS/ATOM)</name>
</options>
</var>

View file

@ -391,6 +391,33 @@
return $body;
}
function _getSummary($content, $str_size = 50)
{
$content = preg_replace('!(<br[\s]*/{0,1}>[\s]*)+!is', ' ', $content);
// </p>, </div>, </li> 등의 태그를 공백 문자로 치환
$content = str_replace(array('</p>', '</div>', '</li>'), ' ', $content);
// 태그 제거
$content = preg_replace('!<([^>]*?)>!is','', $content);
// < , > , " 를 치환
$content = str_replace(array('&lt;','&gt;','&quot;','&nbsp;'), array('<','>','"',' '), $content);
// 연속된 공백문자 삭제
$content = preg_replace('/ ( +)/is', ' ', $content);
// 문자열을 자름
$content = trim(cut_str($content, $str_size, $tail));
// >, <, "를 다시 복구
$content = str_replace(array('<','>','"'),array('&lt;','&gt;','&quot;'), $content);
// 영문이 연결될 경우 개행이 안 되는 문제를 해결
$content = preg_replace('/([a-z0-9\+:\/\.\~,\|\!\@\#\$\%\^\&\*\(\)\_]){20}/is',"$0-",$content);
return $content;
}
/**
* @brief rss 주소로 부터 내용을 받아오는 함수
@ -440,7 +467,7 @@
$content_item->setNickName(max($item->author,$item->{'dc:creator'}));
//$content_item->setCategory($item->category);
$item->description = preg_replace('!<a href=!is','<a onclick="window.open(this.href);return false" href=', $item->description);
$content_item->setContent($item->description);
$content_item->setContent($this->_getSummary($item->description, $args->content_cut_size));
$content_item->setLink($item->link);
$date = date('YmdHis', strtotime(max($item->pubdate,$item->pubDate,$item->{'dc:date'})));
$content_item->setRegdate($date);
@ -474,7 +501,7 @@
$content_item->setNickName(max($item->author,$item->{'dc:creator'}));
//$content_item->setCategory($item->category);
$item->description = preg_replace('!<a href=!is','<a onclick="window.open(this.href);return false" href=', $item->description);
$content_item->setContent($item->description);
$content_item->setContent($this->_getSummary($item->description, $args->content_cut_size));
$content_item->setLink($item->link);
$date = date('YmdHis', strtotime(max($item->pubdate,$item->pubDate,$item->{'dc:date'})));
$content_item->setRegdate($date);
@ -541,7 +568,7 @@
if(!preg_match("/html/i", $value->summary->attrs->type)) $item->description = htmlspecialchars($item->description);
}
}
$content_item->setContent($item->description);
$content_item->setContent($this->_getSummary($item->description, $args->content_cut_size));
$content_item->setLink($item->link);
$date = date('YmdHis', strtotime(max($item->published,$item->updated,$item->{'dc:date'})));
$content_item->setRegdate($date);

View file

@ -55,6 +55,6 @@
<name xml:lang="zh-CN">zero</name>
<name xml:lang="ru">zero</name>
<name xml:lang="zh-TW">zero</name>
<name xml:lang="vi">zero</name>
<name xml:lang="vi">zero</name>
</author>
</widget>

View file

@ -19,7 +19,7 @@
<author email_address="sol@ngleader.com" link="http://www.ngleader.com">
<name xml:lang="ko">sol</name>
<name xml:lang="en">sol</name>
<name xml:lang="vi">sol</name>
<name xml:lang="vi">sol</name>
<name xml:lang="zh-CN">sol</name>
<name xml:lang="zh-TW">sol</name>
<name xml:lang="jp">sol</name>
@ -29,20 +29,20 @@
<var name="ws_colorset" type="select">
<title xml:lang="ko">컬러셋</title>
<title xml:lang="en">Colorset</title>
<title xml:lang="vi">Tạo màu</title>
<title xml:lang="vi">Tạo màu</title>
<title xml:lang="zh-CN">颜色</title>
<title xml:lang="zh-TW">顏色</title>
<title xml:lang="jp">カラーセット</title>
<description xml:lang="ko">컬러셋을 지정해주세요</description>
<description xml:lang="en">Choose colorset</description>
<description xml:lang="vi">Lựa chọn màu sắc</description>
<description xml:lang="vi">Lựa chọn màu sắc</description>
<description xml:lang="zh-CN">请指定适当的颜色。</description>
<description xml:lang="zh-TW">請選擇顏色。</description>
<description xml:lang="jp">カラーセットを指定して下さい。</description>
<options>
<name xml:lang="ko">하얀색</name>
<name xml:lang="en">White</name>
<name xml:lang="vi">White</name>
<name xml:lang="vi">White</name>
<name xml:lang="zh-CN">白色</name>
<name xml:lang="zh-TW">白色</name>
<name xml:lang="jp"></name>
@ -51,7 +51,7 @@
<options>
<name xml:lang="ko">검은색</name>
<name xml:lang="en">Black</name>
<name xml:lang="vi">Black</name>
<name xml:lang="vi">Black</name>
<name xml:lang="zh-CN">黑色</name>
<name xml:lang="zh-TW">黑色</name>
<name xml:lang="jp"></name>
@ -61,13 +61,13 @@
<var name="ws_title" type="text">
<name xml:lang="ko">제목</name>
<name xml:lang="en">Title</name>
<name xml:lang="vi">Tiêu đề</name>
<name xml:lang="vi">Tiêu đề</name>
<name xml:lang="zh-CN">栏目名</name>
<name xml:lang="zh-TW">標題</name>
<name xml:lang="jp">タイトル</name>
<description xml:lang="ko">제목 텍스트</description>
<description xml:lang="en">Title text</description>
<description xml:lang="vi">Chữ của tiêu đề</description>
<description xml:lang="vi">Chữ của tiêu đề</description>
<description xml:lang="zh-CN">请输入栏目名。</description>
<description xml:lang="zh-TW">請輸入標題。</description>
<description xml:lang="jp">「タイトル」のテキスト</description>
@ -75,28 +75,28 @@
<var name="ws_more_url" type="text">
<name xml:lang="ko">더보기 URL</name>
<name xml:lang="en">more URL</name>
<name xml:lang="vi">URL của Xem thêm</name>
<name xml:lang="vi">URL của Xem thêm</name>
<name xml:lang="zh-CN">查看更多(链接)</name>
<name xml:lang="zh-TW">more URL</name>
<name xml:lang="jp">「もっと見る」URL</name>
<description xml:lang="ko">http:// 포함한 URL를 등록합니다.</description>
<description xml:lang="zh-CN">请输入包含http://的URL地址。</description>
<description xml:lang="zh-TW">請輸入http://以外的URL網址。</description>
<description xml:lang="zh-CN">请输入包含http://的URL地址。</description>
<description xml:lang="zh-TW">請輸入http://以外的URL網址。</description>
<description xml:lang="en">Destination of a link 'more'. Register an URL including http://</description>
<description xml:lang="vi">Địa chỉ trang sẽ chuyển đến khi bấm vào Xem thêm (Bao gồm cả http://)</description>
<description xml:lang="vi">Địa chỉ trang sẽ chuyển đến khi bấm vào Xem thêm (Bao gồm cả http://)</description>
<description xml:lang="jp">「http://」を含んだURLを登録します。</description>
</var>
<var name="ws_more_text" type="text">
<name xml:lang="ko">더보기 텍스트</name>
<name xml:lang="en">more Text</name>
<name xml:lang="vi">Chữ của Xem thêm</name>
<name xml:lang="vi">Chữ của Xem thêm</name>
<name xml:lang="zh-CN">查看更多(文本)</name>
<name xml:lang="zh-TW">more TEXT</name>
<name xml:lang="jp">「もっと見る」テキスト</name>
<description xml:lang="ko">더보기 텍스트</description>
<description xml:lang="en">Text for a link 'more'</description>
<description xml:lang="zh-CN">文本格式的"查看更多"。</description>
<description xml:lang="vi">Có thể dùng những từ khác thay cho từ Xem thêm</description>
<description xml:lang="vi">Có thể dùng những từ khác thay cho từ Xem thêm</description>
<description xml:lang="zh-TW">純文字格式。</description>
<description xml:lang="jp">「もっと見る」テキスト</description>
</var>