added lifepod module

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@3288 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
haneul 2007-12-10 07:21:22 +00:00
parent 6e2a5f765a
commit 3a6abc6b97
30 changed files with 1727 additions and 0 deletions

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<module version="0.1" category="service">
<title xml:lang="ko">라이프팟 연동</title>
<title xml:lang="en">Lifepod</title>
<author email_address="haneul0318@gmail.com" link="http://haneul.zetyx.net" date="2007.12.10">
<name xml:lang="ko">haneul</name>
<name xml:lang="en">haneul</name>
<description xml:lang="ko">라이프팟의 calendar를 제로보드XE에서 연동하여 출력하는 기능을 가지고 있는 모듈입니다.</description>
<description xml:lang="en">This module displays calendar from lifepod.</description>
</author>
</module>

View file

@ -0,0 +1,26 @@
<?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="dispLifepodContent" type="view" index="true" />
<action name="dispLifepodAdminContent" type="view" standalone="true" admin_index="true" />
<action name="dispLifepodAdminLifepodInfo" type="view" standalone="true" />
<action name="dispLifepodAdminInsertLifepod" type="view" standalone="true" />
<action name="dispLifepodAdminDeleteLifepod" type="view" standalone="true" />
<action name="dispLifepodAdminGrantInfo" type="view" standalone="true" />
<action name="dispLifepodAdminSkinInfo" type="view" standalone="true" />
<action name="procLifepodAdminInsertLifepod" type="controller" standalone="true" />
<action name="procLifepodAdminDeleteLifepod" type="controller" standalone="true" />
<action name="procLifepodAdminInsertGrant" type="controller" standalone="true" />
<action name="procLifepodAdminUpdateSkinInfo" type="controller" standalone="true" />
</actions>
</module>

View file

@ -0,0 +1,15 @@
<?php
/**
* @file en.lang.php
* @author haneul (haneul0318@gmail.com)
* @brief 라이프팟(lifepod) 모듈의 기본 언어팩
**/
$lang->lifepod = "Lifepod";
$lang->calendar_address = "calendar's xml address";
$lang->cmd_lifepod_list = 'Lifepod module list';
$lang->cmd_view_info = 'Lifepod info.';
$lang->about_lifepod = "Lifepod is a calendar service provided by Openmaru Studio.<br />Lifepod Zeroboard XE module desplays Lifepod's scalendar as an internal document.";
?>

View file

@ -0,0 +1,15 @@
<?php
/**
* @file ko.lang.php
* @author haneul (haneul0318@gmail.com)
* @brief 라이프팟(lifepod) 모듈의 기본 언어팩
**/
$lang->lifepod = "라이프팟";
$lang->calendar_address = "캘린더 xml주소";
$lang->cmd_lifepod_list = '라이프팟 목록';
$lang->cmd_view_info = '라이프팟 정보';
$lang->about_lifepod = "라이프팟은 오픈마루에서 제공하는 캘린더서비스입니다.<br />라이프팟 제로보드XE모듈은 라이프팟의 특정 캘린더들을 내부문서처럼 열람할 수 있는 모듈입니다.";
?>

View file

@ -0,0 +1,245 @@
<?php
/**
* @class lifepodAdminController
* @author haneul (haneul0318@nzeo.com)
* @brief lifepod 모듈의 admin controller class
* 관리자 기능을 담당하게 된다.
* 보통 모듈의 관리자 기능은 해당 모듈의 생성이나 정보/권한/스킨정보의 수정등을 담당하게 된다.
**/
class lifepodAdminController extends lifepod {
/**
* @brief 초기화
**/
function init() { }
/**
* @brief lifepod 추가
* lifepod_name은 mid의 값이 되고 나머지 모듈 공통 값을 받아서 저장을 하게 된다.
**/
function procLifepodAdminInsertLifepod($args = null) {
// 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
if(!$args) $args = Context::gets('module_srl','module_category_srl','lifepod_name','layout_srl','skin','browser_title','description','is_default','header_text','footer_text','admin_id','open_rss');
// lifepod모듈임을 명시적으로 지정한다.
$args->module = 'lifepod';
// mid값을 직접 받지 않고 lifepod_name으로 받는 이유는 mid는 특별히 약속된 변수명이라 오동작이 발생할 수 있어서 다른 이름으로 전달을 받은후 다시 바꾸어준다.
$args->mid = $args->lifepod_name;
unset($args->lifepod_name);
// is_default일 경우 별다른 요청이 없는 index페이지의 경우 바로 호출이 되는데 이 값을 설정을 하게 된다.
if($args->is_default!='Y') $args->is_default = 'N';
// 기본 값외의 것들을 정리
$extra_var = delObjectVars(Context::getRequestVars(), $args);
unset($extra_var->act);
unset($extra_var->page);
unset($extra_var->lifepod_name);
// module_srl이 넘어오면 원 모듈이 있는지 확인
if($args->module_srl) {
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl);
// 만약 원래 모듈이 없으면 새로 입력하기 위한 처리
if($module_info->module_srl != $args->module_srl) unset($args->module_srl);
}
// $extra_var를 serialize
$args->extra_vars = serialize($extra_var);
// module 모듈의 controller 객체 생성
$oModuleController = &getController('module');
// is_default=='Y' 이면
if($args->is_default=='Y') $oModuleController->clearDefaultModule();
/**
* module_srl값이 없다면 신규 등록으로 처리를 한다.
**/
if(!$args->module_srl) {
// module controller를 이용하여 모듈을 생성한다.
$output = $oModuleController->insertModule($args);
$msg_code = 'success_registed';
// 권한의 경우 기본으로 설정을 해주는 것이 좋으며 lifepod 모듈의 경우 manager권한을 관리 그룹으로 설정을 한다.
if($output->toBool()) {
// 관리그룹을 member model객체에서 구할 수 있다.
$oMemberModel = &getModel('member');
$admin_group = $oMemberModel->getAdminGroup();
$admin_group_srl = $admin_group->group_srl;
$module_srl = $output->get('module_srl');
$grants = serialize(array('manager'=>array($admin_group_srl)));
// module controller의 module 권한 설정 method를 이용하여 기본 권한을 적용한다.
$oModuleController->updateModuleGrant($module_srl, $grants);
}
/**
* module_srl이 있다면 모듈의 정보를 수정한다
**/
} else {
$output = $oModuleController->updateModule($args);
$msg_code = 'success_updated';
}
// 결과값에 오류가 있을 경우 그대로 객체 리턴.
if(!$output->toBool()) return $output;
// 등록후 페이지 이동을 위해 변수 설정 및 메세지를 설정한다.
$this->add('page',Context::get('page'));
$this->add('module_srl',$output->get('module_srl'));
$this->setMessage($msg_code);
}
/**
* @brief lifepod 삭제
**/
function procLifepodAdminDeleteLifepod() {
// 삭제할 대상 lifepod의 module_srl을 구한다.
$module_srl = Context::get('module_srl');
// 원본을 구해온다
$oModuleController = &getController('module');
$output = $oModuleController->deleteModule($module_srl);
// 삭제 처리시 오류가 발생하면 결과 객체를 바로 리턴한다.
if(!$output->toBool()) return $output;
// 등록후 페이지 이동을 위해 변수 설정 및 메세지를 설정한다.
$this->add('module','lifepod');
$this->add('page',Context::get('page'));
$this->setMessage('success_deleted');
}
/**
* @brief 권한 설정
* 생성된 lifepod에 ./conf/module.xml에 정의된 권한과 관리자가 선택한 그룹의 값을 연동하여 권한을 설정하게 된다.
**/
function procLifepodAdminInsertGrant() {
// 대상 lifepod(모듈)의 고유값인 module_srl을 체크한다.
$module_srl = Context::get('module_srl');
/**
* 모듈의 권한 목록을 가져옴
* xml_info lifepod모듈이 요청되었다고 판단될때 ModuleObject에서 이미 세팅해 놓은 상태이다.
**/
$grant_list = $this->xml_info->grant;
/**
* 권한의 목록을 loop로 돌면서 권한 설정을 한다.
* zbxe의 경우 가능한 간단한 xmlrpc사용을 위해서 배열의 경우 |@| pipe로 하여 하나의 string으로 전달한다.
* 요청받은 권한의 대상 그룹과 권한을 배열로 serialize하여 modules테이블에 module_srl을 키로 rows에 데이터를 적용한다.
**/
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);
}
// 권한 설정은 모듈 공통이라 module 모듈의 controller을 생성하여 저장하도록 한다.
$oModuleController = &getController('module');
$oModuleController->updateModuleGrant($module_srl, $grants);
// 권한 설정후 돌아갈 페이지를 위하여 module_srl값을 세팅하고 성공 메세지 역시 세팅한다.
$this->add('module_srl',Context::get('module_srl'));
$this->setMessage('success_registed');
}
/**
* @brief 스킨 정보 업데이트
* 스킨 정보는 skin.xml파일의 extra_vars와 입력된 변수값을 조합하여 serialize하여 modules 테이블에 module_srl을 키로 하여 저장을 하게 된다.
**/
function procLifepodAdminUpdateSkinInfo() {
// module_srl에 해당하는 정보들을 가져오기
$module_srl = Context::get('module_srl');
// 어떤 스킨이 사용중인지 확인하기 위해서 module_srl을 이용하여 모듈의 정보를 구하고 스킨을 구한다.
$oModuleModel = &getModel('module');
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
$skin = $module_info->skin;
// 스킨의 정보르 구해옴 (extra_vars를 체크하기 위해서)
$skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin);
// 입력받은 변수들을 체크 (mo, act, module_srl, page등 기본적인 변수들 없앰)
$obj = Context::getRequestVars();
unset($obj->act);
unset($obj->module_srl);
unset($obj->page);
// 원 skin_info에서 extra_vars의 type이 image일 경우 별도 처리를 해줌
if($skin_info->extra_vars) {
foreach($skin_info->extra_vars as $vars) {
if($vars->type!='image') continue;
$image_obj = $obj->{$vars->name};
// 삭제 요청에 대한 변수를 구함
$del_var = $obj->{"del_".$vars->name};
unset($obj->{"del_".$vars->name});
if($del_var == 'Y') {
@unlink($module_info->{$vars->name});
continue;
}
// 업로드 되지 않았다면 이전 데이터를 그대로 사용
if(!$image_obj['tmp_name']) {
$obj->{$vars->name} = $module_info->{$vars->name};
continue;
}
// 정상적으로 업로드된 파일이 아니면 무시
if(!is_uploaded_file($image_obj['tmp_name'])) {
unset($obj->{$vars->name});
continue;
}
// 이미지 파일이 아니어도 무시
if(!eregi("\.(jpg|jpeg|gif|png)$", $image_obj['name'])) {
unset($obj->{$vars->name});
continue;
}
// 경로를 정해서 업로드
$path = sprintf("./files/attach/images/%s/", $module_srl);
// 디렉토리 생성
if(!FileHandler::makeDir($path)) return false;
$filename = $path.$image_obj['name'];
// 파일 이동
if(!move_uploaded_file($image_obj['tmp_name'], $filename)) {
unset($obj->{$vars->name});
continue;
}
// 변수를 바꿈
unset($obj->{$vars->name});
$obj->{$vars->name} = $filename;
}
}
// serialize하여 저장
$skin_vars = serialize($obj);
// module controller객체를 생성하여 module_srl을 키로 한 rows에 serialize한 스킨 정보를 적용한다.
$oModuleController = &getController('module');
$oModuleController->updateModuleSkinVars($module_srl, $skin_vars);
/**
* 스킨 정보는 첨부파일때문에 xml로 전달이 되지 않고 POST로 전송이 되어 왔으므로 템플릿을 이용하여 프레임을 refresh시키도록 한다.
* 스킨 정보를 수정할때 숨어 있는 iframe을 target으로 삼기에 기본 레이아웃을 이용하면 되므로 직접 레이아웃 경로와 파일을 기본으로 지정한다.
**/
$this->setLayoutPath('./common/tpl');
$this->setLayoutFile('default_layout.html');
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile("top_refresh.html");
}
}
?>

View file

@ -0,0 +1,183 @@
<?php
/**
* @class lifepodAdminView
* @author zero (zero@nzeo.com)
* @brief lifepod 모듈의 admin view class
* 모듈 관리자 기능은 생성된 모듈 목록, 신규 등록 수정, 권한의 설정으로 이루어진다.
**/
class lifepodAdminView extends lifepod {
/**
* @brief 초기화
* 손쉬운 사용을 위해서 module_srl이 넘어올 경우 해당 모듈의 모듈 정보를 미리 구해서 세팅해 놓도록 한다.
* method에서 하거나 별도의 method를 만들어서 호출하면 되지만 코드의 양을 줄이고 직관성을 높이기 위해서 설정한 코드이다.
**/
function init() {
// module_srl값을 구해온다.
$module_srl = Context::get('module_srl');
if(!$module_srl && $this->module_srl) {
$module_srl = $this->module_srl;
Context::set('module_srl', $module_srl);
}
// module info를 구하기 위해 module model 객체 생성
$oModuleModel = &getModel('module');
// 모듈 카테고리 목록을 구함
$module_category = $oModuleModel->getModuleCategories();
Context::set('module_category', $module_category);
// module_srl이 있다면 요청된 모듈의 정보를 미리 구해 놓음
if($module_srl) {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if(!$module_info) {
Context::set('module_srl','');
$this->act = 'list';
} else {
$this->module_info = $module_info;
Context::set('module_info',$module_info);
}
}
// 템플릿 경로 지정, 관리자 페이지를 위한 템플릿은 별도의 스킨 기능이 없이 ./modules/모듈/tpl/ 에 위치해 놓기에 바로 지정을 해 놓는다.
$template_path = sprintf("%stpl/",$this->module_path);
$this->setTemplatePath($template_path);
}
/**
* @brief 생성된 calendar들의 목록을 보여줌
* lifepod이라는 module명으로 등록된 모듈을 구하기 위해서 몇가지 설정을 후에 쿼리를 수행한다.
* 쿼리수행은 executeQuery(모듈명.쿼리아이디, 인자변수) 하게 되며 쿼리아이디에 해당하는 xml파일은 모듈의 queries디렉토리에 지정이 되어 있다.
*
* 특정 module의 목록은 module model객체에서 구할 있지만 검색등의 모듈마다 다른 조건 때문에 모듈별로 쿼리를 생성해 놓는다.
* 모든 모듈의 결과물(mid) modules 테이블에 저장이 된다.
**/
function dispLifepodAdminContent() {
$args->sort_index = "module_srl"; ///< 정렬 순서는 모듈의 sequence값으로 하고 정렬은 역순. 즉 생성된 순으로 한다.
$args->page = Context::get('page'); ///< 현재 페이지를 설정
$args->list_count = 40; ///< 한페이지에 40개씩 보여주기로 고정.
$args->page_count = 10; ///< 페이지의 수는 10개로 제한.
$args->s_module_category_srl = Context::get('module_category_srl'); ///< 모듈분류값을 인자로 추가
$output = executeQuery('lifepod.getLifepodList', $args); ///< lifepod.getGuesbookList 쿼리 실행 (./modules/lifepod/query/getLifepodList.xml)
/**
* 템플릿에 쓰기 위해서 context::set
* xml query에 navigation이 있고 list_count가 정의되어 있으면 결과 변수에 아래 5가지의 값이 세팅이 된다.
**/
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('lifepod_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 템플릿 파일 지정 (./modules/lifepod/tpl/index.html파일이 지정이 됨)
$this->setTemplateFile('index');
}
/**
* @brief 선택된 모듈의 정보 출력
**/
function dispLifepodAdminLifepodInfo() {
// module_srl 값이 없다면 그냥 index 페이지를 보여줌
if(!Context::get('module_srl')) return $this->dispLifepodAdminContent();
// 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(layout_title, layout)
if($this->module_info->layout_srl) {
$oLayoutModel = &getModel('layout');
$layout_info = $oLayoutModel->getLayout($this->module_info->layout_srl);
$this->module_info->layout = $layout_info->layout;
$this->module_info->layout_title = $layout_info->layout_title;
}
// 정해진 스킨이 있으면 해당 스킨의 정보를 구함
if($this->module_info->skin) {
$oModuleModel = &getModel('module');
$skin_info = $oModuleModel->loadSkinInfo($this->module_path, $this->module_info->skin);
$this->module_info->skin_title = $skin_info->title;
}
// 템플릿 파일 지정
$this->setTemplateFile('lifepod_info');
}
/**
* @brief 모듈 설정 출력
**/
function dispLifepodAdminInsertLifepod() {
// 스킨 목록을 구해옴
$oModuleModel = &getModel('module');
$skin_list = $oModuleModel->getSkins($this->module_path);
Context::set('skin_list',$skin_list);
// 레이아웃 목록을 구해옴
$oLayoutMode = &getModel('layout');
$layout_list = $oLayoutMode->getLayoutList();
Context::set('layout_list', $layout_list);
// 템플릿 파일 지정
$this->setTemplateFile('lifepod_insert');
}
/**
* @brief 모듈 삭제 화면 출력
**/
function dispLifepodAdminDeleteLifepod() {
if(!Context::get('module_srl')) return $this->dispLifepodAdminContent();
$module_info = Context::get('module_info');
Context::set('module_info',$module_info);
// 템플릿 파일 지정
$this->setTemplateFile('lifepod_delete');
}
/**
* @brief 스킨 정보 보여줌
**/
function dispLifepodAdminSkinInfo() {
// 현재 선택된 모듈의 스킨의 정보 xml 파일을 읽음
$module_info = Context::get('module_info');
$skin = $module_info->skin;
$oModuleModel = &getModel('module');
$skin_info = $oModuleModel->loadSkinInfo($this->module_path, $skin);
// skin_info에 extra_vars 값을 지정
if(count($skin_info->extra_vars)) {
foreach($skin_info->extra_vars as $key => $val) {
$name = $val->name;
$type = $val->type;
$value = $module_info->{$name};
if($type=="checkbox"&&!$value) $value = array();
$skin_info->extra_vars[$key]->value= $value;
}
}
Context::set('skin_info', $skin_info);
$this->setTemplateFile('skin_info');
}
/**
* @brief 권한 목록 출력
**/
function dispLifepodAdminGrantInfo() {
// module_srl을 구함
$module_srl = Context::get('module_srl');
// module.xml에서 권한 관련 목록을 구해옴
$grant_list = $this->xml_info->grant;
Context::set('grant_list', $grant_list);
// 권한 그룹의 목록을 가져온다
$oMemberModel = &getModel('member');
$group_list = $oMemberModel->getGroups();
Context::set('group_list', $group_list);
$this->setTemplateFile('grant_list');
}
}
?>

View file

@ -0,0 +1,54 @@
<?php
/**
* @class lifepod
* @author zero (zero@nzeo.com)
* @brief lifepod 모듈의 high 클래스
**/
class lifepod extends ModuleObject {
/**
* @brief 설치시 추가 작업이 필요할시 구현
**/
function moduleInstall() {
// action forward에 등록 (관리자 모드에서 사용하기 위함)
$oModuleController = &getController('module');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodContent');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodAdminContent');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodAdminLifepodInfo');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodAdminInsertLifepod');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodAdminDeleteLifepod');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodAdminGrantInfo');
$oModuleController->insertActionForward('lifepod', 'view', 'dispLifepodAdminSkinInfo');
$oModuleController->insertActionForward('lifepod', 'controller', 'procLifepodAdminInsertLifepod');
$oModuleController->insertActionForward('lifepod', 'controller', 'procLifepodAdminDeleteLifepod');
$oModuleController->insertActionForward('lifepod', 'controller', 'procLifepodAdminInsertGrant');
return new Object();
}
/**
* @brief 설치가 이상이 없는지 체크하는 method
**/
function checkUpdate() {
$oModuleModel = &getModel('module');
if(!$oModuleModel->getActionForward('dispLifepodContent')) return true;
return false;
}
/**
* @brief 업데이트 실행
**/
function moduleUpdate() {
$this->moduleInstall();
return new Object(0,'success_updated');
}
/**
* @brief 캐시 파일 재생성
**/
function recompileCache() {
}
}
?>

View file

@ -0,0 +1,92 @@
<?php
/**
* @class lifepodModel
* @author haneul (haneul0318@gmail.com)
* @brief lifepod모듈의 model 클래스
**/
set_include_path("./modules/springnote/lib/PEAR");
require_once('PEAR.php');
require_once('HTTP/Request.php');
require_once('me2dayXmlParser.class.php');
class lifepodModel extends lifepod {
var $userid = '';
var $userkey = '';
var $address = '';
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief lifepod 페이지를 가져오기 위한 기본 설정
**/
function setInfo($address) {
$this->address = $address;
}
/**
* @brief HTTP request 객체 생성
**/
function getRequest($url) {
$oReqeust = new HTTP_Request($url);
$oReqeust->addHeader('Content-Type', 'application/xml');
$oReqeust->setMethod('GET');
return $oReqeust;
}
function getURL($start, $end) {
return sprintf("%s&start=%s&end=%s", $this->address, $start, $end);
}
/**
* @brief lifepod 페이지 정보 가져오기
* @remarks 한해씩 끊어서 페이지를 가져옵니다. 아직 50 이상의 calendar info가 있는 경우 앞에 것만 가져오는 문제가 있습니다.
**/
function getPage($year) {
if($year == null)
{
$year = date("Y");
}
$start = sprintf("%s-01-01",$year);
$end = sprintf("%s-01-01",$year+1);
$url = $this->getURL($start, $end);
$oReqeust = $this->getRequest($url);
$oResponse = $oReqeust->sendRequest();
if (PEAR::isError($oResponse)) return null;
$body = $oReqeust->getResponseBody();
$oXmlParser = new Me2DayXmlParser();
$xmldoc = $oXmlParser->parse($body);
if(!$xmldoc->childNodes["feed"]->childNodes["entry"])
{
$data = array();
}
else
{
$data = &$xmldoc->childNodes["feed"]->childNodes["entry"]->childNodes["data"];
}
$page->title = $xmldoc->childNodes["feed"]->childNodes["title"]->body;
if(is_array($data))
{
$page->data = $data;
}
else
{
$page->data = array();
$page->data[] = $data;
}
return $page;
}
}
?>

View file

@ -0,0 +1,80 @@
<?php
/**
* @class lifepodView
* @author haneul (haneul0318@gmail.com)
* @brief lifepod 모듈의 admin view 클래스
**/
class lifepodView extends lifepod {
/**
* @brief 초기화
**/
function init() {
/**
* 템플릿에서 사용할 변수를 Context::set()
* 혹시 사용할 있는 module_srl 변수를 설정한다.
**/
if($this->module_srl) Context::set('module_srl',$this->module_srl);
Context::set('module_info',$this->module_info);
/**
* 모듈정보에서 넘어오는 skin값을 이용하여 최종 출력할 템플릿의 위치를 출력한다.
* $this->module_path는 ./modules/guestbook/ 값을 가지고 있다
**/
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
$this->setTemplatePath($template_path);
}
function dateFormatChange($dates) {
$dates = str_replace( "T", " ", $dates);
$dates = str_replace( "Z", "+0", $dates);
$dates = date("Y-m-d H:i:s", strtotime($dates));
return $dates;
}
/**
* @brief 달력
**/
function dispLifepodContent() {
// 권한 체크
if(!$this->grant->view) return $this->dispLifepodMessage('msg_not_permitted');
$oLifepodModel = &getModel('lifepod');
$oLifepodModel->setInfo($this->module_info->calendar_address);
$cYear = Context::get('year');
$cMonth = Context::get('month');
$cDay = Context::get('day');
// 특정 페이지 선택시 페이지 정보 가져오기
$page = $oLifepodModel->getPage($cYear, $cMonth, $cDay);
foreach ($page->data as $key => $val)
{
if($val->childNodes["date-start"])
{
$val->childNodes["date-start"]->body = $this->dateFormatChange($val->childNodes["date-start"]->body);
}
if($val->childNodes["date-end"])
{
$val->childNodes["date-end"]->body = $this->dateFormatChange($val->childNodes["date-end"]->body);
}
}
Context::set('page', $page);
$this->setTemplateFile('list');
}
/**
* @brief 메세지 출력
**/
function dispLifepodMessage($msg_code) {
$msg = Context::getLang($msg_code);
if(!$msg) $msg = $msg_code;
Context::set('message', $msg);
$this->setTemplateFile('message');
}
}
?>

View file

@ -0,0 +1,59 @@
<?php
class Me2DayXmlParser {
var $output = array();
function parse($input = '') {
$oParser = xml_parser_create('UTF-8');
xml_set_object($oParser, $this);
xml_set_element_handler($oParser, "_tagOpen", "_tagClosed");
xml_set_character_data_handler($oParser, "_tagBody");
xml_parse($oParser, $input);
xml_parser_free($oParser);
if(!count($this->output)) return;
$this->output = array_shift($this->output);
return $this->output;
}
/**
* @brief 태그 오픈
**/
function _tagOpen($parser, $node_name, $attrs) {
$obj->node_name = strtolower($node_name);
$obj->attrs = $attrs;
$obj->childNodes = array();
array_push($this->output, $obj);
}
function _tagBody($parser, $body) {
//if(!trim($body)) return;
$this->output[count($this->output)-1]->body .= $body;
}
/**
* @brief 태그 닫음
**/
function _tagClosed($parser, $node_name) {
$node_name = strtolower($node_name);
$cur_obj = array_pop($this->output);
$parent_obj = &$this->output[count($this->output)-1];
if($parent_obj->childNodes[$node_name]) {
$tmp_obj = $parent_obj->childNodes[$node_name];
if(is_array($tmp_obj)) {
array_push($parent_obj->childNodes[$node_name], $cur_obj);
} else {
$parent_obj->childNodes[$node_name] = array();
array_push($parent_obj->childNodes[$node_name], $tmp_obj);
array_push($parent_obj->childNodes[$node_name], $cur_obj);
}
} else {
$parent_obj->childNodes[$node_name] = $cur_obj;
}
}
}
?>

View file

@ -0,0 +1,18 @@
<query id="getLifepodList" action="select">
<tables>
<table name="modules" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module" default="lifepod" />
<condition operation="equal" column="module_category_srl" var="s_module_category_srl" pipe="or" />
</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>

Binary file not shown.

View file

@ -0,0 +1,97 @@
@charset "utf-8";
/* board Title */
.boardHeader { border:1px solid #e1e1dd; border-bottom:none; background:#ffffff url(../images/common/bgH3.gif) repeat-x left bottom; overflow:hidden; _width:100%;}
.boardHeader h3 { float:left; font-size:1.2em; padding:1em 2em .7em 1.2em; background:#ffffff url(../images/common/lineH3.gif) no-repeat right bottom;}
/* board Information */
.boardInformation { width:100%; clear:both; margin:1em 0 .5em 0; overflow:hidden; color:#666666;}
.articleNum { float:left; padding:0 0 0 15px; }
.CalendarViewDay
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#8888cc;
cursor: pointer;
margin-right: 2px;
}
.CalendarView4Day
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#8888cc;
cursor: pointer;
margin-right: 2px;
}
.CalendarViewWeek
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#8888cc;
cursor: pointer;
margin-right: 2px;
}
.CalendarView2Week
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#8888cc;
cursor: pointer;
margin-right: 2px;
}
.CalendarViewMonth
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#8888cc;
cursor: pointer;
margin-right: 2px;
}
.CalendarMoveToday
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#cccccc;
cursor: pointer;
margin-right: 2px;
}
.CalendarMoveNext
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#cccccc;
cursor: pointer;
margin-right: 2px;
}
.CalendarMovePrev
{
font-size:0.9em;
background-color:#FFFFFF;
border-style:solid;
border-width:1px;
border-color:#cccccc;
cursor: pointer;
margin-right: 2px;
}

View file

@ -0,0 +1,55 @@
var _calendar;
var entries = new Array();
var _year;
var _month;
var _day;
function startLifepod()
{
//초기화
//Calendar.Language = 'en'; //영어버전
//객체를 생성, 인자는 캘린더로 변할 DIV의 ID
_calendar=new Calendar('div_calendar');
//콘트롤 추가(보기 방식, 기간 이동)
_calendar.addControl(new Calendar.Control.View);
_calendar.addControl(new Calendar.Control.Move);
//이벤트 추가
_calendar.attachEvent('drawFinish', entryDraw); //캘린더가 그려지면 호출할 함수, 주로 엔트리 추가시 사용된다
_calendar.attachEvent('entryMove', entryMove); // 엔트리를 이동할 때 호출할 함수
//그리기
_calendar.draw();
}
function calAdd(id, start, end, title, description, type, category, color)
{
entries.push(new Calendar.Entry(id, category, Calendar.str2date(start), Calendar.str2date(end), type, title, description, color));
}
function setDate(year, month, day)
{
_year = year;
_month = month;
_day = day;
}
function entryDraw() {
//생성한 엔트리를 추가
for(entry in entries)
{
_calendar.addEntry(entries[entry]);
}
if(_year != undefined)
{
_calendar.date.setFullYear(_year);
_calendar.date.setMonth(_month-1);
_calendar.date.setDate(_day);
_year = undefined;
_calendar.draw();
}
}
function entryMove() {
//true를 리턴하면 엔트리가 이동이 됨, false를 리턴하면 엔트리 이동이 취소됨
return true;
}

View file

@ -0,0 +1,23 @@
Calendar.ControlAction=function(C){
var curYear = _CalendarInstances[arguments[1].parentNode.objID].date.getYear();
{switch(C)
{case"view":_CalendarInstances[arguments[1].parentNode.objID].changeView(arguments[2]);
break;
case"move":switch(arguments[2]){case"prev":_CalendarInstances[arguments[1].parentNode.objID].movePrev();
break;
case"next":_CalendarInstances[arguments[1].parentNode.objID].moveNext();
break;
case"today":_CalendarInstances[arguments[1].parentNode.objID].moveToday();
break}break;
case"plugin":
if(_CalendarInstances[arguments[1].parentNode.objID].plugin[arguments[2]]&&_CalendarInstances[arguments[1].parentNode.objID].plugin[arguments[2]].controlAction)
{
var A=[];
for(var B=3; B<arguments.length; B++)
{A.push(arguments[B])}_CalendarInstances[arguments[1].parentNode.objID].plugin[arguments[2]].controlAction(A);}break};
var newYear = _CalendarInstances[arguments[1].parentNode.objID].date.getYear();
if(curYear != newYear) {
var url = request_uri.setQuery('mid', current_mid).setQuery('year',_CalendarInstances[arguments[1].parentNode.objID].date.getFullYear()).setQuery('month',_CalendarInstances[arguments[1].parentNode.objID].date.getMonth()+1).setQuery('day',_CalendarInstances[arguments[1].parentNode.objID].date.getDate());
location.href = url;
}
}};

View file

@ -0,0 +1,34 @@
<!-- JS 파일 로드 -->
<script type="text/javascript" src="http://www.lifepod.co.kr/api/calendar.js"></script>
<!--%import("js/lifepod.js")-->
<script type="text/javascript" src="./modules/lifepod/skins/xe_official/js/xe_interface.js"></script>
<!--{count($page->data)}-->
<script type="text/javascript">//<![CDATA[
xAddEventListener(window, 'load', startLifepod);
<!--@foreach($page->data as $key => $val)-->
calAdd({$val->childNodes["identifier"]->body},'{$val->childNodes["date-start"]->body}', '{$val->childNodes["date-end"]->body}', '{$val->childNodes["title"]->body}', '{$val->childNodes["description"]->body}', '{$val->childNodes["type"]->body}', '{$page->title}', 'green');
<!--@end-->
<!--@if($day)-->
setDate({$year},{$month},{$day});
<!--@end-->
//]]></script>
<!--%import("css/common.css")-->
<!-- 상단 텍스트 출력 -->
{$module_info->header_text}
<!-- 스킨의 제목/간단한 설명 출력 -->
<!--@if($module_info->title)-->
<div class="boardHeader">
<h3>{$module_info->title}</h3>
</div>
<!--@end-->
<div id="div_calendar" style="width:750;height:600px">
<!-- 캘린더가 그려질 부분 -->
</div>
<!-- 하단 텍스트 출력 -->
{$module_info->footer_text}

View file

@ -0,0 +1,7 @@
<div>
{$message}
</div>
<!--@if(!$is_logged)-->
<a href="{getUrl('act','dispMemberLoginForm')}">{$lang->cmd_login}</a>
<!--@end-->

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<skin>
<title xml:lang="ko">라이프팟 연동 기본 스킨</title>
<title xml:lang="en">Lifepod Module Basic Skin</title>
<maker email_address="haneul0318@gmail.com" link="http://haneul.zetyx.net" date="2007.11.30">
<name xml:lang="ko">haneul</name>
<name xml:lang="en">haneul</name>
<description xml:lang="ko">라이프팟 노트 연동 모듈의 기본 스킨</description>
<description xml:lang="en">Default Skin of Lifepod Module</description>
</maker>
<extra_vars>
<var name="title" type="text">
<title xml:lang="ko">게시판 제목</title>
<title xml:lang="en">Title of Board</title>
<description xml:lang="ko">게시판의 제목을 적어주세요.</description>
<description xml:lang="en">Please input the title of board.</description>
</var>
</extra_vars>
</skin>

View file

@ -0,0 +1,10 @@
<filter name="delete_lifepod" module="lifepod" act="procLifepodAdminDeleteLifepod">
<form>
<node target="module_srl" required="true" />
</form>
<response callback_func="completeDeleteLifepod">
<tag name="error" />
<tag name="message" />
<tag name="page" />
</response>
</filter>

View file

@ -0,0 +1,11 @@
<filter name="insert_grant" module="lifepod" act="procLifepodAdminInsertGrant" confirm_msg_code="confirm_submit">
<form>
<node target="module_srl" required="true" filter="number" />
</form>
<response callback_func="completeInsertGrant">
<tag name="error" />
<tag name="message" />
<tag name="page" />
<tag name="module_srl" />
</response>
</filter>

View file

@ -0,0 +1,32 @@
<filter name="insert_lifepod" module="lifepod" act="procLifepodAdminInsertLifepod" confirm_msg_code="confirm_submit">
<form>
<node target="mid" required="true" filter="alpha_number" />
<node target="calendar_address" required="true" maxlength="250" />
</form>
<parameter>
<param name="lifepod_name" target="mid" />
<param name="calendar_address" target="calendar_address" />
<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="skin" target="skin" />
<param name="browser_title" target="browser_title" />
<param name="use_category" target="use_category" />
<param name="list_count" target="list_count" />
<param name="page_count" target="page_count" />
<param name="is_default" target="is_default" />
<param name="description" target="description" />
<param name="header_text" target="header_text" />
<param name="footer_text" target="footer_text" />
<param name="admin_id" target="admin_id" />
<param name="open_rss" target="open_rss" />
</parameter>
<response callback_func="completeInsertLifepod">
<tag name="error" />
<tag name="message" />
<tag name="module" />
<tag name="act" />
<tag name="page" />
<tag name="module_srl" />
</response>
</filter>

View file

@ -0,0 +1,38 @@
<!--#include("./header.html")-->
<!--%import("filter/insert_grant.xml")-->
<div class="infoText">{nl2br($lang->about_grant)}</div>
<form action="./" method="post" onsubmit="return procFilter(this, insert_grant)">
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<table cellspacing="0" class="adminTable">
<col width="130" />
<col width="*" />
<col width="80" />
<col width="80" />
<caption>{$lang->target}</caption>
<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-->
<tr>
<th scope="row" colspan="4" class="button">
<span class="button"><input type="submit" value="{$lang->cmd_save}" accesskey="s" /></span>
</th>
</tr>
</tbody>
</table>
</form>

View file

@ -0,0 +1,25 @@
<!--%import("js/lifepod_admin.js")-->
<h3>{$lang->lifepod} <span class="gray">{$lang->cmd_management}</span></h3>
<div class="infoText">{nl2br($lang->about_lifepod)}</div>
<!--@if($module_info)-->
<div class="header4">
<!--@if($module_info->mid)-->
<h4>{$module_info->mid} <!--@if($module_info->is_default=='Y')--><span class="bracket">({$lang->is_default})</span><!--@end--> <span class="vr">|</span> <a href="{getUrl('','mid',$module_info->mid)}" onclick="window.open(this.href); return false;" class="view">View</a></h4>
<!--@end-->
<ul class="localNavigation">
<!--@if($module=='admin')-->
<li <!--@if($act=='dispLifepodAdminContent')-->class="on"<!--@end-->><a href="{getUrl('act','dispLifepodAdminContent','module_srl','')}">{$lang->cmd_lifepod_list}</a></li>
<!--@else-->
<li><a href="{getUrl('act','')}">{$lang->cmd_back}</a></li>
<!--@end-->
<li <!--@if($act=='dispLifepodAdminLifepodInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispLifepodAdminLifepodInfo')}">{$lang->cmd_view_info}</a></li>
<li <!--@if($act=='dispLifepodAdminGrantInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispLifepodAdminGrantInfo')}">{$lang->cmd_manage_grant}</a></li>
<li <!--@if($act=='dispLifepodAdminSkinInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispLifepodAdminSkinInfo')}">{$lang->cmd_manage_skin}</a></li>
</ul>
</div>
<!--@end-->

View file

@ -0,0 +1,79 @@
<!--#include("header.html")-->
<!-- 정보 -->
<div class="tableSummaryType1">
Total <strong>{number_format($total_count)}</strong>, Page <strong>{number_format($page)}</strong>/{number_format($total_page)}
</div>
<!-- 목록 -->
<table cellspacing="0" class="adminTable">
<col width="50" />
<col width="130" />
<col />
<col width="80" />
<col width="50" />
<col width="50" />
<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" class="w80">
<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>
<input type="submit" name="go_button" id="go_button" value="GO" class="buttonTypeGo" />
</form>
</th>
<th scope="col">{$lang->mid} / {$lang->browser_title}</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($lifepod_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 class="left subject">
{$val->mid} -
<a href="{getUrl('act','dispLifepodAdminLifepodInfo','module_srl',$val->module_srl)}" class="blue">{htmlspecialchars($val->browser_title)}</a>
</td>
<td class="tahoma">{zdate($val->regdate,"Y-m-d")}</td>
<td class="blue"><a href="{getUrl('','mid',$val->mid)}" onclick="window.open(this.href); return false;">{$lang->cmd_view}</a></td>
<td class="red"><!--@if($val->is_default!='Y')--><a href="{getUrl('act','dispLifepodAdminDeleteLifepod','module_srl', $val->module_srl)}">{$lang->cmd_delete}</a><!--@end--></td>
</tr>
<!--@end-->
</tbody>
</table>
<!-- 버튼 -->
<div class="fr gap1">
<a href="{getUrl('act','dispLifepodAdminInsertLifepod','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,79 @@
/**
* @file modules/lifepod/js/lifepod_admin.js
* @author haneul (haneul0318@gmail.com)
* @brief lifepod 모듈의 관리자용 javascript
**/
/* 모듈 생성 후 */
function completeInsertLifepod(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
alert(message);
var url = current_url.setQuery('act','dispLifepodAdminLifepodInfo');
if(module_srl) url = url.setQuery('module_srl',module_srl);
if(page) url.setQuery('page',page);
location.href = url;
}
/* 모듈 삭제 후 */
function completeDeleteLifepod(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
alert(message);
var url = current_url.setQuery('act','dispLifepodAdminContent').setQuery('module_srl','');
if(page) url = url.setQuery('page',page);
location.href = url;
}
/* 권한 관련 */
function doSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked=true;
}
}
function doUnSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked = false;
}
}
function completeInsertGrant(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
alert(message);
location.href = location.href;
}
/* 카테고리 이동 */
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,79 @@
/**
* @file modules/springnote/js/springnote_admin.js
* @author zero (zero@nzeo.com)
* @brief springnote 모듈의 관리자용 javascript
**/
/* 모듈 생성 후 */
function completeInsertSpringnote(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
alert(message);
var url = current_url.setQuery('act','dispSpringnoteAdminSpringnoteInfo');
if(module_srl) url = url.setQuery('module_srl',module_srl);
if(page) url.setQuery('page',page);
location.href = url;
}
/* 모듈 삭제 후 */
function completeDeleteSpringnote(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
alert(message);
var url = current_url.setQuery('act','dispSpringnoteAdminContent').setQuery('module_srl','');
if(page) url = url.setQuery('page',page);
location.href = url;
}
/* 권한 관련 */
function doSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked=true;
}
}
function doUnSelectAll(obj, key) {
var fo_obj = obj.parentNode;
while(fo_obj.nodeName != 'FORM') {
fo_obj = fo_obj.parentNode;
}
for(var i=0;i<fo_obj.length;i++) {
var tobj = fo_obj[i];
if(tobj.name == key) tobj.checked = false;
}
}
function completeInsertGrant(ret_obj) {
var error = ret_obj['error'];
var message = ret_obj['message'];
var page = ret_obj['page'];
var module_srl = ret_obj['module_srl'];
alert(message);
location.href = location.href;
}
/* 카테고리 이동 */
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_lifepod.xml")-->
<!--%import("js/lifepod_admin.js")-->
<!--#include("header.html")-->
<form action="./" method="get" onsubmit="return procFilter(this, delete_lifepod)">
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
<table cellspacing="0" class="adminTable">
<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>
<tr>
<th scope="row" colspan="2" class="button">
<a href="{getUrl('act','dispLifepodAdminContent')}" class="button"><span>{$lang->cmd_back}</span></a>
<span class="button"><input type="submit" value="{$lang->cmd_delete}" /></span>
</th>
</tr>
</table>
</form>

View file

@ -0,0 +1,75 @@
<!--#include("header.html")-->
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<tr>
<th scope="row">{$lang->module_category}</th>
<td>
<!--@if(!$module_info->module_category_srl)-->
{$lang->not_exists}
<!--@else-->
{$module_category[$module_info->module_category_srl]->title}
<!--@end-->
</td>
</tr>
<tr>
<th scope="row">{$lang->calendar_address}</th>
<td>{$module_info->calendar_address}&nbsp;</td>
</tr>
<tr>
<th scope="row">{$lang->layout}</th>
<td>
<!--@if($module_info->layout_srl)-->
{$module_info->layout_title} ({$module_info->layout})
<!--@else-->
{$lang->not_exists}
<!--@end-->
&nbsp;
</td>
</tr>
<tr>
<th scope="row">{$lang->skin}</th>
<td>{$module_info->skin_title} ({$module_info->skin})</td>
</tr>
<tr>
<th scope="row">{$lang->browser_title}</th>
<td>{htmlspecialchars($module_info->browser_title)}</td>
</tr>
<tr>
<th scope="row">{$lang->use_category}</th>
<td><!--@if($module_info->use_category=='Y')-->{$lang->use}<!--@else-->{$lang->notuse}<!--@end--></td>
</tr>
<tr>
<th scope="row">{$lang->list_count}</th>
<td>{$module_info->list_count?$module_info->list_count:20}</td>
</tr>
<tr>
<th scope="row">{$lang->page_count}</th>
<td>{$module_info->page_count?$module_info->page_count:10}</td>
</tr>
<tr>
<th scope="row">{$lang->description}</th>
<td>{nl2br(htmlspecialchars($module_info->description))}&nbsp;</td>
</tr>
<tr>
<th scope="row">{$lang->header_text}</th>
<td>{htmlspecialchars($module_info->header_text)}&nbsp;</td>
</tr>
<tr>
<th scope="row">{$lang->footer_text}</th>
<td>{htmlspecialchars($module_info->footer_text)}&nbsp;</td>
</tr>
<tr>
<th scope="row">{$lang->admin_id}</th>
<td>{implode(",",$module_info->admin_id)}&nbsp;</td>
</tr>
<tr>
<th scope="row" colspan="2" class="button">
<a href="{getUrl('act','dispLifepodAdminInsertLifepod')}" class="button"><span>{$lang->cmd_modify}</span></a>
<!--@if($module=="admin")-->
<a href="{getUrl('act','dispLifepodAdminContent','module_srl','')}" class="button"><span>{$lang->cmd_lifepod_list}</span></a>
<!--@end-->
</th>
</tr>
</table>

View file

@ -0,0 +1,119 @@
<!--%import("filter/insert_lifepod.xml")-->
<!--%import("js/lifepod_admin.js")-->
<!--#include("header.html")-->
<form action="./" method="post" onsubmit="return procFilter(this, insert_lifepod)" enctype="multipart/form-data">
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<!--@if($module_info->is_default=='Y')-->
<input type="hidden" name="is_default" value="Y" />
<!--@end-->
<input type="hidden" name="use_category" value="N" />
<table cellspacing="0" class="adminTable">
<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->calendar_address}</th>
<td>
<input type="text" name="calendar_address" value="{htmlspecialchars($module_info->calendar_address)}" class="inputTypeText w300" />
</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 w300" />
<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->skin}</th>
<td>
<select name="skin">
<!--@foreach($skin_list as $key=>$val)-->
<option value="{$key}" <!--@if($module_info->skin==$key)-->selected="selected"<!--@end-->>{$val->title}</option>
<!--@end-->
</select>
<p>{$lang->about_skin}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->description}</th>
<td>
<textarea name="description" class="inputTypeTextArea w100">{htmlspecialchars($module_info->description)}</textarea>
<p>{$lang->about_description}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->header_text}</th>
<td>
<textarea name="header_text" class="inputTypeTextArea w100">{htmlspecialchars($module_info->header_text)}</textarea>
<p>{$lang->about_header_text}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->footer_text}</th>
<td>
<textarea name="footer_text" class="inputTypeTextArea w100">{htmlspecialchars($module_info->footer_text)}</textarea>
<p>{$lang->about_footer_text}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->admin_id}</th>
<td>
<textarea name="admin_id" class="inputTypeTextArea w100"><!--@if($module_info->admin_id)-->{implode(",",$module_info->admin_id)}<!--@end--></textarea>
<p>{$lang->about_admin_id}</p>
</td>
</tr>
<tr>
<th scope="row" colspan="2" class="button">
<span class="button"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span>
</th>
</tr>
</table>
</form>

View file

@ -0,0 +1,116 @@
<!--#include("./header.html")-->
<form action="./" method="post" enctype="multipart/form-data" target="hidden_iframe">
<input type="hidden" name="module" value="{$module_info->module}" />
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="act" value="procSpringnoteAdminUpdateSkinInfo" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<input type="hidden" name="page" value="{$page}" />
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<caption>{$lang->skin_default_info}</caption>
<tr>
<th scope="row">{$lang->skin}</th>
<td class="left" >{$skin_info->title}</td>
</tr>
<tr>
<th scope="row">{$lang->skin_maker}</th>
<td class="left" >{$skin_info->maker->name} <!--@if($skin_info->maker->email_address)-->(<a href="mailto:{$skin_info->maker->email_address}">{$skin_info->maker->email_address}</a>)<!--@end--></td>
</tr>
<tr>
<th scope="row">{$lang->skin_maker_homepage}</th>
<td class="left" ><a href="{$skin_info->maker->homepage}" target="_blank">{$skin_info->maker->homepage}</a></td>
</tr>
<tr>
<th scope="row">{$lang->date}</th>
<td class="left" >{$skin_info->maker->date}</td>
</tr>
<tr>
<th scope="row">{$lang->description}</th>
<td class="left" >{nl2br($skin_info->maker->description)}</td>
</tr>
</table>
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<caption>{$lang->extra_vars}</caption>
<tr valign="top">
<th scope="row">{$lang->colorset}</th>
<td class="left" >
<!--@foreach($skin_info->colorset as $key => $val)-->
<div>
<!--@if($val->screenshot)-->
<img src="{$val->screenshot}" align="left" alt="{$val->title}" />
<!--@end-->
<input type="radio" name="colorset" value="{$val->name}" id="colorset_{$key}" <!--@if($module_info->colorset==$val->name)-->checked="checked"<!--@end-->/>
<label for="colorset_{$key}">{$val->title}</label>
</div>
<!--@end-->
</td>
</tr>
<!--@foreach($skin_info->extra_vars as $key => $val)-->
<tr>
<th scope="row">{$val->title}</th>
<td class="left">
<!--@if($val->type=="text")-->
<input type="text" name="{$val->name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w100" />
<!--@elseif($val->type=="textarea")-->
<textarea name="{$val->name}" class="inputTypeTextArea w100">{htmlspecialchars($val->value)}</textarea>
<!--@elseif($val->type=="select")-->
<select name="{$val->name}">
<!--@foreach($val->default as $k=>$v)-->
<option value="{$v}" <!--@if($v==$val->value)-->selected="selected"<!--@end-->>{$v}</option>
<!--@end-->
</select>
<!--@elseif($val->type=="checkbox")-->
<!--@foreach($val->default as $k=>$v)-->
<span>
<input type="checkbox" name="{$val->name}[]" value="{$v}" id="ch_{$key}_{$k}" <!--@if(in_array($v, $val->value))-->checked="checked"<!--@end--> class="checkbox" />
<label for="ch_{$key}_{$k}">{$v}</label>
</span>
<!--@end-->
<!--@elseif($val->type=="radio")-->
<!--@foreach($val->default as $k=>$v)-->
<span>
<input type="radio" name="{$val->name}" value="{$v}" id="ch_{$key}_{$k}" <!--@if($v==$val->value)-->checked="checked"<!--@end-->/>
<label for="ch_{$key}_{$k}">{$v}</label>
</span>
<!--@end-->
<!--@elseif($val->type=="image")-->
<!--@if($val->value)-->
<div>
<img src="{$val->value}" /><br />
<input type="checkbox" name="del_{$val->name}" value="Y" id="del_{$val->name}" class="checkbox" />
<label for="del_{$val->name}">{$lang->cmd_delete}</label>
</div>
<!--@end-->
<input type="file" name="{$val->name}" value="" />
<!--@end-->
<!--@if($val->description)-->
<p>{nl2br($val->description)}</p>
<!--@end-->
</td>
</tr>
<!--@end-->
<tr>
<th scope="row" colspan="2" class="button">
<span class="button"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span>
</th>
</tr>
</table>
</form>
<iframe name="hidden_iframe" frameborder="0" style="display:none"></iframe>