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:
zero 2009-04-14 09:34:12 +00:00
parent 1ee64389ab
commit 32c3e86b1b
42 changed files with 838 additions and 810 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 573 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 B

View file

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

View file

@ -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("&","&amp;",$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

View file

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

View file

@ -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>
@ -96,4 +94,4 @@
<div class="file_attach_info" id="uploader_status_{$editor_sequence}">{$upload_status}</div>
</div>
<!--@end-->
</div>
</div>

View file

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

View file

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

View file

@ -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);
@ -410,4 +415,4 @@ function insertUploadedFile(editorSequence) {
if(text.length>0) editorReplaceHTML(iframe_obj, text.join(''));
}
}
}
}