diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php
index e5dfcc8bc..2b2dd594e 100644
--- a/classes/context/Context.class.php
+++ b/classes/context/Context.class.php
@@ -336,13 +336,14 @@
$flag = true;
foreach($obj as $key=>$val) {
if(!$val) continue;
- if($val && !iconv($charset,'UTF-8',$val)) $flag = false;
+ if($val && iconv($charset,$charset,$val)!=$val) $flag = false;
}
if($flag == true) {
foreach($obj as $key => $val) $obj->{$key} = iconv($charset,'UTF-8',$val);
return $obj;
}
}
+ return $obj;
}
/**
@@ -868,7 +869,7 @@
function _transEditorComponent($matches) {
// IE에서는 태그의 특성중에서 " 를 빼어 버리는 경우가 있기에 정규표현식으로 추가해줌
$buff = $matches[0];
- $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ]*)/i', array($this, _fixQuotation), $buff);
+ $buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', array($this, _fixQuotation), $buff);
$buff = str_replace("&","&",$buff);
// 위젯에서 생성된 코드 (img, div태그내에 editor_widget코드 존재)의 parameter를 추출
diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php
index 794faf53d..ddbca82c9 100644
--- a/classes/file/FileHandler.class.php
+++ b/classes/file/FileHandler.class.php
@@ -133,6 +133,7 @@
$url_info = parse_url($url);
if(!$url_info['port']) $url_info['port'] = 80;
+ if(!$url_info['path']) $url_info['path'] = '/';
$fp = @fsockopen($url_info['host'], $url_info['port']);
if(!$fp) return;
@@ -149,7 +150,7 @@
$url_info['path'] = $path;
}
- $header = sprintf("GET %s HTTP/2.0\r\nHost: %s\r\nReferer: %s://%s\r\nRequestUrl: %s\r\nConnection: Close\r\n\r\n", $url_info['path'], $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri());
+ $header = sprintf("GET %s HTTP/1.0\r\nHost: %s\r\nReferer: %s://%s\r\nRequestUrl: %s\r\nConnection: Close\r\n\r\n", $url_info['path'], $url_info['host'], $url_info['scheme'], $url_info['host'], Context::getRequestUri());
@fwrite($fp, $header);
diff --git a/modules/opage/conf/info.xml b/modules/opage/conf/info.xml
new file mode 100644
index 000000000..0b1d9aa8b
--- /dev/null
+++ b/modules/opage/conf/info.xml
@@ -0,0 +1,20 @@
+
+
절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다";
+ $lang->about_opage_path= "외부문서의 위치를 입력해주세요.
/path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.
http://url/sample.php 와 같이 사용하면 결과를 받아다가 출력을 하게 됩니다.
현재 제로보드XE가 설치된 절대경로는 다음과 같습니다.
";
+ $lang->about_opage_caching_interval = "단위는 분이며 정해진 시간동안은 임시 저장한 데이터를 출력하도록 합니다.
다른 서버의 정보를 출력하거나 데이터 출력시 많은 자원이 필요하면 원하시는 분 단위로 캐싱하시는 것을 추천해드립니다.
0 으로 하시면 캐싱을 하지 않습니다";
+?>
diff --git a/modules/opage/opage.admin.controller.php b/modules/opage/opage.admin.controller.php
new file mode 100644
index 000000000..32cdfffb4
--- /dev/null
+++ b/modules/opage/opage.admin.controller.php
@@ -0,0 +1,107 @@
+module = 'opage';
+ $module_args->mid = Context::get('opage_name');
+ if($module_args->is_default!='Y') $module_args->is_default = 'N';
+
+ // 외부 문서 위치, 캐싱 시간은 extra_vars에 저장
+ $config_args = Context::gets('path','caching_interval');
+ $module_args->extra_vars = serialize($config_args);
+
+ // module_srl이 넘어오면 원 모듈이 있는지 확인
+ if($module_args->module_srl) {
+ $oModuleModel = &getModel('module');
+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_args->module_srl);
+ }
+
+ // is_default=='Y' 이면 기본 모듈을 제거
+ if($module_args->is_default=='Y') $oModuleController->clearDefaultModule();
+
+ // module_srl의 값에 따라 insert/update
+ if($module_info->module_srl != $module_args->module_srl) {
+ $output = $oModuleController->insertModule($module_args);
+ $msg_code = 'success_registed';
+ } else {
+ $output = $oModuleController->updateModule($module_args);
+ $msg_code = 'success_updated';
+ }
+
+ // 등록 실패시 에러 반환
+ if(!$output->toBool()) return $output;
+
+ /**
+ * 권한 저장
+ **/
+ // 현 모듈의 권한 목록을 가져옴
+ $grant_list = $this->xml_info->grant;
+
+ if(count($grant_list)) {
+ foreach($grant_list as $key => $val) {
+ $group_srls = Context::get($key);
+ if($group_srls) $arr_grant[$key] = explode('|@|',$group_srls);
+ }
+ $grants = serialize($arr_grant);
+ }
+
+ $oModuleController = &getController('module');
+ $oModuleController->updateModuleGrant($module_info->module_srl, $grants);
+
+ // 캐시 파일 삭제
+ $cache_file = sprintf("./files/cache/opage/%d.cache", $module_info->module_srl);
+ if(file_exists($cache_file)) @unlink($cache_file);
+
+ // 등록 성공후 return될 메세지 정리
+ $this->add("module_srl", $module_args->module_srl);
+ $this->add("opage", Context::get('opage'));
+ $this->setMessage($msg_code);
+ }
+
+ /**
+ * @brief 외부페이지 삭제
+ **/
+ function procOpageAdminDelete() {
+ $module_srl = Context::get('module_srl');
+
+ // 원본을 구해온다
+ $oModuleController = &getController('module');
+ $output = $oModuleController->deleteModule($module_srl);
+ if(!$output->toBool()) return $output;
+
+ $this->add('module','opage');
+ $this->add('opage',Context::get('opage'));
+ $this->setMessage('success_deleted');
+ }
+
+ /**
+ * @brief 외부페이지 기본 정보의 추가
+ **/
+ function procOpageAdminInsertConfig() {
+ // 기본 정보를 받음
+ $args = Context::gets('test');
+
+ }
+
+ }
+?>
diff --git a/modules/opage/opage.admin.view.php b/modules/opage/opage.admin.view.php
new file mode 100644
index 000000000..252331b51
--- /dev/null
+++ b/modules/opage/opage.admin.view.php
@@ -0,0 +1,153 @@
+getModuleCategories();
+ Context::set('module_category', $module_category);
+
+ // 템플릿 경로 구함 (opage의 경우 tpl에 관리자용 템플릿 모아놓음)
+ $this->setTemplatePath($this->module_path.'tpl');
+ }
+
+ /**
+ * @brief 외부페이지 관리 목록 보여줌
+ **/
+ function dispOpageAdminContent() {
+ $args->sort_index = "module_srl";
+ $args->page = Context::get('page');
+ $args->list_count = 40;
+ $args->page_count = 10;
+ $args->s_module_category_srl = Context::get('module_category_srl');
+ $output = executeQuery('opage.getOpageList', $args);
+
+ // 템플릿에 쓰기 위해서 context::set
+ Context::set('total_count', $output->total_count);
+ Context::set('total_page', $output->total_page);
+ Context::set('page', $output->page);
+ Context::set('opage_list', $output->data);
+ Context::set('page_navigation', $output->page_navigation);
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('index');
+ }
+
+ /**
+ * @brief 선택된 외부페이지의 정보 출력
+ **/
+ function dispOpageAdminInfo() {
+ // GET parameter에서 module_srl을 가져옴
+ $module_srl = Context::get('module_srl');
+
+ // module model 객체 생성
+ if($module_srl) {
+ $oOpageModel = &getModel('opage');
+ $module_info = $oOpageModel->getOpage($module_srl);
+ if(!$module_info) {
+ unset($module_info);
+ unset($module_srl);
+ } else {
+ Context::set('module_info',$module_info);
+ }
+
+ // module_srl 값이 없다면 그냥 index 외부페이지를 보여줌
+ } else {
+ return $this->dispOpageAdminContent();
+ }
+
+ // 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout)
+ if($module_info->layout_srl) {
+ $oLayoutModel = &getModel('layout');
+ $layout_info = $oLayoutModel->getLayout($module_info->layout_srl);
+ $module_info->layout = $layout_info->layout;
+ $module_info->layout_title = $layout_info->layout_title;
+ }
+
+ // 레이아웃 목록을 구해옴
+ $oLayoutMode = &getModel('layout');
+ $layout_list = $oLayoutMode->getLayoutList();
+ Context::set('layout_list', $layout_list);
+
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('opage_info');
+ }
+
+ /**
+ * @brief 외부페이지 추가 폼 출력
+ **/
+ function dispOpageAdminInsert() {
+ // 권한 그룹의 목록을 가져온다
+ $oMemberModel = &getModel('member');
+ $group_list = $oMemberModel->getGroups();
+ Context::set('group_list', $group_list);
+
+ // module.xml에서 권한 관련 목록을 구해옴
+ $grant_list = $this->xml_info->grant;
+ Context::set('grant_list', $grant_list);
+
+ // GET parameter에서 module_srl을 가져옴
+ $module_srl = Context::get('module_srl');
+
+ // module_srl이 있으면 해당 모듈의 정보를 구해서 세팅
+ if($module_srl) {
+ $oModuleModel = &getModel('module');
+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
+ if($module_info->module_srl == $module_srl) Context::set('module_info',$module_info);
+ else {
+ unset($module_info);
+ unset($module_srl);
+ }
+ }
+
+ // module_srl이 없으면 sequence값으로 미리 구해 놓음
+ if(!$module_srl) $module_srl = getNextSequence();
+ Context::set('module_srl',$module_srl);
+
+ // 레이아웃 목록을 구해옴
+ $oLayoutMode = &getModel('layout');
+ $layout_list = $oLayoutMode->getLayoutList();
+ Context::set('layout_list', $layout_list);
+
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('opage_insert');
+ }
+
+
+ /**
+ * @brief 외부페이지 삭제 화면 출력
+ **/
+ function dispOpageAdminDelete() {
+ $module_srl = Context::get('module_srl');
+ if(!$module_srl) return $this->dispContent();
+
+ $oModuleModel = &getModel('module');
+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
+ Context::set('module_info',$module_info);
+
+ // 템플릿 파일 지정
+ $this->setTemplateFile('opage_delete');
+ }
+
+ }
+?>
diff --git a/modules/opage/opage.class.php b/modules/opage/opage.class.php
new file mode 100644
index 000000000..2e21703ac
--- /dev/null
+++ b/modules/opage/opage.class.php
@@ -0,0 +1,70 @@
+insertActionForward('opage', 'view', 'dispOpageIndex');
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminContent');
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminInsert');
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminDelete');
+
+ // opage 에서 사용할 cache디렉토리 생성
+ FileHandler::makeDir('./files/cache/opage');
+
+ return new Object();
+ }
+
+ /**
+ * @brief 설치가 이상이 없는지 체크하는 method
+ **/
+ function checkUpdate() {
+ $oModuleModel = &getModel('module');
+
+ // 외부페이지 모듈을 업그레이드로 설치하였을 경우 필요한 action 값의 여부 체크 (2007. 09. 17)
+ if(!$oModuleModel->getActionForward('dispOpageIndex')) return true;
+ if(!$oModuleModel->getActionForward('dispOpageAdminContent')) return true;
+ if(!$oModuleModel->getActionForward('dispOpageAdminInsert')) return true;
+ if(!$oModuleModel->getActionForward('dispOpageAdminDelete')) return true;
+
+ // cache 디렉토리가 없으면 바로 디렉토리 생성
+ if(!is_dir('./files/cache/opage')) FileHandler::makeDir('./files/cache/opage');
+
+ return false;
+ }
+
+ /**
+ * @brief 업데이트 실행
+ **/
+ function moduleUpdate() {
+ $oModuleModel = &getModel('module');
+ $oModuleController = &getController('module');
+
+ // 외부페이지 모듈을 업그레이드로 설치하였을 경우 필요한 action 값 등록
+ if(!$oModuleModel->getActionForward('dispOpageIndex'))
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageIndex');
+
+ if(!$oModuleModel->getActionForward('dispOpageAdminContent'))
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminContent');
+
+ if(!$oModuleModel->getActionForward('dispOpageAdminInsert'))
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminInsert');
+
+ if(!$oModuleModel->getActionForward('dispOpageAdminDelete'))
+ $oModuleController->insertActionForward('opage', 'view', 'dispOpageAdminDelete');
+
+
+ return new Object(0, 'success_updated');
+ }
+
+ }
+?>
diff --git a/modules/opage/opage.controller.php b/modules/opage/opage.controller.php
new file mode 100644
index 000000000..6c6c4f64d
--- /dev/null
+++ b/modules/opage/opage.controller.php
@@ -0,0 +1,119 @@
+]*)>(.*?)<\/title>!is', $content, $buff);
+ return trim($buff[2]);
+ }
+
+ /**
+ * @brief header script 추출
+ **/
+ function getHeadScript($content) {
+ // title 태그 제거
+ $content = preg_replace('!
| {$lang->no} | ++ + | +{$lang->mid} | +{$lang->browser_title} | +{$lang->is_default} | +{$lang->regdate} | +{$lang->cmd_view} | +{$lang->cmd_delete} | +
|---|---|---|---|---|---|---|---|
| {$no} | ++ + {$lang->not_exists} + + {$module_category[$val->module_category_srl]->title} + + | +{$val->mid} | +{$val->browser_title} | +{$val->is_default} | +{zdate($val->regdate,"Y-m-d")} | +{$lang->cmd_view} | +{$lang->cmd_delete} | +