merge & tag 1.4.3

git-svn-id: http://xe-core.googlecode.com/svn/trunk@7597 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
haneul 2010-07-06 08:29:10 +00:00
parent 762ebbf445
commit 289973781a
200 changed files with 2296 additions and 1827 deletions

View file

@ -5,7 +5,7 @@
<title xml:lang="vi">Captcha Addon</title> <title xml:lang="vi">Captcha Addon</title>
<title xml:lang="zh-CN">验证码插件</title> <title xml:lang="zh-CN">验证码插件</title>
<title xml:lang="jp">Captchaアドオン</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> <title xml:lang="zh-TW">圖形驗證</title>
<description xml:lang="ko"> <description xml:lang="ko">
프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다. 프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다.
@ -27,7 +27,7 @@
ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。 ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。
ログインしてない時だけ、動作します。 ログインしてない時だけ、動作します。
</description> </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. 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. This addon applies only to not-logged-in users.
</description> </description>
@ -39,46 +39,46 @@
<author email_address="developers@xpressengine.com" link="http://www.xpressengine.com"> <author email_address="developers@xpressengine.com" link="http://www.xpressengine.com">
<name xml:lang="ko">XE</name> <name xml:lang="ko">XE</name>
<name xml:lang="zh-CN">XE</name> <name xml:lang="zh-CN">XE</name>
<name xml:lang="jp">XE</name> <name xml:lang="jp">XE</name>
<name xml:lang="zh-TW">XE</name> <name xml:lang="zh-TW">XE</name>
<name xml:lang="en">XE</name> <name xml:lang="en">XE</name>
<name xml:lang="ru">XE</name> <name xml:lang="ru">XE</name>
<name xml:lang="vi">XE</name> <name xml:lang="vi">XE</name>
</author> </author>
<extra_vars> <extra_vars>
<var name="target" type="select"> <var name="target" type="select">
<title xml:lang="ko">Captcha 표시 대상</title> <title xml:lang="ko">Captcha 표시 대상</title>
<title xml:lang="zh-CN">应用对象</title> <title xml:lang="zh-CN">应用对象</title>
<title xml:lang="jp">Captchaを表示する対象</title> <title xml:lang="jp">Captchaを表示する対象</title>
<title xml:lang="zh-TW">選擇目標</title> <title xml:lang="zh-TW">選擇目標</title>
<title xml:lang="en">Captcha Target</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> <title xml:lang="vi">Mục tiêu Captcha hiển thị</title>
<description xml:lang="ko">글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다</description> <description xml:lang="ko">글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다</description>
<description xml:lang="zh-CN">可以指定验证码应用对象(管理员除外)。</description> <description xml:lang="zh-CN">可以指定验证码应用对象(管理员除外)。</description>
<description xml:lang="jp">管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。</description> <description xml:lang="jp">管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。</description>
<description xml:lang="zh-TW">除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。</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="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> <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=""> <options value="">
<title xml:lang="ko">로그인하지 않은 사용자</title> <title xml:lang="ko">로그인하지 않은 사용자</title>
<title xml:lang="zh-CN">非登录用户</title> <title xml:lang="zh-CN">非登录用户</title>
<title xml:lang="jp">ログインしてないユーザー</title> <title xml:lang="jp">ログインしてないユーザー</title>
<title xml:lang="zh-TW">非用戶</title> <title xml:lang="zh-TW">非用戶</title>
<title xml:lang="en">Not logged-in users</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> <title xml:lang="vi">Người dùng chưa đăng nhập</title>
</options> </options>
<options value="all"> <options value="all">
<title xml:lang="ko">모든 사용자</title> <title xml:lang="ko">모든 사용자</title>
<title xml:lang="zh-CN">所有用户</title> <title xml:lang="zh-CN">所有用户</title>
<title xml:lang="jp">すべてのユーザー</title> <title xml:lang="jp">すべてのユーザー</title>
<title xml:lang="zh-TW">所有用戶</title> <title xml:lang="zh-TW">所有用戶</title>
<title xml:lang="en">All users</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> <title xml:lang="vi">Tất cả mọi người</title>
</options> </options>
</var> </var>
@ -88,14 +88,14 @@
<title xml:lang="jp">動作方式</title> <title xml:lang="jp">動作方式</title>
<title xml:lang="zh-TW">行為模式</title> <title xml:lang="zh-TW">行為模式</title>
<title xml:lang="en">How it works</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> <title xml:lang="vi">Sử dụng</title>
<description xml:lang="ko">"1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다</description> <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="jp">「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。</description>
<description xml:lang="zh-TW">選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。</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="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> <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"> <options value="onetime">
<title xml:lang="ko">1번만 동작</title> <title xml:lang="ko">1번만 동작</title>
@ -104,7 +104,7 @@
<title xml:lang="zh-TW">單次</title> <title xml:lang="zh-TW">單次</title>
<title xml:lang="vi">Chỉ một lần</title> <title xml:lang="vi">Chỉ một lần</title>
<title xml:lang="en">once</title> <title xml:lang="en">once</title>
<title xml:lang="ru">1 раз</title> <title xml:lang="ru">1 раз</title>
</options> </options>
<options value="everytime"> <options value="everytime">
<title xml:lang="ko">매번 동작</title> <title xml:lang="ko">매번 동작</title>
@ -112,7 +112,7 @@
<title xml:lang="jp">毎回表示</title> <title xml:lang="jp">毎回表示</title>
<title xml:lang="zh-TW">每次</title> <title xml:lang="zh-TW">每次</title>
<title xml:lang="en">every time</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> <title xml:lang="vi">Luôn sử dụng</title>
</options> </options>
</var> </var>
@ -122,14 +122,14 @@
<title xml:lang="jp">비밀번호 찾기 적용</title> <title xml:lang="jp">비밀번호 찾기 적용</title>
<title xml:lang="zh-TW">忘記密碼</title> <title xml:lang="zh-TW">忘記密碼</title>
<title xml:lang="en">applying to an action finding account</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> <title xml:lang="vi">Khi lấy lại mật khẩu</title>
<description xml:lang="ko">적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description> <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="jp">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</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="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> <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=""> <options value="">
<title xml:lang="ko">적용하지 않음</title> <title xml:lang="ko">적용하지 않음</title>
@ -137,7 +137,7 @@
<title xml:lang="jp">적용하지 않음</title> <title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">關閉</title> <title xml:lang="zh-TW">關閉</title>
<title xml:lang="en">Not apply</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> <title xml:lang="vi">Không áp dụng</title>
</options> </options>
<options value="apply"> <options value="apply">
@ -146,7 +146,7 @@
<title xml:lang="jp">적용</title> <title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">開啟</title> <title xml:lang="zh-TW">開啟</title>
<title xml:lang="en">Apply</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> <title xml:lang="vi">Áp dụng</title>
</options> </options>
</var> </var>
@ -156,14 +156,14 @@
<title xml:lang="jp">인증 메일 재발송 적용</title> <title xml:lang="jp">인증 메일 재발송 적용</title>
<title xml:lang="zh-TW">重寄認證信</title> <title xml:lang="zh-TW">重寄認證信</title>
<title xml:lang="en">apply to an action resending authmail</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> <title xml:lang="vi">Khi lấy lại mã kích hoạt</title>
<description xml:lang="ko">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description> <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="jp">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</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="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> <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=""> <options value="">
<title xml:lang="ko">적용하지 않음</title> <title xml:lang="ko">적용하지 않음</title>
@ -171,7 +171,7 @@
<title xml:lang="jp">적용하지 않음</title> <title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">關閉</title> <title xml:lang="zh-TW">關閉</title>
<title xml:lang="en">Not apply</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> <title xml:lang="vi">Không áp dụng</title>
</options> </options>
<options value="apply"> <options value="apply">
@ -180,20 +180,20 @@
<title xml:lang="jp">적용</title> <title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">開啟</title> <title xml:lang="zh-TW">開啟</title>
<title xml:lang="en">Apply</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> <title xml:lang="vi">Áp dụng</title>
</options> </options>
</var> </var>
<var name="apply_signup" type="select"> <var name="apply_signup" type="select">
<title xml:lang="ko">회원 가입 적용</title> <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="jp">인증 메일 재발송 적용</title>
<title xml:lang="zh-TW">會員註冊</title> <title xml:lang="zh-TW">會員註冊</title>
<title xml:lang="en">Apply to member signup</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> <title xml:lang="vi">Apply to member signup</title>
<description xml:lang="ko">적용으로 하시면 회원가입 기능에도 적용되어 악의적인 봇(또는 프로그램)의 회원가입을 막을 수 있습니다.</description> <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="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="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> <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="jp">적용하지 않음</title>
<title xml:lang="zh-TW">關閉</title> <title xml:lang="zh-TW">關閉</title>
<title xml:lang="en">Not apply</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> <title xml:lang="vi">Không áp dụng</title>
</options> </options>
<options value="apply"> <options value="apply">
@ -214,7 +214,7 @@
<title xml:lang="jp">적용</title> <title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">開啟</title> <title xml:lang="zh-TW">開啟</title>
<title xml:lang="en">Apply</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> <title xml:lang="vi">Áp dụng</title>
</options> </options>
</var> </var>

View file

@ -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. 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. Chỉ hỗ trợ cho các định dạng wml, hdml, mhtml.
</description> </description>
<description xml:lang="ru"> <description xml:lang="ru">
Данный аддон показывает WAP теги, анализирую информацию мобильного соединения. Данный аддон показывает WAP теги, анализирую информацию мобильного соединения.
Поддерживаются только wml, hdml, mhtml форматы. Поддерживаются только wml, hdml, mhtml форматы.
</description> </description>
@ -44,7 +44,7 @@
<name xml:lang="zh-CN">zero</name> <name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name> <name xml:lang="en">zero</name>
<name xml:lang="vi">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> <name xml:lang="zh-TW">zero</name>
</author> </author>
@ -55,7 +55,7 @@
<name xml:lang="zh-CN">misol</name> <name xml:lang="zh-CN">misol</name>
<name xml:lang="en">misol</name> <name xml:lang="en">misol</name>
<name xml:lang="vi">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> <name xml:lang="zh-TW">misol</name>
</author> </author>
<log>언어선택 추가(WML, mHTML)</log> <log>언어선택 추가(WML, mHTML)</log>
@ -70,7 +70,7 @@
<title xml:lang="zh-CN">编码</title> <title xml:lang="zh-CN">编码</title>
<title xml:lang="en">Charset</title> <title xml:lang="en">Charset</title>
<title xml:lang="vi">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> <title xml:lang="zh-TW">編碼</title>
<description xml:lang="ko"> <description xml:lang="ko">
모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다. 모바일 기기의 경우 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. 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. Charset mặc định là UTF-8.
</description> </description>
<description xml:lang="ru"> <description xml:lang="ru">
utf-8 may be read with mobile tools. utf-8 may be read with mobile tools.
Mobile tools will display correct charset when you input charset you want. Mobile tools will display correct charset when you input charset you want.
Default charset is UTF-8. Default charset is UTF-8.

View file

@ -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;
}
}
?>

View file

@ -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>

View file

@ -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');
}
?>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

View file

@ -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>

View file

@ -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;
}

View file

@ -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','')+'">&lt; go Home &gt;</a></li>';
if(xeSmartUpperMenu) html += '<li><a href="'+current_url.setQuery('mid',xeSmartUpperMenu.url)+'">&lt; go Upper &gt;</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;
}

View file

@ -158,22 +158,6 @@
if(file_exists(_XE_PATH_.'.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true; if(file_exists(_XE_PATH_.'.htaccess')&&$this->db_info->use_rewrite == 'Y') $this->allow_rewrite = true;
else $this->allow_rewrite = false; 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 // set locations for javascript use
if($_SERVER['REQUEST_METHOD'] == 'GET') { if($_SERVER['REQUEST_METHOD'] == 'GET') {
@ -1179,7 +1163,7 @@
/** /**
* @brief js file을 추가 * @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; if(strpos($file,'://')===false && $file{0}!='/' && $file{0}!='.') $file = './'.$file;
$file = preg_replace('@/\./|(?<!:)\/\/@', '/', $file); $file = preg_replace('@/\./|(?<!:)\/\/@', '/', $file);
while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file,1); while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file,1);
@ -1277,7 +1261,7 @@
/** /**
* @brief CSS file 추가 * @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; if(strpos($file,'://')===false && substr($file,0,1)!='/' && substr($file,0,1)!='.') $file = './'.$file;
$file = str_replace(array('/./','//'),'/',$file); $file = str_replace(array('/./','//'),'/',$file);
while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file,1); while(strpos($file,'/../')) $file = preg_replace('/\/([^\/]+)\/\.\.\//s','/',$file,1);

View file

@ -668,23 +668,44 @@
} else { } else {
if(strpos($name,'.')!=false) { if(strpos($name,'.')!=false) {
list($prefix, $name) = explode('.',$name); list($prefix, $name) = explode('.',$name);
if (strpos ($prefix, "(")) { if (($now_matchs = preg_match_all ("/\(/", $prefix, $xtmp)) > 0) {
$tmpval = explode ("(", $prefix); if ($now_matchs == 1) {
$tmpval[1] = sprintf ('"%s"', $tmpval[1]); $tmpval = explode ("(", $prefix);
$prefix = implode ("(", $tmpval); $tmpval[1] = sprintf ('"%s"', $tmpval[1]);
$flag_of_function = true; $prefix = implode ("(", $tmpval);
$tmpval = explode (")", $name);
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
$name = implode (")", $tmpval);
}
} }
else $prefix = sprintf('"%s"',$prefix); else {
if ($flag_of_function === true) { $prefix = sprintf('"%s"',$prefix);
$tmpval = explode (")", $name); $name = ($name == '*') ? $name : sprintf('"%s"',$name);
$tmpval[0] = sprintf ('"%s"', $tmpval[0]);
$name = implode (")", $tmpval);
$flag_of_function = false;
} }
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) : ''); $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 { } else {
$column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : ''); $column_list[] = sprintf($click_count,$name) . ($alias ? sprintf(' as %s',$alias) : '');
} }

View file

@ -13,6 +13,7 @@
var $content_size = 0; ///< 출력하는 컨텐츠의 사이즈 var $content_size = 0; ///< 출력하는 컨텐츠의 사이즈
var $gz_enabled = false; ///< gzip 압축하여 컨텐츠 호출할 것인지에 대한 flag변수 var $gz_enabled = false; ///< gzip 압축하여 컨텐츠 호출할 것인지에 대한 flag변수
var $handler = null;
/** /**
* @brief print either html or xml content given oModule object * @brief print either html or xml content given oModule object
@ -31,68 +32,25 @@
) $this->gz_enabled = true; ) $this->gz_enabled = true;
// request method에 따른 컨텐츠 결과물 추출 // request method에 따른 컨텐츠 결과물 추출
if(Context::get('xeVirtualRequestMethod')=='xml') $output = $this->_toVirtualXmlDoc($oModule); if(Context::get('xeVirtualRequestMethod')=='xml') {
else if(Context::getRequestMethod() == 'XMLRPC') { require_once("./classes/display/VirtualXMLDisplayHandler.php");
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) $this->gz_enabled = false; $handler = new VirtualXMLDisplayHandler();
$output = $this->_toXmlDoc($oModule); }
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 출력 요청일 경우 레이아웃 컴파일과 더블어 완성된 코드를 제공 $output = $handler->toDoc($oModule);
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>');
}
}
}
// 출력하기 전에 trigger 호출 (before) // 출력하기 전에 trigger 호출 (before)
ModuleHandler::triggerCall('display', 'before', $output); ModuleHandler::triggerCall('display', 'before', $output);
@ -100,58 +58,16 @@
// 애드온 실행 // 애드온 실행
$called_position = 'before_display_content'; $called_position = 'before_display_content';
$oAddonController = &getController('addon'); $oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath(); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
@include($addon_file); @include($addon_file);
// HTML 출력일 경우 최종적으로 common layout을 씌워서 출력 if(method_exists($handler, "prepareToPrint")) $handler->prepareToPrint($output);
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);
}
// header 출력 // header 출력
if($this->gz_enabled) header("Content-Encoding: gzip"); if($this->gz_enabled) header("Content-Encoding: gzip");
if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader(); if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader();
else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader(); else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader();
else $this->_printHTMLHeader(); else $this->_printHTMLHeader();
// debugOutput 출력 // debugOutput 출력
$this->content_size = strlen($output); $this->content_size = strlen($output);
@ -165,117 +81,6 @@
ModuleHandler::triggerCall('display', 'after', $content); 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('&lt;','&gt;','&amp;'),$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 * @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 * @brief print a HTTP HEADER for XML, which is encoded in UTF-8
**/ **/
function _printXMLHeader() { function _printXMLHeader() {
header("Content-Type: text/xml; charset=UTF-8"); header("Content-Type: text/xml; charset=UTF-8");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " 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: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false); header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); 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");
}
} }
?> ?>

View 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);
}
}
}

View 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;
}
}

View 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;
}
}
?>

View 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('&lt;','&gt;','&amp;'),$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;
}
}
?>

View file

@ -141,9 +141,9 @@
$value = $this->_getTypeValue($this->type, $this->value); $value = $this->_getTypeValue($this->type, $this->value);
switch($this->type) { switch($this->type) {
case 'homepage' : 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' : 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; break;
case 'tel' : case 'tel' :
return sprintf('%s - %s - %s', $value[0],$value[1],$value[2]); return sprintf('%s - %s - %s', $value[0],$value[1],$value[2]);

View file

@ -332,11 +332,11 @@
* @remarks if the target is moved (when return code is 300~399), this function follows the location specified response header. * @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()) { 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(); requirePear();
require_once('HTTP/Request.php'); 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 = new HTTP_Request(__PROXY_SERVER__);
$oRequest->setMethod('POST'); $oRequest->setMethod('POST');
$oRequest->_timeout = $timeout; $oRequest->_timeout = $timeout;

View 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;
}
}
?>

View file

@ -61,7 +61,7 @@
// execute addon (before module initialization) // execute addon (before module initialization)
$called_position = 'before_module_init'; $called_position = 'before_module_init';
$oAddonController = &getController('addon'); $oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath(); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
@include($addon_file); @include($addon_file);
} }
@ -203,13 +203,102 @@
$type = $xml_info->action->{$this->act}->type; $type = $xml_info->action->{$this->act}->type;
$kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; $kind = strpos(strtolower($this->act),'admin')!==false?'admin':'';
if(!$kind && $this->module == 'admin') $kind = 'admin'; if(!$kind && $this->module == 'admin') $kind = 'admin';
if($this->module_info->use_mobile != "Y") Mobile::setMobile(false);
// create a module instance // if(type == view, and case for using mobilephone)
$oModule = &$this->getModuleInstance($this->module, $type, $kind); if($type == "view" && Mobile::isFromMobilePhone() && Context::isInstalled())
if(!is_object($oModule)) { {
$this->error = 'msg_module_is_not_exists'; $orig_type = "view";
return; $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); $oModule->setAct($this->act);
@ -264,11 +353,20 @@
} }
// Check if layout_srl exists for the module // 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 // If layout_srl exists, get information of the layout, and set the location of layout_path/ layout_file
$oLayoutModel = &getModel('layout'); $oLayoutModel = &getModel('layout');
$layout_info = $oLayoutModel->getLayout($oModule->module_info->layout_srl); $layout_info = $oLayoutModel->getLayout($layout_srl);
if($layout_info) { if($layout_info) {
// Input extra_vars into $layout_info // Input extra_vars into $layout_info
@ -369,10 +467,10 @@
$instance_name = sprintf("%s%s",$module,"WAP"); $instance_name = sprintf("%s%s",$module,"WAP");
$class_file = sprintf('%s%s%s.wap.php', _XE_PATH_, $class_path, $module); $class_file = sprintf('%s%s%s.wap.php', _XE_PATH_, $class_path, $module);
break; break;
case 'smartphone' : case 'mobile' :
$instance_name = sprintf("%s%s",$module,"SPhone"); $instance_name = sprintf("%s%s",$module,"Mobile");
$class_file = sprintf('%s%s%s.smartphone.php', _XE_PATH_, $class_path, $module); $class_file = sprintf("%s%s%s.mobile.php", _XE_PATH_, $class_path, $module);
break; break;
case 'class' : case 'class' :
$instance_name = $module; $instance_name = $module;
$class_file = sprintf('%s%s%s.class.php', _XE_PATH_, $class_path, $module); $class_file = sprintf('%s%s%s.class.php', _XE_PATH_, $class_path, $module);

View file

@ -246,7 +246,7 @@
// addon 실행(called_position 를 before_module_proc로 하여 호출) // addon 실행(called_position 를 before_module_proc로 하여 호출)
$called_position = 'before_module_proc'; $called_position = 'before_module_proc';
$oAddonController = &getController('addon'); $oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath(); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
@include($addon_file); @include($addon_file);
if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act)) { if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act)) {
@ -261,75 +261,16 @@
// 실행 // 실행
$output = $this->{$this->act}(); $output = $this->{$this->act}();
}
// act이 없으면 action_forward에서 해당하는 act가 있는지 찾아서 대신 실행 else {
} else if(Context::isInstalled()) { return false;
$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;
}
// addon 실행(called_position 를 after_module_proc로 하여 호출) // addon 실행(called_position 를 after_module_proc로 하여 호출)
$called_position = 'after_module_proc'; $called_position = 'after_module_proc';
$oAddonController = &getController('addon'); $oAddonController = &getController('addon');
$addon_file = $oAddonController->getCacheFilePath(); $addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone()?"mobile":"pc");
@include($addon_file); @include($addon_file);
if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) { if(is_a($output, 'Object') || is_subclass_of($output, 'Object')) {

View file

@ -43,7 +43,7 @@
**/ **/
class XmlJsFilter extends XmlParser { class XmlJsFilter extends XmlParser {
var $version = '0.2.3'; var $version = '0.2.4';
var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치 var $compiled_path = './files/cache/js_filter_compiled/'; ///< 컴파일된 캐시 파일이 놓일 위치
var $xml_file = NULL; ///< 대상 xml 파일 var $xml_file = NULL; ///< 대상 xml 파일
var $js_file = NULL; ///< 컴파일된 js 파일 var $js_file = NULL; ///< 컴파일된 js 파일
@ -220,7 +220,8 @@
$name = trim($attrs->name); $name = trim($attrs->name);
$target = trim($attrs->target); $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; if($name && !in_array($name, $target_list)) $target_list[] = $name;
} }

View file

@ -1,9 +1,9 @@
/** /**
* @file js_app.js * @file js_app.js
* @author zero (zero@nzeo.com) * @author taggon (gonom9@gmail.com)
* @brief XE JavaScript Application Framework (JAF) * @brief XE JavaScript Application Framework (JAF)
* @namespace xe * @namespace xe
* @update 20091120 * @update 20100701
*/ */
(function($){ (function($){
@ -60,7 +60,7 @@ _xe_base = {
*/ */
getApp : function(indexOrName) { getApp : function(indexOrName) {
indexOrName = (indexOrName||'').toLowerCase(); indexOrName = (indexOrName||'').toLowerCase();
if (typeof _apps[indexOrName] != 'undefined') { if(typeof _apps[indexOrName] != 'undefined') {
return _apps[indexOrName]; return _apps[indexOrName];
} else { } else {
return null; return null;
@ -80,6 +80,8 @@ _xe_base = {
_apps[sName].push(oApp); _apps[sName].push(oApp);
oApp.parent = this; oApp.parent = this;
// TODO : register event
}, },
/** /**
@ -95,16 +97,23 @@ _xe_base = {
nIndex = $.inArray(oApp, _apps[sName]); nIndex = $.inArray(oApp, _apps[sName]);
if (nIndex >= 0) _apps[sName].splice(nIndex, 1); if (nIndex >= 0) _apps[sName].splice(nIndex, 1);
} }
// TODO : unregister event
}, },
/** /**
* @brief overrides broadcast method * @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++) { for(var i=0; i < _apps.length; i++) {
_apps[i]._cast(sender, msg, params); _apps[i]._cast(sender, msg, params);
} }
// cast to child plugins // cast to child plugins
this._cast(sender, msg, params); this._cast(sender, msg, params);
} }
@ -112,14 +121,25 @@ _xe_base = {
_app_base = { _app_base = {
_plugins : [], _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 * @brief register a plugin instance
*/ */
registerPlugin : function(oPlugin) { registerPlugin : function(oPlugin) {
var self = this;
var sName = oPlugin.getName().toLowerCase(); var sName = oPlugin.getName().toLowerCase();
// check if the plugin is already registered // check if the plugin is already registered
@ -128,75 +148,27 @@ _app_base = {
// push the plugin into the _plugins array // push the plugin into the _plugins array
this._plugins.push(oPlugin); this._plugins.push(oPlugin);
if (!$.isArray(this._plugins[sName])) { if (!$.isArray(this._plugins[sName])) this._plugins[sName] = [];
this._plugins[sName] = [];
}
this._plugins[sName].push(oPlugin); this._plugins[sName].push(oPlugin);
// register method pool // register method pool
var msgs = this._messages; $.each(oPlugin._binded_fn, function(api, fn){ self.registerHandler(api, fn); });
$.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;
// binding // binding
oPlugin.cast = function(msg, params) { oPlugin.oApp = this;
return oPlugin._cast(msg, params);
};
oPlugin.broadcast = function(msg, params) { // TODO : registered event
oPlugin._broadcast(msg, params);
};
return true; return true;
}, },
/** /**
* @brief unregister a plugin instance * @brief register api message handler
*/ */
unregisterPlugin : function(oPlugin) { registerHandler : function(api, func) {
var sName = oPlugin.getName().toLowerCase(); var msgs = this._messages; api = api.toUpperCase();
if (!$.isArray(msgs[api])) msgs[api] = [];
// remove from _plugins array msgs[api].push(func);
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;
}, },
cast : function(msg, params) { cast : function(msg, params) {
@ -204,8 +176,8 @@ _app_base = {
}, },
broadcast : function(sender, msg, params) { broadcast : function(sender, msg, params) {
if (this.parent && this.parent.broadcast) { if (this.parent && this.parent._broadcast) {
this.parent.broadcast(sender, msg, params); this.parent._broadcast(sender, msg, params);
} }
}, },
@ -223,9 +195,7 @@ _app_base = {
// main api function // main api function
var vRet = [], sFn = 'API_'+msg; var vRet = [], sFn = 'API_'+msg;
if ($.isFunction(this[sFn])) vRet.push( this[sFn](sender, params) ); if ($.isArray(aMsg[msg])) {
if ($.isFunction(aMsg[msg])) vRet.push( aMsg[msg](sender, params) );
else if ($.isArray(aMsg[msg])) {
for(i=0; i < aMsg[msg].length; i++) { for(i=0; i < aMsg[msg].length; i++) {
vRet.push( aMsg[msg][i](sender, params) ); vRet.push( aMsg[msg][i](sender, params) );
} }
@ -237,7 +207,7 @@ _app_base = {
this._cast(sender, 'AFTER_'+msg, params); this._cast(sender, 'AFTER_'+msg, params);
} }
if (!/^(?:AFTER_|BEFORE_)/.test(msg)) { // top level function if (!/^(?:AFTER|BEFORE)_/.test(msg)) { // top level function
return vRet; return vRet;
} else { } else {
return $.isArray(vRet)?($.inArray(false, vRet)<0):((typeof vRet=='undefined')?true:!!vRet); return $.isArray(vRet)?($.inArray(false, vRet)<0):((typeof vRet=='undefined')?true:!!vRet);
@ -247,14 +217,14 @@ _app_base = {
_plugin_base = { _plugin_base = {
oApp : null, oApp : null,
_binded_fn : [],
_cast : function(msg, params) { cast : function(msg, params) {
if (this.oApp && this.oApp._cast) { if (this.oApp && this.oApp._cast) {
return this.oApp._cast(this, msg, params || []); return this.oApp._cast(this, msg, params || []);
} }
}, },
_broadcast : function(msg, params) {
broadcast : function(msg, params) {
if (this.oApp && this.oApp.broadcast) { if (this.oApp && this.oApp.broadcast) {
this.oApp.broadcast(this, mag, params || []); this.oApp.broadcast(this, mag, params || []);
} }
@ -269,13 +239,26 @@ _plugin_base = {
function getTypeBase() { function getTypeBase() {
var _base = function() { var _base = function() {
var self = this;
var pool = null;
if ($.isArray(this._plugins)) this._plugins = []; if ($.isArray(this._plugins)) this._plugins = [];
if ($.isArray(this._messages)) this._messages = []; if (this._messages) this._messages = {};
if ($.isArray(this._binded_fn)) this._binded_fn = []; 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)) { var api = RegExp.$1;
this.init.apply(this, arguments); 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; return _base;
@ -285,9 +268,9 @@ window.xe = $.extend(_app_base, _xe_base);
window.xe.lang = {}; // language repository window.xe.lang = {}; // language repository
// domready event // domready event
$(function(){ xe.broadcast(xe, 'ONREADY'); }); $(function(){ xe.broadcast('ONREADY'); });
// load event // load event
$(window).load(function(){ xe.broadcast(xe, 'ONLOAD'); }); $(window).load(function(){ xe.broadcast('ONLOAD'); });
})(jQuery); })(jQuery);

View file

@ -126,6 +126,7 @@
$lang->mid = 'Module Name'; $lang->mid = 'Module Name';
$lang->sid = 'Site Name'; $lang->sid = 'Site Name';
$lang->layout = 'Layout'; $lang->layout = 'Layout';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Widget'; $lang->widget = 'Widget';
$lang->module = 'Module'; $lang->module = 'Module';
$lang->skin = 'Theme'; $lang->skin = 'Theme';

View file

@ -125,6 +125,7 @@
$lang->mid = 'ID del Módulo'; $lang->mid = 'ID del Módulo';
$lang->sid = 'Site Name'; $lang->sid = 'Site Name';
$lang->layout = 'Composición'; $lang->layout = 'Composición';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Widget'; $lang->widget = 'Widget';
$lang->module = 'Módulo'; $lang->module = 'Módulo';
$lang->skin = 'Tema'; //máscara, $lang->skin = 'Tema'; //máscara,

View file

@ -126,6 +126,7 @@
$lang->mid = 'Nom'; $lang->mid = 'Nom';
$lang->sid = 'Site Name'; $lang->sid = 'Site Name';
$lang->layout = 'Mise en Page'; $lang->layout = 'Mise en Page';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Gadget'; $lang->widget = 'Gadget';
$lang->module = 'Module'; $lang->module = 'Module';
$lang->skin = 'Habillage'; $lang->skin = 'Habillage';

View file

@ -126,6 +126,7 @@
$lang->mid = 'Module Name'; $lang->mid = 'Module Name';
$lang->sid = 'Site Name'; $lang->sid = 'Site Name';
$lang->layout = 'Layout'; $lang->layout = 'Layout';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Widget'; $lang->widget = 'Widget';
$lang->module = 'Modul'; $lang->module = 'Modul';
$lang->skin = 'Thema'; $lang->skin = 'Thema';

View file

@ -126,6 +126,7 @@
$lang->mid = 'モジュール名'; $lang->mid = 'モジュール名';
$lang->sid = 'バーチャルVirtualサイト名'; $lang->sid = 'バーチャルVirtualサイト名';
$lang->layout = 'レイアウト'; $lang->layout = 'レイアウト';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'ウィジェット'; $lang->widget = 'ウィジェット';
$lang->module = 'モジュール'; $lang->module = 'モジュール';
$lang->skin = 'スキン'; $lang->skin = 'スキン';

View file

@ -126,6 +126,7 @@
$lang->mid = '모듈 이름'; $lang->mid = '모듈 이름';
$lang->sid = '가상 사이트 이름'; $lang->sid = '가상 사이트 이름';
$lang->layout = '레이아웃'; $lang->layout = '레이아웃';
$lang->mobile_layout = '모바일 레이아웃';
$lang->widget = '위젯 '; $lang->widget = '위젯 ';
$lang->module = '모듈'; $lang->module = '모듈';
$lang->skin = '스킨'; $lang->skin = '스킨';

View file

@ -128,6 +128,7 @@
$lang->mid = 'Модиул нэр'; $lang->mid = 'Модиул нэр';
$lang->sid = 'Тvр сайтын нэр'; $lang->sid = 'Тvр сайтын нэр';
$lang->layout = 'Лэйаут'; $lang->layout = 'Лэйаут';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Вижет '; $lang->widget = 'Вижет ';
$lang->module = 'Модиул'; $lang->module = 'Модиул';
$lang->skin = 'Скин'; $lang->skin = 'Скин';

View file

@ -126,6 +126,7 @@
$lang->mid = 'Имя Модуля'; $lang->mid = 'Имя Модуля';
$lang->sid = 'Site Name'; $lang->sid = 'Site Name';
$lang->layout = 'Лейаут'; $lang->layout = 'Лейаут';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Виджет'; $lang->widget = 'Виджет';
$lang->module = 'Модуль'; $lang->module = 'Модуль';
$lang->skin = 'Тема'; $lang->skin = 'Тема';

View file

@ -2,10 +2,11 @@
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ /* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░ ░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░ ░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░ ░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
░░ * @Website: http://vietxe.net ░░ ░░ * @Website: http://xpressengine.vn ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░ ░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/
// words for action, which is basically used // words for action, which is basically used
$lang->cmd_write = 'Gửi bài mới'; $lang->cmd_write = 'Gửi bài mới';
@ -84,7 +85,7 @@
$lang->password1 = 'Mật khẩu'; $lang->password1 = 'Mật khẩu';
$lang->password2 = 'Nhập lại mật khẩu'; $lang->password2 = 'Nhập lại mật khẩu';
$lang->admin_id = 'Admin ID'; $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->user_name = 'Tên thật';
$lang->nick_name = 'NickName'; $lang->nick_name = 'NickName';
$lang->email_address = 'Email'; $lang->email_address = 'Email';
@ -117,11 +118,12 @@
$lang->notify = 'Thông báo'; $lang->notify = 'Thông báo';
$lang->order_target = 'Đường dẫn đích'; $lang->order_target = 'Đường dẫn đích';
$lang->order_type = 'Phân loại theo định dạng'; $lang->order_type = 'Phân loại theo định dạng';
$lang->order_asc = 'Tăng'; $lang->order_asc = 'Tăng dần';
$lang->order_desc = 'Không tăng'; $lang->order_desc = 'Giảm dần';
$lang->mid = 'Tên Module'; $lang->mid = 'Tên Module';
$lang->layout = 'Giao diện'; $lang->layout = 'Giao diện';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Widget'; $lang->widget = 'Widget';
$lang->module = 'Module'; $lang->module = 'Module';
$lang->skin = 'Skin'; $lang->skin = 'Skin';
@ -210,7 +212,7 @@
$lang->msg_invalid_queryid = 'Giá trị ID không hợp lệ'; $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_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_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_request = 'Yêu cầu không hợp lệ';
$lang->msg_invalid_password = 'Mật khẩu không đúng'; $lang->msg_invalid_password = 'Mật khẩu không đúng';
$lang->msg_error_occured = 'Đã có lỗi xảy ra.'; $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_registed = 'Chúc mừng bạn đã đăng kí thành công!';
$lang->success_declared = 'Đã báo cáo.'; $lang->success_declared = 'Đã báo cáo.';
$lang->success_updated = 'Đã cập nhật xong.'; $lang->success_updated = 'Đã cập nhật thành công.';
$lang->success_deleted = 'Đã xóa.'; $lang->success_deleted = 'Đã xóa thành công.';
$lang->success_voted = 'Đã bình chọn.'; $lang->success_voted = 'Đã bình chọn.';
$lang->success_blamed = 'Đã phê bình.'; $lang->success_blamed = 'Đã phê bình.';
$lang->success_moved = 'Đã chuyển.'; $lang->success_moved = 'Đã chuyển.';
$lang->success_sended = 'Đã gửi.'; $lang->success_sended = 'Đã gửi thành công.';
$lang->success_reset = 'Đã thiết lập lại.'; $lang->success_reset = 'Đã thiết lập lại thành công.';
$lang->success_leaved = 'Tất cả các thành viên đã được xóa.'; $lang->success_leaved = 'Đã xóa tất cả các thành viên.';
$lang->success_saved = 'Đã lưu.'; $lang->success_saved = 'Đã lưu thành công.';
$lang->fail_to_delete = 'Không thể xóa.'; $lang->fail_to_delete = 'Không thể xóa.';
$lang->fail_to_move = 'Không thể chuyển.'; $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_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_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_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 = 'Định dạng cột';
$lang->column_type_list['text'] = 'Ô nhập liệu'; $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['textarea'] = 'Khu vực nội dung';
$lang->column_type_list['checkbox'] = 'Ô chọn (Nhiều lựa chọn)'; $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['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['date'] = 'Ngày (yyyy/mm/dd)';
//$lang->column_type_list['jp_zip'] = 'zip code (Japanese)'; //$lang->column_type_list['jp_zip'] = 'zip code (Japanese)';
$lang->column_name = 'Tên cột'; $lang->column_name = 'Tên cột';
@ -270,9 +272,9 @@
// ftp 관련 // ftp 관련
$lang->ftp_form_title = 'Thông tin FTP'; $lang->ftp_form_title = 'Thông tin FTP';
$lang->ftp = 'FTP'; $lang->ftp = 'FTP';
$lang->ftp_host = 'FTP hostname'; $lang->ftp_host = 'Tên Host FTP';
$lang->ftp_port = 'Cổng kết nối:'; $lang->ftp_port = 'Cổng kết nối';
$lang->about_ftp_password = 'FTP password will not be stored'; $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->cmd_check_ftp_connect = 'Kiểm tra kết nối bằng FTP';
$lang->about_ftp_info = " $lang->about_ftp_info = "
Thông tin tài khoản FTP thể được sử dụng trong các trường hợp sau: <br /> Thông tin tài khoản FTP 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 /> Thông tin tài khoản FTP này sẽ được lưu giữ tại: 'files/config/ftp.config.php'<br />
Sau khi cài đặt bạn thể xóa hoặc thay đổi thông tin tại Bảng điều khiển của Administrator.<br />"; Sau khi cài đặt bạn thể xóa hoặc thay đổi thông tin tại Bảng điều khiển của Administrator.<br />";
$lang->msg_safe_mode_ftp_needed = "Nếu safe_mode của PHP mở, bạn nên nhập thông tin của FTP để cài đặt XE."; $lang->msg_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 tài khoản và cổng kết nối!"; $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 không thành công. Xin vui lòng kiểm tra lại tên sử dụng và mật khẩu."; $lang->msg_ftp_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_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->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->ftp_path_title = 'Hãy nhập thông tin đường dẫn của FTP.';
$lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; $lang->msg_ftp_installed_realpath = 'Đường dẫn thư mục đã cài đặt XE';
$lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; $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 // 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->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_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_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 = "Đị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_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 = "Đị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_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->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ị.";
?> ?>

View file

@ -126,6 +126,7 @@
$lang->mid = '模块名称'; $lang->mid = '模块名称';
$lang->sid = '站点名称'; $lang->sid = '站点名称';
$lang->layout = '布局'; $lang->layout = '布局';
$lang->mobile_layout = '移动版布局';
$lang->widget = '控件 '; $lang->widget = '控件 ';
$lang->module = '模块'; $lang->module = '模块';
$lang->skin = '皮肤'; $lang->skin = '皮肤';
@ -257,7 +258,7 @@
$lang->confirm_move = '确定要移动吗?'; $lang->confirm_move = '确定要移动吗?';
$lang->confirm_reset = '确定要初始化吗?'; $lang->confirm_reset = '确定要初始化吗?';
$lang->confirm_leave = '确定要注销吗?'; $lang->confirm_leave = '确定要注销吗?';
$lang->confirm_update = 'Are you sure to update?'; $lang->confirm_update = '确定要更新吗?';
$lang->column_type = '格式'; $lang->column_type = '格式';
$lang->column_type_list['text'] = '单行文本输入区(text)'; $lang->column_type_list['text'] = '单行文本输入区(text)';
@ -281,9 +282,9 @@
// ftp 相关 // ftp 相关
$lang->ftp_form_title = '设置FTP信息'; $lang->ftp_form_title = '设置FTP信息';
$lang->ftp = 'FTP'; $lang->ftp = 'FTP';
$lang->ftp_host = 'FTP hostname'; $lang->ftp_host = 'FTP服务器名';
$lang->ftp_port = 'FTP port'; $lang->ftp_port = 'FTP端口';
$lang->about_ftp_password = 'FTP password will not be stored'; $lang->about_ftp_password = 'FTP密码不会被保存。';
$lang->cmd_check_ftp_connect = '测试FTP连接'; $lang->cmd_check_ftp_connect = '测试FTP连接';
$lang->about_ftp_info = " $lang->about_ftp_info = "
相关FTP信息应用于如下几种状况:<br/> 相关FTP信息应用于如下几种状况:<br/>
@ -300,9 +301,9 @@
$lang->msg_ftp_chmod_fail = "修改文件夹属性失败。请确认 FTP服务器设置。"; $lang->msg_ftp_chmod_fail = "修改文件夹属性失败。请确认 FTP服务器设置。";
$lang->msg_ftp_connect_success = "FTP连接成功。"; $lang->msg_ftp_connect_success = "FTP连接成功。";
$lang->ftp_path_title = 'FTP 경로 정보 입력'; $lang->ftp_path_title = '输入FTP路径信息';
$lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; $lang->msg_ftp_installed_realpath = 'XE绝对路径';
$lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; $lang->msg_ftp_installed_ftp_realpath = 'FTP绝对路径设置';
// 在xml filter使用的 javascript用 alert msg // 在xml filter使用的 javascript用 alert msg
$lang->filter->isnull = '请输入%s'; $lang->filter->isnull = '请输入%s';
@ -317,5 +318,5 @@
$lang->filter->invalid_alpha_number = '%s只能输入英文或数字'; $lang->filter->invalid_alpha_number = '%s只能输入英文或数字';
$lang->filter->invalid_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操作。";
?> ?>

View file

@ -126,6 +126,7 @@
$lang->mid = '模組名稱'; $lang->mid = '模組名稱';
$lang->sid = '網站名稱'; $lang->sid = '網站名稱';
$lang->layout = '版面'; $lang->layout = '版面';
$lang->mobile_layout = 'Mobile Layout';
$lang->widget = 'Widget'; $lang->widget = 'Widget';
$lang->module = '模組'; $lang->module = '模組';
$lang->skin = '面板'; $lang->skin = '面板';

View 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>

View file

@ -13,7 +13,7 @@
* @brief XE의 전체 버전 표기 * @brief XE의 전체 버전 표기
* 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 * 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/ **/
define('__ZBXE_VERSION__', '1.4.2.3'); define('__ZBXE_VERSION__', '1.4.3');
/** /**
* @brief zbXE가 설치된 장소의 base path를 구함 * @brief zbXE가 설치된 장소의 base path를 구함
@ -145,6 +145,7 @@
require(_XE_PATH_.'classes/template/TemplateHandler.class.php'); require(_XE_PATH_.'classes/template/TemplateHandler.class.php');
require(_XE_PATH_.'classes/mail/Mail.class.php'); require(_XE_PATH_.'classes/mail/Mail.class.php');
require(_XE_PATH_.'classes/page/PageHandler.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__; if(__DEBUG__) $GLOBALS['__elapsed_class_load__'] = getMicroTime() - __ClassLoadStartTime__;
} }
?> ?>

View file

@ -677,8 +677,13 @@
function _isHackedSrc($src) { function _isHackedSrc($src) {
if(!$src) return false; if(!$src) return false;
if($src) { 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); $url_info = parse_url($src);
$query = $url_info['query']; $query = $url_info['query'];
if(!trim($query)) return false;
$query = str_replace("&amp;","&",$query); $query = str_replace("&amp;","&",$query);
$queries = explode('&', $query); $queries = explode('&', $query);
$cnt = count($queries); $cnt = count($queries);
@ -690,9 +695,6 @@
$val = strtolower(trim(substr($tmp_str,$pos+1))); $val = strtolower(trim(substr($tmp_str,$pos+1)));
if( ($key=='module'&&$val=='admin') || ($key=='act'&&preg_match('/admin/i',$val)) ) return true; 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; return false;
} }
@ -850,7 +852,7 @@
function isCrawler($agent = null) { function isCrawler($agent = null) {
if(!$agent) $agent = $_SERVER['HTTP_USER_AGENT']; 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( $check_ip = array(
'211.245.21.11*' /* mixsh */ '211.245.21.11*' /* mixsh */
); );

View file

@ -76,7 +76,7 @@
<name xml:lang="es">zero</name> <name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name> <name xml:lang="zh-CN">zero</name>
<name xml:lang="zh-TW">zero</name> <name xml:lang="zh-TW">zero</name>
<name xml:lang="vi">zero</name> <name xml:lang="vi">zero</name>
</author> </author>
<extra_vars> <extra_vars>
@ -89,7 +89,7 @@
<title xml:lang="ge">Colorset</title> <title xml:lang="ge">Colorset</title>
<title xml:lang="ru">Colorset</title> <title xml:lang="ru">Colorset</title>
<title xml:lang="es">Set de colores</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="ko">원하시는 컬러셋을 선택해주세요.</description>
<description xml:lang="jp">希望するカラーセットを選択して下さい。</description> <description xml:lang="jp">希望するカラーセットを選択して下さい。</description>
<description xml:lang="zh-CN">请选择颜色。</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="ge">Bitte wählen Sie ein colorset Sie wollen.</description>
<description xml:lang="ru">Выберите colorset хотите.</description> <description xml:lang="ru">Выберите colorset хотите.</description>
<description xml:lang="es">Seleccione set de colores que desea.</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"> <options value="default">
<title xml:lang="ko">기본</title> <title xml:lang="ko">기본</title>
<title xml:lang="jp">デフォルト</title> <title xml:lang="jp">デフォルト</title>
@ -108,7 +108,7 @@
<title xml:lang="es">Básico</title> <title xml:lang="es">Básico</title>
<title xml:lang="zh-CN">默认</title> <title xml:lang="zh-CN">默认</title>
<title xml:lang="zh-TW">預設</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>
<options value="black"> <options value="black">
<title xml:lang="ko">검은색</title> <title xml:lang="ko">검은색</title>
@ -119,7 +119,7 @@
<title xml:lang="es">Negro</title> <title xml:lang="es">Negro</title>
<title xml:lang="zh-CN">黑色</title> <title xml:lang="zh-CN">黑色</title>
<title xml:lang="zh-TW">黑色</title> <title xml:lang="zh-TW">黑色</title>
<title xml:lang="vi">Black</title> <title xml:lang="vi">Black</title>
</options> </options>
<options value="white"> <options value="white">
<title xml:lang="ko">하얀색</title> <title xml:lang="ko">하얀색</title>
@ -130,7 +130,7 @@
<title xml:lang="es">Blanco</title> <title xml:lang="es">Blanco</title>
<title xml:lang="zh-CN">白色</title> <title xml:lang="zh-CN">白色</title>
<title xml:lang="zh-TW">白色</title> <title xml:lang="zh-TW">白色</title>
<title xml:lang="vi">White</title> <title xml:lang="vi">White</title>
</options> </options>
</var> </var>
<var name="logo_image" type="image"> <var name="logo_image" type="image">
@ -142,7 +142,7 @@
<title xml:lang="ge">Logobildes</title> <title xml:lang="ge">Logobildes</title>
<title xml:lang="ru">Изображения логотипа</title> <title xml:lang="ru">Изображения логотипа</title>
<title xml:lang="es">Imagen del logotipo</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="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다)</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。)</description> <description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。)</description>
<description xml:lang="zh-CN">请输入显示在布局顶部的LOGO图片(高度为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="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="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="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>
<var name="index_url" type="text"> <var name="index_url" type="text">
<title xml:lang="ko">홈 페이지 URL</title> <title xml:lang="ko">홈 페이지 URL</title>
@ -162,7 +162,7 @@
<title xml:lang="ge">Homepage URL</title> <title xml:lang="ge">Homepage URL</title>
<title xml:lang="ru">Домашняя страница URL</title> <title xml:lang="ru">Домашняя страница URL</title>
<title xml:lang="es">URL de la página web</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="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
<description xml:lang="jp">ロゴをクリックした時に移動するホームページのURLを入力して下さい。</description> <description xml:lang="jp">ロゴをクリックした時に移動するホームページのURLを入力して下さい。</description>
<description xml:lang="zh-CN">点击网站LOGO时要移动的页面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="ge">Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo</description>
<description xml:lang="ru">Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип</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="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>
<var name="background_image" type="image"> <var name="background_image" type="image">
<title xml:lang="ko">배경 이미지</title> <title xml:lang="ko">배경 이미지</title>
@ -182,7 +182,7 @@
<title xml:lang="ge">Hintergrundbild</title> <title xml:lang="ge">Hintergrundbild</title>
<title xml:lang="ru">Фоновое изображение</title> <title xml:lang="ru">Фоновое изображение</title>
<title xml:lang="es">Imagen de fondo</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="ko">배경 이미지를 사용하시려면 등록해주세요.</description>
<description xml:lang="jp">背景イメージを使う場合は、登録して下さい。</description> <description xml:lang="jp">背景イメージを使う場合は、登録して下さい。</description>
<description xml:lang="zh-CN">要想使用背景图片请在这里上传。</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="ge">Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild.</description>
<description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description> <description xml:lang="ru">Введите, если вы хотите использовать фоновое изображение.</description>
<description xml:lang="es">Ingresar imagen de fondo si desea usar.</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> </var>
</extra_vars> </extra_vars>
@ -205,7 +205,7 @@
<title xml:lang="ge">Top Menü</title> <title xml:lang="ge">Top Menü</title>
<title xml:lang="ru">Верхнее меню</title> <title xml:lang="ru">Верхнее меню</title>
<title xml:lang="es">Menú Principal</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>
<menu name="bottom_menu" maxdepth="1"> <menu name="bottom_menu" maxdepth="1">
<title xml:lang="ko">하단 메뉴 </title> <title xml:lang="ko">하단 메뉴 </title>
@ -216,7 +216,7 @@
<title xml:lang="ge">Bottom-Menü</title> <title xml:lang="ge">Bottom-Menü</title>
<title xml:lang="ru">Внизу меню</title> <title xml:lang="ru">Внизу меню</title>
<title xml:lang="es">Menú Inferior </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> </menu>
</menus> </menus>
</layout> </layout>

View 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>

View 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
View 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}

View file

@ -24,15 +24,17 @@
// addon값을 받아옴 // addon값을 받아옴
$addon = Context::get('addon'); $addon = Context::get('addon');
$type = Context::get('type');
if(!$type) $type = "pc";
if($addon) { 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->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 애드온 활성화 * @brief 애드온 활성화
* addons라는 테이블에 애드온의 활성화 상태를 on 시켜줌 * addons라는 테이블에 애드온의 활성화 상태를 on 시켜줌
**/ **/
function doActivate($addon, $site_srl = 0) { function doActivate($addon, $site_srl = 0, $type = "pc") {
$args->addon = $addon; $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); if(!$site_srl) return executeQuery('addon.updateAddon', $args);
$args->site_srl = $site_srl; $args->site_srl = $site_srl;
return executeQuery('addon.updateSiteAddon', $args); return executeQuery('addon.updateSiteAddon', $args);
@ -84,9 +88,10 @@
* *
* addons라는 테이블에 애드온의 이름을 제거하는 것으로 비활성화를 시키게 된다 * addons라는 테이블에 애드온의 이름을 제거하는 것으로 비활성화를 시키게 된다
**/ **/
function doDeactivate($addon, $site_srl = 0) { function doDeactivate($addon, $site_srl = 0, $type = "pc") {
$args->addon = $addon; $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); if(!$site_srl) return executeQuery('addon.updateAddon', $args);
$args->site_srl = $site_srl; $args->site_srl = $site_srl;
return executeQuery('addon.updateSiteAddon', $args); return executeQuery('addon.updateSiteAddon', $args);

View file

@ -38,6 +38,7 @@
for($i=0;$i<$searched_count;$i++) { for($i=0;$i<$searched_count;$i++) {
// 애드온의 이름 // 애드온의 이름
$addon_name = $searched_list[$i]; $addon_name = $searched_list[$i];
if($addon_name == "smartphone") continue;
// 애드온의 경로 (files/addons가 우선) // 애드온의 경로 (files/addons가 우선)
$path = $this->getAddonPath($addon_name); $path = $this->getAddonPath($addon_name);
@ -49,6 +50,7 @@
$info->addon = $addon_name; $info->addon = $addon_name;
$info->path = $path; $info->path = $path;
$info->activated = false; $info->activated = false;
$info->mactivated = false;
// DB에 입력되어 있는지 확인 // DB에 입력되어 있는지 확인
if(!in_array($addon_name, array_keys($inserted_addons))) { if(!in_array($addon_name, array_keys($inserted_addons))) {
@ -59,6 +61,7 @@
// 활성화 되어 있는지 확인 // 활성화 되어 있는지 확인
} else { } else {
if($inserted_addons[$addon_name]->is_used=='Y') $info->activated = true; 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; $list[] = $info;
@ -291,12 +294,16 @@
/** /**
* @brief 애드온이 활성화 되어 있는지 체크 * @brief 애드온이 활성화 되어 있는지 체크
**/ **/
function isActivatedAddon($addon, $site_srl = 0) { function isActivatedAddon($addon, $site_srl = 0, $type = "pc") {
$args->addon = $addon; $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 { else {
$args->site_srl = $site_srl; $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; if($output->data->count>0) return true;
return false; return false;

View file

@ -7,8 +7,6 @@
class addon extends ModuleObject { class addon extends ModuleObject {
var $cache_file = "./files/cache/activated_addons.cache.php";
/** /**
* @brief 설치시 추가 작업이 필요할시 구현 * @brief 설치시 추가 작업이 필요할시 구현
**/ **/
@ -42,7 +40,9 @@
* @brief 설치가 이상이 없는지 체크하는 method * @brief 설치가 이상이 없는지 체크하는 method
**/ **/
function checkUpdate() { 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; return false;
} }
@ -50,6 +50,13 @@
* @brief 업데이트 실행 * @brief 업데이트 실행
**/ **/
function moduleUpdate() { 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(); return new Object();
} }

View file

@ -17,20 +17,20 @@
/** /**
* @brief 메인/ 가상 사이트별 애드온 캐시 파일의 위치를 구함 * @brief 메인/ 가상 사이트별 애드온 캐시 파일의 위치를 구함
**/ **/
function getCacheFilePath() { function getCacheFilePath($type = "pc") {
$site_module_info = Context::get('site_module_info'); $site_module_info = Context::get('site_module_info');
$site_srl = $site_module_info->site_srl; $site_srl = $site_module_info->site_srl;
$addon_path = _XE_PATH_.'files/cache/addons/'; $addon_path = _XE_PATH_.'files/cache/addons/';
if($site_srl) $addon_file = $addon_path.$site_srl.'.acivated_addons.cache.php'; if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php';
else $addon_file = $addon_path.'acivated_addons.cache.php'; else $addon_file = $addon_path.$type.'acivated_addons.cache.php';
if($this->addon_file_called) return $addon_file; if($this->addon_file_called) return $addon_file;
$this->addon_file_called = true; $this->addon_file_called = true;
if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); 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; return $addon_file;
} }
@ -120,13 +120,15 @@
/** /**
* @brief 캐시 파일 생성 * @brief 캐시 파일 생성
**/ **/
function makeCacheFile($site_srl = 0) { function makeCacheFile($site_srl = 0, $type = "pc") {
// 모듈에서 애드온을 사용하기 위한 캐시 파일 생성 // 모듈에서 애드온을 사용하기 위한 캐시 파일 생성
$buff = ""; $buff = "";
$oAddonModel = &getAdminModel('addon'); $oAddonModel = &getAdminModel('addon');
$addon_list = $oAddonModel->getInsertedAddons($site_srl); $addon_list = $oAddonModel->getInsertedAddons($site_srl, $type);
foreach($addon_list as $addon => $val) { 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); $extra_vars = unserialize($val->extra_vars);
$mid_list = $extra_vars->mid_list; $mid_list = $extra_vars->mid_list;
@ -146,8 +148,8 @@
$addon_path = _XE_PATH_.'files/cache/addons/'; $addon_path = _XE_PATH_.'files/cache/addons/';
if(!is_dir($addon_path)) FileHandler::makeDir($addon_path); if(!is_dir($addon_path)) FileHandler::makeDir($addon_path);
if($site_srl) $addon_file = $addon_path.$site_srl.'.acivated_addons.cache.php'; if($site_srl) $addon_file = $addon_path.$site_srl.$type.'.acivated_addons.cache.php';
else $addon_file = $addon_path.'acivated_addons.cache.php'; else $addon_file = $addon_path.$type.'acivated_addons.cache.php';
FileHandler::writeFile($addon_file, $buff); FileHandler::writeFile($addon_file, $buff);
} }

View 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>

View file

@ -1,4 +1,4 @@
<query id="getAddonIsActivated" action="select"> <query id="getSiteAddonIsActivated" action="select">
<tables> <tables>
<table name="addons_site" /> <table name="addons_site" />
</tables> </tables>

View 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>

View file

@ -4,6 +4,7 @@
</tables> </tables>
<columns> <columns>
<column name="is_used" var="is_used" /> <column name="is_used" var="is_used" />
<column name="is_used_m" var="is_used_m" />
<column name="extra_vars" var="extra_vars" /> <column name="extra_vars" var="extra_vars" />
</columns> </columns>
<conditions> <conditions>

View file

@ -4,6 +4,7 @@
</tables> </tables>
<columns> <columns>
<column name="is_used" var="is_used" /> <column name="is_used" var="is_used" />
<column name="is_used_m" var="is_used_m" />
<column name="extra_vars" var="extra_vars" /> <column name="extra_vars" var="extra_vars" />
</columns> </columns>
<conditions> <conditions>

View file

@ -1,6 +1,7 @@
<table name="addons"> <table name="addons">
<column name="addon" type="varchar" size="250" notnull="notnull" primary_key="primary_key" /> <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" 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="extra_vars" type="text" />
<column name="regdate" type="date" index="idx_regdate" /> <column name="regdate" type="date" index="idx_regdate" />
</table> </table>

View file

@ -2,6 +2,7 @@
<column name="site_srl" type="number" size="11" notnull="notnull" default="0" unique="unique_addon_site" /> <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="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" 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="extra_vars" type="text" />
<column name="regdate" type="date" index="idx_regdate" /> <column name="regdate" type="date" index="idx_regdate" />
</table> </table>

View file

@ -9,8 +9,10 @@ function doToggleAddon(addon) {
} }
// 관리자 제어판 페이지용 // 관리자 제어판 페이지용
function doToggleAddonInAdmin(obj, addon) { function doToggleAddonInAdmin(obj, addon, type) {
var params = new Array(); var params = new Array();
params['addon'] = addon; 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"; } ); exec_xml('addon','procAddonAdminToggleActivate',params,function() { if(/Active/.test(obj.className)) obj.className = "buttonSet buttonDisable"; else obj.className = "buttonSet buttonActive"; } );
} }

View file

@ -7,23 +7,8 @@
class adminAdminView extends admin { class adminAdminView extends admin {
/** function loadSideBar()
* @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
$oModuleModel = &getModel('module'); $oModuleModel = &getModel('module');
$installed_module_list = $oModuleModel->getModulesXmlInfo(); $installed_module_list = $oModuleModel->getModulesXmlInfo();
@ -64,6 +49,32 @@
if(count($package_modules)) $package_modules[count($package_modules)-1]->position = 'end'; if(count($package_modules)) $package_modules[count($package_modules)-1]->position = 'end';
Context::set('package_modules', $package_modules); Context::set('package_modules', $package_modules);
Context::set('installed_modules', $installed_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(); $db_info = Context::getDBInfo();
@ -78,11 +89,6 @@
if($db_info->http_port) Context::set('http_port', $db_info->http_port); 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); 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('langs', Context::loadLangSupported());
Context::set('lang_selected', Context::loadLangSelected()); Context::set('lang_selected', Context::loadLangSelected());
Context::set('use_mobile_view', $db_info->use_mobile_view=="Y"?'Y':'N');
$ftp_info = Context::getFTPInfo(); $ftp_info = Context::getFTPInfo();
Context::set('ftp_info', $ftp_info); Context::set('ftp_info', $ftp_info);

View file

@ -10,7 +10,7 @@
<title xml:lang="zh-TW">管理員模組</title> <title xml:lang="zh-TW">管理員模組</title>
<description xml:lang="ko">각 모듈들의 기능을 나열하고 관리자용 레이아웃을 적용하여 관리 기능을 사용할 수 있도록 하는 모듈입니다.</description> <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="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="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="zh-CN">列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。</description>
<description xml:lang="jp">各モジュールの機能を表示し、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。</description> <description xml:lang="jp">各モジュールの機能を表示し、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。</description>

View file

@ -82,5 +82,8 @@
$lang->ftp_get_list = "Get List"; $lang->ftp_get_list = "Get List";
$lang->ftp_remove_info = 'Remove FTP Info.'; $lang->ftp_remove_info = 'Remove FTP Info.';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $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';
?> ?>

View file

@ -84,5 +84,8 @@
$lang->ftp_get_list = "Get List"; $lang->ftp_get_list = "Get List";
$lang->ftp_remove_info = 'Remove FTP Info.'; $lang->ftp_remove_info = 'Remove FTP Info.';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $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';
?> ?>

View file

@ -83,5 +83,8 @@
$lang->ftp_get_list = "Get List"; $lang->ftp_get_list = "Get List";
$lang->ftp_remove_info = 'Remove FTP Info.'; $lang->ftp_remove_info = 'Remove FTP Info.';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $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';
?> ?>

View file

@ -82,5 +82,8 @@
$lang->ftp_get_list = "Get List"; $lang->ftp_get_list = "Get List";
$lang->ftp_remove_info = 'Remove FTP Info.'; $lang->ftp_remove_info = 'Remove FTP Info.';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $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 = 'イージーインストール';
?> ?>

View file

@ -83,4 +83,8 @@
$lang->ftp_remove_info = 'FTP 정보 삭제'; $lang->ftp_remove_info = 'FTP 정보 삭제';
$lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.'; $lang->msg_ftp_invalid_path = 'FTP Path를 읽을 수 없습니다.';
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; $lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.';
$lang->mobile_view = '모바일 뷰 사용';
$lang->about_mobile_view = '스마트폰 등을 이용하여 접속할 때 모바일 화면에 최적화된 레이아웃을 이용하도록 합니다.';
$lang->autoinstall = '쉬운 설치';
?> ?>

View file

@ -81,5 +81,8 @@
$lang->ftp_get_list = 'Get List'; $lang->ftp_get_list = 'Get List';
$lang->ftp_remove_info = 'Remove FTP Info'; $lang->ftp_remove_info = 'Remove FTP Info';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $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';
?> ?>

View file

@ -2,10 +2,11 @@
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ /* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░ ░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░ ░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░ ░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
░░ * @Website: http://vietxe.net ░░ ░░ * @Website: http://xpressengine.vn ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░ ░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/
$lang->admin_info = 'Thông tin Administrator'; $lang->admin_info = 'Thông tin Administrator';
$lang->admin_index = 'Trang chủ Admin'; $lang->admin_index = 'Trang chủ Admin';
@ -36,7 +37,7 @@
$lang->current_version = "Phiên bản"; $lang->current_version = "Phiên bản";
$lang->current_path = "Thư mục cài đặt"; $lang->current_path = "Thư mục cài đặt";
$lang->released_version = "Phiên bản mới nhấ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_module = "Danh sách Module";
$lang->item_addon = "Danh sách Addon"; $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->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->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->about_lang_env = "Để hiển thị ngôn ngữ đã chọn là mặc định. Hãy bấm [Lưu] phía dưới để lưu lại.";
$lang->xe_license = 'XE sử dụng giấy phép GPL'; $lang->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->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->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->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->sftp = "Sử dụng SFTP";
$lang->ftp_get_list = "Get List"; $lang->ftp_get_list = "Nhận danh sách";
$lang->ftp_remove_info = 'Remove FTP Info.'; $lang->ftp_remove_info = 'Xóa thông tin FTP.';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $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 = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; $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';
?> ?>

View file

@ -2,7 +2,7 @@
/** /**
* @file zh-CN.lang.php * @file zh-CN.lang.php
* @author zero (zero@nzeo.com) * @author zero (zero@nzeo.com)
* @brief 简体中文语言包 (只收录基本内容) * @brief 简体中文语言包
**/ **/
$lang->admin_info = '管理员信息'; $lang->admin_info = '管理员信息';
@ -78,9 +78,12 @@
$lang->about_server_ports = "使用除HTTP80, HTTPS443以外的端口时必须得指定该服务器端口号。"; $lang->about_server_ports = "使用除HTTP80, HTTPS443以外的端口时必须得指定该服务器端口号。";
$lang->use_db_session = 'DB储存认证会话'; $lang->use_db_session = 'DB储存认证会话';
$lang->about_db_session = '用DB储存认证时的PHP会话。<br/>服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。<br/>只是无法统计在线会员。'; $lang->about_db_session = '用DB储存认证时的PHP会话。<br/>服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。<br/>只是无法统计在线会员。';
$lang->sftp = "Use SFTP"; $lang->sftp = '使用sSFTP';
$lang->ftp_get_list = "Get List"; $lang->ftp_get_list = '载入列表';
$lang->ftp_remove_info = 'Remove FTP Info.'; $lang->ftp_remove_info = '删除FTP信息';
$lang->msg_ftp_invalid_path = 'Failed to read the specified FTP Path.'; $lang->msg_ftp_invalid_path = '无法读取FTP路径。';
$lang->msg_self_restart_cache_engine = 'Memcached 또는 캐쉬데몬을 재시작 해주세요.'; $lang->msg_self_restart_cache_engine = '请重新启动Memcached或CacheDaemon。';
$lang->mobile_view = '开启移动版';
$lang->about_mobile_view = '为智能手机访问网站,提供最佳视觉效果。';
$lang->autoinstall = '安装·更新';
?> ?>

View file

@ -83,4 +83,7 @@
$lang->ftp_remove_info = '移除 FTP 資料'; $lang->ftp_remove_info = '移除 FTP 資料';
$lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。'; $lang->msg_ftp_invalid_path = '指定的 FTP 路徑讀取失敗。';
$lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。'; $lang->msg_self_restart_cache_engine = '請重新啟動 Memcached 快取程式。';
$lang->mobile_view = '手機瀏覽';
$lang->about_mobile_view = '使用手機瀏覽時將會顯示最適當的畫面。';
$lang->autoinstall = '自動安裝';
?> ?>

View file

@ -15,7 +15,8 @@
</li> </li>
</ul> </ul>
<ul class="lnb"> <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)--> <!--@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> <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>

View file

@ -114,6 +114,13 @@
<p>{$lang->about_server_ports}</p> <p>{$lang->about_server_ports}</p>
</td> </td>
</tr> </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> <tr>
<th colspan="2" class="button"> <th colspan="2" class="button">
<span class="button black strong"><input type="submit" value="{$lang->cmd_save}" /></span> <span class="button black strong"><input type="submit" value="{$lang->cmd_save}" /></span>

View file

@ -89,7 +89,8 @@
<tr> <tr>
<th><div>{$lang->addon}</div></th> <th><div>{$lang->addon}</div></th>
<th><div>{$lang->cmd_setup}</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> </tr>
</thead> </thead>
<tbody> <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> <a href="#" onclick="doToggleAddonInAdmin(this, '{$val->addon}');return false;" title="{htmlspecialchars($lang->notuse)}" class="buttonSet buttonDisable"><span>{$lang->notuse}</span></a>
<!--@end--> <!--@end-->
</td> </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> </tr>
<!--@end--> <!--@end-->
</tbody> </tbody>

View file

@ -67,16 +67,19 @@
$config_file = null; $config_file = null;
switch($type) switch($type)
{ {
case "module": case "m.layout":
case "addon": $type = "layout";
case "layout": case "module":
case "widget": case "addon":
case "layout":
case "widget":
$config_file = "/conf/info.xml"; $config_file = "/conf/info.xml";
break; break;
case "component": case "component":
$config_file = "/info.xml"; $config_file = "/info.xml";
break; break;
case "style": case "style":
case "m.skin":
$type = "skin"; $type = "skin";
case "skin": case "skin":
case "widgetstyle": case "widgetstyle":

View file

@ -91,6 +91,8 @@
$xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file); $xmlDoc = $xml->loadXmlFile(FileHandler::getRealPath($path).$config_file);
if(!$xmlDoc) continue; if(!$xmlDoc) continue;
if($type == "drcomponent") $type = "component"; if($type == "drcomponent") $type = "component";
if($type == "style" || $type == "m.skin") $type = "skin";
if($type == "m.layout") $type = "layout";
$title = $xmlDoc->{$type}->title->body; $title = $xmlDoc->{$type}->title->body;
$installed[$key]->title = $title; $installed[$key]->title = $title;
} }

View file

@ -148,6 +148,7 @@
$config_file = null; $config_file = null;
switch($type) switch($type)
{ {
case "m.layout":
case "module": case "module":
case "addon": case "addon":
case "layout": case "layout":
@ -157,6 +158,7 @@
case "component": case "component":
$config_file = "/info.xml"; $config_file = "/info.xml";
break; break;
case "m.skin":
case "skin": case "skin":
case "widgetstyle": case "widgetstyle":
case "style": case "style":

View file

@ -2,33 +2,33 @@
<module version="0.2"> <module version="0.2">
<title xml:lang="ko">쉬운 설치</title> <title xml:lang="ko">쉬운 설치</title>
<title xml:lang="en">EasyInstaller</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-TW">自動安裝</title>
<title xml:lang="zh-CN">在线安装</title> <title xml:lang="zh-CN">安装·更新</title>
<title xml:lang="jp">イージーインストール</title> <title xml:lang="jp">イージーインストール</title>
<description xml:lang="ko">관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다.</description> <description xml:lang="ko">관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다.</description>
<description xml:lang="en">With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click.</description> <description xml:lang="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="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-TW">可以藉由此模組安裝、更新程式包括模組、面板、版面等。</description>
<description xml:lang="zh-CN">很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。</description> <description xml:lang="zh-CN">很方便的在线安装/更新XE相关模块(模块/皮肤/布局/控件/控件样式等)。</description>
<description xml:lang="jp">管理者モードにてクリックだけで、モジュール/スキン/レイアウト/ウィジェット/ウィジェットスタイルのインストールを可能にするモジュールです。</description> <description xml:lang="jp">管理者モードにてクリックだけで、モジュール/スキン/レイアウト/ウィジェット/ウィジェットスタイルのインストールを可能にするモジュールです。</description>
<version>0.3</version> <version>0.3</version>
<date>2009-11-11</date> <date>2009-11-11</date>
<category>system</category> <category>system</category>
<author email_address="haneul0318@gmail.com" link="http://www.seungyeop.kr"> <author email_address="haneul0318@gmail.com" link="http://www.seungyeop.kr">
<name xml:lang="ko">haneul</name> <name xml:lang="ko">haneul</name>
<name xml:lang="en">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-TW">haneul</name>
<name xml:lang="zh-CN">haneul</name> <name xml:lang="zh-CN">haneul</name>
<name xml:lang="jp">haneul</name> <name xml:lang="jp">haneul</name>
</author> </author>
<author email_address="sol@ngleader.com" link="http://ngleader.com"> <author email_address="sol@ngleader.com" link="http://ngleader.com">
<name xml:lang="ko">sol</name> <name xml:lang="ko">sol</name>
<name xml:lang="en">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-TW">sol</name>
<name xml:lang="zh-CN">sol</name> <name xml:lang="zh-CN">sol</name>
<name xml:lang="jp">sol</name> <name xml:lang="jp">sol</name>
</author> </author>
</module> </module>

View file

@ -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->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->path = "Đường dẫn";
$lang->cmd_download = "Download"; $lang->cmd_download = "Download";
$lang->view_installed_packages = "Installed Packages"; $lang->view_installed_packages = "Những gói đã cài đặt";
$lang->msg_ftp_password_input = "Please input FTP password."; $lang->msg_ftp_password_input = "Hãy nhập mật khẩu của FTP.";
$lang->dependant_list = "이 패키지에 의존하는 패키지 목록"; $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 = "패키지를 삭제합니다. 모듈의 경우 모든 데이터가 사라집니다."; $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.";
?> ?>

View file

@ -2,11 +2,11 @@
/** /**
* @file zh-CN.lang.php * @file zh-CN.lang.php
* @author sol (sol@ngleader.com) 翻译guny(space.china@gmail.com) * @author sol (sol@ngleader.com) 翻译guny(space.china@gmail.com)
* @brief 自动安装(autoinstall)模块语言包 * @brief 在线安装/更新(autoinstall)模块语言包
**/ **/
$lang->autoinstall = 'Autoinstall'; $lang->autoinstall = '安装·更新';
$lang->about_autoinstall = 'Autoinstall是XpressEngine的自动安装模块。'; $lang->about_autoinstall = 'Autoinstall是XpressEngine的在线安装/更新模块。';
$lang->package_update = '最新更新'; $lang->package_update = '最新更新';
$lang->package_downloaded_count = '总下载'; $lang->package_downloaded_count = '总下载';
$lang->need_update = "有新的更新。"; $lang->need_update = "有新的更新。";
@ -18,18 +18,18 @@
$lang->view_all_package = "查看全部"; $lang->view_all_package = "查看全部";
$lang->description_ftp_note = "请务必完成FTP设置否则将无法在线安装(更新)相关模块。"; $lang->description_ftp_note = "请务必完成FTP设置否则将无法在线安装(更新)相关模块。";
$lang->description_update = "新安装(更新)模块的版本信息点击Update按钮后才能正常显示。"; $lang->description_update = "新安装(更新)模块的版本信息点击Update按钮后才能正常显示。";
$lang->install = "Install"; $lang->install = "安装";
$lang->update = "Update"; $lang->update = "更新";
$lang->depending_programs = "This program depends on "; $lang->current_version = "现用版本";
$lang->require_update = "Update is required."; $lang->depending_programs = "联动插件/控件";
$lang->require_installation = "Installation is required."; $lang->require_update = "需要更新";
$lang->description_install = "Installation process also install/update programs which this program depends on"; $lang->require_installation = "需要安装";
$lang->current_version = "Installed version"; $lang->description_install = "安装时,与其联动的插件/控件也会同时被安装(更新)。";
$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->description_download = "无法使用FTP时需得自行下载安装到指定路径。";
$lang->path = "Path"; $lang->path = "安装路径";
$lang->cmd_download = "Download"; $lang->cmd_download = "下载";
$lang->view_installed_packages = "Installed Packages"; $lang->view_installed_packages = "已安装的数据包";
$lang->msg_ftp_password_input = "Please input FTP password."; $lang->msg_ftp_password_input = "请输入FTP密码。";
$lang->dependant_list = "이 패키지에 의존하는 패키지 목록"; $lang->dependant_list = "联动数据包列表";
$lang->description_uninstall = "패키지를 삭제합니다. 모듈의 경우 모든 데이터가 사라집니다."; $lang->description_uninstall = "确定要删除此数据包吗?如果此数据包为模块,模块中的数据将会全部消失。";
?> ?>

View file

@ -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 { 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.arrow a { text-decoration:none; font-weight:bold; color:#2893BB; }
ul.listOrder li a { text-decoration:none; color:#7B7575; } ul.listOrder li a { text-decoration:none; color:#7B7575; }
p.caution strong { font-size: 1.2em; font-weight: bold; color: red; }

View file

@ -3,7 +3,7 @@
<!--%import("js/autoinstall.js")--> <!--%import("js/autoinstall.js")-->
<div class="infoText"> <div class="infoText">
<p><strong>{$package->title}</strong> [{$package->type}] - {$package->path}</p> <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);"> <form action="./" method="POST" onsubmit="return procFilter(this, uninstall_package);">
<input type="hidden" name="package_srl" value="{$package_srl}" /> <input type="hidden" name="package_srl" value="{$package_srl}" />
<!--@if($need_password)--> <!--@if($need_password)-->

View file

@ -129,6 +129,10 @@
// 내용에서 XE만의 태그를 삭제 // 내용에서 XE만의 태그를 삭제
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); $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"); if(!$obj->regdate) $obj->regdate = date("YmdHis");
// 세션에서 최고 관리자가 아니면 iframe, script 제거 // 세션에서 최고 관리자가 아니면 iframe, script 제거

View file

@ -4,7 +4,7 @@
<title xml:lang="jp">コミュニケーション</title> <title xml:lang="jp">コミュニケーション</title>
<title xml:lang="zh-CN">会员交流</title> <title xml:lang="zh-CN">会员交流</title>
<title xml:lang="en">Communication</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="vi">Liên lạc</title>
<title xml:lang="zh-TW">交流</title> <title xml:lang="zh-TW">交流</title>
<description xml:lang="ko">회원들간의 쪽지, 친구기능을 담당하는 모듈입니다.</description> <description xml:lang="ko">회원들간의 쪽지, 친구기능을 담당하는 모듈입니다.</description>
@ -12,7 +12,7 @@
<description xml:lang="zh-CN">管理在线会员间短信息及好友功能的模块。</description> <description xml:lang="zh-CN">管理在线会员间短信息及好友功能的模块。</description>
<description xml:lang="en">This module is for managing message, friend functions.</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="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> <description xml:lang="zh-TW">管理線上會員間短訊及好友功能的模組。</description>
<version>0.1</version> <version>0.1</version>
<date>2008-05-30</date> <date>2008-05-30</date>
@ -25,6 +25,6 @@
<name xml:lang="zh-CN">zero</name> <name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name> <name xml:lang="en">zero</name>
<name xml:lang="zh-TW">zero</name> <name xml:lang="zh-TW">zero</name>
<name xml:lang="ru">zero</name> <name xml:lang="ru">zero</name>
</author> </author>
</module> </module>

View file

@ -529,6 +529,15 @@
executeQuery('file.updateFileValid', $args); 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 // commit
$oDB->commit(); $oDB->commit();
return $output; return $output;

View file

@ -185,6 +185,10 @@
// 내용에서 XE만의 태그를 삭제 // 내용에서 XE만의 태그를 삭제
$obj->content = preg_replace('!<\!--(Before|After)(Document|Comment)\(([0-9]+),([0-9]+)\)-->!is', '', $obj->content); $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 제거 // 세션에서 최고 관리자가 아니면 iframe, script 제거
if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content); if($logged_info->is_admin != 'Y') $obj->content = removeHackTag($obj->content);
@ -481,6 +485,7 @@
$oDocument = $oDocumentModel->getDocument($obj->document_srl); $oDocument = $oDocumentModel->getDocument($obj->document_srl);
$trash_args->module_srl = $oDocument->get('module_srl'); $trash_args->module_srl = $oDocument->get('module_srl');
$obj->module_srl = $oDocument->get('module_srl');
// 휴지통 문서를 두번 휴지통에 버릴 수 없음. // 휴지통 문서를 두번 휴지통에 버릴 수 없음.
if($trash_args->module_srl == 0) return false; if($trash_args->module_srl == 0) return false;
@ -531,7 +536,16 @@
executeQuery('file.updateFileValid', $args); 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(); $oDB->commit();
return $output; return $output;
@ -1621,7 +1635,7 @@
$document_config = null; $document_config = null;
$document_config->use_history = Context::get('use_history'); $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'); $oModuleController = &getController('module');
for($i=0;$i<count($module_srl);$i++) { for($i=0;$i<count($module_srl);$i++) {

View file

@ -68,9 +68,11 @@
if(!Context::get('is_logged')) return false; if(!Context::get('is_logged')) return false;
$logged_info = Context::get('logged_info'); $logged_info = Context::get('logged_info');
if($logged_info->is_admin == 'Y') return true; 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; 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; return false;

View file

@ -2,10 +2,11 @@
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ /* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░ ░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░ ░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░ ░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
░░ * @Website: http://vietxe.net ░░ ░░ * @Website: http://xpressengine.vn ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░ ░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/
$lang->document_list = 'Danh sách bài viết'; $lang->document_list = 'Danh sách bài viết';
$lang->thumbnail_type = 'Định dạng hình nhỏ'; $lang->thumbnail_type = 'Định dạng hình nhỏ';
@ -96,5 +97,5 @@
'trash_ipaddress' => 'IP Người xóa', '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.";
?> ?>

View file

@ -67,8 +67,8 @@
); );
$lang->alias = "Alias"; $lang->alias = "Alias";
$lang->history = "编辑记录"; $lang->history = "历史版本功能";
$lang->about_use_history = "设置启用编辑记录与否。启用将记录修改主题版本,并可以复原"; $lang->about_use_history = "启用历史版本功能它将记录主题修改版本,并还可以复原到之前版本";
$lang->trace_only = "只留痕迹"; $lang->trace_only = "只留痕迹";
$lang->cmd_trash = "回收箱"; $lang->cmd_trash = "回收箱";
@ -95,5 +95,6 @@
'trash_ipaddress' => '操作人IP地址', 'trash_ipaddress' => '操作人IP地址',
); );
$lang->success_trashed = "Successfully moved to trashcan"; $lang->success_trashed = '已成功移除到回收箱。';
?> ?>

View file

@ -159,7 +159,7 @@ function display_gallery_image(obj, is_first_display) {
var source_filename = obj.image_url; var source_filename = obj.image_url;
var tmp_arr = source_filename.split('/'); var tmp_arr = source_filename.split('/');
var filename = tmp_arr[tmp_arr.length-1]; 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); var zone_navigator = xGetElementById("zone_gallery_navigator_status_"+obj.srl);

View file

@ -153,6 +153,7 @@
**/ **/
function triggerEditorComponentCompile(&$content) { function triggerEditorComponentCompile(&$content) {
if(Context::getResponseMethod()!='HTML') return new Object(); if(Context::getResponseMethod()!='HTML') return new Object();
if(Mobile::isFromMobilePhone()) return new Object();
$module_info = Context::get('module_info'); $module_info = Context::get('module_info');
$module_srl = $module_info->module_srl; $module_srl = $module_info->module_srl;
@ -184,6 +185,7 @@
} }
$content = $this->transComponent($content); $content = $this->transComponent($content);
return new Object();
} }
/** /**

View file

@ -2,10 +2,11 @@
/* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ /* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░ * @File : common/lang/vi.lang.php ░░ ░░ * @File : common/lang/vi.lang.php ░░
░░ * @Author : zero (zero@nzeo.com) ░░ ░░ * @Author : zero (zero@nzeo.com) ░░
░░ * @Trans : Đào Đức Duy (ducduy.dao.vn@vietxe.net) ░░ ░░ * @Trans : DucDuy Dao (webmaster@xpressengine.vn) ░░
░░ * @Website: http://vietxe.net ░░ ░░ * @Website: http://xpressengine.vn ░░
░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░ ░░ * @Brief : Vietnamese Language Pack (Only basic words are included here) ░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ */ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/
$lang->editor = 'WYSIWYG toàn diện'; $lang->editor = 'WYSIWYG toàn diện';
$lang->component_name = 'Thành phầ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_left = 'Căn trái';
$lang->edit->help_align_center = 'Căn giữa'; $lang->edit->help_align_center = 'Căn giữa';
$lang->edit->help_align_right = 'Căn phải'; $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_add_indent = 'Thụt vào';
$lang->edit->help_remove_indent = 'Giãn ra'; $lang->edit->help_remove_indent = 'Giãn ra';
$lang->edit->help_list_number = 'Thứ tự số'; $lang->edit->help_list_number = 'Thứ tự số';
@ -213,7 +214,7 @@
$lang->edit->minimize_list = 'Thu nhỏ'; $lang->edit->minimize_list = 'Thu nhỏ';
$lang->edit->move = 'Di chuyển'; $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->materials = 'Vật liệu';
$lang->edit->temporary_savings = 'Danh sách lưu tạm thời'; $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->paging_next_help = 'Chuyển tới trang tiếp.';
$lang->edit->toc = 'Board của nội dung'; $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->image_align = 'Sắp xếp hình ảnh';
$lang->edit->attached_files = '첨부 파일'; $lang->edit->attached_files = 'File đính kèm';
?> ?>

View file

@ -227,6 +227,6 @@
$lang->edit->confirm_submit_without_saving = '尚有未保存的段落。\\n确定要提交吗'; $lang->edit->confirm_submit_without_saving = '尚有未保存的段落。\\n确定要提交吗';
$lang->edit->image_align = '이미지 정렬'; $lang->edit->image_align = '图片对齐';
$lang->edit->attached_files = '첨부 파일'; $lang->edit->attached_files = '附件';
?> ?>

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<skin version="0.2"> <skin version="0.2">
<title xml:lang="ko">XpressEditor Skin</title> <title xml:lang="ko">XpressEditor Skin</title>
<title xml:lang="es">XpressEditor Skin</title> <title xml:lang="es">XpressEditor Skin</title>
<title xml:lang="en">XpressEditor Skin</title> <title xml:lang="en">XpressEditor Skin</title>
<title xml:lang="vi">XpressEditor Skin</title> <title xml:lang="vi">XpressEditor Skin</title>
<title xml:lang="jp">XpressEditorスキン</title> <title xml:lang="jp">XpressEditorスキン</title>
<title xml:lang="zh-CN">XpressEditor皮肤</title> <title xml:lang="zh-CN">XpressEditor皮肤</title>
@ -32,11 +32,11 @@
<date>2009-03-22</date> <date>2009-03-22</date>
<author email_address="gonom9@gmail.com" link="http://mygony.com"> <author email_address="gonom9@gmail.com" link="http://mygony.com">
<name xml:lang="ko">행복한고니</name> <name xml:lang="ko">행복한고니</name>
<name xml:lang="es">gony</name> <name xml:lang="es">gony</name>
<name xml:lang="en">gony</name> <name xml:lang="en">gony</name>
<name xml:lang="vi">gony</name> <name xml:lang="vi">gony</name>
<name xml:lang="jp">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> <name xml:lang="zh-TW">gony</name>
</author> </author>
<colorset> <colorset>

View file

@ -34,8 +34,8 @@
<date>2009-05-23</date> <date>2009-05-23</date>
<author email_address="webmaster@naradesign.net" link="http://naradesign.net"> <author email_address="webmaster@naradesign.net" link="http://naradesign.net">
<name xml:lang="ko">정찬명</name> <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="zh-TW">Chan-Myung Jeong</name>
<name xml:lang="jp">Chan-Myung Jeong</name> <name xml:lang="jp">Chan-Myung Jeong</name>
<name xml:lang="en">Chan-Myung Jeong</name> <name xml:lang="en">Chan-Myung Jeong</name>
<name xml:lang="vi">Chan-Myung Jeong</name> <name xml:lang="vi">Chan-Myung Jeong</name>

View file

@ -33,7 +33,7 @@
<date>2009-04-17</date> <date>2009-04-17</date>
<author email_address="webmaster@naradesign.net" link="http://naradesign.net"> <author email_address="webmaster@naradesign.net" link="http://naradesign.net">
<name xml:lang="ko">정찬명</name> <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="zh-TW">Chan-Myung Jeong</name>
<name xml:lang="jp">Chan-Myung Jeong</name> <name xml:lang="jp">Chan-Myung Jeong</name>
<name xml:lang="vi">Chan-Myung Jeong</name> <name xml:lang="vi">Chan-Myung Jeong</name>

View file

@ -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) { if($manual_insert) {
@ -431,7 +431,7 @@
if(!@move_uploaded_file($file_info['tmp_name'], $filename)) { if(!@move_uploaded_file($file_info['tmp_name'], $filename)) {
$ext = substr(strrchr($file_info['name'],'.'),1); $ext = substr(strrchr($file_info['name'],'.'),1);
$filename = $path. md5(crypt(rand(1000000,900000).$file_info['name'])).'.'.$ext; $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');
} }
} }

View file

@ -53,4 +53,7 @@
'ipaddress' => 'IP Address', 'ipaddress' => 'IP Address',
); );
$lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.'; $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 = '파일 업로드 중 에러가 발생하였습니다.';
?> ?>

View file

@ -50,4 +50,7 @@
'ipaddress' => 'Dirección IP', 'ipaddress' => 'Dirección IP',
); );
$lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.'; $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 = '파일 업로드 중 에러가 발생하였습니다.';
?> ?>

View file

@ -50,4 +50,7 @@
'ipaddress' => 'Adresse IP', 'ipaddress' => 'Adresse IP',
); );
$lang->msg_not_allowed_outlink = 'It is not allowed to download files not from this site.'; $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 = '파일 업로드 중 에러가 발생하였습니다.';
?> ?>

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