mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-05 09:41:40 +09:00
혹시나 잘못 파일을 지웠을 때를 대비하여 DB에서 지우지는 않음. git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2532 201d5d3c-b55e-5fd7-737f-ddc643e51545
308 lines
13 KiB
PHP
308 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* @class editorModel
|
|
* @author zero (zero@nzeo.com)
|
|
* @brief editor 모듈의 model 클래스
|
|
**/
|
|
|
|
class editorModel extends editor {
|
|
|
|
var $loaded_component_list = array();
|
|
|
|
/**
|
|
* @brief 에디터를 return
|
|
**/
|
|
function getEditor($upload_target_srl, $option = null) {
|
|
// 파일 업로드 유무 옵션 설정
|
|
if(!$option->allow_fileupload) $allow_fileupload = false;
|
|
else $allow_fileupload = true;
|
|
|
|
// 자동 저장 유무 옵션 설정
|
|
if(!$option->enable_autosave) $enable_autosave = false;
|
|
else $enable_autosave = true;
|
|
|
|
// 기본 에디터 컴포넌트 사용 설정
|
|
if(!$option->enable_default_component) $enable_default_component = false;
|
|
else $enable_default_component = true;
|
|
|
|
// 확장 컴포넌트 사용 설정
|
|
if(!$option->enable_component) $enable_component = false;
|
|
else $enable_component = true;
|
|
|
|
// 크기 조절 옵션 설정
|
|
if(!$option->resizable) $resizable = 'false';
|
|
else $resizable = 'true';
|
|
|
|
// 높이 설정
|
|
if(!$option->height) $editor_height = 400;
|
|
else $editor_height = $option->height;
|
|
|
|
// 스킨 설정
|
|
if(!$option->skin) $skin = 'default';
|
|
else $skin = $option->skin;
|
|
|
|
// 대상 문서 번호 설정
|
|
Context::set('upload_target_srl', $upload_target_srl);
|
|
|
|
// 업로드 가능 변수 설정
|
|
if($allow_fileupload) {
|
|
// 첨부파일 모듈의 정보를 구함
|
|
$logged_info = Context::get('logged_info');
|
|
if($logged_info->member_srl && $logged_info->is_admin == 'Y') {
|
|
$file_config->allowed_filesize = 1024*1024*1024;
|
|
$file_config->allowed_attach_size = 1024*1024*1024;
|
|
$file_config->allowed_filetypes = '*.*';
|
|
} else {
|
|
$oModuleModel = &getModel('module');
|
|
$file_config = $oModuleModel->getModuleConfig('file');
|
|
$file_config->allowed_filesize = $file_config->allowed_filesize * 1024;
|
|
$file_config->allowed_attach_size = $file_config->allowed_attach_size * 1024;
|
|
}
|
|
Context::set('file_config',$file_config);
|
|
}
|
|
Context::set('allow_fileupload', $allow_fileupload);
|
|
|
|
// 자동백업 기능 체크
|
|
if($enable_autosave) {
|
|
$saved_doc = $this->getSavedDoc($upload_target_srl);
|
|
Context::set('saved_doc', $saved_doc);
|
|
}
|
|
Context::set('enable_autosave', $enable_autosave);
|
|
|
|
// 에디터 컴포넌트 체크
|
|
if($enable_component) {
|
|
if(!Context::get('component_list')) {
|
|
$component_list = $this->getComponentList();
|
|
Context::set('component_list', $component_list);
|
|
}
|
|
}
|
|
Context::set('enable_component', $enable_component);
|
|
Context::set('enable_default_component', $enable_default_component);
|
|
|
|
// resizable 가능한지 변수 설정
|
|
Context::set('enable_resizable', $resizable);
|
|
|
|
// 에디터 크기 설정
|
|
Context::set('editor_height', $editor_height);
|
|
|
|
// 템플릿을 미리 컴파일해서 컴파일된 소스를 return
|
|
$tpl_path = sprintf('%sskins/%s/', $this->module_path, $skin);
|
|
$tpl_file = 'editor.html';
|
|
|
|
// editor_path를 지정
|
|
Context::set('editor_path', $tpl_path);
|
|
|
|
// 만약 allow_fileupload == true 이면 upload_target_srl에 upload가능하다고 설정
|
|
if($allow_fileupload) {
|
|
$oFileController = &getController('file');
|
|
$oFileController->setUploadEnable($upload_target_srl);
|
|
}
|
|
$oTemplate = &TemplateHandler::getInstance();
|
|
return $oTemplate->compile($tpl_path, $tpl_file);
|
|
}
|
|
|
|
/**
|
|
* @brief 자동저장되어 있는 정보를 가져옴
|
|
**/
|
|
function getSavedDoc($upload_target_srl) {
|
|
// 로그인 회원이면 member_srl, 아니면 ipaddress로 저장되어 있는 문서를 찾음
|
|
if(Context::get('is_logged')) {
|
|
$logged_info = Context::get('logged_info');
|
|
$auto_save_args->member_srl = $logged_info->member_srl;
|
|
} else {
|
|
$auto_save_args->ipaddress = $_SERVER['REMOTE_ADDR'];
|
|
}
|
|
|
|
$output = executeQuery('editor.getSavedDocument', $auto_save_args);
|
|
$saved_doc = $output->data;
|
|
if(!$saved_doc) return;
|
|
|
|
// 원본 글이 저장되어 있지 않은 글일 경우 첨부된 파일이 있으면 현재 글 번호로 옮김
|
|
$oDocumentModel = &getModel('document');
|
|
$document = $oDocumentModel->getDocument($saved_doc->document_srl);
|
|
if($document->document_srl != $saved_doc->document_srl) {
|
|
$module_srl = Context::get('module_srl');
|
|
$oFileController = &getController('file');
|
|
$oFileController->moveFile($saved_doc->document_srl, $module_srl, $upload_target_srl);
|
|
}
|
|
|
|
return $saved_doc;
|
|
}
|
|
|
|
/**
|
|
* @brief component의 객체 생성
|
|
**/
|
|
function getComponentObject($component, $upload_target_srl = 0) {
|
|
if(!$this->loaded_component_list[$component][$upload_target_srl]) {
|
|
// 해당 컴포넌트의 객체를 생성해서 실행
|
|
$class_path = sprintf('%scomponents/%s/', $this->module_path, $component);
|
|
$class_file = sprintf('%s%s.class.php', $class_path, $component);
|
|
if(!file_exists($class_file)) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component));
|
|
|
|
// 클래스 파일을 읽은 후 객체 생성
|
|
require_once($class_file);
|
|
$eval_str = sprintf('$oComponent = new %s("%s","%s");', $component, $upload_target_srl, $class_path);
|
|
@eval($eval_str);
|
|
if(!$oComponent) return new Object(-1, sprintf(Context::getLang('msg_component_is_not_founded'), $component));
|
|
|
|
// 설정 정보를 추가
|
|
$component_info = $this->getComponent($component);
|
|
$oComponent->setInfo($component_info);
|
|
$this->loaded_component_list[$component][$upload_target_srl] = $oComponent;
|
|
}
|
|
|
|
return $this->loaded_component_list[$component][$upload_target_srl];
|
|
}
|
|
|
|
/**
|
|
* @brief component 목록을 return (DB정보 보함)
|
|
**/
|
|
function getComponentList($filter_enabled = true) {
|
|
if($filter_enabled) $args->enabled = "Y";
|
|
|
|
$output = executeQuery('editor.getComponentList', $args);
|
|
$db_list = $output->data;
|
|
|
|
// 파일목록을 구함
|
|
$downloaded_list = FileHandler::readDir($this->module_path.'components');
|
|
|
|
// DB 목록을 loop돌면서 xml정보까지 구함
|
|
if(!is_array($db_list)) $db_list = array($db_list);
|
|
foreach($db_list as $component) {
|
|
if(in_array($component->component_name, array('colorpicker_text','colorpicker_bg'))) continue;
|
|
$component_name = $component->component_name;
|
|
if(!$component_name) continue;
|
|
|
|
if(!in_array($component_name, $downloaded_list)) continue;
|
|
|
|
unset($xml_info);
|
|
$xml_info = $this->getComponentXmlInfo($component_name);
|
|
$xml_info->enabled = $component->enabled;
|
|
|
|
if($component->extra_vars && $xml_info->extra_vars) {
|
|
$extra_vars = unserialize($component->extra_vars);
|
|
foreach($xml_info->extra_vars as $key => $val) {
|
|
$xml_info->extra_vars->{$key}->value = $extra_vars->{$key};
|
|
}
|
|
}
|
|
|
|
$component_list->{$component_name} = $xml_info;
|
|
}
|
|
|
|
// enabled만 체크하도록 하였으면 그냥 return
|
|
if($filter_enabled) return $component_list;
|
|
|
|
// 다운로드된 목록의 xml_info를 마저 구함
|
|
foreach($downloaded_list as $component_name) {
|
|
if(in_array($component_name, array('colorpicker_text','colorpicker_bg'))) continue;
|
|
|
|
// 설정된 것이라면 패스
|
|
if($component_list->{$component_name}) continue;
|
|
|
|
// DB에 입력
|
|
$oEditorController = &getAdminController('editor');
|
|
$oEditorController->insertComponent($component_name, false);
|
|
|
|
// component_list에 추가
|
|
unset($xml_info);
|
|
$xml_info = $this->getComponentXmlInfo($component_name);
|
|
$xml_info->enabled = 'N';
|
|
|
|
$component_list->{$component_name} = $xml_info;
|
|
}
|
|
|
|
return $component_list;
|
|
}
|
|
|
|
/**
|
|
* @brief compnent의 xml+db정보를 구함
|
|
**/
|
|
function getComponent($component_name) {
|
|
$args->component_name = $component_name;
|
|
|
|
$output = executeQuery('editor.getComponent', $args);
|
|
$component = $output->data;
|
|
|
|
$component_name = $component->component_name;
|
|
|
|
unset($xml_info);
|
|
$xml_info = $this->getComponentXmlInfo($component_name);
|
|
$xml_info->enabled = $component->enabled;
|
|
|
|
if($component->extra_vars) {
|
|
$extra_vars = unserialize($component->extra_vars);
|
|
foreach($xml_info->extra_vars as $key => $val) {
|
|
$xml_info->extra_vars->{$key}->value = $extra_vars->{$key};
|
|
}
|
|
}
|
|
|
|
return $xml_info;
|
|
}
|
|
|
|
/**
|
|
* @brief component의 xml정보를 읽음
|
|
**/
|
|
function getComponentXmlInfo($component) {
|
|
$lang_type = Context::getLangType();
|
|
|
|
// 요청된 컴포넌트의 xml파일 위치를 구함
|
|
$component_path = sprintf('%s/components/%s/', $this->module_path, $component);
|
|
|
|
$xml_file = sprintf('%sinfo.xml', $component_path);
|
|
$cache_file = sprintf('./files/cache/editor/%s.%s.php', $component, $lang_type);
|
|
|
|
// 캐시된 xml파일이 있으면 include 후 정보 return
|
|
if(file_exists($cache_file) && file_exists($xml_file) && filemtime($cache_file) > filemtime($xml_file)) {
|
|
include($cache_file);
|
|
return $xml_info;
|
|
}
|
|
|
|
// 캐시된 파일이 없으면 파싱후 캐싱 후 return
|
|
$oParser = new XmlParser();
|
|
$xml_doc = $oParser->loadXmlFile($xml_file);
|
|
|
|
// 정보 정리
|
|
$xml_info->component_name = $component;
|
|
$xml_info->version = $xml_doc->component->attrs->version;
|
|
$xml_info->title = $xml_doc->component->title->body;
|
|
$xml_info->author->name = $xml_doc->component->author->name->body;
|
|
$xml_info->author->email_address = $xml_doc->component->author->attrs->email_address;
|
|
$xml_info->author->link = $xml_doc->component->author->attrs->link;
|
|
$xml_info->author->date = $xml_doc->component->author->attrs->date;
|
|
$xml_info->description = str_replace('\n', "\n", $xml_doc->component->author->description->body);
|
|
|
|
$buff = '<?php if(!defined("__ZBXE__")) exit(); ';
|
|
$buff .= sprintf('$xml_info->component_name = "%s";', $component);
|
|
$buff .= sprintf('$xml_info->version = "%s";', $xml_info->version);
|
|
$buff .= sprintf('$xml_info->title = "%s";', $xml_info->title);
|
|
$buff .= sprintf('$xml_info->author->name = "%s";', $xml_info->author->name);
|
|
$buff .= sprintf('$xml_info->author->email_address = "%s";', $xml_info->author->email_address);
|
|
$buff .= sprintf('$xml_info->author->link = "%s";', $xml_info->author->link);
|
|
$buff .= sprintf('$xml_info->author->date = "%s";', $xml_info->author->date);
|
|
$buff .= sprintf('$xml_info->description = "%s";', $xml_info->description);
|
|
|
|
// 추가 변수 정리 (에디터 컴포넌트에서는 text형만 가능)
|
|
$extra_vars = $xml_doc->component->extra_vars->var;
|
|
if($extra_vars) {
|
|
if(!is_array($extra_vars)) $extra_vars = array($extra_vars);
|
|
foreach($extra_vars as $key => $val) {
|
|
unset($obj);
|
|
$key = $val->attrs->name;
|
|
$title = $val->title->body;
|
|
$description = $val->description->body;
|
|
$xml_info->extra_vars->{$key}->title = $title;
|
|
$xml_info->extra_vars->{$key}->description = $description;
|
|
|
|
$buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'title', $title);
|
|
$buff .= sprintf('$xml_info->extra_vars->%s->%s = "%s";', $key, 'description', $description);
|
|
}
|
|
}
|
|
|
|
$buff .= ' ?>';
|
|
|
|
FileHandler::writeFile($cache_file, $buff, "w");
|
|
|
|
return $xml_info;
|
|
}
|
|
}
|
|
?>
|