1.2.3 배포를 위해 개발버전을 안정버전으로 copy

git-svn-id: http://xe-core.googlecode.com/svn/trunk@6423 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2009-05-27 02:17:12 +00:00
commit f722fcdd32
345 changed files with 5088 additions and 3398 deletions

View file

@ -44,6 +44,10 @@ RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/rss$ ./index.php?vid=$1&mid=$2&act=
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/atom$ ./index.php?vid=$1&mid=$2&act=atom [L]
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/api$ ./index.php?vid=$1&mid=$2&act=api [L]
# trackback
RewriteRule ^([0-9]+)/(.+)/trackback$ ./index.php?document_srl=$1&key=$2&act=trackback [L]
RewriteRule ^([a-zA-Z0-9_]+)/([0-9]+)/(.+)/trackback$ ./index.php?vid=$1&document_srl=$2&key=$3&act=trackback [L]
# administrator page
RewriteRule ^admin/?$ ./index.php?module=admin [L]

View file

@ -11,11 +11,11 @@ jQuery(function($) {
if(!pObj) continue;
var pN = pObj.nodeName.toLowerCase();
if($.inArray(pN, ['a', 'pre', 'xml', 'textarea', 'input', 'option', 'code']) != -1) continue;
if($.inArray(pN, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style']) != -1) continue;
if(obj.nodeType == 3 && obj.length >= 10) {
var content = obj.nodeValue;
if(!url_regx.test(content)) continue;
if(!/(http|https|ftp|news|telnet|irc):\/\//i.test(content)) continue;
content = content.replace(/</g, '&lt;');
content = content.replace(/>/g, '&gt;');
@ -31,6 +31,6 @@ jQuery(function($) {
}
$('.xe_content').each(function() {
if(url_regx.test($(this).text())) replaceHrefLink(this);
replaceHrefLink(this);
});
});

View file

@ -12,7 +12,7 @@
글과 댓글의 내용 중 URL 문자열에 링크를 걸어주는 애드온입니다.
</description>
<description xml:lang="jp">
書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ同一ウィンドウに開くメニュが現れるアドオンです。
書き込み本文とコメントに登録された内容の中、httpで始まる一般文字列に自動にリンクを貼り付け、そのリンクにマウスオーバすると、別ウィンドウ、または同一ウィンドウに開くメニュが現れるアドオンです。
</description>
<description xml:lang="en">
This addon makes a link to a string that starts with http.

View file

@ -15,7 +15,7 @@
사용으로 하셔야 RSD태그 및 api가 동작을 합니다.
</description>
<description xml:lang="jp">
MetaWeblogをサポートするBlogAPI アドオンです。
MetaWeblogをサポートするBlog APIアドオンです。
「使用する」にチェックすると各モジュールごとにRSDのアドレスを表示します。
APIのアドレスは「http://インストールURL/モジュール名/api」です。
「使用する」に設定してから、RSDタグ、およびAPIが作動します。

View file

@ -18,6 +18,12 @@
if($logged_info->is_admin == 'Y' || $logged_info->is_site_admin) return;
if($addon_info->target != 'all' && Context::get('is_logged')) return;
$target_acts = array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory');
if($addon_info->apply_find_account=='apply') $target_acts[] = 'procMemberFindAccount';
Context::addHtmlHeader('<script type="text/javascript"> var captchaTargetAct = new Array("'.implode('","',$target_acts).'"); </script>');
// 캡챠 인증이 되지 않은 세션이면 실행 시작
if(!$_SESSION['captcha_authed']) {
@ -100,7 +106,7 @@
Context::addJsFile('./addons/captcha/captcha.js',false);
// 게시판/ 이슈트래커의 글쓰기/댓글쓰기 액션 호출시 세션 비교
if(in_array(Context::get('act'), array('procBoardInsertDocument','procBoardInsertComment','procIssuetrackerInsertIssue','procIssuetrackerInsertHistory'))) {
if(in_array(Context::get('act'), $target_acts)) {
$this->error = "msg_not_permitted";
}
}

View file

@ -33,7 +33,17 @@ var calledArgs = null;
body.append(captchaXE);
captchaXE.exec = function(module, act, params, callback_func, response_tags, callback_func_arg, fo_obj) {
if(act == 'procBoardInsertDocument' || act == 'procBoardInsertComment' || act == 'procIssuetrackerInsertIssue' || act == 'procIssuetrackerInsertHistory') {
var doCheck = false;
if(typeof(captchaTargetAct)!='undefined') {
for(var i in captchaTargetAct) {
if(captchaTargetAct[i]==act) {
doCheck = true;
break;
}
}
}
if(doCheck) {
calledArgs = {'module':module,'act':act,'params':params,'callback_func':callback_func,'response_tags':response_tags,'callback_func_arg':callback_func_arg,'fo_obj':fo_obj};
oldExecXml('captcha','setCaptchaSession',new Array(),captchaXE.show,new Array('error','message','about','keyword'));
} else {

View file

@ -37,7 +37,7 @@
<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="jp">管理者を除き、書き込み・コメントを入力する際captchaイメージを見せる対象を設定します。</description>
<description xml:lang="zh-TW">除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。</description>
<options value="">
<title xml:lang="ko">로그인하지 않은 사용자</title>
@ -59,7 +59,7 @@
<title xml:lang="zh-TW">行為模式</title>
<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="jp">「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。</description>
<description xml:lang="zh-TW">選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。</description>
<options value="onetime">
<title xml:lang="ko">1번만 동작</title>
@ -74,5 +74,27 @@
<title xml:lang="zh-TW">每次</title>
</options>
</var>
<var name="apply_find_account" type="select">
<title xml:lang="ko">비밀번호 찾기 적용</title>
<title xml:lang="zh-CN">비밀번호 찾기 적용</title>
<title xml:lang="jp">비밀번호 찾기 적용</title>
<title xml:lang="zh-TW">비밀번호 찾기 적용</title>
<description xml:lang="ko">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-CN">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="jp">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<description xml:lang="zh-TW">적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다.</description>
<options value="">
<title xml:lang="ko">적용하지 않음</title>
<title xml:lang="zh-CN">적용하지 않음</title>
<title xml:lang="jp">적용하지 않음</title>
<title xml:lang="zh-TW">적용하지 않음</title>
</options>
<options value="apply">
<title xml:lang="ko">적용</title>
<title xml:lang="zh-CN">적용</title>
<title xml:lang="jp">적용</title>
<title xml:lang="zh-TW">적용</title>
</options>
</var>
</extra_vars>
</addon>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<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">Counter Addon</title>
<title xml:lang="ge">Counter Addon</title>
@ -13,7 +13,7 @@
이 애드온을 켜셔야 접속 정보 수집이 됩니다.
</description>
<description xml:lang="jp">
XEの接続カウンターモジュールで接続(アクセス)情報を記録します。
XEのアクセスカウンターモジュールで接続(アクセス)情報を記録します。
このアドオンを「使用」に設定してから、接続(アクセス)情報が記録されます。
</description>
<description xml:lang="zh-CN">

View file

@ -56,7 +56,7 @@
<description xml:lang="zh-CN">替换部分的jQuery cssquery。
如果正使用的是官方默认皮肤(xe_board此处留空即可。</description>
<description xml:lang="jp">置換する部分のjQuery cssqueryです。
xe_board掲示板スキンの場合は空白にして下さい。</description>
xe_board掲示板スキンの場合は空白にして下さい。</description>
<description xml:lang="en">jQuery cssquery for the part to be substituted.
You may leave blank for xe_board skin.</description>
</var>
@ -73,7 +73,7 @@
</description>
<description xml:lang="zh-TW"> 키워드가 여러개 있을때 "첫번째 키워드"에만 링크를 걸 것인지 "모든 키워드"에 걸 것인지 선택합니다.
</description>
<description xml:lang="jp"> 複数のキーワードの場合、"最初のキーワード"のみ、もしくは "全てのキーワード"にリンクを貼りつけるかを設定します。
<description xml:lang="jp"> 複数のキーワードの場合、「最初のキーワード」のみ、もしくは「全てのキーワード」にリンクを貼りつけるかを設定します。
</description>
<description xml:lang="en">For the multiple keywords, choose if make a link to the first keyword, or all the keywords</description>
<options value="">

View file

@ -14,7 +14,7 @@
<description xml:lang="en">You can insert LemonPen to the site when you enable this.</description>
<description xml:lang="es">Puede insertar LemonPen al sitio cuando este se activa.</description>
<description xml:lang="ru">Вы можете вставить LemonPen к месту, когда вы позволили это.</description>
<description xml:lang="jp">機能をオンにすると、サイト上でレモンペンを使うことが出来ます。 (LemonPenOpenmaru社のサービス)</description>
<description xml:lang="jp">機能をオンにすると、サイト上でレモンペンを使ます。 (LemonPenOpenmaru社のサービス)</description>
<description xml:lang="zh-TW">想要在網站使用LemonPen請將其啟用。</description>
<version>0.1</version>
<date>2007-12-10</date>
@ -46,7 +46,7 @@
<description xml:lang="ge">Bitte geben Sie Ihre SID-Wert ein, die Sie nach Registrierung auf der Website LemonPen.</description>
<description xml:lang="es">Por favor, de entrada sid valor que había que hacer después de registrarse en el sitio web LemonPen.</description>
<description xml:lang="ru">Введите замороженный ценности, которые вы получили после регистрации на сайте LemonPen.</description>
<description xml:lang="jp">レモンペンのサイトから発行されたsidを入力して下さい。 (LemonPenOpenmaru社のサービス)</description>
<description xml:lang="jp">レモンペンのサイトから発行されたsidを入力して下さい。 (LemonPenOpenmaru社のサービス)</description>
<description xml:lang="zh-TW">請輸入在LemonPen網站註冊時所給予的sid值。</description>
</var>
</extra_vars>

View file

@ -13,7 +13,6 @@
쪽지, 친구기능등을 사용하기 위해서는 이 애드온을 사용으로 해주시면 됩니다.
</description>
<description xml:lang="jp">
コミュニケーションモジュールを活性化して、メッセージや友達機能を使えるようにします。
メッセージ・友達機能を使うにはこのアドオンを「使用」にして下さい。
</description>
<description xml:lang="zh-CN">

View file

@ -1,3 +1,3 @@
<?php
$lang->alert_new_message_arrived = '%d個の新しいメッセージが届きました。';
$lang->alert_new_message_arrived = '%d個の新しいメッセージが届いています。 確認しますか?';
?>

View file

@ -1,7 +1,7 @@
<?php
/**
* mhtml Library ver 0.1
* @author zero <zero@zeroboard.com>
* @author zero <zero@zeroboard.com> / lang_select : misol
**/
class wap extends mobileXE {
@ -16,13 +16,15 @@
* @brief hdml 헤더 출력
**/
function printHeader() {
print("<html>\n");
print("<html><head>\n");
if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage);
printf("<title>%s%s</title></head><body>\n", htmlspecialchars($this->title),htmlspecialchars($titlePageStr));
}
// 제목을 출력
function printTitle() {
if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage);
printf('&lt;%s%s&gt;<br>%s', $this->title,$titlePageStr,"\n");
printf('&lt;%s%s&gt;<br>%s', htmlspecialchars($this->title),htmlspecialchars($titlePageStr),"\n");
}
/**
@ -34,14 +36,16 @@
foreach($this->getChilds() as $key => $val) {
if(!$val['link']) continue;
printf('<a href="%s" accesskey="%s">%s</a><br>%s', $val['href'], $this->getNo(), $val['text'], "\n");
if($val['extra']) printf("<br>%s\n",str_replace('<br/>','<br>',$val['extra']));
}
} else {
print $this->getContent()."\n";
}
print(str_replace('<br/>','<br>',$this->getContent())."\n");
}
print "<hr><br>";
}
/**
* @brief 버튼을 출력함
* @brief 버튼을 출력함
**/
function printBtn() {
if($this->nextUrl) {
@ -52,19 +56,27 @@
$url = $this->prevUrl;
printf('<a href="%s">%s</a><br>%s', $url->url, $url->text, "\n");
}
// 언어선택
if(!parent::isLangChange()){
$url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url'));
printf('<a href="%s">%s</a><br>%s', $url, 'Language : '.Context::getLang('select_lang'), "\n");
}
else {
printf('<a href="%s">%s</a><br>%s', Context::get('return_uri'), Context::getLang('lang_return'), "\n");
}
if($this->upperUrl) {
$url = $this->upperUrl;
printf('<btn href="%s" name="%s">%s', $url->url, $url->text, "\n");
}
if($this->homeUrl) {
$url = $this->homeUrl;
printf('<a btn="%s" href="%s">%s</a>%s', $url->text, $url->url, $url->text, "\n");
printf('<a btn="%s" href="%s">%s</a><br>%s', $url->text, $url->url, $url->text, "\n");
}
}
// 푸터 정보를 출력
function printFooter() {
print("</html>\n");
print("</body></html>\n");
}
}
?>

View file

@ -1,7 +1,7 @@
<?php
/**
* Mobile XE Library Class ver 0.1
* @author zero <zero@zeroboard.com>
* @author zero <zero@zeroboard.com> / lang_select : misol
* @brief WAP 태그 출력을 위한 XE 라이브러리
**/
@ -12,6 +12,7 @@
var $upperUrl = NULL;
var $nextUrl = NULL;
var $prevUrl = NULL;
var $etcBtn = NULL;
// 메뉴 네비게이션을 위한 변수
var $childs = null;
@ -21,7 +22,7 @@
var $content = NULL;
var $mobilePage = 0;
var $totalPage = 1;
var $charset = 'euc-kr';
var $charset = 'UTF-8';
var $no = 0;
// 네비게이션 관련 변수
@ -42,6 +43,9 @@
// Deck size
var $deckSize = 1024;
// 언어 설정 변경
var $languageMode = 0;
var $lang = null;
/**
* @brief getInstance
**/
@ -56,6 +60,13 @@
$class_file = sprintf('%saddons/mobile/classes/%s.class.php', _XE_PATH_, $browserType);
require_once($class_file);
// 모바일 언어설정 로드(쿠키가 안되어 생각해낸 방법...-캐시파일 재생성을 클릭하면 초기화된다..)
$this->lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php');
if($this->lang) {
$lang_supported = Context::get('lang_supported');
$this->lang = str_replace(array('<?php /**','**/ ?>'),array('',''),$this->lang);
if(isset($lang_supported[$this->lang])) Context::setLangType($this->lang);
}
Context::loadLang(_XE_PATH_.'addons/mobile/lang');
$instance = new wap();
@ -64,6 +75,7 @@
if(!$mobilePage) $mobilePage = 1;
$instance->setMobilePage($mobilePage);
}
return $instance;
@ -74,8 +86,15 @@
**/
function mobileXE() {
// navigation mode 체크
if(Context::get('nm')) $this->navigationMode = 1;
$this->cmid = (int)Context::get('cmid');
if(Context::get('nm')) {
$this->navigationMode = 1;
$this->cmid = (int)Context::get('cmid');
}
if(Context::get('lcm')) {
$this->languageMode = 1;
$this->lang = Context::get('sel_lang');
}
}
/**
@ -86,6 +105,30 @@
return ($this->navigationMode && $this->module_info->menu_srl)?true:false;
}
/**
* @brief langchange mode 체크
* languageMode 세팅 있어야 true return
**/
function isLangChange() {
if($this->languageMode) return true;
else return false;
}
/**
* @brief 언어 설정
* 쿠키가 안되기 때문에 휴대전화마다 고유한 파일로 언어설정을 저장하는 파일 생성
**/
function setLangType() {
$lang_supported = Context::get('lang_supported');
// 언어 변수가 있는지 확인하고 변수가 유효한지 확인
if($this->lang && isset($lang_supported[$this->lang])) {
$langbuff = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php');
if($langbuff) FileHandler::removeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php');
$langbuff = '<?php /**'.$this->lang.'**/ ?>';
FileHandler::writeFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php',$langbuff);
}
}
/**
* @brief 현재 요청된 모듈 정보 세팅
**/
@ -108,7 +151,7 @@
if(!file_exists($menu_cache_file)) return;
include $menu_cache_file;
// 정리된 menu들을 1차원으로 변경
$this->getListedItems($menu->list, $listed_items, $node_list);
@ -138,13 +181,16 @@
* 모바일 브라우저가 아닐 경우 null return
**/
function getBrowserType() {
if(Context::get('smartphone')) return null;
// 브라우저 타입을 판별
$browserAccept = $_SERVER['HTTP_ACCEPT'];
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$wap_sid = $_SERVER['HTTP_X_UP_SUBNO'];
if(eregi("SKT11", $userAgent)) return "wml";
elseif(eregi("skt", $browserAccept)) return "wml";
if(eregi("SKT11", $userAgent) || eregi("skt", $browserAccept)) {
Context::set('mobile_skt',1);
return "wml";
}
elseif(eregi("hdml", $browserAccept)) return "hdml";
elseif(eregi("CellPhone", $userAgent)) return "mhtml";
return null;
@ -153,8 +199,12 @@
/**
* @brief charset 지정
**/
function setCharSet($charset = 'euc-kr') {
if(!$charset) $charset = 'euc-kr';
function setCharSet($charset = 'UTF-8') {
if(!$charset) $charset = 'UTF-8';
//SKT는 euc-kr만 지원
if(Context::get('mobile_skt')==1) $charset = 'euc-kr';
$this->charset = $charset;
}
@ -220,7 +270,9 @@
* @brief title 지정
**/
function setTitle($title) {
$oModuleController = &getController('module');
$this->title = $title;
$oModuleController->replaceDefinedLangCode($this->title);
}
/**
@ -235,11 +287,12 @@
* HTML 컨텐츠에서 텍스트와 링크만 추출하는 기능
**/
function setContent($content) {
// 링크/줄바꿈을 임의의 문자열로 변경하고 태그 모두 제거
$content = strip_tags(preg_replace('/<(\/?)(a|br)/i','[$1$2', $content));
$oModuleController = &getController('module');
$allow_tag_array = array('<a>','<br>','<p>','<b>','<i>','<u>','<em>','<small>','<strong>','<big>','<table>','<tr>','<td>');
// 링크/줄바꿈을 다시 원위치
$content = preg_replace('/\[(\/?)(a|br)/i','<$1$2', $content);
// 링크/ 줄바꿈, 강조만 제외하고 모든 태그 제거
$content = strip_tags($content, implode($allow_tag_array));
// 탭 여백 제거
$content = str_replace("\t", "", $content);
@ -247,7 +300,9 @@
// 2번 이상 반복되는 공백과 줄나눔을 제거
$content = preg_replace('/( ){2,}/s', '', $content);
$content = preg_replace("/([\r\n]+)/s", "\r\n", $content);
$content = str_replace(array("<A","<BR","<Br","<br>","<BR>","<br />"), array("<a","<br","<br","<br/>","<br/>","<br/>"), $content);
$content = preg_replace(array("/<a/i","/<\/a/i","/<b/i","/<\/b/i","/<br/i"),array('<a','</a','<b','</b','<br'),$content);
$content = str_replace(array("<br>","<br />"), array("<br/>","<br/>"), $content);
while(strpos($content, '<br/><br/>')) {
$content = str_replace('<br/><br/>','<br/>',$content);
}
@ -261,11 +316,21 @@
//$content = str_replace(array('&','<','>','"','&amp;nbsp;'), array('&amp;','&lt;','&gt;','&quot;',' '), $content);
$tag_open_pos = strpos($content, '<a');
$tag_close_pos = strpos($content, '</a>');
foreach($allow_tag_array as $tag) {
if($tag == '<br>') continue;
$tag_open_pos = strpos($content, str_replace('>','',$tag));
$tag_close_pos = strpos($content, str_replace('<','</',$tag));
if($tag_open_pos!==false && $tag_close_pos || $tag_close_pos < $tag_open_pos) {
$contents[count($contents)-1] .= substr($content, 0, $tag_close_pos + strlen($tag) + 1);
$content = substr($content, $tag_close_pos + strlen($tag) + 1);
}
}
$tag_open_pos = strpos($content, '&');
$tag_close_pos = strpos($content, ';');
if($tag_open_pos!==false && $tag_close_pos || $tag_close_pos < $tag_open_pos) {
$contents[count($contents)-1] .= substr($content, 0, $tag_close_pos+4);
$content = substr($content, $tag_close_pos+4);
$contents[count($contents)-1] .= substr($content, 0, $tag_close_pos + 1);
$content = substr($content, $tag_close_pos + 1);
}
}
@ -285,6 +350,8 @@
}
$this->content = $contents[$this->mobilePage-1];
$oModuleController->replaceDefinedLangCode($this->content);
$content = str_replace(array('$','\''), array('$$','&apos;'), $content);
}
/**
@ -337,6 +404,16 @@
$this->nextUrl->text = $text;
}
/**
* @brief 다음, 이전, 상위 이외에 기타 버튼 지정
**/
function setEtcBtn($url, $text) {
if(!$url) $url = '#';
$etc['url'] = $url;
$etc['text'] = htmlspecialchars($text);
$this->etcBtn[] = $etc;
}
/**
* @brief display
**/
@ -345,7 +422,7 @@
$this->setHomeUrl(getUrl(), Context::getLang('cmd_go_home'));
// 제목 지정
$this->setTitle(Context::getBrowserTitle());
if(!$this->title) $this->setTitle(Context::getBrowserTitle());
ob_start();
@ -368,7 +445,7 @@
// 변환 후 출력
if(strtolower($this->charset) == 'utf-8') print $content;
else print iconv('UTF-8',$this->charset, $content);
else print iconv('UTF-8',$this->charset."//TRANSLIT", $content);
exit();
}
@ -451,6 +528,38 @@
$this->display();
}
/**
* @brief 언어설정 메뉴 출력
**/
function displayLangSelect() {
$childs = array();
$this->lang = FileHandler::readFile('./files/cache/addons/mobile/setLangType/personal_settings/'.md5(trim($_SERVER['HTTP_USER_AGENT']).trim($_SERVER['HTTP_PHONE_NUMBER']).trim($_SERVER['HTTP_HTTP_PHONE_NUMBER'])).'.php');
if($this->lang) {
$this->lang = str_replace(array('<?php /**','**/ ?>'),array('',''),$this->lang);
Context::setLangType($this->lang);
}
$lang_supported = Context::get('lang_supported');
$lang_type = Context::getLangType();
$obj = null;
$obj['link'] = $obj['text'] = Context::getLang('president_lang').' : '.$lang_supported[$lang_type];
$obj['href'] = getUrl('sel_lang',$lang_type);
$childs[] = $obj;
if(is_array($lang_supported)) {
foreach($lang_supported as $key => $val) {
$obj = null;
$obj['link'] = $obj['text'] = $val;
$obj['href'] = getUrl('sel_lang',$key);
$childs[] = $obj;
}
}
$this->setChilds($childs);
$this->display();
}
/**
* @brief 모듈의 WAP 클래스 객체 생성하여 WAP 준비
**/

View file

@ -1,7 +1,7 @@
<?php
/**
* WML Library ver 0.1
* @author zero <zero@zeroboard.com>
* @author zero <zero@zeroboard.com> / lang_select : misol
**/
class wap extends mobileXE {
@ -18,8 +18,10 @@
function printHeader() {
header("Content-Type: text/vnd.wap.wml");
header("charset: ".$this->charset);
if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage);
print("<?xml version=\"1.0\" encoding=\"".$this->charset."\"?><!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");
print("<wml>\n<card>\n<p>\n");
// 카드제목
printf("<wml>\n<card title=\"%s%s\">\n<p>\n",htmlspecialchars($this->title),htmlspecialchars($titlePageStr));
}
/**
@ -27,7 +29,7 @@
**/
function printTitle() {
if($this->totalPage > $this->mobilePage) $titlePageStr = sprintf("(%d/%d)",$this->mobilePage, $this->totalPage);
printf('&lt;%s%s&gt;<br/>%s', $this->title,$titlePageStr,"\n");
printf('&lt;%s%s&gt;<br/>%s', htmlspecialchars($this->title),htmlspecialchars($titlePageStr),"\n");
}
/**
@ -38,24 +40,42 @@
if($this->hasChilds()) {
foreach($this->getChilds() as $key => $val) {
if(!$val['link']) continue;
printf('<do type="%s" label="%s"><go href="%s" /></do>%s', $this->getNo(), $val['text'], $val['href'], "\n");
printf('<do type="%s" label="%s"><go href="%s" /></do>%s', $this->getNo(), htmlspecialchars($val['text']), $val['href'], "\n");
if($val['extra']) printf("%s\n",$val['extra']);
}
} else {
printf('%s<br/>%s', str_replace("<br>","<br/>",$this->getContent()),"\n");
}
}
print('<br/>');
}
/**
* @brief 버튼을 출력함
* @brief 버튼을 출력함
**/
function printBtn() {
if($this->nextUrl) {
$url = $this->nextUrl;
printf('<do type="%s" label="%s"><go href="%s"/></do>%s', $this->getNo(), $url->text, $url->url, "\n");
printf('<do type="vnd.next" label="%s"><go href="%s"/></do>%s', $url->text, $url->url, "\n");
}
if($this->prevUrl) {
$url = $this->prevUrl;
printf('<do type="%s" label="%s"><go href="%s"/></do>%s', $this->getNo(), $url->text, $url->url, "\n");
printf('<do type="vnd.prev" label="%s"><go href="%s"/></do>%s', $url->text, $url->url, "\n");
}
// 기타 해당사항 없는 버튼 출력 담당 (array로 전달) type??
if($this->etcBtn) {
if(is_array($this->etcBtn)) {
foreach($this->etcBtn as $key=>$val) {
printf('<do type="vnd.btn%s" label="%s"><go href="%s"/></do>%s', $key, $val['text'], $val['url'], "\n");
}
}
}
// 언어선택
if(!parent::isLangChange()){
$url = getUrl('','lcm','1','sel_lang',Context::getLangType(),'return_uri',Context::get('current_url'));
printf('<do type="vnd.lang" label="%s"><go href="%s"/></do>%s', 'Language : '.Context::getLang('select_lang'), $url, "\n");
}
else {
printf('<do type="vnd.lang" label="%s"><go href="%s"/></do>%s', Context::getLang('lang_return'), Context::get('return_uri'), "\n");
}
if($this->homeUrl) {
$url = $this->homeUrl;
@ -74,7 +94,12 @@
// 목록등에서 일련 번호를 리턴한다
function getNo() {
return "vnd.skmn".parent::getNo();
if(Context::get('mobile_skt')==1) {
return "vnd.skmn".parent::getNo();
}
else {
return parent::getNo();
}
return $str;
}
}

View file

@ -1,72 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">모바일XE 애드온</title>
<title xml:lang="jp">モバイルXEアドオン</title>
<title xml:lang="zh-CN">手机XE插件</title>
<title xml:lang="en">Mobile XE</title>
<title xml:lang="zh-TW">XE行動上網</title>
<description xml:lang="ko">
모바일에서 접속시 헤더 정보를 분석하여 메뉴 - 모듈의 관계를 이용하여 WAP 태그로 출력하는 애드온입니다.
wml, hdml, mhtml를 지원하고 그 이외의 경우에는 동작하지 않습니다.
</description>
<description xml:lang="jp">
モバイル端末機からアクセス時、ヘッダーheader情報を分析してメニュー - モジュールの関係を利用してWAPタグに変換表示するアドオンです。
wml, hdml, mhtmlをサポートし、その以外は対応していません。
</description>
<description xml:lang="zh-CN">
通过手机访问网站时将网页输出为WAP标签的插件。
支持语言wml, hdml, mhtml
</description>
<description xml:lang="en">
This addon displays WAP tag by analyzing header information on mobile connection.
Only wml, hdml, mhtml formats are provided.
</description>
<description xml:lang="zh-TW">
透過行動工具上網時會將網頁轉換為WAP標籤顯示。
只限於 wml, hdml, mhtml格式。
</description>
<version>0.1</version>
<date>2008-06-20</date>
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="zh-TW">zero</name>
</author>
<extra_vars>
<var name="charset">
<title xml:lang="ko">문자셋</title>
<title xml:lang="jp">文字コード</title>
<title xml:lang="zh-CN">编码</title>
<title xml:lang="en">Charset</title>
<title xml:lang="zh-TW">編碼</title>
<description xml:lang="ko">
모바일 기기의 경우 utf-8 문자셋을 인식하지 못할 수 있습니다.
문자셋에 원하시는 문자셋을 입력하면 자동으로 변환하여 출력하여 모바일에서 이상없이 출력하도록 합니다.
기본값은 euc-kr입니다.
</description>
<description xml:lang="jp">
ある特定のモバイル機器ではutf-8文字コードの認識が出来ない場合があります。
文字コードを設定すると、該当文字コードに自動変換して正常に表示出来るようになります。
本アドオンのデフォルト値はeuc-krです。
</description>
<description xml:lang="zh-CN">
手机有时无法识别utf-8编码这时输入相应的编码值即可自动转换。
默认编码为euc-kr。
</description>
<description xml:lang="en">
utf-8 cannot be read for mobile tools.
Mobile tools will display correct charset when you input charset you want.
Default charset is euc-kr.
</description>
<description xml:lang="zh-TW">
行動工具無法讀取utf-8編碼。
當您輸入所想要的編碼時,行動工具將會正確的顯示。
預設編碼是euc-kr.
</description>
</var>
</extra_vars>
</addon>
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">모바일XE 애드온</title>
<title xml:lang="jp">モバイルXEアドオン</title>
<title xml:lang="zh-CN">手机XE插件</title>
<title xml:lang="en">Mobile XE</title>
<title xml:lang="zh-TW">XE行動上網</title>
<description xml:lang="ko">
모바일에서 접속시 헤더 정보를 분석하여 메뉴 - 모듈의 관계를 이용하여 WAP 태그로 출력하는 애드온입니다.
wml, hdml, mhtml를 지원하고 그 이외의 경우에는 동작하지 않습니다.
</description>
<description xml:lang="jp">
モバイル端末機からアクセス時、ヘッダーheader情報を分析して「メニュー」と「モジュール」の関係を利用してWAPタグに変換表示するアドオンです。
wml, hdml, mhtmlをサポートし、その以外は対応していません。
</description>
<description xml:lang="zh-CN">
通过手机访问网站时将网页输出为WAP标签的插件。
支持语言wml, hdml, mhtml
</description>
<description xml:lang="en">
This addon displays WAP tag by analyzing header information on mobile connection.
Only wml, hdml, mhtml formats are provided.
</description>
<description xml:lang="zh-TW">
透過行動工具上網時會將網頁轉換為WAP標籤顯示。
只限於 wml, hdml, mhtml格式。
</description>
<version>0.1.1</version>
<date>2009-05-23</date>
<author email_address="zero@zeroboard.com" link="http://blog.nzeo.com">
<name xml:lang="ko">zero</name>
<name xml:lang="jp">zero</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="zh-TW">zero</name>
</author>
<history version="0.1.1" date="2009-05-23">
<author email_address="misol221@paran.com" link="http://www.imsoo.net">
<name xml:lang="ko">misol</name>
<name xml:lang="jp">misol</name>
<name xml:lang="zh-CN">misol</name>
<name xml:lang="en">misol</name>
<name xml:lang="zh-TW">misol</name>
</author>
<log>언어선택 추가(WML, mHTML)</log>
<log>인코딩 설정 개선</log>
<log>그 외 소소한 개선들</log>
</history>
<extra_vars>
<var name="charset">
<title xml:lang="ko">문자셋</title>
<title xml:lang="jp">文字コード</title>
<title xml:lang="zh-CN">编码</title>
<title xml:lang="en">Charset</title>
<title xml:lang="zh-TW">編碼</title>
<description xml:lang="ko">
모바일 기기의 경우 UTF-8 문자셋을 인식하지 못할 수 있습니다.
문자셋에 원하시는 문자셋을 입력하면 자동으로 변환하여 출력하여 모바일에서 이상없이 출력하도록 합니다.
기본값은 UTF-8입니다.
(*SK Telecom 휴대전화의 경우 euc-kr인코딩만 지원하므로, 강제로 euc-kr인코딩만 지원합니다.)
</description>
<description xml:lang="jp">
ある特定のモバイル機器ではutf-8文字コードの認識が出来ない場合があります。
文字コードを設定すると、(日本語だけの場合)該当文字コードに自動変換して正常に表示出来るようになります。
本アドオンのデフォルト値はUTF-8で、日本の携帯はshift-jisが一般的です。
</description>
<description xml:lang="zh-CN">
手机有时无法识别utf-8编码这时输入相应的编码值即可自动转换。
默认编码为UTF-8。
</description>
<description xml:lang="en">
utf-8 cannot be read for mobile tools.
Mobile tools will display correct charset when you input charset you want.
Default charset is UTF-8.
</description>
<description xml:lang="zh-TW">
行動工具無法讀取utf-8編碼。
當您輸入所想要的編碼時,行動工具將會正確的顯示。
預設編碼是UTF-8.
</description>
</var>
</extra_vars>
</addon>

View file

@ -4,6 +4,10 @@
* @author zero (zero@nzeo.com)
* @brief English Language Pack (Basic Contents only)
**/
// lang select by misol
$lang->president_lang = 'selected Language';
$lang->select_lang = 'select Language';
$lang->lang_return = 'Go Back';
$lang->cmd_go_upper = 'Upper';
$lang->cmd_go_home = 'Go Home';

View file

@ -5,7 +5,7 @@
* @brief 日本語言語パッケージ
**/
$lang->cmd_go_upper = '上位';
$lang->cmd_go_upper = '上位メニュー';
$lang->cmd_go_home = 'トップへ';
$lang->cmd_view_sitemap = 'サイトマップ';
?>

View file

@ -5,7 +5,13 @@
* @brief 한국어 언어팩 (기본적인 내용만 수록)
**/
// 언어 선택부분 by misol
$lang->president_lang = '현재 언어';
$lang->select_lang = '언어 선택';
$lang->lang_return = '돌아가기';
$lang->cmd_go_upper = '상위';
$lang->cmd_go_home = '홈으로';
$lang->cmd_view_sitemap = '사이트맵 보기';
?>

View file

@ -42,6 +42,11 @@
// 네비게이트 모드이거나 WAP class가 있을 경우 미리 컨텐츠를 추출하여 출력/ 종료
if($called_position == 'before_module_proc') {
if($oMobile->isLangChange()) {
$oMobile->setLangType();
$oMobile->displayLangSelect();
}
// 네비게이트 모드이면 네비게이션 컨텐츠 출력
if($oMobile->isNavigationMode()) $oMobile->displayNavigationContent();

View file

@ -17,8 +17,8 @@
级别图标可以在模块 &gt; 积分系统中进行选择。
</description>
<description xml:lang="jp">
ポイントシステムを使用する場合、ユーザ名の前にレベルアイコンの表示が出来ます。
レベルアイコンは、「モジュール &gt; ポイントシステム」で選択出来ます。
ポイントシステムを使用する場合、ユーザ名の前にレベルアイコンの表示ます。
レベルアイコンは、「モジュール &gt; ポイントシステム」で選択ます。
</description>
<description xml:lang="en">
This addon displays level icon in front of the user name when you are using the point system.

View file

@ -12,7 +12,7 @@
본문내에 삽입된 이미지의 크기를 본문크기에 맞게 하고 클릭시 원본을 보여주는 애드온입니다.
</description>
<description xml:lang="jp">
本文内に挿入されたイメージのサイズを本文の幅サイズに合わせてリーサイズし、クリックした時、オリジナルサイズのイメージを表示するアドオンです。
本文内に挿入されたイメージのサイズを本文の幅サイズに合わせてリーサイズし、クリックした時、オリジナルサイズのイメージを表示します。
</description>
<description xml:lang="zh-CN">
自动调整主题内容区内的图片大小,点击将显示原始大小的插件。

View file

@ -157,48 +157,50 @@ function slideshow(event) {
xScreen.xeShow();
}
$(window).load(function(){
$(document).ready(function(){
var regx_skip = /(?:modules|addons|classes|common|layouts|libs|widgets)/i;
var regx_parent = /(?:document|comment)_[0-9]+_[0-9]+/i;
var xe_content = $(".xe_content");
var overflow = xe_content.css("overflow");
var width = xe_content.css("width");
xe_content.css("overflow","hidden");
xe_content.css("width","100%");
var offsetWidth = xe_content.attr("offsetWidth");
xe_content.css("overflow",overflow);
xe_content.css("width",width);
$(".xe_content").each(function() {
$(this).find("img").each(function(){
var img = $(this);
var width = img.attr("width");
if(!width) width = img.width();
img.attr("orig_width",width);
img.attr("width",1);
});
var offsetWidth = $(this).width();
// 이미지 목록을 가져와서 리사이즈
$(".xe_content img").each(function(){
var img = $(this);
var src = img.attr("src");
var width = img.attr("width");
var height = img.attr("height");
// XE 내부 프로그램 또는 스킨의 이미지라면 이미지 리사이즈를 하지 않음
if ( regx_skip.test(src) ) return;
// 커스텀 속성 추가
img.attr("rel", "xe_gallery");
// 크기를 계산한다
if(width>offsetWidth) {
img.attr("width",offsetWidth-1);
img.attr("height",parseInt(offsetWidth/width*height,10));
}
// 링크가 설정되어 있거나 onclick 이벤트가 부여되어 있으면 원본 보기를 하지 않음
if ( !img.parent("a").size() && !img.attr("onclick") ) {
// 스타일 설정
img.css("cursor", "pointer");
$(this).find("img").each(function(){
var img = $(this);
var src = img.attr("src");
img.attr("width",img.attr("orig_width"));
img.removeAttr("orig_width",'');
var width = img.attr("width");
var height = img.attr("height");
// 클릭하면 슬라이드쇼 시작
img.click(slideshow);
}
// XE 내부 프로그램 또는 스킨의 이미지라면 이미지 리사이즈를 하지 않음
if ( !regx_skip.test(src) ) {
// 커스텀 속성 추가
img.attr("rel", "xe_gallery");
});
// 크기를 계산한다
if(width>offsetWidth) {
img.attr("width",offsetWidth-10);
img.attr("height",parseInt(offsetWidth/width*height,10));
}
// 링크가 설정되어 있거나 onclick 이벤트가 부여되어 있으면 원본 보기를 하지 않음
if ( !img.parent("a").size() && !img.attr("onclick") ) {
// 스타일 설정
img.css("cursor", "pointer");
// 클릭하면 슬라이드쇼 시작
img.click(slideshow);
}
}
});
});
});
})(jQuery);

View file

@ -1,106 +1,134 @@
<?php
class smartphoneXE {
var $module_info = null;
var $content = null;
var $oModule = null;
var $menuList = null;
var $output = null;
function isFromSmartPhone()
{
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$iphoneForce = Context::get('iphone');
return $iphoneForce || $userAgent && (strpos($userAgent, 'iPod') || strpos($userAgent, 'iPhone') || strpos($userAgent, 'PPC')) ;
var $parent_url = null;
var $prev_url = null;
var $next_url = null;
var $content = null;
function isFromSmartPhone() {
return Context::get('smartphone') || preg_match('/(iPopd|iPhone|PPC)/',$_SERVER['HTTP_USER_AGENT']);
}
function &getInstance()
{
static $instance = null;
if($instnace == null)
{
$instance = new smartphoneXE();
return $instance;
function haveSmartphoneModule($module) {
return $oModule =& getModule($module, 'smartphone') && method_exists($oModule,'procSmartPhone');
}
function smartphoneXE($oModule, $module_info, $output) {
$this->oModule = $oModule;
$this->module_info = $module_info;
if(!$this->module_info->menu_srl) {
$oMenuModel = &getAdminModel('menu');
$menus = $oMenuModel->getMenus($this->module_info->site_srl);
if($menus[0]) $this->module_info->menu_srl = $menus[0]->menu_srl;
}
if($this->module_info->menu_srl) {
$menu_cache_file = sprintf(_XE_PATH_.'files/cache/menu/%d.php', $this->module_info->menu_srl);
if(!file_exists($menu_cache_file)) return;
@include $menu_cache_file;
Context::addHtmlHeader(sprintf('<script type="text/javascript"> var xeMenus = { %s } </script>', $this->_getAllItems($menu->list)));
$this->_setParentUrl($menu->list);
}
}
function setModuleInstance(&$oModule) {
if($this->oModule) return;
$this->oModule = $oModule;
function _setParentUrl($menu_list) {
if(!count($menu_list)) return;
foreach($menu_list as $key => $val) {
if(!$val['text']) continue;
if($val['list'] && $this->_setParentUrl($val['list'])) {
$href = $val['href'];
if(preg_match('/^[a-z0-9_]+$/i',$val['url'])) $href = getUrl('','mid',$val['url'],'smartphone','true');
else $href = $val['href'];
$this->setParentUrl($href);
return false;
}
if($val['url']==Context::get('mid')) return true;
}
return false;
}
function _getAllItems($menu_list, $depth=0) {
if(!count($menu_list)) return;
$output = '';
foreach($menu_list as $menu_item)
{
if($output) $output .= ",";
$key = $menu_item['text'];
$val = $menu_item['url'];
if($menu_item['list']) {
$childs = '{'.$this->_getAllItems($menu_item['list'], $depth+1).'}';
} else {
$childs = 'null';
}
$output .= sprintf('"%s" : { "url" : "%s", "childs" : %s } ',str_replace('"','\"',$key), str_replace('"','\"',$val), $childs);
}
return $output;
}
function procSmartPhone($msg = null) {
if(preg_match('/(iPopd|iPhone)/',$_SERVER['HTTP_USER_AGENT'])) {
Context::addHtmlHeader('<meta name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>');
} else if(preg_match('/PPC/',$_SERVER['HTTP_USER_AGENT'])) {
Context::addHtmlHeader('<meta name="viewport" content="width=240; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>');
}
if(is_a($this->output, 'Object') || is_subclass_of($this->output, 'Object') || $msg) {
if($msg) $this->setContent(Context::getLang($msg));
else $this->setContent($this->output->getMessage());
return;
}
if($this->haveSmartphoneModule($this->module_info->module)) {
$oSmartPhoneModule =& getModule($this->module_info->module, 'smartphone');
$vars = get_object_vars($this->oModule);
if(count($vars)) foreach($vars as $key => $val) $oSmartPhoneModule->{$key} = $val;
$oSmartPhoneModule->procSmartPhone($this);
} else {
switch(Context::getLangType()) {
case 'ko' :
$msg = '스마트폰을 지원하지 않는 모듈입니다';
break;
case 'jp' :
$msg = 'このモジュールをサポートしていません。';
break;
case 'zh-TW' :
$msg = '該模塊不支持。';
break;
case 'zh-CN' :
$msg = '该模块不支持。';
break;
default :
$msg = 'This module is not supported.';
break;
}
$this->setContent($msg);
}
}
function setContent($content) {
$this->content = $content;
}
function setModuleInfo(&$module_info)
{
if($this->module_info) return;
$this->module_info = $module_info;
function setParentUrl($url) {
$this->parent_url = $url;
}
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 setPrevUrl($url) {
$this->prev_url = $url;
}
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 setNextUrl($url) {
$this->next_url = $url;
}
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();
}
}
?>

View file

@ -1,12 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon version="0.2">
<title xml:lang="ko">SmartphonePhone XE 애드온</title>
<title xml:lang="zh-TW">SmartphonePhone XE</title>
<title xml:lang="jp">SmartphonePhone XE アドオン</title>
<description xml:lang="ko">
IPhone (touch) 등, smartphone 에서 접속시 최적화된 화면을 보여줍니다.
</description>
<description xml:lang="zh-TW">
以 IPhone (touch) 和 smartphone 瀏覽時會以最適當的畫面顯示。
</description>
<description xml:lang="jp">
IPhone(touch)など、スマートフォンからアクセスした時、最適化されたインターフェースで表示させます。
</description>
<version>0.1</version>
<date>2009-04-20</date>
<author email_address="haneul0318@gmail.com" link="http://seungyeop.kr">
<name xml:lang="ko">haneul</name>
<name xml:lang="zh-TW">haneul</name>
<name xml:lang="jp">haneul</name>
</author>
</addon>

View file

@ -1,21 +0,0 @@
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.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 816 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -1,486 +0,0 @@
/* 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;
}

View file

@ -1,383 +0,0 @@
/*
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); }
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 978 B

View file

@ -3,20 +3,29 @@
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;
if(!smartphoneXE::isFromSmartPhone()) return;
if($called_position == 'after_module_proc' ) {
$oSmartphoneXE = new smartphoneXE($this, $this->module_info, $output);
$oSmartphoneXE->procSmartPhone();
Context::set('layout', 'none');
Context::set('smart_content', $oSmartphoneXE->content);
Context::set('parent_url', $oSmartphoneXE->parent_url);
Context::set('prev_url', $oSmartphoneXE->prev_url);
Context::set('next_url', $oSmartphoneXE->next_url);
$this->setTemplatePath('addons/smartphone/tpl');
$this->setTemplateFile('layout');
} elseif($called_position == 'before_module_proc' && !$this->grant->access) {
$oSmartphoneXE = new smartphoneXE($this, $this->module_info, $output);
$oSmartphoneXE->procSmartPhone('msg_not_permitted_act');
Context::set('layout', 'none');
Context::set('smart_content', $oSmartphoneXE->content);
Context::set('parent_url', $oSmartphoneXE->parent_url);
Context::set('prev_url', $oSmartphoneXE->prev_url);
Context::set('next_url', $oSmartphoneXE->next_url);
$this->setTemplatePath('addons/smartphone/tpl');
$this->setTemplateFile('layout');
}
debugPrint("here");
$oSmartphoneXE = &smartphoneXE::getInstance();
$oSmartphoneXE->setModuleInfo($this->module_info);
$oSmartphoneXE->setModuleInstance($this);
$oSmartphoneXE->display();
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 259 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 117 B

After

Width:  |  Height:  |  Size: 117 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

View file

@ -1,55 +1,21 @@
<!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;"/>
<!--%import("./smartphone.css")-->
<!--%import("./smartphone.js")-->
<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>
<div class="smartPhoneTitleBar">
<h1><a href="#" onclick="showXEMenu(); return false;">{Context::getBrowserTitle()}</a></h1>
</div>
<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>
<div class="smartPhoneContentArea">
{$smart_content}
</div>
<div class="smartPhoneToolBar">
<!--@if($parent_url)-->
<a href="{$parent_url}"><img src="./images/btnTop.png" class="smartPhoneBtn" alt="Top" /></a>
<!--@end-->
<!--@if($prev_url)--><a href="{$prev_url}"><img src="./images/btnPrev.png" class="smartPhoneBtn" alt="Prev" /></a><!--@end-->
<!--@if($next_url)--><a href="{$next_url}"><img src="./images/btnNext.png" class="smartPhoneBtn" alt="Next" /></a><!--@end-->
<a href="#" onclick="showXEMenu();"><img src="./images/btnMenu.png" class="smartPhoneBtn" alt="Menu" /></a>
</div>

View file

@ -0,0 +1,189 @@
body {
margin: 0;
padding:0;
font-family: Helvetica;
background: #E6E6E6 url(./images/pinstripes.png);
color: #000000;
overflow-x: hidden;
-webkit-user-select: none;
-webkit-text-size-adjust: none;
width:100%;
}
.smartPhoneTitleBar {
border-bottom: 1px solid #2d3642;
border-top: 1px solid #6d84a2;
height: 43px;
overflow:hidden;
background:#485567 url(./images/titlebar.png) repeat-x left top;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.smartPhoneTitleBar h1 {
white-space:nowrap;
overflow: hidden;
color: #FFFFFF;
font-size: 20px;
font-weight: bold;
padding:8px 10px;
margin:0;
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
text-overflow: ellipsis;
}
.smartPhoneTitleBar h1 a {
text-decoration:none;
color:#fff;
}
.smartPhoneContent {
z-index:450;
border: 1px solid #999999;
padding:10px;
background-color:#fff;
margin:10px;
box-sizing: border-box;
-webkit-box-sizing: border-box;
-webkit-border-radius: 8px;
}
.smartPhoneToolBar {
z-index:9999;
width:100%;
border-bottom: 1px solid #2d3642;
border-top: 1px solid #6d84a2;
height: 43px;
overflow:hidden;
background:#485567 url(./images/titlebar.png) repeat-x left top;
white-space:nowrap;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.smartPhoneBtn {
width:43px;
height:43px;
margin-left:8px;
border:0;
}
.smartPhoneContent div.info {
font-size:13px;
padding-bottom:10px;
border-bottom:1px solid #444;
overflow:hidden;
*zoom:1;
}
.smartPhoneContent div.info .author {
font-weight:bold;
float:left;
}
.smartPhoneContent div.info .date {
font-size:11px;
float:right;
}
.smartPhoneContent div.link {
margin-top:10px;
border-top:1px solid #444;
}
.smartPhoneContent div.link a {
display:block;
padding:10px 0;
font-size:15px;
text-decoration:underline;
font-weight:bold;
color:#000;
}
.smartPhoneList {
background-color:#fff;
z-index:500;
padding:0;
margin:0;
}
.smartPhoneList ul {
padding:0;
margin:0;
left:0;
right:0;
top:43px;
}
.smartPhoneList li {
list-style:none;
font-size:18px;
font-weight:bold;
padding:10px 20px 10px 10px;
border-bottom:1px solid #ccc;
}
.smartPhoneList li a {
text-shadow: rgba(0, 0, 0, 0.4) 0px -1px 0;
text-overflow: ellipsis;
color:#000;
text-decoration:none;
display:block;
width:100%;
}
.smartPhoneList li.title {
position: relative;
top: -1px;
margin-bottom: -2px;
border-top: 1px solid #7d7d7d;
border-bottom: 1px solid #999999;
padding: 5px 10px;
background: url(./images/listGroup.png) repeat-x;
font-size: 12px;
font-weight: bold;
text-shadow: rgba(0, 0, 0, 0.4) 0 1px 0;
color: #FFFFFF;
}
.smartPhoneList li.selected {
background-color:#ddd;
}
.smartPhoneList li.selected * {
color:#fff;
}
.smartPhoneList li a {
background:transparent url(./images/listArrow.png) no-repeat scroll right center;
padding-right:30px;
}
.smartPhoneList li.noArrow a {
background:none !important;
}
.smartPhoneList li.item img.thumbnail {
margin:0 10px 0 0;
padding:0;
}
.smartPhoneList li.item span.title, .smartPhoneList li.item span.title div {
font-size:15px;
font-weight:normal;
display:block;
}
.smartPhoneList li.item span.info {
font-size:10px;
font-weight:normal;
color:#bbb;
display:block;
margin-top:2px;
letter-spacing:0px;
}

View file

@ -0,0 +1,101 @@
var xeSmartMenu = null;
var xeSmartUpperMenu = null;
function showXEMenu() {
if(!xeSmartMenu) {
xeSmartMenu = jQuery('<div>')
.attr("className","smartPhoneList")
.css('display','none')
.css('backgroundColor','#fff');
jQuery(document.body).append(xeSmartMenu);
xeSmartMenu.slideIn = function(step) {
var w = this.width() + Math.pow(step,2)*30;
if(w>jQuery(document).width()) {
this.css({left:0,right:0,display:'block'});
this.width('');
jQuery('.smartPhoneContentArea').css("display","none");
} else {
this.width(w);
var o = parseInt(jQuery(document).width/w,10)/5;
if(o>1) o = 1;
setTimeout(function() { xeSmartMenu.slideIn(step+1); }, 50);
}
}
xeSmartMenu.slideOut = function(step) {
var l = parseInt(this.css('left'),10) + Math.pow(step,2)*30;
if(l>jQuery('.smartPhoneContent').width()) {
this.css({display:'none','left':''});
jQuery('.smartPhoneContentArea').css("display","block");
} else {
var o = parseInt(jQuery(document).width/l,10)/5;
if(o<0) o = 0;
this.css('left',l+'px');
setTimeout(function() { xeSmartMenu.slideOut(step+1); }, 50);
}
}
}
if(xeSmartMenu.css('display')=='none' && typeof(xeMenus)!='undefined') {
xeSmartUpperMenu = null;
var menu = findSmartNode(xeMenus);
if(!menu) menu = xeMenus;
var html = '<ul>';
if(location.href.getQuery('mid')) html += '<li><a href="'+current_url.setQuery('mid','')+'">&lt; go Home &gt;</a></li>';
if(xeSmartUpperMenu) html += '<li><a href="'+current_url.setQuery('mid',xeSmartUpperMenu.url)+'">&lt; go Upper &gt;</a></li>';
for(var text in menu) {
if(!text) continue;
var url = menu[text].url;
var href = '';
if(/^[a-z0-9_]+$/i.test(url)) {
href = request_uri.setQuery('mid',url);
if(href.indexOf('?')>-1) href += '&smartphone=true';
else href += '?smartphone=true';
}
else href = url;
if(typeof(xeVid)!='undefined') {
if(href.indexOf('?')>-1) href += '&vid='+xeVid;
else href += '?vid='+xeVid;
}
html += '<li><a href="'+href+'">'+text+'</a></li>';
}
html += '</ul>';
jQuery(xeSmartMenu).html(html);
jQuery(xeSmartMenu).css({
width:'1px',
right:'0',
top:'43px',
display:'block',
position:'absolute',
padding:0
});
xeSmartMenu.slideIn(0);
} else if(location.href.getQuery('mid')||location.href.getQuery('document_srl')) {
xeSmartMenu.slideOut(0);
}
}
function findSmartNode(nodes) {
var mid = current_url.getQuery('mid');
if(typeof(mid)=='undefined'||!mid) return nodes;
for(var text in nodes) {
if(!text) continue;
if(nodes[text].childs) {
var n = findSmartNode(nodes[text].childs);
if(n) {
xeSmartUpperMenu = nodes[text];
return n;
}
}
if(nodes[text].url == mid) {
if(nodes[text].childs) return nodes[text].childs;
return nodes;
}
}
return null;
}

View file

@ -860,6 +860,10 @@
return sprintf('%s%s/%s',$rpath,$get_vars['mid'],$get_vars['document_srl']);
case 'entry.mid' :
return sprintf('%s%s/entry/%s',$rpath,$get_vars['mid'],$get_vars['entry']);
case 'act.document_srl.key' :
if($get_vars['act']=='trackback') return sprintf('%s%s/%s/%s', $rpath,$get_vars['document_srl'],$get_vars['key'],$get_vars['act']);
break;
}
}
@ -918,10 +922,18 @@
if(Context::get("_https_port") && Context::get("_https_port") != 443) {
$url_info['port'] = Context::get("_https_port");
}
else
{
unset($url_info['port']);
}
} else {
if(Context::get("_http_port") && Context::get("_http_port") != 80) {
$url_info['port'] = Context::get("_http_port");
}
else
{
unset($url_info['port']);
}
}
$url[$ssl_mode][$domain_key] = sprintf("%s://%s%s%s",$use_ssl?'https':$url_info['scheme'], $url_info['host'], $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$url_info['path']);
@ -1088,6 +1100,18 @@
}
}
/**
* @brief 모든 JS File을 제거
**/
function unloadAllJsFiles() {
$oContext = &Context::getInstance();
return $oContext->_unloadAllJsFiles();
}
function _unloadAllJsFiles() {
$this->js_files = array();
}
/**
* @brief javascript filter 추가
**/
@ -1172,6 +1196,18 @@
}
}
/**
* @brief 모든 CSS File을 제거
**/
function unloadAllCSSFiles() {
$oContext = &Context::getInstance();
return $oContext->_unloadAllCSSFiles();
}
function _unloadAllCSSFiles() {
$this->css_files = array();
}
/**
* @brief CSS file 목록 return
**/

View file

@ -183,7 +183,7 @@
function getNextSequence() {
$query = sprintf("insert into `%ssequence` (seq) values ('0')", $this->prefix);
$this->_query($query);
$sequence = mysql_insert_id();
$sequence = mysql_insert_id($this->fd);
if($sequence % 10000 == 0) {
$query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence);
$this->_query($query);

View file

@ -193,7 +193,7 @@
function getNextSequence() {
$query = sprintf("insert into `%ssequence` (seq) values ('0')", $this->prefix);
$this->_query($query);
$sequence = mysql_insert_id();
$sequence = mysql_insert_id($this->fd);
if($sequence % 10000 == 0) {
$query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence);
$this->_query($query);

View file

@ -101,7 +101,7 @@
$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);
$output = preg_replace_callback('/<!--Meta:([a-z0-9\_\/\.\@]+)-->/is', array($this,'transMeta'), $output);
// rewrite module 사용시 생기는 상대경로에 대한 처리를 함
if(Context::isAllowRewrite()) {
@ -117,6 +117,9 @@
if(__DEBUG__==3) $GLOBALS['__trans_content_elapsed__'] = getMicroTime()-$start;
// 불필요한 정보 제거
$output = preg_replace('/member\_\-([0-9]+)/s','member_0',$output);
// 최종 레이아웃 변환
Context::set('content', $output);
$output = $oTemplate->compile('./common/tpl', 'common_layout');
@ -166,9 +169,7 @@
$variables = $oModule->getVariables();
$variables['error'] = $oModule->getError();
$variables['message'] = $oModule->getMessage();
//if(function_exists('json_encode')) return json_encode($variables);
//else return json_encode2($variables);
$json = str_replace("\r\n",'\n',json_encode2($variables));
$json = preg_replace("(\r\n|\n)",'\n',json_encode2($variables));
return $json;
}

View file

@ -45,9 +45,14 @@
}
function setContent($content) {
$content = preg_replace_callback('/<img([^>]+)>/i',array($this,'replaceResourceRealPath'), $content);
$this->content = $content;
}
function replaceResourceRealPath($matches) {
return preg_replace('/src=(["\']?)files/i','src=$1'.Context::getRequestUri().'files', $matches[0]);
}
function getPlainContent() {
return chunk_split(base64_encode(str_replace(array("<",">","&"), array("&lt;","&gt;","&amp;"), $this->content)));
}

View file

@ -112,7 +112,7 @@
// 모듈을 여전히(;;) 못 찾고 모듈번호(module_srl)가 있으면 해당 모듈을 구함
// module_srl로 대상 모듈을 찾는 것을 주석 처리함.
if(!$this->module && !$module_info && $this->module_srl) {
if((!$this->module || $this->module != 'admin') && !$module_info && $this->module_srl) {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($this->module_srl);
//if($this->module && $module_info->module != $this->module) unset($module_info);
}
@ -155,17 +155,17 @@
// mid값이 있을 경우 mid값을 세팅
if($this->mid) Context::set('mid', $this->mid, true);
// 현재 모듈의 정보를 세팅
Context::set('current_module_info', $module_info);
// 실제 동작을 하기 전에 trigger 호출
$output = ModuleHandler::triggerCall('display', 'before', $content);
$output = ModuleHandler::triggerCall('moduleHandler.init', 'after', $this->module_info);
if(!$output->toBool()) {
$this->error = $output->getMessage();
return false;
}
// 현재 모듈의 정보를 세팅
Context::set('current_module_info', $this->module_info);
return true;
}
@ -241,6 +241,10 @@
$this->error = 'msg_dbconnect_failed';
}
// 모듈 동작을 마친 후 trigger call
$output = ModuleHandler::triggerCall('moduleHandler.proc', 'after', $oModule);
if(!$output->toBool()) $this->error = $output->getMessage();
// HTML call 이면 message view 객체 이용하도록
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) {
// 에러가 발생하였을시 처리
@ -296,8 +300,6 @@
// 레이아웃이 수정되었을 경우 수정본을 지정
$edited_layout = $oLayoutModel->getUserLayoutHtml($layout_info->layout_srl);
// $edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_info->layout_srl);
// Context::addCSSFile($edited_layout_css);
if(file_exists($edited_layout)) $oModule->setEditedLayoutFile($edited_layout);
}
}

View file

@ -239,8 +239,7 @@
$addon_file = $oAddonController->getCacheFilePath();
if(file_exists($addon_file)) @include($addon_file);
// action 실행
if(method_exists($this, $this->act)) {
if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act)) {
// 권한 체크
if(!$this->grant->access) return $this->stop("msg_not_permitted_act");
@ -275,7 +274,7 @@
if(!$forward) $forward = $oModuleModel->getActionForward($this->act);
// 찾아진 forward 모듈이 있으면 실행
if($forward->module && $forward->type && $forward->act) {
if($forward->module && $forward->type && $forward->act && $forward->act == $this->act) {
$kind = strpos(strtolower($forward->act),'admin')!==false?'admin':'';
@ -288,7 +287,7 @@
$oModule->setModuleInfo($this->module_info, $xml_info);
if(method_exists($oModule, $forward->act)) {
if(isset($xml_info->action->{$forward->act}) && method_exists($oModule, $forward->act)) {
$output = $oModule->{$forward->act}();
} else {
return $this->stop("msg_module_is_not_exists");
@ -299,11 +298,13 @@
$this->setTemplatePath($oModule->getTemplatePath());
$this->setTemplateFile($oModule->getTemplateFile());
if($oModule->getLayoutFile()) $this->setLayoutFile($oModule->getLayoutFile());
$this->adds($oModule->getVariables());
// forward 모듈을 찾지 못했다면 원 모듈의 default index action을 실행
} else if($this->xml_info->default_index_act && method_exists($this, $this->xml_info->default_index_act)) {
Context::set('act',$this->act = $this->xml_info->default_index_act);
$output = $this->{$this->xml_info->default_index_act}();
} else {
return false;

View file

@ -138,11 +138,33 @@
**/
function _compileVarToContext($matches) {
$str = trim(substr($matches[0],1,strlen($matches[0])-2));
return '<?php print('.preg_replace('/\$([a-zA-Z0-9\_\-\>]+)/i','$__Context->\\1', $str).');?>';
if(!$str) return $matches[0];
if(!in_array(substr($str,0,1),array('(','$','\'','"'))) {
if(preg_match('/^([^\( \.]+)(\(| \.)/i',$str,$m)) {
$func = trim($m[1]);
if(strpos($func,'::')===false) {
if(!function_exists($func)) {
return $matches[0];
}
} else {
list($class, $method) = explode('::',$func);
if(!class_exists($class) || !in_array($method, get_class_methods($class))) {
// 서버 환경에 따라서 class, method가 대소문자 구별을 할때와 하지 않을때가 있음
list($class, $method) = explode('::',strtolower($func));
if(!class_exists($class) || !in_array($method, get_class_methods($class))) {
return $matches[0];
}
}
}
} else {
if(!defined($str)) return $matches[0];
}
}
return '<?php @print('.preg_replace('/\$([a-zA-Z0-9\_\-\>]+)/i','$__Context->\\1', $str).');?>';
}
/**
* @brief {$와 } 안의 $... 변수를 Context::get(...) 으로 변경
* @brief 이미지의 경로를 변경
**/
function _compileImgPath($matches) {
static $real_path = null;
@ -290,18 +312,14 @@
**/
function _compileImportCode($matches) {
// 현재 tpl 파일의 위치를 구해서 $base_path에 저장하여 적용하려는 xml file을 찾음
//$base_path = dirname($this->tpl_file).'/';
$base_path = $this->tpl_path;
$given_file = trim($matches[1]);
if(!$given_file) return;
if(isset($matches[3]))
$optimized = strtolower(trim($matches[3]));
if(isset($matches[3])) $optimized = strtolower(trim($matches[3]));
if(!$optimized) $optimized = 'true';
if(isset($matches[5]))
$media = trim($matches[5]);
if(isset($matches[5])) $media = trim($matches[5]);
if(!$media) $media = 'all';
if(isset($matches[7]))
$targetie = trim($matches[7]);
if(isset($matches[7])) $targetie = trim($matches[7]);
if(!$targetie) $targetie = '';
else $optimized = 'false';
@ -313,10 +331,11 @@
// load lang이 아니라면 xml, css, js파일을 읽도록 시도
} else {
$filename = sprintf("%s%s",$base_path, $given_file);
if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file);
else $source_filename = $given_file;
// path와 파일이름을 구함
$tmp_arr = explode("/",$filename);
$tmp_arr = explode("/",$source_filename);
$filename = array_pop($tmp_arr);
$base_path = implode("/",$tmp_arr)."/";
@ -347,18 +366,26 @@
break;
// css file
case 'css' :
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::addCSSFile("%s%s", %s, "%s", "%s"); ?>', $base_path, $filename, $optimized, $media, $targetie);
if(preg_match('/^(http|\/)/i',$source_filename)) {
$output = sprintf('<?php Context::addCSSFile("%s", %s, "%s", "%s"); ?>', $source_filename, 'false', $media, $targetie);
} else {
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::addCSSFile("%s%s", %s, "%s", "%s"); ?>', $base_path, $filename, $optimized, $media, $targetie);
}
break;
// js file
case 'js' :
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::addJsFile("%s%s", %s, "%s"); ?>', $base_path, $filename, $optimized, $targetie);
if(preg_match('/^(http|\/)/i',$source_filename)) {
$output = sprintf('<?php Context::addJsFile("%s", %s, "%s"); ?>', $source_filename, 'false', $targetie);
} else {
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::addJsFile("%s%s", %s, "%s"); ?>', $base_path, $filename, $optimized, $targetie);
}
break;
}
}
$output = '<!--Meta:'.$meta_file.'-->'.$output;
if($meta_file) $output = '<!--Meta:'.$meta_file.'-->'.$output;
return $output;
}
@ -377,25 +404,22 @@
**/
function _compileUnloadCode($matches) {
// 현재 tpl 파일의 위치를 구해서 $base_path에 저장하여 적용하려는 xml file을 찾음
//$base_path = dirname($this->tpl_file).'/';
$base_path = $this->tpl_path;
$given_file = trim($matches[1]);
if(!$given_file) return;
if(isset($matches[3]))
$optimized = strtolower(trim($matches[3]));
if(isset($matches[3])) $optimized = strtolower(trim($matches[3]));
if(!$optimized) $optimized = 'true';
if(isset($matches[5]))
$media = trim($matches[5]);
if(isset($matches[5])) $media = trim($matches[5]);
if(!$media) $media = 'all';
if(isset($matches[7]))
$targetie = trim($matches[7]);
if(isset($matches[7])) $targetie = trim($matches[7]);
if(!$targetie) $targetie = '';
else $optimized = 'false';
$filename = sprintf("%s%s",$base_path, $given_file);
if(substr($given_file,0,1)!='/') $source_filename = sprintf("%s%s",$base_path, $given_file);
else $source_filename = $given_file;
// path와 파일이름을 구함
$tmp_arr = explode("/",$filename);
$tmp_arr = explode("/",$source_filename);
$filename = array_pop($tmp_arr);
$base_path = implode("/",$tmp_arr)."/";
@ -408,13 +432,21 @@
switch($ext) {
// css file
case 'css' :
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::unloadCSSFile("%s%s", %s, "%s", "%s"); ?>', $base_path, $filename, $optimized, $media, $targetie);
if(preg_match('/^(http|\/)/i',$source_filename)) {
$output = sprintf('<?php Context::unloadCSSFile("%s", %s, "%s", "%s"); ?>', $source_filename, 'false', $media, $targetie);
} else {
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::unloadCSSFile("%s%s", %s, "%s", "%s"); ?>', $base_path, $filename, $optimized, $media, $targetie);
}
break;
// js file
case 'js' :
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::unloadJsFile("%s%s", %s, "%s"); ?>', $base_path, $filename, $optimized, $targetie);
if(preg_match('/^(http|\/)/i',$source_filename)) {
$output = sprintf('<?php Context::unloadJsFile("%s", %s, "%s"); ?>', $source_filename, 'false', $targetie);
} else {
$meta_file = sprintf('%s%s', $base_path, $filename);
$output = sprintf('<?php Context::unloadJsFile("%s%s", %s, "%s"); ?>', $base_path, $filename, $optimized, $targetie);
}
break;
}

View file

@ -6,55 +6,35 @@ a.button,
a.button span { position:relative; display:inline-block; text-decoration:none !important; background:url(../tpl/images/buttonWhite.gif) no-repeat; cursor:pointer; white-space:nowrap; vertical-align:middle; *vertical-align:top;}
a.button { padding:0; background-position:left top; overflow:visible;}
a.button span { left:2px; padding:6px 10px 5px 8px; color:#000; font:12px/12px Sans-serif; background-position:right top;}
a.button, x:-moz-any-link { font:0/23px Sans-serif; padding:12px 0; top:1px;} /* Firefox 2 Fix */
a.button, x:-moz-any-link, x:default { padding:0; top:0;} /* Firefox 2 Fix */
/* Large Size */
a.button.large { background-position:left -30px; }
a.button.large span { padding:7px 10px 6px 8px; font:16px/16px Sans-serif; background-position:right -30px;}
a.button.large, x:-moz-any-link { font:0/29px Sans-serif; padding:15px 0;} /* Firefox 2 Fix */
a.button.large, x:-moz-any-link, x:default { padding:0;} /* Firefox 2 Fix */
/* xLarge Size */
a.button.xLarge { background-position:left -65px; }
a.button.xLarge span { padding:8px 10px 7px 8px; font:20px/20px Sans-serif; background-position:right -65px;}
a.button.xLarge, x:-moz-any-link { font:0/35px Sans-serif; padding:18px 0;} /* Firefox 2 Fix */
a.button.xLarge, x:-moz-any-link, x:default { padding:0;} /* Firefox 2 Fix */
/* Small Size */
a.button.small { background-position:left -107px; }
a.button.small span { padding:4px 6px 3px 4px; font:11px/11px Sans-serif; background-position:right -107px;}
a.button.small, x:-moz-any-link { font:0/18px Sans-serif; padding:9px 0;} /* Firefox 2 Fix */
a.button.small, x:-moz-any-link, x:default { padding:0;} /* Firefox 2 Fix */
/* Control Button + Submit Button */
span.button,
span.button button,
span.button input { position:relative; margin:0; display:inline-block; border:0; font:12px Sans-serif; white-space:nowrap; background:url(../tpl/images/buttonWhite.gif) no-repeat; vertical-align:middle;}
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; line-height:24px; background-position:right top; cursor:pointer; *overflow:visible;}
/* 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 */
span.button.large, x:-moz-any-link, x:default{ padding:0;} /* Firefox 2 Fix */
span.button.large button,
span.button.large input { height:30px; *top:0; _top:-1px; padding:0 10px 0 8px; *padding:0 5px 0 3px; font:16px/30px Sans-serif; background-position:right -30px;}
span.button.large input { height:30px; *top:0; _top:-1px; padding:0 10px 0 8px; font:16px/30px Sans-serif; background-position:right -30px;}
/* xLarge Size */
span.button.xLarge { background-position:left -65px;}
span.button.xLarge, x:-moz-any-link{ font:0/35px Sans-serif; padding:17px 0;} /* Firefox 2 Fix */
span.button.xLarge, x:-moz-any-link, x:default{ padding:0;} /* Firefox 2 Fix */
span.button.xLarge button,
span.button.xLarge input { height:35px; padding:0 10px 0 8px; *padding:0 5px 0 3px; font:20px/36px Sans-serif; background-position:right -65px;}
span.button.xLarge input { height:35px; padding:0 10px 0 8px; font:20px/36px Sans-serif; background-position:right -65px;}
/* Small Size */
span.button.small { background-position:left -107px;}
span.button.small, x:-moz-any-link{ font:0/18px Sans-serif; padding:9px 0;} /* Firefox 2 Fix */
span.button.small, x:-moz-any-link, x:default{ padding:0;} /* Firefox 2 Fix */
span.button.small button,
span.button.small input { height:18px; *top:0; _top:-1px; padding:0 6px 0 4px; *padding:0 3px 0 2px; font:11px/18px Sans-serif; background-position:right -107px;}
span.button.small button, x:-moz-any-link,
span.button.small input, x:-moz-any-link{ top:-1px;} /* Firefox 2 Fix */
span.button.small button, x:-moz-any-link, x:default,
span.button.small input, x:-moz-any-link, x:default{ top:0;} /* Firefox 2 Fix */
span.button.small input { height:18px; *top:0; _top:-1px; padding:0 6px 0 4px; font:11px/18px Sans-serif; background-position:right -107px;}
/* Strong Button */
a.button.strong *,

View file

@ -73,7 +73,7 @@ a.bold { font-weight:bold; }
.folder_closer { display: none; }
.folder_area { display: none; }
.xe_content { line-height:1.6; }
.xe_content { line-height:1.6; overflow:hidden; }
.zbxe_widget_output { background:url(../tpl/images/widget_text.gif) no-repeat center bottom; display:block;}

View file

@ -517,7 +517,7 @@ function setFixedPopupSize() {
bodyObj.css({paddingRight:30});
var w = jQuery("#popup_content").width();
w = w< 400 ? 400 : w;
w = w< 600 ? 600 : w;
var h = jQuery("#popup_content").height();
if(h != _popupHeight) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 B

View file

@ -0,0 +1,2 @@
ui.calendar.js
ui.calendar.css

View file

@ -0,0 +1,30 @@
/* Calendar */
.ui-calendar {display:none; padding:25px 15px 15px 15px; position:absolute; border:2px solid #737373; background:#fff; color:#333;}
.ui-calendar .close{ position:absolute; top:10px; right:15px; width:17px; height:17px; border:0; padding:0; background:url(./img/buttonCloseLayerX.gif) no-repeat center center; cursor:pointer;}
.ui-calendar .close span{ position:absolute; width:0; height:0; font-size:0; line-height:0; overflow:hidden; z-index:-1; visibility:hidden;}
.ui-calendar table{ border:0; border-spacing:0; _width:200px;}
.ui-calendar caption{ font-weight:bold; text-align:center; position:relative;}
.ui-calendar caption span{ display:block; position:relative; padding:10px 0 15px 0; *zoom:1;}
.ui-calendar caption .today{ font-size:11px; border:0; padding:0; border-bottom:1px solid; background:none; cursor:pointer;}
.ui-calendar caption .today span{text-decoration:underline;}
.ui-calendar caption .navi{ position:absolute; top:10px; border:0; padding:0; width:17px; height:18px; background-color:transparent; background-image:url(./img/buttonPaginate.gif); background-repeat:no-repeat; cursor:pointer;}
.ui-calendar caption .navi span{ position:absolute; width:0; height:0; overflow:hidden; font-size:0; line-height:0; z-index:-1; visibility:hidden;}
.ui-calendar caption .navi.prev{ left:0; background-position:left top;}
.ui-calendar caption .navi.next{ right:0; background-position:right top;}
.ui-calendar th,
.ui-calendar td{ border:0; text-align:center;}
.ui-calendar th{ color:#666; background:#f2f2f2; padding:3px 8px;}
.ui-calendar td{ font-size:11px; padding:3px 8px;}
.ui-calendar td button{ padding:0; border:0; background:none; cursor:pointer; width:20px; font-size:11px; font-family:Tahoma, Sans-serif;}
.ui-calendar td button.today{ font-weight:bold;}
.ui-calendar td button.book,
.ui-calendar td button.active,
.ui-calendar tr.active button{ background:#ff4747; color:#fff;}
.ui-calendar .sun,
.ui-calendar .sun button{ color:#ff1a1a;}
.ui-calendar table.month{ border-top:1px solid #f2f2f2; border-left:1px solid #f2f2f2;}
.ui-calendar table.month td{ border-right:1px solid #f2f2f2; border-bottom:1px solid #f2f2f2;}
.ui-calendar table.month td button{ width:50px; color:#bababa;}
.ui-calendar table.month td button.past{ color:#333;}
.ui-calendar table.month td button.active{ color:#fff;}

View file

@ -0,0 +1,358 @@
/**
* @brief XE Calendar
* @author gony (http://mygony.com)
*
* 사용법
*
**/
(function($){
if (!$.ui) $.ui = {};
$.extend($.ui, { calendar: { version:'0.3' } });
var PROP_NAME = 'calendar';
var index = 0;
var calendars = {};
var template = {calendar:'',month:''};
function Calendar() {
}
$.extend(Calendar.prototype, {
_activeCalendar : null,
_getuid : function(obj) {
var uid = obj.attr('class').match(/ui-calendar-(\d+-\d+)/);
if (!uid) return -1;
return uid[1];
},
_show : function(obj) {
if (this._activeCalendar) this._hide(this._activeCalendar);
// disabled?
if (obj.hasClass('ui-calendar-disabled')) return;
// Active Calendar
this._activeCalendar = obj.show(300);
},
_hide : function(obj) {
if (this._activeCalendar && this._activeCalendar.get(0) == obj.get(0)) this._activeCalendar = null;
obj.hide(300);
},
_toggle : function(obj) {
(obj.css('display' ) == 'none')?this._show(obj):this._hide(obj);
},
_attachCalendar : function(obj, options) {
if ((obj=$(obj)).hasClass('ui-calendar')) return;
var uid = $.calendar.uuid+'-'+(index++);
var c = calendars[uid] = {};
// uid 추가
obj.addClass('ui-calendar-'+uid).mousedown(function(){return false});
// default options
c.options = $.extend({
type : 'day',
activeDate : ''
}, options||{});
c.lang = $.extend({
weekdays : 'Sun,Mon,Tue,Wed,Thu,Fri,Sat',
today : 'Today',
prevmonth : 'Prev Month',
nextmonth : 'Next Month',
close : 'Close'
}, options.lang||{});
c.lang.weekdays = c.lang.weekdays.split(',');
// 날짜 설정
var d;
if (typeof c.options.activeDate == 'string' && c.options.activeDate) {
var s = c.options.activeDate.split('/');
d = new Date(s[0], s[1]-1, s[2]-0);
} else {
d = new Date();
}
this._setDate(obj, d);
// 토글 버튼
if (c.options.button) {
(c.button=$(c.options.button)).click(function(){ obj.calendar('toggle') });
}
// 클래스 추가
obj.addClass('ui-calendar');
// position 설정한 후, 좌표를 (0,0)으로 변경
var pos = obj.css({position:'absolute',top:0,left:0}).show().offset();
// 버튼의 위치 구해서 좌표 조정
var bpos = c.button.offset();
var dx = bpos.left - pos.left;
var dy = bpos.top - pos.top;
// 좌표 조정 후 레이어 숨김
obj.css({top:(dy+c.button.height())+'px',left:dx+'px'}).hide();
},
_checkExternalClick : function(e) {
if ($.calendar._activeCalendar) $.calendar._hide($.calendar._activeCalendar);
},
_processTemplate : function(tpl, vars) {
tpl = (' '+tpl+' ').split(/[\{\}]/g);
for(var i=0; i < tpl.length; i++) {
if (i%2) {
if (/^[\w\.\[\]]+$/.test(tpl[i])) tpl[i] = 'try{v=vv.'+tpl[i]+'}catch(e){v=""};ret.push(v);';
else if (/^@(\w+)\s+in\s+(\w+)$/.test(tpl[i])) tpl[i] = 'for(i=0,l=vv.'+RegExp.$2+'.length;i<l;i++) { vv.'+RegExp.$1+'=vv.'+RegExp.$2+'[i];';
else if (tpl[i] == '/') tpl[i] = '};';
else tpl[i] = 'ret.push("{'+tpl[i]+'}");';
} else {
tpl[i] = 'ret.push("'+tpl[i].replace(/"/g, '\\"')+'");'; //"
}
}
tpl.push('return ret.join("");');
tpl = (['var i,l,v,t,ret=[];'].concat(tpl)).join('');
return (new Function('vv',tpl))(vars);
},
_draw : function(obj) {
var uid = this._getuid(obj);
if (uid < 0) return;
var cal = calendars[uid];
var tpl = (cal.options.type == 'month')?template.month:template.calendar;
var v = {lang:cal.lang};
// 날짜 관련 변수
v['yyyy'] = cal.date.getFullYear();
v['yy'] = (v['yyyy']+'').substring(2);
v['m'] = cal.date.getMonth() + 1;
v['mm'] = v['m'] > 9?v['m']:'0'+v['m'];
// 연간 달력이 아니라면 이 달의 날짜를 구한다.
if (cal.options.type != 'month') {
// 날짜에 사용할 달력
v['weeks'] = [];
var d = new Date(cal.date.getTime()), w = [];
var last = (v.m!=2)? (v.m%2?31:30) : ((new Date(v.yyyy,v.m-1,29)).getMonth()==v.m?29:28); // 마지막 날
d.setDate(1); // 1일로 설정 후 1일의 요일을 가져온다.
var start = d.getDay(), end = last+start;
for(var i=0,len=end+(7-(end%7||7));i<len;i++) {
if (i%7 == 0) v['weeks'].push(w=[]);
if (i < start || i >= end) w.push('&nbsp;');
else w.push('<button type="button" class="day'+v.yyyy+'-'+v.m+'-'+(i+1-start)+'">'+(i+1-start)+'</button>');
}
}
// 템플릿 처리
tpl = this._processTemplate(tpl, v);
obj.html(tpl);
// 선택한 날짜
if (cal.options.type == 'month') {
} else {
var t = new Date();
obj.find('td>button.day'+t.getFullYear()+'-'+(t.getMonth()+1)+'-'+t.getDate()).addClass('today');
t = cal.activeDate;
obj.find('td>button.day'+t.getFullYear()+'-'+(t.getMonth()+1)+'-'+t.getDate()).addClass('active');
}
// 이벤트 핸들러
obj.find('button.close').click(function(){ $.calendar._hide(obj); });
obj.find('button.today').click(function(){ $.calendar._moveToday(obj); });
if (cal.options.type == 'month') {
obj.find('button.prev').click(function(){ $.calendar._prevYear(obj) });
obj.find('button.next').click(function(){ $.calendar._nextYear(obj) });
} else {
obj.find('button.prev').click(function(){ $.calendar._prevMonth(obj) });
obj.find('button.next').click(function(){ $.calendar._nextMonth(obj) });
}
obj.find('td>button').click(function(){ $.calendar._selectDate(obj, $(this)) });
},
_selectDate : function(obj, btn) {
var cal = calendars[ this._getuid(obj) ];
var date = btn.attr('class').match(/day([\d\-]+)/);
if (!date) return;
date = date[1].split('-');
var ad = cal.activeDate;
ad.setFullYear(date[0]-0);
ad.setMonth(date[1]-1);
ad.setDate(date[2]-0);
this._setDate(obj, ad);
},
_setDate : function(obj, newDate) {
var uid = this._getuid(obj);
if (uid < 0) return null;
if (!newDate || !(newDate instanceof Date)) newDate = new Date();
var cal = calendars[uid];
cal.activeDate = new Date(newDate.getTime());
cal.date = new Date(newDate.getTime());
this._draw(obj);
if ($.isFunction(cal.options.select) && obj.hasClass('ui-calendar')) {
cal.options.select(newDate.getFullYear(), newDate.getMonth()+1, newDate.getDate());
}
},
_getDate : function(obj, format) {
var uid = this._getuid(obj);
if (uid < 0) return null;
if (typeof format != 'string') return calendars[uid].activeDate;
// format string
},
_moveToday : function(obj) {
calendars[this._getuid(obj)].date = new Date();
this._draw(obj);
},
_prevMonth : function(obj) {
var cal = calendars[this._getuid(obj)];
var m = cal.date.getMonth();
cal.date.setDate(1);
if (m == 0) {
cal.date.setFullYear(cal.date.getFullYear()-1);
cal.date.setMonth(11);
} else {
cal.date.setMonth(m-1);
}
this._draw(obj);
},
_nextMonth : function(obj) {
var cal = calendars[this._getuid(obj)];
var m = cal.date.getMonth();
cal.date.setDate(1);
if (m == 11) {
cal.date.setFullYear(cal.date.getFullYear()+1);
cal.date.setMonth(0);
} else {
cal.date.setMonth(m+1);
}
this._draw(obj);
},
_prevYear : function(obj) {
this._draw(obj);
cal.date.setFullYear(cal.date.getFullYear()-1);
},
_nextYear : function(obj) {
cal.date.setFullYear(cal.date.getFullYear()+1);
this._draw(obj);
}
});
/**
* Invoke the calednar functionallity
* @return jQuery object
*/
$.fn.calendar = function(options) {
var args = $.makeArray(arguments);
if (!$.calendar.initialized) {
$(document).mousedown($.calendar._checkExternalClick);
$.calendar.initialized = true;
}
if (typeof options == 'string' && $.inArray(options, ['getDate'])) {
args.shift();
return $.calendar['_'+options].apply($.calendar, [$(this[0])].concat(args) );
}
return this.each(function(){
if (typeof options == 'string') {
args.shift();
$.calendar['_'+ options].apply($.calendar, [$(this)].concat(args));
} else {
$.calendar._attachCalendar($(this), options);
}
});
}
$.calendar = new Calendar(); // singleton instance
$.calendar.initialized = false;
$.calendar.uuid = new Date().getTime();
$.calendar.version = $.ui.calendar.version;
// template
template.calendar = '<button type="button" class="close"><span>{lang.close_layer}</span></button>\
<table border="1" cellspacing="0" summary="달력에서 날짜를 선택하기">\
<caption>\
<span>\
{yyyy}.{mm}.\
<button type="button" class="today">{lang.today}</button>\
<button type="button" class="navi prev"><span>{lang.prevmonth}</span></button>\
<button type="button" class="navi next"><span>{lang.nextmonth}</span></button>\
</span>\
</caption>\
<thead>\
<tr>\
<th scope="col" class="sun">{lang.weekdays[0]}</th>\
<th scope="col">{lang.weekdays[1]}</th>\
<th scope="col">{lang.weekdays[2]}</th>\
<th scope="col">{lang.weekdays[3]}</th>\
<th scope="col">{lang.weekdays[4]}</th>\
<th scope="col">{lang.weekdays[5]}</th>\
<th scope="col">{lang.weekdays[6]}</th>\
</tr>\
</thead>\
<tbody>\
{@week in weeks}\
<tr class="ui-calenar-repeat">\
<td class="sun">{week[0]}</td>\
<td>{week[1]}</td>\
<td>{week[2]}</td>\
<td>{week[3]}</td>\
<td>{week[4]}</td>\
<td>{week[5]}</td>\
<td>{week[6]}</td>\
</tr>\
{/}\
</tbody>\
</table>\
<button type="button" class="close"><span>{lang.close_layer}</span></button>';
template.month = '<button type="button" class="close"><span>{lang.close_layer}</span></button>\
<table border="1" cellspacing="0" summary="달력에서 날짜를 선택하기" class="month">\
<caption>\
<span>\
{yyyy}.{mm} <button type="button" class="today">{lang.today}</button>\
<button type="button" class="navi prev"><span>{lang.prevyear}</span></button>\
<button type="button" class="navi next"><span>{lang.nextyear}</span></button>\
</span>\
</caption>\
<tbody>\
<tr>\
<td><button type="button" class="past"><strong>1</strong><br />January</button></td>\
<td><button type="button" class="past"><strong>2</strong><br />Februry</button></td>\
<td><button type="button" class="past"><strong>3</strong><br />March</button></td>\
<td><button type="button" class="past"><strong>4</strong><br />April</button></td>\
</tr>\
<tr>\
<td><button type="button" class="past"><strong>5</strong><br />May</button></td>\
<td><button type="button" class="active"><strong>6</strong><br />June</button></td>\
<td><button type="button"><strong>7</strong><br />July</button></td>\
<td><button type="button"><strong>8</strong><br />August</button></td>\
</tr>\
<tr>\
<td><button type="button"><strong>9</strong><br />September</button></td>\
<td><button type="button"><strong>10</strong><br />October</button></td>\
<td><button type="button"><strong>11</strong><br />Nobember</button></td>\
<td><button type="button"><strong>12</strong><br />December</button></td>\
</tr>\
</tbody>\
</table>\
<button type="button" class="close"><span>{lang.close_layer}</span></button>';
})(jQuery);

View file

@ -28,7 +28,7 @@ function filterAlertMessage(ret_obj) {
if(typeof(act)!="undefined" && act) url = current_url.setQuery("act", act);
else if(typeof(redirect_url)!="undefined" && redirect_url) url = redirect_url;
if(url == location.href) url = url.replace(/#(.+)$/,'');
if(url == location.href) url = url.replace(/#(.*)$/,'');
location.href = url;
}

View file

@ -233,7 +233,7 @@
$lang->success_updated = 'Updated successfully';
$lang->success_deleted = 'Deleted successfully';
$lang->success_voted = 'Recommended successfully';
$lang->success_blamed = 'Blamed success_blamed';
$lang->success_blamed = 'Blamed successfully';
$lang->success_moved = 'Moved successfully';
$lang->success_sended = 'Sent successfully';
$lang->success_reset = 'Reset successfully';

View file

@ -151,7 +151,7 @@
$lang->regdate = '登録日';
$lang->last_update = '最近修正日';
$lang->last_post = '最近登録';
$lang->signup_date = '加入日';
$lang->signup_date = '登録日';
$lang->last_login = '最近ログイン';
$lang->first_page = '最初のページ';
$lang->last_page = '最後のページ';
@ -221,8 +221,8 @@
$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_fail_to_request_open = 'リクエストのアクセスに失敗しました。';
$lang->msg_invalid_format = '正しくないフォーマットです。';
$lang->msg_not_permitted_act = '現在の操作は実行する権限がありません。';
$lang->msg_module_is_not_exists = "モジュールの起動を有効にされていません。\n管理者ページにセットアップを開始するモジュール。";
@ -277,22 +277,23 @@
$lang->is_required = '必須項目';
$lang->eid = '拡張変数名';
// ftp 관련
// ftp関連
$lang->ftp_form_title = 'サーバーのFTP情報の入力';
$lang->ftp = 'FTP';
$lang->ftp_port = 'FTP port';
$lang->ftp_port = 'FTPポート番号port';
$lang->cmd_check_ftp_connect = 'FTP接続をテストする';
$lang->about_ftp_info = "
FTP情報は次の場合、利用されます。<br/>
1. PHPのsafe_mode=Onになった際、FTP情報を用いてXEが正常に動きます。<br/>
2. FTP経由でXEの自動アップデート等に使われます。<br/>
FTP情報は files/config/ftp.config.php の中に保存されます。<br/>
FTP情報は次の場合、利用されます。<br />
1. サーバー側のPHPの設定中、「safe_mode=On」になった際、FTP情報を用いてXEが正常に働くようにします。
<br/>
2. FTP経由でXEの自動アップデート等に使われます。<br />
FTP情報は「files/config/ftp.config.php」の中に保存されます。<br/>
また、XEのインストールの後、管理者画面からFTP情報の変更・削除が可能です。省略可能 <br />
";
$lang->msg_safe_mode_ftp_needed = "PHPのsafe_modeがOnの場合、FTP情報を登録することで、XEのインストール及び利用が可能になります。";
$lang->msg_ftp_not_connected = "localhostへのFTP接続エラーが発生しました。FTPポート(port)番号をはじめ、FTPサービスが可能であるかをご確認下さい。";
$lang->msg_ftp_invalid_auth_info = "ログインが失敗しました。 FTP情報を再度ご確認下さい。";
$lang->msg_ftp_invalid_auth_info = "ログインが失敗しました。 FTPアクセス情報を再度ご確認下さい。";
$lang->msg_ftp_mkdir_fail = "FTPを用いたディレクトリ生成に失敗しました。FTPサーバーの設定を再度ご確認下さい。";
$lang->msg_ftp_chmod_fail = "FTPを用いたディレクトリパーミッション(permission)変更に失敗しました。FTPサーバーの設定を再度ご確認下さい。";
$lang->msg_ftp_connect_success = "FTP接続に成功しました。";
@ -301,9 +302,9 @@
$lang->filter->isnull = '%sを入力して下さい。';
$lang->filter->outofrange = '%sの文字の長さを合わせて下さい。';
$lang->filter->equalto = '%sが正しくありません。';
$lang->filter->invalid_email = '%sのパターンが正しくありません。 (例: zbxe@zeroboard.com)';
$lang->filter->invalid_email = '%sのパターンが正しくありません。 (例: zbxe@xepressengine.com)';
$lang->filter->invalid_user_id = $lang->filter->invalid_userid = "%sの形式が正しくありません。\\n半角の英数と記号「_」を組み合わせて入力して下さい。頭字は半角英文字でなければなりません。";
$lang->filter->invalid_homepage = '%sの形式が正しくありません。 (例: http://www.zeroboard.com)';
$lang->filter->invalid_homepage = '%sの形式が正しくありません。 (例: http://www.xepressengine.com)';
$lang->filter->invalid_korean = '%sの形式が正しくありません。ハングルのみ入力して下さい。';
$lang->filter->invalid_korean_number = '%sの形式が正しくありません。ハングルと半角数字で入力して下さい。';
$lang->filter->invalid_alpha = '%sの形式が正しくありません。半角英文字のみ入力して下さい。';

View file

@ -126,7 +126,7 @@
$lang->mid = '模組名稱';
$lang->sid = '網站名稱';
$lang->layout = '版面';
$lang->widget = '控件 ';
$lang->widget = 'Widget ';
$lang->module = '模組';
$lang->skin = '面板';
$lang->colorset = '顏色設定';
@ -186,7 +186,7 @@
'Wednesday' => '星期三',
'Thursday' => '星期四',
'Friday' => '星期五',
'Saturday' => '禮拜六',
'Saturday' => '星期六',
'Sunday' => '星期日',
);
@ -220,12 +220,12 @@
$lang->msg_invalid_password = '密碼錯誤';
$lang->msg_error_occured = '發生錯誤';
$lang->msg_not_founded = '找不到相關內容';
$lang->msg_no_result = '找不到與您查詢的相符結果';
$lang->msg_no_result = '搜尋不到結果';
$lang->msg_fail_to_request_open = 'Fail to open your request';
$lang->msg_invalid_format = 'Invalid Format';
$lang->msg_invalid_format = '格式錯誤';
$lang->msg_not_permitted_act = '沒有權限執行';
$lang->msg_module_is_not_exists = "啟動模塊沒有啟用。\n安裝啟動模塊的管理員網頁";
$lang->msg_module_is_not_exists = "還沒有啟用模組。\n請在管理員頁面中啟用模組";
$lang->msg_module_is_not_standalone = '您請求的模組不能單獨執行';
$lang->success_registed = '成功送出!';
@ -244,9 +244,9 @@
$lang->fail_to_delete = '刪除成功!';
$lang->fail_to_move = '移動成功!';
$lang->failed_voted = '您不能推薦!';
$lang->failed_blamed = '您不能反對!';
$lang->failed_declared = '您沒有檢舉權限';
$lang->failed_voted = '無法推薦!';
$lang->failed_blamed = '無法反對!';
$lang->failed_declared = '無法檢舉';
$lang->fail_to_delete_have_children = '不能刪除有回覆的評論!';
$lang->confirm_submit = '確定要送出嗎?';

View file

@ -1,3 +1,3 @@
<script type="text/javascript">
top.location.href = top.location.href;
top.location.reload();
</script>

View file

@ -13,7 +13,7 @@
* @brief XE의 전체 버전 표기
* 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야
**/
define('__ZBXE_VERSION__', '1.2.2');
define('__ZBXE_VERSION__', '1.2.3');
/**
* @brief zbXE가 설치된 장소의 base path를 구함
@ -31,7 +31,7 @@
* define('__DEBUG_DB_OUTPUT__', 0);
* define('__LOG_SLOW_QUERY__', 0);
* define('__OB_GZHANDLER_ENABLE__', 1);
*
* define('__ENABLE_PHPUNIT_TEST__', 0);
* define('__PROXY_SERVER__', 'http://domain:port/path');
* ?>
*/
@ -87,6 +87,13 @@
**/
if(!defined('__OB_GZHANDLER_ENABLE__')) define('__OB_GZHANDLER_ENABLE__', 1);
/**
* @brief php unit test (경로/tests/index.php) 실행 유무 지정
* 0 : 사용하지 않음
* 1 : 사용함
**/
if(!defined('__ENABLE_PHPUNIT_TEST__')) define('__ENABLE_PHPUNIT_TEST__', 0);
/**
* @brief __PROXY_SERVER__ 대상 서버를 거쳐서 외부 요청을 하도록 하는 서버의 정보를 가지고 있음
* FileHandler::getRemoteResource 에서 상수를 사용함

View file

@ -524,7 +524,7 @@
**/
function removeHackTag($content) {
// 특정 태그들을 일반 문자로 변경
$content = preg_replace('/<(\/?)(iframe|script|meta|style)/is', '&lt;$1$2', $content);
$content = preg_replace('/<(\/?)(iframe|script|meta|style|applet)/is', '&lt;$1$2', $content);
// XSS 사용을 위한 이벤트 제거
$content = preg_replace_callback("!<([a-z]+)(.*?)>!is", removeJSEvent, $content);

View file

@ -69,12 +69,12 @@
<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>
<title xml:lang="jp">cafeXEの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>
<description xml:lang="jp">ロゴをクリックする際、移動するcafeXEのURLを入力して下さい。</description>
</var>
<var name="logo_text" type="text">
<title xml:lang="ko">로고 글자</title>
@ -136,7 +136,7 @@
<title xml:lang="en">Content position</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 can choose the position of content between left and right.</description>
<description xml:lang="zh-CN">可以设置内容区的位置(左侧/右侧)。</description>

View file

@ -5,7 +5,7 @@
* @brief 日本語言語パッケージ(基本的な内容のみ)
**/
$lang->new_members = '新規会員のお知らせ';
$lang->new_members = '新規会員';
$lang->document_ranking = '書き込みランキング';
$lang->comment_ranking = 'コメント数ランキング';
?>

View file

@ -208,7 +208,7 @@
<menus>
<menu name="top_menu" maxdepth="1" default="true">
<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">Top Menu</title>
<title xml:lang="ge">Top-Menü</title>

View file

@ -130,7 +130,7 @@
<title xml:lang="ru">Изображения логотипа</title>
<title xml:lang="es">Imagen del logotipo</title>
<description xml:lang="ko">레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다)</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージが最も合います。)</description>
<description xml:lang="jp">レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。)</description>
<description xml:lang="zh-CN">请输入显示在布局顶部的LOGO图片(高度为23px的透明图片为适)。</description>
<description xml:lang="zh-TW">請輸入要顯示在版面上端的Logo圖片。(適當高度為23px的透明圖片。)</description>
<description xml:lang="en">Please input a logo image which will be displayed on the top of layout. (Transparent image with height of 23px is recommended.)</description>
@ -179,7 +179,7 @@
<menus>
<menu name="main_menu" maxdepth="3" default="true">
<title xml:lang="ko">상단 메뉴</title>
<title xml:lang="jp">上段メニュー</title>
<title xml:lang="jp">上段メニュー</title>
<title xml:lang="zh-CN">主菜单</title>
<title xml:lang="zh-TW">主選單</title>
<title xml:lang="en">Top menu</title>
@ -189,7 +189,7 @@
</menu>
<menu name="bottom_menu" maxdepth="1">
<title xml:lang="ko">하단 메뉴 </title>
<title xml:lang="jp">下段メニュー</title>
<title xml:lang="jp">下段メニュー</title>
<title xml:lang="zh-CN">底部菜单</title>
<title xml:lang="zh-TW">底部選單</title>
<title xml:lang="en">Bottom menu</title>

View file

@ -1,6 +1,6 @@
<?php
/**
* @file jp.lang.php
* @file modules/addon/lang/jp.lang.php
* @author zero (zero@nzeo.com) 翻訳RisaPapa、ミニミ
* @brief 日本語言語パッケージ
**/
@ -10,8 +10,8 @@
$lang->addon_info = 'アドオン情報';
$lang->addon_maker = 'アドオン制作者';
$lang->addon_license = 'ライセンス';
$lang->addon_history = '変更内容';
$lang->addon_history = '変更履歴';
$lang->about_addon_mid = "アドオンが使われる対象を指定します。<br />(選択なしの場合、全ての対象で利用可能)";
$lang->about_addon = 'アドオンは、HTMLの出力をコントロールするというより動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけでサイトの運営に有用な機能が利用出来ます。';
$lang->about_addon_mid = "アドオンが使われる対象を指定します。<br />(選択なしの場合、全てのモジュールが利用可能対象)";
$lang->about_addon = 'アドオンは、HTMLの出力をコントロールするというより動作を制御する役割をします。お好みのアドオンを「使用/未使用」に設定するだけでサイトの運営に有用な機能が利用出来ます。';
?>

View file

@ -89,7 +89,7 @@
/**
* 최근 뉴스를 가져와서 세팅
**/
$newest_news_url = sprintf("http://news.zeroboard.com/%s/news.php", Context::getLangType());
$newest_news_url = sprintf("http://news.xpressengine.com/%s/news.php", Context::getLangType());
$cache_file = sprintf("%sfiles/cache/newest_news.%s.cache.php", _XE_PATH_,Context::getLangType());
if(!file_exists($cache_file) || filemtime($cache_file)+ 60*60 < time()) {
FileHandler::getRemoteFile($newest_news_url, $cache_file);

View file

@ -11,7 +11,7 @@
<description xml:lang="en">This module shows a list of features of each module, and enables you to use a quite few of managers by applying layout for administrator.</description>
<description xml:lang="es">Este módulo muestra una lista de características de cada módulo, en donde puede activar la función de la administracion aplicando el diseño del administrador.</description>
<description xml:lang="zh-CN">列出各模块的功能并使用管理员布局,可以让其使用管理功能的模块。</description>
<description xml:lang="jp">各モジュールの機能を羅列し、管理者用のレイアウトを適用させ、管理機能が使用出来るようにするモジュールです。</description>
<description xml:lang="jp">各モジュールを機能別に並べ、かつ管理者用のレイアウトを適用させて、管理機能が使用出来るようにします。</description>
<description xml:lang="ru">Этот модуль показывает список возможностей каждого модуля, и позволяет Вам использовать несколько менеджеров, применяя лейаут для администратора.</description>
<description xml:lang="zh-TW">列出各模組的功能並使用管理員版面,可讓其使用管理功能的模組。</description>
<version>0.1</version>

View file

@ -1,6 +1,6 @@
<?php
/**
* @file jp.lang.php
* @file modules/admin/lang/jp.lang.php
* @author zero (zero@nzeo.com) 翻訳RisaPapa、ミニミ // 細かい修正liahona
* @brief 日本語言語パッケージ(基本的な内容のみ)
**/
@ -8,7 +8,7 @@
$lang->admin_info = '管理者情報';
$lang->admin_index = '管理者トップページ';
$lang->control_panel = 'コントロールパネル';
$lang->start_module = 'モジュールを起動します';
$lang->start_module = '初期起動モジュール';
$lang->about_start_module = 'デフォルトで起動するモジュールを指定することができます。';
$lang->module_category_title = array(
@ -45,19 +45,19 @@
$lang->module_name = "モジュール名";
$lang->addon_name = "アドオン名";
$lang->version = "バージョン";
$lang->author = "作者";
$lang->author = "作者";
$lang->table_count = "テーブル数";
$lang->installed_path = "インストールパス";
$lang->cmd_shortcut_management = "メニュー編集";
$lang->cmd_shortcut_management = "メニュー編集";
$lang->msg_is_not_administrator = '管理者のみアクセス出来ます';
$lang->msg_is_not_administrator = '管理者だけアクセス出来ます';
$lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。';
$lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。';
$lang->welcome_to_xe = 'XEの管理者ページです。';
$lang->about_admin_page = "管理者ページはまだ未完成です。\nクローズベータバージョンの期間に、多くの方々からご意見をいただきながら、必ず必要なコンテンツを埋めていきたいと思います。";
$lang->about_lang_env = "上で設定された言語を、初めてサイトに訪問したユーザに同じく適用させるためには、希望する言語に変更してから「保存」ボタンをクリックして下さい。";
$lang->about_lang_env = "初めてサイトに訪問したユーザーに対し、上記の選択した言語でサイトを表示させるためには、必ず下記の「保存」ボタンをクリックして適用して下さい。";
$lang->xe_license = 'XEのライセンスはGPLです。';
$lang->about_shortcut = 'よく使用するモジュールに登録されたショートカットは削除出来ます。';
@ -66,8 +66,8 @@
$lang->today = "今日";
$lang->cmd_lang_select = "言語選択";
$lang->about_cmd_lang_select = "選択された言語のみでサービスを行います。";
$lang->about_recompile_cache = "要らないdか誤ったキャッシューファイルを整理します。";
$lang->about_cmd_lang_select = "選択された言語だけでサービスを行います。";
$lang->about_recompile_cache = "要らないかごみのキャッシューファイルを整理します。";
$lang->use_ssl = "SSL環境設定";
$lang->ssl_options = array(
'none' => "使わない",
@ -77,6 +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/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->use_db_session = 'DBで認証セッション管理';
$lang->about_db_session = '認証の時に使われるPHPセッションをDBで使う機能です。<br />ウェブサーバーの負荷が低いサイトではこの機能をオフにすることでむしろサイトのレスポンスが向上されることもあります。<br />また、この機能をオンにすると、「現在ログイン中の会員」の機能が不可になります。';
?>

View file

@ -77,6 +77,6 @@
$lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中使用选项应用于所有服务。";
$lang->server_ports = "指定服务器端口";
$lang->about_server_ports = "使用除HTTP80, HTTPS443以外的端口时必须得指定该服务器端口号。";
$lang->use_db_session = '인증 세션 DB 사용';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
$lang->use_db_session = '使用DB session认证';
$lang->about_db_session = '使用DBsession认证时系统会把PHPsession保存到数据库。<br/>不使用这个功能会提高服务器应答速度,但读取不了在线人数。';
?>

View file

@ -8,8 +8,8 @@
$lang->admin_info = '管理員資訊';
$lang->admin_index = '管理頁面';
$lang->control_panel = '控制介面';
$lang->start_module = '啟動模塊';
$lang->about_start_module = '您可以指定默認的啟動模塊。';
$lang->start_module = '啟用模組';
$lang->about_start_module = '可以將所選擇的模組作為預設首頁。';
$lang->module_category_title = array(
'service' => '服務設定',
@ -35,11 +35,11 @@
$lang->current_version = "安裝版本";
$lang->current_path = "安裝路徑";
$lang->released_version = "最新版本";
$lang->about_download_link = "官方網站已發佈新版本。\n請按[download]下載最新版本。";
$lang->about_download_link = "官方網站已發佈新版本。\n請按[下載]下載最新版本。";
$lang->item_module = "模組列表";
$lang->item_addon = "元件列表";
$lang->item_widget = "控件列表";
$lang->item_widget = "Widget列表";
$lang->item_layout = "版面列表";
$lang->module_name = "模組名稱";
@ -52,7 +52,7 @@
$lang->cmd_shortcut_management = "編輯選單";
$lang->msg_is_not_administrator = '只有管理員才可以檢視';
$lang->msg_manage_module_cannot_delete = '模組,附加元件,版面設計,控件模組的快捷選單是無法刪除的。';
$lang->msg_manage_module_cannot_delete = '模組,附加元件,版面設計,Widget的快捷選單是無法刪除的。';
$lang->msg_default_act_is_null = '沒有指定預設管理員的動作,是無法新增到快捷選單的。';
$lang->welcome_to_xe = 'XE管理頁面';
@ -77,6 +77,6 @@
$lang->about_use_ssl = "當會員登入或修改資料等動作時可選擇是否使用SSL功能。";
$lang->server_ports = "主機埠口";
$lang->about_server_ports = "HTTP預設埠口是『80』、HTTPS是『443』如果想使用其他的埠口的話請自行設定。";
$lang->use_db_session = '인증 세션 DB 사용';
$lang->use_db_session = 'DB session認證';
$lang->about_db_session = '인증시 사용되는 PHP 세션을 DB로 사용하는 기능입니다.<br/>웹서버의 사용율이 낮은 사이트에서는 비활성화시 사이트 응답 속도가 향상될 수 있습니다<br/>단 현재 접속자를 구할 수 없어 관련된 기능을 사용할 수 없게 됩니다.';
?>

View file

@ -1,67 +1,44 @@
<?php
/**
* @class boardWAP
* @class boardSmartphone
* @author haneul0318 (haneul0318@gmail.com)
* @brief board 모듈의 IPhone class
* @brief board 모듈의 SmartPhone 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)
{
function procSmartPhone(&$oSmartPhone) {
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl);
if(!$this->grant->list || $this->module_info->consultation == 'Y') return $oSmartPhone->setContent(Context::getLang('msg_not_permitted'));
$oDocument = Context::get('oDocument');
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();
if(Context::get('comment') == 'true' && $oDocument->getCommentCount()) {
Context::set('comment_list', $oDocument->getComments());
$comment_page_navigation = $oDocument->comment_page_navigation;
if($comment_page_navigation) {
if($comment_page_navigation->cur_page > $comment_page_navigation->first_page) $oSmartPhone->setPrevUrl(getUrl('cpage',$comment_page_navigation->cur_page-1));
if($comment_page_navigation->cur_page < $comment_page_navigation->last_page) $oSmartPhone->setNextUrl(getUrl('cpage',$comment_page_navigation->cur_page+1));
}
$oSmartPhone->setParentUrl(getUrl('comment',''));
$tpl_file = 'comment_list';
} else {
$oSmartPhone->setParentUrl(getUrl('document_srl',''));
$tpl_file = 'view_document';
}
} else {
$page_navigation = Context::get('page_navigation');
if($page_navigation) {
if($page_navigation->cur_page > $page_navigation->first_page) $oSmartPhone->setPrevUrl(getUrl('page',$page_navigation->cur_page-1));
if($page_navigation->cur_page < $page_navigation->last_page) $oSmartPhone->setNextUrl(getUrl('page',$page_navigation->cur_page+1));
}
$tpl_file = 'list';
}
}
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;
$content = $oTemplate->compile($this->module_path.'tpl/smartphone', $tpl_file);
$oSmartPhone->setContent($content);
}
}
?>

View file

@ -41,7 +41,7 @@
$oComment->setAttribute($val);
if(!$oComment->isAccessible()) continue;
$content .= "<b>".$oComment->getNickName()."</b> (".$oComment->getRegdate("Y-m-d").")<br>\r\n".$oComment->getContent(false,false)."<br>\r\n";
}
}
}
// 내용 설정
@ -54,12 +54,12 @@
} else {
// 내용 지정 (태그를 모두 제거한 내용을 설정)
$content = strip_tags($oDocument->getContent(false,false,false));
$content = strip_tags(str_replace('<p>','<br>&nbsp;&nbsp;&nbsp;',$oDocument->getContent(false,false,false)),'<br><b><i><u><em><small><strong><big>');
// 내용 상단에 정보 출력 (댓글 보기 링크 포함)
$content = Context::getLang('replies').' : <a href="'.getUrl('act','dispBoardContentCommentList').'">'.$oDocument->getCommentCount().'</a><br>'."\r\n".$content;
$content = '<b>'.$oDocument->getNickName()."</b> (".$oDocument->getRegdate("Y-m-d").")<br>\r\n".$content;
$content = '<b>'.$oDocument->getNickName().'</b> ('.$oDocument->getRegdate("Y-m-d").")<br>\r\n".$content;
// 내용 설정
$oMobile->setContent( $content );
@ -90,11 +90,11 @@
$obj = null;
$obj['href'] = $val->getPermanentUrl();
$title = $val->getTitleText();
$title = htmlspecialchars($val->getTitleText());
if($val->getCommentCount()) $title .= ' ['.$val->getCommentCount().']';
$obj['link'] = $obj['text'] = '['.$val->getNickName().'] '.$title;
$childs[] = $obj;
}
}
$oMobile->setChilds($childs);
}

View file

@ -1,6 +1,6 @@
<?php
/**
* @file jp.lang.php
* @file modules/board/lang/jp.lang.php
* @author zero (zero@nzeo.com) 翻訳RisaPapa、ミニミ // 細かい修正liahona
* @brief 掲示板(board)モジュールの基本言語パッケージ
**/
@ -16,8 +16,8 @@
// 項目
$lang->search_result = '検索結果';
$lang->consultation = '相談機能';
$lang->secret = '秘密文機能';
$lang->thisissecret = '秘密文です。';
$lang->secret = '非公開文機能';
$lang->thisissecret = '非公開文です。';
$lang->admin_mail = '管理者メールアドレス';
// ボタンに使用する用語
@ -33,7 +33,7 @@
$lang->about_use_anonymous = '匿名掲示板として活用出来ます。スキン設定で登録者の情報を表示しないに設定をお勧めします。';
$lang->about_board = '掲示板の生成、および管理するモジュールです。';
$lang->about_consultation = "相談機能とは、管理権限のない会員に本人の書き込みだけを表示する機能です。\n但し、相談機能を使用する際は、非会員の書き込みは自動的に禁止されます。";
$lang->about_secret = '掲示板およびコメントの秘密文を登録出来るようにします。';
$lang->about_secret = '掲示板およびコメントの非公開文を登録出来るようにします。';
$lang->about_admin_mail = '書き込みやコメントが掲載される時、登録メールアドレス宛にメールが送信されます。<br /> 複数のメールアドレスへ送信する場合は「,」(半額コンマ)区切りで登録して下さい。';
$lang->about_list_config = '掲示板スタイルが「リスト型」の場合、好きな列の項目配置が出来ます。<br />ただし、スキンによってこの機能をサポートしない場合もあります。<br />ターゲットアイテム/表示アイテムをダブルクリックすると追加・削除が出来ます。';

View file

@ -30,7 +30,7 @@
$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 = '게시판 및 댓글의 비밀글 사용할 수 있도록 합니다.';

View file

@ -296,7 +296,7 @@
</var>
<var name="header_title_format" type="select">
<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">게시판 제목 형식</title>
<title xml:lang="es">게시판 제목 형식</title>
@ -353,7 +353,7 @@
</var>
<var name="document_title_format" type="select">
<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">글 제목 형식</title>
<title xml:lang="es">글 제목 형식</title>

View file

@ -1,5 +1,6 @@
<!--#include("header.html")-->
<!-- 게시물 작성 폼 -->
<form action="./" method="post" onsubmit="return procFilter(this, insert)" id="fo_write">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="content" value="{$oDocument->getContentText()}" />

View file

@ -450,7 +450,7 @@
<description xml:lang="zh-CN">可以设置主题发布者的个人签名及个性头像显示与否。</description>
<description xml:lang="en">글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다.</description>
<description xml:lang="es">글내용 사용자의 서명과 프로필 이미지를 표시하거나 숨길 수 있습니다.</description>
<description xml:lang="zh-TW">可選擇是否在文章中顯示個人圖片和簽名檔</description>
<description xml:lang="zh-TW">可選擇是否在文章中顯示個人圖片和簽名檔</description>
<options value="Y">
<title xml:lang="ko">출력</title>
<title xml:lang="en">display</title>

View file

@ -0,0 +1,14 @@
<ul class="smartPhoneList">
<li class="title">{$oDocument->getCommentCount()} comments<!--@if($oDocument->comment_page_navigation)-->, {$oDocument->comment_page_navigation->cur_page}/{$oDocument->comment_page_navigation->last_page} pages<!--@end--></li>
<!--@foreach($comment_list as $val)-->
<li class="item">
<span class="title">{$val->getContent(false)}</span>
<span class="info">
{$val->getRegdate()}
[{$val->getNickName()}]
</span>
</li>
<!--@end-->
</ul>

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