mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-09 03:32:00 +09:00
XE 코드 고도화
1. 위젯/ 에디터컴포넌트의 코드 컴파일을 Context가 아닌 각 모듈이 trigger로 동작하게 개선 : 관리자 페이지에서 모듈 업데이트 필요 2. IE7에서 버튼 이미지가 어긋나는 문제 수정 3. 페이지 모듈의 캐싱 기능 추가 : 페이지 자체 캐시 가능하도록 함 4. 에디터에서 파일업로드시 파일 크기가 제대로 적용되지 않던 문제 수정 및 파일을 올리는 중에 남은 용량을 체크하여 미리 파일 업로드가 되지 않도록 함 git-svn-id: http://xe-core.googlecode.com/svn/sandbox@6103 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
parent
1ee64389ab
commit
32c3e86b1b
42 changed files with 838 additions and 810 deletions
|
|
@ -409,8 +409,7 @@
|
|||
$content = getXmlRpcFailure(1, 'post not founded');
|
||||
printContent($content);
|
||||
} else {
|
||||
$oContext = &Context::getInstance();
|
||||
|
||||
$oEditorController = &getController('editor');
|
||||
|
||||
$posts = array();
|
||||
foreach($output->data as $key => $oDocument) {
|
||||
|
|
@ -419,7 +418,7 @@
|
|||
$post->userid = $oDocument->get('user_id');
|
||||
$post->mt_allow_pings = 0;
|
||||
$post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0;
|
||||
$post->description = htmlspecialchars($oContext->transContent($oDocument->get('content')));
|
||||
$post->description = htmlspecialchars($oEditorController->transComponent($oDocument->get('content')));
|
||||
$post->postid = $oDocument->document_srl;
|
||||
$post->title = htmlspecialchars($oDocument->get('title'));
|
||||
|
||||
|
|
|
|||
|
|
@ -480,7 +480,6 @@
|
|||
$oContext = &Context::getInstance();
|
||||
|
||||
$content = $oTemplate->compile($this->oModule->getTemplatePath(), $this->oModule->getTemplateFile());
|
||||
$content = $oContext->transContent($content);
|
||||
$this->setContent($content);
|
||||
|
||||
// 출력
|
||||
|
|
|
|||
|
|
@ -45,8 +45,6 @@
|
|||
|
||||
var $is_uploaded = false; ///< @brief 첨부파일이 업로드 된 요청이였는지에 대한 체크 플래그
|
||||
|
||||
var $widget_include_info_flag = false; // 위젯 정보 코드 출력
|
||||
|
||||
/**
|
||||
* @brief 유일한 Context 객체를 반환 (Singleton)
|
||||
* Context는 어디서든 객체 선언없이 사용하기 위해서 static 하게 사용
|
||||
|
|
@ -1331,117 +1329,11 @@
|
|||
return file_exists(Context::getConfigFile()) && filesize(Context::getConfigFile());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경을 위한 flag set
|
||||
**/
|
||||
function setTransWidgetCodeIncludeInfo($flag=false){
|
||||
$oContext = &Context::getInstance();
|
||||
$oContext->widget_include_info_flag = $flag ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 내용의 위젯이나 기타 기능에 대한 code를 실제 code로 변경
|
||||
**/
|
||||
function transContent($content) {
|
||||
|
||||
// 사용자 정의 언어로 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($content);
|
||||
|
||||
// 위젯 코드 변경
|
||||
$oWidgetController = &getController('widget');
|
||||
$content = $oWidgetController->transWidgetCode($content,$this->widget_include_info_flag);
|
||||
|
||||
// 메타 파일 변경
|
||||
$content = preg_replace_callback('!<\!\-\-Meta:([^\-]*?)\-\->!is', array($this,'transMeta'), $content);
|
||||
|
||||
// 에디터 컴포넌트를 찾아서 결과 코드로 변환
|
||||
$content = preg_replace_callback('!<div([^\>]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'transEditorComponent'), $content);
|
||||
$content = preg_replace_callback('!<img([^\>]*)editor_component=([^\>]*?)\>!is', array($this,'transEditorComponent'), $content);
|
||||
|
||||
// style의 url 경로를 재정의 한다.
|
||||
$content = preg_replace('/url\(http:\/\/([^ ]+)http:\/\//is','url(http://', $content);
|
||||
// body 내의 <style ..></style>를 header로 이동
|
||||
$content = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'moveStyleToHeader'), $content);
|
||||
|
||||
// templateHandler의 이미지 경로로 인하여 생기는 절대경로 이미지등의 경로 중복 처리
|
||||
//$content = preg_replace('/<(img|input)([^>]*)src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','<$1$2src=$3http://', $content);
|
||||
$content = preg_replace('/src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','src=$1http://', $content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief IE위지윅에디터에서 태그가 대문자로 사용되기에 이를 소문자로 치환
|
||||
**/
|
||||
function transTagToLowerCase($matches) {
|
||||
return sprintf('<%s%s%s>', $matches[1], strtolower($matches[2]), $matches[3]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <!--Meta:파일이름.(css|js)-->를 변경
|
||||
**/
|
||||
function transMeta($matches) {
|
||||
if(substr($matches[1],'-4')=='.css') $this->addCSSFile($matches[1]);
|
||||
elseif(substr($matches[1],'-3')=='.js') $this->addJSFile($matches[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <body>내의 <style태그를 header로 이동
|
||||
**/
|
||||
function moveStyleToHeader($matches) {
|
||||
$this->addHtmlHeader($matches[0]);
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 내용의 에디터 컴포넌트 코드를 변환
|
||||
**/
|
||||
function transEditorComponent($matches) {
|
||||
// IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌
|
||||
$buff = $matches[0];
|
||||
$buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $buff);
|
||||
$buff = str_replace("&","&",$buff);
|
||||
|
||||
// 에디터 컴포넌트에서 생성된 코드
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse($buff);
|
||||
if($xml_doc->div) $xml_doc = $xml_doc->div;
|
||||
else if($xml_doc->img) $xml_doc = $xml_doc->img;
|
||||
|
||||
$xml_doc->body = $matches[3];
|
||||
|
||||
// attribute가 없으면 return
|
||||
$editor_component = $xml_doc->attrs->editor_component;
|
||||
if(!$editor_component) return $matches[0];
|
||||
|
||||
// component::transHTML() 을 이용하여 변환된 코드를 받음
|
||||
$oEditorModel = &getModel('editor');
|
||||
$oComponent = &$oEditorModel->getComponentObject($editor_component, 0);
|
||||
if(!is_object($oComponent)||!method_exists($oComponent, 'transHTML')) return $matches[0];
|
||||
|
||||
return $oComponent->transHTML($xml_doc);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief gzip encoding 여부 체크
|
||||
**/
|
||||
function isGzEnabled() {
|
||||
if(
|
||||
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
|
||||
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
|
||||
function_exists('ob_gzhandler') &&
|
||||
extension_loaded('zlib')
|
||||
) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function getFixUrl($url){
|
||||
if(eregi("(http|https):\/\/",$url)) return $url;
|
||||
if(ereg("^/",$url)) return $url;
|
||||
return dirname($_SERVER['PHP_SELF']) . "/" . $url;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
* Response Method에 따라서 html or xml 출력방법을 결정한다
|
||||
* xml : oModule의 variables를 simple xml 로 출력
|
||||
* html : oModule의 template/variables로 html을 만들고 contents_html로 처리
|
||||
* widget이나 layout의 html과 연동하여 출력
|
||||
**/
|
||||
|
||||
class DisplayHandler extends Handler {
|
||||
|
|
@ -22,108 +21,136 @@
|
|||
function printContent(&$oModule) {
|
||||
|
||||
// gzip encoding 지원 여부 체크
|
||||
$this->gz_enabled = Context::isGzEnabled();
|
||||
if(
|
||||
(defined('__OB_GZHANDLER_ENABLE__') && __OB_GZHANDLER_ENABLE__ == 1) &&
|
||||
strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')!==false &&
|
||||
function_exists('ob_gzhandler') &&
|
||||
extension_loaded('zlib')
|
||||
) $this->gz_enabled = true;
|
||||
|
||||
// header 출력
|
||||
$this->_printHeader();
|
||||
// request method에 따른 처리
|
||||
if(Context::getRequestMethod() == 'XMLRPC') $content = $this->_toXmlDoc($oModule);
|
||||
else if(Context::getRequestMethod() == 'JSON') $content = $this->_toJSON($oModule);
|
||||
else $content = $this->_toHTMLDoc($oModule);
|
||||
// request method에 따른 컨텐츠 결과물 추출
|
||||
if(Context::getRequestMethod() == 'XMLRPC') $output = $this->_toXmlDoc($oModule);
|
||||
else if(Context::getRequestMethod() == 'JSON') $output = $this->_toJSON($oModule);
|
||||
else $output = $this->_toHTMLDoc($oModule);
|
||||
|
||||
// 요청방식에 따라 출력을 별도로
|
||||
// HTML 출력 요청일 경우 레이아웃 컴파일과 더블어 완성된 코드를 제공
|
||||
if(Context::getResponseMethod()=="HTML") {
|
||||
|
||||
// 관리자 모드일 경우 #xeAdmin id를 가지는 div 추가
|
||||
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $content = '<div id="xeAdmin">'.$content.'</div>';
|
||||
if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')>0) $output = '<div id="xeAdmin">'.$output.'</div>';
|
||||
|
||||
// 내용을 content라는 변수로 설정 (layout에서 {$content}에서 대체됨)
|
||||
Context::set('content', $content);
|
||||
// 내용을 content라는 변수로 설정 (layout에서 {$output}에서 대체됨)
|
||||
Context::set('content', $output);
|
||||
|
||||
// 레이아웃을 컴파일
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
|
||||
// layout이라는 변수가 none으로 설정되면 기본 레이아웃으로 변경
|
||||
if(Context::get('layout') != 'none') {
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
$layout_path = $oModule->getLayoutPath();
|
||||
if(!$layout_path) $layout_path = "./common/tpl";
|
||||
|
||||
$layout_file = $oModule->getLayoutFile();
|
||||
$edited_layout_file = $oModule->getEditedLayoutFile();
|
||||
}
|
||||
if(!$layout_path) $layout_path = './common/tpl/';
|
||||
if(!$layout_file) $layout_file = 'default_layout.html';
|
||||
|
||||
// 현재 요청된 레이아웃 정보를 구함
|
||||
$oLayoutModel = &getModel('layout');
|
||||
$current_module_info = Context::get('current_module_info');
|
||||
$layout_srl = $current_module_info->layout_srl;
|
||||
|
||||
// 생성된 레이아웃과 연결되어 있으면 처리
|
||||
// 레이아웃과 연결되어 있으면 레이아웃 컴파일
|
||||
if($layout_srl > 0){
|
||||
$layout_info = Context::get('layout_info');
|
||||
|
||||
// faceoff 레이아웃일 경우 별도 처리
|
||||
if($layout_info && $layout_info->type == 'faceoff') {
|
||||
$oLayoutModel->doActivateFaceOff($layout_info);
|
||||
Context::set('layout_info', $layout_info);
|
||||
}
|
||||
|
||||
// 관리자 레이아웃 수정화면에서 변경된 CSS가 있는지 조사
|
||||
$edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_srl);
|
||||
|
||||
|
||||
if(file_exists($edited_layout_css)) Context::addCSSFile($edited_layout_css,true,'all','',100);
|
||||
}
|
||||
Context::set('layout_info', $layout_info);
|
||||
|
||||
$zbxe_final_content = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
|
||||
$output = $oTemplate->compile($layout_path, $layout_file, $edited_layout_file);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__layout_compile_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
|
||||
// 각 위젯, 에디터 컴포넌트의 코드 변경
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
$oContext = &Context::getInstance();
|
||||
$zbxe_final_content= $oContext->transContent($zbxe_final_content);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__trans_widget_editor_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
// 최종 결과를 common_layout에 넣어버림
|
||||
Context::set('zbxe_final_content', $zbxe_final_content);
|
||||
|
||||
$output = $oTemplate->compile('./common/tpl', 'common_layout');
|
||||
|
||||
// 사용자 정의 언어 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($output);
|
||||
|
||||
|
||||
} else {
|
||||
$output = $content;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 출력하기 전에 trigger 호출 (before)
|
||||
ModuleHandler::triggerCall('display', 'before', $output);
|
||||
|
||||
// 애드온 실행
|
||||
$called_position = 'before_display_content';
|
||||
$oAddonController = &getController('addon');
|
||||
$addon_file = $oAddonController->getCacheFilePath();
|
||||
if(file_exists($addon_file)) @include($addon_file);
|
||||
|
||||
$this->content_size = strlen($output);
|
||||
// HTML 출력일 경우 최종적으로 common layout을 씌워서 출력
|
||||
if(Context::getResponseMethod()=="HTML") {
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// 컨텐츠 출력
|
||||
$this->display($output);
|
||||
// 메타 파일 변경 (캐싱기능등으로 인해 위젯등에서 <!--Meta:경로--> 태그를 content에 넣는 경우가 있음
|
||||
$output = preg_replace_callback('/<!--Meta:([a-z0-9\_\/\.]+)-->/is', array($this,'transMeta'), $output);
|
||||
|
||||
// style의 url 경로를 재정의 한다. (잘못 기입된 경우들이 발생함)
|
||||
$output = preg_replace('/url\(http:\/\/([^ ]+)http:\/\//is','url(http://', $output);
|
||||
|
||||
// body 내의 <style ..></style>를 header로 이동
|
||||
$output = preg_replace_callback('!<style(.*?)<\/style>!is', array($this,'moveStyleToHeader'), $output);
|
||||
|
||||
// templateHandler의 이미지 경로로 인하여 생기는 절대경로 이미지등의 경로 중복 처리
|
||||
$output = preg_replace('/src=(["|\']?)http:\/\/([^ ]+)http:\/\//is','src=$1http://', $output);
|
||||
|
||||
// 사용자 정의 언어 변환
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($output);
|
||||
|
||||
if(__DEBUG__==3) $GLOBALS['__trans_content_elapsed__'] = getMicroTime()-$start;
|
||||
|
||||
// 최종 레이아웃 변환
|
||||
Context::set('content', $output);
|
||||
$output = $oTemplate->compile('./common/tpl', 'common_layout');
|
||||
|
||||
}
|
||||
|
||||
// header 출력
|
||||
if($this->gz_enabled) header("Content-Encoding: gzip");
|
||||
if(Context::getResponseMethod() == 'JSON') $this->_printJSONHeader();
|
||||
else if(Context::getResponseMethod() != 'HTML') $this->_printXMLHeader();
|
||||
else $this->_printHTMLHeader();
|
||||
|
||||
// debugOutput 출력
|
||||
$this->content_size = strlen($output);
|
||||
$output .= $this->_debugOutput();
|
||||
|
||||
// 결과물 직접 출력
|
||||
if($this->gz_enabled) print ob_gzhandler($output, 5);
|
||||
else print $output;
|
||||
|
||||
// 출력 후 trigger 호출 (after)
|
||||
ModuleHandler::triggerCall('display', 'after', $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 최종 결과물의 출력
|
||||
* @brief <!--Meta:파일이름.(css|js)-->를 변경
|
||||
**/
|
||||
function display($content) {
|
||||
$content .= $this->_debugOutput();
|
||||
function transMeta($matches) {
|
||||
if(substr($matches[1],'-4')=='.css') Context::addCSSFile($matches[1]);
|
||||
elseif(substr($matches[1],'-3')=='.js') Context::addJSFile($matches[1]);
|
||||
}
|
||||
|
||||
// 출력하기 전에 trigger 호출 (after)
|
||||
ModuleHandler::triggerCall('display', 'after', $content);
|
||||
|
||||
if($this->gz_enabled) print ob_gzhandler($content, 5);
|
||||
else print $content;
|
||||
/**
|
||||
* @brief <body>내의 <style태그를 header로 이동
|
||||
**/
|
||||
function moveStyleToHeader($matches) {
|
||||
Context::addHtmlHeader($matches[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -186,13 +213,6 @@
|
|||
return $oTemplate->compile($template_path, $tpl_file);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief content size return
|
||||
**/
|
||||
function getContentSize() {
|
||||
return $this->content_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 디버그 모드일 경우 디버깅 메시지 출력
|
||||
*
|
||||
|
|
@ -225,7 +245,7 @@
|
|||
sprintf("%s:%s%s%s%s", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']),
|
||||
$_SERVER['REQUEST_METHOD'],
|
||||
Context::getResponseMethod(),
|
||||
$this->getContentSize().' byte'
|
||||
$this->content_size.' byte'
|
||||
)
|
||||
)
|
||||
),
|
||||
|
|
@ -233,7 +253,7 @@
|
|||
);
|
||||
$firephp->fb(
|
||||
array('Elapsed time >>> Total : '.sprintf('%0.5f sec', $end - __StartTime__),
|
||||
array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans widget&editor'),
|
||||
array(array('DB queries', 'class file load', 'Template compile', 'XmlParse compile', 'PHP', 'Widgets', 'Trans Content'),
|
||||
array(
|
||||
sprintf('%0.5f sec', $GLOBALS['__db_elapsed_time__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__elapsed_class_load__']),
|
||||
|
|
@ -241,7 +261,7 @@
|
|||
sprintf('%0.5f sec', $GLOBALS['__xmlparse_elapsed__']),
|
||||
sprintf('%0.5f sec', $end-__StartTime__-$GLOBALS['__template_elapsed__']-$GLOBALS['__xmlparse_elapsed__']-$GLOBALS['__db_elapsed_time__']-$GLOBALS['__elapsed_class_load__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__widget_excute_elapsed__']),
|
||||
sprintf('%0.5f sec', $GLOBALS['__trans_widget_editor_elapsed__'])
|
||||
sprintf('%0.5f sec', $GLOBALS['__trans_content_elapsed__'])
|
||||
)
|
||||
)
|
||||
),
|
||||
|
|
@ -275,7 +295,7 @@
|
|||
$buff .= sprintf("\tRequest URI \t\t\t: %s:%s%s%s%s\n", $_SERVER['SERVER_NAME'], $_SERVER['SERVER_PORT'], $_SERVER['PHP_SELF'], $_SERVER['QUERY_STRING']?'?':'', $_SERVER['QUERY_STRING']);
|
||||
$buff .= sprintf("\tRequest method \t\t\t: %s\n", $_SERVER['REQUEST_METHOD']);
|
||||
$buff .= sprintf("\tResponse method \t\t: %s\n", Context::getResponseMethod());
|
||||
$buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->getContentSize());
|
||||
$buff .= sprintf("\tResponse contents size\t\t: %d byte\n", $this->content_size);
|
||||
|
||||
// 전체 실행 시간
|
||||
$buff .= sprintf("\n- Total elapsed time : %0.5f sec\n", $end-__StartTime__);
|
||||
|
|
@ -292,7 +312,7 @@
|
|||
$buff .= sprintf("\n\tLayout compile elapsed time \t: %0.5f sec", $GLOBALS['__layout_compile_elapsed__']);
|
||||
|
||||
// 위젯, 에디터 컴포넌트 치환 시간
|
||||
$buff .= sprintf("\n\tTrans widget&editor elapsed time: %0.5f sec\n", $GLOBALS['__trans_widget_editor_elapsed__']);
|
||||
$buff .= sprintf("\n\tTrans Content \t\t\t: %0.5f sec\n", $GLOBALS['__trans_content_elapsed__']);
|
||||
}
|
||||
|
||||
// DB 로그 작성
|
||||
|
|
@ -338,17 +358,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief RequestMethod에 맞춰 헤더 출력
|
||||
***/
|
||||
function _printHeader() {
|
||||
if($this->gz_enabled) header("Content-Encoding: gzip");
|
||||
if(Context::getResponseMethod() == 'JSON') return $this->_printJSONHeader();
|
||||
else if(Context::getResponseMethod() != 'HTML') return $this->_printXMLHeader();
|
||||
else return $this->_printHTMLHeader();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief xml header 출력 (utf8 고정)
|
||||
**/
|
||||
|
|
|
|||
|
|
@ -437,7 +437,7 @@
|
|||
if(!$oModule || !method_exists($oModule, $called_method)) continue;
|
||||
|
||||
$output = $oModule->{$called_method}($obj);
|
||||
if(!$output->toBool()) return $output;
|
||||
if(is_object($output) && method_exists($output, 'toBool') && !$output->toBool()) continue;
|
||||
unset($oModule);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,337 +9,5 @@
|
|||
|
||||
var $widget_path = '';
|
||||
|
||||
/**
|
||||
* @brief 위젯 캐시 처리
|
||||
**/
|
||||
function getCache($widget, $args, $lang_type = null, $ignore_cache = false) {
|
||||
// 지정된 언어가 없으면 현재 언어 지정
|
||||
if(!$lang_type) $lang_type = Context::getLangType();
|
||||
|
||||
// widget, 캐시 번호와 캐시값이 설정되어 있는지 확인
|
||||
$widget_sequence = $args->widget_sequence;
|
||||
$widget_cache = $args->widget_cache;
|
||||
|
||||
// args값에서 urldecode를 해줌
|
||||
$object_vars = get_object_vars($args);
|
||||
if(count($object_vars)) {
|
||||
foreach($object_vars as $key => $val) {
|
||||
if(in_array($key, array('body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','document_srl'))) continue;
|
||||
$args->{$key} = utf8RawUrlDecode($val);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 캐시 번호와 캐시 값이 아예 없으면 바로 데이터를 추출해서 리턴
|
||||
**/
|
||||
if(!$ignore_cache && (!$widget_cache || !$widget_sequence)) {
|
||||
$oWidget = WidgetHandler::getObject($widget);
|
||||
if(!$oWidget) return;
|
||||
|
||||
return $oWidget->proc($args);
|
||||
}
|
||||
|
||||
/**
|
||||
* 캐시 번호와 캐시값이 설정되어 있으면 캐시 파일을 불러오도록 함
|
||||
**/
|
||||
|
||||
// 캐시 디렉토리가 없으면 생성
|
||||
$cache_path = './files/cache/widget_cache/';
|
||||
if(!is_dir($cache_path)) FileHandler::makeDir($cache_path);
|
||||
|
||||
// 캐시파일명을 구함
|
||||
$cache_file = sprintf('%s%d.%s.cache', $cache_path, $widget_sequence, $lang_type);
|
||||
|
||||
// 캐시 Lock 파일을 구함
|
||||
$lock_file = sprintf('%s%d.%s.lock', $cache_path, $widget_sequence, $lang_type);
|
||||
|
||||
// 캐시 파일이 존재하면 해당 파일의 유효성 검사 (lock파일이 있을 경우 유효성 검사하지 않음)
|
||||
if(!$ignore_cache && file_exists($cache_file)) {
|
||||
$filemtime = filemtime($cache_file);
|
||||
|
||||
// 수정 시간을 비교해서 캐싱중이어야 하거나 WidgetHandler.class.php 파일보다 나중에 만들어 졌다면 캐시값을 return
|
||||
if(file_exists($lock_file) || ($filemtime + $widget_cache*60 > time() && $filemtime > filemtime('./classes/widget/WidgetHandler.class.php'))) {
|
||||
return FileHandler::readFile($cache_file);
|
||||
}
|
||||
}
|
||||
|
||||
// lock 파일 생성
|
||||
FileHandler::writeFile($lock_file, '');
|
||||
|
||||
// 캐시 파일을 갱신하여야 할 경우 lock파일을 만들고 캐시 생성
|
||||
$oWidget = WidgetHandler::getObject($widget);
|
||||
if(!$oWidget || !method_exists($oWidget,'proc')) return;
|
||||
|
||||
$widget_content = $oWidget->proc($args);
|
||||
FileHandler::writeFile($cache_file, $widget_content);
|
||||
|
||||
// lock 파일 제거
|
||||
FileHandler::removeFile($lock_file);
|
||||
|
||||
return $widget_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯이름과 인자를 받아서 결과를 생성하고 결과 리턴
|
||||
* 태그 사용 templateHandler에서 WidgetHandler::execute()를 실행하는 코드로 대체하게 된다
|
||||
*
|
||||
* $include_info가 true일 경우 페이지 수정시 위젯 핸들링을 위한 코드까지 포함함
|
||||
**/
|
||||
function execute($widget, $args, $include_info = false) {
|
||||
// 디버그를 위한 위젯 실행 시간 저장
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// args값에서 urldecode를 해줌
|
||||
$object_vars = get_object_vars($args);
|
||||
if(count($object_vars)) {
|
||||
foreach($object_vars as $key => $val) {
|
||||
if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue;
|
||||
$args->{$key} = utf8RawUrlDecode($val);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함
|
||||
**/
|
||||
$widget_content = '';
|
||||
if($widget != 'widgetContent' && $widget != 'widgetBox') {
|
||||
if(!is_dir(sprintf('./widgets/%s/',$widget))) return;
|
||||
|
||||
// 위젯의 내용을 담을 변수
|
||||
$widget_content = WidgetHandler::getCache($widget, $args);
|
||||
}
|
||||
if($widget == 'widgetBox'){
|
||||
$widgetbox_content = $args->widgetbox_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* 관리자가 지정한 위젯의 style을 구함
|
||||
**/
|
||||
// 가끔 잘못된 코드인 background-image:url(none)이 들어 있을 수가 있는데 이럴 경우 none에 대한 url을 요청하므로 무조건 제거함
|
||||
$style = preg_replace('/background\-image: url\((.+)(\/?)none\)/is','', $args->style);
|
||||
|
||||
// 내부 여백을 둔 것을 구해서 style문으로 미리 변경해 놓음
|
||||
$widget_padding_left = $args->widget_padding_left;
|
||||
$widget_padding_right = $args->widget_padding_right;
|
||||
$widget_padding_top = $args->widget_padding_top;
|
||||
$widget_padding_bottom = $args->widget_padding_bottom;
|
||||
$inner_style = sprintf("padding:%dpx %dpx %dpx %dpx !important; padding:none !important;", $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
|
||||
|
||||
$oDocumentModel = &getModel('document');
|
||||
|
||||
|
||||
/**
|
||||
* 위젯 출력물을 구함
|
||||
**/
|
||||
|
||||
$widget_content_header = '';
|
||||
$widget_content_body = '';
|
||||
$widget_content_footer = '';
|
||||
|
||||
// 일반 페이지 호출일 경우 지정된 스타일만 꾸면서 바로 return 함
|
||||
if(!$include_info) {
|
||||
if($args->id) $args->id = ' id="'.$args->id.'" ';
|
||||
switch($widget) {
|
||||
// 내용 직접 추가일 경우
|
||||
case 'widgetContent' :
|
||||
if($args->document_srl) {
|
||||
$oDocument = $oDocumentModel->getDocument($args->document_srl);
|
||||
$body = $oDocument->getContent(false,false,false, false);
|
||||
} else {
|
||||
$body = base64_decode($args->body);
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s"><div style="%s">', $args->id, $style, $inner_style);
|
||||
$widget_content_body = $body;
|
||||
$widget_content_footer = '</div></div>';
|
||||
|
||||
break;
|
||||
|
||||
// 위젯 박스일 경우
|
||||
case 'widgetBox' :
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s;"><div style="%s"><div>', $args->id, $style, $inner_style);
|
||||
$widget_content_body = $widgetbox_content;
|
||||
|
||||
break;
|
||||
|
||||
// 일반 위젯일 경우
|
||||
default :
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s">',$args->id,$style);
|
||||
$widget_content_body = sprintf('<div style="*zoom:1;%s">%s</div>', $inner_style,$widget_content);
|
||||
$widget_content_footer = '</div>';
|
||||
break;
|
||||
}
|
||||
|
||||
// 페이지 수정시에 호출되었을 경우 위젯 핸들링을 위한 코드 추가
|
||||
} else {
|
||||
switch($widget) {
|
||||
// 내용 직접 추가일 경우
|
||||
case 'widgetContent' :
|
||||
if($args->document_srl) {
|
||||
$oDocument = $oDocumentModel->getDocument($args->document_srl);
|
||||
$body = $oDocument->getContent(false,false,false);
|
||||
} else {
|
||||
$body = base64_decode($args->body);
|
||||
}
|
||||
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$oWidgetController = &getController('widget');
|
||||
|
||||
$widget_content_header = sprintf(
|
||||
'<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_left="%s" widget_padding_right="%s" widget_padding_top="%s" widget_padding_bottom="%s" widget="widgetContent" document_srl="%d" %s>'.
|
||||
'<div class="widgetResize"></div>'.
|
||||
'<div class="widgetResizeLeft"></div>'.
|
||||
'<div class="widgetBorder">'.
|
||||
'<div style="%s">',$args->widgetstyle,
|
||||
$style,
|
||||
$args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom,
|
||||
$args->document_srl,
|
||||
implode(' ',$attribute),
|
||||
$inner_style);
|
||||
|
||||
$widget_content_body = $body;
|
||||
$widget_content_footer = sprintf('</div><div class="clear"></div>'.
|
||||
'</div>'.
|
||||
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">%s</div>'.
|
||||
'</div>',base64_encode($body));
|
||||
|
||||
break;
|
||||
|
||||
// 위젯 박스일 경우
|
||||
case 'widgetBox' :
|
||||
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf(
|
||||
'<div class="widgetOutput" widgetstyle="%s" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" %s >'.
|
||||
'<div class="widgetBoxResize"></div>'.
|
||||
'<div class="widgetBoxResizeLeft"></div>'.
|
||||
'<div class="widgetBoxBorder"><div class="nullWidget" style="%s">',$args->widgetstyle,$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,implode(' ',$attribute),$inner_style);
|
||||
|
||||
$widget_content_body = $widgetbox_content;
|
||||
|
||||
break;
|
||||
|
||||
// 일반 위젯일 경우
|
||||
default :
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget'))) continue;
|
||||
if(strlen($val)==0) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf('<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
|
||||
'<div class="widgetResize"></div>'.
|
||||
'<div class="widgetResizeLeft"></div>'.
|
||||
'<div class="widgetBorder">',$args->widgetstyle,$style,
|
||||
$widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,
|
||||
$widget, implode(' ',$attribute));
|
||||
|
||||
$widget_content_body = sprintf('<div style="%s">%s</div><div class="clear"></div>',$inner_style, $widget_content);
|
||||
|
||||
$widget_content_footer = '</div></div>';
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 위젯 스타일을 컴파일 한다.
|
||||
if($args->widgetstyle){
|
||||
$widget_content_body = WidgetHandler::complieWidgetStyle($args->widgetstyle,$widget, $widget_content_body, $args, $include_info);
|
||||
}
|
||||
|
||||
$output = $widget_content_header . $widget_content_body . $widget_content_footer;
|
||||
|
||||
// 위젯 결과물 생성 시간을 debug 정보에 추가
|
||||
if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start;
|
||||
// 결과 return
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 객체를 return
|
||||
**/
|
||||
function getObject($widget) {
|
||||
if(!$GLOBALS['_xe_loaded_widgets_'][$widget]) {
|
||||
// 일단 위젯의 위치를 찾음
|
||||
$oWidgetModel = &getModel('widget');
|
||||
$path = $oWidgetModel->getWidgetPath($widget);
|
||||
|
||||
// 위젯 클래스 파일을 찾고 없으면 에러 출력 (html output)
|
||||
$class_file = sprintf('%s%s.class.php', $path, $widget);
|
||||
if(!file_exists($class_file)) return sprintf(Context::getLang('msg_widget_is_not_exists'), $widget);
|
||||
|
||||
// 위젯 클래스를 include
|
||||
require_once($class_file);
|
||||
|
||||
// 객체 생성
|
||||
$eval_str = sprintf('$oWidget = new %s();', $widget);
|
||||
@eval($eval_str);
|
||||
if(!is_object($oWidget)) return sprintf(Context::getLang('msg_widget_object_is_null'), $widget);
|
||||
|
||||
if(!method_exists($oWidget, 'proc')) return sprintf(Context::getLang('msg_widget_proc_is_null'), $widget);
|
||||
|
||||
$oWidget->widget_path = $path;
|
||||
|
||||
$GLOBALS['_xe_loaded_widgets_'][$widget] = $oWidget;
|
||||
}
|
||||
return $GLOBALS['_xe_loaded_widgets_'][$widget];
|
||||
}
|
||||
|
||||
|
||||
function complieWidgetStyle($widgetStyle,$widget,$widget_content_body, $args, $include_info){
|
||||
if(!$widgetStyle) return $widget_content_body;
|
||||
|
||||
$oWidgetModel = &getModel('widget');
|
||||
|
||||
// 위젯 스타일의 extra_var를 가져와 묶는다
|
||||
$widgetstyle_info = $oWidgetModel->getWidgetStyleInfo($widgetStyle);
|
||||
if(!$widgetstyle_info) return $widget_content_body;
|
||||
|
||||
$widgetstyle_extar_var_key = get_object_vars($widgetstyle_info);
|
||||
if(count($widgetstyle_extar_var_key['extra_var'])){
|
||||
foreach($widgetstyle_extar_var_key['extra_var'] as $key => $val){
|
||||
$widgetstyle_extar_var->{$key} = $args->{$key};
|
||||
}
|
||||
}
|
||||
Context::set('widgetstyle_extar_var', $widgetstyle_extar_var);
|
||||
|
||||
if($include_info && $widget=='widgetBox'){
|
||||
Context::set('widget_content', '<div class="widget_inner">'.$widget_content_body.'</div>');
|
||||
}else{
|
||||
Context::set('widget_content', $widget_content_body);
|
||||
}
|
||||
|
||||
// 컴파일
|
||||
$widgetstyle_path = $oWidgetModel->getWidgetStylePath($widgetStyle);
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
$tpl = $oTemplate->compile($widgetstyle_path, 'widgetstyle');
|
||||
|
||||
return $tpl;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ span.button { padding:0; background-position:left top;}
|
|||
span.button, x:-moz-any-link{ font:0/23px Sans-serif; padding:11px 0;} /* Firefox 2 Fix */
|
||||
span.button, x:-moz-any-link, x:default{ padding:0;} /* Firefox 2 Fix */
|
||||
span.button button,
|
||||
span.button input { height:23px; left:2px; /**top:-1px;*/ _top:0; padding:0 10px 0 8px; *padding:0 5px 0 3px; line-height:24px; background-position:right top; cursor:pointer;}
|
||||
span.button input { height:23px; left:2px; *top:-1px; _top:0; padding:0 10px 0 8px; *padding:0 5px 0 3px; line-height:24px; background-position:right top; cursor:pointer;}
|
||||
/* Large Size */
|
||||
span.button.large { background-position:left -30px;}
|
||||
span.button.large, x:-moz-any-link{ font:0/29px Sans-serif; padding:14px 0;} /* Firefox 2 Fix */
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@
|
|||
<body>
|
||||
{Context::getBodyHeader()}
|
||||
|
||||
{$zbxe_final_content}
|
||||
{$content}
|
||||
|
||||
{Context::getHtmlFooter()}
|
||||
|
||||
|
|
|
|||
|
|
@ -92,8 +92,8 @@
|
|||
$obj->member_srl = -1*$logged_info->member_srl;
|
||||
$obj->email_address = $obj->homepage = $obj->user_id = '';
|
||||
$obj->user_name = $obj->nick_name = 'anonymous';
|
||||
$output = executeQuery('document.updateDocument', $obj);
|
||||
if(!$output->toBool()) return $output;
|
||||
$anonymous_output = executeQuery('document.updateDocument', $obj);
|
||||
if(!$anonymous_output->toBool()) return $output;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -300,7 +300,6 @@
|
|||
$oContext = &Context::getInstance();
|
||||
|
||||
$content = $this->getContent($add_popup_menu, $add_content_info, $resource_realpath, $add_xe_content_class);
|
||||
$content = $oContext->transContent($content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
|
|
|||
BIN
modules/editor/components/emoticon/component_icon.gif
Executable file
BIN
modules/editor/components/emoticon/component_icon.gif
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 573 B |
BIN
modules/editor/components/multimedia_link/component_icon.gif
Executable file
BIN
modules/editor/components/multimedia_link/component_icon.gif
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 334 B |
BIN
modules/editor/components/quotation/component_icon.gif
Executable file
BIN
modules/editor/components/quotation/component_icon.gif
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 94 B |
|
|
@ -37,6 +37,9 @@
|
|||
// 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가
|
||||
$oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before');
|
||||
|
||||
// 2009. 04. 14 editor component 변환 코드를 trigger로 독립
|
||||
$oModuleController->insertTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before');
|
||||
|
||||
return new Object();
|
||||
}
|
||||
|
||||
|
|
@ -53,6 +56,9 @@
|
|||
// 2007. 10. 23 모듈의 추가 설정에서 에디터 trigger 추가
|
||||
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before')) return true;
|
||||
|
||||
// 2009. 04. 14 editor component 변환 코드를 trigger로 독립
|
||||
if(!$oModuleModel->getTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before')) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -73,6 +79,10 @@
|
|||
if(!$oModuleModel->getTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before'))
|
||||
$oModuleController->insertTrigger('module.dispAdditionSetup', 'editor', 'view', 'triggerDispEditorAdditionSetup', 'before');
|
||||
|
||||
// 2009. 04. 14 editor component 변환 코드를 trigger로 독립
|
||||
if(!$oModuleModel->getTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before'))
|
||||
$oModuleController->insertTrigger('display', 'editor', 'controller', 'triggerEditorComponentCompile', 'before');
|
||||
|
||||
return new Object(0, 'success_updated');
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,19 +28,6 @@
|
|||
$this->setMessage('msg_auto_saved');
|
||||
}
|
||||
|
||||
function doSaveDoc($args) {
|
||||
|
||||
if(Context::get('is_logged')) {
|
||||
$logged_info = Context::get('logged_info');
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
} else {
|
||||
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
|
||||
}
|
||||
|
||||
// 저장
|
||||
return executeQuery('editor.insertSavedDoc', $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 자동저장된 문서 삭제
|
||||
**/
|
||||
|
|
@ -79,30 +66,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 게시글의 입력/수정이 일어났을 경우 자동 저장문서를 제거하는 trigger
|
||||
**/
|
||||
function triggerDeleteSavedDoc(&$obj) {
|
||||
$this->deleteSavedDoc();
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 자동 저장된 글을 삭제
|
||||
* 현재 접속한 사용자를 기준
|
||||
**/
|
||||
function deleteSavedDoc() {
|
||||
if(Context::get('is_logged')) {
|
||||
$logged_info = Context::get('logged_info');
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
} else {
|
||||
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
|
||||
}
|
||||
|
||||
// 일단 이전 저장본 삭제
|
||||
return executeQuery('editor.deleteSavedDoc', $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 에디터의 모듈별 추가 확장 폼을 저장
|
||||
**/
|
||||
|
|
@ -171,6 +134,93 @@
|
|||
$this->setMessage('success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 에디터컴포넌트의 코드를 결과물로 변환
|
||||
**/
|
||||
function triggerEditorComponentCompile(&$content) {
|
||||
$content = $this->transComponent($content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 에디터 컴포넌트코드를 결과물로 변환
|
||||
**/
|
||||
function transComponent($content) {
|
||||
$content = preg_replace_callback('!<div([^\>]*)editor_component=([^\>]*)>(.*?)\<\/div\>!is', array($this,'transEditorComponent'), $content);
|
||||
$content = preg_replace_callback('!<img([^\>]*)editor_component=([^\>]*?)\>!is', array($this,'transEditorComponent'), $content);
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 내용의 에디터 컴포넌트 코드를 변환
|
||||
**/
|
||||
function transEditorComponent($matches) {
|
||||
// IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌
|
||||
$buff = $matches[0];
|
||||
$buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $buff);
|
||||
$buff = str_replace("&","&",$buff);
|
||||
|
||||
// 에디터 컴포넌트에서 생성된 코드
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse($buff);
|
||||
if($xml_doc->div) $xml_doc = $xml_doc->div;
|
||||
else if($xml_doc->img) $xml_doc = $xml_doc->img;
|
||||
|
||||
$xml_doc->body = $matches[3];
|
||||
|
||||
// attribute가 없으면 return
|
||||
$editor_component = $xml_doc->attrs->editor_component;
|
||||
if(!$editor_component) return $matches[0];
|
||||
|
||||
// component::transHTML() 을 이용하여 변환된 코드를 받음
|
||||
$oEditorModel = &getModel('editor');
|
||||
$oComponent = &$oEditorModel->getComponentObject($editor_component, 0);
|
||||
if(!is_object($oComponent)||!method_exists($oComponent, 'transHTML')) return $matches[0];
|
||||
|
||||
return $oComponent->transHTML($xml_doc);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 자동 저장
|
||||
**/
|
||||
function doSaveDoc($args) {
|
||||
|
||||
if(Context::get('is_logged')) {
|
||||
$logged_info = Context::get('logged_info');
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
} else {
|
||||
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
|
||||
}
|
||||
|
||||
// 저장
|
||||
return executeQuery('editor.insertSavedDoc', $args);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief 게시글의 입력/수정이 일어났을 경우 자동 저장문서를 제거하는 trigger
|
||||
**/
|
||||
function triggerDeleteSavedDoc(&$obj) {
|
||||
$this->deleteSavedDoc();
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 자동 저장된 글을 삭제
|
||||
* 현재 접속한 사용자를 기준
|
||||
**/
|
||||
function deleteSavedDoc() {
|
||||
if(Context::get('is_logged')) {
|
||||
$logged_info = Context::get('logged_info');
|
||||
$args->member_srl = $logged_info->member_srl;
|
||||
} else {
|
||||
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
|
||||
}
|
||||
|
||||
// 일단 이전 저장본 삭제
|
||||
return executeQuery('editor.deleteSavedDoc', $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 가상 사이트에서 사용된 에디터 컴포넌트 정보를 제거
|
||||
**/
|
||||
|
|
@ -256,6 +306,12 @@
|
|||
}
|
||||
|
||||
$component_list->{$component_name} = $xml_info;
|
||||
|
||||
// 버튼, 아이콘 이미지 구함
|
||||
$icon_file = _XE_PATH_.'modules/editor/components/'.$component_name.'/icon.gif';
|
||||
$component_icon_file = _XE_PATH_.'modules/editor/components/'.$component_name.'/component_icon.gif';
|
||||
if(file_exists($icon_file)) $component_list->{$component_name}->icon = true;
|
||||
if(file_exists($component_icon_file)) $component_list->{$component_name}->component_icon = true;
|
||||
}
|
||||
|
||||
// enabled만 체크하도록 하였으면 그냥 return
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@
|
|||
|
||||
// SWFUploader에 세팅할 업로드 설정 구함
|
||||
$file_config = $oFileModel->getUploadConfig();
|
||||
$file_config->attached_size = $file_config->allowed_attach_size*1024*1024;
|
||||
$file_config->allowed_attach_size = $file_config->allowed_attach_size*1024*1024;
|
||||
$file_config->allowed_filesize = $file_config->allowed_filesize*1024*1024;
|
||||
|
||||
Context::set('file_config',$file_config);
|
||||
|
|
@ -404,8 +404,18 @@
|
|||
}
|
||||
|
||||
if(!file_exists($cache_file)) return;
|
||||
|
||||
@include($cache_file);
|
||||
|
||||
if(count($component_list)) {
|
||||
foreach($component_list as $key => $val) {
|
||||
if(!trim($key)) continue;
|
||||
if(!is_dir(_XE_PATH_.'modules/editor/components/'.$key)) {
|
||||
FileHandler::removeFile($cache_file);
|
||||
return $this->getComponentList($filter_enabled, $site_srl);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return $component_list;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,9 +31,7 @@
|
|||
<div style="display:none" id="editorExtension_{$editor_sequence}">
|
||||
<ul id="editor_component_{$editor_sequence}" class="editorComponent">
|
||||
<!--@foreach($component_list as $component_name => $component)-->
|
||||
<!--@if(!in_array($component_name,array('colorpicker_bg','colorpicker_text','emoticon','image_link','multimedia_link','quotation','table_maker','url_link')))-->
|
||||
<li><a href="#" onclick="return false;" id="component_{$editor_sequence}_{$component_name}"><img src="../../components/{$component_name}/component_icon.gif" alt="" /> {$component->title}</a></li>
|
||||
<!--@end-->
|
||||
<li><!--@if($component->component_icon)--><img src="../../components/{$component_name}/component_icon.gif" alt="" width="13" height="12"/><!--@end--> <a href="#" onclick="return false;" id="component_{$editor_sequence}_{$component_name}"> {$component->title}</a></li>
|
||||
<!--@end-->
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -223,6 +223,7 @@
|
|||
|
||||
.xpress-editor .tool li.style .layer{ padding:4px 2px; _overflow:hidden; filter:progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=135,strength=2);}
|
||||
.xpress-editor .tool li.style .layer li{ position:relative; background:#fbfbfb;}
|
||||
.xpress-editor .tool li.style .layer li img.component { width:13px; height:12px; }
|
||||
.xpress-editor .tool li.style .layer li button{ display:block; width:134px; position:relative;}
|
||||
.xpress-editor .tool li.style .layer li button span{ display:block; width:130px; text-align:left; letter-spacing:normal;}
|
||||
.xpress-editor .tool li.style .layer li.h3 button span{ padding:3px 0 1px 4px; height:15px; _height /**/:19px; font-size:16px; font-weight:bold;}
|
||||
|
|
|
|||
|
|
@ -419,7 +419,7 @@
|
|||
<div class="layer extension2 xpress_xeditor_extension_layer" id="editorExtension_{$editor_sequence}">
|
||||
<ul id="editor_component_{$editor_sequence}" class="editorComponent">
|
||||
<!--@foreach($component_list as $component_name => $component)-->
|
||||
<li><a href="#" onclick="return false;" id="component_{$editor_sequence}_{$component_name}">{$component->title}</a></li>
|
||||
<li><!--@if($component->component_icon)--><img src="../../components/{$component_name}/component_icon.gif" alt="" width="13" height="12"/> <!--@end--><a href="#" onclick="return false;" id="component_{$editor_sequence}_{$component_name}">{$component->title}</a></li>
|
||||
<!--@end-->
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
var uploadedFiles = new Array();
|
||||
var uploaderSettings = new Array();
|
||||
var loaded_images = new Array();
|
||||
var swfUploadObjs = new Array();
|
||||
|
||||
/**
|
||||
* 업로드를 하기 위한 준비 시작
|
||||
|
|
@ -15,7 +16,7 @@ var loaded_images = new Array();
|
|||
function editorUploadInit(obj) {
|
||||
if(typeof(obj["editorSequence"])=="undefined") return;
|
||||
if(typeof(obj["sessionName"])=="undefined") obj["sessionName"]= "PHPSESSID";
|
||||
if(typeof(obj["allowedFileSize"])=="undefined") obj["allowdFileSize"]= "2MB";
|
||||
if(typeof(obj["allowedFileSize"])=="undefined") obj["allowedFileSize"]= 2*1024*1024;
|
||||
if(typeof(obj["allowedFileTypes"])=="undefined") obj["allowedFileTypes"]= "*.*";
|
||||
if(typeof(obj["allowedFileTypesDescription"])=="undefined") obj["allowedFileTypesDescription"]= "All Files";
|
||||
if(typeof(obj["replaceButtonID"])=="undefined") obj["replaceButtonID"] = "swfUploadButton"+obj["editorSequence"];
|
||||
|
|
@ -44,11 +45,11 @@ function XEUploaderStart(obj) {
|
|||
"act" : "procFileUpload",
|
||||
"editor_sequence" : obj["editorSequence"]
|
||||
},
|
||||
file_size_limit : obj["allowedFileSize"],
|
||||
file_size_limit : parseInt(parseInt(obj["allowedFileSize"],10)/1024,10),
|
||||
file_queue_limit : 0,
|
||||
file_upload_limit : 0,
|
||||
file_types : obj["allowedFileTypes"],
|
||||
file_types_description : obj["allowedFileTypesDescription"],
|
||||
file_upload_limit : 0,
|
||||
file_queue_limit : 0,
|
||||
custom_settings : {
|
||||
progressTarget : null,
|
||||
cancelButtonId : null
|
||||
|
|
@ -88,6 +89,7 @@ function XEUploaderStart(obj) {
|
|||
|
||||
var swfu = new SWFUpload(settings);
|
||||
var swfObj = xGetElementById(swfu.movieName);
|
||||
swfUploadObjs[obj["editorSequence"]] = swfu.movieName;
|
||||
if(!swfObj) return;
|
||||
|
||||
swfObj.style.display = "block";
|
||||
|
|
@ -224,7 +226,7 @@ function reloadFileList(settings) {
|
|||
params["file_list_area_id"] = settings["fileListAreaID"];
|
||||
params["editor_sequence"] = settings["editorSequence"];
|
||||
params["mid"] = current_mid;
|
||||
var response_tags = new Array("error","message","files","upload_status","upload_target_srl","editor_sequence");
|
||||
var response_tags = new Array("error","message","files","upload_status","upload_target_srl","editor_sequence","left_size");
|
||||
exec_xml("file","getFileList", params, completeReloadFileList, response_tags, settings);
|
||||
}
|
||||
|
||||
|
|
@ -235,6 +237,7 @@ function completeReloadFileList(ret_obj, response_tags, settings) {
|
|||
var files = ret_obj['files'];
|
||||
var file_list_area_id = settings["fileListAreaID"];
|
||||
var listObj = xGetElementById(file_list_area_id);
|
||||
var left_size = parseInt(parseInt(ret_obj["left_size"],10)/1024,10);
|
||||
while(listObj.options.length) {
|
||||
listObj.remove(0);
|
||||
}
|
||||
|
|
@ -269,7 +272,9 @@ function completeReloadFileList(ret_obj, response_tags, settings) {
|
|||
previewFiles('', item[item.length-1].file_srl);
|
||||
}
|
||||
}
|
||||
//listObj.selectedIndex = listObj.options.length-1;
|
||||
|
||||
var swfu = SWFUpload.instances[swfUploadObjs[editor_sequence]].setFileSizeLimit(left_size);
|
||||
|
||||
xAddEventListener(listObj,'click',previewFiles);
|
||||
}
|
||||
|
||||
|
|
@ -380,7 +385,7 @@ function insertUploadedFile(editorSequence) {
|
|||
obj.src = file.download_url;
|
||||
}
|
||||
temp_code = '';
|
||||
temp_code += "<img editor_component=\"image_link\" src=\""+request_uri+file.download_url+"\" alt=\""+file.source_filename+"\"";
|
||||
temp_code += "<img src=\""+request_uri+file.download_url+"\" alt=\""+file.source_filename+"\"";
|
||||
if(obj.complete == true) { temp_code += " width=\""+obj.width+"\" height=\""+obj.height+"\""; }
|
||||
temp_code += " />\r\n";
|
||||
text.push(temp_code);
|
||||
|
|
|
|||
|
|
@ -53,11 +53,16 @@
|
|||
// 업로드 상태 표시 작성
|
||||
$upload_status = $this->getUploadStatus($attached_size);
|
||||
|
||||
// 남은 용량 체크
|
||||
$file_config = $this->getUploadConfig();
|
||||
$left_size = $file_config->allowed_attach_size*1024*1024 - $attached_size;
|
||||
|
||||
// 필요한 정보들 세팅
|
||||
$this->add("files",$files);
|
||||
$this->add("editor_sequence",$editor_sequence);
|
||||
$this->add("upload_target_srl",$upload_target_srl);
|
||||
$this->add("upload_status",$upload_status);
|
||||
$this->add("left_size",$left_size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -134,9 +134,8 @@
|
|||
function dispLayoutAdminPreview() {
|
||||
$layout_srl = Context::get('layout_srl');
|
||||
$code = Context::get('code');
|
||||
|
||||
$code_css = Context::get('code_css');
|
||||
if(!$layout_srl || !$code) return new Object(-1, 'msg_invalid_request');
|
||||
//$code = str_replace(array('<','>','"'), array('<','>','"'), $code);
|
||||
|
||||
// 레이아웃 정보 가져오기
|
||||
$oLayoutModel = &getModel('layout');
|
||||
|
|
@ -144,13 +143,10 @@
|
|||
if(!$layout_info) return new Object(-1, 'msg_invalid_request');
|
||||
|
||||
// faceoff 레이아웃일 경우 별도 처리
|
||||
if($layout_info && $layout_info->type == 'faceoff') {
|
||||
$oLayoutModel->doActivateFaceOff($layout_info);
|
||||
}
|
||||
if($layout_info && $layout_info->type == 'faceoff') $oLayoutModel->doActivateFaceOff($layout_info);
|
||||
|
||||
// 관리자 레이아웃 수정화면에서 변경된 CSS가 있는지 조사
|
||||
$edited_layout_css = $oLayoutModel->getUserLayoutCss($layout_srl);
|
||||
if(file_exists($edited_layout_css)) Context::addCSSFile($edited_layout_css);
|
||||
// 직접 입력된 CSS 적용
|
||||
Context::addHtmlHeader("<style type=\"text/css\" charset=\"UTF-8\">".$code_css."</style>");
|
||||
|
||||
// 레이아웃 정보중 extra_vars의 이름과 값을 $layout_info에 입력
|
||||
if($layout_info->extra_var_count) {
|
||||
|
|
@ -185,7 +181,6 @@
|
|||
|
||||
// 위젯등을 변환
|
||||
$oContext = &Context::getInstance();
|
||||
$layout_tpl = $oContext->transContent($layout_tpl);
|
||||
Context::set('layout_tpl', $layout_tpl);
|
||||
|
||||
// 임시 파일 삭제
|
||||
|
|
@ -215,9 +210,6 @@
|
|||
* @brief faceoff의 관리자 layout 수정
|
||||
**/
|
||||
function dispLayoutAdminLayoutModify(){
|
||||
// widget 을 수정용으로 컴파일
|
||||
Context::setTransWidgetCodeIncludeInfo(true);
|
||||
|
||||
//layout_srl 를 가져온다
|
||||
$current_module_info = Context::get('current_module_info');
|
||||
$layout_srl = $current_module_info->layout_srl;
|
||||
|
|
@ -257,6 +249,10 @@
|
|||
$oTemplate = &TemplateHandler::getInstance();
|
||||
Context::set('content', $oTemplate->compile($this->module_path.'tpl','about_faceoff'));
|
||||
|
||||
// 위젯 코드를 Javascript 수정모드로 변경
|
||||
$oWidgetController = &getController('widget');
|
||||
$oWidgetController->setWidgetCodeInJavascriptMode();
|
||||
|
||||
// 템플릿 파일 지정
|
||||
$this->setTemplateFile('faceoff_layout_edit');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ function doPreviewLayoutCode(layout_srl) {
|
|||
jQuery('input[name=act]','#fo_layout').val("dispLayoutAdminPreview");
|
||||
jQuery('#fo_layout').submit();
|
||||
jQuery('#fo_layout').removeAttr('target');
|
||||
// .submit().removeAttr('target').find('input[name=act]').val('');
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
$lang->page = "Page";
|
||||
$lang->about_page = "It is a blog module which you can create a complete page.\nUsing latest or other widgets, you can create a dynamic page. Through the editor component, you can also create a great variety of pages.\nIts URL is same as other module's such as mid=module name.\n If it is selected as a default, it will be the main page of the site.";
|
||||
$lang->cmd_page_modify = "Modify";
|
||||
$lang->page_caching_interval = "Caching Time";
|
||||
$lang->about_page_caching_interval = "The unit is minute, and it displays temporary saved data for assigned time.<br />It is recommended to cache for proper time if a lot of resources are needed when displaying other servers' data or information.<br />A value of 0 will not cache.";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -7,5 +7,7 @@
|
|||
|
||||
$lang->page = "Página";
|
||||
$lang->about_page = "Esto es un módulo de blog, lo cual usted puede crear una página completa.\nUsando los últimos u otros widgets, Usted puede crear una página dinámica. A través del componente del editor, también puede crear páginas de gran variedad.\nURL de conección es el mismo que de los otros módulos como mid=Nombre del módulo.\n Si selcciona como predefinido esta página será la página principal del sitio.";
|
||||
$lang->page_caching_interval = "Establezca el tiempo de cache";
|
||||
$lang->about_page_caching_interval = "La unidad es minuto, y se muestra temporal de los datos guardados por el tiempo asignado. <br /> Se recomienda a la cache para una buena vez si una gran cantidad de recursos se necesitan otros servidores cuando se muestran los datos o la informacion. <br /> Un valor de 0 no cache.";
|
||||
$lang->cmd_page_modify = "Modificar";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
$lang->page = "Page";
|
||||
$lang->about_page = "C'est un module qui peut créer une page complet.\nVous pouvez créer une page dynamique en utilisant des gadgets des Documents derniers ou d'autres. Vous pouvez aussi créer une page avec variété par le composant d'editeur.\nL'URL d'accès est égal celui d'autre module comme mid=module.\nSi c'est choisi par défaut, ce sera la première page du site.";
|
||||
$lang->cmd_page_modify = "Modifier";
|
||||
$lang->page_caching_interval = "Temps de antémémoire";
|
||||
$lang->about_page_caching_interval = "L'unité est minute, et ça exposera des données conservées temporairement pendant le temps assigné.<br />Il est recommandé d'utiliser l'antémémoire pendant le temps convenable si beaucoup de ressource est nécessaire pour représenter les données ou l'information d'autre serveur.<br />La valeur 0 signifie de ne pas utiliser antémémoire.";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
$lang->page = "ページ";
|
||||
$lang->about_page = "一枚のページを作成出来るモジュールです。\n最新書き込みウィジェットや他のウィジェットを用いて動的なページが作成が出来、さらにエディターのコンポネントで様々なデザインも出来ます。\n接続URLは、他のモジュールと同様に、「mid=モジュール名」でアクセスし、デフォルトとして指定するとサイトにアクセスする際、メインページとして使われます。";
|
||||
$lang->cmd_page_modify = "ページ修正";
|
||||
$lang->page_caching_interval = "キャッシング時間設定";
|
||||
$lang->about_page_caching_interval = "分単位で指定出来、設定された時間の間は、臨時保存されたデータを出力します。<br />他のサーバの情報を出力したり、データを出力する際、リソースが多く使われるため、数分単位でキャッシングすることをお勧めします。<br />「0」に指定するとキャッシングされません。";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
$lang->page = '페이지';
|
||||
$lang->about_page = "하나의 완성된 페이지를 제작할 수 있는 페이지 모듈입니다.\n최근게시물이나 기타 위젯을 이용해서 동적인 페이지 생성이 가능하고 에디터 컴포넌트를 통해서 다양한 모습으로 꾸밀 수 있습니다.\n접속 URL은 다른 모듈처 mid=모듈이름 으로 접속이 가능하며 기본으로 선택하면 접속시 메인 페이지가 됩니다";
|
||||
$lang->cmd_page_modify = '페이지 수정';
|
||||
$lang->page_caching_interval = '캐싱 시간 설정';
|
||||
$lang->about_page_caching_interval = '단위는 분이며 정해진 시간동안은 임시 저장한 데이터를 출력하도록 합니다.<br />다른 서버의 정보를 출력하거나 데이터 출력시 많은 자원이 필요하면 원하시는 분 단위로 캐싱하시는 것을 추천해드립니다.<br />0 으로 하시면 캐싱을 하지 않습니다';
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -7,5 +7,7 @@
|
|||
|
||||
$lang->page = "Страница";
|
||||
$lang->about_page = "Это модуль блога, который создает полную страницу.\nИспользуя последние и другие виджеты, Вы можете создавать динамические страницы. Посредством компонента редактора, Вы можете также создать различные вариации страницы.\nURL модуля следует тем же правилам, что и другие модули: mid=имя_модуля.\n Если он выбран как модуль по умолчанию, то он будет главной страницей сайта.";
|
||||
$lang->page_caching_interval = "Установить время кеширования";
|
||||
$lang->about_page_caching_interval = "Единица измерения равна одной минуте. Это отображает временно сохраненные данные для присвоенного времени.<br />Рекомендуется устанавливать разумное время кеширования, если множество ресурсов нуждаются в показе данных с других серверов.<br />Значение 0 отключает кеширование.";
|
||||
$lang->cmd_page_modify = "Изменить";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
$lang->page = "页面";
|
||||
$lang->about_page = "可制作完整页面的模块。\n利用最新主题列表或其他控件可以生成动态的页面,且通过网页编辑器做出形式多样的页面。\n连接页面URL同其他模块链接相同。即:mid=模块名称。选择默认选项此页面将变为首页。";
|
||||
$lang->cmd_page_modify = "页面编辑";
|
||||
$lang->page_caching_interval = "缓冲时间设置";
|
||||
$lang->about_page_caching_interval = "单位为分。缓冲时间内页面将输出临时储存的数据。<br />输出外部服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。<br />0 表示无缓冲。";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@
|
|||
$lang->page = "頁面";
|
||||
$lang->about_page = "可製作完整頁面的模組。\n利用最新主題列表或其他控件可以建立動態的頁面,且通過網頁編輯器做出多樣化的頁面。\n連結頁面網址和其他模組連結的方式相同。即:mid=模組名稱。選擇預設選項時,此頁面將變為首頁。";
|
||||
$lang->cmd_page_modify = "頁面編輯";
|
||||
$lang->page_caching_interval = "暫存時間設置";
|
||||
$lang->about_page_caching_interval = "單位為分。暫存時間內頁面將輸出臨時儲存的資料。<br />輸出外部主機訊息或資料時,如消耗資源很大,盡量把暫存時間設大一點。<br />『0』表示不暫存。";
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -73,19 +73,7 @@
|
|||
// GET parameter에서 module_srl을 가져옴
|
||||
$module_srl = Context::get('module_srl');
|
||||
|
||||
// module model 객체 생성
|
||||
if($module_srl) {
|
||||
$oModuleModel = &getModel('module');
|
||||
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
|
||||
if($module_info->module_srl == $module_srl) {
|
||||
moduleModel::syncModuleToSite($module_info);
|
||||
Context::set('module_info',$module_info);
|
||||
}
|
||||
else {
|
||||
unset($module_info);
|
||||
unset($module_srl);
|
||||
}
|
||||
}
|
||||
$module_info = Context::get('module_info');
|
||||
|
||||
// module_srl 값이 없다면 그냥 index 페이지를 보여줌
|
||||
if(!$module_srl) return $this->dispPageAdminContent();
|
||||
|
|
|
|||
|
|
@ -26,8 +26,27 @@
|
|||
// 템플릿에서 사용할 변수를 Context::set()
|
||||
if($this->module_srl) Context::set('module_srl',$this->module_srl);
|
||||
|
||||
// 캐시 파일 지정
|
||||
$cache_file = sprintf("%sfiles/cache/page/%d.%s.cache.php", _XE_PATH_, $this->module_info->module_srl, Context::getLangType());
|
||||
$interval = (int)($this->module_info->page_caching_interval);
|
||||
if($interval>0) {
|
||||
if(!file_exists($cache_file)) $mtime = 0;
|
||||
else $mtime = filemtime($cache_file);
|
||||
|
||||
if($mtime + $interval*60 > time()) {
|
||||
$page_content = FileHandler::readFile($cache_file);
|
||||
} else {
|
||||
$oWidgetController = &getController('widget');
|
||||
$page_content = $oWidgetController->transWidgetCode($this->module_info->content);
|
||||
FileHandler::writeFile($cache_file, $page_content);
|
||||
}
|
||||
} else {
|
||||
if(file_exists($cache_file)) FileHandler::removeFile($cache_file);
|
||||
$page_content = $this->module_info->content;
|
||||
}
|
||||
|
||||
Context::set('module_info', $this->module_info);
|
||||
Context::set('page_content', $this->module_info->content);
|
||||
Context::set('page_content', $page_content);
|
||||
|
||||
$this->setTemplateFile('content');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,8 +16,10 @@
|
|||
// 권한 체크
|
||||
if(!$this->grant->access) return $oMobile->setContent(Context::getLang('msg_not_permitted'));
|
||||
|
||||
// 위젯의 내용을 추출/ 정리해서 보여줌
|
||||
$oMobile->setContent( Context::transContent($this->module_info->content) );
|
||||
// 위젯의 내용을 추출함
|
||||
$oWidgetController = &getController('widget');
|
||||
$content = $oWidgetController->transWidgetCode($this->module_info->content);
|
||||
$oMobile->setContent($content);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,8 +10,7 @@
|
|||
<param name="layout_srl" target="layout_srl" />
|
||||
<param name="browser_title" target="browser_title" />
|
||||
<param name="is_default" target="is_default" />
|
||||
<param name="view" target="view" />
|
||||
<param name="manager" target="manager" />
|
||||
<param name="page_caching_interval" target="page_caching_interval" />
|
||||
</parameter>
|
||||
<response callback_func="completeInsertPage">
|
||||
<tag name="error" />
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ function completeInsertPage(ret_obj) {
|
|||
url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispPageAdminInfo');
|
||||
if(page) url = url.setQuery('page',page);
|
||||
} else {
|
||||
url = current_url.setQuery('act','').setQuery('module_srl','');
|
||||
url = current_url;
|
||||
}
|
||||
|
||||
location.href = url;
|
||||
|
|
|
|||
|
|
@ -58,6 +58,13 @@
|
|||
<p>{$lang->about_layout}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><div>{$lang->page_caching_interval}</div></th>
|
||||
<td colspan="3">
|
||||
<input type="text" name="page_caching_interval" value="{(int)$module_info->page_caching_interval}" class="inputTypeText w40" /> {$lang->unit_min}
|
||||
<p>{$lang->about_page_caching_interval}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="4" class="button">
|
||||
<span class="button black strong"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
|
||||
|
|
|
|||
|
|
@ -57,6 +57,13 @@
|
|||
<p>{$lang->about_layout}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><div>{$lang->page_caching_interval}</div></th>
|
||||
<td colspan="3">
|
||||
<input type="text" name="page_caching_interval" value="{(int)$module_info->caching_interval}" class="inputTypeText w40" /> {$lang->unit_min}
|
||||
<p>{$lang->about_page_caching_interval}</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="row2">
|
||||
<th colspan="4" class="button">
|
||||
<span class="button black strong"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@
|
|||
$module_info->module_srl = $dummy->module_srl;
|
||||
$module_info->browser_title = $dummy->browser_title;
|
||||
$module_info->layout_srl = $dummy->layout_srl;
|
||||
if($module_info->logo_image) $module_info->logo_image = context::getFixUrl($module_info->logo_image);
|
||||
|
||||
if(count($skin_info)) foreach($skin_info as $key => $val) $module_info->{$key} = $val;
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,10 @@
|
|||
FileHandler::makeDir('./files/cache/widget');
|
||||
FileHandler::makeDir('./files/cache/widget_cache');
|
||||
|
||||
// widget compile을 위한 display.after 트리거 추가
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->insertTrigger('display', 'widget', 'controller', 'triggerWidgetCompile', 'before');
|
||||
|
||||
return new Object();
|
||||
}
|
||||
|
||||
|
|
@ -22,6 +26,11 @@
|
|||
* @brief 설치가 이상이 없는지 체크하는 method
|
||||
**/
|
||||
function checkUpdate() {
|
||||
$oModuleModel = &getModel('module');
|
||||
|
||||
// widget compile을 위한 display.after 트리거 추가 (2009. 04. 14)
|
||||
if(!$oModuleModel->getTrigger('display', 'widget', 'controller', 'triggerWidgetCompile', 'before')) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -29,7 +38,15 @@
|
|||
* @brief 업데이트 실행
|
||||
**/
|
||||
function moduleUpdate() {
|
||||
return new Object();
|
||||
$oModuleModel = &getModel('module');
|
||||
$oModuleController = &getController('module');
|
||||
|
||||
// widget compile을 위한 display.after 트리거 추가 (2009. 04. 14)
|
||||
if(!$oModuleModel->getTrigger('display', 'widget', 'controller', 'triggerWidgetCompile', 'before')) {
|
||||
$oModuleController->insertTrigger('display', 'widget', 'controller', 'triggerWidgetCompile', 'before');
|
||||
}
|
||||
|
||||
return new Object(0, 'success_updated');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -7,6 +7,14 @@
|
|||
|
||||
class widgetController extends widget {
|
||||
|
||||
// 위젯을 결과물이 아닌 수정/삭제등을 하기 위한 곳에서 사용하기 위한 flag
|
||||
// layout_javascript_mode 는 모든 결과물까지 포함하여 javascript mode로 변환시킴
|
||||
var $javascript_mode = false;
|
||||
var $layout_javascript_mode = false;
|
||||
|
||||
// 위젯 캐시 파일이 생성되는 곳
|
||||
var $cache_path = './files/cache/widget_cache/';
|
||||
|
||||
/**
|
||||
* @brief 초기화
|
||||
**/
|
||||
|
|
@ -14,67 +22,23 @@
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief request 변수와 위젯 정보를 통해 변수 정렬
|
||||
* @brief 선택된 위젯 - 스킨의 컬러셋을 return
|
||||
**/
|
||||
function arrangeWidgetVars($widget, $request_vars, &$vars) {
|
||||
$oWidgetModel = &getModel('widget');
|
||||
$widget_info = $oWidgetModel->getWidgetInfo($widget);
|
||||
function procWidgetGetColorsetList() {
|
||||
$widget = Context::get('selected_widget');
|
||||
$skin = Context::get('skin');
|
||||
|
||||
$widget = $vars->selected_widget;
|
||||
$vars->widgetstyle = $request_vars->widgetstyle;
|
||||
$path = sprintf('./widgets/%s/', $widget);
|
||||
$oModuleModel = &getModel('module');
|
||||
$skin_info = $oModuleModel->loadSkinInfo($path, $skin);
|
||||
|
||||
$vars->skin = trim($request_vars->skin);
|
||||
$vars->colorset = trim($request_vars->colorset);
|
||||
$vars->widget_sequence = (int)($request_vars->widget_sequence);
|
||||
$vars->widget_cache = (int)($request_vars->widget_cache);
|
||||
$vars->style = trim($request_vars->style);
|
||||
$vars->widget_padding_left = trim($request_vars->widget_padding_left);
|
||||
$vars->widget_padding_right = trim($request_vars->widget_padding_right);
|
||||
$vars->widget_padding_top = trim($request_vars->widget_padding_top);
|
||||
$vars->widget_padding_bottom = trim($request_vars->widget_padding_bottom);
|
||||
$vars->document_srl= trim($request_vars->document_srl);
|
||||
|
||||
|
||||
if(count($widget_info->extra_var)) {
|
||||
foreach($widget_info->extra_var as $key=>$val) {
|
||||
$vars->{$key} = trim($request_vars->{$key});
|
||||
}
|
||||
for($i=0;$i<count($skin_info->colorset);$i++) {
|
||||
$colorset = sprintf('%s|@|%s', $skin_info->colorset[$i]->name, $skin_info->colorset[$i]->title);
|
||||
$colorset_list[] = $colorset;
|
||||
}
|
||||
|
||||
// 위젯 스타일이 있는 경우
|
||||
if($request_vars->widgetstyle){
|
||||
$widgetStyle_info = $oWidgetModel->getWidgetStyleInfo($request_vars->widgetstyle);
|
||||
if(count($widgetStyle_info->extra_var)) {
|
||||
foreach($widgetStyle_info->extra_var as $key=>$val) {
|
||||
if($val->type =='color' || $val->type =='text' || $val->type =='select' || $val->type =='filebox'){
|
||||
$vars->{$key} = trim($request_vars->{$key});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if($vars->widget_sequence) {
|
||||
$cache_path = './files/cache/widget_cache/';
|
||||
$cache_file = sprintf('%s%d.%s.cache', $cache_path, $vars->widget_sequence, Context::getLangType());
|
||||
FileHandler::removeFile($cache_file);
|
||||
}
|
||||
|
||||
if($vars->widget_cache>0) $vars->widget_sequence = getNextSequence();
|
||||
|
||||
$attribute = array();
|
||||
foreach($vars as $key => $val) {
|
||||
if(!$val) {
|
||||
unset($vars->{$key});
|
||||
continue;
|
||||
}
|
||||
if(strpos($val,'|@|') > 0) $val = str_replace('|@|', ',', $val);
|
||||
$vars->{$key} = htmlspecialchars(Context::convertEncodingStr($val));
|
||||
$attribute[] = sprintf('%s="%s"', $key, Context::convertEncodingStr($val));
|
||||
}
|
||||
|
||||
return $attribute;
|
||||
if(count($colorset_list)) $colorsets = implode("\n", $colorset_list);
|
||||
$this->add('colorset_list', $colorsets);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -105,12 +69,14 @@
|
|||
$attribute = $this->arrangeWidgetVars($widget, Context::getRequestVars(), $vars);
|
||||
|
||||
// 결과물을 구함
|
||||
$oWidgetHandler = new WidgetHandler();
|
||||
$widget_code = $oWidgetHandler->execute($widget, $vars, true);
|
||||
$widget_code = $this->execute($widget, $vars, true);
|
||||
|
||||
$this->add('widget_code', $widget_code);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯스타일에 이미지 업로드
|
||||
**/
|
||||
function procWidgetStyleExtraImageUpload(){
|
||||
$attribute = $this->arrangeWidgetVars($widget, Context::getRequestVars(), $vars);
|
||||
|
||||
|
|
@ -120,132 +86,6 @@
|
|||
$this->setTemplateFile("top_refresh.html");
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief 선택된 위젯 - 스킨의 컬러셋을 return
|
||||
**/
|
||||
function procWidgetGetColorsetList() {
|
||||
$widget = Context::get('selected_widget');
|
||||
$skin = Context::get('skin');
|
||||
|
||||
$path = sprintf('./widgets/%s/', $widget);
|
||||
$oModuleModel = &getModel('module');
|
||||
$skin_info = $oModuleModel->loadSkinInfo($path, $skin);
|
||||
|
||||
for($i=0;$i<count($skin_info->colorset);$i++) {
|
||||
$colorset = sprintf('%s|@|%s', $skin_info->colorset[$i]->name, $skin_info->colorset[$i]->title);
|
||||
$colorset_list[] = $colorset;
|
||||
}
|
||||
|
||||
if(count($colorset_list)) $colorsets = implode("\n", $colorset_list);
|
||||
$this->add('colorset_list', $colorsets);
|
||||
}
|
||||
|
||||
/**
|
||||
* @breif 특정 content의 위젯 태그들을 변환하여 return
|
||||
**/
|
||||
function transWidgetCode($content, $include_info = false) {
|
||||
// 사용자 정의 언어 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($content);
|
||||
|
||||
// 편집 정보 포함 여부 체크
|
||||
$this->include_info = $include_info;
|
||||
|
||||
|
||||
// 박스 위젯을 다시 구함
|
||||
$content = preg_replace_callback('!<div([^\>]*)widget=([^\>]*?)\><div><div>((<img.*?>)*)!is', array($this,'transWidgetBox'), $content);
|
||||
|
||||
|
||||
// 내용중 위젯을 또다시 구함 (기존 버전에서 페이지 수정해 놓은것과의 호환을 위해서)
|
||||
$content = preg_replace_callback('!<img([^\>]*)widget=([^\>]*?)\>!is', array($this,'transWidget'), $content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 코드를 실제 php코드로 변경
|
||||
**/
|
||||
function transWidget($matches) {
|
||||
$buff = trim($matches[0]);
|
||||
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse(trim($buff));
|
||||
|
||||
if($xml_doc->img) $vars = $xml_doc->img->attrs;
|
||||
else $vars = $xml_doc->attrs;
|
||||
|
||||
if(!$vars->widget) return "";
|
||||
|
||||
// 위젯의 이름을 구함
|
||||
$widget = $vars->widget;
|
||||
unset($vars->widget);
|
||||
return WidgetHandler::execute($widget, $vars, $this->include_info);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 박스를 실제 php코드로 변경
|
||||
**/
|
||||
function transWidgetBox($matches) {
|
||||
$buff = preg_replace('/<div><div>(.*)$/i','</div>',$matches[0]);
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse($buff);
|
||||
|
||||
$vars = $xml_doc->div->attrs;
|
||||
$widget = $vars->widget;
|
||||
unset($vars->widget);
|
||||
|
||||
// 위젯의 이름을 구함
|
||||
if(!$widget) return $matches[0];
|
||||
$vars->widgetbox_content = $matches[3];
|
||||
return WidgetHandler::execute($widget, $vars, $this->include_info);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 특정 content내의 위젯을 다시 생성
|
||||
**/
|
||||
function recompileWidget($content) {
|
||||
// 언어 종류 가져옴
|
||||
$lang_list = Context::get('lang_supported');
|
||||
|
||||
// 위젯 캐시 sequence 를 가져옴
|
||||
preg_match_all('!<img([^\>]*)widget=([^\>]*?)\>!is', $content, $matches);
|
||||
|
||||
$cache_path = './files/cache/widget_cache/';
|
||||
|
||||
$oWidget = new WidgetHandler();
|
||||
$oXmlParser = new XmlParser();
|
||||
|
||||
$cnt = count($matches[1]);
|
||||
for($i=0;$i<$cnt;$i++) {
|
||||
$buff = $matches[0][$i];
|
||||
$xml_doc = $oXmlParser->parse(trim($buff));
|
||||
|
||||
$args = $xml_doc->img->attrs;
|
||||
if(!$args) continue;
|
||||
|
||||
// 캐싱하지 않을 경우 패스
|
||||
$widget = $args->widget;
|
||||
$sequence = $args->widget_sequence;
|
||||
$cache = $args->widget_cache;
|
||||
if(!$sequence || !$cache) continue;
|
||||
|
||||
if(count($args)) {
|
||||
foreach($args as $k => $v) $args->{$k} = urldecode($v);
|
||||
}
|
||||
|
||||
// 언어별로 위젯 캐시 파일이 있을 경우 재생성
|
||||
foreach($lang_list as $lang_type => $val) {
|
||||
$cache_file = sprintf('%s%d.%s.cache', $cache_path, $sequence, $lang_type);
|
||||
if(!file_exists($cache_file)) continue;
|
||||
|
||||
$oWidget->getCache($widget, $args, $lang_type, true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 컨텐츠 위젯 추가
|
||||
**/
|
||||
|
|
@ -421,7 +261,496 @@
|
|||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 코드를 Javascript로 수정/드래그등을 하기 위한 Javascript 수정 모드로 변환
|
||||
**/
|
||||
function setWidgetCodeInJavascriptMode() {
|
||||
$this->layout_javascript_mode = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 코드를 컴파일하여 내용을 출력하는 trigger
|
||||
* display::before 에서 호출됨
|
||||
**/
|
||||
function triggerWidgetCompile(&$content) {
|
||||
$content = $this->transWidgetCode($content, $this->layout_javascript_mode);
|
||||
return new Object();
|
||||
}
|
||||
|
||||
/**
|
||||
* @breif 특정 content의 위젯 태그들을 변환하여 return
|
||||
**/
|
||||
function transWidgetCode($content, $javascript_mode = false) {
|
||||
// 사용자 정의 언어 변경
|
||||
$oModuleController = &getController('module');
|
||||
$oModuleController->replaceDefinedLangCode($content);
|
||||
|
||||
// 편집 정보 포함 여부 체크
|
||||
$this->javascript_mode = $javascript_mode;
|
||||
|
||||
// 박스 위젯 코드 변경
|
||||
$content = preg_replace_callback('!<div([^\>]*)widget=([^\>]*?)\><div><div>((<img.*?>)*)!is', array($this,'transWidgetBox'), $content);
|
||||
|
||||
// 내용 위젯 코드 벼경
|
||||
$content = preg_replace_callback('!<img([^\>]*)widget=([^\>]*?)\>!is', array($this,'transWidget'), $content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 코드를 실제 코드로 변경
|
||||
**/
|
||||
function transWidget($matches) {
|
||||
$buff = trim($matches[0]);
|
||||
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse(trim($buff));
|
||||
|
||||
if($xml_doc->img) $vars = $xml_doc->img->attrs;
|
||||
else $vars = $xml_doc->attrs;
|
||||
|
||||
$widget = $vars->widget;
|
||||
if(!$widget) return $match[0];
|
||||
unset($vars->widget);
|
||||
|
||||
return $this->execute($widget, $vars, $this->javascript_mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 박스를 실제 코드로 변경
|
||||
**/
|
||||
function transWidgetBox($matches) {
|
||||
$buff = preg_replace('/<div><div>(.*)$/i','</div>',$matches[0]);
|
||||
$oXmlParser = new XmlParser();
|
||||
$xml_doc = $oXmlParser->parse($buff);
|
||||
|
||||
$vars = $xml_doc->div->attrs;
|
||||
$widget = $vars->widget;
|
||||
if(!$widget) return $matches[0];
|
||||
unset($vars->widget);
|
||||
|
||||
$vars->widgetbox_content = $matches[3];
|
||||
return $this->execute($widget, $vars, $this->javascript_mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 특정 content내의 위젯을 다시 생성
|
||||
* 페이지모듈등에서 위젯 캐시파일 재생성시 사용
|
||||
**/
|
||||
function recompileWidget($content) {
|
||||
// 언어 종류 가져옴
|
||||
$lang_list = Context::get('lang_supported');
|
||||
|
||||
// 위젯 캐시 sequence 를 가져옴
|
||||
preg_match_all('!<img([^\>]*)widget=([^\>]*?)\>!is', $content, $matches);
|
||||
|
||||
$oXmlParser = new XmlParser();
|
||||
|
||||
$cnt = count($matches[1]);
|
||||
for($i=0;$i<$cnt;$i++) {
|
||||
$buff = $matches[0][$i];
|
||||
$xml_doc = $oXmlParser->parse(trim($buff));
|
||||
|
||||
$args = $xml_doc->img->attrs;
|
||||
if(!$args) continue;
|
||||
|
||||
// 캐싱하지 않을 경우 패스
|
||||
$widget = $args->widget;
|
||||
$sequence = $args->widget_sequence;
|
||||
$cache = $args->widget_cache;
|
||||
if(!$sequence || !$cache) continue;
|
||||
|
||||
if(count($args)) {
|
||||
foreach($args as $k => $v) $args->{$k} = urldecode($v);
|
||||
}
|
||||
|
||||
// 언어별로 위젯 캐시 파일이 있을 경우 재생성
|
||||
foreach($lang_list as $lang_type => $val) {
|
||||
$cache_file = sprintf('%s%d.%s.cache', $this->cache_path, $sequence, $lang_type);
|
||||
if(!file_exists($cache_file)) continue;
|
||||
$oWidget->getCache($widget, $args, $lang_type, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 캐시 처리
|
||||
**/
|
||||
function getCache($widget, $args, $lang_type = null, $ignore_cache = false) {
|
||||
// 지정된 언어가 없으면 현재 언어 지정
|
||||
if(!$lang_type) $lang_type = Context::getLangType();
|
||||
|
||||
// widget, 캐시 번호와 캐시값이 설정되어 있는지 확인
|
||||
$widget_sequence = $args->widget_sequence;
|
||||
$widget_cache = $args->widget_cache;
|
||||
|
||||
/**
|
||||
* 캐시 번호와 캐시 값이 아예 없으면 바로 데이터를 추출해서 리턴
|
||||
**/
|
||||
if(!$ignore_cache && (!$widget_cache || !$widget_sequence)) {
|
||||
$oWidget = $this->getWidgetObject($widget);
|
||||
if(!$oWidget || !method_exists($oWidget, 'proc')) return;
|
||||
return $oWidget->proc($args);
|
||||
}
|
||||
|
||||
/**
|
||||
* 캐시 번호와 캐시값이 설정되어 있으면 캐시 파일을 불러오도록 함
|
||||
**/
|
||||
if(!is_dir($this->cache_path)) FileHandler::makeDir($this->cache_path);
|
||||
|
||||
// 캐시파일명을 구함
|
||||
$cache_file = sprintf('%s%d.%s.cache', $this->cache_path, $widget_sequence, $lang_type);
|
||||
|
||||
// 캐시 Lock 파일을 구함
|
||||
$lock_file = sprintf('%s%d.%s.lock', $this->cache_path, $widget_sequence, $lang_type);
|
||||
|
||||
// 캐시 파일이 존재하면 해당 파일의 유효성 검사 (lock파일이 있을 경우 유효성 검사하지 않음)
|
||||
if(!$ignore_cache && file_exists($cache_file)) {
|
||||
$filemtime = filemtime($cache_file);
|
||||
|
||||
// 수정 시간을 비교해서 캐싱중이어야 하거나 widget.controller.php 파일보다 나중에 만들어 졌다면 캐시값을 return
|
||||
if(file_exists($lock_file) || ($filemtime + $widget_cache*60 > time() && $filemtime > filemtime(_XE_PATH_.'modules/widget/widget.controller.php'))) {
|
||||
return FileHandler::readFile($cache_file);
|
||||
}
|
||||
}
|
||||
|
||||
// lock 파일 생성
|
||||
FileHandler::writeFile($lock_file, '');
|
||||
|
||||
// 캐시 파일을 갱신하여야 할 경우 lock파일을 만들고 캐시 생성
|
||||
$oWidget = $this->getWidgetObject($widget);
|
||||
if(!$oWidget || !method_exists($oWidget,'proc')) return;
|
||||
|
||||
$widget_content = $oWidget->proc($args);
|
||||
FileHandler::writeFile($cache_file, $widget_content);
|
||||
|
||||
// lock 파일 제거
|
||||
FileHandler::removeFile($lock_file);
|
||||
|
||||
return $widget_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯이름과 인자를 받아서 결과를 생성하고 결과 리턴
|
||||
* 태그 사용 templateHandler에서 $this->execute()를 실행하는 코드로 대체하게 된다
|
||||
*
|
||||
* $javascript_mode가 true일 경우 페이지 수정시 위젯 핸들링을 위한 코드까지 포함함
|
||||
**/
|
||||
function execute($widget, $args, $javascript_mode = false) {
|
||||
// 디버그를 위한 위젯 실행 시간 저장
|
||||
if(__DEBUG__==3) $start = getMicroTime();
|
||||
|
||||
// args값에서 urldecode를 해줌
|
||||
$object_vars = get_object_vars($args);
|
||||
if(count($object_vars)) {
|
||||
foreach($object_vars as $key => $val) {
|
||||
if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue;
|
||||
$args->{$key} = utf8RawUrlDecode($val);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 위젯이 widgetContent/ widgetBox가 아니라면 내용을 구함
|
||||
**/
|
||||
$widget_content = '';
|
||||
if($widget != 'widgetContent' && $widget != 'widgetBox') {
|
||||
if(!is_dir(sprintf(_XE_PATH_.'widgets/%s/',$widget))) return;
|
||||
|
||||
// 위젯의 내용을 담을 변수
|
||||
$widget_content = $this->getCache($widget, $args);
|
||||
}
|
||||
|
||||
if($widget == 'widgetBox'){
|
||||
$widgetbox_content = $args->widgetbox_content;
|
||||
}
|
||||
|
||||
/**
|
||||
* 관리자가 지정한 위젯의 style을 구함
|
||||
**/
|
||||
|
||||
// 가끔 잘못된 코드인 background-image:url(none)이 들어 있을 수가 있는데 이럴 경우 none에 대한 url을 요청하므로 무조건 제거함
|
||||
$style = preg_replace('/url\((.+)(\/?)none\)/is','', $args->style);
|
||||
|
||||
// 내부 여백을 둔 것을 구해서 style문으로 미리 변경해 놓음
|
||||
$widget_padding_left = $args->widget_padding_left;
|
||||
$widget_padding_right = $args->widget_padding_right;
|
||||
$widget_padding_top = $args->widget_padding_top;
|
||||
$widget_padding_bottom = $args->widget_padding_bottom;
|
||||
$inner_style = sprintf("padding:%dpx %dpx %dpx %dpx !important; padding:none !important;", $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left);
|
||||
|
||||
/**
|
||||
* 위젯 출력물을 구함
|
||||
**/
|
||||
|
||||
$widget_content_header = '';
|
||||
$widget_content_body = '';
|
||||
$widget_content_footer = '';
|
||||
|
||||
// 일반 페이지 호출일 경우 지정된 스타일만 꾸면서 바로 return 함
|
||||
if(!$javascript_mode) {
|
||||
if($args->id) $args->id = ' id="'.$args->id.'" ';
|
||||
switch($widget) {
|
||||
// 내용 직접 추가일 경우
|
||||
case 'widgetContent' :
|
||||
if($args->document_srl) {
|
||||
$oDocumentModel = &getModel('document');
|
||||
$oDocument = $oDocumentModel->getDocument($args->document_srl);
|
||||
$body = $oDocument->getContent(false,false,false, false);
|
||||
} else {
|
||||
$body = base64_decode($args->body);
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s"><div style="%s">', $args->id, $style, $inner_style);
|
||||
$widget_content_body = $body;
|
||||
$widget_content_footer = '</div></div>';
|
||||
|
||||
break;
|
||||
|
||||
// 위젯 박스일 경우
|
||||
case 'widgetBox' :
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s;"><div style="%s"><div>', $args->id, $style, $inner_style);
|
||||
$widget_content_body = $widgetbox_content;
|
||||
|
||||
break;
|
||||
|
||||
// 일반 위젯일 경우
|
||||
default :
|
||||
$widget_content_header = sprintf('<div %sstyle="overflow:hidden;%s">',$args->id,$style);
|
||||
$widget_content_body = sprintf('<div style="*zoom:1;%s">%s</div>', $inner_style,$widget_content);
|
||||
$widget_content_footer = '</div>';
|
||||
break;
|
||||
}
|
||||
|
||||
// 페이지 수정시에 호출되었을 경우 위젯 핸들링을 위한 코드 추가
|
||||
} else {
|
||||
switch($widget) {
|
||||
// 내용 직접 추가일 경우
|
||||
case 'widgetContent' :
|
||||
if($args->document_srl) {
|
||||
$oDocumentModel = &getModel('document');
|
||||
$oDocument = $oDocumentModel->getDocument($args->document_srl);
|
||||
$body = $oDocument->getContent(false,false,false);
|
||||
} else {
|
||||
$body = base64_decode($args->body);
|
||||
}
|
||||
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$oWidgetController = &getController('widget');
|
||||
|
||||
$widget_content_header = sprintf(
|
||||
'<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_left="%s" widget_padding_right="%s" widget_padding_top="%s" widget_padding_bottom="%s" widget="widgetContent" document_srl="%d" %s>'.
|
||||
'<div class="widgetResize"></div>'.
|
||||
'<div class="widgetResizeLeft"></div>'.
|
||||
'<div class="widgetBorder">'.
|
||||
'<div style="%s">',$args->widgetstyle,
|
||||
$style,
|
||||
$args->widget_padding_left, $args->widget_padding_right, $args->widget_padding_top, $args->widget_padding_bottom,
|
||||
$args->document_srl,
|
||||
implode(' ',$attribute),
|
||||
$inner_style);
|
||||
|
||||
$widget_content_body = $body;
|
||||
$widget_content_footer = sprintf('</div><div class="clear"></div>'.
|
||||
'</div>'.
|
||||
'<div class="widgetContent" style="display:none;width:1px;height:1px;overflow:hidden;">%s</div>'.
|
||||
'</div>',base64_encode($body));
|
||||
|
||||
break;
|
||||
|
||||
// 위젯 박스일 경우
|
||||
case 'widgetBox' :
|
||||
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget','widgetstyle','document_srl'))) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf(
|
||||
'<div class="widgetOutput" widgetstyle="%s" widget="widgetBox" style="%s;" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" %s >'.
|
||||
'<div class="widgetBoxResize"></div>'.
|
||||
'<div class="widgetBoxResizeLeft"></div>'.
|
||||
'<div class="widgetBoxBorder"><div class="nullWidget" style="%s">',$args->widgetstyle,$style, $widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,implode(' ',$attribute),$inner_style);
|
||||
|
||||
$widget_content_body = $widgetbox_content;
|
||||
|
||||
break;
|
||||
|
||||
// 일반 위젯일 경우
|
||||
default :
|
||||
// args 정리
|
||||
$attribute = array();
|
||||
if($args) {
|
||||
foreach($args as $key => $val) {
|
||||
if(in_array($key, array('class','style','widget_padding_top','widget_padding_right','widget_padding_bottom','widget_padding_left','widget'))) continue;
|
||||
if(strlen($val)==0) continue;
|
||||
if(strpos($val,'|@|')>0) $val = str_replace('|@|',',',$val);
|
||||
$attribute[] = sprintf('%s="%s"', $key, str_replace('"','\"',$val));
|
||||
}
|
||||
}
|
||||
|
||||
$widget_content_header = sprintf('<div class="widgetOutput" widgetstyle="%s" style="%s" widget_padding_top="%s" widget_padding_right="%s" widget_padding_bottom="%s" widget_padding_left="%s" widget="%s" %s >'.
|
||||
'<div class="widgetResize"></div>'.
|
||||
'<div class="widgetResizeLeft"></div>'.
|
||||
'<div class="widgetBorder">',$args->widgetstyle,$style,
|
||||
$widget_padding_top, $widget_padding_right, $widget_padding_bottom, $widget_padding_left,
|
||||
$widget, implode(' ',$attribute));
|
||||
|
||||
$widget_content_body = sprintf('<div style="%s">%s</div><div class="clear"></div>',$inner_style, $widget_content);
|
||||
|
||||
$widget_content_footer = '</div></div>';
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 위젯 스타일을 컴파일 한다.
|
||||
if($args->widgetstyle) $widget_content_body = $this->complieWidgetStyle($args->widgetstyle,$widget, $widget_content_body, $args, $javascript_mode);
|
||||
|
||||
$output = $widget_content_header . $widget_content_body . $widget_content_footer;
|
||||
|
||||
// 위젯 결과물 생성 시간을 debug 정보에 추가
|
||||
if(__DEBUG__==3) $GLOBALS['__widget_excute_elapsed__'] += getMicroTime() - $start;
|
||||
|
||||
// 결과 return
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 위젯 객체를 return
|
||||
**/
|
||||
function getWidgetObject($widget) {
|
||||
if(!$GLOBALS['_xe_loaded_widgets_'][$widget]) {
|
||||
// 일단 위젯의 위치를 찾음
|
||||
$oWidgetModel = &getModel('widget');
|
||||
$path = $oWidgetModel->getWidgetPath($widget);
|
||||
|
||||
// 위젯 클래스 파일을 찾고 없으면 에러 출력 (html output)
|
||||
$class_file = sprintf('%s%s.class.php', $path, $widget);
|
||||
if(!file_exists($class_file)) return sprintf(Context::getLang('msg_widget_is_not_exists'), $widget);
|
||||
|
||||
// 위젯 클래스를 include
|
||||
require_once($class_file);
|
||||
|
||||
// 객체 생성
|
||||
$eval_str = sprintf('$oWidget = new %s();', $widget);
|
||||
@eval($eval_str);
|
||||
if(!is_object($oWidget)) return sprintf(Context::getLang('msg_widget_object_is_null'), $widget);
|
||||
|
||||
if(!method_exists($oWidget, 'proc')) return sprintf(Context::getLang('msg_widget_proc_is_null'), $widget);
|
||||
|
||||
$oWidget->widget_path = $path;
|
||||
|
||||
$GLOBALS['_xe_loaded_widgets_'][$widget] = $oWidget;
|
||||
}
|
||||
return $GLOBALS['_xe_loaded_widgets_'][$widget];
|
||||
}
|
||||
|
||||
|
||||
function complieWidgetStyle($widgetStyle,$widget,$widget_content_body, $args, $javascript_mode){
|
||||
if(!$widgetStyle) return $widget_content_body;
|
||||
|
||||
$oWidgetModel = &getModel('widget');
|
||||
|
||||
// 위젯 스타일의 extra_var를 가져와 묶는다
|
||||
$widgetstyle_info = $oWidgetModel->getWidgetStyleInfo($widgetStyle);
|
||||
if(!$widgetstyle_info) return $widget_content_body;
|
||||
|
||||
$widgetstyle_extar_var_key = get_object_vars($widgetstyle_info);
|
||||
if(count($widgetstyle_extar_var_key['extra_var'])){
|
||||
foreach($widgetstyle_extar_var_key['extra_var'] as $key => $val){
|
||||
$widgetstyle_extar_var->{$key} = $args->{$key};
|
||||
}
|
||||
}
|
||||
Context::set('widgetstyle_extar_var', $widgetstyle_extar_var);
|
||||
|
||||
if($javascript_mode && $widget=='widgetBox'){
|
||||
Context::set('widget_content', '<div class="widget_inner">'.$widget_content_body.'</div>');
|
||||
}else{
|
||||
Context::set('widget_content', $widget_content_body);
|
||||
}
|
||||
|
||||
// 컴파일
|
||||
$widgetstyle_path = $oWidgetModel->getWidgetStylePath($widgetStyle);
|
||||
$oTemplate = &TemplateHandler::getInstance();
|
||||
$tpl = $oTemplate->compile($widgetstyle_path, 'widgetstyle');
|
||||
|
||||
return $tpl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief request 변수와 위젯 정보를 통해 변수 정렬
|
||||
**/
|
||||
function arrangeWidgetVars($widget, $request_vars, &$vars) {
|
||||
$oWidgetModel = &getModel('widget');
|
||||
$widget_info = $oWidgetModel->getWidgetInfo($widget);
|
||||
|
||||
$widget = $vars->selected_widget;
|
||||
$vars->widgetstyle = $request_vars->widgetstyle;
|
||||
|
||||
$vars->skin = trim($request_vars->skin);
|
||||
$vars->colorset = trim($request_vars->colorset);
|
||||
$vars->widget_sequence = (int)($request_vars->widget_sequence);
|
||||
$vars->widget_cache = (int)($request_vars->widget_cache);
|
||||
$vars->style = trim($request_vars->style);
|
||||
$vars->widget_padding_left = trim($request_vars->widget_padding_left);
|
||||
$vars->widget_padding_right = trim($request_vars->widget_padding_right);
|
||||
$vars->widget_padding_top = trim($request_vars->widget_padding_top);
|
||||
$vars->widget_padding_bottom = trim($request_vars->widget_padding_bottom);
|
||||
$vars->document_srl= trim($request_vars->document_srl);
|
||||
|
||||
|
||||
if(count($widget_info->extra_var)) {
|
||||
foreach($widget_info->extra_var as $key=>$val) {
|
||||
$vars->{$key} = trim($request_vars->{$key});
|
||||
}
|
||||
}
|
||||
|
||||
// 위젯 스타일이 있는 경우
|
||||
if($request_vars->widgetstyle){
|
||||
$widgetStyle_info = $oWidgetModel->getWidgetStyleInfo($request_vars->widgetstyle);
|
||||
if(count($widgetStyle_info->extra_var)) {
|
||||
foreach($widgetStyle_info->extra_var as $key=>$val) {
|
||||
if($val->type =='color' || $val->type =='text' || $val->type =='select' || $val->type =='filebox'){
|
||||
$vars->{$key} = trim($request_vars->{$key});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($vars->widget_sequence) {
|
||||
$cache_file = sprintf('%s%d.%s.cache', $this->cache_path, $vars->widget_sequence, Context::getLangType());
|
||||
FileHandler::removeFile($cache_file);
|
||||
}
|
||||
|
||||
if($vars->widget_cache>0) $vars->widget_sequence = getNextSequence();
|
||||
|
||||
$attribute = array();
|
||||
foreach($vars as $key => $val) {
|
||||
if(!$val) {
|
||||
unset($vars->{$key});
|
||||
continue;
|
||||
}
|
||||
if(strpos($val,'|@|') > 0) $val = str_replace('|@|', ',', $val);
|
||||
$vars->{$key} = htmlspecialchars(Context::convertEncodingStr($val));
|
||||
$attribute[] = sprintf('%s="%s"', $key, Context::convertEncodingStr($val));
|
||||
}
|
||||
|
||||
return $attribute;
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
|
|
|||
|
|
@ -117,7 +117,6 @@
|
|||
* @brief 페이지 관리에서 사용될 코드 생성 팝업
|
||||
**/
|
||||
function dispWidgetGenerateCodeInPage() {
|
||||
|
||||
$oWidgetModel = &getModel('widget');
|
||||
$widget_list = $oWidgetModel->getDownloadedWidgetList();
|
||||
Context::set('widget_list',$widget_list);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue