mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-04 01:01:41 +09:00
#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:
parent
7f90125627
commit
dc24001d46
21 changed files with 984 additions and 4 deletions
|
|
@ -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를 추출
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
20
modules/opage/conf/info.xml
Normal file
20
modules/opage/conf/info.xml
Normal 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>
|
||||
25
modules/opage/conf/module.xml
Normal file
25
modules/opage/conf/module.xml
Normal 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>
|
||||
15
modules/opage/lang/ko.lang.php
Normal file
15
modules/opage/lang/ko.lang.php
Normal 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 으로 하시면 캐싱을 하지 않습니다";
|
||||
?>
|
||||
107
modules/opage/opage.admin.controller.php
Normal file
107
modules/opage/opage.admin.controller.php
Normal 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');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
153
modules/opage/opage.admin.view.php
Normal file
153
modules/opage/opage.admin.view.php
Normal 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');
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
70
modules/opage/opage.class.php
Normal file
70
modules/opage/opage.class.php
Normal 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');
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
119
modules/opage/opage.controller.php
Normal file
119
modules/opage/opage.controller.php
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
33
modules/opage/opage.model.php
Normal file
33
modules/opage/opage.model.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
92
modules/opage/opage.view.php
Normal file
92
modules/opage/opage.view.php
Normal 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');
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
24
modules/opage/queries/getOpageList.xml
Normal file
24
modules/opage/queries/getOpageList.xml
Normal 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>
|
||||
8
modules/opage/tpl/content.html
Normal file
8
modules/opage/tpl/content.html
Normal 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-->
|
||||
10
modules/opage/tpl/filter/delete_opage.xml
Normal file
10
modules/opage/tpl/filter/delete_opage.xml
Normal 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>
|
||||
24
modules/opage/tpl/filter/insert_opage.xml
Normal file
24
modules/opage/tpl/filter/insert_opage.xml
Normal 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>
|
||||
3
modules/opage/tpl/header.html
Normal file
3
modules/opage/tpl/header.html
Normal 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>
|
||||
79
modules/opage/tpl/index.html
Normal file
79
modules/opage/tpl/index.html
Normal 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>
|
||||
49
modules/opage/tpl/js/opage_admin.js
Normal file
49
modules/opage/tpl/js/opage_admin.js
Normal 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;
|
||||
}
|
||||
31
modules/opage/tpl/opage_delete.html
Normal file
31
modules/opage/tpl/opage_delete.html
Normal 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>
|
||||
|
||||
116
modules/opage/tpl/opage_insert.html
Normal file
116
modules/opage/tpl/opage_insert.html
Normal 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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue