ê°ë°ë²ì ì ìtrunkë¡ ìë³µì¬
git-svn-id: http://xe-core.googlecode.com/svn/trunk@6243 201d5d3c-b55e-5fd7-737f-ddc643e51545
|
|
@ -243,6 +243,7 @@
|
|||
}
|
||||
|
||||
}
|
||||
debugPrint($obj->content);
|
||||
|
||||
// 문서 번호 설정
|
||||
$document_srl = getNextSequence();
|
||||
|
|
@ -409,8 +410,7 @@
|
|||
$content = getXmlRpcFailure(1, 'post not founded');
|
||||
printContent($content);
|
||||
} else {
|
||||
$oContext = &Context::getInstance();
|
||||
|
||||
$oEditorController = &getController('editor');
|
||||
|
||||
$posts = array();
|
||||
foreach($output->data as $key => $oDocument) {
|
||||
|
|
@ -419,7 +419,7 @@
|
|||
$post->userid = $oDocument->get('user_id');
|
||||
$post->mt_allow_pings = 0;
|
||||
$post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0;
|
||||
$post->description = htmlspecialchars($oContext->transContent($oDocument->get('content')));
|
||||
$post->description = htmlspecialchars($oEditorController->transComponent($oDocument->get('content')));
|
||||
$post->postid = $oDocument->document_srl;
|
||||
$post->title = htmlspecialchars($oDocument->get('title'));
|
||||
|
||||
|
|
|
|||
|
|
@ -3,22 +3,21 @@
|
|||
<title xml:lang="ko">Captcha 애드온</title>
|
||||
<title xml:lang="zh-CN">验证码插件</title>
|
||||
<title xml:lang="jp">Captchaアドオン</title>
|
||||
<title xml:lang="zh-TW">Captcha元件</title>
|
||||
<title xml:lang="zh-TW">圖形驗證</title>
|
||||
<description xml:lang="ko">
|
||||
프로그램 글 등록기를 막기 위해 게시판/ issueTracker에서 글/ 댓글을 입력하려 할 때 이미지를 보여주고 글에 해당하는 이미지를 선택하게 하는 애드온입니다.
|
||||
로그인하지 않은 경우에만 해당됩니다.
|
||||
</description>
|
||||
<description xml:lang="zh-CN">
|
||||
为了解决互联网垃圾而开发的验证码机制。
|
||||
非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。
|
||||
非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。
|
||||
</description>
|
||||
<description xml:lang="jp">
|
||||
ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。
|
||||
ログインしてない時だけ、動作します。
|
||||
</description>
|
||||
<description xml:lang="zh-TW">
|
||||
此元件可防止機器人程式的垃圾留言,在討論板/問題追蹤發表主題或評論時,請同時輸入畫面中所顯示的隨機數字與文字。
|
||||
只適用於無法登入時。
|
||||
此元件可防止機器人程式的垃圾留言,非註冊用戶在討論板/問題追蹤發表主題或評論時,必須要先選對畫面中所顯示的圖案才能發表。
|
||||
</description>
|
||||
<version>0.1</version>
|
||||
<date>2009-02-20</date>
|
||||
|
|
@ -35,16 +34,16 @@
|
|||
<title xml:lang="ko">Captcha 표시 대상</title>
|
||||
<title xml:lang="zh-CN">应用对象</title>
|
||||
<title xml:lang="jp">Captchaを表示する対象</title>
|
||||
<title xml:lang="zh-TW">Captcha顯示的目標</title>
|
||||
<title xml:lang="zh-TW">選擇目標</title>
|
||||
<description xml:lang="ko">글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다</description>
|
||||
<description xml:lang="zh-CN">可以指定验证码应用对象(管理员除外)。</description>
|
||||
<description xml:lang="jp">管理者を除き、書き込み・コメントを入力する際captchaイメージを見せる対象を設定します。</description>
|
||||
<description xml:lang="zh-TW">管理者以外、書き込み・コメントを入力する際captchaを見せる対象を設定します。</description>
|
||||
<description xml:lang="zh-TW">除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。</description>
|
||||
<options value="">
|
||||
<title xml:lang="ko">로그인하지 않은 사용자</title>
|
||||
<title xml:lang="zh-CN">非登录用户</title>
|
||||
<title xml:lang="jp">ログインしてないユーザー</title>
|
||||
<title xml:lang="zh-TW">無法登入的用戶</title>
|
||||
<title xml:lang="zh-TW">非用戶</title>
|
||||
</options>
|
||||
<options value="all">
|
||||
<title xml:lang="ko">모든 사용자</title>
|
||||
|
|
@ -61,7 +60,7 @@
|
|||
<description xml:lang="ko">"1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다</description>
|
||||
<description xml:lang="zh-CN">"一次"就是每个IP只出现一次验证。</description>
|
||||
<description xml:lang="jp">"1回だけ表示"を選択すると、1回だけ動作した後、その情報を保存して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。</description>
|
||||
<description xml:lang="zh-TW">選擇"單次",在發生第一次行為後,該行為會儲存,下次不會再顯示;選擇"每次"則會一直顯示。</description>
|
||||
<description xml:lang="zh-TW">選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。</description>
|
||||
<options value="onetime">
|
||||
<title xml:lang="ko">1번만 동작</title>
|
||||
<title xml:lang="zh-CN">一次</title>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* @file addons/captcha/lang/zh-TW.lang.php
|
||||
* @author zero (zero@nzeo.com) 翻譯:royallin
|
||||
* @brief captcha正體中文語言
|
||||
* @brief 圖形驗證正體中文語言
|
||||
**/
|
||||
|
||||
$lang->about_captcha = "用於防止機器人程式之垃圾留言,請選擇一個符合下列詞語的圖像。";
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@
|
|||
/**
|
||||
* 기능 수행 : 사용자 이름을 클릭시 요청되는 팝업메뉴의 메뉴에 쪽지 발송, 친구추가등의 링크 추가
|
||||
**/
|
||||
} elseif($called_position == 'before_module_proc' && $this->module == 'member' && $this->act == 'getMemberMenu') {
|
||||
} elseif($called_position == 'before_module_proc' && $this->act == 'getMemberMenu') {
|
||||
|
||||
$oMemberController = &getController('member');
|
||||
$member_srl = Context::get('target_srl');
|
||||
|
|
@ -66,7 +66,8 @@
|
|||
// 아니라면 쪽지 발송, 친구 등록 추가
|
||||
} else {
|
||||
// 대상 회원의 정보를 가져옴
|
||||
$target_member_info = $this->getMemberInfoByMemberSrl($member_srl);
|
||||
$oMemberModel = &getModel('member');
|
||||
$target_member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
|
||||
if(!$target_member_info->member_srl) return;
|
||||
|
||||
// 로그인된 사용자 정보를 구함
|
||||
|
|
|
|||
|
|
@ -480,7 +480,6 @@
|
|||
$oContext = &Context::getInstance();
|
||||
|
||||
$content = $oTemplate->compile($this->oModule->getTemplatePath(), $this->oModule->getTemplateFile());
|
||||
$content = $oContext->transContent($content);
|
||||
$this->setContent($content);
|
||||
|
||||
// 출력
|
||||
|
|
|
|||
106
addons/smartphone/classes/smartphone.class.php
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
class smartphoneXE {
|
||||
var $module_info = null;
|
||||
var $content = null;
|
||||
var $oModule = null;
|
||||
var $menuList = null;
|
||||
|
||||
function isFromSmartPhone()
|
||||
{
|
||||
$userAgent = $_SERVER['HTTP_USER_AGENT'];
|
||||
$iphoneForce = Context::get('iphone');
|
||||
return $iphoneForce || $userAgent && (strpos($userAgent, 'iPod') || strpos($userAgent, 'iPhone') || strpos($userAgent, 'PPC')) ;
|
||||
}
|
||||
|
||||
function &getInstance()
|
||||
{
|
||||
static $instance = null;
|
||||
if($instnace == null)
|
||||
{
|
||||
$instance = new smartphoneXE();
|
||||
return $instance;
|
||||
}
|
||||
}
|
||||
|
||||
function setModuleInstance(&$oModule) {
|
||||
if($this->oModule) return;
|
||||
$this->oModule = $oModule;
|
||||
}
|
||||
|
||||
function setContent($content) {
|
||||
$this->content = $content;
|
||||
}
|
||||
|
||||
function setModuleInfo(&$module_info)
|
||||
{
|
||||
if($this->module_info) return;
|
||||
$this->module_info = $module_info;
|
||||
}
|
||||
|
||||
function procSmartPhone()
|
||||
{
|
||||
if(!$this->module_info) return;
|
||||
$oModule =& getModule($this->module_info->module, 'smartphone');
|
||||
if(!$oModule || !method_exists($oModule, 'procSmartPhone') ) return;
|
||||
$vars = get_object_vars($this->oModule);
|
||||
if(count($vars)) foreach($vars as $key => $val) $oModule->{$key} = $val;
|
||||
return $oModule->procSmartPhone($this);
|
||||
}
|
||||
|
||||
function getAllItems(&$menu_list, $node_srl = 0, $node_text= "Main Menu")
|
||||
{
|
||||
if($node_srl == 0) $this->menuList = array();
|
||||
|
||||
$obj = null;
|
||||
$obj->text = $node_text;
|
||||
$obj->list = array();
|
||||
foreach($menu_list as $menu_node_srl => $menu_item)
|
||||
{
|
||||
$it = null;
|
||||
if(!preg_match('/^([a-zA-Z0-9\_\-]+)$/', $menu_item['url'])) { continue; }
|
||||
if($menu_item["list"] && count($menu_item["list"]) > 0)
|
||||
{
|
||||
$this->getAllItems($menu_item["list"], $menu_node_srl, $menu_item["text"]);
|
||||
}
|
||||
$it->text = $menu_item["text"];
|
||||
$it->url = $menu_item["url"];
|
||||
$obj->list[$menu_node_srl] = $it;
|
||||
}
|
||||
$this->menuList[$node_srl] = $obj;
|
||||
}
|
||||
|
||||
function setMenu()
|
||||
{
|
||||
$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;
|
||||
|
||||
$this->getAllItems($menu->list);
|
||||
Context::set('menus', $this->menuList);
|
||||
}
|
||||
|
||||
function display()
|
||||
{
|
||||
Context::set('layout', 'none');
|
||||
$act = Context::get('act');
|
||||
if($act)
|
||||
{
|
||||
$content = $this->procSmartPhone();
|
||||
}
|
||||
else
|
||||
{
|
||||
Context::set('module_info', $this->module_info);
|
||||
$this->setMenu();
|
||||
$oModule =& getModule($this->module_info->module, 'smartphone');
|
||||
if($oModule && method_exists($oModule, 'procSmartPhone') ) Context::set('bHavePhoneMethod', true);
|
||||
$oTemplate = new TemplateHandler();
|
||||
$oContext = &Context::getInstance();
|
||||
$content = $oTemplate->compile(_XE_PATH_."addons/smartphone/tpl", "layout");
|
||||
}
|
||||
print $content;
|
||||
|
||||
exit();
|
||||
}
|
||||
}
|
||||
?>
|
||||
12
addons/smartphone/conf/info.xml
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<addon version="0.2">
|
||||
<title xml:lang="ko">SmartphonePhone XE 애드온</title>
|
||||
<description xml:lang="ko">
|
||||
IPhone (touch) 등, smartphone 에서 접속시 최적화된 화면을 보여줍니다.
|
||||
</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>
|
||||
</author>
|
||||
</addon>
|
||||
21
addons/smartphone/iui/LICENSE.txt
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
Copyright (c) 2007, iUI Project Members
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the iUI Project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
BIN
addons/smartphone/iui/backButton.png
Normal file
|
After Width: | Height: | Size: 816 B |
BIN
addons/smartphone/iui/blueButton.png
Normal file
|
After Width: | Height: | Size: 517 B |
BIN
addons/smartphone/iui/cancel.png
Normal file
|
After Width: | Height: | Size: 362 B |
BIN
addons/smartphone/iui/grayButton.png
Normal file
|
After Width: | Height: | Size: 943 B |
BIN
addons/smartphone/iui/image/next.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
addons/smartphone/iui/image/next_New.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
addons/smartphone/iui/image/previous.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
addons/smartphone/iui/image/previous_New.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
486
addons/smartphone/iui/iui.css
Normal file
|
|
@ -0,0 +1,486 @@
|
|||
/* iui.css (c) 2007 by iUI Project Members, see LICENSE.txt for license */
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: Helvetica;
|
||||
background: #FFFFFF;
|
||||
color: #000000;
|
||||
overflow-x: hidden;
|
||||
-webkit-user-select: none;
|
||||
-webkit-text-size-adjust: none;
|
||||
}
|
||||
|
||||
body > *:not(.toolbar) {
|
||||
display: none;
|
||||
position: absolute;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
left: 0;
|
||||
top: 45px;
|
||||
width: 100%;
|
||||
min-height: 372px;
|
||||
}
|
||||
|
||||
body[orient="landscape"] > *:not(.toolbar) {
|
||||
min-height: 268px;
|
||||
}
|
||||
|
||||
body > *[selected="true"] {
|
||||
display: block;
|
||||
}
|
||||
|
||||
a[selected].link, a:active, link {
|
||||
background-color: #194fdb !important;
|
||||
background-image: url(listArrowSel.png), url(selection.png) !important;
|
||||
background-repeat: no-repeat, repeat-x;
|
||||
background-position: right center, left top;
|
||||
color: #FFFFFF !important;
|
||||
}
|
||||
|
||||
a[selected="progress"].link {
|
||||
background-image: url(loading.gif), url(selection.png) !important;
|
||||
}
|
||||
|
||||
/************************************************************************************************/
|
||||
|
||||
body > .toolbar {
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
border-bottom: 1px solid #2d3642;
|
||||
border-top: 1px solid #6d84a2;
|
||||
padding: 10px;
|
||||
height: 45px;
|
||||
background: url(toolbar.png) #6d84a2 repeat-x;
|
||||
}
|
||||
|
||||
.toolbar > h1 {
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
left: 50%;
|
||||
margin: 1px 0 0 -75px;
|
||||
height: 45px;
|
||||
font-size: 20px;
|
||||
width: 150px;
|
||||
font-weight: bold;
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
|
||||
text-align: center;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
body[orient="landscape"] > .toolbar > h1 {
|
||||
margin-left: -125px;
|
||||
width: 250px;
|
||||
}
|
||||
|
||||
.button {
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
top: 8px;
|
||||
right: 6px;
|
||||
margin: 0;
|
||||
border-width: 0 5px;
|
||||
padding: 0 3px;
|
||||
width: auto;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
font-family: inherit;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
color: #FFFFFF;
|
||||
text-shadow: rgba(0, 0, 0, 0.6) 0px -1px 0;
|
||||
text-overflow: ellipsis;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
background: none;
|
||||
-webkit-border-image: url(toolButton.png) 0 5 0 5;
|
||||
}
|
||||
|
||||
.blueButton {
|
||||
-webkit-border-image: url(blueButton.png) 0 5 0 5;
|
||||
border-width: 0 5px;
|
||||
}
|
||||
|
||||
.leftButton {
|
||||
left: 6px;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
#backButton {
|
||||
display: none;
|
||||
left: 6px;
|
||||
right: auto;
|
||||
padding: 0;
|
||||
max-width: 55px;
|
||||
border-width: 0 8px 0 14px;
|
||||
-webkit-border-image: url(backButton.png) 0 8 0 14;
|
||||
}
|
||||
|
||||
.whiteButton,
|
||||
.grayButton {
|
||||
display: block;
|
||||
border-width: 0 12px;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
text-decoration: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.whiteButton {
|
||||
-webkit-border-image: url(whiteButton.png) 0 12 0 12;
|
||||
text-shadow: rgba(255, 255, 255, 0.7) 0 1px 0;
|
||||
}
|
||||
|
||||
.grayButton {
|
||||
-webkit-border-image: url(grayButton.png) 0 12 0 12;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
/************************************************************************************************/
|
||||
|
||||
body > ul > li {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
border-bottom: 1px solid #E0E0E0;
|
||||
padding: 8px 0 8px 10px;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
body > ul > li.group {
|
||||
position: relative;
|
||||
top: -1px;
|
||||
margin-bottom: -2px;
|
||||
border-top: 1px solid #7d7d7d;
|
||||
border-bottom: 1px solid #999999;
|
||||
padding: 1px 10px;
|
||||
background: url(listGroup.png) repeat-x;
|
||||
font-size: 17px;
|
||||
font-weight: bold;
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
body > ul > li.group:first-child {
|
||||
top: 0;
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
body > ul > li > a {
|
||||
display: block;
|
||||
margin: -8px 0 -8px -10px;
|
||||
padding: 8px 32px 8px 10px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
background: url(listArrow.png) no-repeat right center;
|
||||
}
|
||||
|
||||
a[target="_replace"] {
|
||||
box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
padding-top: 25px;
|
||||
padding-bottom: 25px;
|
||||
font-size: 18px;
|
||||
color: cornflowerblue;
|
||||
background-color: #FFFFFF;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
/************************************************************************************************/
|
||||
|
||||
body > .dialog {
|
||||
top: 0;
|
||||
width: 100%;
|
||||
min-height: 417px;
|
||||
z-index: 2;
|
||||
background: rgba(0, 0, 0, 0.8);
|
||||
padding: 0;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.dialog > fieldset {
|
||||
box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
border: none;
|
||||
border-top: 1px solid #6d84a2;
|
||||
padding: 10px 6px;
|
||||
background: url(toolbar.png) #7388a5 repeat-x;
|
||||
}
|
||||
|
||||
.dialog > fieldset > h1 {
|
||||
margin: 0 10px 0 10px;
|
||||
padding: 0;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
color: #FFFFFF;
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.dialog > fieldset > label {
|
||||
position: absolute;
|
||||
margin: 16px 0 0 6px;
|
||||
font-size: 14px;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
input {
|
||||
box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
width: 100%;
|
||||
margin: 8px 0 0 0;
|
||||
padding: 6px 6px 6px 44px;
|
||||
font-size: 16px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/************************************************************************************************/
|
||||
|
||||
body > .panel {
|
||||
box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
padding: 10px;
|
||||
background: #c8c8c8 url(pinstripes.png);
|
||||
}
|
||||
|
||||
.panel > fieldset {
|
||||
position: relative;
|
||||
margin: 0 0 20px 0;
|
||||
padding: 0;
|
||||
background: #FFFFFF;
|
||||
-webkit-border-radius: 8px;
|
||||
border: 1px solid #999999;
|
||||
text-align: right;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.row {
|
||||
position: relative;
|
||||
min-height: 42px;
|
||||
border-bottom: 1px solid #999999;
|
||||
-webkit-border-radius: 0;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
fieldset > .row:last-child {
|
||||
border-bottom: none !important;
|
||||
}
|
||||
|
||||
.row > input {
|
||||
box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
margin: 0;
|
||||
border: none;
|
||||
padding: 12px 10px 0 110px;
|
||||
height: 42px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.row > label {
|
||||
position: absolute;
|
||||
margin: 0 0 0 14px;
|
||||
line-height: 42px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.row > .toggle {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
width: 100px;
|
||||
height: 28px;
|
||||
}
|
||||
|
||||
.toggle {
|
||||
border: 1px solid #888888;
|
||||
-webkit-border-radius: 6px;
|
||||
background: #FFFFFF url(toggle.png) repeat-x;
|
||||
font-size: 19px;
|
||||
font-weight: bold;
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.toggle[toggled="true"] {
|
||||
border: 1px solid #143fae;
|
||||
background: #194fdb url(toggleOn.png) repeat-x;
|
||||
}
|
||||
|
||||
.toggleOn {
|
||||
display: none;
|
||||
position: absolute;
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
left: 0;
|
||||
top: 0;
|
||||
color: #FFFFFF;
|
||||
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
|
||||
}
|
||||
|
||||
.toggleOff {
|
||||
position: absolute;
|
||||
width: 60px;
|
||||
text-align: center;
|
||||
right: 0;
|
||||
top: 0;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.toggle[toggled="true"] > .toggleOn {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.toggle[toggled="true"] > .toggleOff {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.thumb {
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: -1px;
|
||||
width: 40px;
|
||||
height: 28px;
|
||||
border: 1px solid #888888;
|
||||
-webkit-border-radius: 6px;
|
||||
background: #ffffff url(thumb.png) repeat-x;
|
||||
}
|
||||
|
||||
.toggle[toggled="true"] > .thumb {
|
||||
left: auto;
|
||||
right: -1px;
|
||||
}
|
||||
|
||||
.panel > h2 {
|
||||
margin: 0 0 8px 14px;
|
||||
font-size: inherit;
|
||||
font-weight: bold;
|
||||
color: #4d4d70;
|
||||
text-shadow: rgba(255, 255, 255, 0.75) 2px 2px 0;
|
||||
}
|
||||
|
||||
.panel > .content {
|
||||
background: #FFFFFF;
|
||||
-webkit-border-radius: 8px;
|
||||
border: 1px solid #999999;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/************************************************************************************************/
|
||||
|
||||
#preloader {
|
||||
display: none;
|
||||
background-image: url(loading.gif), url(selection.png),
|
||||
url(blueButton.png), url(listArrowSel.png), url(listGroup.png);
|
||||
}
|
||||
|
||||
body > ul > li.post_item > a > .post > span.title {
|
||||
font-size:13px;
|
||||
font-weight:normal;
|
||||
display:block;
|
||||
}
|
||||
body > ul > li.post_item > a > .post > span.description {
|
||||
font-size:10px;
|
||||
font-weight:normal;
|
||||
color:#bbb;
|
||||
display:block;
|
||||
margin-top:2px;
|
||||
letter-spacing:0px;
|
||||
}
|
||||
|
||||
.next, .previous {
|
||||
display: block;
|
||||
text-decoration: none;
|
||||
font-size: 16px;
|
||||
padding: 7px 0;
|
||||
background: url(image/previous_New.png) no-repeat;
|
||||
color: #fff;
|
||||
margin: 8px 12px;
|
||||
width: 110px;
|
||||
height: 21px;
|
||||
text-align: center;
|
||||
margin-bottom: 30px;
|
||||
font-weight:normal;
|
||||
}
|
||||
|
||||
.next {
|
||||
float: right;
|
||||
background: url(image/next_New.png) no-repeat;
|
||||
}
|
||||
|
||||
.previous {
|
||||
float: left;
|
||||
opacity: 0.7;
|
||||
margin: 8px 0px;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
background: none;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.pagination strong {
|
||||
font-size: 32px;
|
||||
color: #ccc;
|
||||
position: relative;
|
||||
top: 5px;
|
||||
}
|
||||
|
||||
.siteinfo .description
|
||||
{
|
||||
display: block;
|
||||
font-size: 16px;
|
||||
color: #6699FF;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.siteinfo .xe
|
||||
{
|
||||
display: block;
|
||||
text-align: right;
|
||||
font-size:11px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
ul.navigation {
|
||||
margin:0;
|
||||
padding:0;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
ul.navigation > li {
|
||||
position: relative;
|
||||
font-size: 14px;
|
||||
border-bottom: 1px solid #E0E0E0;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
ul.navigation > li > a {
|
||||
display: block;
|
||||
background-image: url(listArrow.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right center;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
padding: 8px 32px 8px 10px;
|
||||
}
|
||||
|
||||
.comment_item > .author {
|
||||
color: #3074A5;
|
||||
}
|
||||
|
||||
.comment_item > .regdate {
|
||||
float:right;
|
||||
font-size: 12px;
|
||||
color: #CCC;
|
||||
}
|
||||
|
||||
.comment_item > .re {
|
||||
font-size: 12px;
|
||||
color: #DCC;
|
||||
}
|
||||
383
addons/smartphone/iui/iui.js
Normal file
|
|
@ -0,0 +1,383 @@
|
|||
/*
|
||||
Copyright (c) 2007, iUI Project Members
|
||||
See LICENSE.txt for licensing terms
|
||||
*/
|
||||
|
||||
|
||||
(function() {
|
||||
|
||||
var slideSpeed = 40;
|
||||
var slideInterval = 0;
|
||||
|
||||
var currentPage = null;
|
||||
var currentDialog = null;
|
||||
var currentWidth = 0;
|
||||
var currentHash = location.hash;
|
||||
var hashPrefix = "#_";
|
||||
var pageHistory = [];
|
||||
var newPageCount = 0;
|
||||
var checkTimer;
|
||||
|
||||
// *************************************************************************************************
|
||||
|
||||
window.iui =
|
||||
{
|
||||
showPage: function(page, backwards)
|
||||
{
|
||||
if (page)
|
||||
{
|
||||
if (currentDialog)
|
||||
{
|
||||
currentDialog.removeAttribute("selected");
|
||||
currentDialog = null;
|
||||
}
|
||||
|
||||
if (hasClass(page, "dialog"))
|
||||
showDialog(page);
|
||||
else
|
||||
{
|
||||
var fromPage = currentPage;
|
||||
currentPage = page;
|
||||
|
||||
if (fromPage)
|
||||
setTimeout(slidePages, 0, fromPage, page, backwards);
|
||||
else
|
||||
updatePage(page, fromPage);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
showPageById: function(pageId)
|
||||
{
|
||||
var page = $(pageId);
|
||||
if (page)
|
||||
{
|
||||
var index = pageHistory.indexOf(pageId);
|
||||
var backwards = index != -1;
|
||||
if (backwards)
|
||||
pageHistory.splice(index, pageHistory.length);
|
||||
|
||||
iui.showPage(page, backwards);
|
||||
}
|
||||
},
|
||||
|
||||
showPageByHref: function(href, args, method, replace, cb)
|
||||
{
|
||||
var req = new XMLHttpRequest();
|
||||
req.onerror = function()
|
||||
{
|
||||
if (cb)
|
||||
cb(false);
|
||||
};
|
||||
|
||||
req.onreadystatechange = function()
|
||||
{
|
||||
if (req.readyState == 4)
|
||||
{
|
||||
if (replace)
|
||||
replaceElementWithSource(replace, req.responseText);
|
||||
else
|
||||
{
|
||||
var frag = document.createElement("div");
|
||||
frag.innerHTML = req.responseText;
|
||||
iui.insertPages(frag.childNodes);
|
||||
}
|
||||
if (cb)
|
||||
setTimeout(cb, 1000, true);
|
||||
}
|
||||
};
|
||||
|
||||
if (args)
|
||||
{
|
||||
req.open(method || "GET", href, true);
|
||||
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
|
||||
req.setRequestHeader("Content-Length", args.length);
|
||||
req.send(args.join("&"));
|
||||
}
|
||||
else
|
||||
{
|
||||
req.open(method || "GET", href, true);
|
||||
req.send(null);
|
||||
}
|
||||
},
|
||||
|
||||
insertPages: function(nodes)
|
||||
{
|
||||
var targetPage;
|
||||
for (var i = 0; i < nodes.length; ++i)
|
||||
{
|
||||
var child = nodes[i];
|
||||
if (child.nodeType == 1)
|
||||
{
|
||||
if (!child.id)
|
||||
child.id = "__" + (++newPageCount) + "__";
|
||||
|
||||
var clone = $(child.id);
|
||||
if (clone)
|
||||
clone.parentNode.replaceChild(child, clone);
|
||||
else
|
||||
document.body.appendChild(child);
|
||||
|
||||
if (child.getAttribute("selected") == "true" || !targetPage)
|
||||
targetPage = child;
|
||||
|
||||
--i;
|
||||
}
|
||||
}
|
||||
|
||||
if (targetPage)
|
||||
iui.showPage(targetPage);
|
||||
},
|
||||
|
||||
getSelectedPage: function()
|
||||
{
|
||||
for (var child = document.body.firstChild; child; child = child.nextSibling)
|
||||
{
|
||||
if (child.nodeType == 1 && child.getAttribute("selected") == "true")
|
||||
return child;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// *************************************************************************************************
|
||||
|
||||
addEventListener("load", function(event)
|
||||
{
|
||||
var page = iui.getSelectedPage();
|
||||
if (page)
|
||||
iui.showPage(page);
|
||||
|
||||
setTimeout(preloadImages, 0);
|
||||
setTimeout(checkOrientAndLocation, 0);
|
||||
checkTimer = setInterval(checkOrientAndLocation, 300);
|
||||
}, false);
|
||||
|
||||
addEventListener("click", function(event)
|
||||
{
|
||||
var link = findParent(event.target, "a");
|
||||
if (link)
|
||||
{
|
||||
function unselect() { link.removeAttribute("selected"); }
|
||||
|
||||
if (link.href && link.hash && link.hash != "#")
|
||||
{
|
||||
link.setAttribute("selected", "true");
|
||||
iui.showPage($(link.hash.substr(1)));
|
||||
setTimeout(unselect, 500);
|
||||
}
|
||||
else if (link == $("backButton"))
|
||||
history.back();
|
||||
else if (link.getAttribute("type") == "submit")
|
||||
submitForm(findParent(link, "form"));
|
||||
else if (link.getAttribute("type") == "cancel")
|
||||
cancelDialog(findParent(link, "form"));
|
||||
else if (link.target == "_replace")
|
||||
{
|
||||
link.setAttribute("selected", "progress");
|
||||
iui.showPageByHref(link.href, null, null, link, unselect);
|
||||
}
|
||||
else if (!link.target)
|
||||
{
|
||||
link.setAttribute("selected", "progress");
|
||||
iui.showPageByHref(link.href, null, null, null, unselect);
|
||||
}
|
||||
else
|
||||
return;
|
||||
|
||||
event.preventDefault();
|
||||
}
|
||||
}, true);
|
||||
|
||||
addEventListener("click", function(event)
|
||||
{
|
||||
var div = findParent(event.target, "div");
|
||||
if (div && hasClass(div, "toggle"))
|
||||
{
|
||||
div.setAttribute("toggled", div.getAttribute("toggled") != "true");
|
||||
event.preventDefault();
|
||||
}
|
||||
}, true);
|
||||
|
||||
function checkOrientAndLocation()
|
||||
{
|
||||
if (window.innerWidth != currentWidth)
|
||||
{
|
||||
currentWidth = window.innerWidth;
|
||||
var orient = currentWidth == 320 ? "profile" : "landscape";
|
||||
document.body.setAttribute("orient", orient);
|
||||
setTimeout(scrollTo, 100, 0, 1);
|
||||
}
|
||||
|
||||
if (location.hash != currentHash)
|
||||
{
|
||||
var pageId = location.hash.substr(hashPrefix.length)
|
||||
iui.showPageById(pageId);
|
||||
}
|
||||
}
|
||||
|
||||
function showDialog(page)
|
||||
{
|
||||
currentDialog = page;
|
||||
page.setAttribute("selected", "true");
|
||||
|
||||
if (hasClass(page, "dialog") && !page.target)
|
||||
showForm(page);
|
||||
}
|
||||
|
||||
function showForm(form)
|
||||
{
|
||||
form.onsubmit = function(event)
|
||||
{
|
||||
event.preventDefault();
|
||||
submitForm(form);
|
||||
};
|
||||
|
||||
form.onclick = function(event)
|
||||
{
|
||||
if (event.target == form && hasClass(form, "dialog"))
|
||||
cancelDialog(form);
|
||||
};
|
||||
}
|
||||
|
||||
function cancelDialog(form)
|
||||
{
|
||||
form.removeAttribute("selected");
|
||||
}
|
||||
|
||||
function updatePage(page, fromPage)
|
||||
{
|
||||
if (!page.id)
|
||||
page.id = "__" + (++newPageCount) + "__";
|
||||
|
||||
location.href = currentHash = hashPrefix + page.id;
|
||||
pageHistory.push(page.id);
|
||||
|
||||
var pageTitle = $("pageTitle");
|
||||
if (page.title)
|
||||
pageTitle.innerHTML = page.title;
|
||||
|
||||
if (page.localName.toLowerCase() == "form" && !page.target)
|
||||
showForm(page);
|
||||
|
||||
var backButton = $("backButton");
|
||||
if (backButton)
|
||||
{
|
||||
var prevPage = $(pageHistory[pageHistory.length-2]);
|
||||
if (prevPage && !page.getAttribute("hideBackButton"))
|
||||
{
|
||||
backButton.style.display = "inline";
|
||||
backButton.innerHTML = prevPage.title ? prevPage.title : "Back";
|
||||
}
|
||||
else
|
||||
backButton.style.display = "none";
|
||||
}
|
||||
}
|
||||
|
||||
function slidePages(fromPage, toPage, backwards)
|
||||
{
|
||||
var axis = (backwards ? fromPage : toPage).getAttribute("axis");
|
||||
if (axis == "y")
|
||||
(backwards ? fromPage : toPage).style.top = "100%";
|
||||
else
|
||||
toPage.style.left = "100%";
|
||||
|
||||
toPage.setAttribute("selected", "true");
|
||||
scrollTo(0, 1);
|
||||
clearInterval(checkTimer);
|
||||
|
||||
var percent = 100;
|
||||
slide();
|
||||
var timer = setInterval(slide, slideInterval);
|
||||
|
||||
function slide()
|
||||
{
|
||||
percent -= slideSpeed;
|
||||
if (percent <= 0)
|
||||
{
|
||||
percent = 0;
|
||||
if (!hasClass(toPage, "dialog"))
|
||||
fromPage.removeAttribute("selected");
|
||||
clearInterval(timer);
|
||||
checkTimer = setInterval(checkOrientAndLocation, 300);
|
||||
setTimeout(updatePage, 0, toPage, fromPage);
|
||||
}
|
||||
|
||||
if (axis == "y")
|
||||
{
|
||||
backwards
|
||||
? fromPage.style.top = (100-percent) + "%"
|
||||
: toPage.style.top = percent + "%";
|
||||
}
|
||||
else
|
||||
{
|
||||
fromPage.style.left = (backwards ? (100-percent) : (percent-100)) + "%";
|
||||
toPage.style.left = (backwards ? -percent : percent) + "%";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function preloadImages()
|
||||
{
|
||||
var preloader = document.createElement("div");
|
||||
preloader.id = "preloader";
|
||||
document.body.appendChild(preloader);
|
||||
}
|
||||
|
||||
function submitForm(form)
|
||||
{
|
||||
iui.showPageByHref(form.action || "POST", encodeForm(form), form.method);
|
||||
}
|
||||
|
||||
function encodeForm(form)
|
||||
{
|
||||
function encode(inputs)
|
||||
{
|
||||
for (var i = 0; i < inputs.length; ++i)
|
||||
{
|
||||
if (inputs[i].name)
|
||||
args.push(inputs[i].name + "=" + escape(inputs[i].value));
|
||||
}
|
||||
}
|
||||
|
||||
var args = [];
|
||||
encode(form.getElementsByTagName("input"));
|
||||
encode(form.getElementsByTagName("select"));
|
||||
return args;
|
||||
}
|
||||
|
||||
function findParent(node, localName)
|
||||
{
|
||||
while (node && (node.nodeType != 1 || node.localName.toLowerCase() != localName))
|
||||
node = node.parentNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
function hasClass(self, name)
|
||||
{
|
||||
var re = new RegExp("(^|\\s)"+name+"($|\\s)");
|
||||
return re.exec(self.getAttribute("class")) != null;
|
||||
}
|
||||
|
||||
function replaceElementWithSource(replace, source)
|
||||
{
|
||||
var page = replace.parentNode;
|
||||
var parent = replace;
|
||||
while (page.parentNode != document.body)
|
||||
{
|
||||
page = page.parentNode;
|
||||
parent = parent.parentNode;
|
||||
}
|
||||
|
||||
var frag = document.createElement(parent.localName);
|
||||
frag.innerHTML = source;
|
||||
|
||||
page.removeChild(parent);
|
||||
|
||||
while (frag.firstChild)
|
||||
page.appendChild(frag.firstChild);
|
||||
}
|
||||
|
||||
function $(id) { return document.getElementById(id); }
|
||||
function ddd() { console.log.apply(console, arguments); }
|
||||
|
||||
})();
|
||||
1
addons/smartphone/iui/iuix.css
Normal file
1
addons/smartphone/iui/iuix.js
Normal file
BIN
addons/smartphone/iui/listArrow.png
Normal file
|
After Width: | Height: | Size: 259 B |
BIN
addons/smartphone/iui/listArrowSel.png
Normal file
|
After Width: | Height: | Size: 308 B |
BIN
addons/smartphone/iui/listGroup.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
addons/smartphone/iui/loading.gif
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
addons/smartphone/iui/pinstripes.png
Normal file
|
After Width: | Height: | Size: 117 B |
BIN
addons/smartphone/iui/selection.png
Normal file
|
After Width: | Height: | Size: 159 B |
BIN
addons/smartphone/iui/thumb.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
addons/smartphone/iui/toggle.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
addons/smartphone/iui/toggleOn.png
Normal file
|
After Width: | Height: | Size: 163 B |
BIN
addons/smartphone/iui/toolButton.png
Normal file
|
After Width: | Height: | Size: 531 B |
BIN
addons/smartphone/iui/toolbar.png
Normal file
|
After Width: | Height: | Size: 171 B |
BIN
addons/smartphone/iui/whiteButton.png
Normal file
|
After Width: | Height: | Size: 978 B |
22
addons/smartphone/smartphone.addon.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?PHP
|
||||
if(!defined("__ZBXE__")) exit();
|
||||
|
||||
if(Context::get('module')=='admin') return;
|
||||
|
||||
if($called_position != 'before_module_proc' && $called_position != 'after_module_proc' ) return;
|
||||
|
||||
require_once(_XE_PATH_.'addons/smartphone/classes/smartphone.class.php');
|
||||
debugPrint("here");
|
||||
if(!smartphoneXE::isFromSmartPhone())
|
||||
{
|
||||
debugPrint("here");
|
||||
return;
|
||||
}
|
||||
debugPrint("here");
|
||||
|
||||
|
||||
$oSmartphoneXE = &smartphoneXE::getInstance();
|
||||
$oSmartphoneXE->setModuleInfo($this->module_info);
|
||||
$oSmartphoneXE->setModuleInstance($this);
|
||||
$oSmartphoneXE->display();
|
||||
?>
|
||||
55
addons/smartphone/tpl/layout.html
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html lang="{Context::getLangType()}" xml:lang="{Context::getLangType()}" xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="Generator" content="XpressEngine {__ZBXE_VERSION__}" />
|
||||
<meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>
|
||||
|
||||
<title>{Context::getBrowserTitle()}</title>
|
||||
<link rel="stylesheet" type="text/css" href="/addons/smartphone/iui/iui.css" />
|
||||
<script type="application/x-javascript" src="/addons/smartphone/iui/iuix.js"></script>
|
||||
|
||||
<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}";
|
||||
//]]></script>
|
||||
</head>
|
||||
<body>
|
||||
<!--@if(!$dtb)-->
|
||||
<div class="toolbar">
|
||||
<h1 id="pageTitle"></h1>
|
||||
<a id="backButton" class="button" href="#"></a>
|
||||
<a class="button" href="#searchForm">Search</a>
|
||||
</div>
|
||||
<!--@end-->
|
||||
<ul id="home" title="{$module_info->browser_title}" selected="true">
|
||||
<li class="siteinfo">
|
||||
<span class="description">{$module_info->description}</span>
|
||||
<span class="xe">Powered by Xpress Engine</span>
|
||||
</li>
|
||||
<!--@if($bHavePhoneMethod)-->
|
||||
<li><a href="{getUrl('act','default')}">View</a>
|
||||
<!--@else-->
|
||||
<li>이 모듈은 smartphoneView를 지원하지 않습니다.</li>
|
||||
<!--@end-->
|
||||
<li><a href="#menu0">Menu</a></li>
|
||||
</ul>
|
||||
<!--@foreach($menus as $node_srl=>$menu)-->
|
||||
<ul id="menu{$node_srl}" title="{$menu->text}" selected="false">
|
||||
<!--@foreach($menu->list as $item_srl => $item)-->
|
||||
<!--@if($menus[$item_srl])-->
|
||||
<li><a href="#menu{$item_srl}">{$item->text}</a></li>
|
||||
<!--@else-->
|
||||
<!--@if($item->text && $item->url)-->
|
||||
<li><a href="{getUrl('mid',$item->url,'act','')}" target="_self">{$item->text}</a></li>
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
<!--@end-->
|
||||
</ul>
|
||||
<!--@end-->
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
@ -6,9 +6,7 @@
|
|||
if(!$module_info->module) return;
|
||||
if($module_info->module != 'wiki') return;
|
||||
Context::loadJavascriptPlugin('hotkeys');
|
||||
Context::addJsFile('./addons/wiki_link/wikilink.js');
|
||||
Context::addCssFile('./addons/wiki_link/wikilink.css');
|
||||
$footer = "<div id='link'> <div class='linkForm'>Link Target: <input type='text' id='linktarget' class='inputTypeText w100' /><a href='#' onclick='setText(); return false;'>AddLink</a></div></div>";
|
||||
Context::addHtmlFooter($footer);
|
||||
Context::addJsFile('./addons/wiki_link/wikilink.js',false);
|
||||
Context::addCssFile('./addons/wiki_link/wikilink.css',false);
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
#link { display: none; }
|
||||
#link .linkForm { margin-left: 10px; margin-top: 10px; }
|
||||
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 5px; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
|
||||
|
||||
.ui-dialog { background-color:#fff; z-index:999; padding:10px;}
|
||||
.ui-dialog-title { font-weight:bold; margin-bottom:3px; }
|
||||
.ui-dialog-titlebar-close { display:none; }
|
||||
.ui-dialog-buttonpane { text-align:right; bottom:5px !important; }
|
||||
.ui-dialog-buttonpane button { font-size:11px; font-family:tahoma; }
|
||||
|
|
|
|||
|
|
@ -1,15 +1,20 @@
|
|||
function openWikiLinkDialog()
|
||||
{
|
||||
var link = jQuery("#link");
|
||||
link.css('display', 'block');
|
||||
var target = xGetElementById('linktarget');
|
||||
target.value = "";
|
||||
try{
|
||||
link.dialog({height:100});
|
||||
}
|
||||
catch(e)
|
||||
{
|
||||
link.dialog("open");
|
||||
var wikiLink = jQuery('#wikiLink');
|
||||
if ( wikiLink.length < 1 ) {
|
||||
try{
|
||||
jQuery('<div id="wikiLink">Link Target : <input type="text" id="linktarget" class="inputTypeText" style="width:200px;" /></div>')
|
||||
.appendTo('body')
|
||||
.dialog({
|
||||
title:'wiki Link', width:300, height:60, resizable:false,
|
||||
modal: false, overlay: { opacity: 1, background: "#fff" },
|
||||
buttons: { "add link": function() { setText(); jQuery(this).dialog("close"); }, "cancel": function() { jQuery(this).dialog("close"); } },
|
||||
show: 'drop' /* , hide: 'explode' */
|
||||
});
|
||||
} catch(e){
|
||||
}
|
||||
} else {
|
||||
wikiLink.dialog('open');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -19,6 +24,7 @@ function setText() {
|
|||
var text = target.value;
|
||||
text.replace(/&/ig,'&').replace(/</ig,'<').replace(/>/ig,'>');
|
||||
var url = request_uri.setQuery('mid',current_mid).setQuery('entry',text);
|
||||
if(typeof(xeVid)!='undefined') url = url.setQuery('vid', xeVid);
|
||||
var link = "<a href=\""+url+"\" ";
|
||||
link += ">"+text+"</a>";
|
||||
|
||||
|
|
@ -31,16 +37,13 @@ function addShortCutForWiki()
|
|||
{
|
||||
var iframe_obj = editorGetIFrame(1);
|
||||
jQuery(iframe_obj.contentWindow.document).bind('keydown', "CTRL+SHIFT+SPACE", function(evt) { openWikiLinkDialog(); });
|
||||
if(jQuery.os.Mac)
|
||||
{
|
||||
if(jQuery.os.Mac) {
|
||||
jQuery(iframe_obj.contentWindow.document).bind('keydown', "ALT+SPACE", function(evt) { openWikiLinkDialog(); });
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
jQuery(iframe_obj.contentWindow.document).bind('keydown', "CTRL+SPACE", function(evt) { openWikiLinkDialog(); });
|
||||
}
|
||||
jQuery(document).bind('keydown',"CTRL+SHIFT+SPACE", function(evt) {} );
|
||||
}
|
||||
|
||||
xAddEventListener(window, 'load', addShortCutForWiki);
|
||||
jQuery(window).load( function() { addShortCutForWiki() } );
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@
|
|||
|
||||
class Context {
|
||||
|
||||
var $allow_rewrite = false; ///< @brief rewrite mod 사용에 대한 변수
|
||||
|
||||
var $request_method = 'GET'; ///< @brief GET/POST/XMLRPC 중 어떤 방식으로 요청이 왔는지에 대한 값이 세팅. GET/POST/XML 3가지가 있음
|
||||
var $response_method = ''; ///< @brief HTML/XMLRPC 중 어떤 방식으로 결과를 출력할지 결정. (강제 지정전까지는 request_method를 따름)
|
||||
|
||||
|
|
@ -26,6 +28,7 @@
|
|||
var $css_files = array(); ///< @brief display시에 사용하게 되는 css files의 목록
|
||||
|
||||
var $html_header = NULL; ///< @brief display시에 사용하게 되는 <head>..</head>내의 스크립트코드
|
||||
var $body_class = array(); ///< @brief display시에 사용하게 되는 <body> 안에 출력될 class
|
||||
var $body_header = NULL; ///< @brief display시에 사용하게 되는 <body> 바로 다음에 출력될 스크립트 코드
|
||||
var $html_footer = NULL; ///< @brief display시에 사용하게 되는 </body> 바로 앞에 추가될 코드
|
||||
|
||||
|
|
@ -45,8 +48,6 @@
|
|||
|
||||
var $is_uploaded = false; ///< @brief 첨부파일이 업로드 된 요청이였는지에 대한 체크 플래그
|
||||
|
||||
var $widget_include_info_flag = false; // 위젯 정보 코드 출력
|
||||
|
||||
/**
|
||||
* @brief 유일한 Context 객체를 반환 (Singleton)
|
||||
* Context는 어디서든 객체 선언없이 사용하기 위해서 static 하게 사용
|
||||
|
|
@ -87,6 +88,8 @@
|
|||
Context::set('site_module_info', $site_module_info);
|
||||
|
||||
if($site_module_info->site_srl && isSiteID($site_module_info->vid)) Context::set('vid', $site_module_info->vid);
|
||||
$this->db_info->lang_type = $site_module_info->default_language;
|
||||
if(!$this->db_info->lang_type) $this->db_info->lang_type = 'en';
|
||||
}
|
||||
|
||||
// 언어 파일 불러오기
|
||||
|
|
@ -96,14 +99,9 @@
|
|||
if($_COOKIE['lang_type']) $this->lang_type = $_COOKIE['lang_type'];
|
||||
|
||||
// 사용자 설정 언어 타입이 없으면 기본 언어타입으로 지정
|
||||
if(!$this->lang_type) {
|
||||
// 가상 사이트라면 가상사이트의 언어타입으로 지정
|
||||
if($site_module_info && $site_module_info->default_language) $this->lang_type = $site_module_info->default_language;
|
||||
else $this->lang_type = $this->db_info->lang_type;
|
||||
}
|
||||
if(!$this->lang_type) $this->lang_type = $this->db_info->lang_type;
|
||||
|
||||
// 관리자 설정 언어값에 등록된 것이 아니라면 기본 언어로 변경
|
||||
if(!in_array($this->lang_type, array_keys($lang_supported))) $this->lang_type = $this->db_info->lang_type;
|
||||
if(!$this->lang_type) $this->lang_type = "en";
|
||||
|
||||
Context::set('lang_supported', $lang_supported);
|
||||
|
|
@ -113,16 +111,18 @@
|
|||
$this->loadLang(_XE_PATH_.'modules/module/lang');
|
||||
|
||||
// 세션 핸들러 지정
|
||||
$oSessionModel = &getModel('session');
|
||||
$oSessionController = &getController('session');
|
||||
session_set_save_handler(
|
||||
array(&$oSessionController,"open"),
|
||||
array(&$oSessionController,"close"),
|
||||
array(&$oSessionModel,"read"),
|
||||
array(&$oSessionController,"write"),
|
||||
array(&$oSessionController,"destroy"),
|
||||
array(&$oSessionController,"gc")
|
||||
);
|
||||
if($this->db_info->use_db_session != 'N') {
|
||||
$oSessionModel = &getModel('session');
|
||||
$oSessionController = &getController('session');
|
||||
session_set_save_handler(
|
||||
array(&$oSessionController,"open"),
|
||||
array(&$oSessionController,"close"),
|
||||
array(&$oSessionModel,"read"),
|
||||
array(&$oSessionController,"write"),
|
||||
array(&$oSessionController,"destroy"),
|
||||
array(&$oSessionController,"gc")
|
||||
);
|
||||
}
|
||||
session_start();
|
||||
|
||||
|
||||
|
|
@ -816,6 +816,8 @@
|
|||
$get_vars[$key] = $val;
|
||||
}
|
||||
unset($get_vars['vid']);
|
||||
unset($get_vars['rnd']);
|
||||
if(isset($get_vars['page'])&&$get_vars['page']<2) unset($get_vars['page']);
|
||||
|
||||
/* member module중의 쪽지함/친구 관리 기능이 communication 모듈로 이전하여 하위 호환성을 위한 act값 변경 */
|
||||
if($get_vars['act'] == 'dispMemberFriend') $get_vars['act'] = 'dispCommunicationFriend';
|
||||
|
|
@ -1248,6 +1250,39 @@
|
|||
return $this->html_header;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Html Body에 css class 추가
|
||||
**/
|
||||
function addBodyClass($class_name) {
|
||||
$oContext = &Context::getInstance();
|
||||
return $oContext->_addBodyClass($class_name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Html Body에 css class 추가
|
||||
**/
|
||||
function _addBodyClass($class_name) {
|
||||
$this->body_class[] = $class_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Html Body에 css class return
|
||||
**/
|
||||
function getBodyClass() {
|
||||
$oContext = &Context::getInstance();
|
||||
return $oContext->_getBodyClass();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Html Body에 css class return
|
||||
**/
|
||||
function _getBodyClass() {
|
||||
$this->body_class = array_unique($this->body_class);
|
||||
if(count($this->body_class)>0) return sprintf(' class="%s"', join(' ',$this->body_class));
|
||||
else return '';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief BodyHeader 추가
|
||||
**/
|
||||
|
|
@ -1331,117 +1366,19 @@
|
|||
return file_exists(Context::getConfigFile()) && filesize(Context::getConfigFile());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경을 위한 flag set
|
||||
**/
|
||||
function setTransWidgetCodeIncludeInfo($flag=false){
|
||||
$oContext = &Context::getInstance();
|
||||
$oContext->widget_include_info_flag = $flag ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경
|
||||
**/
|
||||
function transContent($content) {
|
||||
|
||||
// 사용자 정의 언어로 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($content);
|
||||
|
||||
// 위젯 코드 변경
|
||||
$oWidgetController = &getController('widget');
|
||||
$content = $oWidgetController->transWidgetCode($content,$this->widget_include_info_flag);
|
||||
|
||||
// 메타 파일 변경
|
||||
$content = preg_replace_callback('!<\!\-\-Meta:([^\-]*?)\-\->!is', array($this,'transMeta'), $content);
|
||||
|
||||
// 에디터 컴포넌트를 찾아서 결과 코드로 변환
|
||||
$content = preg_replace_callback('!<div([^\>]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'transEditorComponent'), $content);
|
||||
$content = preg_replace_callback('!<img([^\>]*)editor_component=([^\>]*?)\>!is', array($this,'transEditorComponent'), $content);
|
||||
|
||||
// style의 url 경로를 재정의 한다.
|
||||
$content = preg_replace('/url\(http:\/\/([^ ]+)http:\/\//is','url(http://', $content);
|
||||
// body 내의 <style ..></style>를 header로 이동
|
||||
$content = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'moveStyleToHeader'), $content);
|
||||
|
||||
// templateHandler의 이미지 경로로 인하여 생기는 절대경로 이미지등의 경로 중복 처리
|
||||
//$content = preg_replace('/<(img|input)([^>]*)src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','<$1$2src=$3http://', $content);
|
||||
$content = preg_replace('/src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','src=$1http://', $content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief IE위지윅에디터에서 태그가 대문자로 사용되기에 이를 소문자로 치환
|
||||
* @brief rewrite mod 사용에 대한 변수 return
|
||||
**/
|
||||
function transTagToLowerCase($matches) {
|
||||
return sprintf('<%s%s%s>', $matches[1], strtolower($matches[2]), $matches[3]);
|
||||
function isAllowRewrite() {
|
||||
$oContext = &Context::getInstance();
|
||||
return $oContext->allow_rewrite;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <!--Meta:파일이름.(css|js)-->를 변경
|
||||
**/
|
||||
function transMeta($matches) {
|
||||
if(substr($matches[1],'-4')=='.css') $this->addCSSFile($matches[1]);
|
||||
elseif(substr($matches[1],'-3')=='.js') $this->addJSFile($matches[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <body>내의 <style태그를 header로 이동
|
||||
**/
|
||||
function moveStyleToHeader($matches) {
|
||||
$this->addHtmlHeader($matches[0]);
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 내용의 에디터 컴포넌트 코드를 변환
|
||||
**/
|
||||
function transEditorComponent($matches) {
|
||||
// IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌
|
||||
$buff = $matches[0];
|
||||
$buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $buff);
|
||||
$buff = str_replace("&","&",$buff);
|
||||
|
||||
// 에디터 컴포넌트에서 생성된 코드
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse($buff);
|
||||
if($xml_doc->div) $xml_doc = $xml_doc->div;
|
||||
else if($xml_doc->img) $xml_doc = $xml_doc->img;
|
||||
|
||||
$xml_doc->body = $matches[3];
|
||||
|
||||
// attribute가 없으면 return
|
||||
$editor_component = $xml_doc->attrs->editor_component;
|
||||
if(!$editor_component) return $matches[0];
|
||||
|
||||
// component::transHTML() 을 이용하여 변환된 코드를 받음
|
||||
$oEditorModel = &getModel('editor');
|
||||
$oComponent = &$oEditorModel->getComponentObject($editor_component, 0);
|
||||
if(!is_object($oComponent)||!method_exists($oComponent, 'transHTML')) return $matches[0];
|
||||
|
||||
return $oComponent->transHTML($xml_doc);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief gzip encoding 여부 체크
|
||||
**/
|
||||
function isGzEnabled() {
|
||||
if(
|
||||
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
|
||||
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
|
||||
function_exists('ob_gzhandler') &&
|
||||
extension_loaded('zlib')
|
||||
) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function getFixUrl($url){
|
||||
if(eregi("(http|https):\/\/",$url)) return $url;
|
||||
if(ereg("^/",$url)) return $url;
|
||||
return dirname($_SERVER['PHP_SELF']) . "/" . $url;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -713,6 +713,23 @@
|
|||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
/*
|
||||
// group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정
|
||||
// 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다.
|
||||
//
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as \"count\" from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$total_count = $this->getCountCache($output->tables, $condition);
|
||||
|
|
|
|||
|
|
@ -338,6 +338,9 @@
|
|||
$tmp->{$key} = ibase_blob_get($blob_hndl, $blob_data[0]);
|
||||
ibase_blob_close($blob_hndl);
|
||||
}
|
||||
else if($type == "char") {
|
||||
$tmp->{$key} = trim($tmp->{$key}); // DB의 character set이 UTF8일때 생기는 빈칸을 제거
|
||||
}
|
||||
}
|
||||
|
||||
$return[] = $tmp;
|
||||
|
|
@ -875,6 +878,30 @@
|
|||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
$query_groupby = '';
|
||||
if ($output->groups) {
|
||||
foreach ($output->groups as $key => $val)
|
||||
$group_list[] = $this->autoQuotes($val);
|
||||
if (count($group_list)) $query_groupby = sprintf(" GROUP BY %s", implode(", ", $group_list));
|
||||
}
|
||||
|
||||
/*
|
||||
// group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정
|
||||
// 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다.
|
||||
//
|
||||
$count_condition = strlen($query_groupby) ? sprintf('%s group by %s', $condition, $query_groupby) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf('select count(*) as "count" from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as \"count\" from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$total_count = $this->getCountCache($output->tables, $condition);
|
||||
|
|
@ -918,12 +945,7 @@
|
|||
$limit = sprintf('FIRST %d SKIP %d ', $list_count, $start_count);
|
||||
$query = sprintf('SELECT %s %s FROM %s %s %s', $limit, $columns, implode(',',$table_list), implode(' ',$left_join), $condition);
|
||||
|
||||
if($output->groups) {
|
||||
foreach($output->groups as $key => $val) {
|
||||
$group_list[] = $this->autoQuotes($val);
|
||||
}
|
||||
if(count($group_list)) $query .= sprintf(" GROUP BY %s", implode(",",$group_list));
|
||||
}
|
||||
if (strlen($query_groupby)) $query .= $query_groupby;
|
||||
|
||||
if($output->order) {
|
||||
foreach($output->order as $key => $val) {
|
||||
|
|
|
|||
|
|
@ -588,13 +588,16 @@
|
|||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$total_count = $this->getCountCache($output->tables, $condition);
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $condition, $total_count);
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
|
|
|
|||
|
|
@ -600,13 +600,16 @@
|
|||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$total_count = $this->getCountCache($output->tables, $condition);
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $condition, $total_count);
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
|
||||
$list_count = $output->list_count['value'];
|
||||
|
|
|
|||
|
|
@ -774,6 +774,23 @@ class DBPostgresql extends DB
|
|||
{
|
||||
require_once (_XE_PATH_ . 'classes/page/PageHandler.class.php');
|
||||
|
||||
/*
|
||||
// group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정
|
||||
// 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다.
|
||||
//
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if ($total_count === false) {
|
||||
$count_query = sprintf('select count(*) as count from %s %s %s', implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',', $table_list),
|
||||
implode(' ', $left_join), $condition);
|
||||
|
|
|
|||
|
|
@ -605,6 +605,23 @@
|
|||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
/*
|
||||
// group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정
|
||||
// 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다.
|
||||
//
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
|
||||
|
|
|
|||
|
|
@ -648,6 +648,23 @@
|
|||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
/*
|
||||
// group by 절이 포함된 SELECT 쿼리의 전체 갯수를 구하기 위한 수정
|
||||
// 정상적인 동작이 확인되면 주석으로 막아둔 부분으로 대체합니다.
|
||||
//
|
||||
$count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition;
|
||||
$total_count = $this->getCountCache($output->tables, $count_condition);
|
||||
if($total_count === false) {
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition);
|
||||
if (count($output->groups))
|
||||
$count_query = sprintf('select count(*) as count from (%s) xet', $count_query);
|
||||
$result = $this->_query($count_query);
|
||||
$count_output = $this->_fetch($result);
|
||||
$total_count = (int)$count_output->count;
|
||||
$this->putCountCache($output->tables, $count_condition, $total_count);
|
||||
}
|
||||
*/
|
||||
|
||||
// 전체 개수를 구함
|
||||
$count_query = sprintf("select count(*) as count from %s %s %s", implode(',',$table_list),implode(' ',$left_join), $condition);
|
||||
$total_count = $this->getCountCache($output->tables, $condition);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
* Response Method에 따라서 html or xml 출력방법을 결정한다
|
||||
* xml : oModule의 variables를 simple xml 로 출력
|
||||
* html : oModule의 template/variables로 html을 만들고 contents_html로 처리
|
||||
* widget이나 layout의 html과 연동하여 출력
|
||||
**/
|
||||
|
||||
class DisplayHandler extends Handler {
|
||||
|
|
@ -22,108 +21,142 @@
|
|||
function printContent(&$oModule) {
|
||||
|
||||
// gzip encoding 지원 여부 체크
|
||||
$this->gz_enabled = Context::isGzEnabled();
|
||||
if(
|
||||
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
|
||||
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
|
||||
function_exists('ob_gzhandler') &&
|
||||
extension_loaded('zlib')
|
||||
) $this->gz_enabled = true;
|
||||
|
||||
// header 출력
|
||||
$this->_printHeader();
|
||||
// request method에 따른 처리
|
||||
if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule);
|
||||
else if(Context::getRequestMethod() == 'JSON') $content = $this->_toJSON($oModule);
|
||||
else $content = $this->_toHTMLDoc($oModule);
|
||||
// request method에 따른 컨텐츠 결과물 추출
|
||||
if(Context::getRequestMethod() == 'XMLRPC') $output = $this->_toXmlDoc($oModule);
|
||||
else if(Context::getRequestMethod() == 'JSON') $output = $this->_toJSON($oModule);
|
||||
else $output = $this->_toHTMLDoc($oModule);
|
||||
|
||||
// 요청방식에 따라 출력을 별도로
|
||||
// HTML 출력 요청일 경우 레이아웃 컴파일과 더블어 완성된 코드를 제공
|
||||
if(Context::getResponseMethod()=="HTML") {
|
||||
|
||||
// 관리자 모드일 경우 #xeAdmin id를 가지는 div 추가
|
||||
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $content = '<div id="xeAdmin">'.$content.'</div>';
|
||||
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $output = '<div id="xeAdmin">'.$output.'</div>';
|
||||
|
||||
// 내용을 content라는 변수로 설정 (layout에서 {$content}에서 대체됨)
|
||||
Context::set('content', $content);
|
||||
// 내용을 content라는 변수로 설정 (layout에서 {$output}에서 대체됨)
|
||||
Context::set('content', $output);
|
||||
|
||||
// 레이아웃을 컴파일
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
$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();
|
||||
}
|
||||
if(!$layout_path) $layout_path = './common/tpl/';
|
||||
if(!$layout_file) $layout_file = 'default_layout.html';
|
||||
|
||||
// 현재 요청된 레이아웃 정보를 구함
|
||||
$oLayoutModel = &getModel('layout');
|
||||
$current_module_info = Context::get('current_module_info');
|
||||
$layout_srl = $current_module_info->layout_srl;
|
||||
// 현재 요청된 레이아웃 정보를 구함
|
||||
$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');
|
||||
// 레이아웃과 연결되어 있으면 레이아웃 컴파일
|
||||
if($layout_srl > 0){
|
||||
$layout_info = Context::get('layout_info');
|
||||
|
||||
// faceoff 레이아웃일 경우 별도 처리
|
||||
if($layout_info && $layout_info->type == 'faceoff') {
|
||||
$oLayoutModel->doActivateFaceOff($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";
|
||||
|
||||
// 관리자 레이아웃 수정화면에서 변경된 CSS가 있는지 조사
|
||||
$edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_srl);
|
||||
$output = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
|
||||
|
||||
|
||||
if(file_exists($edited_layout_css)) Context::addCSSFile($edited_layout_css,true,'all','',100);
|
||||
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
|
||||
}
|
||||
Context::set('layout_info', $layout_info);
|
||||
|
||||
$zbxe_final_content = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
|
||||
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
|
||||
// 각 위젯, 에디터 컴포넌트의 코드 변경
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
$oContext = &Context::getInstance();
|
||||
$zbxe_final_content= $oContext->transContent($zbxe_final_content);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__trans_widget_editor_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
// 최종 결과를 common_layout에 넣어버림
|
||||
Context::set('zbxe_final_content', $zbxe_final_content);
|
||||
|
||||
$output = $oTemplate->compile('./common/tpl', 'common_layout');
|
||||
|
||||
// 사용자 정의 언어 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($output);
|
||||
|
||||
|
||||
} else {
|
||||
$output = $content;
|
||||
}
|
||||
|
||||
// 출력하기 전에 trigger 호출 (before)
|
||||
ModuleHandler::triggerCall('display', 'before', $output);
|
||||
|
||||
// 애드온 실행
|
||||
$called_position = 'before_display_content';
|
||||
$oAddonController = &getController('addon');
|
||||
$addon_file = $oAddonController->getCacheFilePath();
|
||||
if(file_exists($addon_file)) @include($addon_file);
|
||||
|
||||
$this->content_size = strlen($output);
|
||||
// HTML 출력일 경우 최종적으로 common layout을 씌워서 출력
|
||||
if(Context::getResponseMethod()=="HTML") {
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// 컨텐츠 출력
|
||||
$this->display($output);
|
||||
// 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);
|
||||
}
|
||||
|
||||
// 간혹 background-image에 url(none) 때문에 request가 한번 더 일어나는 경우가 생기는 것을 방지
|
||||
$output = preg_replace('/url\((["\']?)none(["\']?)\)/is', 'none', $output);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__trans_content_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
// 최종 레이아웃 변환
|
||||
Context::set('content', $output);
|
||||
$output = $oTemplate->compile('./common/tpl', 'common_layout');
|
||||
|
||||
// 사용자 정의 언어 변환
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($output);
|
||||
}
|
||||
|
||||
// header 출력
|
||||
if($this->gz_enabled) header("Content-Encoding: gzip");
|
||||
if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader();
|
||||
else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader();
|
||||
else $this->_printHTMLHeader();
|
||||
|
||||
// debugOutput 출력
|
||||
$this->content_size = strlen($output);
|
||||
$output .= $this->_debugOutput();
|
||||
|
||||
// 결과물 직접 출력
|
||||
if($this->gz_enabled) print ob_gzhandler($output, 5);
|
||||
else print $output;
|
||||
|
||||
// 출력 후 trigger 호출 (after)
|
||||
ModuleHandler::triggerCall('display', 'after', $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 최종 결과물의 출력
|
||||
* @brief <!--Meta:파일이름.(css|js)-->를 변경
|
||||
**/
|
||||
function display($content) {
|
||||
$content .= $this->_debugOutput();
|
||||
function transMeta($matches) {
|
||||
if(substr($matches[1],'-4')=='.css') Context::addCSSFile($matches[1]);
|
||||
elseif(substr($matches[1],'-3')=='.js') Context::addJSFile($matches[1]);
|
||||
}
|
||||
|
||||
// 출력하기 전에 trigger 호출 (after)
|
||||
ModuleHandler::triggerCall('display', 'after', $content);
|
||||
|
||||
if($this->gz_enabled) print ob_gzhandler($content, 5);
|
||||
else print $content;
|
||||
/**
|
||||
* @brief <body>내의 <style태그를 header로 이동
|
||||
**/
|
||||
function moveStyleToHeader($matches) {
|
||||
Context::addHtmlHeader($matches[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -186,13 +219,6 @@
|
|||
return $oTemplate->compile($template_path, $tpl_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief content size return
|
||||
**/
|
||||
function getContentSize() {
|
||||
return $this->content_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 디버그 모드일 경우 디버깅 메시지 출력
|
||||
*
|
||||
|
|
@ -225,7 +251,7 @@
|
|||
sprintf("%s:%s%s%s%s", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']),
|
||||
$_SERVER['REQUEST_METHOD'],
|
||||
Context::getResponseMethod(),
|
||||
$this->getContentSize().' byte'
|
||||
$this->content_size.' byte'
|
||||
)
|
||||
)
|
||||
),
|
||||
|
|
@ -233,7 +259,7 @@
|
|||
);
|
||||
$firephp->fb(
|
||||
array('Elapsed time >>> Total : '.sprintf('%0.5f sec', $end - __StartTime__),
|
||||
array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans widget&editor'),
|
||||
array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans Content'),
|
||||
array(
|
||||
sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__elapsed_class_load__']),
|
||||
|
|
@ -241,7 +267,7 @@
|
|||
sprintf('%0.5f sec', $GLOBALS['__xmlparse_elapsed__']),
|
||||
sprintf('%0.5f sec', $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__widget_excute_elapsed__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__trans_widget_editor_elapsed__'])
|
||||
sprintf('%0.5f sec', $GLOBALS['__trans_content_elapsed__'])
|
||||
)
|
||||
)
|
||||
),
|
||||
|
|
@ -275,7 +301,7 @@
|
|||
$buff .= sprintf("\tRequest URI \t\t\t: %s:%s%s%s%s\n", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']);
|
||||
$buff .= sprintf("\tRequest method \t\t\t: %s\n", $_SERVER['REQUEST_METHOD']);
|
||||
$buff .= sprintf("\tResponse method \t\t: %s\n", Context::getResponseMethod());
|
||||
$buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->getContentSize());
|
||||
$buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->content_size);
|
||||
|
||||
// 전체 실행 시간
|
||||
$buff .= sprintf("\n- Total elapsed time : %0.5f sec\n", $end-__StartTime__);
|
||||
|
|
@ -292,7 +318,7 @@
|
|||
$buff .= sprintf("\n\tLayout compile elapsed time \t: %0.5f sec", $GLOBALS['__layout_compile_elapsed__']);
|
||||
|
||||
// 위젯, 에디터 컴포넌트 치환 시간
|
||||
$buff .= sprintf("\n\tTrans widget&editor elapsed time: %0.5f sec\n", $GLOBALS['__trans_widget_editor_elapsed__']);
|
||||
$buff .= sprintf("\n\tTrans Content \t\t\t: %0.5f sec\n", $GLOBALS['__trans_content_elapsed__']);
|
||||
}
|
||||
|
||||
// DB 로그 작성
|
||||
|
|
@ -338,17 +364,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief RequestMethod에 맞춰 헤더 출력
|
||||
***/
|
||||
function _printHeader() {
|
||||
if($this->gz_enabled) header("Content-Encoding: gzip");
|
||||
if(Context::getResponseMethod() == 'JSON') return $this->_printJSONHeader();
|
||||
else if(Context::getResponseMethod() != 'HTML') return $this->_printXMLHeader();
|
||||
else return $this->_printHTMLHeader();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief xml header 출력 (utf8 고정)
|
||||
**/
|
||||
|
|
|
|||
|
|
@ -295,13 +295,12 @@
|
|||
}
|
||||
|
||||
$oResponse = $oRequest->sendRequest();
|
||||
if(PEAR::isError($oResponse)) return;
|
||||
|
||||
$code = $oRequest->getResponseCode();
|
||||
$header = $oRequest->getResponseHeader();
|
||||
$body = $oRequest->getResponseBody();
|
||||
|
||||
if($code == 301) {
|
||||
if($code == 301 || $code == 302) {
|
||||
$url = $header['location'];
|
||||
if($url) return FileHandler::getRemoteResource($url, $body, $timeout, $method, $content_type, $headers);
|
||||
else return;
|
||||
|
|
|
|||
|
|
@ -368,6 +368,10 @@
|
|||
$instance_name = sprintf("%s%s",$module,"WAP");
|
||||
$class_file = sprintf('%s%s%s.wap.php', _XE_PATH_, $class_path, $module);
|
||||
break;
|
||||
case 'smartphone' :
|
||||
$instance_name = sprintf("%s%s",$module,"SPhone");
|
||||
$class_file = sprintf('%s%s%s.smartphone.php', _XE_PATH_, $class_path, $module);
|
||||
break;
|
||||
case 'class' :
|
||||
$instance_name = $module;
|
||||
$class_file = sprintf('%s%s%s.class.php', _XE_PATH_, $class_path, $module);
|
||||
|
|
@ -437,7 +441,7 @@
|
|||
if(!$oModule || !method_exists($oModule, $called_method)) continue;
|
||||
|
||||
$output = $oModule->{$called_method}($obj);
|
||||
if(!$output->toBool()) return $output;
|
||||
if(is_object($output) && method_exists($output, 'toBool') && !$output->toBool()) return $output;
|
||||
unset($oModule);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -71,8 +71,19 @@
|
|||
$files = $this->_getOptimizedRemoved($files);
|
||||
if(!count($files)) return $files;
|
||||
|
||||
$url_info = parse_url(Context::getRequestUri());
|
||||
$abpath = $url_info['path'];
|
||||
|
||||
foreach($files as $key => $val) {
|
||||
if(substr($val['file'],0,2)=='./') $files[$key]['file'] = Context::getRequestUri().substr($val['file'],2);
|
||||
$file = $val['file'];
|
||||
|
||||
if(substr($file,0,1)=='/' || strpos($file,'://')!==false) continue;
|
||||
if(substr($file,0,2)=='./') $file = substr($file,2);
|
||||
$file = $abpath.$file;
|
||||
while(strpos($file,'/../')!==false) {
|
||||
$file = preg_replace('/\/([^\/]+)\/\.\.\//','/',$file);
|
||||
}
|
||||
$files[$key]['file'] = $file;
|
||||
}
|
||||
return $files;
|
||||
}
|
||||
|
|
@ -222,9 +233,14 @@ if(!$cached) {
|
|||
$abpath = $url_info['path'];
|
||||
}
|
||||
$path = str_replace(array('"',"'"),'',$matches[1]);
|
||||
if(preg_match('/^http|^\//i', $path) || preg_match('/\.htc$/i',$path) ) return $matches[0];
|
||||
if(substr($path,0,1)=='/' || strpos($path,'://')!==false || strpos($path,'.htc')!==false) return 'url("'.$path.'")';
|
||||
if(substr($path,0,2)=='./') $path = substr($path,2);
|
||||
$target = $abpath.$this->tmp_css_path.$path;
|
||||
while(strpos($target,'/../')!==false) {
|
||||
$target = preg_replace('/\/([^\/]+)\/\.\.\//','/',$target);
|
||||
}
|
||||
|
||||
return 'url("'.$abpath.$this->tmp_css_path.$path.'")';
|
||||
return 'url("'.$target.'")';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,8 +100,8 @@
|
|||
// include 변경 <!--#include($filename)-->
|
||||
$buff = preg_replace_callback('!<\!--#include\(([^\)]*?)\)-->!is', array($this, '_compileIncludeToCode'), $buff);
|
||||
|
||||
// 이미지 태그 img의 src의 값이 http:// 나 / 로 시작하지 않으면 root경로부터 시작하도록 변경
|
||||
$buff = preg_replace_callback('/<(img|input)([^>]*)src=[\'"]{1}(?!http)(.*?)[\'"]{1}/is', array($this, '_compileImgPath'), $buff);
|
||||
// 이미지 태그 img의 src의 값이 ./ 또는 파일이름으로 바로 시작하면 경로 변경
|
||||
$buff = preg_replace_callback('/<(img|input)([^>]*)src=[\'"]{1}(.*?)[\'"]{1}/is', array($this, '_compileImgPath'), $buff);
|
||||
|
||||
// 변수를 변경
|
||||
$buff = preg_replace_callback('/\{[^@^ ]([^\{\}\n]+)\}/i', array($this, '_compileVarToContext'), $buff);
|
||||
|
|
@ -124,13 +124,9 @@
|
|||
// javascript plugin import
|
||||
$buff = preg_replace_callback('!<\!--%load_js_plugin\(\"([^\"]*?)\"\)-->!is', array($this, '_compileLoadJavascriptPlugin'), $buff);
|
||||
|
||||
|
||||
// 파일에 쓰기 전에 직접 호출되는 것을 방지
|
||||
$buff = sprintf('%s%s%s','<?php if(!defined("__ZBXE__")) exit();?>',"\n",$buff);
|
||||
|
||||
// strip white spaces..
|
||||
// $buff = preg_replace('/ +/', ' ', $buff);
|
||||
|
||||
// 컴파일된 코드를 파일에 저장
|
||||
if($compiled_tpl_file) FileHandler::writeFile($compiled_tpl_file, $buff);
|
||||
|
||||
|
|
@ -149,14 +145,23 @@
|
|||
* @brief {$와 } 안의 $... 변수를 Context::get(...) 으로 변경
|
||||
**/
|
||||
function _compileImgPath($matches) {
|
||||
static $real_path = null;
|
||||
$str1 = $matches[0];
|
||||
$str2 = $path = $matches[3];
|
||||
|
||||
if(substr($path,0,1)=='/') return $str1;
|
||||
$str2 = $path = trim($matches[3]);
|
||||
|
||||
if(substr($path,0,1)=='/' || substr($path,0,1)=='{' || strpos($path,'://')!==false) return $str1;
|
||||
if(substr($path,0,2)=='./') $path = substr($path,2);
|
||||
$path = '<?php echo Context::getRequestUri().$this->tpl_path; ?>'.$path;
|
||||
return str_replace($str2, $path, $str1);
|
||||
|
||||
if(is_null($real_path)) {
|
||||
$url = parse_url(Context::getRequestUri());
|
||||
$real_path = $url['path'];
|
||||
}
|
||||
|
||||
$target = $real_path.$this->tpl_path.$path;
|
||||
while(strpos($target,'/../')!==false) {
|
||||
$target = preg_replace('/\/([^\/]+)\/\.\.\//','/',$target);
|
||||
}
|
||||
return str_replace($str2, $target, $str1);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -9,337 +9,5 @@
|
|||
|
||||
var $widget_path = '';
|
||||
|
||||
/**
|
||||
* @brief 위젯 캐시 처리
|
||||
**/
|
||||
function getCache($widget, $args, $lang_type = null, $ignore_cache = false) {
|
||||
// 지정된 언어가 없으면 현재 언어 지정
|
||||
if(!$lang_type) $lang_type = Context::getLangType();
|
||||
|
||||
// widget, 캐시 번호와 캐시값이 설정되어 있는지 확인
|
||||
$widget_sequence = $args->widget_sequence;
|
||||
$widget_cache = $args->widget_cache;
|
||||
|
||||
// args값에서 urldecode를 해줌
|
||||
$object_vars = get_object_vars($args);
|
||||
if(count($object_vars)) {
|
||||
foreach($object_vars as $key => $val) {
|
||||
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','document_srl'))) continue;
|
||||
$args->{$key} = utf8RawUrlDecode($val);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 캐시 번호와 캐시 값이 아예 없으면 바로 데이터를 추출해서 리턴
|
||||
**/
|
||||
if(!$ignore_cache && (!$widget_cache || !$widget_sequence)) {
|
||||
$oWidget = WidgetHandler::getObject($widget);
|
||||
if(!$oWidget) return;
|
||||
|
||||
return $oWidget->proc($args);
|
||||
}
|
||||
|
||||
/**
|
||||
* 캐시 번호와 캐시값이 설정되어 있으면 캐시 파일을 불러오도록 함
|
||||
**/
|
||||
|
||||
// 캐시 디렉토리가 없으면 생성
|
||||
$cache_path = './files/cache/widget_cache/';
|
||||
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
|
||||
|
||||
// 캐시파일명을 구함
|
||||
$cache_file = sprintf('%s%d.%s.cache', $cache_path, $widget_sequence, $lang_type);
|
||||
|
||||
// 캐시 Lock 파일을 구함
|
||||
$lock_file = sprintf('%s%d.%s.lock', $cache_path, $widget_sequence, $lang_type);
|
||||
|
||||
// 캐시 파일이 존재하면 해당 파일의 유효성 검사 (lock파일이 있을 경우 유효성 검사하지 않음)
|
||||
if(!$ignore_cache && file_exists($cache_file)) {
|
||||
$filemtime = filemtime($cache_file);
|
||||
|
||||
// 수정 시간을 비교해서 캐싱중이어야 하거나 WidgetHandler.class.php 파일보다 나중에 만들어 졌다면 캐시값을 return
|
||||
if(file_exists($lock_file) || ($filemtime + $widget_cache*60 > time() && $filemtime > filemtime('./classes/widget/WidgetHandler.class.php'))) {
|
||||
return FileHandler::readFile($cache_file);
|
||||
}
|
||||
}
|
||||
|
||||
// lock 파일 생성
|
||||
FileHandler::writeFile($lock_file, '');
|
||||
|
||||
// 캐시 파일을 갱신하여야 할 경우 lock파일을 만들고 캐시 생성
|
||||
$oWidget = WidgetHandler::getObject($widget);
|
||||
if(!$oWidget || !method_exists($oWidget,'proc')) return;
|
||||
|
||||
$widget_content = $oWidget->proc($args);
|
||||
FileHandler::writeFile($cache_file, $widget_content);
|
||||
|
||||
// lock 파일 제거
|
||||
FileHandler::removeFile($lock_file);
|
||||
|
||||
return $widget_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯이름과 인자를 받아서 결과를 생성하고 결과 리턴
|
||||
* 태그 사용 templateHandler에서 WidgetHandler::execute()를 실행하는 코드로 대체하게 된다
|
||||
*
|
||||
* $include_info가 true일 경우 페이지 수정시 위젯 핸들링을 위한 코드까지 포함함
|
||||
**/
|
||||
function execute($widget, $args, $include_info = false) {
|
||||
// 디버그를 위한 위젯 실행 시간 저장
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// args값에서 urldecode를 해줌
|
||||
$object_vars = get_object_vars($args);
|
||||
if(count($object_vars)) {
|
||||
foreach($object_vars as $key => $val) {
|
||||
if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue;
|
||||
$args->{$key} = utf8RawUrlDecode($val);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함
|
||||
**/
|
||||
$widget_content = '';
|
||||
if($widget != 'widgetContent' && $widget != 'widgetBox') {
|
||||
if(!is_dir(sprintf('./widgets/%s/',$widget))) return;
|
||||
|
||||
// 위젯의 내용을 담을 변수
|
||||
$widget_content = WidgetHandler::getCache($widget, $args);
|
||||
}
|
||||
if($widget == 'widgetBox'){
|
||||
$widgetbox_content = $args->widgetbox_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* 관리자가 지정한 위젯의 style을 구함
|
||||
**/
|
||||
// 가끔 잘못된 코드인 background-image:url(none)이 들어 있을 수가 있는데 이럴 경우 none에 대한 url을 요청하므로 무조건 제거함
|
||||
$style = preg_replace('/background\-image: url\((.+)(\/?)none\)/is','', $args->style);
|
||||
|
||||
// 내부 여백을 둔 것을 구해서 style문으로 미리 변경해 놓음
|
||||
$widget_padding_left = $args->widget_padding_left;
|
||||
$widget_padding_right = $args->widget_padding_right;
|
||||
$widget_padding_top = $args->widget_padding_top;
|
||||
$widget_padding_bottom = $args->widget_padding_bottom;
|
||||
$inner_style = sprintf("padding:%dpx %dpx %dpx %dpx !important; padding:none !important;", $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
|
||||
|
||||
$oDocumentModel = &getModel('document');
|
||||
|
||||
|
||||
/**
|
||||
* 위젯 출력물을 구함
|
||||
**/
|
||||
|
||||
$widget_content_header = '';
|
||||
$widget_content_body = '';
|
||||
$widget_content_footer = '';
|
||||
|
||||
// 일반 페이지 호출일 경우 지정된 스타일만 꾸면서 바로 return 함
|
||||
if(!$include_info) {
|
||||
if($args->id) $args->id = ' id="'.$args->id.'" ';
|
||||
switch($widget) {
|
||||
// 내용 직접 추가일 경우
|
||||
case 'widgetContent' :
|
||||
if($args->document_srl) {
|
||||
$oDocument = $oDocumentModel->getDocument($args->document_srl);
|
||||
$body = $oDocument->getContent(false,false,false, false);
|
||||
} else {
|
||||
$body = base64_decode($args->body);
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s"><div style="%s">', $args->id, $style, $inner_style);
|
||||
$widget_content_body = $body;
|
||||
$widget_content_footer = '</div></div>';
|
||||
|
||||
break;
|
||||
|
||||
// 위젯 박스일 경우
|
||||
case 'widgetBox' :
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s;"><div style="%s"><div>', $args->id, $style, $inner_style);
|
||||
$widget_content_body = $widgetbox_content;
|
||||
|
||||
break;
|
||||
|
||||
// 일반 위젯일 경우
|
||||
default :
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s">',$args->id,$style);
|
||||
$widget_content_body = sprintf('<div style="*zoom:1;%s">%s</div>', $inner_style,$widget_content);
|
||||
$widget_content_footer = '</div>';
|
||||
break;
|
||||
}
|
||||
|
||||
// 페이지 수정시에 호출되었을 경우 위젯 핸들링을 위한 코드 추가
|
||||
} else {
|
||||
switch($widget) {
|
||||
// 내용 직접 추가일 경우
|
||||
case 'widgetContent' :
|
||||
if($args->document_srl) {
|
||||
$oDocument = $oDocumentModel->getDocument($args->document_srl);
|
||||
$body = $oDocument->getContent(false,false,false);
|
||||
} else {
|
||||
$body = base64_decode($args->body);
|
||||
}
|
||||
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$oWidgetController = &getController('widget');
|
||||
|
||||
$widget_content_header = sprintf(
|
||||
'<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_left="%s" widget_padding_right="%s" widget_padding_top="%s" widget_padding_bottom="%s" widget="widgetContent" document_srl="%d" %s>'.
|
||||
'<div class="widgetResize"></div>'.
|
||||
'<div class="widgetResizeLeft"></div>'.
|
||||
'<div class="widgetBorder">'.
|
||||
'<div style="%s">',$args->widgetstyle,
|
||||
$style,
|
||||
$args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom,
|
||||
$args->document_srl,
|
||||
implode(' ',$attribute),
|
||||
$inner_style);
|
||||
|
||||
$widget_content_body = $body;
|
||||
$widget_content_footer = sprintf('</div><div class="clear"></div>'.
|
||||
'</div>'.
|
||||
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">%s</div>'.
|
||||
'</div>',base64_encode($body));
|
||||
|
||||
break;
|
||||
|
||||
// 위젯 박스일 경우
|
||||
case 'widgetBox' :
|
||||
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf(
|
||||
'<div class="widgetOutput" widgetstyle="%s" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" %s >'.
|
||||
'<div class="widgetBoxResize"></div>'.
|
||||
'<div class="widgetBoxResizeLeft"></div>'.
|
||||
'<div class="widgetBoxBorder"><div class="nullWidget" style="%s">',$args->widgetstyle,$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,implode(' ',$attribute),$inner_style);
|
||||
|
||||
$widget_content_body = $widgetbox_content;
|
||||
|
||||
break;
|
||||
|
||||
// 일반 위젯일 경우
|
||||
default :
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget'))) continue;
|
||||
if(strlen($val)==0) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf('<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
|
||||
'<div class="widgetResize"></div>'.
|
||||
'<div class="widgetResizeLeft"></div>'.
|
||||
'<div class="widgetBorder">',$args->widgetstyle,$style,
|
||||
$widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,
|
||||
$widget, implode(' ',$attribute));
|
||||
|
||||
$widget_content_body = sprintf('<div style="%s">%s</div><div class="clear"></div>',$inner_style, $widget_content);
|
||||
|
||||
$widget_content_footer = '</div></div>';
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 위젯 스타일을 컴파일 한다.
|
||||
if($args->widgetstyle){
|
||||
$widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle,$widget, $widget_content_body, $args, $include_info);
|
||||
}
|
||||
|
||||
$output = $widget_content_header . $widget_content_body . $widget_content_footer;
|
||||
|
||||
// 위젯 결과물 생성 시간을 debug 정보에 추가
|
||||
if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start;
|
||||
// 결과 return
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 객체를 return
|
||||
**/
|
||||
function getObject($widget) {
|
||||
if(!$GLOBALS['_xe_loaded_widgets_'][$widget]) {
|
||||
// 일단 위젯의 위치를 찾음
|
||||
$oWidgetModel = &getModel('widget');
|
||||
$path = $oWidgetModel->getWidgetPath($widget);
|
||||
|
||||
// 위젯 클래스 파일을 찾고 없으면 에러 출력 (html output)
|
||||
$class_file = sprintf('%s%s.class.php', $path, $widget);
|
||||
if(!file_exists($class_file)) return sprintf(Context::getLang('msg_widget_is_not_exists'), $widget);
|
||||
|
||||
// 위젯 클래스를 include
|
||||
require_once($class_file);
|
||||
|
||||
// 객체 생성
|
||||
$eval_str = sprintf('$oWidget = new %s();', $widget);
|
||||
@eval($eval_str);
|
||||
if(!is_object($oWidget)) return sprintf(Context::getLang('msg_widget_object_is_null'), $widget);
|
||||
|
||||
if(!method_exists($oWidget, 'proc')) return sprintf(Context::getLang('msg_widget_proc_is_null'), $widget);
|
||||
|
||||
$oWidget->widget_path = $path;
|
||||
|
||||
$GLOBALS['_xe_loaded_widgets_'][$widget] = $oWidget;
|
||||
}
|
||||
return $GLOBALS['_xe_loaded_widgets_'][$widget];
|
||||
}
|
||||
|
||||
|
||||
function complieWidgetStyle($widgetStyle,$widget,$widget_content_body, $args, $include_info){
|
||||
if(!$widgetStyle) return $widget_content_body;
|
||||
|
||||
$oWidgetModel = &getModel('widget');
|
||||
|
||||
// 위젯 스타일의 extra_var를 가져와 묶는다
|
||||
$widgetstyle_info = $oWidgetModel->getWidgetStyleInfo($widgetStyle);
|
||||
if(!$widgetstyle_info) return $widget_content_body;
|
||||
|
||||
$widgetstyle_extar_var_key = get_object_vars($widgetstyle_info);
|
||||
if(count($widgetstyle_extar_var_key['extra_var'])){
|
||||
foreach($widgetstyle_extar_var_key['extra_var'] as $key => $val){
|
||||
$widgetstyle_extar_var->{$key} = $args->{$key};
|
||||
}
|
||||
}
|
||||
Context::set('widgetstyle_extar_var', $widgetstyle_extar_var);
|
||||
|
||||
if($include_info && $widget=='widgetBox'){
|
||||
Context::set('widget_content', '<div class="widget_inner">'.$widget_content_body.'</div>');
|
||||
}else{
|
||||
Context::set('widget_content', $widget_content_body);
|
||||
}
|
||||
|
||||
// 컴파일
|
||||
$widgetstyle_path = $oWidgetModel->getWidgetStylePath($widgetStyle);
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
$tpl = $oTemplate->compile($widgetstyle_path, 'widgetstyle');
|
||||
|
||||
return $tpl;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -451,6 +451,10 @@
|
|||
case 'minus' :
|
||||
$args = abs($args);
|
||||
$val = sprintf('"%s-%d"', $name, $args);
|
||||
break;
|
||||
case 'multiply' :
|
||||
$args = intval($args);
|
||||
$val = sprintf('"%s*%d"', $name, $args);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ span.button { padding:0; background-position:left top;}
|
|||
span.button, x:-moz-any-link{ font:0/23px Sans-serif; padding:11px 0;} /* Firefox 2 Fix */
|
||||
span.button, x:-moz-any-link, x:default{ padding:0;} /* Firefox 2 Fix */
|
||||
span.button button,
|
||||
span.button input { height:23px; left:2px; /**top:-1px;*/ _top:0; padding:0 10px 0 8px; *padding:0 5px 0 3px; line-height:24px; background-position:right top; cursor:pointer;}
|
||||
span.button input { height:23px; left:2px; *top:-1px; _top:0; padding:0 10px 0 8px; *padding:0 5px 0 3px; line-height:24px; background-position:right top; cursor:pointer;}
|
||||
/* Large Size */
|
||||
span.button.large { background-position:left -30px;}
|
||||
span.button.large, x:-moz-any-link{ font:0/29px Sans-serif; padding:14px 0;} /* Firefox 2 Fix */
|
||||
|
|
|
|||
|
|
@ -193,11 +193,12 @@ jQuery(function($) {
|
|||
// 서버에 메뉴를 요청
|
||||
var params = new Array();
|
||||
params["target_srl"] = target_srl;
|
||||
params["cur_mid"] = current_mid;
|
||||
params["mid"] = params["cur_mid"] = current_mid;
|
||||
params["cur_act"] = current_url.getQuery('act');
|
||||
params["menu_id"] = menu_id;
|
||||
params["page_x"] = evt.pageX;
|
||||
params["page_y"] = evt.pageY;
|
||||
if(typeof(xeVid)!='undefined') params["vid"] = xeVid;
|
||||
|
||||
var response_tags = new Array("error","message","menus");
|
||||
|
||||
|
|
@ -374,6 +375,7 @@ function isDef() {
|
|||
**/
|
||||
var winopen_list = new Array();
|
||||
function winopen(url, target, attribute) {
|
||||
if(typeof(xeVid)!='undefined' && url.indexOf(request_uri)>-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid);
|
||||
try {
|
||||
if(target != "_blank" && winopen_list[target]) {
|
||||
winopen_list[target].close();
|
||||
|
|
@ -395,6 +397,7 @@ function winopen(url, target, attribute) {
|
|||
**/
|
||||
function popopen(url, target) {
|
||||
if(typeof(target) == "undefined") target = "_blank";
|
||||
if(typeof(xeVid)!='undefined' && url.indexOf(request_uri)>-1 && !url.getQuery('vid')) url = url.setQuery('vid',xeVid);
|
||||
winopen(url, target, "left=10,top=10,width=10,height=10,scrollbars=no,resizable=yes,toolbars=no");
|
||||
}
|
||||
|
||||
|
|
@ -502,6 +505,7 @@ function zbxe_folder_close(id) {
|
|||
**/
|
||||
var _popupHeight = 0;
|
||||
function setFixedPopupSize() {
|
||||
var headerObj = jQuery('#popHeader');
|
||||
var bodyObj = jQuery('#popBody');
|
||||
|
||||
if(bodyObj.length) {
|
||||
|
|
@ -510,6 +514,8 @@ function setFixedPopupSize() {
|
|||
}
|
||||
}
|
||||
|
||||
bodyObj.css({paddingRight:30});
|
||||
|
||||
var w = jQuery("#popup_content").width();
|
||||
w = w< 400 ? 400 : w;
|
||||
var h = jQuery("#popup_content").height();
|
||||
|
|
|
|||
4371
common/js/jquery.js
vendored
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
// xml handler을 이용하는 user function
|
||||
var show_waiting_message = true;
|
||||
var _isXmlRequested = false;
|
||||
function exec_xml(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) {
|
||||
var oXml = new xml_handler();
|
||||
oXml.reset();
|
||||
|
|
@ -30,7 +29,6 @@ function exec_xml(module, act, params, callback_func, response_tags, callback_fu
|
|||
function xml_response_filter(oXml, callback_func, response_tags, callback_func_arg, fo_obj) {
|
||||
var text = oXml.getResponseText();
|
||||
if(oXml.objXmlHttp.readyState!=4) return;
|
||||
_isXmlRequested = false;
|
||||
if(text && !/^<response>/i.test(text)) {
|
||||
var waiting_obj = xGetElementById("waitingforserverresponse");
|
||||
if(waiting_obj) waiting_obj.style.visibility = "hidden";
|
||||
|
|
@ -96,8 +94,6 @@ function zGetXmlHttp() {
|
|||
}
|
||||
|
||||
function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags, callback_func_arg, fo_obj) {
|
||||
if(_isXmlRequested) return;
|
||||
_isXmlRequested = true;
|
||||
var rd = "";
|
||||
rd += "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
|
||||
+ "<methodCall>\n"
|
||||
|
|
@ -134,7 +130,6 @@ function xml_handlerRequest(callBackFunc, xmlObj, callBackFunc2, response_tags,
|
|||
this.objXmlHttp.open("POST", this.xml_path, true);
|
||||
} catch(e) {
|
||||
alert(e);
|
||||
_isXmlRequested = false;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -306,7 +306,6 @@ function procFilter(fo_obj, filter_func) {
|
|||
var editor_sequence = fo_obj.getAttribute('editor_sequence');
|
||||
|
||||
if(typeof(editor_sequence)!='undefined' && editor_sequence && typeof(editorRelKeys)!='undefined') {
|
||||
|
||||
if(jQuery.isFunction(editorRelKeys[editor_sequence]['pasteHTML'])){
|
||||
var content = editorGetContent(editor_sequence);
|
||||
editorRelKeys[editor_sequence]['content'].value = content;
|
||||
|
|
@ -320,25 +319,12 @@ function procFilter(fo_obj, filter_func) {
|
|||
var content = xInnerHtml(dummy.firstChild);
|
||||
xInnerHtml(dummy,content);
|
||||
}
|
||||
|
||||
// img/a 태그의 대상에 대해 경로 재설정 (IE브라우저에서 위지윅 에디터내의 경로를 절대 경로로 바꾸는 버그때문ㅇ)
|
||||
var imgTags = xGetElementsByTagName('IMG', dummy);
|
||||
for(var i=0;i<imgTags.length;i++) {
|
||||
if(imgTags[i].src.indexOf(request_uri)!=-1) {
|
||||
imgTags[i].src = imgTags[i].src.replace(/(.*)files\/(.*)/i,'files/$2');
|
||||
}
|
||||
}
|
||||
var aTags = xGetElementsByTagName('A', dummy);
|
||||
for(var i=0;i<aTags.length;i++) {
|
||||
if(aTags[i].href.indexOf(request_uri)!=-1) {
|
||||
aTags[i].href = aTags[i].href.replace(/(.*)\?module=file&(.*)/i,'./?module=file&$2');
|
||||
}
|
||||
}
|
||||
var content = xInnerHtml(dummy);
|
||||
editorRelKeys[editor_sequence]['content'].value = content;
|
||||
}
|
||||
var regxPath = new RegExp('(src|href)=("|\'){1}'+request_uri.replace(/\//g,'\\/')+'([^"\']+)("|\'){1}','g');
|
||||
content = content.replace(regxPath, '$1="./$3"');
|
||||
editorRelKeys[editor_sequence]['content'].value = content;
|
||||
}
|
||||
|
||||
filter_func(fo_obj);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = 'An error has occured';
|
||||
$lang->msg_not_founded = 'Target could not be found';
|
||||
$lang->msg_no_result = 'Nothing found';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = 'You do not have permission to execute requested action';
|
||||
$lang->msg_module_is_not_exists = 'Requested module could not be found';
|
||||
$lang->msg_module_is_not_exists = "Start the module is not enabled.\nSetup the start module on the administrator page.";
|
||||
$lang->msg_module_is_not_standalone = 'Requested module cannot be executed independently';
|
||||
|
||||
$lang->success_registed = 'Registered successfully';
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@
|
|||
$lang->none_image = '이미지 없음';
|
||||
$lang->document_srl = 'Número del documento';
|
||||
$lang->user_id = 'ID de Usuario';
|
||||
$lang->author = 'Autor';
|
||||
$lang->author = 'Autor';
|
||||
$lang->password = 'Contraseña';
|
||||
$lang->password1 = 'Contraseña';
|
||||
$lang->password2 = 'Otra vez la contraseña';
|
||||
|
|
@ -127,7 +127,7 @@
|
|||
$lang->layout = 'Composición';
|
||||
$lang->widget = 'Widget';
|
||||
$lang->module = 'Módulo';
|
||||
$lang->skin = 'Tema'; //máscara,
|
||||
$lang->skin = 'Tema'; //máscara,
|
||||
$lang->colorset = 'Conjunto de Colores';
|
||||
$lang->extra_vars = 'Variables Extra';
|
||||
|
||||
|
|
@ -210,7 +210,7 @@
|
|||
'hours' => '%d días',
|
||||
);
|
||||
|
||||
// Relacionado a la Descripción
|
||||
// Relacionado a la Descripción
|
||||
$lang->about_tag = 'Puede agregar o añadir diversas etiquetas separándolas con la coma(,)'; // revisado hasta aquí (081007: Juan Lee)
|
||||
$lang->about_layout = 'Puede modificar la apariencia(Layout/Diseño) de los módulos. Puede administrarla con el menú Layout.';
|
||||
|
||||
|
|
@ -227,9 +227,11 @@
|
|||
$lang->msg_error_occured = 'Error';
|
||||
$lang->msg_not_founded = 'No se ha encontrado';
|
||||
$lang->msg_no_result = 'Sin resultado';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = 'No está permitodo para ejecutar esta acción';
|
||||
$lang->msg_module_is_not_exists = 'No existe el Módulo requerido';
|
||||
$lang->msg_module_is_not_exists = "Inicie el módulo no está habilitado.\nEl inicio de instalación del módulo en el administrador de la página.";
|
||||
$lang->msg_module_is_not_standalone = 'El Módulo requerido no funciona solo.';
|
||||
|
||||
$lang->success_registed = 'Registrado con éxito';
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@
|
|||
/**
|
||||
* @file common/lang/fr.lang.php
|
||||
* @author zero (zero@nzeo.com) Traduit par Pierre Duvent(PierreDuvent@gamil.com)
|
||||
* @brief Paquet du langage en français
|
||||
* @brief Paquet du langage en français
|
||||
**/
|
||||
|
||||
// verbes et mots fondamentaux qui décrivent des actions
|
||||
// verbes et mots fondamentaux qui décrivent des actions
|
||||
$lang->cmd_write = 'Ecrire';
|
||||
$lang->cmd_reply = 'Répondre';
|
||||
$lang->cmd_delete = 'Supprimer';
|
||||
|
|
@ -44,8 +44,8 @@
|
|||
$lang->cmd_make = 'Créer';
|
||||
$lang->cmd_select = 'Choisir';
|
||||
$lang->cmd_select_all = 'Choisir Tout';
|
||||
$lang->cmd_unselect_all = 'Annuler Tout';
|
||||
$lang->cmd_reverse_all = 'Renverser la Sélection';
|
||||
$lang->cmd_unselect_all = 'Annuler Tout';
|
||||
$lang->cmd_reverse_all = 'Renverser la Sélection';
|
||||
$lang->cmd_close_all = 'Fermer Tout';
|
||||
$lang->cmd_open_all = 'Ouvrir Tout';
|
||||
$lang->cmd_reload = 'Recharger';
|
||||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = 'Une erreur a lieu';
|
||||
$lang->msg_not_founded = 'L\'objet n\'est pas trouvé.';
|
||||
$lang->msg_no_result = 'Nul Résultat';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = 'Vous n\'êtes pas autorisés à exécuter l\'action que vous avez demandé.';
|
||||
$lang->msg_module_is_not_exists = 'Le module demandé n\'a pas été trouvé.';
|
||||
$lang->msg_module_is_not_exists = "Démarrez le module n'est pas activé.\nLe lancement du module d'installation de l'administrateur sur la page.";
|
||||
$lang->msg_module_is_not_standalone = 'Le module demandé ne peut pas être exécuté indépendamment.';
|
||||
|
||||
$lang->success_registed = 'Enregistré avec succès';
|
||||
|
|
|
|||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = 'Ein Fehler ist aufgetreten ';
|
||||
$lang->msg_not_founded = 'Target konnte nicht gefunden werden';
|
||||
$lang->msg_no_result = 'Nichts gefunden';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = 'Sie haben keine Berechtigung zur Ausführung angeforderte Aktion';
|
||||
$lang->msg_module_is_not_exists = 'Gewünschte Modul konnte nicht gefunden werden';
|
||||
$lang->msg_module_is_not_exists ="Starten Sie das Modul nicht aktiviert ist.\nEinstellen der Start-Modul auf der Seite Administrator.";
|
||||
$lang->msg_module_is_not_standalone = 'Gewünschte Modul kann nicht ausgeführt werden unabhängig';
|
||||
|
||||
$lang->success_registed = 'Anmeldungsdatum';
|
||||
|
|
|
|||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = 'エラーが発生しました。';
|
||||
$lang->msg_not_founded = '見つかりません。';
|
||||
$lang->msg_no_result = '検索結果がありません。';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = '現在の操作は実行する権限がありません。';
|
||||
$lang->msg_module_is_not_exists = 'モジュールが見つかりません。';
|
||||
$lang->msg_module_is_not_exists = "モジュールの起動を有効にされていません。\n管理者ページにセットアップを開始するモジュール。";
|
||||
$lang->msg_module_is_not_standalone = 'このモジュールはスタンドアローンでは作動しません。';
|
||||
|
||||
$lang->success_registed = '登録しました。';
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@
|
|||
'hours' => '%d 시간전',
|
||||
);
|
||||
|
||||
// 설명 관련
|
||||
// 설명 관련
|
||||
$lang->about_tag = '태그 입력시 , (쉼표)를 이용하시면 복수 등록이 가능합니다';
|
||||
$lang->about_layout = '레이아웃은 모듈의 껍데기를 꾸며줍니다. 상단 레이아웃 메뉴에서 관리하실 수 있습니다';
|
||||
|
||||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = '오류가 발생하였습니다';
|
||||
$lang->msg_not_founded = '대상을 찾을 수 없습니다';
|
||||
$lang->msg_no_result = '검색 결과가 없습니다';
|
||||
$lang->msg_fail_to_request_open = '요청하신 연결에 실패하였습니다';
|
||||
$lang->msg_invalid_format = '잘못된 형식입니다';
|
||||
|
||||
$lang->msg_not_permitted_act = '요청하신 기능을 실행할 수 있는 권한이 없습니다';
|
||||
$lang->msg_module_is_not_exists = '요청하신 모듈을 찾을 수 없습니다';
|
||||
$lang->msg_module_is_not_exists = "시작 모듈이 설정되어 있지 않습니다.\n관리자 페이지에서 시작 모듈을 설정해주세요";
|
||||
$lang->msg_module_is_not_standalone = '요청하신 모듈은 독립적으로 동작할 수가 없습니다';
|
||||
|
||||
$lang->success_registed = '등록되었습니다';
|
||||
|
|
|
|||
|
|
@ -219,9 +219,11 @@
|
|||
$lang->msg_error_occured = 'Произошла ошибка';
|
||||
$lang->msg_not_founded = 'Сообщение не найдено';
|
||||
$lang->msg_no_result = 'Ничего не найдено';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = 'У Вас нет прав для исполнения запрошенного действия';
|
||||
$lang->msg_module_is_not_exists = 'Запрошенный модуль не найден';
|
||||
$lang->msg_module_is_not_exists = "Запустить модуль не включен.\nУстановка запуска модуля администратор странице.";
|
||||
$lang->msg_module_is_not_standalone = 'Запрошенный модуль не может быть исполнен независимо';
|
||||
|
||||
$lang->success_registed = 'Зарегистрировано успешно';
|
||||
|
|
|
|||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = '发生错误';
|
||||
$lang->msg_not_founded = '没有找到相关内容';
|
||||
$lang->msg_no_result = '找不到和您查询的相符结果';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = '没有权限执行 action命令';
|
||||
$lang->msg_module_is_not_exists = '找不到您查询的模块';
|
||||
$lang->msg_module_is_not_exists = "启动模块没有启用。\n安装启动模块的管理员网页。";
|
||||
$lang->msg_module_is_not_standalone = '您请求的模块不能单独执行';
|
||||
|
||||
$lang->success_registed = '提交成功!';
|
||||
|
|
@ -237,10 +239,10 @@
|
|||
$lang->success_reset = '初始化成功 !';
|
||||
$lang->success_leaved = '注销成功!';
|
||||
$lang->success_saved = '保存成功!';
|
||||
|
||||
|
||||
$lang->fail_to_delete = '删除成功!';
|
||||
$lang->fail_to_move = '移动成功!';
|
||||
|
||||
|
||||
$lang->failed_voted = '您不能推荐!';
|
||||
$lang->failed_blamed = '您不能投反对!';
|
||||
$lang->failed_declared = '您不具备举报权限!';
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@
|
|||
$lang->file = '檔案';
|
||||
|
||||
$lang->mid = '模組名稱';
|
||||
$lang->sid = 'Site Name';
|
||||
$lang->sid = '網站名稱';
|
||||
$lang->layout = '版面';
|
||||
$lang->widget = '控件 ';
|
||||
$lang->module = '模組';
|
||||
|
|
@ -221,9 +221,11 @@
|
|||
$lang->msg_error_occured = '發生錯誤';
|
||||
$lang->msg_not_founded = '找不到相關內容';
|
||||
$lang->msg_no_result = '找不到與您查詢的相符結果';
|
||||
$lang->msg_fail_to_request_open = 'Fail to open your request';
|
||||
$lang->msg_invalid_format = 'Invalid Format';
|
||||
|
||||
$lang->msg_not_permitted_act = '沒有權限執行';
|
||||
$lang->msg_module_is_not_exists = '找不到您查詢的模組';
|
||||
$lang->msg_module_is_not_exists = "啟動模塊沒有啟用。\n安裝啟動模塊的管理員網頁。";
|
||||
$lang->msg_module_is_not_standalone = '您請求的模組不能單獨執行';
|
||||
|
||||
$lang->success_registed = '成功送出!';
|
||||
|
|
|
|||
|
|
@ -64,10 +64,10 @@
|
|||
{Context::getHtmlHeader()}
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<body{Context::getBodyClass()}>
|
||||
{Context::getBodyHeader()}
|
||||
|
||||
{$zbxe_final_content}
|
||||
{$content}
|
||||
|
||||
{Context::getHtmlFooter()}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
* @brief XE의 전체 버전 표기
|
||||
* 이 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 함
|
||||
**/
|
||||
define('__ZBXE_VERSION__', '1.2.1');
|
||||
define('__ZBXE_VERSION__', '1.2.2');
|
||||
|
||||
/**
|
||||
* @brief zbXE가 설치된 장소의 base path를 구함
|
||||
|
|
|
|||
|
|
@ -1,12 +1,16 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<layout version="0.2">
|
||||
<title xml:lang="ko">XE Cafe 공식 레이아웃</title>
|
||||
<title xml:lang="en">XE Cafe Official Layout</title>
|
||||
<title xml:lang="zh-CN">站点模块官方布局</title>
|
||||
<title xml:lang="zh-TW">虛擬網站官網版面</title>
|
||||
<title xml:lang="jp">XE Cafe公式レイアウト</title>
|
||||
<description xml:lang="ko">
|
||||
XE Cafe 공식 레이아웃입니다.
|
||||
</description>
|
||||
<description xml:lang="en">
|
||||
XE Cafe's Official Layout.
|
||||
</description>
|
||||
<description xml:lang="zh-CN">
|
||||
站点模块官方布局。
|
||||
</description>
|
||||
|
|
@ -22,6 +26,7 @@
|
|||
|
||||
<author email_address="webmaster@xpressengine.com" link="http://www.xpressengine.com">
|
||||
<name xml:lang="ko">XpressEngine</name>
|
||||
<name xml:lang="en">XpressEngine</name>
|
||||
<name xml:lang="zh-CN">XpressEngine</name>
|
||||
<name xml:lang="zh-TW">XpressEngine</name>
|
||||
<name xml:lang="jp">XpressEngine</name>
|
||||
|
|
@ -29,26 +34,31 @@
|
|||
<extra_vars>
|
||||
<group>
|
||||
<title xml:lang="ko">기본 설정</title>
|
||||
<title xml:lang="en">Default Setting</title>
|
||||
<title xml:lang="zh-CN">常规选项</title>
|
||||
<title xml:lang="zh-TW">預設</title>
|
||||
<title xml:lang="jp">基本設定</title>
|
||||
<var name="colorset" type="select">
|
||||
<title xml:lang="ko">컬러셋</title>
|
||||
<title xml:lang="en">Colorset</title>
|
||||
<title xml:lang="zh-CN">颜色</title>
|
||||
<title xml:lang="zh-TW">顏色設定</title>
|
||||
<title xml:lang="jp">カラーセット</title>
|
||||
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
|
||||
<description xml:lang="en">Choose colorset</description>
|
||||
<description xml:lang="zh-CN">请选择颜色。</description>
|
||||
<description xml:lang="zh-TW">請選擇顏色。</description>
|
||||
<description xml:lang="jp">カラーセットを選択して下さい。</description>
|
||||
<options value="white">
|
||||
<title xml:lang="ko">하얀색</title>
|
||||
<title xml:lang="en">White</title>
|
||||
<title xml:lang="zh-CN">白色</title>
|
||||
<title xml:lang="zh-TW">白色</title>
|
||||
<title xml:lang="jp">白</title>
|
||||
</options>
|
||||
<options value="black">
|
||||
<title xml:lang="ko">검은색</title>
|
||||
<title xml:lang="en">Black</title>
|
||||
<title xml:lang="zh-CN">黑色</title>
|
||||
<title xml:lang="zh-TW">黑色</title>
|
||||
<title xml:lang="jp">黒</title>
|
||||
|
|
@ -56,77 +66,92 @@
|
|||
</var>
|
||||
<var name="index_url" type="text">
|
||||
<title xml:lang="ko">홈 페이지 URL</title>
|
||||
<title xml:lang="en">Homepage's URL</title>
|
||||
<title xml:lang="zh-CN">站点地址</title>
|
||||
<title xml:lang="zh-TW">主頁網址</title>
|
||||
<title xml:lang="jp">ホームページのURL</title>
|
||||
<description xml:lang="ko">로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요.</description>
|
||||
<description xml:lang="en">Input a destination URL when users click the logo.</description>
|
||||
<description xml:lang="zh-CN">点击LOGO时要移动的页面地址。</description>
|
||||
<description xml:lang="zh-TW">請輸入當用戶按了網站Logo後,要前往的頁面網址。</description>
|
||||
<description xml:lang="jp">ロゴをクリックする際、移動するホームページURLを入力して下さい。</description>
|
||||
</var>
|
||||
<var name="logo_text" type="text">
|
||||
<title xml:lang="ko">로고 글자</title>
|
||||
<title xml:lang="en">Logo text</title>
|
||||
<title xml:lang="zh-CN">站点标题</title>
|
||||
<title xml:lang="zh-TW">Logo文字</title>
|
||||
<title xml:lang="jp">ロゴ用テキスト</title>
|
||||
<description xml:lang="ko">좌측 상단의 로고 부분에 글자를 지정할 수 있습니다. 로고 이미지가 있으면 로고 이미지의 caption으로 표시됩니다.</description>
|
||||
<description xml:lang="en">You can set the Logo text shown in the top-left part of this layout. If there exists Logo image, this text will be a caption of the image.</description>
|
||||
<description xml:lang="zh-CN">将显示在您的站点左侧头部,如你已上传lOGO图片,此标题将变成LOGO图片的caption。</description>
|
||||
<description xml:lang="zh-TW">將顯示在虛擬網站的左上方,如果有上傳過Logo圖片,將會以圖片顯示。</description>
|
||||
<description xml:lang="jp">左上段のロゴ部分に文章を指定します。ロゴイメージがある場合は、ロゴイメージのキャプションとして表示します。</description>
|
||||
<description xml:lang="jp">左上段のロゴ部分に表示する文章を指定します。ロゴイメージがある場合は、ロゴイメージのキャプションとして表示します。</description>
|
||||
</var>
|
||||
<var name="logo_image" type="image">
|
||||
<title xml:lang="ko">로고이미지</title>
|
||||
<title xml:lang="en">Logo image</title>
|
||||
<title xml:lang="zh-CN">LOGO图片</title>
|
||||
<title xml:lang="zh-TW">Logo圖片</title>
|
||||
<title xml:lang="jp">ロゴイメージ</title>
|
||||
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요.</description>
|
||||
<description xml:lang="en">Input Logo image shown in the top part of this layout.</description>
|
||||
<description xml:lang="zh-CN">上传LOGO图片。</description>
|
||||
<description xml:lang="zh-TW">請輸入要顯示在版面上端的Logo圖片。(適當高度為23px的透明圖片。)</description>
|
||||
<description xml:lang="jp">レイアウト上段に表示するロゴイメージを入力して下さい。</description>
|
||||
</var>
|
||||
<var name="logo_background_image" type="image">
|
||||
<title xml:lang="ko">로고 배경 이미지</title>
|
||||
<title xml:lang="en">Logo background image</title>
|
||||
<title xml:lang="zh-CN">布局头部背景图片</title>
|
||||
<title xml:lang="zh-TW">Logo背景圖片</title>
|
||||
<title xml:lang="jp">ロゴ背景イメージ</title>
|
||||
<description xml:lang="ko">로고가 있는 상단 영역의 배경 이미지를 적용하시려면 이미지를 등록해주세요.</description>
|
||||
<description xml:lang="en">You may register a background image of the top area where Logo exists.</description>
|
||||
<description xml:lang="zh-CN">上传LOGO所在位头部背景图片。</description>
|
||||
<description xml:lang="zh-TW">請在這裡上傳想要使用的背景圖片。</description>
|
||||
<description xml:lang="jp">ロゴがある上段領域の背景イメージを登録します。</description>
|
||||
</var>
|
||||
<var name="content_background_image" type="image">
|
||||
<title xml:lang="ko">내용 배경 이미지</title>
|
||||
<title xml:lang="en">Content background image</title>
|
||||
<title xml:lang="zh-CN">内容区背景图片</title>
|
||||
<title xml:lang="zh-TW">內容背景圖片</title>
|
||||
<title xml:lang="jp">内容の背景イメージ</title>
|
||||
<title xml:lang="jp">コンテンツの背景イメージ</title>
|
||||
<description xml:lang="ko">내용이 있는 영역의 배경 이미지를 사용하시려면 이미지를 등록해주세요.</description>
|
||||
<description xml:lang="en">You may register a background image the area where content would be placed.</description>
|
||||
<description xml:lang="zh-CN">上传内容区背景图片。</description>
|
||||
<description xml:lang="zh-TW">請在這裡上傳想要使用的背景圖片。</description>
|
||||
<description xml:lang="jp">内容がある領域の背景イメージを使う場合、イメージを登録して下さい。</description>
|
||||
<description xml:lang="jp">コンテンツがある領域の背景イメージを登録して下さい。</description>
|
||||
</var>
|
||||
</group>
|
||||
<group>
|
||||
<title xml:lang="ko">모양 설정</title>
|
||||
<title xml:lang="en">Style Setting</title>
|
||||
<title xml:lang="zh-CN">样式设置</title>
|
||||
<title xml:lang="zh-TW">外觀設定</title>
|
||||
<title xml:lang="jp">外観設定</title>
|
||||
<title xml:lang="jp">レイアウト設定</title>
|
||||
<var name="content_position" type="select">
|
||||
<title xml:lang="ko">본문 위치</title>
|
||||
<title xml:lang="en">Content position</title>
|
||||
<title xml:lang="zh-CN">内容区位置</title>
|
||||
<title xml:lang="zh-TW">選擇位置</title>
|
||||
<title xml:lang="jp">本文位置</title>
|
||||
<description xml:lang="ko">본문의 위치를 좌/우중 선택할 수 있습니다.</description>
|
||||
<description xml:lang="en">You can choose the position of content between left and right.</description>
|
||||
<description xml:lang="zh-CN">可以设置内容区的位置(左侧/右侧)。</description>
|
||||
<description xml:lang="zh-TW">內容區域可選擇靠左側或右側。</description>
|
||||
<description xml:lang="jp">本文の位置を左/右の中、選択します。</description>
|
||||
<options value="left">
|
||||
<title xml:lang="ko">왼쪽</title>
|
||||
<title xml:lang="en">Left</title>
|
||||
<title xml:lang="zh-CN">左侧</title>
|
||||
<title xml:lang="zh-TW">左側</title>
|
||||
<title xml:lang="jp">左側</title>
|
||||
</options>
|
||||
<options value="right">
|
||||
<title xml:lang="ko">오른쪽</title>
|
||||
<title xml:lang="en">Right</title>
|
||||
<title xml:lang="zh-CN">右侧</title>
|
||||
<title xml:lang="zh-TW">右側</title>
|
||||
<title xml:lang="jp">右側</title>
|
||||
|
|
@ -139,6 +164,7 @@
|
|||
<menus>
|
||||
<menu name="main_menu" maxdepth="5" default="true">
|
||||
<title xml:lang="ko">메인 메뉴</title>
|
||||
<title xml:lang="en">Main Menu</title>
|
||||
<title xml:lang="zh-CN">主菜单</title>
|
||||
<title xml:lang="zh-TW">主選單</title>
|
||||
<title xml:lang="jp">メインメニュー</title>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
<?php
|
||||
$lang->new_members = '新会員のお知らせ';
|
||||
$lang->document_ranking = 'ゲシゲウルランキング';
|
||||
/**
|
||||
* @file layouts/cafeXE/lang/jp.lang.php
|
||||
* @author 翻訳:ミニミ
|
||||
* @brief 日本語言語パッケージ(基本的な内容のみ)
|
||||
**/
|
||||
|
||||
$lang->new_members = '新規会員のお知らせ';
|
||||
$lang->document_ranking = '書き込みランキング';
|
||||
$lang->comment_ranking = 'コメント数ランキング';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
|
||||
<form action="{getUrl()}" method="post" class="widgetSearch">
|
||||
<fieldset>
|
||||
<input type="hidden" name="vid" value="{$vid}" />
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="act" value="IS" />
|
||||
<input type="hidden" name="search_target" value="title" />
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@
|
|||
<title xml:lang="ru">Colorset</title>
|
||||
<title xml:lang="zh-TW">顏色設定</title>
|
||||
<description xml:lang="ko">원하시는 컬러셋을 선택해주세요.</description>
|
||||
<description xml:lang="jp">希望するカラーセットを選択して下さい。</description>
|
||||
<description xml:lang="jp">カラーセットを選択して下さい。</description>
|
||||
<description xml:lang="zh-CN">请选择颜色。</description>
|
||||
<description xml:lang="en">Please select a colorset you want.</description>
|
||||
<description xml:lang="ge">Bitte wählen Sie ein colorset Sie wollen.</description>
|
||||
|
|
@ -83,7 +83,7 @@
|
|||
<description xml:lang="zh-TW">請選擇顏色。</description>
|
||||
<options value="blue">
|
||||
<title xml:lang="ko">파란색 (기본)</title>
|
||||
<title xml:lang="jp">青 (default)</title>
|
||||
<title xml:lang="jp">青 (デフォールト)</title>
|
||||
<title xml:lang="zh-CN">蓝色 (default)</title>
|
||||
<title xml:lang="en">Blue (default)</title>
|
||||
<title xml:lang="ge">Blue (Standard)</title>
|
||||
|
|
@ -93,7 +93,7 @@
|
|||
</options>
|
||||
<options value="gray">
|
||||
<title xml:lang="ko">회색</title>
|
||||
<title xml:lang="jp">灰色背景</title>
|
||||
<title xml:lang="jp">灰色</title>
|
||||
<title xml:lang="zh-CN">灰色背景</title>
|
||||
<title xml:lang="en">Gray</title>
|
||||
<title xml:lang="ge">Gray</title>
|
||||
|
|
@ -103,7 +103,7 @@
|
|||
</options>
|
||||
<options value="orange">
|
||||
<title xml:lang="ko">오렌지</title>
|
||||
<title xml:lang="jp">Orange</title>
|
||||
<title xml:lang="jp">オレンジ</title>
|
||||
<title xml:lang="zh-CN">Orange</title>
|
||||
<title xml:lang="en">Orange</title>
|
||||
<title xml:lang="ge">Orange</title>
|
||||
|
|
@ -113,7 +113,7 @@
|
|||
</options>
|
||||
<options value="violet">
|
||||
<title xml:lang="ko">보라색</title>
|
||||
<title xml:lang="jp">Violet</title>
|
||||
<title xml:lang="jp">紫</title>
|
||||
<title xml:lang="zh-CN">Violet</title>
|
||||
<title xml:lang="en">Violet</title>
|
||||
<title xml:lang="ge">Violett</title>
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@
|
|||
<fieldset>
|
||||
<legend>{$lang->cmd_search}</legend>
|
||||
|
||||
<input type="hidden" name="vid" value="{$vid}" />
|
||||
<input type="hidden" name="mid" value="{$layout_info->target_mid}" />
|
||||
<input type="hidden" name="search_target" value="title_content" />
|
||||
<input name="search_keyword" type="text" class="inputTypeText w110" value="<!--@if($search_keyword)-->{htmlspecialchars($search_keyword)}<!--@end-->" />
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<layout version="0.2">
|
||||
<title xml:lang="ko">XE 공식 사이트 레이아웃</title>
|
||||
<title xml:lang="jp">XE公式レイアウト</title>
|
||||
<title xml:lang="jp">XE公式サイトレイアウト</title>
|
||||
<title xml:lang="en">XE Official website layout</title>
|
||||
<title xml:lang="ge">XE Offizielle Website-Layout</title>
|
||||
<title xml:lang="ru">XE Официальный сайт макет</title>
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
</ul>
|
||||
|
||||
<form action="{getUrl()}" method="post" id="isSearch">
|
||||
<input type="hidden" name="vid" value="{$vid}" />
|
||||
<input type="hidden" name="mid" value="{$mid}" />
|
||||
<input type="hidden" name="act" value="IS" />
|
||||
<input type="hidden" name="search_target" value="title_content" />
|
||||
|
|
|
|||
|
|
@ -56,7 +56,6 @@
|
|||
$module_categories = $oModuleModel->getModuleCategories();
|
||||
|
||||
foreach($mid_list as $module_srl => $module) {
|
||||
$module->browser_title = $oModuleAdminModel->getLangCode($module->site_srl, $module->browser_title);
|
||||
$module_categories[$module->module_category_srl]->list[$module_srl] = $module;
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
<description xml:lang="en">This module is for maintaining addons which can toggle use and disuse states.</description>
|
||||
<description xml:lang="es">Este Módulo es para agregar Addons, como también el manejo de ellos.</description>
|
||||
<description xml:lang="zh-CN">登录插件或设置启用/禁用插件的管理模块。</description>
|
||||
<description xml:lang="jp">アドオンの「登録、使用、未使用」などを設定する管理モジュールです。</description>
|
||||
<description xml:lang="jp">アドオンの「登録、使用・未使用」などを設定する管理モジュールです。</description>
|
||||
<description xml:lang="fr">Ce module est pour les Additions de maintien qui peuvent basculer des états d'utilisation et de désuétude. </description>
|
||||
<description xml:lang="ru">Этот модуль служит для управления аддонами, использование которых Вы можете включать и выключать.</description>
|
||||
<description xml:lang="zh-TW">設定附加元件「登錄、啟用、禁用」的管理模組。</description>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
$lang->addon = 'アドオン';
|
||||
|
||||
$lang->addon_info = 'アドオン情報';
|
||||
$lang->addon_maker = 'アドオン作者';
|
||||
$lang->addon_maker = 'アドオン制作者';
|
||||
$lang->addon_license = 'ライセンス';
|
||||
$lang->addon_history = '変更内容';
|
||||
|
||||
|
|
|
|||
|
|
@ -74,6 +74,7 @@
|
|||
Context::set('use_rewrite', $db_info->use_rewrite=='Y'?'Y':'N');
|
||||
Context::set('use_optimizer', $db_info->use_optimizer!='N'?'Y':'N');
|
||||
Context::set('qmail_compatibility', $db_info->qmail_compatibility=='Y'?'Y':'N');
|
||||
Context::set('use_db_session', $db_info->use_db_session=='N'?'N':'Y');
|
||||
Context::set('use_ssl', $db_info->use_ssl?$db_info->use_ssl:"none");
|
||||
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);
|
||||
|
|
@ -238,11 +239,14 @@
|
|||
$output = executeQuery("admin.getCommentDeclaredCount", $args);
|
||||
$status->commentDeclared->total = $output->data->count;
|
||||
|
||||
$site_args->site_srl = 0;
|
||||
$output = executeQuery('module.getSiteInfo', $site_args);
|
||||
Context::set('start_module', $output->data);
|
||||
|
||||
Context::set('status', $status);
|
||||
|
||||
Context::set('layout','none');
|
||||
$this->setTemplateFile('index');
|
||||
//$this->setTemplateFile('a');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -261,8 +265,23 @@
|
|||
|
||||
Context::set('ftp_info', Context::getFTPInfo());
|
||||
|
||||
$oModuleModel = &getModel('module');
|
||||
$site_args->site_srl = 0;
|
||||
$list = $oModuleModel->getMidList($site_args);
|
||||
$mid_list = array();
|
||||
if(count($list)) {
|
||||
foreach($list as $key => $val) {
|
||||
$mid_list[$val->module][$key] = $val;
|
||||
}
|
||||
}
|
||||
Context::set('mid_list', $mid_list);
|
||||
|
||||
$site_args->site_srl = 0;
|
||||
$output = executeQuery('module.getSiteInfo', $site_args);
|
||||
Context::set('start_module', $output->data);
|
||||
|
||||
Context::set('layout','none');
|
||||
$this->setTemplateFile('config');
|
||||
}
|
||||
}
|
||||
?>
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = 'Administrator Info';
|
||||
$lang->admin_index = 'Index Admin Page';
|
||||
$lang->control_panel = 'Control panel';
|
||||
$lang->start_module = 'Start Module';
|
||||
$lang->about_start_module = 'You can specify start module by default.';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => 'Service Setting',
|
||||
|
|
@ -74,4 +76,6 @@
|
|||
$lang->about_use_ssl = "If you choose 'optional', SSL will be used for actions such as sign up / changing information. And for 'always', your site will be served only via https.";
|
||||
$lang->server_ports = "Server port";
|
||||
$lang->about_server_ports = "If your web-server uses other than 80 for HTTP, 443 for HTTPS, you should specify server ports";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = 'Administrador de Información';
|
||||
$lang->admin_index = 'Índice de la página admin';
|
||||
$lang->control_panel = 'Control panel';
|
||||
$lang->start_module = 'Módulo de inicio';
|
||||
$lang->about_start_module = 'Puede especificar el módulo de inicio por defecto.';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => 'Service Setting',
|
||||
|
|
@ -76,4 +78,6 @@
|
|||
$lang->about_use_ssl = "Opcionalmente, la composición de suscripción / editar la información y el uso de SSL especificada en la acción es siempre el uso de SSL para todos los servicios que se utilizarán";
|
||||
$lang->server_ports = "Especifique el puerto del servidor";
|
||||
$lang->about_server_ports = "80 de HTTP, HTTPS al puerto 443 si se utiliza otro que se especifique lo contrario, el puerto va a necesitar.";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = 'Informations d\'Administrateur';
|
||||
$lang->admin_index = 'Page de l\'indice pour l\'Administrateur';
|
||||
$lang->control_panel = 'Control panel';
|
||||
$lang->start_module = 'Start Module';
|
||||
$lang->about_start_module = 'Vous pouvez spécifier début module par défaut.';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => 'Service Setting',
|
||||
|
|
@ -75,4 +77,6 @@
|
|||
$lang->about_use_ssl = "Si l'on choisit 'Optionnel' , on utilise protocole SSL seulement dans quelques services comme inscription ou modification. Si l'on choisit 'Toujours', on utilise protocole SSL dans tous les services.";
|
||||
$lang->server_ports = "déclarer le port de serveur";
|
||||
$lang->about_server_ports = "Si l'on ne veut pas utiliser le port 80 pour HTTP mais un autre port, ou bien, si l'on ne veut pas utiliser le port 443 pour HTTPS mais un autre port, on doit déclarer les ports.";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = '管理者情報';
|
||||
$lang->admin_index = '管理者トップページ';
|
||||
$lang->control_panel = 'コントロールパネル';
|
||||
$lang->start_module = 'モジュールを起動します';
|
||||
$lang->about_start_module = 'デフォルトで起動するモジュールを指定することができます。';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => 'サービス管理',
|
||||
|
|
@ -26,7 +28,7 @@
|
|||
|
||||
$lang->env_setup = "環境設定";
|
||||
$lang->default_url = '基本URL';
|
||||
$lang->about_sso_url = "複数のvirtual siteを運営する場合、どちらからログインしてもvirtual siteの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)";
|
||||
$lang->about_sso_url = "複数のバーチャル(Virtual)サイトを運営する場合、どちらからログインしてもバーチャル(Virtual)サイトの間でログイン情報を維持出来るようにするためには、基本になるサイトでのXEをインストールしたurlを登録して下さい。 (例: http://ドメイン/インストールパス)";
|
||||
|
||||
|
||||
$lang->env_information = "環境情報";
|
||||
|
|
@ -75,4 +77,6 @@
|
|||
$lang->about_use_ssl = "「部分的に使う場合」は「会員登録/会員情報変更」など特定のactionでSSLを利用する場合、「常に使う」は全てのサービスがSSLを使う場合に選択します。";
|
||||
$lang->server_ports = "サーバーポート指定";
|
||||
$lang->about_server_ports = "一般的に使われているHTTPの80、HTTPSの443以外の他のポートを使うために、ポートを指定して下さい。";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = '관리자 정보';
|
||||
$lang->admin_index = '관리자 초기 페이지';
|
||||
$lang->control_panel = '제어판';
|
||||
$lang->start_module = '시작 모듈';
|
||||
$lang->about_start_module = '사이트 접속시 기본으로 호출될 모듈을 지정할 수 있습니다.';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => '서비스 관리',
|
||||
|
|
@ -75,4 +77,6 @@
|
|||
$lang->about_use_ssl = '선택적으로에서는 회원가입/정보수정등의 지정된 action에서 SSL을 사용하고 항상 사용은 모든 서비스가 SSL을 이용하게 됩니다.';
|
||||
$lang->server_ports = '서버포트지정';
|
||||
$lang->about_server_ports = 'HTTP는 80, HTTPS는 443이외의 다른 포트를 사용하는 경우에 포트를 지정해주어야합니다.';
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = 'Информация администратора';
|
||||
$lang->admin_index = 'Индексная страница администратора';
|
||||
$lang->control_panel = 'Control panel';
|
||||
$lang->start_module = 'Начало модуля';
|
||||
$lang->about_start_module = 'Вы можете указать модуль запуска по умолчанию.';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => 'Service Setting',
|
||||
|
|
@ -75,4 +77,6 @@
|
|||
$lang->about_use_ssl = "선택적으로에서는 회원가입/정보수정등의 지정된 action에서 SSL을 사용하고 항상 사용은 모든 서비스가 SSL을 이용하게 됩니다.";
|
||||
$lang->server_ports = "서버포트지정";
|
||||
$lang->about_server_ports = "HTTP는 80, HTTPS는 443이외의 다른 포트를 사용하는 경우에 포트를 지정해주어야합니다.";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = '管理员信息';
|
||||
$lang->admin_index = '管理首页';
|
||||
$lang->control_panel = '控制面板';
|
||||
$lang->start_module = '启动模块';
|
||||
$lang->about_start_module = '您可以指定默认的启动模块。';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => '应用管理',
|
||||
|
|
@ -75,4 +77,6 @@
|
|||
$lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中,使用选项应用于所有服务。";
|
||||
$lang->server_ports = "指定服务器端口";
|
||||
$lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@
|
|||
$lang->admin_info = '管理員資訊';
|
||||
$lang->admin_index = '管理頁面';
|
||||
$lang->control_panel = '控制介面';
|
||||
$lang->start_module = '啟動模塊';
|
||||
$lang->about_start_module = '您可以指定默認的啟動模塊。';
|
||||
|
||||
$lang->module_category_title = array(
|
||||
'service' => '服務設定',
|
||||
|
|
@ -75,4 +77,6 @@
|
|||
$lang->about_use_ssl = "當會員登入或修改資料等動作時,可選擇是否使用SSL功能。";
|
||||
$lang->server_ports = "主機埠口";
|
||||
$lang->about_server_ports = "HTTP預設埠口是『80』、HTTPS是『443』,如果想使用其他的埠口的話,請自行設定。";
|
||||
$lang->use_db_session = '인증 세션 DB 사용';
|
||||
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
</div>
|
||||
<hr />
|
||||
<div class="footer">
|
||||
<address><a href="http://www.zeroboard.com" onclick="window.open(this.href);return false;">Powered by <strong>X</strong>press <strong>E</strong>ngine</a></address>
|
||||
<address><a href="http://www.xpressengine.com" onclick="window.open(this.href);return false;">Powered by <strong>X</strong>press <strong>E</strong>ngine</a></address>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -32,6 +32,20 @@
|
|||
<p>{$lang->about_default_url}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->start_module}</div></th>
|
||||
<td>
|
||||
<select name="index_module_srl" class="w200">
|
||||
<!--@foreach($mid_list as $key => $val)-->
|
||||
<option value="" disabled="disabled">{$key}</option>
|
||||
<!--@foreach($val as $k => $v)-->
|
||||
<option value="{$v->module_srl}" <!--@if($start_module->index_module_srl==$v->module_srl)-->selected="selected"<!--@end-->> {$v->mid} ({$v->browser_title})</option>
|
||||
<!--@end-->
|
||||
<!--@endforeach-->
|
||||
</select>
|
||||
<p>{$lang->about_start_module}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->use_optimizer}</div></th>
|
||||
<td>
|
||||
|
|
@ -68,6 +82,13 @@
|
|||
<p>{$lang->about_qmail_compatibility}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->use_db_session}</div></th>
|
||||
<td>
|
||||
<input type="checkbox" name="use_db_session" value="Y" <!--@if($use_db_session=='Y')-->checked="checked"<!--@end--> />
|
||||
<p>{$lang->about_db_session}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->use_ssl}</div></th>
|
||||
<td>
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@
|
|||
.boxModelControler .buttonArea{ padding:15px 0 0 0; text-align:center;}
|
||||
|
||||
#popup_content { border:2px solid #777; margin:0; font-size:12px; background:#fff; position:relative;}
|
||||
#popup_content .xButton { position:absolute; top:9px; right:9px; width:15px; height:14px; background-color:transparent; background:url(../img/buttonClose.gif) no-repeat; border:0; cursor:pointer; overflow:hidden; }
|
||||
#popup_content .xButton { position:absolute; top:9px; right:18px; width:15px; height:14px; background-color:transparent; background:url(../img/buttonClose.gif) no-repeat; border:0; cursor:pointer; overflow:hidden; }
|
||||
#popup_content .xButton span { position:relative; z-index:-1; visibility:hidden; }
|
||||
#popup_content * { font-size:12px; }
|
||||
#popHeadder h4.xeAdmin, #popHeadder h1.xeAdmin, #popHeadder h3.xeAdmin { font-size:14px !important; font-family:Dotum !important; background:#f4f4f4 !important; padding:8px 30px 8px 15px !important; letter-spacing:-1px !important; border:none !important; margin:0 !important;}
|
||||
|
|
|
|||
|
|
@ -158,13 +158,21 @@
|
|||
<tbody>
|
||||
<tr>
|
||||
<th><div>{$lang->current_version}</div></th>
|
||||
<td>
|
||||
<td class="wide">
|
||||
<strong>{$current_version}</strong><!--@if($current_version == $released_version)--> [<a href="{$download_link}" onclick="window.open(this.href);return false;">{$lang->cmd_view}</a>]<!--@end-->
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->current_path}</div></th>
|
||||
<td>{$installed_path}/</td>
|
||||
<th colspan="2"><div>{$lang->current_path}</div></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">{$installed_path}/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="2"><div>{$lang->start_module}</div></th>
|
||||
</tr>
|
||||
<Tr>
|
||||
<td colspan="2"><a href="{getSiteUrl('','','mid',$start_module->mid)}" onclick="window.open(this.href);return false;">{$start_module->browser_title}</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->time_zone}</div></th>
|
||||
|
|
@ -186,6 +194,10 @@
|
|||
<th><div>{$lang->qmail_compatibility}</div></th>
|
||||
<td><!--@if($qmail_compatibility=='Y')-->{$lang->use}<!--@else-->{$lang->notuse}<!--@end--></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><div>{$lang->use_db_session}</div></th>
|
||||
<td><!--@if($use_db_session =='Y')-->{$lang->use}<!--@else-->{$lang->notuse}<!--@end--></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
|
|
|||
|
|
@ -33,26 +33,21 @@
|
|||
|
||||
// 기본 모듈을 찾음
|
||||
$oModuleModel = &getModel('module');
|
||||
$module_info = $oModuleModel->getDefaultMid();
|
||||
|
||||
// 기본 모듈이 없으면 새로 등록
|
||||
if(!$module_info->module_srl) {
|
||||
$site_args->site_srl = 0;
|
||||
$mid_list = $oModuleModel->getMidList($site_args);
|
||||
if(!count($mid_list)) {
|
||||
$args->mid = 'board';
|
||||
$args->module = 'board';
|
||||
$args->browser_title = 'test module';
|
||||
$args->is_default = 'Y';
|
||||
$args->skin = 'xe_default';
|
||||
$args->site_srl = 0;
|
||||
|
||||
// board 라는 이름의 모듈이 있는지 확인
|
||||
$module_info = $oModuleModel->getModuleInfoByMid($args->board_name);
|
||||
if($module_info->module_srl) {
|
||||
$args->module_srl = $module_info->module_srl;
|
||||
$oModuleController->updateModule($args);
|
||||
} else {
|
||||
$args->module_srl = 0;
|
||||
$oModuleController->insertModule($args);
|
||||
}
|
||||
$output = $oModuleController->insertModule($args);
|
||||
$module_srl = $output->get('module_srl');
|
||||
|
||||
$site_args->site_srl = 0;
|
||||
$site_args->index_module_srl = $module_srl;
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->updateSite($site_args);
|
||||
}
|
||||
|
||||
return new Object();
|
||||
|
|
|
|||
|
|
@ -92,8 +92,8 @@
|
|||
$obj->member_srl = -1*$logged_info->member_srl;
|
||||
$obj->email_address = $obj->homepage = $obj->user_id = '';
|
||||
$obj->user_name = $obj->nick_name = 'anonymous';
|
||||
$output = executeQuery('document.updateDocument', $obj);
|
||||
if(!$output->toBool()) return $output;
|
||||
$anonymous_output = executeQuery('document.updateDocument', $obj);
|
||||
if(!$anonymous_output->toBool()) return $output;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
67
modules/board/board.smartphone.php
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
/**
|
||||
* @class boardWAP
|
||||
* @author haneul0318 (haneul0318@gmail.com)
|
||||
* @brief board 모듈의 IPhone class
|
||||
**/
|
||||
|
||||
class boardSPhone extends board {
|
||||
function procSmartPhone(&$oIPhone)
|
||||
{
|
||||
if(!$this->grant->list || $this->module_info->consultation == 'Y') return $oIPhone->setContent(Context::getLang('msg_not_permitted'));
|
||||
$act = Context::get('act');
|
||||
if(method_exists($this, $act))
|
||||
{
|
||||
$this->{$act}();
|
||||
}
|
||||
else
|
||||
{
|
||||
$document_srl = Context::get('document_srl');
|
||||
if($document_srl)
|
||||
return $this->dispContent($document_srl);
|
||||
else
|
||||
return $this->dispList();
|
||||
}
|
||||
}
|
||||
|
||||
function dispContent($document_srl)
|
||||
{
|
||||
$oDocumentModel = &getModel('document');
|
||||
$oDocument = $oDocumentModel->getDocument($document_srl);
|
||||
if($oDocument->isExists()) {
|
||||
// 권한 확인
|
||||
if(!$this->grant->view) return Context::getLang('msg_not_permitted');
|
||||
|
||||
Context::setBrowserTitle($oDocument->getTitleText());
|
||||
Context::set('oDocument', $oDocument);
|
||||
$oTemplate = new TemplateHandler();
|
||||
$content = $oTemplate->compile($this->module_path.'tpl/smartphone', "view_document");
|
||||
return $content;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->dispList();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function dispList()
|
||||
{
|
||||
if(!$this->grant->list || $this->module_info->consultation == 'Y') return Context::getLang('msg_not_permitted');
|
||||
$oDocumentModel = &getModel('document');
|
||||
$args->module_srl = $this->module_srl;
|
||||
$args->page = Context::get('page');;
|
||||
$args->list_count = 8;
|
||||
$args->sort_index = $this->module_info->order_target?$this->module_info->order_target:'list_order';
|
||||
$args->order_type = $this->module_info->order_type?$this->module_info->order_type:'asc';
|
||||
$output = $oDocumentModel->getDocumentList($args, $this->except_notice);
|
||||
$document_list = $output->data;
|
||||
Context::set('document_list', $document_list);
|
||||
$page_navigation = $output->page_navigation;
|
||||
Context::set('page_navigation',$page_navigation);
|
||||
$oTemplate = new TemplateHandler();
|
||||
$content = $oTemplate->compile($this->module_path.'tpl/smartphone', "list");
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
@ -36,7 +36,7 @@
|
|||
* 스킨이 존재하지 않는다면 xe_board로 변경
|
||||
**/
|
||||
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
|
||||
if(!is_dir($template_path)) {
|
||||
if(!is_dir($template_path)||!$this->module_info->skin) {
|
||||
$this->module_info->skin = 'xe_board';
|
||||
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@
|
|||
<action name="dispBoardAdminBoardInfo" type="view" standalone="true" />
|
||||
<action name="dispBoardAdminExtraVars" type="view" standalone="true" />
|
||||
<action name="dispBoardAdminBoardAdditionSetup" type="view" standalone="true" />
|
||||
<action name="dispBoardAdminInsertBoard" type="view" standalone="true" />
|
||||
<action name="dispBoardAdminInsertBoard" type="view" standalone="true" setup_index="true" />
|
||||
<action name="dispBoardAdminDeleteBoard" type="view" standalone="true" />
|
||||
<action name="dispBoardAdminSkinInfo" type="view" standalone="true" />
|
||||
<action name="dispBoardAdminGrantInfo" type="view" standalone="true" />
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
$lang->board = 'Board';
|
||||
|
||||
$lang->except_notice = 'Exclude Notices';
|
||||
$lang->use_anonymous = '익명 사용';
|
||||
$lang->use_anonymous = 'Use Anonymous';
|
||||
|
||||
$lang->cmd_manage_menu = 'Manage Menus';
|
||||
$lang->list_target_item = 'Target Item';
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
$lang->search_result = 'Search Result';
|
||||
$lang->consultation = 'Consultation';
|
||||
$lang->secret = 'Secret';
|
||||
$lang->thisissecret = '비밀글입니다.';
|
||||
$lang->thisissecret = 'This is a secret article.';
|
||||
$lang->admin_mail = "Administrator's Mail";
|
||||
|
||||
// words used in button
|
||||
|
|
@ -31,12 +31,12 @@
|
|||
$lang->about_layout_setup = 'You can manually modify board layout code. Insert or manage the widget code anywhere you want';
|
||||
$lang->about_board_category = 'You can make board categories.<br />When board category is broken, try rebuilding the cache file manually.';
|
||||
$lang->about_except_notice = 'Notice articles will not be displayed on normal list.';
|
||||
$lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다';
|
||||
$lang->about_use_anonymous = 'Make a board into anonymous board by hiding the author\'s information.';
|
||||
$lang->about_board = 'This module is for creating and managing boards.';
|
||||
$lang->about_consultation = "Non-administrator members would see their own articles.\nNon-members would not be able to write articles when using consultation.";
|
||||
$lang->about_secret = 'Users will be able to write secret articles or comments.';
|
||||
$lang->about_admin_mail = 'A mail will be sent when an article or comment is submitted.<br />Multiple mails can be sent with commas(,).';
|
||||
$lang->about_list_config = '게시판의 목록형식 사용시 원하는 항목들로 배치를 할 수 있습니다.<br />단 스킨에서 지원하지 않는 경우 지원되지 않을 수 있습니다<br />대상항목/ 표시항목의 항목을 더블클릭하면 추가/ 제거가 됩니다.';
|
||||
$lang->about_list_config = 'If using list-style skin, you may arrange items to display.<br />However, this feature might not be availble for non-official skins.<br />If you double-click target items and display items, then you can add / remove them';
|
||||
|
||||
$lang->msg_not_enough_point = 'Your point is not enough to write an article in this board.';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -26,16 +26,16 @@
|
|||
$lang->cmd_view_info = '討論板資料';
|
||||
$lang->cmd_list_setting = '列表設定';
|
||||
|
||||
// 訊息、提示..
|
||||
// 其他
|
||||
$lang->about_layout_setup = '可直接編輯部落格版面設計原始碼。可把控件原始碼插入到您喜歡的位置。';
|
||||
$lang->about_board_category = '可以新增/刪除分類項目<br />分類有異常情況時,可以嘗試重新建立暫存檔。';
|
||||
$lang->about_except_notice = '設置公告列表項目,不再重複顯示到普通列表當中。';
|
||||
$lang->about_use_anonymous = '글쓴이의 정보를 없애고 익명으로 게시판 사용을 할 수 있게 합니다. 스킨설정에서 글쓰인 정보등을 보이지 않도록 하시면 더욱 유용합니다';
|
||||
$lang->about_use_anonymous = '討論板可使用匿名功能。可在面板設定中設置隱藏作者的資料。';
|
||||
$lang->about_board = '可建立及管理討論板的模組。';
|
||||
$lang->about_consultation = "咨詢功能是指除有管理權限的會員以外,其他會員只能瀏覽自己發表的主題。\n使用咨詢功能時系統將自動禁止非會員的發表主題權限。";
|
||||
$lang->about_secret = '可用於討論板或回覆時選擇是否使用。';
|
||||
$lang->about_admin_mail = '有新的主題或評論時,將自動發電子郵件來通知管理員。<br />多數電子郵件由逗號(,)區隔。';
|
||||
$lang->about_list_config = '可以放置想要的項目種類。<br />當所使用的面板支援此功能時才可會正常實現。<br />對目標項目/顯示項目中的物件案兩下可新增或移除。';
|
||||
$lang->about_list_config = '可以放置想要的項目種類。<br />當所使用的面板支援此功能時才會正常實現。<br />對目標項目/顯示項目中的物件按兩下可新增或移除。';
|
||||
|
||||
$lang->msg_not_enough_point = '你的點數不夠在此討論板發表主題。';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -3,7 +3,13 @@
|
|||
.viewDocument { color:#888; }
|
||||
|
||||
/* board Title */
|
||||
.boardHeader h3 { margin:0; border-bottom:3px solid #fe3614; }
|
||||
.boardHeader h1,
|
||||
.boardHeader h2,
|
||||
.boardHeader h3,
|
||||
.boardHeader h4,
|
||||
.boardHeader h5,
|
||||
.boardHeader h6
|
||||
{ border-bottom:3px solid #fe3614; }
|
||||
|
||||
/* board Information */
|
||||
.articleNum { float:left; background:url(../images/black/iconArticle.gif) no-repeat left top; }
|
||||
|
|
@ -43,7 +49,13 @@
|
|||
|
||||
/* replace common images */
|
||||
.boardHeader { border:1px solid #ABA9B4; border-bottom:0; background:transparent url(../images/black/bgH3.gif) repeat-x left bottom; overflow:hidden;}
|
||||
.boardHeader h3 { background:transparent url(../images/black/lineH3.gif) no-repeat right bottom; color:#AAAAAA; border-bottom:3px solid #ABA9B4;}
|
||||
.boardHeader h1,
|
||||
.boardHeader h2,
|
||||
.boardHeader h3,
|
||||
.boardHeader h4,
|
||||
.boardHeader h5,
|
||||
.boardHeader h6
|
||||
{ background:transparent url(../images/black/lineH3.gif) no-repeat right bottom; color:#AAAAAA; border-bottom:3px solid #ABA9B4;}
|
||||
.boardDescription { color:#666666; border:1px solid #666666; overflow:hidden; padding:10px; margin-top:5px; background-color:transparent;}
|
||||
.accountNavigation li.setup a { background:url(../images/black/iconSetup.gif) no-repeat left top; padding-left:14px; }
|
||||
.accountNavigation li.admin a { background:url(../images/black/iconAdmin.gif) no-repeat left top; padding-left:12px; }
|
||||
|
|
|
|||
|
|
@ -12,7 +12,13 @@ Jeong, Chan Myeong 070601~070630
|
|||
/* board Title */
|
||||
.boardHeader { border:1px solid #e1e1dd; border-bottom:0; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden;}
|
||||
.boardHeader .boardHeaderBorder { width:100%;}
|
||||
.boardHeader h3 { margin:0; float:left; padding:15px 15px 12px 15px; font-size:1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;}
|
||||
.boardHeader h1,
|
||||
.boardHeader h2,
|
||||
.boardHeader h3,
|
||||
.boardHeader h4,
|
||||
.boardHeader h5,
|
||||
.boardHeader h6
|
||||
{ margin:0; float:left; padding:15px 15px 12px 15px; font-size:1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;}
|
||||
|
||||
/* board Description */
|
||||
.boardDescription { color:#AEAEAE; border:1px solid #DDDDDD; overflow:hidden; padding:10px; margin: 5px 0; background-color:#FFFFFF;}
|
||||
|
|
@ -50,9 +56,15 @@ Jeong, Chan Myeong 070601~070630
|
|||
.boardRead .titleAndUser { overflow:hidden; border-bottom:1px solid #e0e1db; }
|
||||
|
||||
.boardRead .titleAndUser .title { float:left; margin:10px 0 5px 0; }
|
||||
.boardRead .titleAndUser h4 { margin:0; font-size:1.5em; margin-left:3px;}
|
||||
.boardRead .titleAndUser h4 a { color:#000000; text-decoration:none; }
|
||||
.boardRead .titleAndUser h4 a:hover { text-decoration:underline; }
|
||||
.boardRead .titleAndUser .title a { color:#000000; text-decoration:none; }
|
||||
.boardRead .titleAndUser .title a:hover { text-decoration:underline; }
|
||||
.boardRead .titleAndUser h1,
|
||||
.boardRead .titleAndUser h2,
|
||||
.boardRead .titleAndUser h3,
|
||||
.boardRead .titleAndUser h4,
|
||||
.boardRead .titleAndUser h5,
|
||||
.boardRead .titleAndUser h6
|
||||
{ margin:0; font-size:1.5em; margin-left:3px;}
|
||||
|
||||
.boardRead .titleAndUser .userInfo { float:right; white-space:nowrap; margin-top:11px; }
|
||||
.boardRead .titleAndUser .userInfo .author { color:#3074a5; }
|
||||
|
|
@ -362,8 +374,8 @@ html:not([lang*=""]) .boardList th { height:33px; }
|
|||
.pagination.c2 a.next span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;}
|
||||
|
||||
/* 게시물의 팝업 메뉴 */
|
||||
.comment_popup_menu, .document_popup_menu { text-align:right; background:none; background:url(../images/common/document_menu.gif) no-repeat right top; padding:0 15px 0 0; height:18px; clear:both;}
|
||||
.comment_popup_menu a, .document_popup_menu a { cursor:pointer; display:inline; color:#555555; text-decoration:none; }
|
||||
.comment_popup_menu, .document_popup_menu { text-align:right; background:url(../images/common/document_menu.gif) no-repeat right top !important; padding:0 15px 0 0; height:18px; clear:both;}
|
||||
.comment_popup_menu a, .document_popup_menu a { cursor:pointer; display:inline; color:#555555 !important; text-decoration:none; }
|
||||
|
||||
/* tag list */
|
||||
.tagsBox { border:1px solid #EEEEEE; padding:10px; overflow:hidden;}
|
||||
|
|
|
|||