merge & tag 1.4.3
git-svn-id: http://xe-core.googlecode.com/svn/trunk@7597 201d5d3c-b55e-5fd7-737f-ddc643e51545
|
|
@ -5,7 +5,7 @@
|
|||
<title xml:lang="vi">Captcha Addon</title>
|
||||
<title xml:lang="zh-CN">验证码插件</title>
|
||||
<title xml:lang="jp">Captchaアドオン</title>
|
||||
<title xml:lang="ru">Аддон Captcha</title>
|
||||
<title xml:lang="ru">Аддон Captcha</title>
|
||||
<title xml:lang="zh-TW">圖形驗證</title>
|
||||
<description xml:lang="ko">
|
||||
프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다.
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。
|
||||
ログインしてない時だけ、動作します。
|
||||
</description>
|
||||
<description xml:lang="ru">
|
||||
<description xml:lang="ru">
|
||||
To block spam written by programs, let users to choose a suitable image to text when writing a posting or comment.
|
||||
This addon applies only to not-logged-in users.
|
||||
</description>
|
||||
|
|
@ -39,46 +39,46 @@
|
|||
|
||||
<author email_address="developers@xpressengine.com" link="http://www.xpressengine.com">
|
||||
<name xml:lang="ko">XE</name>
|
||||
<name xml:lang="zh-CN">XE</name>
|
||||
<name xml:lang="jp">XE</name>
|
||||
<name xml:lang="zh-CN">XE</name>
|
||||
<name xml:lang="jp">XE</name>
|
||||
<name xml:lang="zh-TW">XE</name>
|
||||
<name xml:lang="en">XE</name>
|
||||
<name xml:lang="ru">XE</name>
|
||||
<name xml:lang="en">XE</name>
|
||||
<name xml:lang="ru">XE</name>
|
||||
<name xml:lang="vi">XE</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="ru">Captcha Target</title>
|
||||
<title xml:lang="ru">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="ru">You may specify targets CAPTCHA work. It's not applied when administrator writes.</description>
|
||||
<description xml:lang="ru">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="ru">Not logged-in users</title>
|
||||
<title xml:lang="ru">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-CN">所有用户</title>
|
||||
<title xml:lang="jp">すべてのユーザー</title>
|
||||
<title xml:lang="zh-TW">所有用戶</title>
|
||||
<title xml:lang="en">All users</title>
|
||||
<title xml:lang="ru">All users</title>
|
||||
<title xml:lang="ru">All users</title>
|
||||
<title xml:lang="vi">Tất cả mọi người</title>
|
||||
</options>
|
||||
</var>
|
||||
|
|
@ -88,14 +88,14 @@
|
|||
<title xml:lang="jp">動作方式</title>
|
||||
<title xml:lang="zh-TW">行為模式</title>
|
||||
<title xml:lang="en">How it works</title>
|
||||
<title xml:lang="ru">How it works</title>
|
||||
<title xml:lang="ru">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="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="ru">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="ru">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>
|
||||
|
|
@ -104,7 +104,7 @@
|
|||
<title xml:lang="zh-TW">單次</title>
|
||||
<title xml:lang="vi">Chỉ một lần</title>
|
||||
<title xml:lang="en">once</title>
|
||||
<title xml:lang="ru">1 раз</title>
|
||||
<title xml:lang="ru">1 раз</title>
|
||||
</options>
|
||||
<options value="everytime">
|
||||
<title xml:lang="ko">매번 동작</title>
|
||||
|
|
@ -112,7 +112,7 @@
|
|||
<title xml:lang="jp">毎回表示</title>
|
||||
<title xml:lang="zh-TW">每次</title>
|
||||
<title xml:lang="en">every time</title>
|
||||
<title xml:lang="ru">каждый раз</title>
|
||||
<title xml:lang="ru">каждый раз</title>
|
||||
<title xml:lang="vi">Luôn sử dụng</title>
|
||||
</options>
|
||||
</var>
|
||||
|
|
@ -122,14 +122,14 @@
|
|||
<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="ru">applying to an action finding account</title>
|
||||
<title xml:lang="ru">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="ru">If you set this option as apply, CAPTCHA will work for finding account action, too.</description>
|
||||
<description xml:lang="ru">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>
|
||||
|
|
@ -137,7 +137,7 @@
|
|||
<title xml:lang="jp">적용하지 않음</title>
|
||||
<title xml:lang="zh-TW">關閉</title>
|
||||
<title xml:lang="en">Not apply</title>
|
||||
<title xml:lang="ru">Not apply</title>
|
||||
<title xml:lang="ru">Not apply</title>
|
||||
<title xml:lang="vi">Không áp dụng</title>
|
||||
</options>
|
||||
<options value="apply">
|
||||
|
|
@ -146,7 +146,7 @@
|
|||
<title xml:lang="jp">적용</title>
|
||||
<title xml:lang="zh-TW">開啟</title>
|
||||
<title xml:lang="en">Apply</title>
|
||||
<title xml:lang="ru">Apply</title>
|
||||
<title xml:lang="ru">Apply</title>
|
||||
<title xml:lang="vi">Áp dụng</title>
|
||||
</options>
|
||||
</var>
|
||||
|
|
@ -156,14 +156,14 @@
|
|||
<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="ru">apply to an action resending authmail</title>
|
||||
<title xml:lang="ru">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="en">If you set this option as apply, CAPTCHA will work for resending authmail action, too.</description>
|
||||
<description xml:lang="ru">If you set this option as apply, CAPTCHA will work for resending authmail action, too.</description>
|
||||
<description xml:lang="ru">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>
|
||||
|
|
@ -171,7 +171,7 @@
|
|||
<title xml:lang="jp">적용하지 않음</title>
|
||||
<title xml:lang="zh-TW">關閉</title>
|
||||
<title xml:lang="en">Not apply</title>
|
||||
<title xml:lang="ru">Not apply</title>
|
||||
<title xml:lang="ru">Not apply</title>
|
||||
<title xml:lang="vi">Không áp dụng</title>
|
||||
</options>
|
||||
<options value="apply">
|
||||
|
|
@ -180,20 +180,20 @@
|
|||
<title xml:lang="jp">적용</title>
|
||||
<title xml:lang="zh-TW">開啟</title>
|
||||
<title xml:lang="en">Apply</title>
|
||||
<title xml:lang="ru">Apply</title>
|
||||
<title xml:lang="ru">Apply</title>
|
||||
<title xml:lang="vi">Áp dụng</title>
|
||||
</options>
|
||||
</var>
|
||||
<var name="apply_signup" type="select">
|
||||
<title xml:lang="ko">회원 가입 적용</title>
|
||||
<title xml:lang="zh-CN">Apply to member signup</title>
|
||||
<title xml:lang="zh-CN">应用到用户注册表单</title>
|
||||
<title xml:lang="jp">인증 메일 재발송 적용</title>
|
||||
<title xml:lang="zh-TW">會員註冊</title>
|
||||
<title xml:lang="en">Apply to member signup</title>
|
||||
<title xml:lang="ru">Apply to member signup</title>
|
||||
<title xml:lang="ru">Apply to member signup</title>
|
||||
<title xml:lang="vi">Apply to member signup</title>
|
||||
<description xml:lang="ko">적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.</description>
|
||||
<description xml:lang="zh-CN">적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.</description>
|
||||
<description xml:lang="zh-CN">启用此项功能可以有效地拦截自动注册软件的施虐。</description>
|
||||
<description xml:lang="jp">적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.</description>
|
||||
<description xml:lang="zh-TW">If you set this option as apply, CAPTCHA will work for signup action, too.</description>
|
||||
<description xml:lang="en">If you set this option as apply, CAPTCHA will work for signup action, too.</description>
|
||||
|
|
@ -205,7 +205,7 @@
|
|||
<title xml:lang="jp">적용하지 않음</title>
|
||||
<title xml:lang="zh-TW">關閉</title>
|
||||
<title xml:lang="en">Not apply</title>
|
||||
<title xml:lang="ru">Not apply</title>
|
||||
<title xml:lang="ru">Not apply</title>
|
||||
<title xml:lang="vi">Không áp dụng</title>
|
||||
</options>
|
||||
<options value="apply">
|
||||
|
|
@ -214,7 +214,7 @@
|
|||
<title xml:lang="jp">적용</title>
|
||||
<title xml:lang="zh-TW">開啟</title>
|
||||
<title xml:lang="en">Apply</title>
|
||||
<title xml:lang="ru">Apply</title>
|
||||
<title xml:lang="ru">Apply</title>
|
||||
<title xml:lang="vi">Áp dụng</title>
|
||||
</options>
|
||||
</var>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
Addon này hiển thị WAP Tag bởi việc phân tích thông tin khi kết nối bằng di động.
|
||||
Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml.
|
||||
</description>
|
||||
<description xml:lang="ru">
|
||||
<description xml:lang="ru">
|
||||
Данный аддон показывает WAP теги, анализирую информацию мобильного соединения.
|
||||
Поддерживаются только wml, hdml, mhtml форматы.
|
||||
</description>
|
||||
|
|
@ -44,7 +44,7 @@
|
|||
<name xml:lang="zh-CN">zero</name>
|
||||
<name xml:lang="en">zero</name>
|
||||
<name xml:lang="vi">zero</name>
|
||||
<name xml:lang="ru">zero</name>
|
||||
<name xml:lang="ru">zero</name>
|
||||
<name xml:lang="zh-TW">zero</name>
|
||||
</author>
|
||||
|
||||
|
|
@ -55,7 +55,7 @@
|
|||
<name xml:lang="zh-CN">misol</name>
|
||||
<name xml:lang="en">misol</name>
|
||||
<name xml:lang="vi">misol</name>
|
||||
<name xml:lang="ru">misol</name>
|
||||
<name xml:lang="ru">misol</name>
|
||||
<name xml:lang="zh-TW">misol</name>
|
||||
</author>
|
||||
<log>언어선택 추가(WML, mHTML)</log>
|
||||
|
|
@ -70,7 +70,7 @@
|
|||
<title xml:lang="zh-CN">编码</title>
|
||||
<title xml:lang="en">Charset</title>
|
||||
<title xml:lang="vi">Charset</title>
|
||||
<title xml:lang="ru">Charset</title>
|
||||
<title xml:lang="ru">Charset</title>
|
||||
<title xml:lang="zh-TW">編碼</title>
|
||||
<description xml:lang="ko">
|
||||
모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다.
|
||||
|
|
@ -97,7 +97,7 @@
|
|||
Những công cụ di động sẽ trình bày Charset đúng khi bạn nhập vào Charset bạn muốn.
|
||||
Charset mặc định là UTF-8.
|
||||
</description>
|
||||
<description xml:lang="ru">
|
||||
<description xml:lang="ru">
|
||||
utf-8 may be read with mobile tools.
|
||||
Mobile tools will display correct charset when you input charset you want.
|
||||
Default charset is UTF-8.
|
||||
|
|
|
|||
|
|
@ -1,139 +0,0 @@
|
|||
<?php
|
||||
class smartphoneXE {
|
||||
var $module_info = null;
|
||||
var $oModule = null;
|
||||
var $output = null;
|
||||
|
||||
var $parent_url = null;
|
||||
var $prev_url = null;
|
||||
var $next_url = null;
|
||||
|
||||
var $content = null;
|
||||
|
||||
function isFromSmartPhone() {
|
||||
if(Context::get('full_browse') || $_COOKIE["FullBrowse"])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return Context::get('smartphone') || preg_match('/(iPod|iPhone|Android|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']);
|
||||
}
|
||||
|
||||
function haveSmartphoneModule($module) {
|
||||
return $oModule =& getModule($module, 'smartphone') && method_exists($oModule,'procSmartPhone');
|
||||
}
|
||||
|
||||
function smartphoneXE($oModule, $module_info, $output) {
|
||||
|
||||
$this->oModule = $oModule;
|
||||
$this->module_info = $module_info;
|
||||
|
||||
if(!$this->module_info->menu_srl) {
|
||||
$oMenuModel = &getAdminModel('menu');
|
||||
$menus = $oMenuModel->getMenus($this->module_info->site_srl);
|
||||
if($menus[0]) $this->module_info->menu_srl = $menus[0]->menu_srl;
|
||||
}
|
||||
|
||||
if($this->module_info->menu_srl) {
|
||||
$menu_cache_file = sprintf(_XE_PATH_.'files/cache/menu/%d.php', $this->module_info->menu_srl);
|
||||
if(!file_exists($menu_cache_file)) return;
|
||||
@include $menu_cache_file;
|
||||
Context::addHtmlHeader(sprintf('<script type="text/javascript"> var xeMenus = { %s } </script>', $this->_getAllItems($menu->list)));
|
||||
$this->_setParentUrl($menu->list);
|
||||
}
|
||||
}
|
||||
|
||||
function _setParentUrl($menu_list) {
|
||||
if(!count($menu_list)) return;
|
||||
foreach($menu_list as $key => $val) {
|
||||
if(!$val['text']) continue;
|
||||
if($val['list'] && $this->_setParentUrl($val['list'])) {
|
||||
$href = $val['href'];
|
||||
if(preg_match('/^[a-z0-9_]+$/i',$val['url'])) $href = getUrl('','mid',$val['url'],'smartphone','true');
|
||||
else $href = $val['href'];
|
||||
$this->setParentUrl($href);
|
||||
return false;
|
||||
}
|
||||
if($val['url']==Context::get('mid')) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function _getAllItems($menu_list, $depth=0) {
|
||||
if(!count($menu_list)) return;
|
||||
$output = '';
|
||||
|
||||
foreach($menu_list as $menu_item)
|
||||
{
|
||||
if($output) $output .= ",";
|
||||
$key = $menu_item['text'];
|
||||
$val = $menu_item['url'];
|
||||
if($menu_item['list']) {
|
||||
$childs = '{'.$this->_getAllItems($menu_item['list'], $depth+1).'}';
|
||||
} else {
|
||||
$childs = 'null';
|
||||
}
|
||||
|
||||
$output .= sprintf('"%s" : { "url" : "%s", "childs" : %s } ',str_replace('"','\"',$key), str_replace('"','\"',$val), $childs);
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
function procSmartPhone($msg = null) {
|
||||
if(preg_match('/(iPod|iPhone|Android)/',$_SERVER['HTTP_USER_AGENT'])) {
|
||||
Context::addHtmlHeader('<meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>');
|
||||
} else if(preg_match('/SCH\-M[0-9]+/',$_SERVER['HTTP_USER_AGENT'])) {
|
||||
Context::addHtmlHeader('<meta name="viewport" content="width=240; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>');
|
||||
}
|
||||
|
||||
if(is_a($this->output, 'Object') || is_subclass_of($this->output, 'Object') || $msg) {
|
||||
if($msg) $this->setContent(Context::getLang($msg));
|
||||
else $this->setContent($this->output->getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
if($this->haveSmartphoneModule($this->module_info->module)) {
|
||||
$oSmartPhoneModule =& getModule($this->module_info->module, 'smartphone');
|
||||
$vars = get_object_vars($this->oModule);
|
||||
if(count($vars)) foreach($vars as $key => $val) $oSmartPhoneModule->{$key} = $val;
|
||||
$oSmartPhoneModule->procSmartPhone($this);
|
||||
} else {
|
||||
switch(Context::getLangType()) {
|
||||
case 'ko' :
|
||||
$msg = '스마트폰을 지원하지 않는 모듈입니다';
|
||||
break;
|
||||
case 'jp' :
|
||||
$msg = 'このモジュールをサポートしていません。';
|
||||
break;
|
||||
case 'zh-TW' :
|
||||
$msg = '該模塊不支持。';
|
||||
break;
|
||||
case 'zh-CN' :
|
||||
$msg = '该模块不支持。';
|
||||
break;
|
||||
default :
|
||||
$msg = 'This module is not supported.';
|
||||
break;
|
||||
}
|
||||
$this->setContent($msg);
|
||||
}
|
||||
}
|
||||
|
||||
function setContent($content) {
|
||||
$this->content = $content;
|
||||
}
|
||||
|
||||
function setParentUrl($url) {
|
||||
$this->parent_url = $url;
|
||||
}
|
||||
|
||||
function setPrevUrl($url) {
|
||||
$this->prev_url = $url;
|
||||
}
|
||||
|
||||
function setNextUrl($url) {
|
||||
$this->next_url = $url;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<addon version="0.2">
|
||||
<title xml:lang="ko">SmartPhone XE 애드온</title>
|
||||
<title xml:lang="en">SmartPhone XE</title>
|
||||
<title xml:lang="zh-CN">智能手机XE插件</title>
|
||||
<title xml:lang="vi">SmartPhone XE</title>
|
||||
<title xml:lang="ru">SmartPhone XE</title>
|
||||
<title xml:lang="zh-TW">智慧型手機</title>
|
||||
<title xml:lang="jp">SmartPhone XE アドオン</title>
|
||||
<description xml:lang="ko">
|
||||
IPhone (touch) 등, smartphone 에서 접속시 최적화된 화면을 보여줍니다.
|
||||
</description>
|
||||
<description xml:lang="en">
|
||||
This addon displays the best screen for users who use smartphones like IPhone (touch).
|
||||
</description>
|
||||
<description xml:lang="zh-CN">
|
||||
用于IPhone(touch)等智能手机访问时的界面优化。
|
||||
</description>
|
||||
<description xml:lang="vi">
|
||||
Addon này sẽ hiển thị Website trên màn hình iPhone một cách tốt nhất khi người dùng sử dụng SmartPhone để truy cập (iPhone cảm ứng)
|
||||
</description>
|
||||
<description xml:lang="zh-TW">
|
||||
用iPhone(touch)和智慧型手機瀏覽時會以最適當的畫面顯示。
|
||||
</description>
|
||||
<description xml:lang="ru">
|
||||
This addon displays the best screen for users who use smartphones like IPhone (touch).
|
||||
</description>
|
||||
<description xml:lang="jp">
|
||||
IPhone(touch)など、スマートフォンからアクセスした時、最適化されたインターフェースで表示させます。
|
||||
</description>
|
||||
<version>0.1</version>
|
||||
<date>2009-04-20</date>
|
||||
<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="vi">haneul</name>
|
||||
<name xml:lang="zh-TW">haneul</name>
|
||||
<name xml:lang="ru">haneul</name>
|
||||
<name xml:lang="jp">haneul</name>
|
||||
</author>
|
||||
</addon>
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
<?PHP
|
||||
if(!defined("__ZBXE__")) exit();
|
||||
|
||||
if(Context::get('module')=='admin') return;
|
||||
require_once(_XE_PATH_.'addons/smartphone/classes/smartphone.class.php');
|
||||
|
||||
if($called_position == "before_module_init")
|
||||
{
|
||||
if(Context::get('full_browse'))
|
||||
{
|
||||
setcookie("FullBrowse", 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(!smartphoneXE::isFromSmartPhone()) return;
|
||||
|
||||
if($called_position == 'after_module_proc' ) {
|
||||
$oSmartphoneXE = new smartphoneXE($this, $this->module_info, $output);
|
||||
$oSmartphoneXE->procSmartPhone();
|
||||
Context::set('layout', 'none');
|
||||
Context::set('smart_content', $oSmartphoneXE->content);
|
||||
Context::set('parent_url', $oSmartphoneXE->parent_url);
|
||||
Context::set('prev_url', $oSmartphoneXE->prev_url);
|
||||
Context::set('next_url', $oSmartphoneXE->next_url);
|
||||
$this->setTemplatePath('addons/smartphone/tpl');
|
||||
$this->setTemplateFile('layout');
|
||||
|
||||
} elseif($called_position == 'before_module_proc' && !$this->grant->access) {
|
||||
$oSmartphoneXE = new smartphoneXE($this, $this->module_info, $output);
|
||||
$oSmartphoneXE->procSmartPhone('msg_not_permitted_act');
|
||||
Context::set('layout', 'none');
|
||||
Context::set('smart_content', $oSmartphoneXE->content);
|
||||
Context::set('parent_url', $oSmartphoneXE->parent_url);
|
||||
Context::set('prev_url', $oSmartphoneXE->prev_url);
|
||||
Context::set('next_url', $oSmartphoneXE->next_url);
|
||||
$this->setTemplatePath('addons/smartphone/tpl');
|
||||
$this->setTemplateFile('layout');
|
||||
}
|
||||
?>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 259 B |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 117 B |
|
Before Width: | Height: | Size: 332 B |
|
|
@ -1,26 +0,0 @@
|
|||
<!--%import("./smartphone.css")-->
|
||||
<!--%import("./smartphone.js")-->
|
||||
|
||||
<div class="smartPhoneTitleBar">
|
||||
<h1><a href="#" onclick="showXEMenu(); return false;">{Context::getBrowserTitle()}</a></h1>
|
||||
</div>
|
||||
|
||||
<div class="smartPhoneContentArea">
|
||||
{$smart_content}
|
||||
</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-->
|
||||
|
||||
<!--@if($prev_url)--><a href="{$prev_url}"><img src="./images/btnPrev.png" class="smartPhoneBtn" alt="Prev" /></a><!--@end-->
|
||||
<!--@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>
|
||||
|
|
@ -1,200 +0,0 @@
|
|||
body {
|
||||
margin: 0;
|
||||
padding:0;
|
||||
font-family: Helvetica;
|
||||
background: #E6E6E6 url(./images/pinstripes.png);
|
||||
color: #000000;
|
||||
overflow-x: hidden;
|
||||
-webkit-user-select: none;
|
||||
-webkit-text-size-adjust: none;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
.smartPhoneTitleBar {
|
||||
border-bottom: 1px solid #2d3642;
|
||||
border-top: 1px solid #6d84a2;
|
||||
height: 43px;
|
||||
overflow:hidden;
|
||||
background:#485567 url(./images/titlebar.png) repeat-x left top;
|
||||
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-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;
|
||||
color: #FFFFFF;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
padding:8px 10px;
|
||||
margin:0;
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.smartPhoneTitleBar h1 a {
|
||||
text-decoration:none;
|
||||
color:#fff;
|
||||
}
|
||||
|
||||
.smartPhoneContent {
|
||||
z-index:450;
|
||||
border: 1px solid #999999;
|
||||
padding:10px;
|
||||
background-color:#fff;
|
||||
margin:10px;
|
||||
box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
-webkit-border-radius: 8px;
|
||||
}
|
||||
|
||||
.smartPhoneToolBar {
|
||||
z-index:9999;
|
||||
width:100%;
|
||||
border-bottom: 1px solid #2d3642;
|
||||
border-top: 1px solid #6d84a2;
|
||||
height: 43px;
|
||||
overflow:hidden;
|
||||
background:#485567 url(./images/titlebar.png) repeat-x left top;
|
||||
white-space:nowrap;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
}
|
||||
|
||||
.smartPhoneBtn {
|
||||
width:43px;
|
||||
height:43px;
|
||||
margin-left:8px;
|
||||
border:0;
|
||||
}
|
||||
|
||||
.smartPhoneContent div.info {
|
||||
font-size:13px;
|
||||
padding-bottom:10px;
|
||||
border-bottom:1px solid #444;
|
||||
overflow:hidden;
|
||||
*zoom:1;
|
||||
}
|
||||
|
||||
.smartPhoneContent div.info .author {
|
||||
font-weight:bold;
|
||||
float:left;
|
||||
}
|
||||
|
||||
.smartPhoneContent div.info .date {
|
||||
font-size:11px;
|
||||
float:right;
|
||||
}
|
||||
|
||||
.smartPhoneContent div.link {
|
||||
margin-top:10px;
|
||||
border-top:1px solid #444;
|
||||
}
|
||||
|
||||
.smartPhoneContent div.link a {
|
||||
display:block;
|
||||
padding:10px 0;
|
||||
font-size:15px;
|
||||
text-decoration:underline;
|
||||
font-weight:bold;
|
||||
color:#000;
|
||||
}
|
||||
|
||||
.smartPhoneList {
|
||||
background-color:#fff;
|
||||
z-index:500;
|
||||
padding:0;
|
||||
margin:0;
|
||||
}
|
||||
|
||||
.smartPhoneList ul {
|
||||
padding:0;
|
||||
margin:0;
|
||||
left:0;
|
||||
right:0;
|
||||
top:43px;
|
||||
}
|
||||
|
||||
.smartPhoneList li {
|
||||
list-style:none;
|
||||
font-size:18px;
|
||||
font-weight:bold;
|
||||
padding:10px 20px 10px 10px;
|
||||
border-bottom:1px solid #ccc;
|
||||
}
|
||||
|
||||
.smartPhoneList li a {
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
|
||||
text-overflow: ellipsis;
|
||||
color:#000;
|
||||
text-decoration:none;
|
||||
display:block;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
.smartPhoneList li.title {
|
||||
position: relative;
|
||||
top: -1px;
|
||||
margin-bottom: -2px;
|
||||
border-top: 1px solid #7d7d7d;
|
||||
border-bottom: 1px solid #999999;
|
||||
padding: 5px 10px;
|
||||
background: url(./images/listGroup.png) repeat-x;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.smartPhoneList li.selected {
|
||||
background-color:#ddd;
|
||||
}
|
||||
|
||||
.smartPhoneList li.selected * {
|
||||
color:#fff;
|
||||
}
|
||||
|
||||
|
||||
.smartPhoneList li a {
|
||||
background:transparent url(./images/listArrow.png) no-repeat scroll right center;
|
||||
padding-right:30px;
|
||||
}
|
||||
|
||||
.smartPhoneList li.noArrow a {
|
||||
background:none !important;
|
||||
}
|
||||
|
||||
.smartPhoneList li.item img.thumbnail {
|
||||
margin:0 10px 0 0;
|
||||
padding:0;
|
||||
}
|
||||
|
||||
.smartPhoneList li.item span.title, .smartPhoneList li.item span.title div {
|
||||
font-size:15px;
|
||||
font-weight:normal;
|
||||
display:block;
|
||||
}
|
||||
|
||||
.smartPhoneList li.item span.info {
|
||||
font-size:10px;
|
||||
font-weight:normal;
|
||||
color:#bbb;
|
||||
display:block;
|
||||
margin-top:2px;
|
||||
letter-spacing:0px;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1,105 +0,0 @@
|
|||
var xeSmartMenu = null;
|
||||
var xeSmartUpperMenu = null;
|
||||
function setFullBrowse() {
|
||||
location.href = current_url.setQuery('full_browse',1);
|
||||
}
|
||||
|
||||
function showXEMenu() {
|
||||
if(!xeSmartMenu) {
|
||||
|
||||
xeSmartMenu = jQuery('<div>')
|
||||
.attr("className","smartPhoneList")
|
||||
.css('display','none')
|
||||
.css('backgroundColor','#fff');
|
||||
|
||||
jQuery(document.body).append(xeSmartMenu);
|
||||
|
||||
xeSmartMenu.slideIn = function(step) {
|
||||
var w = this.width() + Math.pow(step,2)*30;
|
||||
|
||||
if(w>jQuery(document).width()) {
|
||||
this.css({left:0,right:0,display:'block'});
|
||||
this.width('');
|
||||
jQuery('.smartPhoneContentArea').css("display","none");
|
||||
} else {
|
||||
this.width(w);
|
||||
var o = parseInt(jQuery(document).width/w,10)/5;
|
||||
if(o>1) o = 1;
|
||||
setTimeout(function() { xeSmartMenu.slideIn(step+1); }, 50);
|
||||
}
|
||||
}
|
||||
|
||||
xeSmartMenu.slideOut = function(step) {
|
||||
var l = parseInt(this.css('left'),10) + Math.pow(step,2)*30;
|
||||
|
||||
if(l>jQuery('.smartPhoneContent').width()) {
|
||||
this.css({display:'none','left':''});
|
||||
jQuery('.smartPhoneContentArea').css("display","block");
|
||||
} else {
|
||||
var o = parseInt(jQuery(document).width/l,10)/5;
|
||||
if(o<0) o = 0;
|
||||
this.css('left',l+'px');
|
||||
setTimeout(function() { xeSmartMenu.slideOut(step+1); }, 50);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(xeSmartMenu.css('display')=='none' && typeof(xeMenus)!='undefined') {
|
||||
xeSmartUpperMenu = null;
|
||||
var menu = findSmartNode(xeMenus);
|
||||
if(!menu) menu = xeMenus;
|
||||
var html = '<ul>';
|
||||
if(location.href.getQuery('mid')) html += '<li><a href="'+current_url.setQuery('mid','')+'">< go Home ></a></li>';
|
||||
if(xeSmartUpperMenu) html += '<li><a href="'+current_url.setQuery('mid',xeSmartUpperMenu.url)+'">< go Upper ></a></li>';
|
||||
for(var text in menu) {
|
||||
if(!text) continue;
|
||||
var url = menu[text].url;
|
||||
var href = '';
|
||||
if(/^[a-z0-9_]+$/i.test(url)) {
|
||||
href = request_uri.setQuery('mid',url);
|
||||
if(href.indexOf('?')>-1) href += '&smartphone=true';
|
||||
else href += '?smartphone=true';
|
||||
}
|
||||
else href = url;
|
||||
if(typeof(xeVid)!='undefined') {
|
||||
if(href.indexOf('?')>-1) href += '&vid='+xeVid;
|
||||
else href += '?vid='+xeVid;
|
||||
}
|
||||
html += '<li><a href="'+href+'">'+text+'</a></li>';
|
||||
}
|
||||
html += '</ul>';
|
||||
|
||||
jQuery(xeSmartMenu).html(html);
|
||||
jQuery(xeSmartMenu).css({
|
||||
width:'1px',
|
||||
right:'0',
|
||||
top:'43px',
|
||||
display:'block',
|
||||
position:'absolute',
|
||||
padding:0
|
||||
});
|
||||
xeSmartMenu.slideIn(0);
|
||||
} else if(location.href.getQuery('mid')||location.href.getQuery('document_srl')) {
|
||||
xeSmartMenu.slideOut(0);
|
||||
}
|
||||
}
|
||||
|
||||
function findSmartNode(nodes) {
|
||||
var mid = current_url.getQuery('mid');
|
||||
if(typeof(mid)=='undefined'||!mid) return nodes;
|
||||
for(var text in nodes) {
|
||||
if(!text) continue;
|
||||
if(nodes[text].childs) {
|
||||
var n = findSmartNode(nodes[text].childs);
|
||||
if(n) {
|
||||
xeSmartUpperMenu = nodes[text];
|
||||
return n;
|
||||
}
|
||||
}
|
||||
if(nodes[text].url == mid) {
|
||||
if(nodes[text].childs) return nodes[text].childs;
|
||||
return nodes;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
@ -158,22 +158,6 @@
|
|||
if(file_exists(_XE_PATH_.'.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true;
|
||||
else $this->allow_rewrite = false;
|
||||
|
||||
// add common JS/CSS files
|
||||
$this->addJsFile("./common/js/jquery.js", true, '', -100000);
|
||||
$this->addJsFile("./common/js/x.js");
|
||||
$this->addJsFile("./common/js/common.js");
|
||||
$this->addJsFile("./common/js/js_app.js");
|
||||
$this->addJsFile("./common/js/xml_handler.js");
|
||||
$this->addJsFile("./common/js/xml_js_filter.js");
|
||||
$this->addCSSFile("./common/css/default.css");
|
||||
$this->addCSSFile("./common/css/button.css");
|
||||
|
||||
// for admin page, add admin css
|
||||
if(Context::get('module')=='admin' || strpos(Context::get('act'),'Admin')>0){
|
||||
$this->addCssFile("./modules/admin/tpl/css/font.css", true, 'all', '',10000);
|
||||
$this->addCssFile("./modules/admin/tpl/css/pagination.css", true, 'all', '', 100001);
|
||||
$this->addCssFile("./modules/admin/tpl/css/admin.css", true, 'all', '', 100002);
|
||||
}
|
||||
|
||||
// set locations for javascript use
|
||||
if($_SERVER['REQUEST_METHOD'] == 'GET') {
|
||||
|
|
@ -1179,7 +1163,7 @@
|
|||
/**
|
||||
* @brief js file을 추가
|
||||
**/
|
||||
function _addJsFile($file, $optimized, $targetie,$index) {
|
||||
function _addJsFile($file, $optimized = true, $targetie = '',$index=null) {
|
||||
if(strpos($file,'://')===false && $file{0}!='/' && $file{0}!='.') $file = './'.$file;
|
||||
$file = preg_replace('@/\./|(?<!:)\/\/@', '/', $file);
|
||||
while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file,1);
|
||||
|
|
@ -1277,7 +1261,7 @@
|
|||
/**
|
||||
* @brief CSS file 추가
|
||||
**/
|
||||
function _addCSSFile($file, $optimized, $media, $targetie, $index) {
|
||||
function _addCSSFile($file, $optimized = true, $media = 'all', $targetie = '', $index = null) {
|
||||
if(strpos($file,'://')===false && substr($file,0,1)!='/' && substr($file,0,1)!='.') $file = './'.$file;
|
||||
$file = str_replace(array('/./','//'),'/',$file);
|
||||
while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file,1);
|
||||
|
|
|
|||
|
|
@ -668,23 +668,44 @@
|
|||
} else {
|
||||
if(strpos($name,'.')!=false) {
|
||||
list($prefix, $name) = explode('.',$name);
|
||||
if (strpos ($prefix, "(")) {
|
||||
$tmpval = explode ("(", $prefix);
|
||||
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
|
||||
$prefix = implode ("(", $tmpval);
|
||||
$flag_of_function = true;
|
||||
if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) {
|
||||
if ($now_matchs == 1) {
|
||||
$tmpval = explode ("(", $prefix);
|
||||
$tmpval[1] = sprintf ('"%s"', $tmpval[1]);
|
||||
$prefix = implode ("(", $tmpval);
|
||||
$tmpval = explode (")", $name);
|
||||
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
|
||||
$name = implode (")", $tmpval);
|
||||
}
|
||||
}
|
||||
else $prefix = sprintf('"%s"',$prefix);
|
||||
if ($flag_of_function === true) {
|
||||
$tmpval = explode (")", $name);
|
||||
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
|
||||
$name = implode (")", $tmpval);
|
||||
$flag_of_function = false;
|
||||
else {
|
||||
$prefix = sprintf('"%s"',$prefix);
|
||||
$name = ($name == '*') ? $name : sprintf('"%s"',$name);
|
||||
}
|
||||
else $name = ($name == '*') ? $name : sprintf('"%s"',$name);
|
||||
|
||||
$xtmp = null;
|
||||
$now_matchs = null;
|
||||
$column_list[] = sprintf($click_count,sprintf('%s.%s', $prefix, $name)) . ($alias ? sprintf(' as %s',$alias) : '');
|
||||
|
||||
} elseif (($now_matchs = preg_match_all ("/\(/", $name, $xtmp)) > 0) {
|
||||
if ($now_matchs == 1 && preg_match ("/[a-zA-Z0-9]*\(\*\)/", $name) < 1) {
|
||||
$open_pos = strpos ($name, "(");
|
||||
$close_pos = strpos ($name, ")");
|
||||
if (preg_match ("/,/", $name)) {
|
||||
$tmp_func_name = sprintf ('%s', substr ($name, 0, $open_pos));
|
||||
$tmp_params = sprintf ('%s', substr ($name, $open_pos + 1, $close_pos - $open_pos - 1));
|
||||
$tmpval = null;
|
||||
$tmpval = explode (',', $tmp_params);
|
||||
foreach ($tmpval as $tmp_param) {
|
||||
$tmp_param_list[] = (!is_numeric ($tmp_param)) ? sprintf ('"%s"', $tmp_param) : $tmp_param;
|
||||
}
|
||||
$tmpval = implode (',', $tmp_param_list);
|
||||
$name = sprintf ('%s(%s)', $tmp_func_name, $tmpval);
|
||||
} else {
|
||||
$name = sprintf ('%s("%s")',
|
||||
substr ($name, 0, $open_pos),
|
||||
substr ($name, $open_pos + 1, $close_pos - $open_pos - 1));
|
||||
}
|
||||
}
|
||||
$column_list[] = sprintf ($click_count,$name) . ($alias ? sprintf (' as %s', $alias) : '');
|
||||
} else {
|
||||
$column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : '');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
var $content_size = 0; ///< 출력하는 컨텐츠의 사이즈
|
||||
|
||||
var $gz_enabled = false; ///< gzip 압축하여 컨텐츠 호출할 것인지에 대한 flag변수
|
||||
var $handler = null;
|
||||
|
||||
/**
|
||||
* @brief print either html or xml content given oModule object
|
||||
|
|
@ -31,68 +32,25 @@
|
|||
) $this->gz_enabled = true;
|
||||
|
||||
// request method에 따른 컨텐츠 결과물 추출
|
||||
if(Context::get('xeVirtualRequestMethod')=='xml') $output = $this->_toVirtualXmlDoc($oModule);
|
||||
else if(Context::getRequestMethod() == 'XMLRPC') {
|
||||
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) $this->gz_enabled = false;
|
||||
$output = $this->_toXmlDoc($oModule);
|
||||
if(Context::get('xeVirtualRequestMethod')=='xml') {
|
||||
require_once("./classes/display/VirtualXMLDisplayHandler.php");
|
||||
$handler = new VirtualXMLDisplayHandler();
|
||||
}
|
||||
else if(Context::getRequestMethod() == 'XMLRPC') {
|
||||
require_once("./classes/display/XMLDisplayHandler.php");
|
||||
$handler = new XMLDisplayHandler();
|
||||
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) $this->gz_enabled = false;
|
||||
}
|
||||
else if(Context::getRequestMethod() == 'JSON') {
|
||||
require_once("./classes/display/JSONDisplayHandler.php");
|
||||
$handler = new JSONDisplayHandler();
|
||||
}
|
||||
else {
|
||||
require_once("./classes/display/HTMLDisplayHandler.php");
|
||||
$handler = new HTMLDisplayHandler();
|
||||
}
|
||||
else if(Context::getRequestMethod() == 'JSON') $output = $this->_toJSON($oModule);
|
||||
else $output = $this->_toHTMLDoc($oModule);
|
||||
|
||||
// HTML 출력 요청일 경우 레이아웃 컴파일과 더블어 완성된 코드를 제공
|
||||
if(Context::getResponseMethod()=="HTML") {
|
||||
|
||||
// 관리자 모드일 경우 #xeAdmin id를 가지는 div 추가
|
||||
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $output = '<div id="xeAdmin">'.$output.'</div>';
|
||||
|
||||
// 내용을 content라는 변수로 설정 (layout에서 {$output}에서 대체됨)
|
||||
Context::set('content', $output);
|
||||
|
||||
// 레이아웃을 컴파일
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
|
||||
// layout이라는 변수가 none으로 설정되면 기본 레이아웃으로 변경
|
||||
if(Context::get('layout') != 'none') {
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
$layout_path = $oModule->getLayoutPath();
|
||||
|
||||
$layout_file = $oModule->getLayoutFile();
|
||||
$edited_layout_file = $oModule->getEditedLayoutFile();
|
||||
|
||||
// 현재 요청된 레이아웃 정보를 구함
|
||||
$oLayoutModel = &getModel('layout');
|
||||
$current_module_info = Context::get('current_module_info');
|
||||
$layout_srl = $current_module_info->layout_srl;
|
||||
|
||||
// 레이아웃과 연결되어 있으면 레이아웃 컴파일
|
||||
if($layout_srl > 0){
|
||||
$layout_info = Context::get('layout_info');
|
||||
|
||||
// faceoff 레이아웃일 경우 별도 처리
|
||||
if($layout_info && $layout_info->type == 'faceoff') {
|
||||
$oLayoutModel->doActivateFaceOff($layout_info);
|
||||
Context::set('layout_info', $layout_info);
|
||||
}
|
||||
|
||||
// 관리자 레이아웃 수정화면에서 변경된 CSS가 있는지 조사
|
||||
$edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_srl);
|
||||
|
||||
if(file_exists($edited_layout_css)) Context::addCSSFile($edited_layout_css,true,'all','',100);
|
||||
}
|
||||
if(!$layout_path) $layout_path = "./common/tpl";
|
||||
if(!$layout_file) $layout_file = "default_layout";
|
||||
$output = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
|
||||
if(preg_match('/MSIE/i',$_SERVER['HTTP_USER_AGENT']) && (Context::get("_use_ssl")=='optional'||Context::get("_use_ssl")=="always")) {
|
||||
Context::addHtmlFooter('<iframe id="xeTmpIframe" name="xeTmpIframe" style="width:1px;height:1px;position:absolute;top:-2px;left:-2px;"></iframe>');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
$output = $handler->toDoc($oModule);
|
||||
|
||||
// 출력하기 전에 trigger 호출 (before)
|
||||
ModuleHandler::triggerCall('display', 'before', $output);
|
||||
|
|
@ -100,58 +58,16 @@
|
|||
// 애드온 실행
|
||||
$called_position = 'before_display_content';
|
||||
$oAddonController = &getController('addon');
|
||||
$addon_file = $oAddonController->getCacheFilePath();
|
||||
$addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
|
||||
@include($addon_file);
|
||||
|
||||
// HTML 출력일 경우 최종적으로 common layout을 씌워서 출력
|
||||
if(Context::getResponseMethod()=="HTML") {
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// body 내의 <style ..></style>를 header로 이동
|
||||
$output = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'moveStyleToHeader'), $output);
|
||||
|
||||
// 메타 파일 변경 (캐싱기능등으로 인해 위젯등에서 <!--Meta:경로--> 태그를 content에 넣는 경우가 있음
|
||||
$output = preg_replace_callback('/<!--Meta:([a-z0-9\_\/\.\@]+)-->/is', array($this,'transMeta'), $output);
|
||||
|
||||
// rewrite module 사용시 생기는 상대경로에 대한 처리를 함
|
||||
if(Context::isAllowRewrite()) {
|
||||
$url = parse_url(Context::getRequestUri());
|
||||
$real_path = $url['path'];
|
||||
|
||||
$pattern = '/src=("|\'){1}(\.\/)?(files\/attach|files\/cache|files\/faceOff|files\/member_extra_info|modules|common|widgets|widgetstyle|layouts|addons)\/([^"\']+)\.(jpg|jpeg|png|gif)("|\'){1}/s';
|
||||
$output = preg_replace($pattern, 'src=$1'.$real_path.'$3/$4.$5$6', $output);
|
||||
|
||||
$pattern = '/href=("|\'){1}(\?[^"\']+)/s';
|
||||
$output = preg_replace($pattern, 'href=$1'.$real_path.'$2', $output);
|
||||
|
||||
if(Context::get('vid')) {
|
||||
$pattern = '/\/'.Context::get('vid').'\?([^=]+)=/is';
|
||||
$output = preg_replace($pattern, '/?$1=', $output);
|
||||
}
|
||||
}
|
||||
|
||||
// 간혹 background-image에 url(none) 때문에 request가 한번 더 일어나는 경우가 생기는 것을 방지
|
||||
$output = preg_replace('/url\((["\']?)none(["\']?)\)/is', 'none', $output);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__trans_content_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
// 불필요한 정보 제거
|
||||
$output = preg_replace('/member\_\-([0-9]+)/s','member_0',$output);
|
||||
|
||||
// 최종 레이아웃 변환
|
||||
Context::set('content', $output);
|
||||
$output = $oTemplate->compile('./common/tpl', 'common_layout');
|
||||
|
||||
// 사용자 정의 언어 변환
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($output);
|
||||
}
|
||||
if(method_exists($handler, "prepareToPrint")) $handler->prepareToPrint($output);
|
||||
|
||||
// header 출력
|
||||
if($this->gz_enabled) header("Content-Encoding: gzip");
|
||||
if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader();
|
||||
else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader();
|
||||
else $this->_printHTMLHeader();
|
||||
if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader();
|
||||
else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader();
|
||||
else $this->_printHTMLHeader();
|
||||
|
||||
// debugOutput 출력
|
||||
$this->content_size = strlen($output);
|
||||
|
|
@ -165,117 +81,6 @@
|
|||
ModuleHandler::triggerCall('display', 'after', $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief add given .css or .js file names in widget code to Context
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function transMeta($matches) {
|
||||
if(substr($matches[1],'-4')=='.css') Context::addCSSFile($matches[1]);
|
||||
elseif(substr($matches[1],'-3')=='.js') Context::addJSFile($matches[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief add html style code extracted from html body to Context, which will be
|
||||
* printed inside <header></header> later.
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function moveStyleToHeader($matches) {
|
||||
Context::addHtmlHeader($matches[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief produce JSON compliant cotent given a module object.
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _toJSON(&$oModule) {
|
||||
$variables = $oModule->getVariables();
|
||||
$variables['error'] = $oModule->getError();
|
||||
$variables['message'] = $oModule->getMessage();
|
||||
$json = preg_replace("(\r\n|\n)",'\n',json_encode2($variables));
|
||||
return $json;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Produce virtualXML compliant content given a module object.\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _toVirtualXmlDoc(&$oModule) {
|
||||
$error = $oModule->getError();
|
||||
$message = $oModule->getMessage();
|
||||
$redirect_url = $oModule->get('redirect_url');
|
||||
$request_uri = Context::get('xeRequestURI');
|
||||
$request_url = Context::get('xeVirtualRequestUrl');
|
||||
if(substr($request_url,-1)!='/') $request_url .= '/';
|
||||
|
||||
if($error === 0) {
|
||||
if($message != 'success') $output->message = $message;
|
||||
if($redirect_url) $output->url = $redirect_url;
|
||||
else $output->url = $request_uri;
|
||||
} else {
|
||||
if($message != 'fail') $output->message = $message;
|
||||
}
|
||||
|
||||
$html = '<script type="text/javascript">'."\n";
|
||||
if($output->message) $html .= 'alert("'.$output->message.'");'."\n";
|
||||
if($output->url) {
|
||||
$url = preg_replace('/#(.+)$/i','',$output->url);
|
||||
$html .= 'self.location.href = "'.$request_url.'common/tpl/redirect.html?redirect_url='.urlencode($url).'";'."\n";
|
||||
}
|
||||
$html .= '</script>'."\n";
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Produce XML compliant content given a module object.\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _toXmlDoc(&$oModule) {
|
||||
$variables = $oModule->getVariables();
|
||||
|
||||
$xmlDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n";
|
||||
$xmlDoc .= sprintf("<error>%s</error>\n",$oModule->getError());
|
||||
$xmlDoc .= sprintf("<message>%s</message>\n",str_replace(array('<','>','&'),array('<','>','&'),$oModule->getMessage()));
|
||||
|
||||
$xmlDoc .= $this->_makeXmlDoc($variables);
|
||||
|
||||
$xmlDoc .= "</response>";
|
||||
|
||||
return $xmlDoc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief produce XML code given variable object\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _makeXmlDoc($obj) {
|
||||
if(!count($obj)) return;
|
||||
|
||||
$xmlDoc = '';
|
||||
|
||||
foreach($obj as $key => $val) {
|
||||
if(is_numeric($key)) $key = 'item';
|
||||
|
||||
if(is_string($val)) $xmlDoc .= sprintf('<%s><![CDATA[%s]]></%s>%s', $key, $val, $key,"\n");
|
||||
else if(!is_array($val) && !is_object($val)) $xmlDoc .= sprintf('<%s>%s</%s>%s', $key, $val, $key,"\n");
|
||||
else $xmlDoc .= sprintf('<%s>%s%s</%s>%s',$key, "\n", $this->_makeXmlDoc($val), $key, "\n");
|
||||
}
|
||||
|
||||
return $xmlDoc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Produce HTML compliant content given a module object.\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _toHTMLDoc(&$oModule) {
|
||||
// template handler 객체 생성
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
|
||||
// module tpl 변환
|
||||
$template_path = $oModule->getTemplatePath();
|
||||
$tpl_file = $oModule->getTemplateFile();
|
||||
return $oTemplate->compile($template_path, $tpl_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Print debugging message to designated output source depending on the value set to __DEBUG_OUTPUT_. \n
|
||||
|
|
@ -428,42 +233,46 @@
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief print a HTTP HEADER for XML, which is encoded in UTF-8
|
||||
**/
|
||||
function _printXMLHeader() {
|
||||
header("Content-Type: text/xml; charset=UTF-8");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
}
|
||||
/**
|
||||
* @brief print a HTTP HEADER for XML, which is encoded in UTF-8
|
||||
**/
|
||||
function _printXMLHeader() {
|
||||
header("Content-Type: text/xml; charset=UTF-8");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief print a HTTP HEADER for HTML, which is encoded in UTF-8
|
||||
**/
|
||||
function _printHTMLHeader() {
|
||||
header("Content-Type: text/html; charset=UTF-8");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief print a HTTP HEADER for JSON, which is encoded in UTF-8
|
||||
**/
|
||||
function _printJSONHeader() {
|
||||
header("Content-Type: text/html; charset=UTF-8");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief print a HTTP HEADER for HTML, which is encoded in UTF-8
|
||||
**/
|
||||
function _printHTMLHeader() {
|
||||
header("Content-Type: text/html; charset=UTF-8");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief print a HTTP HEADER for JSON, which is encoded in UTF-8
|
||||
**/
|
||||
function _printJSONHeader() {
|
||||
header("Content-Type: text/html; charset=UTF-8");
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
156
classes/display/HTMLDisplayHandler.php
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
<?php
|
||||
|
||||
class HTMLDisplayHandler {
|
||||
/**
|
||||
* @brief Produce HTML compliant content given a module object.\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function toDoc(&$oModule)
|
||||
{
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
|
||||
// compile module tpl
|
||||
$template_path = $oModule->getTemplatePath();
|
||||
$tpl_file = $oModule->getTemplateFile();
|
||||
$output = $oTemplate->compile($template_path, $tpl_file);
|
||||
|
||||
// add #xeAdmin div for adminitration pages
|
||||
if(Context::getResponseMethod() == 'HTML') {
|
||||
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $output = '<div id="xeAdmin">'.$output.'</div>';
|
||||
|
||||
if(Context::get('layout') != 'none') {
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
Context::set('content', $output);
|
||||
|
||||
$layout_path = $oModule->getLayoutPath();
|
||||
$layout_file = $oModule->getLayoutFile();
|
||||
|
||||
$edited_layout_file = $oModule->getEditedLayoutFile();
|
||||
|
||||
// 현재 요청된 레이아웃 정보를 구함
|
||||
$oLayoutModel = &getModel('layout');
|
||||
$layout_info = Context::get('layout_info');
|
||||
$layout_srl = $layout_info->layout_srl;
|
||||
|
||||
// 레이아웃과 연결되어 있으면 레이아웃 컴파일
|
||||
if($layout_srl > 0){
|
||||
|
||||
// faceoff 레이아웃일 경우 별도 처리
|
||||
if($layout_info && $layout_info->type == 'faceoff') {
|
||||
$oLayoutModel->doActivateFaceOff($layout_info);
|
||||
Context::set('layout_info', $layout_info);
|
||||
}
|
||||
|
||||
// 관리자 레이아웃 수정화면에서 변경된 CSS가 있는지 조사
|
||||
$edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_srl);
|
||||
|
||||
if(file_exists($edited_layout_css)) Context::addCSSFile($edited_layout_css,true,'all','',100);
|
||||
}
|
||||
if(!$layout_path) $layout_path = "./common/tpl";
|
||||
if(!$layout_file) $layout_file = "default_layout";
|
||||
$output = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
if(preg_match('/MSIE/i',$_SERVER['HTTP_USER_AGENT']) && (Context::get("_use_ssl")=='optional'||Context::get("_use_ssl")=="always")) {
|
||||
Context::addHtmlFooter('<iframe id="xeTmpIframe" name="xeTmpIframe" style="width:1px;height:1px;position:absolute;top:-2px;left:-2px;"></iframe>');
|
||||
}
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
|
||||
function prepareToPrint(&$output) {
|
||||
if(Context::getResponseMethod() != 'HTML') return;
|
||||
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// body 내의 <style ..></style>를 header로 이동
|
||||
$output = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'_moveStyleToHeader'), $output);
|
||||
|
||||
// 메타 파일 변경 (캐싱기능등으로 인해 위젯등에서 <!--Meta:경로--> 태그를 content에 넣는 경우가 있음
|
||||
$output = preg_replace_callback('/<!--Meta:([a-z0-9\_\/\.\@]+)-->/is', array($this,'_transMeta'), $output);
|
||||
|
||||
// rewrite module 사용시 생기는 상대경로에 대한 처리를 함
|
||||
if(Context::isAllowRewrite()) {
|
||||
$url = parse_url(Context::getRequestUri());
|
||||
$real_path = $url['path'];
|
||||
|
||||
$pattern = '/src=("|\'){1}(\.\/)?(files\/attach|files\/cache|files\/faceOff|files\/member_extra_info|modules|common|widgets|widgetstyle|layouts|addons)\/([^"\']+)\.(jpg|jpeg|png|gif)("|\'){1}/s';
|
||||
$output = preg_replace($pattern, 'src=$1'.$real_path.'$3/$4.$5$6', $output);
|
||||
|
||||
$pattern = '/href=("|\'){1}(\?[^"\']+)/s';
|
||||
$output = preg_replace($pattern, 'href=$1'.$real_path.'$2', $output);
|
||||
|
||||
if(Context::get('vid')) {
|
||||
$pattern = '/\/'.Context::get('vid').'\?([^=]+)=/is';
|
||||
$output = preg_replace($pattern, '/?$1=', $output);
|
||||
}
|
||||
}
|
||||
|
||||
// 간혹 background-image에 url(none) 때문에 request가 한번 더 일어나는 경우가 생기는 것을 방지
|
||||
$output = preg_replace('/url\((["\']?)none(["\']?)\)/is', 'none', $output);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__trans_content_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
// 불필요한 정보 제거
|
||||
$output = preg_replace('/member\_\-([0-9]+)/s','member_0',$output);
|
||||
|
||||
// 최종 레이아웃 변환
|
||||
Context::set('content', $output);
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
if(Mobile::isFromMobilePhone()) {
|
||||
$output = $oTemplate->compile('./common/tpl', 'mobile_layout');
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_loadJSCSS();
|
||||
$output = $oTemplate->compile('./common/tpl', 'common_layout');
|
||||
}
|
||||
|
||||
// 사용자 정의 언어 변환
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief add html style code extracted from html body to Context, which will be
|
||||
* printed inside <header></header> later.
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _moveStyleToHeader($matches) {
|
||||
Context::addHtmlHeader($matches[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief add given .css or .js file names in widget code to Context
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _transMeta($matches) {
|
||||
if(substr($matches[1],'-4')=='.css') Context::addCSSFile($matches[1]);
|
||||
elseif(substr($matches[1],'-3')=='.js') Context::addJSFile($matches[1]);
|
||||
}
|
||||
|
||||
function _loadJSCSS()
|
||||
{
|
||||
$oContext =& Context::getInstance();
|
||||
// add common JS/CSS files
|
||||
$oContext->_addJsFile("./common/js/jquery.js", true, '', -100000);
|
||||
//$oContext->_addJsFile("./common/js/jquery-1.4.2-full.js", true, '', -100000);
|
||||
$oContext->_addJsFile("./common/js/x.js", true, '', -100000);
|
||||
$oContext->_addJsFile("./common/js/common.js", true, '', -100000);
|
||||
$oContext->_addJsFile("./common/js/js_app.js", true, '', -100000);
|
||||
$oContext->_addJsFile("./common/js/xml_handler.js", true, '', -100000);
|
||||
$oContext->_addJsFile("./common/js/xml_js_filter.js", true, '', -100000);
|
||||
$oContext->_addCSSFile("./common/css/default.css", true, 'all', '', -100000);
|
||||
$oContext->_addCSSFile("./common/css/button.css", true, 'all', '', -100000);
|
||||
|
||||
// for admin page, add admin css
|
||||
if(Context::get('module')=='admin' || strpos(Context::get('act'),'Admin')>0){
|
||||
$oContext->_addCSSFile("./modules/admin/tpl/css/font.css", true, 'all', '',10000);
|
||||
$oContext->_addCSSFile("./modules/admin/tpl/css/pagination.css", true, 'all', '', 100001);
|
||||
$oContext->_addCSSFile("./modules/admin/tpl/css/admin.css", true, 'all', '', 100002);
|
||||
}
|
||||
}
|
||||
}
|
||||
12
classes/display/JSONDisplayHandler.php
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?php
|
||||
|
||||
class JSONDisplayHandler {
|
||||
function toDoc(&$oModule)
|
||||
{
|
||||
$variables = $oModule->getVariables();
|
||||
$variables['error'] = $oModule->getError();
|
||||
$variables['message'] = $oModule->getMessage();
|
||||
$json = preg_replace("(\r\n|\n)",'\n',json_encode2($variables));
|
||||
return $json;
|
||||
}
|
||||
}
|
||||
37
classes/display/VirtualXMLDisplayHandler.php
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
class VirtualXMLDisplayHandler {
|
||||
/**
|
||||
* @brief Produce virtualXML compliant content given a module object.\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
|
||||
function toDoc(&$oModule)
|
||||
{
|
||||
$error = $oModule->getError();
|
||||
$message = $oModule->getMessage();
|
||||
$redirect_url = $oModule->get('redirect_url');
|
||||
$request_uri = Context::get('xeRequestURI');
|
||||
$request_url = Context::get('xeVirtualRequestUrl');
|
||||
if(substr($request_url,-1)!='/') $request_url .= '/';
|
||||
|
||||
if($error === 0) {
|
||||
if($message != 'success') $output->message = $message;
|
||||
if($redirect_url) $output->url = $redirect_url;
|
||||
else $output->url = $request_uri;
|
||||
} else {
|
||||
if($message != 'fail') $output->message = $message;
|
||||
}
|
||||
|
||||
$html = '<script type="text/javascript">'."\n";
|
||||
if($output->message) $html .= 'alert("'.$output->message.'");'."\n";
|
||||
if($output->url) {
|
||||
$url = preg_replace('/#(.+)$/i','',$output->url);
|
||||
$html .= 'self.location.href = "'.$request_url.'common/tpl/redirect.html?redirect_url='.urlencode($url).'";'."\n";
|
||||
}
|
||||
$html .= '</script>'."\n";
|
||||
return $html;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
44
classes/display/XMLDisplayHandler.php
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
class XMLDisplayHandler {
|
||||
/**
|
||||
* @brief Produce XML compliant content given a module object.\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function toDoc(&$oModule)
|
||||
{
|
||||
$variables = $oModule->getVariables();
|
||||
|
||||
$xmlDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response>\n";
|
||||
$xmlDoc .= sprintf("<error>%s</error>\n",$oModule->getError());
|
||||
$xmlDoc .= sprintf("<message>%s</message>\n",str_replace(array('<','>','&'),array('<','>','&'),$oModule->getMessage()));
|
||||
|
||||
$xmlDoc .= $this->_makeXmlDoc($variables);
|
||||
|
||||
$xmlDoc .= "</response>";
|
||||
|
||||
return $xmlDoc;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief produce XML code given variable object\n
|
||||
* @param[in] $oModule the module object
|
||||
**/
|
||||
function _makeXmlDoc($obj) {
|
||||
if(!count($obj)) return;
|
||||
|
||||
$xmlDoc = '';
|
||||
|
||||
foreach($obj as $key => $val) {
|
||||
if(is_numeric($key)) $key = 'item';
|
||||
|
||||
if(is_string($val)) $xmlDoc .= sprintf('<%s><![CDATA[%s]]></%s>%s', $key, $val, $key,"\n");
|
||||
else if(!is_array($val) && !is_object($val)) $xmlDoc .= sprintf('<%s>%s</%s>%s', $key, $val, $key,"\n");
|
||||
else $xmlDoc .= sprintf('<%s>%s%s</%s>%s',$key, "\n", $this->_makeXmlDoc($val), $key, "\n");
|
||||
}
|
||||
|
||||
return $xmlDoc;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -141,9 +141,9 @@
|
|||
$value = $this->_getTypeValue($this->type, $this->value);
|
||||
switch($this->type) {
|
||||
case 'homepage' :
|
||||
return sprintf('<a href="%s" onclick="window.open(this.href); return false;">%s</a>', $value, $value);
|
||||
return ($value)?sprintf('<a href="%s" onclick="window.open(this.href); return false;">%s</a>', $value, $value):"";
|
||||
case 'email_address' :
|
||||
return sprintf('<a href="mailto:%s">%s</a>', $value, $value);
|
||||
return ($value)?sprintf('<a href="mailto:%s">%s</a>', $value, $value):"";
|
||||
break;
|
||||
case 'tel' :
|
||||
return sprintf('%s - %s - %s', $value[0],$value[1],$value[2]);
|
||||
|
|
|
|||
|
|
@ -332,11 +332,11 @@
|
|||
* @remarks if the target is moved (when return code is 300~399), this function follows the location specified response header.
|
||||
**/
|
||||
function getRemoteResource($url, $body = null, $timeout = 3, $method = 'GET', $content_type = null, $headers = array(), $cookies = array(), $post_data = array()) {
|
||||
//set_include_path(_XE_PATH_."libs/PEAR");
|
||||
requirePear();
|
||||
require_once('HTTP/Request.php');
|
||||
|
||||
if(__PROXY_SERVER__!==null) {
|
||||
$parsed_url = parse_url(__PROXY_SERVER__);
|
||||
if($parsed_url["host"]) {
|
||||
$oRequest = new HTTP_Request(__PROXY_SERVER__);
|
||||
$oRequest->setMethod('POST');
|
||||
$oRequest->_timeout = $timeout;
|
||||
|
|
|
|||
55
classes/mobile/Mobile.class.php
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
class Mobile {
|
||||
var $ismobile = null;
|
||||
|
||||
function &getInstance() {
|
||||
static $theInstance;
|
||||
if(!isset($theInstance)) $theInstance = new Mobile();
|
||||
return $theInstance;
|
||||
}
|
||||
|
||||
function isFromMobilePhone() {
|
||||
$oMobile =& Mobile::getInstance();
|
||||
return $oMobile->_isFromMobilePhone();
|
||||
}
|
||||
|
||||
function _isFromMobilePhone() {
|
||||
if(isset($this->ismobile)) return $this->ismobile;
|
||||
$db_info = Context::getDBInfo();
|
||||
if($db_info->use_mobile_view != "Y" || Context::get('full_browse') || $_COOKIE["FullBrowse"])
|
||||
{
|
||||
$this->ismobile = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$m = Context::get('m');
|
||||
if($m == "1") {
|
||||
setcookie("mobile", true);
|
||||
$this->ismobile = true;
|
||||
}
|
||||
else if($m === "0") {
|
||||
setcookie("mobile", "");
|
||||
$this->ismobile = false;
|
||||
}
|
||||
else if($_COOKIE["mobile"]) $this->ismobile = true;
|
||||
else {
|
||||
if(preg_match('/(iPod|iPhone|Android|BlackBerry|SCH\-M[0-9]+)/',$_SERVER['HTTP_USER_AGENT']))
|
||||
{
|
||||
setcookie("mobile", true);
|
||||
$this->ismobile = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $this->ismobile;
|
||||
}
|
||||
|
||||
function setMobile($ismobile)
|
||||
{
|
||||
$oMobile =& Mobile::getInstance();
|
||||
$oMobile->ismobile = $ismobile;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
@ -61,7 +61,7 @@
|
|||
// execute addon (before module initialization)
|
||||
$called_position = 'before_module_init';
|
||||
$oAddonController = &getController('addon');
|
||||
$addon_file = $oAddonController->getCacheFilePath();
|
||||
$addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
|
||||
@include($addon_file);
|
||||
}
|
||||
|
||||
|
|
@ -203,13 +203,102 @@
|
|||
$type = $xml_info->action->{$this->act}->type;
|
||||
$kind = strpos(strtolower($this->act),'admin')!==false?'admin':'';
|
||||
if(!$kind && $this->module == 'admin') $kind = 'admin';
|
||||
if($this->module_info->use_mobile != "Y") Mobile::setMobile(false);
|
||||
|
||||
// create a module instance
|
||||
$oModule = &$this->getModuleInstance($this->module, $type, $kind);
|
||||
if(!is_object($oModule)) {
|
||||
$this->error = 'msg_module_is_not_exists';
|
||||
return;
|
||||
}
|
||||
// if(type == view, and case for using mobilephone)
|
||||
if($type == "view" && Mobile::isFromMobilePhone() && Context::isInstalled())
|
||||
{
|
||||
$orig_type = "view";
|
||||
$type = "mobile";
|
||||
// create a module instance
|
||||
$oModule = &$this->getModuleInstance($this->module, $type, $kind);
|
||||
if(!is_object($oModule) || !method_exists($oModule, $this->act)) {
|
||||
$type = $orig_type;
|
||||
Mobile::setMobile(false);
|
||||
$oModule = &$this->getModuleInstance($this->module, $type, $kind);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// create a module instance
|
||||
$oModule = &$this->getModuleInstance($this->module, $type, $kind);
|
||||
}
|
||||
|
||||
if(!is_object($oModule)) {
|
||||
$this->error = 'msg_module_is_not_exists';
|
||||
return;
|
||||
}
|
||||
|
||||
// If there is no such action in the module object
|
||||
if(!isset($xml_info->action->{$this->act}) || !method_exists($oModule, $this->act))
|
||||
{
|
||||
if(!Context::isInstalled())
|
||||
{
|
||||
$this->error = 'msg_invalid_request';
|
||||
return;
|
||||
}
|
||||
|
||||
$forward = null;
|
||||
// 1. Look for the module with action name
|
||||
if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches)) {
|
||||
$module = strtolower($matches[2].$matches[3]);
|
||||
$xml_info = $oModuleModel->getModuleActionXml($module);
|
||||
if($xml_info->action->{$this->act}) {
|
||||
$forward->module = $module;
|
||||
$forward->type = $xml_info->action->{$this->act}->type;
|
||||
$forward->act = $this->act;
|
||||
}
|
||||
}
|
||||
|
||||
if(!$forward)
|
||||
{
|
||||
$forward = $oModuleModel->getActionForward($this->act);
|
||||
}
|
||||
|
||||
if($forward->module && $forward->type && $forward->act && $forward->act == $this->act) {
|
||||
$kind = strpos(strtolower($forward->act),'admin')!==false?'admin':'';
|
||||
$type = $forward->type;
|
||||
$tpl_path = $oModule->getTemplatePath();
|
||||
$orig_module = $oModule;
|
||||
|
||||
if($type == "view" && Mobile::isFromMobilePhone())
|
||||
{
|
||||
$orig_type = "view";
|
||||
$type = "mobile";
|
||||
// create a module instance
|
||||
$oModule = &$this->getModuleInstance($forward->module, $type, $kind);
|
||||
if(!is_object($oModule) || !method_exists($oModule, $this->act)) {
|
||||
$type = $orig_type;
|
||||
Mobile::setMobile(false);
|
||||
$oModule = &$this->getModuleInstance($forward->module, $type, $kind);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$oModule = &$this->getModuleInstance($forward->module, $type, $kind);
|
||||
}
|
||||
$xml_info = $oModuleModel->getModuleActionXml($forward->module);
|
||||
if($this->module == "admin" && $type == "view")
|
||||
{
|
||||
$oMemberModel = &getModel('member');
|
||||
$logged_info = $oMemberModel->getLoggedInfo();
|
||||
if($logged_info->is_admin=='Y') {
|
||||
$orig_module->loadSideBar();
|
||||
$oModule->setLayoutPath("./modules/admin/tpl");
|
||||
$oModule->setLayoutFile("layout.html");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if($xml_info->default_index_act && method_exists($oModule, $xml_info->default_index_act))
|
||||
{
|
||||
$this->act = $xml_info->default_index_act;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->error = 'msg_invalid_request';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$oModule->setAct($this->act);
|
||||
|
||||
|
|
@ -264,11 +353,20 @@
|
|||
}
|
||||
|
||||
// Check if layout_srl exists for the module
|
||||
if($oModule->module_info->layout_srl && !$oModule->getLayoutFile()) {
|
||||
if(Mobile::isFromMobilePhone())
|
||||
{
|
||||
$layout_srl = $oModule->module_info->mlayout_srl;
|
||||
}
|
||||
else
|
||||
{
|
||||
$layout_srl = $oModule->module_info->layout_srl;
|
||||
}
|
||||
|
||||
if($layout_srl && !$oModule->getLayoutFile()) {
|
||||
|
||||
// If layout_srl exists, get information of the layout, and set the location of layout_path/ layout_file
|
||||
$oLayoutModel = &getModel('layout');
|
||||
$layout_info = $oLayoutModel->getLayout($oModule->module_info->layout_srl);
|
||||
$layout_info = $oLayoutModel->getLayout($layout_srl);
|
||||
if($layout_info) {
|
||||
|
||||
// Input extra_vars into $layout_info
|
||||
|
|
@ -369,10 +467,10 @@
|
|||
$instance_name = sprintf("%s%s",$module,"WAP");
|
||||
$class_file = sprintf('%s%s%s.wap.php', _XE_PATH_, $class_path, $module);
|
||||
break;
|
||||
case 'smartphone' :
|
||||
$instance_name = sprintf("%s%s",$module,"SPhone");
|
||||
$class_file = sprintf('%s%s%s.smartphone.php', _XE_PATH_, $class_path, $module);
|
||||
break;
|
||||
case 'mobile' :
|
||||
$instance_name = sprintf("%s%s",$module,"Mobile");
|
||||
$class_file = sprintf("%s%s%s.mobile.php", _XE_PATH_, $class_path, $module);
|
||||
break;
|
||||
case 'class' :
|
||||
$instance_name = $module;
|
||||
$class_file = sprintf('%s%s%s.class.php', _XE_PATH_, $class_path, $module);
|
||||
|
|
|
|||
|
|
@ -246,7 +246,7 @@
|
|||
// addon 실행(called_position 를 before_module_proc로 하여 호출)
|
||||
$called_position = 'before_module_proc';
|
||||
$oAddonController = &getController('addon');
|
||||
$addon_file = $oAddonController->getCacheFilePath();
|
||||
$addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
|
||||
@include($addon_file);
|
||||
|
||||
if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act)) {
|
||||
|
|
@ -261,75 +261,16 @@
|
|||
|
||||
// 실행
|
||||
$output = $this->{$this->act}();
|
||||
|
||||
// act이 없으면 action_forward에서 해당하는 act가 있는지 찾아서 대신 실행
|
||||
} else if(Context::isInstalled()) {
|
||||
$oModuleModel = &getModel('module');
|
||||
|
||||
$forward = null;
|
||||
|
||||
// 현재 요청된 action의 대상 모듈을 찾음
|
||||
// 1. action이름으로 검색 (DB검색 없이 하기 위함)
|
||||
if(preg_match('/^([a-z]+)([A-Z])([a-z0-9\_]+)(.*)$/', $this->act, $matches)) {
|
||||
$module = strtolower($matches[2].$matches[3]);
|
||||
$xml_info = $oModuleModel->getModuleActionXml($module);
|
||||
if($xml_info->action->{$this->act}) {
|
||||
$forward->module = $module;
|
||||
$forward->type = $xml_info->action->{$this->act}->type;
|
||||
$forward->act = $this->act;
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 1번에서 찾지 못하면 action forward를 검색
|
||||
if(!$forward) $forward = $oModuleModel->getActionForward($this->act);
|
||||
|
||||
// 찾아진 forward 모듈이 있으면 실행
|
||||
if($forward->module && $forward->type && $forward->act && $forward->act == $this->act) {
|
||||
|
||||
$kind = strpos(strtolower($forward->act),'admin')!==false?'admin':'';
|
||||
|
||||
$oModule = &getModule($forward->module, $forward->type, $kind);
|
||||
$xml_info = $oModuleModel->getModuleActionXml($forward->module);
|
||||
|
||||
$oModule->setAct($forward->act);
|
||||
$oModule->init();
|
||||
if($oModule->stop_proc) return $this->stop($oModule->getMessage());
|
||||
|
||||
$oModule->setModuleInfo($this->module_info, $xml_info);
|
||||
|
||||
if(isset($xml_info->action->{$forward->act}) && method_exists($oModule, $forward->act)) {
|
||||
$output = $oModule->{$forward->act}();
|
||||
} else {
|
||||
return $this->stop("msg_module_is_not_exists");
|
||||
}
|
||||
|
||||
// forward 모듈의 실행 결과 검사
|
||||
if($oModule->stop_proc) return $this->stop($oModule->getMessage());
|
||||
|
||||
$this->setTemplatePath($oModule->getTemplatePath());
|
||||
$this->setTemplateFile($oModule->getTemplateFile());
|
||||
if($oModule->getLayoutFile()) $this->setLayoutFile($oModule->getLayoutFile());
|
||||
|
||||
$this->adds($oModule->getVariables());
|
||||
$this->setMessage($oModule->getMessage());
|
||||
$this->setError($oModule->getError());
|
||||
|
||||
// forward 모듈을 찾지 못했다면 원 모듈의 default index action을 실행
|
||||
} else if($this->xml_info->default_index_act && method_exists($this, $this->xml_info->default_index_act)) {
|
||||
Context::set('act',$this->act = $this->xml_info->default_index_act);
|
||||
$output = $this->{$this->xml_info->default_index_act}();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// addon 실행(called_position 를 after_module_proc로 하여 호출)
|
||||
$called_position = 'after_module_proc';
|
||||
$oAddonController = &getController('addon');
|
||||
$addon_file = $oAddonController->getCacheFilePath();
|
||||
$addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
|
||||
@include($addon_file);
|
||||
|
||||
if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) {
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
**/
|
||||
|
||||
class XmlJsFilter extends XmlParser {
|
||||
var $version = '0.2.3';
|
||||
var $version = '0.2.4';
|
||||
var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치
|
||||
var $xml_file = NULL; ///< 대상 xml 파일
|
||||
var $js_file = NULL; ///< 컴파일된 js 파일
|
||||
|
|
@ -220,7 +220,8 @@
|
|||
$name = trim($attrs->name);
|
||||
$target = trim($attrs->target);
|
||||
|
||||
if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];";
|
||||
//if($name && $target && ($name != $target)) $js_doc[] = "\t\tparams['{$name}'] = params['{$target}']; delete params['{$target}'];";
|
||||
if($name && $target && ($name != $target)) $js_doc[] = "\t\tif(params['{$target}']) { params['{$name}'] = params['{$target}']; delete params['{$target}']; }";
|
||||
if($name && !in_array($name, $target_list)) $target_list[] = $name;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
/**
|
||||
* @file js_app.js
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @author taggon (gonom9@gmail.com)
|
||||
* @brief XE JavaScript Application Framework (JAF)
|
||||
* @namespace xe
|
||||
* @update 20091120
|
||||
* @update 20100701
|
||||
*/
|
||||
(function($){
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ _xe_base = {
|
|||
*/
|
||||
getApp : function(indexOrName) {
|
||||
indexOrName = (indexOrName||'').toLowerCase();
|
||||
if (typeof _apps[indexOrName] != 'undefined') {
|
||||
if(typeof _apps[indexOrName] != 'undefined') {
|
||||
return _apps[indexOrName];
|
||||
} else {
|
||||
return null;
|
||||
|
|
@ -80,6 +80,8 @@ _xe_base = {
|
|||
_apps[sName].push(oApp);
|
||||
|
||||
oApp.parent = this;
|
||||
|
||||
// TODO : register event
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -95,16 +97,23 @@ _xe_base = {
|
|||
nIndex = $.inArray(oApp, _apps[sName]);
|
||||
if (nIndex >= 0) _apps[sName].splice(nIndex, 1);
|
||||
}
|
||||
|
||||
// TODO : unregister event
|
||||
},
|
||||
|
||||
/**
|
||||
* @brief overrides broadcast method
|
||||
*/
|
||||
broadcast : function(sender, msg, params) {
|
||||
broadcast : function(msg, params) {
|
||||
this._broadcast(this, msg, params);
|
||||
},
|
||||
|
||||
_broadcast : function(sender, msg, params) {
|
||||
for(var i=0; i < _apps.length; i++) {
|
||||
_apps[i]._cast(sender, msg, params);
|
||||
}
|
||||
|
||||
|
||||
// cast to child plugins
|
||||
this._cast(sender, msg, params);
|
||||
}
|
||||
|
|
@ -112,14 +121,25 @@ _xe_base = {
|
|||
|
||||
_app_base = {
|
||||
_plugins : [],
|
||||
_messages : [],
|
||||
_messages : {},
|
||||
|
||||
_fn_level : [],
|
||||
/**
|
||||
* @brief get plugin
|
||||
*/
|
||||
getPlugin : function(sPluginName) {
|
||||
sPluginName = sPluginsName.toLowerCase();
|
||||
if ($.isArray(this._plugins[sPluginName])) {
|
||||
return this._plugins[sPluginName];
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @brief register a plugin instance
|
||||
*/
|
||||
registerPlugin : function(oPlugin) {
|
||||
var self = this;
|
||||
var sName = oPlugin.getName().toLowerCase();
|
||||
|
||||
// check if the plugin is already registered
|
||||
|
|
@ -128,75 +148,27 @@ _app_base = {
|
|||
// push the plugin into the _plugins array
|
||||
this._plugins.push(oPlugin);
|
||||
|
||||
if (!$.isArray(this._plugins[sName])) {
|
||||
this._plugins[sName] = [];
|
||||
}
|
||||
if (!$.isArray(this._plugins[sName])) this._plugins[sName] = [];
|
||||
this._plugins[sName].push(oPlugin);
|
||||
|
||||
// register method pool
|
||||
var msgs = this._messages;
|
||||
$.each(oPlugin, function(key, val){
|
||||
if (!$.isFunction(val)) return true;
|
||||
if (!/^API_((BEFORE_|AFTER_)?[A-Z0-9_]+)$/.test(key)) return true;
|
||||
var fn = function(s,p){ return oPlugin[key](s,p) };
|
||||
fn._fn = val;
|
||||
|
||||
if (!$.isArray(msgs[RegExp.$1])) msgs[RegExp.$1] = [];
|
||||
msgs[RegExp.$1].push(fn);
|
||||
});
|
||||
|
||||
// set the application
|
||||
oPlugin.oApp = this;
|
||||
$.each(oPlugin._binded_fn, function(api, fn){ self.registerHandler(api, fn); });
|
||||
|
||||
// binding
|
||||
oPlugin.cast = function(msg, params) {
|
||||
return oPlugin._cast(msg, params);
|
||||
};
|
||||
oPlugin.oApp = this;
|
||||
|
||||
oPlugin.broadcast = function(msg, params) {
|
||||
oPlugin._broadcast(msg, params);
|
||||
};
|
||||
// TODO : registered event
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* @brief unregister a plugin instance
|
||||
* @brief register api message handler
|
||||
*/
|
||||
unregisterPlugin : function(oPlugin) {
|
||||
var sName = oPlugin.getName().toLowerCase();
|
||||
|
||||
// remove from _plugins array
|
||||
var nIndex = $.inArray(oPlugin, this._plugins);
|
||||
if (nIndex >= 0) this._plugins.splice(nIndex, 1);
|
||||
|
||||
if ($.isArray(this._plugins[sName])) {
|
||||
nIndex = $.inArray(oPlugin, this._plugins);
|
||||
if (nIndex >= 0) this._plugins[sName].splice(nIndex, 1);
|
||||
}
|
||||
|
||||
// unregister method pool
|
||||
var msgs = this._messages;
|
||||
$.each(oPlugin, function(key, val){
|
||||
if (!$.isFunction(val)) return true;
|
||||
if (!/^API_([A-Z0-9_]+)$/.test(key)) return true;
|
||||
if (typeof msgs[RegExp.$1] == 'undefined') return true;
|
||||
|
||||
if ($.isArray(msgs[RegExp.$1])) {
|
||||
msgs[RegExp.$1] = $.grep(msgs[RegExp.$1], function(fn,i){ return (fn._fn != val); });
|
||||
if (!msgs[RegExp.$1].length) {
|
||||
delete msgs[RegExp.$1];
|
||||
}
|
||||
} else {
|
||||
if (msgs[RegExp.$1]._fn == val) {
|
||||
delete msgs[RegExp.$1];
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
// unset the application
|
||||
oPlugin.oApp = null;
|
||||
registerHandler : function(api, func) {
|
||||
var msgs = this._messages; api = api.toUpperCase();
|
||||
if (!$.isArray(msgs[api])) msgs[api] = [];
|
||||
msgs[api].push(func);
|
||||
},
|
||||
|
||||
cast : function(msg, params) {
|
||||
|
|
@ -204,8 +176,8 @@ _app_base = {
|
|||
},
|
||||
|
||||
broadcast : function(sender, msg, params) {
|
||||
if (this.parent && this.parent.broadcast) {
|
||||
this.parent.broadcast(sender, msg, params);
|
||||
if (this.parent && this.parent._broadcast) {
|
||||
this.parent._broadcast(sender, msg, params);
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -223,9 +195,7 @@ _app_base = {
|
|||
|
||||
// main api function
|
||||
var vRet = [], sFn = 'API_'+msg;
|
||||
if ($.isFunction(this[sFn])) vRet.push( this[sFn](sender, params) );
|
||||
if ($.isFunction(aMsg[msg])) vRet.push( aMsg[msg](sender, params) );
|
||||
else if ($.isArray(aMsg[msg])) {
|
||||
if ($.isArray(aMsg[msg])) {
|
||||
for(i=0; i < aMsg[msg].length; i++) {
|
||||
vRet.push( aMsg[msg][i](sender, params) );
|
||||
}
|
||||
|
|
@ -237,7 +207,7 @@ _app_base = {
|
|||
this._cast(sender, 'AFTER_'+msg, params);
|
||||
}
|
||||
|
||||
if (!/^(?:AFTER_|BEFORE_)/.test(msg)) { // top level function
|
||||
if (!/^(?:AFTER|BEFORE)_/.test(msg)) { // top level function
|
||||
return vRet;
|
||||
} else {
|
||||
return $.isArray(vRet)?($.inArray(false, vRet)<0):((typeof vRet=='undefined')?true:!!vRet);
|
||||
|
|
@ -247,14 +217,14 @@ _app_base = {
|
|||
|
||||
_plugin_base = {
|
||||
oApp : null,
|
||||
_binded_fn : [],
|
||||
|
||||
_cast : function(msg, params) {
|
||||
cast : function(msg, params) {
|
||||
if (this.oApp && this.oApp._cast) {
|
||||
return this.oApp._cast(this, msg, params || []);
|
||||
}
|
||||
},
|
||||
_broadcast : function(msg, params) {
|
||||
|
||||
broadcast : function(msg, params) {
|
||||
if (this.oApp && this.oApp.broadcast) {
|
||||
this.oApp.broadcast(this, mag, params || []);
|
||||
}
|
||||
|
|
@ -269,13 +239,26 @@ _plugin_base = {
|
|||
|
||||
function getTypeBase() {
|
||||
var _base = function() {
|
||||
var self = this;
|
||||
var pool = null;
|
||||
|
||||
if ($.isArray(this._plugins)) this._plugins = [];
|
||||
if ($.isArray(this._messages)) this._messages = [];
|
||||
if ($.isArray(this._binded_fn)) this._binded_fn = [];
|
||||
if (this._messages) this._messages = {};
|
||||
else this._binded_fn = {};
|
||||
|
||||
// bind functions
|
||||
$.each(this, function(key, val){
|
||||
if (!$.isFunction(val)) return true;
|
||||
if (!/^API_([A-Z0-9_]+)$/.test(key)) return true;
|
||||
|
||||
if ($.isFunction(this.init)) {
|
||||
this.init.apply(this, arguments);
|
||||
}
|
||||
var api = RegExp.$1;
|
||||
var fn = function(sender, params){ return self[key](sender, params) };
|
||||
|
||||
if (self._messages) self._messages[api] = [fn];
|
||||
else self._binded_fn[api] = fn;
|
||||
});
|
||||
|
||||
if ($.isFunction(this.init)) this.init.apply(this, arguments);
|
||||
};
|
||||
|
||||
return _base;
|
||||
|
|
@ -285,9 +268,9 @@ window.xe = $.extend(_app_base, _xe_base);
|
|||
window.xe.lang = {}; // language repository
|
||||
|
||||
// domready event
|
||||
$(function(){ xe.broadcast(xe, 'ONREADY'); });
|
||||
$(function(){ xe.broadcast('ONREADY'); });
|
||||
|
||||
// load event
|
||||
$(window).load(function(){ xe.broadcast(xe, 'ONLOAD'); });
|
||||
$(window).load(function(){ xe.broadcast('ONLOAD'); });
|
||||
|
||||
})(jQuery);
|
||||
})(jQuery);
|
||||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = 'Module Name';
|
||||
$lang->sid = 'Site Name';
|
||||
$lang->layout = 'Layout';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Widget';
|
||||
$lang->module = 'Module';
|
||||
$lang->skin = 'Theme';
|
||||
|
|
|
|||
|
|
@ -125,6 +125,7 @@
|
|||
$lang->mid = 'ID del Módulo';
|
||||
$lang->sid = 'Site Name';
|
||||
$lang->layout = 'Composición';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Widget';
|
||||
$lang->module = 'Módulo';
|
||||
$lang->skin = 'Tema'; //máscara,
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = 'Nom';
|
||||
$lang->sid = 'Site Name';
|
||||
$lang->layout = 'Mise en Page';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Gadget';
|
||||
$lang->module = 'Module';
|
||||
$lang->skin = 'Habillage';
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = 'Module Name';
|
||||
$lang->sid = 'Site Name';
|
||||
$lang->layout = 'Layout';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Widget';
|
||||
$lang->module = 'Modul';
|
||||
$lang->skin = 'Thema';
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = 'モジュール名';
|
||||
$lang->sid = 'バーチャル(Virtual)サイト名';
|
||||
$lang->layout = 'レイアウト';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'ウィジェット';
|
||||
$lang->module = 'モジュール';
|
||||
$lang->skin = 'スキン';
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = '모듈 이름';
|
||||
$lang->sid = '가상 사이트 이름';
|
||||
$lang->layout = '레이아웃';
|
||||
$lang->mobile_layout = '모바일 레이아웃';
|
||||
$lang->widget = '위젯 ';
|
||||
$lang->module = '모듈';
|
||||
$lang->skin = '스킨';
|
||||
|
|
|
|||
|
|
@ -128,6 +128,7 @@
|
|||
$lang->mid = 'Модиул нэр';
|
||||
$lang->sid = 'Тvр сайтын нэр';
|
||||
$lang->layout = 'Лэйаут';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Вижет ';
|
||||
$lang->module = 'Модиул';
|
||||
$lang->skin = 'Скин';
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = 'Имя Модуля';
|
||||
$lang->sid = 'Site Name';
|
||||
$lang->layout = 'Лейаут';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Виджет';
|
||||
$lang->module = 'Модуль';
|
||||
$lang->skin = 'Тема';
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@
|
|||
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
░░ * @File : common/lang/vi.lang.php ░░
|
||||
░░ * @Author : zero (zero@nzeo.com) ░░
|
||||
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
|
||||
░░ * @Website: http://vietxe.net ░░
|
||||
░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
|
||||
░░ * @Website: http://xpressengine.vn ░░
|
||||
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
*/
|
||||
|
||||
// words for action, which is basically used
|
||||
$lang->cmd_write = 'Gửi bài mới';
|
||||
|
|
@ -84,7 +85,7 @@
|
|||
$lang->password1 = 'Mật khẩu';
|
||||
$lang->password2 = 'Nhập lại mật khẩu';
|
||||
$lang->admin_id = 'Admin ID';
|
||||
$lang->writer = 'Người viết';
|
||||
$lang->writer = 'Người gửi';
|
||||
$lang->user_name = 'Tên thật';
|
||||
$lang->nick_name = 'NickName';
|
||||
$lang->email_address = 'Email';
|
||||
|
|
@ -117,11 +118,12 @@
|
|||
$lang->notify = 'Thông báo';
|
||||
$lang->order_target = 'Đường dẫn đích';
|
||||
$lang->order_type = 'Phân loại theo định dạng';
|
||||
$lang->order_asc = 'Tăng';
|
||||
$lang->order_desc = 'Không tăng';
|
||||
$lang->order_asc = 'Tăng dần';
|
||||
$lang->order_desc = 'Giảm dần';
|
||||
|
||||
$lang->mid = 'Tên Module';
|
||||
$lang->layout = 'Giao diện';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Widget';
|
||||
$lang->module = 'Module';
|
||||
$lang->skin = 'Skin';
|
||||
|
|
@ -210,7 +212,7 @@
|
|||
$lang->msg_invalid_queryid = 'Giá trị ID không hợp lệ';
|
||||
$lang->msg_not_permitted = 'Bạn không được phép truy cập tại đây!';
|
||||
$lang->msg_input_password = 'Xin vui lòng nhập mật khẩu!';
|
||||
$lang->msg_invalid_document = 'Số bài viết không đúng';
|
||||
$lang->msg_invalid_document = 'Bài viết không tồn tại';
|
||||
$lang->msg_invalid_request = 'Yêu cầu không hợp lệ';
|
||||
$lang->msg_invalid_password = 'Mật khẩu không đúng';
|
||||
$lang->msg_error_occured = 'Đã có lỗi xảy ra.';
|
||||
|
|
@ -223,15 +225,15 @@
|
|||
|
||||
$lang->success_registed = 'Chúc mừng bạn đã đăng kí thành công!';
|
||||
$lang->success_declared = 'Đã báo cáo.';
|
||||
$lang->success_updated = 'Đã cập nhật xong.';
|
||||
$lang->success_deleted = 'Đã xóa.';
|
||||
$lang->success_updated = 'Đã cập nhật thành công.';
|
||||
$lang->success_deleted = 'Đã xóa thành công.';
|
||||
$lang->success_voted = 'Đã bình chọn.';
|
||||
$lang->success_blamed = 'Đã phê bình.';
|
||||
$lang->success_moved = 'Đã chuyển.';
|
||||
$lang->success_sended = 'Đã gửi.';
|
||||
$lang->success_reset = 'Đã thiết lập lại.';
|
||||
$lang->success_leaved = 'Tất cả các thành viên đã được xóa.';
|
||||
$lang->success_saved = 'Đã lưu.';
|
||||
$lang->success_sended = 'Đã gửi thành công.';
|
||||
$lang->success_reset = 'Đã thiết lập lại thành công.';
|
||||
$lang->success_leaved = 'Đã xóa tất cả các thành viên.';
|
||||
$lang->success_saved = 'Đã lưu thành công.';
|
||||
|
||||
$lang->fail_to_delete = 'Không thể xóa.';
|
||||
$lang->fail_to_move = 'Không thể chuyển.';
|
||||
|
|
@ -248,7 +250,7 @@
|
|||
$lang->confirm_move = 'Bạn chắc chắn muốn chuyển?';
|
||||
$lang->confirm_reset = 'Bạn chắc chắn muốn thiết lập lại?';
|
||||
$lang->confirm_leave = 'Bạn chắc chắn muốn từ bỏ?';
|
||||
$lang->confirm_update = 'Are you sure to update?';
|
||||
$lang->confirm_update = 'Bạn chắc chắn muốn Update?';
|
||||
|
||||
$lang->column_type = 'Định dạng cột';
|
||||
$lang->column_type_list['text'] = 'Ô nhập liệu';
|
||||
|
|
@ -258,7 +260,7 @@
|
|||
$lang->column_type_list['textarea'] = 'Khu vực nội dung';
|
||||
$lang->column_type_list['checkbox'] = 'Ô chọn (Nhiều lựa chọn)';
|
||||
$lang->column_type_list['select'] = 'Ô chọn (Một lựa chọn)';
|
||||
$lang->column_type_list['kr_zip'] = 'Zip Code (Korean)';
|
||||
$lang->column_type_list['kr_zip'] = 'Mã số bưu điện (Korean)';
|
||||
$lang->column_type_list['date'] = 'Ngày (yyyy/mm/dd)';
|
||||
//$lang->column_type_list['jp_zip'] = 'zip code (Japanese)';
|
||||
$lang->column_name = 'Tên cột';
|
||||
|
|
@ -270,9 +272,9 @@
|
|||
// ftp 관련
|
||||
$lang->ftp_form_title = 'Thông tin FTP';
|
||||
$lang->ftp = 'FTP';
|
||||
$lang->ftp_host = 'FTP hostname';
|
||||
$lang->ftp_port = 'Cổng kết nối:';
|
||||
$lang->about_ftp_password = 'FTP password will not be stored';
|
||||
$lang->ftp_host = 'Tên Host FTP';
|
||||
$lang->ftp_port = 'Cổng kết nối';
|
||||
$lang->about_ftp_password = 'Mật khẩu của FTP sẽ không lưu lại';
|
||||
$lang->cmd_check_ftp_connect = 'Kiểm tra kết nối bằng FTP';
|
||||
$lang->about_ftp_info = "
|
||||
Thông tin tài khoản FTP có thể được sử dụng trong các trường hợp sau: <br />
|
||||
|
|
@ -281,16 +283,16 @@
|
|||
Thông tin tài khoản FTP này sẽ được lưu giữ tại: 'files/config/ftp.config.php'<br />
|
||||
Sau khi cài đặt bạn có thể xóa hoặc thay đổi thông tin tại Bảng điều khiển của Administrator.<br />";
|
||||
|
||||
$lang->msg_safe_mode_ftp_needed = "Nếu safe_mode của PHP mở, bạn nên nhập thông tin của FTP để cài đặt XE.";
|
||||
$lang->msg_ftp_not_connected = "Kết nối bằng FTP không thành công. Xin vui lòng kiểm tra tài khoản và cổng kết nối!";
|
||||
$lang->msg_ftp_invalid_auth_info = "Xác nhận không thành công. Xin vui lòng kiểm tra lại tên sử dụng và mật khẩu.";
|
||||
$lang->msg_safe_mode_ftp_needed = "Nếu safe_mode của PHP mở, bạn có thể cài đặt các thành phần bổ xung cho XE một cách tự động qua FTP.";
|
||||
$lang->msg_ftp_not_connected = "Kết nối bằng FTP không thành công. Xin vui lòng kiểm tra lại thông tin tài khoản và cổng kết nối!";
|
||||
$lang->msg_ftp_invalid_auth_info = "Xác nhận thất bại. Xin vui lòng kiểm tra lại tên sử dụng và mật khẩu.";
|
||||
$lang->msg_ftp_mkdir_fail = "Lỗi khi tạo thư mục. Xin vui lòng kiểm tra lại quyền truy cập FTP.";
|
||||
$lang->msg_ftp_chmod_fail = "CHMOD không thành công. Xin vui lòng kiểm tra lại.";
|
||||
$lang->msg_ftp_chmod_fail = "CHMOD thất bại. Xin vui lòng kiểm tra lại.";
|
||||
$lang->msg_ftp_connect_success = "Đã xác nhận và kết nối thành công tới máy chủ bằng FTP.";
|
||||
|
||||
$lang->ftp_path_title = 'FTP 경로 정보 입력';
|
||||
$lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로';
|
||||
$lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정';
|
||||
$lang->ftp_path_title = 'Hãy nhập thông tin đường dẫn của FTP.';
|
||||
$lang->msg_ftp_installed_realpath = 'Đường dẫn thư mục đã cài đặt XE';
|
||||
$lang->msg_ftp_installed_ftp_realpath = 'Đường dẫn tuyệt đối của thư mục cài đặt XE trên FTP';
|
||||
|
||||
|
||||
// Alert messages for Javascript using by XML filter
|
||||
|
|
@ -299,12 +301,12 @@
|
|||
$lang->filter->equalto = "Giá trị của %s không hợp lệ";
|
||||
$lang->filter->invalid_email = "Định dạng của %s không hợp lệ. Ví dụ: emailname@yahoo.com";
|
||||
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "Định dạng của %s Không hợp lệ.\\nGiá trị hợp lệ bao gồm các kí tự từ a-z, các chữ số và dấu gạch dưới (_).";
|
||||
$lang->filter->invalid_homepage = "Định dạng của %s không hợp lệ. Đúng sẽ là: http://vietxe.net hoặc http://www.vietxe.net";
|
||||
$lang->filter->invalid_homepage = "Định dạng của %s không hợp lệ. Đúng sẽ là: http://xpressengine.vn hoặc http://www.xpressengine.vn";
|
||||
$lang->filter->invalid_korean = "Định dạng của %s không hợp lệ. Nội dung này bắt buộc phải sử dụng tiếng Hàn Quốc";
|
||||
$lang->filter->invalid_korean_number = "Định dạng của %s không hợp lệ. Nội dung này bắt buộc phải sử dụng tiếng Hàn Quốc hoặc các chữ số";
|
||||
$lang->filter->invalid_alpha = "Định dạng của %s không hợp lệ. Chỉ sử dụng các kí tự từ a-z";
|
||||
$lang->filter->invalid_alpha_number = "Định dạng của %s không hợp lệ. Chỉ sử dụng các kí tự từ a-z và các chữ số";
|
||||
$lang->filter->invalid_number = "Định dạng của %s không hợp lệ. Chỉ sử dụng các chữ số";
|
||||
|
||||
$lang->security_warning_embed = "Due to security concern, administrators are not allowed to view embedded items.<BR /> To view them, please use another non-administrator ID.";
|
||||
$lang->security_warning_embed = "Vì vấn đề bảo mật, nên Administrator không được phép xem các mục đã nhúng mã.<BR /> Để xem được chúng, hãy sử dụng một tên truy cập khác không có quyền quản trị.";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = '模块名称';
|
||||
$lang->sid = '站点名称';
|
||||
$lang->layout = '布局';
|
||||
$lang->mobile_layout = '移动版布局';
|
||||
$lang->widget = '控件 ';
|
||||
$lang->module = '模块';
|
||||
$lang->skin = '皮肤';
|
||||
|
|
@ -257,7 +258,7 @@
|
|||
$lang->confirm_move = '确定要移动吗?';
|
||||
$lang->confirm_reset = '确定要初始化吗?';
|
||||
$lang->confirm_leave = '确定要注销吗?';
|
||||
$lang->confirm_update = 'Are you sure to update?';
|
||||
$lang->confirm_update = '确定要更新吗?';
|
||||
|
||||
$lang->column_type = '格式';
|
||||
$lang->column_type_list['text'] = '单行文本输入区(text)';
|
||||
|
|
@ -281,9 +282,9 @@
|
|||
// ftp 相关
|
||||
$lang->ftp_form_title = '设置FTP信息';
|
||||
$lang->ftp = 'FTP';
|
||||
$lang->ftp_host = 'FTP hostname';
|
||||
$lang->ftp_port = 'FTP port';
|
||||
$lang->about_ftp_password = 'FTP password will not be stored';
|
||||
$lang->ftp_host = 'FTP服务器名';
|
||||
$lang->ftp_port = 'FTP端口';
|
||||
$lang->about_ftp_password = 'FTP密码不会被保存。';
|
||||
$lang->cmd_check_ftp_connect = '测试FTP连接';
|
||||
$lang->about_ftp_info = "
|
||||
相关FTP信息,应用于如下几种状况:<br/>
|
||||
|
|
@ -300,9 +301,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 = 'FTP绝对路径设置';
|
||||
|
||||
// 在xml filter使用的 javascript用 alert msg
|
||||
$lang->filter->isnull = '请输入%s';
|
||||
|
|
@ -317,5 +318,5 @@
|
|||
$lang->filter->invalid_alpha_number = '%s只能输入英文或数字';
|
||||
$lang->filter->invalid_number = '%s只能输入数字';
|
||||
|
||||
$lang->security_warning_embed = "Due to security concern, administrators are not allowed to view embedded items.<BR /> To view them, please use another non-administrator ID.";
|
||||
$lang->security_warning_embed = "由于安全问题,不允许用系统管理员ID操作embed对象,请使用其他拥有管理权限的ID操作。";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@
|
|||
$lang->mid = '模組名稱';
|
||||
$lang->sid = '網站名稱';
|
||||
$lang->layout = '版面';
|
||||
$lang->mobile_layout = 'Mobile Layout';
|
||||
$lang->widget = 'Widget';
|
||||
$lang->module = '模組';
|
||||
$lang->skin = '面板';
|
||||
|
|
|
|||
57
common/tpl/mobile_layout.html
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="{Context::getLangType()}" xml:lang="{Context::getLangType()}">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1" />
|
||||
<title>{Context::getBrowserTitle()}</title>
|
||||
{@ $css_files = Context::getCssFile() }
|
||||
<!--@foreach($css_files as $key => $css_file)-->
|
||||
<!--@if($css_file['targetie'])-->
|
||||
<!--[if {$css_file['targetie']}]>
|
||||
<!--@end-->
|
||||
<link rel="stylesheet" href="{$css_file['file']}" type="text/css" charset="UTF-8" media="{$css_file['media']}" />
|
||||
<!--@if($css_file['targetie'])-->
|
||||
<![endif]-->
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
{@ $js_files = Context::getJsFile() }
|
||||
<!--@foreach($js_files as $key => $js_file)-->
|
||||
<!--@if($js_file['targetie'])-->
|
||||
<!--[if {$js_file['targetie']}]>
|
||||
<!--@end-->
|
||||
<script type="text/javascript" src="{$js_file['file']}"></script>
|
||||
<!--@if($js_file['targetie'])-->
|
||||
<![endif]-->
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<!--@if($rss_url)-->
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="{$rss_url}" />
|
||||
<link rel="alternate" type="application/atom+xml" title="Atom" href="{$atom_url}" />
|
||||
<!--@end-->
|
||||
<!--@if($general_rss_url)-->
|
||||
<link rel="alternate" type="application/rss+xml" title="Site RSS" href="{$general_rss_url}" />
|
||||
<link rel="alternate" type="application/atom+xml" title="Site Atom" href="{$general_atom_url}" />
|
||||
<!--@end-->
|
||||
{@ $ssl_actions = Context::getSSLActions() }
|
||||
<script type="text/javascript">//<![CDATA[
|
||||
var current_url = "{$current_url}";
|
||||
var request_uri = "{$request_uri}";
|
||||
<!--@if($vid)-->var xeVid = "{$vid}";<!--@end-->
|
||||
var current_mid = "{$mid}";
|
||||
var waiting_message = "{$lang->msg_call_server}";
|
||||
var ssl_actions = new Array(<!--@if(count($ssl_actions))-->"{implode('","',$ssl_actions)}"<!--@end-->);
|
||||
var default_url = "{Context::getDefaultUrl()}";
|
||||
<!--@if(Context::get("_http_port"))-->var http_port = {Context::get("_http_port")};<!--@end-->
|
||||
<!--@if(Context::get("_https_port"))-->var https_port = {Context::get("_https_port")};<!--@end-->
|
||||
<!--@if(Context::get("_use_ssl") && Context::get("_use_ssl") == "always")-->var enforce_ssl = true;<!--@end-->
|
||||
//]]></script>
|
||||
{Context::getHtmlHeader()}
|
||||
</head>
|
||||
<body{Context::getBodyClass()}>
|
||||
{Context::getBodyHeader()}
|
||||
|
||||
{$content}
|
||||
|
||||
{Context::getHtmlFooter()}
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
* @brief XE의 전체 버전 표기
|
||||
* 이 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 함
|
||||
**/
|
||||
define('__ZBXE_VERSION__', '1.4.2.3');
|
||||
define('__ZBXE_VERSION__', '1.4.3');
|
||||
|
||||
/**
|
||||
* @brief zbXE가 설치된 장소의 base path를 구함
|
||||
|
|
@ -145,6 +145,7 @@
|
|||
require(_XE_PATH_.'classes/template/TemplateHandler.class.php');
|
||||
require(_XE_PATH_.'classes/mail/Mail.class.php');
|
||||
require(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
require(_XE_PATH_.'classes/mobile/Mobile.class.php');
|
||||
if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -677,8 +677,13 @@
|
|||
function _isHackedSrc($src) {
|
||||
if(!$src) return false;
|
||||
if($src) {
|
||||
$target = trim($src);
|
||||
if(preg_match('/(\s|(\&\#)|(script:))/i', $target)) return true;
|
||||
if(preg_match('/data:/i', $target)) return true;
|
||||
|
||||
$url_info = parse_url($src);
|
||||
$query = $url_info['query'];
|
||||
if(!trim($query)) return false;
|
||||
$query = str_replace("&","&",$query);
|
||||
$queries = explode('&', $query);
|
||||
$cnt = count($queries);
|
||||
|
|
@ -690,9 +695,6 @@
|
|||
$val = strtolower(trim(substr($tmp_str,$pos+1)));
|
||||
if( ($key=='module'&&$val=='admin') || ($key=='act'&&preg_match('/admin/i',$val)) ) return true;
|
||||
}
|
||||
|
||||
$target = trim($src);
|
||||
if(preg_match('/(\s|(\&\#)|(script:))/i', $target)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -850,7 +852,7 @@
|
|||
|
||||
function isCrawler($agent = null) {
|
||||
if(!$agent) $agent = $_SERVER['HTTP_USER_AGENT'];
|
||||
$check_agent = array('bot', 'spider', 'google', 'yahoo', 'daum', 'teoma', 'fish', 'hanrss');
|
||||
$check_agent = array('bot', 'spider', 'google', 'yahoo', 'daum', 'teoma', 'fish', 'hanrss', 'facebook');
|
||||
$check_ip = array(
|
||||
'211.245.21.11*' /* mixsh */
|
||||
);
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@
|
|||
<name xml:lang="es">zero</name>
|
||||
<name xml:lang="zh-CN">zero</name>
|
||||
<name xml:lang="zh-TW">zero</name>
|
||||
<name xml:lang="vi">zero</name>
|
||||
<name xml:lang="vi">zero</name>
|
||||
</author>
|
||||
|
||||
<extra_vars>
|
||||
|
|
@ -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>
|
||||
|
|
@ -151,7 +151,7 @@
|
|||
<description xml:lang="ge">Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 23px wird empfohlen).</description>
|
||||
<description xml:lang="ru">Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 23px рекомендуется.)</description>
|
||||
<description xml:lang="es">Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px.</description>
|
||||
<description xml:lang="vi">Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 23px.)</description>
|
||||
<description xml:lang="vi">Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 23px.)</description>
|
||||
</var>
|
||||
<var name="index_url" type="text">
|
||||
<title xml:lang="ko">홈 페이지 URL</title>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
78
m.layouts/default/conf/info.xml
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<layout version="0.2">
|
||||
<title xml:lang="ko">XE 공식 사이트 모바일 레이아웃</title>
|
||||
<title xml:lang="en">XE Official Mobile layout</title>
|
||||
<title xml:lang="zh-CN">官方移动版布局</title>
|
||||
<title xml:lang="zh-TW">XE Mobile 官方版面</title>
|
||||
<description xml:lang="ko">
|
||||
XE 공식 모바일 레이아웃입니다.
|
||||
디자인, 퍼블리싱 : 정찬명
|
||||
레이아웃 제작 : haneul
|
||||
</description>
|
||||
<description xml:lang="en">
|
||||
This layout is the XE Official website layout.
|
||||
Design, HTML/CSS : Chan-Myung Jeong
|
||||
Layout producer : haneul
|
||||
</description>
|
||||
<description xml:lang="zh-CN">
|
||||
官方移动版布局。
|
||||
Design, HTML/CSS : Chan-Myung Jeong
|
||||
Layout producer : haneul
|
||||
</description>
|
||||
<description xml:lang="zh-TW">
|
||||
這是 XE 官方網站版面。
|
||||
Design, HTML/CSS : Chan-Myung Jeong
|
||||
Layout producer : haneul
|
||||
</description>
|
||||
<version>0.1</version>
|
||||
<date>2010-06-10</date>
|
||||
<link>http://xpressengine.com</link>
|
||||
|
||||
<author email_address="developers@xpressengine.com" link="http://xpressengine.com">
|
||||
<name xml:lang="ko">XE</name>
|
||||
<name xml:lang="en">XE</name>
|
||||
<name xml:lang="zh-CN">XE</name>
|
||||
<name xml:lang="zh-TW">XE</name>
|
||||
</author>
|
||||
<extra_vars>
|
||||
<var name="index_title" type="text">
|
||||
<title xml:lang="ko">홈페이지 Title</title>
|
||||
<title xml:lang="en">Homepage Title</title>
|
||||
<title xml:lang="zh-CN">网站标题</title>
|
||||
<title xml:lang="zh-TW">首頁標題</title>
|
||||
</var>
|
||||
<var name="index_url" type="text">
|
||||
<title xml:lang="ko">홈 페이지 URL</title>
|
||||
<title xml:lang="jp">ホームページURL</title>
|
||||
<title xml:lang="zh-CN">主页地址</title>
|
||||
<title xml:lang="zh-TW">主頁網址</title>
|
||||
<title xml:lang="en">Homepage URL</title>
|
||||
<title xml:lang="ge">Homepage URL</title>
|
||||
<title xml:lang="ru">Домашняя страница URL</title>
|
||||
<title xml:lang="es">URL de la página web</title>
|
||||
<title xml:lang="vi">URL Trang chủ</title>
|
||||
<description xml:lang="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
|
||||
<description xml:lang="jp">ロゴをクリックした時に移動するホームページのURLを入力して下さい。</description>
|
||||
<description xml:lang="zh-CN">点击网站LOGO时要移动的页面URL。</description>
|
||||
<description xml:lang="zh-TW">請輸入當用戶按了網站 Logo 後,要前往的頁面網址。</description>
|
||||
<description xml:lang="en">Please input the URL to redirect when user clicks the logo</description>
|
||||
<description xml:lang="ge">Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo</description>
|
||||
<description xml:lang="ru">Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип</description>
|
||||
<description xml:lang="es">Ingresar el URL de la página web para redireccionar al pulsar el logotipo</description>
|
||||
<description xml:lang="vi">Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo</description>
|
||||
</var>
|
||||
</extra_vars>
|
||||
<menus>
|
||||
<menu name="main_menu" maxdepth="3" default="true">
|
||||
<title xml:lang="ko">상단 메뉴</title>
|
||||
<title xml:lang="jp">上段用メニュー</title>
|
||||
<title xml:lang="zh-CN">主菜单</title>
|
||||
<title xml:lang="zh-TW">主選單</title>
|
||||
<title xml:lang="en">Top menu</title>
|
||||
<title xml:lang="ge">Top Menü</title>
|
||||
<title xml:lang="ru">Верхнее меню</title>
|
||||
<title xml:lang="es">Menú Principal</title>
|
||||
<title xml:lang="vi">Menu trên</title>
|
||||
</menu>
|
||||
</menus>
|
||||
</layout>
|
||||
18
m.layouts/default/layout.html
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
<!--%import("mx.css")-->
|
||||
<div class="eg hd">
|
||||
<h1 class="h1"><a href="{$layout_info->index_url}">{$layout_info->index_title}</a></h1>
|
||||
<!--@if($layout_info->menu->main_menu->menu_srl)-->
|
||||
<div class="fr"><a href="{getUrl('act','dispMenuMenu','menu_srl',$layout_info->menu->main_menu->menu_srl)}" class="bn">{$lang->menu}</a></div>
|
||||
<!--@end-->
|
||||
</div>
|
||||
{$content}
|
||||
<ul class="eg ft">
|
||||
<!--@if($is_logged)-->
|
||||
<li class="fl"><a href="{getUrl('act','dispMemberLogout')}">{$lang->cmd_logout}</a></li>
|
||||
<!--@else-->
|
||||
<li class="fl"><a href="{getUrl('act','dispMemberLoginForm')}">{$lang->cmd_login}</a></li>
|
||||
<!--@end-->
|
||||
<li class="fr"><a href="{getUrl('m',0)}">PC</a></li>
|
||||
<li class="fr"><a href="{getUrl('act','dispModuleChangeLang','oldact',$act)}">LANG</a></li>
|
||||
</ul>
|
||||
<p class="cr">{$layout_info->index_title}</p>
|
||||
36
m.layouts/default/mx.css
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
@charset "utf-8";
|
||||
/* Mobile XE */
|
||||
body{margin:0;background:#fff;color:#000;word-wrap:break-word}
|
||||
body,input,textarea,select,button,table{font-family:Tahoma, Geneva, sans-serif}
|
||||
/* Common Class */
|
||||
.fl{float:left}
|
||||
.fr{float:right}
|
||||
.cb{clear:both}
|
||||
/* Edge = Header/Footer */
|
||||
.eg{position:relative;background:#666;*zoom:1}
|
||||
.eg:after{content:"";display:block;clear:both}
|
||||
.eg a{text-decoration:none}
|
||||
/* Header */
|
||||
.hd{padding:10px;border-top:3px solid #444}
|
||||
.hd .h1{float:left;display:inline;color:#fff;font-size:24px;margin:0;font-weight:bold;text-shadow:0 0 3px #000}
|
||||
.hd .h1 a{color:#fff}
|
||||
.hd .bn{font-size:12px}
|
||||
/* Footer */
|
||||
.ft{padding:0 5px;margin:0;list-style:none}
|
||||
.ft a{display:inline-block;padding:10px;color:#fff;text-shadow:0 0 2px #000;font-size:14px;font-weight:bold}
|
||||
/* Copyright */
|
||||
.cr{margin:0;padding:5px 15px;text-align:center;background:#444;color:#ccc;text-shadow:0 0 2px #000;font-size:12px;font-weight:bold}
|
||||
/* Search */
|
||||
.sh{position:relative;text-align:center}
|
||||
.sh .itx{width:80%;background:none;border:5px solid #333;margin:10px}
|
||||
/* Definition */
|
||||
.dl{margin:10px}
|
||||
.dl dt{margin:0;padding:0;font-weight:bold}
|
||||
.dl dd{margin:0 0 10px 0;padding:0;color:#666}
|
||||
/* Graph Horizontal */
|
||||
.gh{list-style:none;margin:10px;padding:0}
|
||||
.gh li{position:relative;margin:5px 0}
|
||||
.gh .bar{position:absolute;z-index:-1;height:100%;width:0;background:#ddd}
|
||||
.gh em{color:#f60}
|
||||
/* Button */
|
||||
.bn{display:inline-block;padding:5px 10px;font-weight:normal;font-size:14px;border:1px solid #333;background:#eee;color:#000;text-shadow:1px 1px 0 #fff;box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;-webkit-box-shadow:0 0 3px #333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;text-decoration:none}
|
||||
|
|
@ -24,15 +24,17 @@
|
|||
|
||||
// addon값을 받아옴
|
||||
$addon = Context::get('addon');
|
||||
$type = Context::get('type');
|
||||
if(!$type) $type = "pc";
|
||||
if($addon) {
|
||||
// 활성화 되어 있으면 비활성화 시킴
|
||||
if($oAddonModel->isActivatedAddon($addon, $site_module_info->site_srl)) $this->doDeactivate($addon, $site_module_info->site_srl);
|
||||
if($oAddonModel->isActivatedAddon($addon, $site_module_info->site_srl, $type)) $this->doDeactivate($addon, $site_module_info->site_srl, $type);
|
||||
|
||||
// 비활성화 되어 있으면 활성화 시킴
|
||||
else $this->doActivate($addon, $site_module_info->site_srl);
|
||||
else $this->doActivate($addon, $site_module_info->site_srl, $type);
|
||||
}
|
||||
|
||||
$this->makeCacheFile($site_module_info->site_srl);
|
||||
$this->makeCacheFile($site_module_info->site_srl, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -50,7 +52,8 @@
|
|||
|
||||
$this->doSetup($addon_name, $args, $site_module_info->site_srl);
|
||||
|
||||
$this->makeCacheFile($site_module_info->site_srl);
|
||||
$this->makeCacheFile($site_module_info->site_srl, "pc");
|
||||
$this->makeCacheFile($site_module_info->site_srl, "mobile");
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -71,9 +74,10 @@
|
|||
* @brief 애드온 활성화
|
||||
* addons라는 테이블에 애드온의 활성화 상태를 on 시켜줌
|
||||
**/
|
||||
function doActivate($addon, $site_srl = 0) {
|
||||
function doActivate($addon, $site_srl = 0, $type = "pc") {
|
||||
$args->addon = $addon;
|
||||
$args->is_used = 'Y';
|
||||
if($type == "pc") $args->is_used = 'Y';
|
||||
else $args->is_used_m = "Y";
|
||||
if(!$site_srl) return executeQuery('addon.updateAddon', $args);
|
||||
$args->site_srl = $site_srl;
|
||||
return executeQuery('addon.updateSiteAddon', $args);
|
||||
|
|
@ -84,9 +88,10 @@
|
|||
*
|
||||
* addons라는 테이블에 애드온의 이름을 제거하는 것으로 비활성화를 시키게 된다
|
||||
**/
|
||||
function doDeactivate($addon, $site_srl = 0) {
|
||||
function doDeactivate($addon, $site_srl = 0, $type = "pc") {
|
||||
$args->addon = $addon;
|
||||
$args->is_used = 'N';
|
||||
if($type == "pc") $args->is_used = 'N';
|
||||
else $args->is_used_m = 'N';
|
||||
if(!$site_srl) return executeQuery('addon.updateAddon', $args);
|
||||
$args->site_srl = $site_srl;
|
||||
return executeQuery('addon.updateSiteAddon', $args);
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
for($i=0;$i<$searched_count;$i++) {
|
||||
// 애드온의 이름
|
||||
$addon_name = $searched_list[$i];
|
||||
if($addon_name == "smartphone") continue;
|
||||
|
||||
// 애드온의 경로 (files/addons가 우선)
|
||||
$path = $this->getAddonPath($addon_name);
|
||||
|
|
@ -49,6 +50,7 @@
|
|||
$info->addon = $addon_name;
|
||||
$info->path = $path;
|
||||
$info->activated = false;
|
||||
$info->mactivated = false;
|
||||
|
||||
// DB에 입력되어 있는지 확인
|
||||
if(!in_array($addon_name, array_keys($inserted_addons))) {
|
||||
|
|
@ -59,6 +61,7 @@
|
|||
// 활성화 되어 있는지 확인
|
||||
} else {
|
||||
if($inserted_addons[$addon_name]->is_used=='Y') $info->activated = true;
|
||||
if($inserted_addons[$addon_name]->is_used_m=='Y') $info->mactivated = true;
|
||||
}
|
||||
|
||||
$list[] = $info;
|
||||
|
|
@ -291,12 +294,16 @@
|
|||
/**
|
||||
* @brief 애드온이 활성화 되어 있는지 체크
|
||||
**/
|
||||
function isActivatedAddon($addon, $site_srl = 0) {
|
||||
function isActivatedAddon($addon, $site_srl = 0, $type = "pc") {
|
||||
$args->addon = $addon;
|
||||
if(!$site_srl) $output = executeQuery('addon.getAddonIsActivated', $args);
|
||||
if(!$site_srl) {
|
||||
if($type == "pc") $output = executeQuery('addon.getAddonIsActivated', $args);
|
||||
else $output = executeQuery('addon.getMAddonIsActivated', $args);
|
||||
}
|
||||
else {
|
||||
$args->site_srl = $site_srl;
|
||||
$output = executeQuery('addon.getSiteAddonIsActivated', $args);
|
||||
if($type == "pc") $output = executeQuery('addon.getSiteAddonIsActivated', $args);
|
||||
else $output = executeQuery('addon.getSiteMAddonIsActivated', $args);
|
||||
}
|
||||
if($output->data->count>0) return true;
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@
|
|||
|
||||
class addon extends ModuleObject {
|
||||
|
||||
var $cache_file = "./files/cache/activated_addons.cache.php";
|
||||
|
||||
/**
|
||||
* @brief 설치시 추가 작업이 필요할시 구현
|
||||
**/
|
||||
|
|
@ -42,7 +40,9 @@
|
|||
* @brief 설치가 이상이 없는지 체크하는 method
|
||||
**/
|
||||
function checkUpdate() {
|
||||
if(file_exists($this->cache_file)) FileHandler::removeFile($this->cache_file);
|
||||
$oDB = &DB::getInstance();
|
||||
if(!$oDB->isColumnExists("addons", "is_used_m")) return true;
|
||||
if(!$oDB->isColumnExists("addons_site", "is_used_m")) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -50,6 +50,13 @@
|
|||
* @brief 업데이트 실행
|
||||
**/
|
||||
function moduleUpdate() {
|
||||
$oDB = &DB::getInstance();
|
||||
if(!$oDB->isColumnExists("addons", "is_used_m")) {
|
||||
$oDB->addColumn("addons", "is_used_m", "char", 1, "N", true);
|
||||
}
|
||||
if(!$oDB->isColumnExists("addons_site", "is_used_m")) {
|
||||
$oDB->addColumn("addons_site", "is_used_m", "char", 1, "N", true);
|
||||
}
|
||||
return new Object();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,20 +17,20 @@
|
|||
/**
|
||||
* @brief 메인/ 가상 사이트별 애드온 캐시 파일의 위치를 구함
|
||||
**/
|
||||
function getCacheFilePath() {
|
||||
function getCacheFilePath($type = "pc") {
|
||||
$site_module_info = Context::get('site_module_info');
|
||||
$site_srl = $site_module_info->site_srl;
|
||||
|
||||
$addon_path = _XE_PATH_.'files/cache/addons/';
|
||||
|
||||
if($site_srl) $addon_file = $addon_path.$site_srl.'.acivated_addons.cache.php';
|
||||
else $addon_file = $addon_path.'acivated_addons.cache.php';
|
||||
if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php';
|
||||
else $addon_file = $addon_path.$type.'acivated_addons.cache.php';
|
||||
|
||||
if($this->addon_file_called) return $addon_file;
|
||||
$this->addon_file_called = true;
|
||||
|
||||
if(!is_dir($addon_path)) FileHandler::makeDir($addon_path);
|
||||
if(!file_exists($addon_file)) $this->makeCacheFile($site_srl);
|
||||
if(!file_exists($addon_file)) $this->makeCacheFile($site_srl, $type);
|
||||
return $addon_file;
|
||||
}
|
||||
|
||||
|
|
@ -120,13 +120,15 @@
|
|||
/**
|
||||
* @brief 캐시 파일 생성
|
||||
**/
|
||||
function makeCacheFile($site_srl = 0) {
|
||||
function makeCacheFile($site_srl = 0, $type = "pc") {
|
||||
// 모듈에서 애드온을 사용하기 위한 캐시 파일 생성
|
||||
$buff = "";
|
||||
$oAddonModel = &getAdminModel('addon');
|
||||
$addon_list = $oAddonModel->getInsertedAddons($site_srl);
|
||||
$addon_list = $oAddonModel->getInsertedAddons($site_srl, $type);
|
||||
foreach($addon_list as $addon => $val) {
|
||||
if($val->is_used != 'Y' || !is_dir(_XE_PATH_.'addons/'.$addon) ) continue;
|
||||
if($val->addon == "smartphone") continue;
|
||||
if(!is_dir(_XE_PATH_.'addons/'.$addon)) continue;
|
||||
if(($type == "pc" && $val->is_used != 'Y') || ($type == "mobile" && $val->is_used_m != 'Y')) continue;
|
||||
|
||||
$extra_vars = unserialize($val->extra_vars);
|
||||
$mid_list = $extra_vars->mid_list;
|
||||
|
|
@ -146,8 +148,8 @@
|
|||
$addon_path = _XE_PATH_.'files/cache/addons/';
|
||||
if(!is_dir($addon_path)) FileHandler::makeDir($addon_path);
|
||||
|
||||
if($site_srl) $addon_file = $addon_path.$site_srl.'.acivated_addons.cache.php';
|
||||
else $addon_file = $addon_path.'acivated_addons.cache.php';
|
||||
if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php';
|
||||
else $addon_file = $addon_path.$type.'acivated_addons.cache.php';
|
||||
|
||||
FileHandler::writeFile($addon_file, $buff);
|
||||
}
|
||||
|
|
|
|||
12
modules/addon/queries/getMAddonIsActivated.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<query id="getMAddonIsActivated" action="select">
|
||||
<tables>
|
||||
<table name="addons" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="addon" var="addon" notnull="notnull" />
|
||||
<condition operation="equal" column="is_used_m" default="Y" notnull="notnull" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
<query id="getAddonIsActivated" action="select">
|
||||
<query id="getSiteAddonIsActivated" action="select">
|
||||
<tables>
|
||||
<table name="addons_site" />
|
||||
</tables>
|
||||
|
|
|
|||
13
modules/addon/queries/getSiteMAddonIsActivated.xml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
<query id="getSiteMAddonIsActivated" action="select">
|
||||
<tables>
|
||||
<table name="addons_site" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="count(*)" alias="count" />
|
||||
</columns>
|
||||
<conditions>
|
||||
<condition operation="equal" column="site_srl" var="site_srl" notnull="notnull" />
|
||||
<condition operation="equal" column="addon" var="addon" notnull="notnull" pipe="and" />
|
||||
<condition operation="equal" column="is_used_m" default="Y" notnull="notnull" pipe="and" />
|
||||
</conditions>
|
||||
</query>
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
</tables>
|
||||
<columns>
|
||||
<column name="is_used" var="is_used" />
|
||||
<column name="is_used_m" var="is_used_m" />
|
||||
<column name="extra_vars" var="extra_vars" />
|
||||
</columns>
|
||||
<conditions>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
</tables>
|
||||
<columns>
|
||||
<column name="is_used" var="is_used" />
|
||||
<column name="is_used_m" var="is_used_m" />
|
||||
<column name="extra_vars" var="extra_vars" />
|
||||
</columns>
|
||||
<conditions>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<table name="addons">
|
||||
<column name="addon" type="varchar" size="250" notnull="notnull" primary_key="primary_key" />
|
||||
<column name="is_used" type="char" size="1" default="Y" notnull="notnull" />
|
||||
<column name="is_used_m" type="char" size="1" default="N" notnull="notnull" />
|
||||
<column name="extra_vars" type="text" />
|
||||
<column name="regdate" type="date" index="idx_regdate" />
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
<column name="site_srl" type="number" size="11" notnull="notnull" default="0" unique="unique_addon_site" />
|
||||
<column name="addon" type="varchar" size="250" notnull="notnull" unique="unique_addon_site" />
|
||||
<column name="is_used" type="char" size="1" default="Y" notnull="notnull" />
|
||||
<column name="is_used_m" type="char" size="1" default="N" notnull="notnull" />
|
||||
<column name="extra_vars" type="text" />
|
||||
<column name="regdate" type="date" index="idx_regdate" />
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -9,8 +9,10 @@ function doToggleAddon(addon) {
|
|||
}
|
||||
|
||||
// 관리자 제어판 페이지용
|
||||
function doToggleAddonInAdmin(obj, addon) {
|
||||
function doToggleAddonInAdmin(obj, addon, type) {
|
||||
var params = new Array();
|
||||
params['addon'] = addon;
|
||||
if(typeof(type) == "undefined") type = "pc";
|
||||
params['type'] = type;
|
||||
exec_xml('addon','procAddonAdminToggleActivate',params,function() { if(/Active/.test(obj.className)) obj.className = "buttonSet buttonDisable"; else obj.className = "buttonSet buttonActive"; } );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,23 +7,8 @@
|
|||
|
||||
class adminAdminView extends admin {
|
||||
|
||||
/**
|
||||
* @brief Initilization
|
||||
* @return none
|
||||
**/
|
||||
function init() {
|
||||
$this->setTemplatePath($this->module_path.'tpl');
|
||||
|
||||
// forbit access if the user is not an administrator
|
||||
$oMemberModel = &getModel('member');
|
||||
$logged_info = $oMemberModel->getLoggedInfo();
|
||||
if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator");
|
||||
|
||||
// change into administration layout
|
||||
$this->setLayoutPath($this->getTemplatePath());
|
||||
$this->setLayoutFile('layout.html');
|
||||
|
||||
// Retrieve the list of installed modules
|
||||
function loadSideBar()
|
||||
{
|
||||
$oModuleModel = &getModel('module');
|
||||
$installed_module_list = $oModuleModel->getModulesXmlInfo();
|
||||
|
||||
|
|
@ -64,6 +49,32 @@
|
|||
if(count($package_modules)) $package_modules[count($package_modules)-1]->position = 'end';
|
||||
Context::set('package_modules', $package_modules);
|
||||
Context::set('installed_modules', $installed_modules);
|
||||
Context::setBrowserTitle("XE Admin Page");
|
||||
|
||||
// add javascript tooltip plugin - gony
|
||||
Context::loadJavascriptPlugin('qtip');
|
||||
Context::loadJavascriptPlugin('watchinput');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initilization
|
||||
* @return none
|
||||
**/
|
||||
function init() {
|
||||
|
||||
// forbit access if the user is not an administrator
|
||||
$oMemberModel = &getModel('member');
|
||||
$logged_info = $oMemberModel->getLoggedInfo();
|
||||
if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator");
|
||||
|
||||
// change into administration layout
|
||||
$this->setTemplatePath($this->module_path.'tpl');
|
||||
$this->setLayoutPath($this->getTemplatePath());
|
||||
$this->setLayoutFile('layout.html');
|
||||
|
||||
$this->loadSideBar();
|
||||
|
||||
// Retrieve the list of installed modules
|
||||
|
||||
$db_info = Context::getDBInfo();
|
||||
|
||||
|
|
@ -78,11 +89,6 @@
|
|||
if($db_info->http_port) Context::set('http_port', $db_info->http_port);
|
||||
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');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -268,6 +274,8 @@
|
|||
Context::set('langs', Context::loadLangSupported());
|
||||
|
||||
Context::set('lang_selected', Context::loadLangSelected());
|
||||
|
||||
Context::set('use_mobile_view', $db_info->use_mobile_view=="Y"?'Y':'N');
|
||||
|
||||
$ftp_info = Context::getFTPInfo();
|
||||
Context::set('ftp_info', $ftp_info);
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
<title xml:lang="zh-TW">管理員模組</title>
|
||||
<description xml:lang="ko">각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다.</description>
|
||||
<description xml:lang="en">This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator.</description>
|
||||
<description xml:lang="vi">Module này hiển thị những đặc tính của những Module, và cho phép bạn sử dụng một chút quyền của Administrator bở việc áp dụng giao diện cho Administrator.</description>
|
||||
<description xml:lang="vi">Module này hiển thị thông tin của những Module đã được cài đặt, và cho phép bạn sử dụng quyền của Administrator để thiết lập giao diện.</description>
|
||||
<description xml:lang="es">Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador.</description>
|
||||
<description xml:lang="zh-CN">列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。</description>
|
||||
<description xml:lang="jp">各モジュールの機能を表示し、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。</description>
|
||||
|
|
|
|||
|
|
@ -82,5 +82,8 @@
|
|||
$lang->ftp_get_list = "Get List";
|
||||
$lang->ftp_remove_info = 'Remove FTP Info.';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.';
|
||||
$lang->mobile_view = 'Mobile View';
|
||||
$lang->about_mobile_view = 'Mobile View will display the best layout when accessing with smartphones.';
|
||||
$lang->autoinstall = 'EasyInstall';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -84,5 +84,8 @@
|
|||
$lang->ftp_get_list = "Get List";
|
||||
$lang->ftp_remove_info = 'Remove FTP Info.';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.';
|
||||
$lang->mobile_view = 'Use Mobile View';
|
||||
$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.';
|
||||
$lang->autoinstall = 'EasyInstall';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -83,5 +83,8 @@
|
|||
$lang->ftp_get_list = "Get List";
|
||||
$lang->ftp_remove_info = 'Remove FTP Info.';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.';
|
||||
$lang->mobile_view = 'Use Mobile View';
|
||||
$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.';
|
||||
$lang->autoinstall = 'EasyInstall';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -82,5 +82,8 @@
|
|||
$lang->ftp_get_list = "Get List";
|
||||
$lang->ftp_remove_info = 'Remove FTP Info.';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.';
|
||||
$lang->mobile_view = 'Use Mobile View';
|
||||
$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.';
|
||||
$lang->autoinstall = 'イージーインストール';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -83,4 +83,8 @@
|
|||
$lang->ftp_remove_info = 'FTP 정보 삭제';
|
||||
$lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->mobile_view = '모바일 뷰 사용';
|
||||
$lang->about_mobile_view = '스마트폰 등을 이용하여 접속할 때 모바일 화면에 최적화된 레이아웃을 이용하도록 합니다.';
|
||||
|
||||
$lang->autoinstall = '쉬운 설치';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -81,5 +81,8 @@
|
|||
$lang->ftp_get_list = 'Get List';
|
||||
$lang->ftp_remove_info = 'Remove FTP Info';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->msg_self_restart_cache_engine = 'Please restart Memcached or cache daemon.';
|
||||
$lang->mobile_view = 'Use Mobile View';
|
||||
$lang->about_mobile_view = 'If accessing with a smartphone, display content with mobile layout.';
|
||||
$lang->autoinstall = 'EasyInstall';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@
|
|||
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
░░ * @File : common/lang/vi.lang.php ░░
|
||||
░░ * @Author : zero (zero@nzeo.com) ░░
|
||||
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
|
||||
░░ * @Website: http://vietxe.net ░░
|
||||
░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
|
||||
░░ * @Website: http://xpressengine.vn ░░
|
||||
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
*/
|
||||
|
||||
$lang->admin_info = 'Thông tin Administrator';
|
||||
$lang->admin_index = 'Trang chủ Admin';
|
||||
|
|
@ -36,7 +37,7 @@
|
|||
$lang->current_version = "Phiên bản";
|
||||
$lang->current_path = "Thư mục cài đặt";
|
||||
$lang->released_version = "Phiên bản mới nhất";
|
||||
$lang->about_download_link = "Đã có phiên bản mới nhất của Zerboard XE.\n hãy bấm vào Link để Download.";
|
||||
$lang->about_download_link = "Đã có phiên bản mới nhất của XE.\n Hãy bấm vào Link để Download.";
|
||||
|
||||
$lang->item_module = "Danh sách Module";
|
||||
$lang->item_addon = "Danh sách Addon";
|
||||
|
|
@ -57,7 +58,7 @@
|
|||
$lang->msg_default_act_is_null = 'Phím tắt đã không được tạo, bởi vì bạn không được đặt quyền là quản lý toàn diện.';
|
||||
|
||||
$lang->welcome_to_xe = 'Chào mừng bạn đến với trang quản lý của XE!';
|
||||
$lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\nChúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng.";
|
||||
$lang->about_admin_page = "Trang Admin này vẫn đang được phát triển,\n Chúng tôi sẽ thêm vào những nội dung chủ yếu từ những ý kiến của người sử dụng.";
|
||||
$lang->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại.";
|
||||
|
||||
$lang->xe_license = 'XE sử dụng giấy phép GPL';
|
||||
|
|
@ -80,9 +81,12 @@
|
|||
$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";
|
||||
$lang->ftp_get_list = "Get List";
|
||||
$lang->ftp_remove_info = 'Remove FTP Info.';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->sftp = "Sử dụng SFTP";
|
||||
$lang->ftp_get_list = "Nhận danh sách";
|
||||
$lang->ftp_remove_info = 'Xóa thông tin FTP.';
|
||||
$lang->msg_ftp_invalid_path = 'Không tìm thấy thông tin của thư mục bạn đã nhập trên FTP.';
|
||||
$lang->msg_self_restart_cache_engine = 'Hãy thiết lập lại bộ nhớ Cache hoặc Deamon Cache.';
|
||||
$lang->mobile_view = 'Xem bằng di động';
|
||||
$lang->about_mobile_view = 'Nếu truy cập bằng thiết bị di động, nội dung sẽ được bố trí theo từng loại thiết bị.';
|
||||
$lang->autoinstall = 'Cập nhật tự động';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file zh-CN.lang.php
|
||||
* @author zero (zero@nzeo.com)
|
||||
* @brief 简体中文语言包 (只收录基本内容)
|
||||
* @brief 简体中文语言包
|
||||
**/
|
||||
|
||||
$lang->admin_info = '管理员信息';
|
||||
|
|
@ -78,9 +78,12 @@
|
|||
$lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。";
|
||||
$lang->use_db_session = 'DB储存认证会话';
|
||||
$lang->about_db_session = '用DB储存认证时的PHP会话。<br/>服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。<br/>只是无法统计在线会员。';
|
||||
$lang->sftp = "Use SFTP";
|
||||
$lang->ftp_get_list = "Get List";
|
||||
$lang->ftp_remove_info = 'Remove FTP Info.';
|
||||
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.';
|
||||
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
|
||||
$lang->sftp = '使用sSFTP';
|
||||
$lang->ftp_get_list = '载入列表';
|
||||
$lang->ftp_remove_info = '删除FTP信息';
|
||||
$lang->msg_ftp_invalid_path = '无法读取FTP路径。';
|
||||
$lang->msg_self_restart_cache_engine = '请重新启动Memcached或CacheDaemon。';
|
||||
$lang->mobile_view = '开启移动版';
|
||||
$lang->about_mobile_view = '为智能手机访问网站,提供最佳视觉效果。';
|
||||
$lang->autoinstall = '安装·更新';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -83,4 +83,7 @@
|
|||
$lang->ftp_remove_info = '移除 FTP 資料';
|
||||
$lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。';
|
||||
$lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。';
|
||||
$lang->mobile_view = '手機瀏覽';
|
||||
$lang->about_mobile_view = '使用手機瀏覽時將會顯示最適當的畫面。';
|
||||
$lang->autoinstall = '自動安裝';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -15,7 +15,8 @@
|
|||
</li>
|
||||
</ul>
|
||||
<ul class="lnb">
|
||||
<li class="core <!--@if(!$package_selected)-->selected<!--@end-->"><a href="{getUrl('','module','admin')}">{$lang->control_panel}</a></li>
|
||||
<li class="core <!--@if(!$package_selected && !strstr($act,'Autoinstall'))-->selected<!--@end-->"><a href="{getUrl('','module','admin')}">{$lang->control_panel}</a></li>
|
||||
<li class="core <!--@if(strstr($act, 'Autoinstall'))-->selected<!--@end-->"><a href="{getUrl('','module','admin','act','dispAutoinstallAdminIndex')}">{$lang->autoinstall}</a></li>
|
||||
|
||||
<!--@foreach($package_modules as $key => $val)-->
|
||||
<li class="{$val->position} <!--@if($val->selected)-->selected<!--@end-->"><a href="{getUrl('','module','admin','act',$val->index_act)}" title="{trim($val->description)}">{$val->title}</a></li>
|
||||
|
|
|
|||
|
|
@ -114,6 +114,13 @@
|
|||
<p>{$lang->about_server_ports}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->mobile_view}</div></th>
|
||||
<td>
|
||||
<input type="checkbox" name="use_mobile_view" value="Y" <!--@if($use_mobile_view=='Y')-->checked="checked"<!--@end--> />
|
||||
<p>{$lang->about_mobile_view}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2" class="button">
|
||||
<span class="button black strong"><input type="submit" value="{$lang->cmd_save}" /></span>
|
||||
|
|
|
|||
|
|
@ -89,7 +89,8 @@
|
|||
<tr>
|
||||
<th><div>{$lang->addon}</div></th>
|
||||
<th><div>{$lang->cmd_setup}</div></th>
|
||||
<th><div>{$lang->status}</div></th>
|
||||
<th><div>PC</div></th>
|
||||
<th><div>Mobile</div></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
|
@ -104,6 +105,13 @@
|
|||
<a href="#" onclick="doToggleAddonInAdmin(this, '{$val->addon}');return false;" title="{htmlspecialchars($lang->notuse)}" class="buttonSet buttonDisable"><span>{$lang->notuse}</span></a>
|
||||
<!--@end-->
|
||||
</td>
|
||||
<td>
|
||||
<!--@if($val->mactivated)-->
|
||||
<a href="#" onclick="doToggleAddonInAdmin(this, '{$val->addon}', 'mobile');return false;" title="{htmlspecialchars($lang->use)}" class="buttonSet buttonActive"><span>{$lang->use}</span></a>
|
||||
<!--@else-->
|
||||
<a href="#" onclick="doToggleAddonInAdmin(this, '{$val->addon}', 'mobile');return false;" title="{htmlspecialchars($lang->notuse)}" class="buttonSet buttonDisable"><span>{$lang->notuse}</span></a>
|
||||
<!--@end-->
|
||||
</td>
|
||||
</tr>
|
||||
<!--@end-->
|
||||
</tbody>
|
||||
|
|
|
|||
|
|
@ -67,16 +67,19 @@
|
|||
$config_file = null;
|
||||
switch($type)
|
||||
{
|
||||
case "module":
|
||||
case "addon":
|
||||
case "layout":
|
||||
case "widget":
|
||||
case "m.layout":
|
||||
$type = "layout";
|
||||
case "module":
|
||||
case "addon":
|
||||
case "layout":
|
||||
case "widget":
|
||||
$config_file = "/conf/info.xml";
|
||||
break;
|
||||
case "component":
|
||||
$config_file = "/info.xml";
|
||||
break;
|
||||
case "style":
|
||||
case "m.skin":
|
||||
$type = "skin";
|
||||
case "skin":
|
||||
case "widgetstyle":
|
||||
|
|
|
|||
|
|
@ -91,6 +91,8 @@
|
|||
$xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file);
|
||||
if(!$xmlDoc) continue;
|
||||
if($type == "drcomponent") $type = "component";
|
||||
if($type == "style" || $type == "m.skin") $type = "skin";
|
||||
if($type == "m.layout") $type = "layout";
|
||||
$title = $xmlDoc->{$type}->title->body;
|
||||
$installed[$key]->title = $title;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@
|
|||
$config_file = null;
|
||||
switch($type)
|
||||
{
|
||||
case "m.layout":
|
||||
case "module":
|
||||
case "addon":
|
||||
case "layout":
|
||||
|
|
@ -157,6 +158,7 @@
|
|||
case "component":
|
||||
$config_file = "/info.xml";
|
||||
break;
|
||||
case "m.skin":
|
||||
case "skin":
|
||||
case "widgetstyle":
|
||||
case "style":
|
||||
|
|
|
|||
|
|
@ -2,33 +2,33 @@
|
|||
<module version="0.2">
|
||||
<title xml:lang="ko">쉬운 설치</title>
|
||||
<title xml:lang="en">EasyInstaller</title>
|
||||
<title xml:lang="vi">Cài đặt tự động</title>
|
||||
<title xml:lang="vi">Cài đặt tự động</title>
|
||||
<title xml:lang="zh-TW">自動安裝</title>
|
||||
<title xml:lang="zh-CN">在线安装</title>
|
||||
<title xml:lang="jp">イージーインストール</title>
|
||||
<title xml:lang="zh-CN">安装·更新</title>
|
||||
<title xml:lang="jp">イージーインストール</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="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">可以藉由此模組安裝、更新程式包括模組、面板、版面等。</description>
|
||||
<description xml:lang="zh-CN">很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。</description>
|
||||
<description xml:lang="jp">管理者モードにてクリックだけで、モジュール/スキン/レイアウト/ウィジェット/ウィジェットスタイルのインストールを可能にするモジュールです。</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">可以藉由此模組安裝、更新程式包括模組、面板、版面等。</description>
|
||||
<description xml:lang="zh-CN">很方便的在线安装/更新XE相关模块(模块/皮肤/布局/控件/控件样式等)。</description>
|
||||
<description xml:lang="jp">管理者モードにてクリックだけで、モジュール/スキン/レイアウト/ウィジェット/ウィジェットスタイルのインストールを可能にするモジュールです。</description>
|
||||
<version>0.3</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="en">haneul</name>
|
||||
<name xml:lang="vi">haneul</name>
|
||||
<name xml:lang="vi">haneul</name>
|
||||
<name xml:lang="zh-TW">haneul</name>
|
||||
<name xml:lang="zh-CN">haneul</name>
|
||||
<name xml:lang="jp">haneul</name>
|
||||
<name xml:lang="jp">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="vi">sol</name>
|
||||
<name xml:lang="zh-TW">sol</name>
|
||||
<name xml:lang="zh-CN">sol</name>
|
||||
<name xml:lang="jp">sol</name>
|
||||
<name xml:lang="jp">sol</name>
|
||||
</author>
|
||||
</module>
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@
|
|||
$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";
|
||||
$lang->view_installed_packages = "Installed Packages";
|
||||
$lang->msg_ftp_password_input = "Please input FTP password.";
|
||||
$lang->dependant_list = "이 패키지에 의존하는 패키지 목록";
|
||||
$lang->description_uninstall = "패키지를 삭제합니다. 모듈의 경우 모든 데이터가 사라집니다.";
|
||||
$lang->view_installed_packages = "Những gói đã cài đặt";
|
||||
$lang->msg_ftp_password_input = "Hãy nhập mật khẩu của FTP.";
|
||||
$lang->dependant_list = "Gói cài đặt này phụ thuộc vào các gói khác trong danh sách";
|
||||
$lang->description_uninstall = "Loại bỏ gói cài đặt. Tất cả dữ liệu của các gói sẽ đồng thời bị xóa.";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@
|
|||
/**
|
||||
* @file zh-CN.lang.php
|
||||
* @author sol (sol@ngleader.com) 翻译:guny(space.china@gmail.com)
|
||||
* @brief 自动安装(autoinstall)模块语言包
|
||||
* @brief 在线安装/更新(autoinstall)模块语言包
|
||||
**/
|
||||
|
||||
$lang->autoinstall = 'Autoinstall';
|
||||
$lang->about_autoinstall = 'Autoinstall是XpressEngine的自动安装模块。';
|
||||
$lang->autoinstall = '安装·更新';
|
||||
$lang->about_autoinstall = 'Autoinstall是XpressEngine的在线安装/更新模块。';
|
||||
$lang->package_update = '最新更新';
|
||||
$lang->package_downloaded_count = '总下载';
|
||||
$lang->need_update = "有新的更新。";
|
||||
|
|
@ -18,18 +18,18 @@
|
|||
$lang->view_all_package = "查看全部";
|
||||
$lang->description_ftp_note = "请务必完成FTP设置,否则将无法在线安装(更新)相关模块。";
|
||||
$lang->description_update = "新安装(更新)模块的版本信息,点击Update按钮后才能正常显示。";
|
||||
$lang->install = "Install";
|
||||
$lang->update = "Update";
|
||||
$lang->depending_programs = "This program depends on ";
|
||||
$lang->require_update = "Update is required.";
|
||||
$lang->require_installation = "Installation is required.";
|
||||
$lang->description_install = "Installation process also install/update programs which this program depends on";
|
||||
$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";
|
||||
$lang->view_installed_packages = "Installed Packages";
|
||||
$lang->msg_ftp_password_input = "Please input FTP password.";
|
||||
$lang->dependant_list = "이 패키지에 의존하는 패키지 목록";
|
||||
$lang->description_uninstall = "패키지를 삭제합니다. 모듈의 경우 모든 데이터가 사라집니다.";
|
||||
$lang->install = "安装";
|
||||
$lang->update = "更新";
|
||||
$lang->current_version = "现用版本";
|
||||
$lang->depending_programs = "联动插件/控件";
|
||||
$lang->require_update = "需要更新";
|
||||
$lang->require_installation = "需要安装";
|
||||
$lang->description_install = "安装时,与其联动的插件/控件也会同时被安装(更新)。";
|
||||
$lang->description_download = "无法使用FTP时,需得自行下载安装到指定路径。";
|
||||
$lang->path = "安装路径";
|
||||
$lang->cmd_download = "下载";
|
||||
$lang->view_installed_packages = "已安装的数据包";
|
||||
$lang->msg_ftp_password_input = "请输入FTP密码。";
|
||||
$lang->dependant_list = "联动数据包列表";
|
||||
$lang->description_uninstall = "确定要删除此数据包吗?如果此数据包为模块,模块中的数据将会全部消失。";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -55,3 +55,5 @@ ul.listOrder.desc li.arrow { background:url(../img/arrDown.gif) no-repeat right
|
|||
ul.listOrder li { position:relative; left:-1px; display:inline; margin:0; padding:0 5px 0 9px; border-left:1px solid #ddd;}
|
||||
ul.listOrder li.arrow a { text-decoration:none; font-weight:bold; color:#2893BB; }
|
||||
ul.listOrder li a { text-decoration:none; color:#7B7575; }
|
||||
|
||||
p.caution strong { font-size: 1.2em; font-weight: bold; color: red; }
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<!--%import("js/autoinstall.js")-->
|
||||
<div class="infoText">
|
||||
<p><strong>{$package->title}</strong> [{$package->type}] - {$package->path}</p>
|
||||
<p>{$lang->description_uninstall}</p>
|
||||
<p class="caution"><strong>{$lang->description_uninstall}</strong></p>
|
||||
<form action="./" method="POST" onsubmit="return procFilter(this, uninstall_package);">
|
||||
<input type="hidden" name="package_srl" value="{$package_srl}" />
|
||||
<!--@if($need_password)-->
|
||||
|
|
|
|||
|
|
@ -129,6 +129,10 @@
|
|||
|
||||
// 내용에서 XE만의 태그를 삭제
|
||||
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
|
||||
if(Mobile::isFromMobilePhone())
|
||||
{
|
||||
$obj->content = nl2br(htmlspecialchars($obj->content));
|
||||
}
|
||||
if(!$obj->regdate) $obj->regdate = date("YmdHis");
|
||||
|
||||
// 세션에서 최고 관리자가 아니면 iframe, script 제거
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
<title xml:lang="jp">コミュニケーション</title>
|
||||
<title xml:lang="zh-CN">会员交流</title>
|
||||
<title xml:lang="en">Communication</title>
|
||||
<title xml:lang="ru">Communication</title>
|
||||
<title xml:lang="ru">Communication</title>
|
||||
<title xml:lang="vi">Liên lạc</title>
|
||||
<title xml:lang="zh-TW">交流</title>
|
||||
<description xml:lang="ko">회원들간의 쪽지, 친구기능을 담당하는 모듈입니다.</description>
|
||||
|
|
@ -12,7 +12,7 @@
|
|||
<description xml:lang="zh-CN">管理在线会员间短信息及好友功能的模块。</description>
|
||||
<description xml:lang="en">This module is for managing message, friend functions.</description>
|
||||
<description xml:lang="vi">Module quản lý tin nhắn và bạn bè.</description>
|
||||
<description xml:lang="ru">This module is for managing message, friend functions.</description>
|
||||
<description xml:lang="ru">This module is for managing message, friend functions.</description>
|
||||
<description xml:lang="zh-TW">管理線上會員間短訊及好友功能的模組。</description>
|
||||
<version>0.1</version>
|
||||
<date>2008-05-30</date>
|
||||
|
|
@ -25,6 +25,6 @@
|
|||
<name xml:lang="zh-CN">zero</name>
|
||||
<name xml:lang="en">zero</name>
|
||||
<name xml:lang="zh-TW">zero</name>
|
||||
<name xml:lang="ru">zero</name>
|
||||
<name xml:lang="ru">zero</name>
|
||||
</author>
|
||||
</module>
|
||||
|
|
|
|||
|
|
@ -529,6 +529,15 @@
|
|||
executeQuery('file.updateFileValid', $args);
|
||||
}
|
||||
|
||||
// trigger 호출 (after)
|
||||
if($output->toBool()) {
|
||||
$trigger_output = ModuleHandler::triggerCall('document.restoreTrash', 'after', $document_args);
|
||||
if(!$trigger_output->toBool()) {
|
||||
$oDB->rollback();
|
||||
return $trigger_output;
|
||||
}
|
||||
}
|
||||
|
||||
// commit
|
||||
$oDB->commit();
|
||||
return $output;
|
||||
|
|
|
|||
|
|
@ -185,6 +185,10 @@
|
|||
|
||||
// 내용에서 XE만의 태그를 삭제
|
||||
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content);
|
||||
if(Mobile::isFromMobilePhone())
|
||||
{
|
||||
$obj->content = nl2br(htmlspecialchars($obj->content));
|
||||
}
|
||||
|
||||
// 세션에서 최고 관리자가 아니면 iframe, script 제거
|
||||
if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);
|
||||
|
|
@ -481,6 +485,7 @@
|
|||
$oDocument = $oDocumentModel->getDocument($obj->document_srl);
|
||||
|
||||
$trash_args->module_srl = $oDocument->get('module_srl');
|
||||
$obj->module_srl = $oDocument->get('module_srl');
|
||||
|
||||
// 휴지통 문서를 두번 휴지통에 버릴 수 없음.
|
||||
if($trash_args->module_srl == 0) return false;
|
||||
|
|
@ -531,7 +536,16 @@
|
|||
executeQuery('file.updateFileValid', $args);
|
||||
}
|
||||
|
||||
// commit
|
||||
// trigger 호출 (after)
|
||||
if($output->toBool()) {
|
||||
$trigger_output = ModuleHandler::triggerCall('document.moveDocumentToTrash', 'after', $obj);
|
||||
if(!$trigger_output->toBool()) {
|
||||
$oDB->rollback();
|
||||
return $trigger_output;
|
||||
}
|
||||
}
|
||||
|
||||
// commit
|
||||
$oDB->commit();
|
||||
|
||||
return $output;
|
||||
|
|
@ -1621,7 +1635,7 @@
|
|||
|
||||
$document_config = null;
|
||||
$document_config->use_history = Context::get('use_history');
|
||||
if(!$document_config->use_history) $document_config->user_history = 'N';
|
||||
if(!$document_config->use_history) $document_config->use_history = 'N';
|
||||
|
||||
$oModuleController = &getController('module');
|
||||
for($i=0;$i<count($module_srl);$i++) {
|
||||
|
|
|
|||
|
|
@ -68,9 +68,11 @@
|
|||
if(!Context::get('is_logged')) return false;
|
||||
|
||||
$logged_info = Context::get('logged_info');
|
||||
|
||||
if($logged_info->is_admin == 'Y') return true;
|
||||
|
||||
$grant = Context::get('grant');
|
||||
if($grant->manager) return true;
|
||||
|
||||
if($this->get('member_srl') && ($this->get('member_srl') == $logged_info->member_srl || $this->get('member_srl')*-1 == $logged_info->member_srl)) return true;
|
||||
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@
|
|||
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
░░ * @File : common/lang/vi.lang.php ░░
|
||||
░░ * @Author : zero (zero@nzeo.com) ░░
|
||||
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
|
||||
░░ * @Website: http://vietxe.net ░░
|
||||
░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
|
||||
░░ * @Website: http://xpressengine.vn ░░
|
||||
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
*/
|
||||
|
||||
$lang->document_list = 'Danh sách bài viết';
|
||||
$lang->thumbnail_type = 'Định dạng hình nhỏ';
|
||||
|
|
@ -96,5 +97,5 @@
|
|||
'trash_ipaddress' => 'IP Người xóa',
|
||||
);
|
||||
|
||||
$lang->success_trashed = "Successfully moved to trashcan";
|
||||
$lang->success_trashed = "Đã chuyển tới thùng rác thành công.";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -67,8 +67,8 @@
|
|||
);
|
||||
|
||||
$lang->alias = "Alias";
|
||||
$lang->history = "编辑记录";
|
||||
$lang->about_use_history = "设置启用编辑记录与否。启用将记录修改主题版本,并可以复原。";
|
||||
$lang->history = "历史版本功能";
|
||||
$lang->about_use_history = "启用历史版本功能它将记录主题修改版本,并还可以复原到之前版本。";
|
||||
$lang->trace_only = "只留痕迹";
|
||||
|
||||
$lang->cmd_trash = "回收箱";
|
||||
|
|
@ -95,5 +95,6 @@
|
|||
'trash_ipaddress' => '操作人IP地址',
|
||||
);
|
||||
|
||||
$lang->success_trashed = "Successfully moved to trashcan";
|
||||
$lang->success_trashed = '已成功移除到回收箱。';
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ function display_gallery_image(obj, is_first_display) {
|
|||
var source_filename = obj.image_url;
|
||||
var tmp_arr = source_filename.split('/');
|
||||
var filename = tmp_arr[tmp_arr.length-1];
|
||||
xInnerHtml("zone_gallery_image_filename_"+obj.srl, "<a href='#' onclick=\"winopen('"+source_filename+"');return false;\">"+unescape(filename)+"</a>");
|
||||
xInnerHtml("zone_gallery_image_filename_"+obj.srl, "<a href='#' onclick=\"winopen('"+source_filename+"');return false;\">"+decodeURI(filename)+"</a>");
|
||||
|
||||
// 네이게이션 영역의 숫자 변경
|
||||
var zone_navigator = xGetElementById("zone_gallery_navigator_status_"+obj.srl);
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@
|
|||
**/
|
||||
function triggerEditorComponentCompile(&$content) {
|
||||
if(Context::getResponseMethod()!='HTML') return new Object();
|
||||
if(Mobile::isFromMobilePhone()) return new Object();
|
||||
|
||||
$module_info = Context::get('module_info');
|
||||
$module_srl = $module_info->module_srl;
|
||||
|
|
@ -184,6 +185,7 @@
|
|||
}
|
||||
|
||||
$content = $this->transComponent($content);
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@
|
|||
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
░░ * @File : common/lang/vi.lang.php ░░
|
||||
░░ * @Author : zero (zero@nzeo.com) ░░
|
||||
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░
|
||||
░░ * @Website: http://vietxe.net ░░
|
||||
░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
|
||||
░░ * @Website: http://xpressengine.vn ░░
|
||||
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */
|
||||
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
|
||||
*/
|
||||
|
||||
$lang->editor = 'WYSIWYG toàn diện';
|
||||
$lang->component_name = 'Thành phần';
|
||||
|
|
@ -120,7 +121,7 @@
|
|||
$lang->edit->help_align_left = 'Căn trái';
|
||||
$lang->edit->help_align_center = 'Căn giữa';
|
||||
$lang->edit->help_align_right = 'Căn phải';
|
||||
$lang->edit->help_align_justify = 'Align justity';
|
||||
$lang->edit->help_align_justify = 'Đều hai bên';
|
||||
$lang->edit->help_add_indent = 'Thụt vào';
|
||||
$lang->edit->help_remove_indent = 'Giãn ra';
|
||||
$lang->edit->help_list_number = 'Thứ tự số';
|
||||
|
|
@ -213,7 +214,7 @@
|
|||
$lang->edit->minimize_list = 'Thu nhỏ';
|
||||
|
||||
$lang->edit->move = 'Di chuyển';
|
||||
$lang->edit->refresh = 'Refresh';
|
||||
$lang->edit->refresh = 'Làm mới';
|
||||
$lang->edit->materials = 'Vật liệu';
|
||||
$lang->edit->temporary_savings = 'Danh sách lưu tạm thời';
|
||||
|
||||
|
|
@ -223,10 +224,10 @@
|
|||
$lang->edit->paging_next_help = 'Chuyển tới trang tiếp.';
|
||||
|
||||
$lang->edit->toc = 'Board của nội dung';
|
||||
$lang->edit->close_help = '도움말 닫기';
|
||||
$lang->edit->close_help = 'Đóng hướng dẫn';
|
||||
|
||||
$lang->edit->confirm_submit_without_saving = '저장하지 않은 단락이 있습니다.\\n그냥 전송하시겠습니까?';
|
||||
$lang->edit->confirm_submit_without_saving = 'Nội dung chưa được lưu.\\nBạn có chắc chắn muốn gửi không?';
|
||||
|
||||
$lang->edit->image_align = '이미지 정렬';
|
||||
$lang->edit->attached_files = '첨부 파일';
|
||||
$lang->edit->image_align = 'Sắp xếp hình ảnh';
|
||||
$lang->edit->attached_files = 'File đính kèm';
|
||||
?>
|
||||
|
|
@ -227,6 +227,6 @@
|
|||
|
||||
$lang->edit->confirm_submit_without_saving = '尚有未保存的段落。\\n确定要提交吗?';
|
||||
|
||||
$lang->edit->image_align = '이미지 정렬';
|
||||
$lang->edit->attached_files = '첨부 파일';
|
||||
$lang->edit->image_align = '图片对齐';
|
||||
$lang->edit->attached_files = '附件';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<skin version="0.2">
|
||||
<title xml:lang="ko">XpressEditor Skin</title>
|
||||
<title xml:lang="es">XpressEditor Skin</title>
|
||||
<title xml:lang="en">XpressEditor Skin</title>
|
||||
<title xml:lang="es">XpressEditor Skin</title>
|
||||
<title xml:lang="en">XpressEditor Skin</title>
|
||||
<title xml:lang="vi">XpressEditor Skin</title>
|
||||
<title xml:lang="jp">XpressEditorスキン</title>
|
||||
<title xml:lang="zh-CN">XpressEditor皮肤</title>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -34,8 +34,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-TW">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>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -417,7 +417,7 @@
|
|||
}
|
||||
|
||||
// 디렉토리 생성
|
||||
if(!FileHandler::makeDir($path)) return false;
|
||||
if(!FileHandler::makeDir($path)) return new Object(-1,'msg_not_permitted_create');
|
||||
|
||||
// 파일 이동
|
||||
if($manual_insert) {
|
||||
|
|
@ -431,7 +431,7 @@
|
|||
if(!@move_uploaded_file($file_info['tmp_name'], $filename)) {
|
||||
$ext = substr(strrchr($file_info['name'],'.'),1);
|
||||
$filename = $path. md5(crypt(rand(1000000,900000).$file_info['name'])).'.'.$ext;
|
||||
if(!@move_uploaded_file($file_info['tmp_name'], $filename)) return false;
|
||||
if(!@move_uploaded_file($file_info['tmp_name'], $filename)) return new Object(-1,'msg_file_upload_error');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,4 +53,7 @@
|
|||
'ipaddress' => 'IP Address',
|
||||
);
|
||||
$lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.';
|
||||
$lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.';
|
||||
$lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.';
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -50,4 +50,7 @@
|
|||
'ipaddress' => 'Dirección IP',
|
||||
);
|
||||
$lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.';
|
||||
$lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.';
|
||||
$lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.';
|
||||
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -50,4 +50,7 @@
|
|||
'ipaddress' => 'Adresse IP',
|
||||
);
|
||||
$lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.';
|
||||
$lang->msg_not_permitted_create = '파일 또는 디렉토리를 생성할 수 없습니다.';
|
||||
$lang->msg_file_upload_error = '파일 업로드 중 에러가 발생하였습니다.';
|
||||
|
||||
?>
|
||||
|
|
|
|||