#14 별도의 외부 페이지(opage) 모듈을 만들어서 외부 html/php 문서나 외부 html문서등을 내부에서 사용할 수 있는 모듈 제작

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2600 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-09-18 04:13:34 +00:00
parent 7f90125627
commit dc24001d46
21 changed files with 984 additions and 4 deletions

View file

@ -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를 추출

View file

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

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<module version="0.1">
<title xml:lang="ko">외부 페이지</title>
<title xml:lang="zh-CN">外页面</title>
<title xml:lang="jp">外でページ</title>
<title xml:lang="en">Outside Page</title>
<title xml:lang="es">Afuera Página</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 9. 17">
<name xml:lang="ko">제로</name>
<name xml:lang="zh-CN">zero</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<description xml:lang="ko">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="zh-CN">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="jp">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="en">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
<description xml:lang="es">외부페이지를 제로보드XE내부로 삽입시키는 모듈</description>
</author>
</module>

View file

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants>
<grant name="view" default="guest">
<title xml:lang="ko">열람</title>
<title xml:lang="zh-CN">浏览</title>
<title xml:lang="jp">閲覧</title>
<title xml:lang="en">view</title>
</grant>
</grants>
<actions>
<action name="dispOpageIndex" type="view" index="true" />
<action name="dispOpageAdminContent" type="view" admin_index="true" standalone="true" />
<action name="dispOpageAdminModuleConfig" type="view" standalone="true" />
<action name="dispOpageAdminInfo" type="view" standalone="true" />
<action name="dispOpageAdminInsert" type="view" standalone="true" />
<action name="dispOpageAdminDelete" type="view" standalone="true" />
<action name="dispOpageAdminContentModify" type="view" standalone="true" />
<action name="procOpageAdminRemoveWidgetCache" type="controller" standalone="true" />
<action name="procOpageAdminInsert" type="controller" standalone="true" />
<action name="procOpageAdminDelete" type="controller" standalone="true" />
<action name="procOpageAdminInsertConfig" type="controller" standalone="true" />
</actions>
</module>

View file

@ -0,0 +1,15 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com)
* @brief 외부 페이지(opage) 모듈의 기본 언어팩
**/
$lang->opage = "외부 페이지";
$lang->opage_path = "외부 문서 위치";
$lang->opage_caching_interval = "캐싱 시간 설정";
$lang->about_opage = "제로보드XE가 아닌 외부 html 또는 php파일을 제로보드XE에서 사용할 수 있도록 하는 모듈입니다.<br />절대경로, 상대경로를 이용할 수 있으며 http:// 로 시작할 경우 서버 외부의 페이지도 표시할 수 있습니다";
$lang->about_opage_path= "외부문서의 위치를 입력해주세요.<br />/path1/path2/sample.php 와 같이 절대경로나 ../path2/sample.php와 같은 상대경로 모두 사용가능합니다.<br />http://url/sample.php 와 같이 사용하면 결과를 받아다가 출력을 하게 됩니다.<br />현재 제로보드XE가 설치된 절대경로는 다음과 같습니다.<br />";
$lang->about_opage_caching_interval = "단위는 분이며 정해진 시간동안은 임시 저장한 데이터를 출력하도록 합니다.<br />다른 서버의 정보를 출력하거나 데이터 출력시 많은 자원이 필요하면 원하시는 분 단위로 캐싱하시는 것을 추천해드립니다.<br />0 으로 하시면 캐싱을 하지 않습니다";
?>

View file

@ -0,0 +1,107 @@
<?php
/**
* @class opageAdminController
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 admin controller class
**/
class opageAdminController extends opage {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 외부페이지 추가
**/
function procOpageAdminInsert() {
// module 모듈의 controller 객체 생성
$oModuleController = &getController('module');
// 기본 모듈 정보로 등록된 변수 구함
$module_args = Context::gets('module_srl','module_category_srl','browser_title','is_default','layout_srl');
$module_args->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');
}
}
?>

View file

@ -0,0 +1,153 @@
<?php
/**
* @class opageAdminView
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 admin view 클래스
**/
class opageAdminView extends opage {
var $module_srl = 0;
var $list_count = 20;
var $page_count = 10;
/**
* @brief 초기화
**/
function init() {
// module_srl이 있으면 미리 체크하여 존재하는 모듈이면 module_info 세팅
$module_srl = Context::get('module_srl');
// module model 객체 생성
$oModuleModel = &getModel('module');
// 모듈 카테고리 목록을 구함
$module_category = $oModuleModel->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');
}
}
?>

View file

@ -0,0 +1,70 @@
<?php
/**
* @class opage
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 high class
**/
class opage extends ModuleObject {
/**
* @brief 설치시 추가 작업이 필요할시 구현
**/
function moduleInstall() {
// action forward에 등록 (관리자 모드에서 사용하기 위함)
$oModuleController = &getController('module');
$oModuleController->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');
}
}
?>

View file

@ -0,0 +1,119 @@
<?php
/**
* @class documentController
* @author zero (zero@nzeo.com)
* @brief document 모듈의 controller 클래스
**/
class opageController extends opage {
var $target_path = '';
/**
* @brief 초기화
**/
function init() { }
/**
* @brief 타이틀 추출
**/
function getTitle($content) {
preg_match('!<title([^>]*)>(.*?)<\/title>!is', $content, $buff);
return trim($buff[2]);
}
/**
* @brief header script 추출
**/
function getHeadScript($content) {
// title 태그 제거
$content = preg_replace('!<title([^>]*)>(.*?)<\/title>!is','', $content);
// meta 태그 제거
$content = preg_replace('!<(\/){0,1}meta([^>]*)>!is','', $content);
// <link, <style, <script 등의 정보를 추출
preg_match_all('!<link([^>]*)>!is', $content, $link_buff);
for($i=0;$i<count($link_buff[0]);$i++) {
$tmp_str = trim($link_buff[0][$i]);
if(!$tmp_str) continue;
$header_script .= $tmp_str."\n";
}
preg_match_all('!<(style|script)(.*?)<\/(style|script)>!is', $content, $script_buff);
for($i=0;$i<count($script_buff[0]);$i++) {
$tmp_str = trim($script_buff[0][$i]);
if(!$tmp_str) continue;
$header_script .= $tmp_str."\n";
}
return $header_script;
}
/**
* @brief body의 내용을 추출
**/
function getBodyScript($content) {
// 내용 추출
preg_match('!<body([^>]*)>(.*?)<\/body>!is', $content, $body_buff);
$body_script = $body_buff[2];
// link, style, script등 제거
$body_script = preg_replace('!<link([^>]*)>!is', '', $body_script);
$body_script = preg_replace('!<(style|script)(.*?)<\/(style|script)>!is', '', $body_script);
return $body_script;
}
/**
* @brief 내용에 포함된 src, href의 값을 변경
**/
function replaceSrc($content, $path) {
if(substr($path,-1)!='/') $path.='/';
$this->target_path = $path;
// element의 속성중 value에 " 로 안 묶여 있는 것을 검사하여 묶어줌
$content = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', array($this, '_fixQuotation'), $content);
// img, input, a, link등의 href, src값 변경
$content = preg_replace_callback('!(script|link|a|img|input)([^>]*)(href|src)=[\'"](.*?)[\'"]!is', array($this, '_replaceSrc'), $content);
// background:url의 값 변경
$content = preg_replace_callback('!url\((.*?)\)!is', array($this, '_replaceBackgroundUrl'), $content);
return $content;
}
function _replaceSrc($matches) {
$href = $matches[4];
if(eregi("^http", $href) || $href == '#' || eregi("javascript:",$href)) return $matches[0];
if(substr($href,0,1)=='/') $href = substr($href,1);
$href = $this->target_path.$href;
$buff = sprintf('%s%s%s="%s"', $matches[1], $matches[2], $matches[3], $href);
return $buff;
}
function _replaceBackgroundUrl($matches) {
$href = $matches[1];
if(eregi("^http",$href) || $href == '#' || eregi("javascript:",$href)) return $matches[0];
if(substr($href,0,1)=='/') $href = substr($href,1);
$href = $this->target_path.$href;
$buff = sprintf('url(%s)', $href);
return $buff;
}
/**
* @brief 태그의 속성에 " 를 추가
**/
function _fixQuotation($matches) {
$key = $matches[1];
$val = $matches[2];
if(substr($val,0,1)!='"') $val = '"'.$val.'"';
return sprintf('%s=%s', $key, $val);
}
}
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @class opageModel
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 model 클래스
**/
class opageModel extends opage {
/**
* @brief 초기화
**/
function init() { }
/**
* @brief 특정 외부 페이지의 정보를 return
* 외부 페이지의 경우 기본 모듈의 정보와 설정정보를 함께 다루기 때문에 별도의 model method를 이용하게 한다
**/
function getOpage($module_srl) {
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if($module_info->module_srl != $module_srl) return;
$extra_vars = unserialize($module_info->extra_vars);
if($extra_vars) {
foreach($extra_vars as $key => $val) $module_info->{$key} = $val;
unset($module_info->extra_vars);
}
return $module_info;
}
}
?>

View file

@ -0,0 +1,92 @@
<?php
/**
* @class opageView
* @author zero (zero@nzeo.com)
* @brief opage 모듈의 view 클래스
**/
class opageView extends opage {
/**
* @brief 초기화
**/
function init() {
// 템플릿 경로 구함 (opage의 경우 tpl에 관리자용 템플릿 모아놓음)
$this->setTemplatePath($this->module_path.'tpl');
}
/**
* @brief 일반 요청시 출력
**/
function dispOpageIndex() {
// 권한 체크
if(!$this->grant->view) return $this->stop('msg_not_permitted');
// opage controller 생성
$oOpageController = &getController('opage');
// 외부 페이지 모듈의 정보를 구함
$oOpageModel = &getModel('opage');
$module_info = $oOpageModel->getOpage($this->module_srl);
Context::set('module_info', $module_info);
// 외부 페이지에서 명시된 외부 페이지 경로/ 캐싱 간격을 를 구함
$path = $module_info->path;
$caching_interval = $module_info->caching_interval;
// 캐시 파일 지정
$cache_file = sprintf("./files/cache/opage/%d.cache", $module_info->module_srl);
// 캐시 검사
if($caching_interval > 0 && file_exists($cache_file) && filemtime($cache_file) + $caching_interval*60 > time()) {
$content = FileHandler::readFile($cache_file);
} else {
// 경로에 http://가 있는 경우와 없는 경우를 비교
if(eregi("^http:\/\/",$path)) {
FileHandler::getRemoteFile($path, $cache_file);
$content = FileHandler::readFile($cache_file);
// 서버 내부에 있는 경우
} elseif(file_exists($path)) {
ob_start();
@include($path);
$content = ob_get_contents();
ob_end_clean();
FileHandler::writeFile($cache_file, $content);
}
}
// 외부 서버의 페이지 일 경우 이미지, css, javascript등의 url을 변경
if(eregi("^http:\/\/",$path)) {
$content = $oOpageController->replaceSrc($content, $path);
}
// 해당 문서를 utf-8로 변경
$buff->content = $content;
$buff = Context::convertEncoding($buff);
$content = $buff->content;
// title 추출
$title = $oOpageController->getTitle($content);
if($title) Context::setBrowserTitle($title);
// header script 추출
$head_script = $oOpageController->getHeadScript($content);
if($head_script) Context::addHtmlHeader($head_script);
// body 내용 추출
$body_script = $oOpageController->getBodyScript($content);
if(!$body_script) $body_script = $content;
Context::set('opage_content', $body_script);
// 결과 출력 템플릿 지정
$this->setTemplateFile('content');
}
}
?>

View file

@ -0,0 +1,24 @@
<query id="getOpageList" action="select">
<tables>
<table name="modules" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module" default="opage" />
<group pipe="and">
<condition operation="like" column="mid" var="s_mid" pipe="or" />
<condition operation="like" column="title" var="s_title" pipe="or" />
<condition operation="like" column="comment" var="s_comment" pipe="or" />
<condition operation="equal" column="module" var="s_module" pipe="or" />
<condition operation="equal" column="module_category_srl" var="s_module_category_srl" pipe="or" />
</group>
</conditions>
<navigation>
<index var="sort_index" default="module_srl" order="desc" />
<list_count var="list_count" default="20" />
<page_count var="page_count" default="10" />
<page var="page" default="1" />
</navigation>
</query>

View file

@ -0,0 +1,8 @@
{$opage_content}
<!--@if($grant->is_admin)-->
<!--%import("./js/opage_admin.js")-->
<div class="tRight gap1 clear">
<a href="{getUrl('act','dispOpageAdminInsert','module_srl',$module_info->module_srl)}" class="button"><span>{$lang->cmd_setup}</span></a>
</div>
<!--@end-->

View file

@ -0,0 +1,10 @@
<filter name="delete_opage" module="opage" act="procOpageAdminDelete">
<form>
<node target="module_srl" required="true" />
</form>
<response callback_func="completeDeleteOpage">
<tag name="error" />
<tag name="message" />
<tag name="opage" />
</response>
</filter>

View file

@ -0,0 +1,24 @@
<filter name="insert_opage" module="opage" act="procOpageAdminInsert" confirm_msg_code="confirm_submit">
<form>
<node target="mid" required="true" filter="alpha_number" />
<node target="browser_title" required="true" maxlength="250" />
<node target="opage_path" required="true" maxlength="250" />
</form>
<parameter>
<param name="opage_name" target="mid" />
<param name="module_srl" target="module_srl" />
<param name="module_category_srl" target="module_category_srl" />
<param name="layout_srl" target="layout_srl" />
<param name="browser_title" target="browser_title" />
<param name="is_default" target="is_default" />
<param name="caching_interval" target="opage_caching_interval" />
<param name="path" target="opage_path" />
<param name="view" target="view" />
</parameter>
<response callback_func="completeInsertOpage">
<tag name="error" />
<tag name="message" />
<tag name="module_srl" />
<tag name="opage" />
</response>
</filter>

View file

@ -0,0 +1,3 @@
<!--%import("js/blog_admin.js")-->
<!--%import("js/opage_admin.js")-->
<h3>{$lang->opage} <span class="gray">{$lang->cmd_management}</span></h3>

View file

@ -0,0 +1,79 @@
<!--%import("js/opage_admin.js")-->
<!--#include("header.html")-->
<div class="infoText">{nl2br($lang->about_opage)}</div>
<!-- 정보 -->
<div class="tableSummaryType1">
Total <strong>{number_format($total_count)}</strong>, Opage <strong>{number_format($opage)}</strong>/{number_format($total_opage)}
</div>
<!-- 목록 -->
<table cellspacing="0" class="tableType1">
<thead>
<tr>
<th scope="col">{$lang->no}</th>
<th scope="col">
<form action="./" method="get" onsubmit="return doChangeCategory(this);">
<input type="hidden" name="module" value="{$module}" />
<input type="hidden" name="act" value="{$act}" />
<select name="module_category_srl">
<option value="">{$lang->module_category}</option>
<!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
<option value="">---------</option>
<option value="-1">{$lang->cmd_management}</option>
</select>
<span class="button"><input type="submit" name="go_button" id="go_button" value="GO" /></span>
</form>
</th>
<th scope="col">{$lang->mid}</th>
<th scope="col">{$lang->browser_title}</th>
<th scope="col">{$lang->is_default}</th>
<th scope="col">{$lang->regdate}</th>
<th scope="col">{$lang->cmd_view}</th>
<th scope="col">{$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
<!--@foreach($opage_list as $no => $val)-->
<tr>
<td class="tahoma">{$no}</td>
<td>
<!--@if(!$val->module_category_srl)-->
{$lang->not_exists}
<!--@else-->
{$module_category[$val->module_category_srl]->title}
<!--@end-->
</td>
<td><a href="{getUrl('act','dispOpageAdminInsert','module_srl',$val->module_srl)}" class="blue">{$val->mid}</a></td>
<td>{$val->browser_title}</td>
<td class="tahoma">{$val->is_default}</td>
<td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
<td class="blue"><a href="./?mid={$val->mid}" target="_blank">{$lang->cmd_view}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispOpageAdminDelete','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td>
</tr>
<!--@end-->
</tbody>
</table>
<!-- 버튼 -->
<div class="fr gap1">
<a href="{getUrl('act','dispOpageAdminInsert','module_srl','')}" class="button"><span>{$lang->cmd_make}</span></a>
</div>
<!-- 페이지 네비게이션 -->
<div class="pageNavigation">
<a href="{getUrl('page','','module_srl','')}" class="goToFirst"><img src="../../admin/tpl/images/bottomGotoFirst.gif" alt="{$lang->first_page}" width="7" height="5" /></a>
<!--@while($page_no = $page_navigation->getNextPage())-->
<!--@if($page == $page_no)-->
<span class="current">{$page_no}</span>
<!--@else-->
<a href="{getUrl('page',$page_no,'module_srl','')}">{$page_no}</a>
<!--@end-->
<!--@end-->
<a href="{getUrl('page',$page_navigation->last_page,'module_srl','')}" class="goToLast"><img src="../../admin/tpl/images/bottomGotoLast.gif" alt="{$lang->last_page}" width="7" height="5" /></a>
</div>

View file

@ -0,0 +1,49 @@
/**
* @file modules/opage/js/opage_admin.js
* @author zero (zero@nzeo.com)
* @brief opage모듈의 관리자용 javascript
**/
/* 모듈 생성 후 */
function completeInsertOpage(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var opage = ret_obj['opage'];
var module_srl = ret_obj['module_srl'];
alert(message);
var url = '';
if(location.href.getQuery('module')=='admin') {
url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispOpageAdminInsert');
if(opage) url = url.setQuery('opage',opage);
} else {
url = current_url.setQuery('act','').setQuery('module_srl','');
}
location.href = url;
}
/* 모듈 삭제 후 */
function completeDeleteOpage(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var opage = ret_obj['opage'];
alert(message);
var url = current_url.setQuery('act','dispOpageAdminContent');
if(opage) url = url.setQuery('opage',opage);
location.href = url;
}
/* 카테고리 이동 */
function doChangeCategory(fo_obj) {
var module_category_srl = fo_obj.module_category_srl.options[fo_obj.module_category_srl.selectedIndex].value;
if(module_category_srl==-1) {
location.href = current_url.setQuery('act','dispModuleAdminCategory');
return false;
}
return true;
}

View file

@ -0,0 +1,31 @@
<!--%import("filter/delete_opage.xml")-->
<!--%import("js/opage_admin.js")-->
<!--#include("header.html")-->
<form action="./" method="get" onsubmit="return procFilter(this, delete_opage)">
<input type="hidden" name="opage" value="{$opage}" />
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
<table cellspacing="0" class="tableType4">
<col width="150" />
<col />
<tr>
<th scope="row" colspan="2">{$lang->confirm_delete}</th>
</tr>
<tr>
<th scope="row">{$lang->module_name}</th>
<td>{$module_info->mid}</td>
</tr>
<tr>
<th scope="row">{$lang->module}</th>
<td>{$module_info->module}</td>
</tr>
</table>
<div class="tRight gap1">
<a href="{getUrl('act','dispOpageAdminContent')}" class="button"><span>{$lang->cmd_back}</span></a>
<span class="button"><input type="submit" value="{$lang->cmd_delete}" /></span>
</div>
</form>

View file

@ -0,0 +1,116 @@
<!--%import("filter/insert_opage.xml")-->
<!--#include("header.html")-->
<form action="./" method="post" onsubmit="return procFilter(this, insert_opage)" enctype="multipart/form-data">
<input type="hidden" name="opage" value="{$opage}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<!--@if($module_info->is_default=='Y')-->
<input type="hidden" name="is_default" value="Y" />
<!--@end-->
<table cellspacing="0" class="tableType2">
<col width="150" />
<col />
<tr>
<th scope="row">{$lang->mid}</th>
<td>
<input type="text" name="mid" value="{$module_info->mid}" class="inputTypeText" />
<p>{$lang->about_mid}</p>
</td>
</tr>
<!--@if($module_info->is_default!='Y')-->
<tr>
<th scope="row">{$lang->is_default}</th>
<td>
<input type="checkbox" name="is_default" value="Y" <!--@if($module_info->is_default=='Y')-->checked="checked"<!--@end--> id="fld_for_default" class="checkbox" />
<label for="fld_for_default">{$lang->about_default}</label>
</td>
</tr>
<!--@end-->
<tr>
<th scope="row">{$lang->module_category}</th>
<td>
<select name="module_category_srl">
<option value="0">{$lang->notuse}</option>
<!--@foreach($module_category as $key => $val)-->
<option value="{$key}" <!--@if($module_info->module_category_srl==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
</select>
<p>{$lang->about_module_category}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->browser_title}</th>
<td>
<input type="text" name="browser_title" value="{htmlspecialchars($module_info->browser_title)}" class="inputTypeText" />
<p>{$lang->about_browser_title}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->layout}</th>
<td>
<select name="layout_srl">
<option value="0">{$lang->notuse}</option>
<!--@foreach($layout_list as $key => $val)-->
<option value="{$val->layout_srl}" <!--@if($module_info->layout_srl==$val->layout_srl)-->selected="selected"<!--@end-->>{$val->title} ({$val->layout})</option>
<!--@end-->
</select>
<p>{$lang->about_layout}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->opage_caching_interval}</th>
<td>
<input type="text" name="opage_caching_interval" value="{(int)$module_info->caching_interval}" class="inputTypeText w40" /> {$lang->unit_min}
<p>{$lang->about_opage_caching_interval}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->opage_path}</th>
<td>
<input type="text" name="opage_path" value="{htmlspecialchars($module_info->path)}" class="inputTypeText w400" />
<p>{$lang->about_opage_path}<b>{realpath("./")}</b></p>
</td>
</tr>
</table>
<!-- 권한 출력 -->
<table cellspacing="0" class="tableType3 gap1">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<thead>
<tr>
<th scope="col">{$lang->grant}</th>
<th scope="col" colspan="3">{$lang->target}</th>
</tr>
</thead>
<tbody>
<!--@foreach($grant_list as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@foreach($group_list as $k => $v)-->
<input type="checkbox" class="checkbox" name="{$key}" value="{$v->group_srl}" id="grant_{$key}_{$v->group_srl}" <!--@if(is_array($module_info->grants[$key])&&in_array($v->group_srl,$module_info->grants[$key]))-->checked="checked"<!--@end-->/>
<label for="grant_{$key}_{$v->group_srl}">{$v->title}</label>
<!--@end-->
</td>
<td><a href="#" onclick="doSelectAll(this, '{$key}')" class="blue">{$lang->cmd_select_all}</a></td>
<td><a href="#" onclick="doUnSelectAll(this, '{$key}')" class="red">{$lang->cmd_unselect_all}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<div class="tRight gap1">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
<!--@if($module == 'admin')-->
<span class="button"><input type="button" value="{$lang->cmd_list}" onclick="location.href='./?module=admin&act=dispOpageAdminContent';return false;" /></span>
<!--@else-->
<span class="button"><input type="button" value="{$lang->cmd_back}" onclick="location.href=current_url.setQuery('module_srl','').setQuery('act','');return false;" /></span>
<!--@end-->
</div>
</form>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<module version="0.1">
<title xml:lang="ko">페이지</title>
<title xml:lang="zh-CN">页面</title>>
<title xml:lang="zh-CN">页面</title>
<title xml:lang="jp">ページ</title>
<title xml:lang="en">Page</title>
<title xml:lang="es">Página</title>