git-svn-id: http://xe-core.googlecode.com/svn/sandbox@2327 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2007-08-12 03:59:52 +00:00
commit 8326004cb2
2773 changed files with 91485 additions and 0 deletions

View file

@ -0,0 +1,566 @@
<?php
/**
* @class blogAdminController
* @author zero (zero@nzeo.com)
* @brief blog 모듈의 admin controller class
**/
class blogAdminController extends blog {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 권한 추가
**/
function procBlogAdminInsertGrant() {
$module_srl = Context::get('module_srl');
// 현 모듈의 권한 목록을 가져옴
$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_srl, $grants);
$this->add('module_srl',Context::get('module_srl'));
$this->setMessage('success_registed');
}
/**
* @brief 스킨 정보 업데이트
**/
function procBlogAdminUpdateSkinInfo() {
// module_srl에 해당하는 정보들을 가져오기
$module_srl = Context::get('module_srl');
$oModuleModel = &getModel('module');
$oModuleController = &getController('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;
}
}
// 메뉴 관리
$menus = get_object_vars($skin_info->menu);
if(count($menus)) {
foreach($menus as $menu_id => $val) {
$menu_srl = Context::get($menu_id);
if($menu_srl) {
$obj->menu->{$menu_id} = $menu_srl;
$obj->{$menu_id} = $menu_srl;
$menu_srl_list[] = $menu_srl;
}
}
// 정해진 메뉴가 있으면 모듈 및 메뉴에 대한 레이아웃 연동
if(count($menu_srl_list)) {
// 해당 메뉴와 레이아웃 값을 매핑
$oMenuAdminController = &getAdminController('menu');
$oMenuAdminController->updateMenuLayout($module_srl, $menu_srl_list);
// 해당 메뉴에 속한 mid의 layout값을 모두 변경
$oModuleController->updateModuleLayout($module_srl, $menu_srl_list);
}
}
// serialize하여 저장
$obj->category_xml_file = sprintf("./files/cache/blog_category/%s.xml.php", $module_srl);
$obj->mid = $module_info->mid;
$skin_vars = serialize($obj);
$oModuleController->updateModuleSkinVars($module_srl, $skin_vars);
// 레이아웃 확장변수 수정
$layout_args->extra_vars = $skin_vars;
$layout_args->layout_srl = $module_srl;
$oLayoutAdminController = &getAdminController('layout');
$output = $oLayoutAdminController->updateLayout($layout_args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$this->setLayoutPath('./common/tpl');
$this->setLayoutFile('default_layout.html');
$this->setTemplatePath($this->module_path.'tpl');
$this->setTemplateFile("top_refresh.html");
}
/**
* @brief 블로그 추가
**/
function procBlogAdminInsertBlog() {
// 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
$args = Context::gets('module_srl','module_category_srl','blog_name','skin','browser_title','description','is_default','header_text','footer_text','admin_id','open_rss');
$args->module = 'blog';
$args->mid = $args->blog_name;
unset($args->blog_name);
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->blog_name);
$oDB = &DB::getInstance();
$oDB->begin();
// 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의 값에 따라 insert/update
if(!$args->module_srl) {
// 블로그 등록
$output = $oModuleController->insertModule($args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 글작성, 파일첨부, 댓글 파일첨부, 관리에 대한 권한 지정
if($output->toBool()) {
$oMemberModel = &getModel('member');
$admin_group = $oMemberModel->getAdminGroup();
$admin_group_srl = $admin_group->group_srl;
$module_srl = $output->get('module_srl');
$grants = serialize(array('write_document'=>array($admin_group_srl), 'fileupload'=>array($admin_group_srl), 'comment_fileupload'=>array($admin_group_srl), 'manager'=>array($admin_group_srl)));
$output = $oModuleController->updateModuleGrant($module_srl, $grants);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
}
// 레이아웃 등록
$layout_args->layout_srl = $layout_args->module_srl = $module_srl;
$layout_args->layout = 'blog';
$layout_args->title = sprintf('%s - %s',$args->browser_title, $args->mid);
$layout_args->layout_path = sprintf('./modules/blog/skins/%s/layout.html', $args->skin);
$oLayoutController = &getAdminController('layout');
$output = $oLayoutController->insertLayout($layout_args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 기본 카테고리 등록
$category_args->module_srl = $module_srl;
$category_args->category_srl = getNextSequence();
$category_args->name = 'Story';
$category_args->expand = 'N';
$this->procBlogAdminInsertCategory($category_args);
$msg_code = 'success_registed';
} else {
// 블로그 데이터 수정
$output = $oModuleController->updateModule($args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 레이아웃 수정
$layout_args->layout_srl = $layout_args->module_srl = $module_srl = $output->get('module_srl');
$layout_args->title = $args->browser_title;
$layout_args->layout_path = sprintf('./modules/blog/skins/%s/layout.html', $args->skin);
$oLayoutAdminController = &getAdminController('layout');
$output = $oLayoutAdminController->updateLayout($layout_args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$msg_code = 'success_updated';
}
$oDB->commit();
$this->add('page',Context::get('page'));
$this->add('module_srl',$output->get('module_srl'));
$this->setMessage($msg_code);
}
/**
* @brief 블로그 삭제
**/
function procBlogAdminDeleteBlog() {
$module_srl = Context::get('module_srl');
$oDB = &DB::getInstance();
$oDB->begin();
// 블로그 모듈 삭제
$oModuleController = &getController('module');
$output = $oModuleController->deleteModule($module_srl);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 레이아웃 삭제
$layout_args->layout_srl = $layout_args->module_srl = $module_srl;
$oLayoutAdminController = &getAdminController('layout');
$output = $oLayoutAdminController->deleteLayout($layout_args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 블로그 카테고리 삭제
$category_args->module_srl = $module_srl;
$output = executeQuery('blog.deleteCategories', $category_args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
@unlink( sprintf('./files/cache/blog_category/%d.xml.php', $module_srl) );
$oDB->commit();
$this->add('module','blog');
$this->add('page',Context::get('page'));
$this->setMessage('success_deleted');
}
/**
* @brief 카테고리 추가
**/
function procBlogAdminInsertCategory($args = null) {
// 입력할 변수 정리
if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','name','expand','group_srls');
if($args->expand !="Y") $args->expand = "N";
$args->group_srls = str_replace('|@|',',',$args->group_srls);
$args->parent_srl = (int)$args->parent_srl;
$oDB = &DB::getInstance();
$oDB->begin();
// 이미 존재하는지를 확인
$oBlogModel = &getModel('blog');
$category_info = $oBlogModel->getCategoryInfo($args->category_srl);
// 존재하게 되면 update를 해준다
if($category_info->category_srl == $args->category_srl) {
$output = executeQuery('blog.updateCategory', $args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$oDocumentController = &getAdminController('document');
$document_args->category_srl = $args->category_srl;
$document_args->title = $args->name ;
$output = $oDocumentController->updateCategory($document_args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 존재하지 않으면 insert를 해준다
} else {
$args->listorder = -1*$args->category_srl;
$output = executeQuery('blog.insertCategory', $args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$oDocumentController = &getAdminController('document');
$output = $oDocumentController->insertCategory($args->module_srl, $args->name, $args->category_srl);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
}
// XML 파일을 갱신하고 위치을 넘겨 받음
$xml_file = $this->makeXmlFile($args->module_srl);
$oDB->commit();
$this->add('xml_file', $xml_file);
$this->add('module_srl', $args->module_srl);
$this->add('category_srl', $args->category_srl);
$this->add('parent_srl', $args->parent_srl);
}
/**
* @brief 카테고리 삭제
**/
function procBlogAdminDeleteCategory() {
// 변수 정리
$args = Context::gets('module_srl','category_srl');
$oDB = &DB::getInstance();
$oDB->begin();
$oBlogModel = &getModel('blog');
// 원정보를 가져옴
$category_info = $oBlogModel->getCategoryInfo($args->category_srl);
if($category_info->parent_srl) $parent_srl = $category_info->parent_srl;
// 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력
$output = executeQuery('blog.getChildCategoryCount', $args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
if($output->data->count>0) {
$oDB->rollback();
return new Object(-1, 'msg_cannot_delete_for_child');
}
// DB에서 삭제
$output = executeQuery("blog.deleteCategory", $args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
$oDocumentController = &getAdminController('document');
$output = $oDocumentController->deleteCategory($args->category_srl);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// XML 파일을 갱신하고 위치을 넘겨 받음
$xml_file = $this->makeXmlFile($args->module_srl);
$oDB->commit();
$this->add('xml_file', $xml_file);
$this->add('category_srl', $parent_srl);
$this->setMessage('success_deleted');
}
/**
* @brief 카테고리 이동
**/
function procBlogAdminMoveCategory() {
$source_category_srl = Context::get('source_category_srl');
$target_category_srl = Context::get('target_category_srl');
$oBlogModel = &getModel('blog');
$target_category = $oBlogModel->getCategoryInfo($target_category_srl);
$source_category = $oBlogModel->getCategoryInfo($source_category_srl);
// source_category에 target_category_srl의 parent_srl, listorder 값을 입력
$source_args->category_srl = $source_category_srl;
$source_args->parent_srl = $target_category->parent_srl;
$source_args->listorder = $target_category->listorder;
$output = executeQuery('blog.updateCategoryParent', $source_args);
if(!$output->toBool()) return $output;
// target_category의 listorder값을 +1해 준다
$target_args->category_srl = $target_category_srl;
$target_args->parent_srl = $target_category->parent_srl;
$target_args->listorder = $target_category->listorder -1;
$output = executeQuery('blog.updateCategoryParent', $target_args);
if(!$output->toBool()) return $output;
// xml파일 재생성
$xml_file = $this->makeXmlFile($target_category->module_srl);
// return 변수 설정
$this->add('xml_file', $xml_file);
$this->add('source_category_srl', $source_category_srl);
}
/**
* @brief xml 파일을 갱신
* 관리자페이지에서 메뉴 구성 간혹 xml파일이 재생성 안되는 경우가 있는데\n
* 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n
* 개발 중간의 문제인 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능
**/
function procBlogAdminMakeXmlFile() {
// 입력값을 체크
$module_srl = Context::get('module_srl');
// xml파일 재생성
$xml_file = $this->makeXmlFile($module_srl);
// return 값 설정
$this->add('xml_file',$xml_file);
}
/**
* @brief 블로그 카테고리를 xml파일로 저장
**/
function makeXmlFile($module_srl) {
// xml파일 생성시 필요한 정보가 없으면 그냥 return
if(!$module_srl) return;
// 캐시 파일의 이름을 지정
$xml_file = sprintf("./files/cache/blog_category/%s.xml.php", $module_srl);
// 모듈정보를 구해옴
$oModuleModel = &getModel('module');
$this->module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
// DB에서 module_srl 에 해당하는 메뉴 아이템 목록을 listorder순으로 구해옴
$oBlogModel = &getModel('blog');
$list = $oBlogModel->getCategoryList($module_srl);
// 구해온 데이터가 없다면 노드데이터가 없는 xml 파일만 생성
if(!$list) {
$xml_buff = "<root />";
FileHandler::writeFile($xml_file, $xml_buff);
return $xml_file;
}
// 구해온 데이터가 하나라면 array로 바꾸어줌
if(!is_array($list)) $list = array($list);
// 루프를 돌면서 tree 구성
$list_count = count($list);
for($i=0;$i<$list_count;$i++) {
$node = $list[$i];
$category_srl = $node->category_srl;
$parent_srl = $node->parent_srl;
$tree[$parent_srl][$category_srl] = $node;
}
// xml 캐시 파일 생성
$xml_buff = sprintf('<?php header("Content-Type: text/xml; charset=UTF-8"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); @session_start(); ?><root>%s</root>', $this->getXmlTree($tree[0], $tree));
// 파일 저장
FileHandler::writeFile($xml_file, $xml_buff);
return $xml_file;
}
/**
* @brief array로 정렬된 노드들을 parent_srl을 참조하면서 recursive하게 돌면서 xml 데이터 생성
* 메뉴 xml파일은 node라는 tag가 중첩으로 사용되며 xml doc으로 관리자 페이지에서 메뉴를 구성해줌\n
* (tree_menu.js 에서 xml파일을 바로 읽고 tree menu를 구현)
**/
function getXmlTree($source_node, $tree) {
if(!$source_node) return;
foreach($source_node as $category_srl => $node) {
$child_buff = "";
// 자식 노드의 데이터 가져옴
if($category_srl && $tree[$category_srl]) $child_buff = $this->getXmlTree($tree[$category_srl], $tree);
// 변수 정리
$name = str_replace(array('&','"','<','>'),array('&amp;','&quot;','&lt;','&gt;'),$node->name);
$expand = $node->expand;
$group_srls = $node->group_srls;
// node->group_srls값이 있으면
if($group_srls) $group_check_code = sprintf('($_SESSION["is_admin"]==true||(is_array($_SESSION["group_srls"])&&count(array_intersect($_SESSION["group_srls"], array(%s)))))',$group_srls);
else $group_check_code = "true";
$attribute = sprintf(
'node_srl="%s" text="<?=(%s?"%s":"")?>" url="%s" expand="%s" ',
$category_srl,
$group_check_code,
$name,
getUrl('','mid',$this->module_info->mid,'category',$category_srl),
$expand
);
if($child_buff) $buff .= sprintf('<node %s>%s</node>', $attribute, $child_buff);
else $buff .= sprintf('<node %s />', $attribute);
}
return $buff;
}
}
?>

View file

@ -0,0 +1,65 @@
<?php
/**
* @class blogAdminModel
* @author zero (zero@nzeo.com)
* @version 0.1
* @brief blog 모듈의 admin model class
**/
class blogAdminModel extends blog {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 특정 카테고리의 정보를 이용하여 템플릿을 구한후 return
* 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 html을 직접 return
**/
function getBlogAdminCategoryTplInfo() {
// 해당 메뉴의 정보를 가져오기 위한 변수 설정
$category_srl = Context::get('category_srl');
$parent_srl = Context::get('parent_srl');
// 회원 그룹의 목록을 가져옴
$oMemberModel = &getModel('member');
$group_list = $oMemberModel->getGroups();
Context::set('group_list', $group_list);
$oBlogModel = &getModel('blog');
// parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임
if(!$category_srl && $parent_srl) {
// 상위 메뉴의 정보를 가져옴
$parent_info = $oBlogModel->getCategoryInfo($parent_srl);
// 추가하려는 메뉴의 기본 변수 설정
$category_info->category_srl = getNextSequence();
$category_info->parent_srl = $parent_srl;
$category_info->parent_category_name = $parent_info->name;
// root에 메뉴 추가하거나 기존 메뉴의 수정일 경우
} else {
// category_srl 이 있으면 해당 메뉴의 정보를 가져온다
if($category_srl) $category_info = $oBlogModel->getCategoryInfo($category_srl);
// 찾아진 값이 없다면 신규 메뉴 추가로 보고 category_srl값만 구해줌
if(!$category_info->category_srl) {
$category_info->category_srl = getNextSequence();
}
}
Context::set('category_info', $category_info);
// template 파일을 직접 컴파일한후 tpl변수에 담아서 return한다.
$oTemplate = &TemplateHandler::getInstance();
$tpl = $oTemplate->compile($this->module_path.'tpl', 'category_info');
// return 할 변수 설정
$this->add('tpl', $tpl);
}
}
?>

View file

@ -0,0 +1,209 @@
<?php
/**
* @class blogAdminView
* @author zero (zero@nzeo.com)
* @brief blog 모듈의 admin view class
**/
class blogAdminView extends blog {
/**
* @brief 초기화
*
* blog 모듈은 일반 사용과 관리자용으로 나누어진다.\n
**/
function init() {
// module_srl이 있으면 미리 체크하여 존재하는 모듈이면 module_info 세팅
$module_srl = Context::get('module_srl');
if(!$module_srl && $this->module_srl) {
$module_srl = $this->module_srl;
Context::set('module_srl', $module_srl);
}
// module model 객체 생성
$oModuleModel = &getModel('module');
// module_srl이 넘어오면 해당 모듈의 정보를 미리 구해 놓음
if($module_srl) {
$module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl);
if($module_info->module_srl == $module_srl) {
$this->module_info = $module_info;
Context::set('module_info',$module_info);
}
}
// 모듈 카테고리 목록을 구함
$module_category = $oModuleModel->getModuleCategories();
Context::set('module_category', $module_category);
// 만약 블로그 서비스 페이지에서 관리자 기능 호출시 요청된 블로그의 정보와 레이아웃 가져옴
if($this->mid) {
$oView = &getView('blog');
$oView->setModuleInfo($this->module_info, $this->xml_info);
$oView->init();
}
// 템플릿 경로 지정 (blog의 경우 tpl에 관리자용 템플릿 모아놓음)
$this->setTemplatePath($this->module_path."tpl");
}
/**
* @brief 블로그 관리 목록 보여줌
**/
function dispBlogAdminContent() {
// 등록된 blog 모듈을 불러와 세팅
$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('blog.getBlogList', $args);
// 템플릿에 쓰기 위해서 context::set
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('blog_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 템플릿 파일 지정
$this->setTemplateFile('index');
}
/**
* @brief 선택된 블로그의 정보 출력
**/
function dispBlogAdminBlogInfo() {
// module_srl 값이 없다면 그냥 index 페이지를 보여줌
if(!Context::get('module_srl')) return $this->dispBlogAdminContent();
// 레이아웃이 정해져 있다면 레이아웃 정보를 추가해줌(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('blog_info');
}
/**
* @brief 블로그 추가 출력
**/
function dispBlogAdminInsertBlog() {
// 스킨 목록을 구해옴
$oModuleModel = &getModel('module');
$skin_list = $oModuleModel->getSkins($this->module_path);
Context::set('skin_list',$skin_list);
// 템플릿 파일 지정
$this->setTemplateFile('blog_insert');
}
/**
* @brief 블로그 삭제 화면 출력
**/
function dispBlogAdminDeleteBlog() {
if(!Context::get('module_srl')) return $this->dispBlogAdminContent();
$module_info = Context::get('module_info');
$oDocumentModel = &getModel('document');
$document_count = $oDocumentModel->getDocumentCount($module_info->module_srl);
$module_info->document_count = $document_count;
Context::set('module_info',$module_info);
// 템플릿 파일 지정
$this->setTemplateFile('blog_delete');
}
/**
* @brief 스킨 정보 보여줌
**/
function dispBlogAdminSkinInfo() {
// 현재 선택된 모듈의 스킨의 정보 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;
}
}
// skin_info에 menu값을 지정
if(count($skin_info->menu)) {
foreach($skin_info->menu as $key => $val) {
if($module_info->{$key}) $skin_info->menu->{$key}->menu_srl = $module_info->{$key};
}
}
// 메뉴를 가져옴
$oMenuAdminModel = &getAdminModel('menu');
$menu_list = $oMenuAdminModel->getMenus();
Context::set('menu_list', $menu_list);
Context::set('skin_info', $skin_info);
$this->setTemplateFile('skin_info');
}
/**
* @brief 카테고리의 정보 출력
**/
function dispBlogAdminCategoryInfo() {
// module_srl을 구함
$module_srl = $this->module_info->module_srl;
// 카테고리 정보를 가져옴
$oBlogModel = &getModel('blog');
$category_info = $oBlogModel->getCategory($module_srl);
Context::set('category_info', $category_info);
Context::addJsFile('./common/js/tree_menu.js');
Context::set('layout','none');
$this->setTemplateFile('category_list');
}
/**
* @brief 권한 목록 출력
**/
function dispBlogAdminGrantInfo() {
// 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,53 @@
<?php
/**
* @class blog
* @author zero (zero@nzeo.com)
* @brief blog 모듈의 high class
**/
class blog extends ModuleObject {
var $skin = "default"; ///< 스킨 이름
var $list_count = 1; ///< 한 페이지에 나타날 글의 수
var $page_count = 10; ///< 페이지의 수
var $editor = 'default'; ///< 에디터 종류
/**
* @brief 설치시 추가 작업이 필요할시 구현
**/
function moduleInstall() {
// action forward에 등록 (관리자 모드에서 사용하기 위함)
$oModuleController = &getController('module');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminContent');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminBlogInfo');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminInsertBlog');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminDeleteBlog');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminSkinInfo');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminCategoryInfo');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminMenuInfo');
$oModuleController->insertActionForward('blog', 'view', 'dispBlogAdminGrantInfo');
$oModuleController->insertActionForward('blog', 'controller', 'procBlogAdminUpdateSkinInfo');
// 캐쉬로 사용할 디렉토리 생성
FileHandler::makeDir('./files/cache/blog_category');
return new Object();
}
/**
* @brief 설치가 이상이 없는지 체크하는 method
**/
function checkUpdate() {
return false;
}
/**
* @brief 업데이트 실행
**/
function moduleUpdate() {
return new Object();
}
}
?>

View file

@ -0,0 +1,226 @@
<?php
/**
* @class blogController
* @author zero (zero@nzeo.com)
* @brief blog 모듈의 Controller class
**/
class blogController extends blog {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 문서 입력
**/
function procBlogInsertDocument() {
// 권한 체크
if(!$this->grant->write_document) return new Object(-1, 'msg_not_permitted');
// 글작성시 필요한 변수를 세팅
$obj = Context::getRequestVars();
$obj->module_srl = $this->module_srl;
if($obj->is_notice!='Y'||!$this->grant->manager) $obj->is_notice = 'N';
// document module의 model 객체 생성
$oDocumentModel = &getModel('document');
// document module의 controller 객체 생성
$oDocumentController = &getController('document');
// 이미 존재하는 글인지 체크
$oDocument = $oDocumentModel->getDocument($obj->document_srl, $this->grant->manager);
// 이미 존재하는 경우 수정
if($oDocument->isExists() && $oDocument->document_srl == $obj->document_srl) {
$output = $oDocumentController->updateDocument($oDocument, $obj);
$msg_code = 'success_updated';
// 그렇지 않으면 신규 등록
} else {
$output = $oDocumentController->insertDocument($obj);
$msg_code = 'success_registed';
$obj->document_srl = $output->get('document_srl');
}
// 오류 발생시 멈춤
if(!$output->toBool()) return $output;
// 트랙백이 있으면 트랙백 발송
$trackback_url = Context::get('trackback_url');
$trackback_charset = Context::get('trackback_charset');
if($trackback_url) {
$oTrackbackController = &getController('trackback');
$oTrackbackController->sendTrackback($obj, $trackback_url, $trackback_charset);
}
// 결과를 리턴
$this->add('mid', Context::get('mid'));
$this->add('document_srl', $output->get('document_srl'));
// 성공 메세지 등록
$this->setMessage($msg_code);
}
/**
* @brief 문서 삭제
**/
function procBlogDeleteDocument() {
// 문서 번호 확인
$document_srl = Context::get('document_srl');
// 문서 번호가 없다면 오류 발생
if(!$document_srl) return $this->doError('msg_invalid_document');
// document module model 객체 생성
$oDocumentController = &getController('document');
// 삭제 시도
$output = $oDocumentController->deleteDocument($document_srl, $this->grant->manager);
if(!$output->toBool()) return $output;
// 성공 메세지 등록
$this->add('mid', Context::get('mid'));
$this->add('page', $output->get('page'));
$this->setMessage('success_deleted');
}
/**
* @brief 코멘트 추가
**/
function procBlogInsertComment() {
// 권한 체크
if(!$this->grant->write_comment) return new Object(-1, 'msg_not_permitted');
// 댓글 입력에 필요한 데이터 추출
$obj = Context::gets('document_srl','comment_srl','parent_srl','content','password','nick_name','nick_name','member_srl','email_address','homepage');
$obj->module_srl = $this->module_srl;
// comment 모듈의 model 객체 생성
$oCommentModel = &getModel('comment');
// comment 모듈의 controller 객체 생성
$oCommentController = &getController('comment');
// 줄바꾸임나 태그제거등의 작업
$obj->content = nl2br(strip_tags($obj->content));
/**
* 존재하는 댓글인지를 확인하여 존재 하지 않는 댓글이라면 신규로 등록하기 위해서 comment_srl의 sequence값을 받는다
**/
if(!$obj->comment_srl) {
$obj->comment_srl = getNextSequence();
} else {
$comment = $oCommentModel->getComment($obj->comment_srl, $this->grant->manager);
}
// comment_srl이 없을 경우 신규 입력
if($comment->comment_srl != $obj->comment_srl) {
// parent_srl이 있으면 답변으로
if($obj->parent_srl) {
$parent_comment = $oCommentModel->getComment($obj->parent_srl);
if(!$parent_comment->comment_srl) return new Object(-1, 'msg_invalid_request');
$output = $oCommentController->insertComment($obj);
// 없으면 신규
} else {
$output = $oCommentController->insertComment($obj);
}
// comment_srl이 있으면 수정으로
} else {
$obj->parent_srl = $comment->parent_srl;
$output = $oCommentController->updateComment($obj, $this->grant->manager);
$comment_srl = $obj->comment_srl;
}
if(!$output->toBool()) return $output;
$this->add('mid', Context::get('mid'));
$this->add('document_srl', $obj->document_srl);
$this->add('comment_srl', $obj->comment_srl);
$this->setMessage('success_registed');
}
/**
* @brief 코멘트 삭제
**/
function procBlogDeleteComment() {
// 댓글 번호 확인
$comment_srl = Context::get('comment_srl');
if(!$comment_srl) return $this->doError('msg_invalid_request');
// comment 모듈의 controller 객체 생성
$oCommentController = &getController('comment');
$output = $oCommentController->deleteComment($comment_srl, $this->grant->manager);
if(!$output->toBool()) return $output;
$this->add('mid', Context::get('mid'));
$this->add('page', Context::get('page'));
$this->add('document_srl', $output->get('document_srl'));
$this->setMessage('success_deleted');
}
/**
* @brief 엮인글 삭제
**/
function procBlogDeleteTrackback() {
$trackback_srl = Context::get('trackback_srl');
// trackback module의 controller 객체 생성
$oTrackbackController = &getController('trackback');
$output = $oTrackbackController->deleteTrackback($trackback_srl, $this->grant->manager);
if(!$output->toBool()) return $output;
$this->add('mid', Context::get('mid'));
$this->add('page', Context::get('page'));
$this->add('document_srl', $output->get('document_srl'));
$this->setMessage('success_deleted');
}
/**
* @brief 문서와 댓글의 비밀번호를 확인
**/
function procBlogVerificationPassword() {
// 비밀번호와 문서 번호를 받음
$password = md5(Context::get('password'));
$document_srl = Context::get('document_srl');
$comment_srl = Context::get('comment_srl');
// comment_srl이 있을 경우 댓글이 대상
if($comment_srl) {
// 문서번호에 해당하는 글이 있는지 확인
$oCommentModel = &getModel('comment');
$data = $oCommentModel->getComment($comment_srl);
// comment_srl이 없으면 문서가 대상
} else {
// 문서번호에 해당하는 글이 있는지 확인
$oDocumentModel = &getModel('document');
$data = $oDocumentModel->getDocument($document_srl);
}
// 글이 없을 경우 에러
if(!$data) return new Object(-1, 'msg_invalid_request');
// 문서의 비밀번호와 입력한 비밀번호의 비교
if($data->password != $password) return new Object(-1, 'msg_invalid_password');
// 해당 글에 대한 권한 부여
if($comment_srl) {
$oCommentController = &getController('comment');
$oCommentController->addGrant($comment_srl);
} else {
$oDocumentController = &getController('document');
$oDocumentController->addGrant($document_srl);
}
}
}
?>

View file

@ -0,0 +1,53 @@
<?php
/**
* @class blogModel
* @author zero (zero@nzeo.com)
* @version 0.1
* @brief blog 모듈의 Model class
**/
class blogModel extends blog {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief DB 생성된 카테고리 정보를 구함
* 생성된 메뉴의 DB정보+XML정보를 return
**/
function getCategory($module_srl) {
$category_info->xml_file = sprintf('./files/cache/blog_category/%s.xml.php',$module_srl);
return $category_info;
}
/**
* @brief 특정 모듈의 전체 카테고리를 구함
**/
function getCategoryList($module_srl) {
$args->module_srl = $module_srl;
$args->sort_index = 'listorder';
$output = executeQuery('blog.getBlogCategories', $args);
if(!$output->toBool()) return;
return $output->data;
}
/**
* @brief 특정 카테고리의 정보를 return
* 정보중에 group_srls의 경우는 , 연결되어 들어가며 사용시에는 explode를 통해 array로 변환 시킴
**/
function getCategoryInfo($category_srl) {
if(!$category_srl) return;
// category_srl이 있으면 해당 메뉴의 정보를 가져온다
$args->category_srl= $category_srl;
$output = executeQuery('blog.getCategoryInfo', $args);
$node = $output->data;
if($node->group_srls) $node->group_srls = explode(',',$node->group_srls);
else $node->group_srls = array();
return $node;
}
}
?>

382
modules/blog/blog.view.php Normal file
View file

@ -0,0 +1,382 @@
<?php
/**
* @class blogView
* @author zero (zero@nzeo.com)
* @brief blog 모듈의 View class
**/
class blogView extends blog {
/**
* @brief 초기화
*
* blog 모듈은 일반 사용과 관리자용으로 나누어진다.\n
**/
function init() {
// 템플릿에서 사용할 변수를 Context::set()
if($this->module_srl) Context::set('module_srl',$this->module_srl);
// 기본 모듈 정보들 설정
$this->list_count = $this->module_info->list_count?$this->module_info->list_count:1;
$this->page_count = $this->module_info->page_count?$this->module_info->page_count:10;
// 카테고리 목록을 가져오고 선택된 카테고리의 값을 설정
$oDocumentModel = &getModel('document');
$this->category_list = $oDocumentModel->getCategoryList($this->module_srl);
Context::set('category_list', $this->category_list);
// 스킨 경로 구함
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
$this->setTemplatePath($template_path);
// rss url
if($this->module_info->open_rss != 'N') Context::set('rss_url', getUrl('','mid',$this->mid,'act','rss'));
// 레이아웃의 정보를 속이기 위해서 layout_srl을 현 블로그의 module_srl로 입력
$this->module_info->layout_srl = $this->module_info->module_srl;
/**
* 블로그는 자체 레이아웃을 관리하기에 이와 관련된 세팅을 해줌
**/
// 레이아웃 경로와 파일 지정 (블로그는 자체 레이아웃을 가지고 있음)
$this->setLayoutPath($template_path);
$this->setLayoutFile("layout");
// 수정된 레이아웃 파일이 있으면 지정
$edited_layout = sprintf('./files/cache/layout/%d.html', $this->module_info->module_srl);
if(file_exists($edited_layout)) $this->setEditedLayoutFile($edited_layout);
// 카테고리 xml 파일 위치 지정
$this->module_info->category_xml_file = sprintf('%s/files/cache/blog_category/%d.xml.php', getUrl(), $this->module_info->module_srl);
// 메뉴 등록시 메뉴 정보를 구해옴
if($this->module_info->menu) {
foreach($this->module_info->menu as $menu_id => $menu_srl) {
$menu_php_file = sprintf("./files/cache/menu/%s.php", $menu_srl);
if(file_exists($menu_php_file)) @include($menu_php_file);
Context::set($menu_id, $menu);
}
}
// layout_info 변수 설정
Context::set('layout_info',$this->module_info);
// 모듈정보 세팅
Context::set('module_info',$this->module_info);
}
/**
* @brief 목록 선택된 출력
**/
function dispBlogContent() {
// 권한 체크
if(!$this->grant->list) return $this->dispBlogMessage('msg_not_permitted');
// 목록 구현에 필요한 변수들을 가져온다
$document_srl = Context::get('document_srl');
$page = Context::get('page');
// document 객체를 생성. 기본 데이터 구조의 경우 document모듈만 쓰면 만사 해결.. -_-;
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument(0, $this->grant->manager);
// document_srl이 있다면 해당 글을 구해오자
if($this->grant->list && $document_srl) {
// 글을 구함
$oDocument->setDocument($document_srl);
// 찾아지지 않았다면 초기화
if(!$oDocument->isExists()) {
unset($document_srl);
Context::set('document_srl','',true);
} else {
// 브라우저 타이틀 설정
Context::setBrowserTitle($oDocument->getTitleText());
// 댓글에디터 설정
//if($this->grant->write_comment && $oDocument->allowComment() && !$oDocument->isLocked()) $this->setCommentEditor(0, 100);
// 조회수 증가
$oDocument->updateReadedCount();
}
}
Context::set('oDocument', $oDocument);
// 댓글
//$this->setCommentEditor(0, 100);
// 만약 document_srl은 있는데 page가 없다면 글만 호출된 경우 page를 구해서 세팅해주자..
if($document_srl && !$page) {
$page = $oDocumentModel->getDocumentPage($document_srl, $this->module_srl, $this->list_count);
Context::set('page', $page);
}
// 목록을 구하기 위한 옵션
$args->module_srl = $this->module_srl; ///< 현재 모듈의 module_srl
$args->page = $page; ///< 페이지
$args->list_count = $this->list_count; ///< 한페이지에 보여줄 글 수
$args->page_count = $this->page_count; ///< 페이지 네비게이션에 나타날 페이지의 수
// 검색 옵션
$args->search_target = trim(Context::get('search_target')); ///< 검색대상
$args->search_keyword = trim(Context::get('search_keyword')); ///< 검색어
// 키워드 검색이 아닌 검색일 경우 목록의 수를 40개로 고정
if($args->search_target && $args->search_keyword) $args->list_count = 40;
// 키워드 검색의 경우 제목,내용으로 검색 대상 고정
if($args->search_keyword && !$args->search_target) $args->search_target = "title_content";
// 블로그 카테고리
$args->category_srl = (int)Context::get('category');
$args->sort_index = 'list_order'; ///< 소팅 값
// 목록 구함, document->getDocumentList 에서 걍 알아서 다 해버리는 구조
$output = $oDocumentModel->getDocumentList($args, true);
// 템플릿에 쓰기 위해서 document_model::getDocumentList() 의 return object에 있는 값들을 세팅
Context::set('total_count', $output->total_count);
Context::set('total_page', $output->total_page);
Context::set('page', $output->page);
Context::set('document_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
// 템플릿에서 사용할 검색옵션 세팅
$count_search_option = count($this->search_option);
for($i=0;$i<$count_search_option;$i++) {
$search_option[$this->search_option[$i]] = Context::getLang($this->search_option[$i]);
}
Context::set('search_option', $search_option);
// 블로그의 코멘트는 ajax로 호출되기에 미리 css, js파일을 import
Context::addJsFile('./modules/editor/tpl/js/editor.js');
Context::addCSSFile('./modules/editor/tpl/css/editor.css');
$this->setTemplateFile('list');
}
/**
* @brief 작성 화면 출력
**/
function dispBlogWrite() {
// 권한 체크
if(!$this->grant->write_document) return $this->dispBlogMessage('msg_not_permitted');
// GET parameter에서 document_srl을 가져옴
$document_srl = Context::get('document_srl');
// document 모듈 객체 생성
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl, $this->grant->manager);
// 지정된 글이 없다면 (신규) 새로운 번호를 만든다
if(!$oDocument->isExists()) {
unset($document_srl);
Context::set('document_srl','');
}
if(!$document_srl) $document_srl = getNextSequence();
// 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로
if($oDocument->isExists()&&!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form');
Context::set('document_srl',$document_srl);
Context::set('oDocument', $oDocument);
// 에디터 모듈의 getEditor를 호출하여 세팅
$oEditorModel = &getModel('editor');
$option->allow_fileupload = $this->grant->fileupload;
$option->enable_autosave = true;
$option->enable_default_component = true;
$option->enable_component = true;
$option->resizable = true;
$option->height = 600;
$editor = $oEditorModel->getEditor($document_srl, $option);
Context::set('editor', $editor);
$this->setTemplateFile('write_form');
}
/**
* @brief 문서 삭제 화면 출력
**/
function dispBlogDelete() {
// 권한 체크
if(!$this->grant->write_document) return $this->dispBlogMessage('msg_not_permitted');
// 삭제할 문서번호를 가져온다
$document_srl = Context::get('document_srl');
// 지정된 글이 있는지 확인
if($document_srl) {
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument($document_srl);
}
// 삭제하려는 글이 없으면 에러
if(!$oDocument->isExists()) return $this->dispBlogContent();
// 권한이 없는 경우 비밀번호 입력화면으로
if(!$oDocument->isGranted()) return $this->setTemplateFile('input_password_form');
Context::set('oDocument',$oDocument);
$this->setTemplateFile('delete_form');
}
/**
* @brief 댓글의 답글 화면 출력
**/
function dispBlogReplyComment() {
// 권한 체크
if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted');
// 목록 구현에 필요한 변수들을 가져온다
$document_srl = Context::get('document_srl');
$parent_srl = Context::get('comment_srl');
// 지정된 원 댓글이 없다면 오류
if(!$parent_srl) return new Object(-1, 'msg_invalid_request');
// 해당 댓글를 찾아본다
$oCommentModel = &getModel('comment');
$source_comment = $oCommentModel->getComment($parent_srl, $this->grant->manager);
// 댓글이 없다면 오류
if(!$source_comment) return $this->dispBlogMessage('msg_invalid_request');
// 필요한 정보들 세팅
Context::set('document_srl',$source_comment->document_srl);
Context::set('parent_srl',$parent_srl);
Context::set('comment_srl',NULL);
Context::set('source_comment',$source_comment);
// 댓글 에디터 세팅
//$this->setCommentEditor(0,400);
$this->setTemplateFile('comment_form');
}
/**
* @brief 댓글 수정 출력
**/
function dispBlogModifyComment() {
// 권한 체크
if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted');
// 목록 구현에 필요한 변수들을 가져온다
$document_srl = Context::get('document_srl');
$comment_srl = Context::get('comment_srl');
// 지정된 댓글이 없다면 오류
if(!$comment_srl) return new Object(-1, 'msg_invalid_request');
// 해당 댓글를 찾아본다
$oCommentModel = &getModel('comment');
$comment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
// 댓글이 없다면 오류
if(!$comment) return $this->dispBlogMessage('msg_invalid_request');
Context::set('document_srl',$comment->document_srl);
// 글을 수정하려고 할 경우 권한이 없는 경우 비밀번호 입력화면으로
if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form');
// 필요한 정보들 세팅
Context::set('comment_srl',$comment_srl);
Context::set('comment', $comment);
// 댓글 에디터 세팅
//$this->setCommentEditor($comment_srl,400);
$this->setTemplateFile('comment_form');
}
/**
* @brief 댓글 삭제 화면 출력
**/
function dispBlogDeleteComment() {
// 권한 체크
if(!$this->grant->write_comment) return $this->dispBlogMessage('msg_not_permitted');
// 삭제할 댓글번호를 가져온다
$comment_srl = Context::get('comment_srl');
// 삭제하려는 댓글가 있는지 확인
if($comment_srl) {
$oCommentModel = &getModel('comment');
$comment = $oCommentModel->getComment($comment_srl, $this->grant->manager);
}
// 삭제하려는 글이 없으면 에러
if(!$comment) return $this->dispBlogContent();
Context::set('document_srl',$comment->document_srl);
// 권한이 없는 경우 비밀번호 입력화면으로
if($comment_srl&&$comment&&!$comment->is_granted) return $this->setTemplateFile('input_password_form');
Context::set('comment',$comment);
$this->setTemplateFile('delete_comment_form');
}
/**
* @brief 엮인글 삭제 화면 출력
**/
function dispBlogDeleteTrackback() {
// 삭제할 댓글번호를 가져온다
$trackback_srl = Context::get('trackback_srl');
// 삭제하려는 댓글가 있는지 확인
$oTrackbackModel = &getModel('trackback');
$output = $oTrackbackModel->getTrackback($trackback_srl);
$trackback = $output->data;
// 삭제하려는 글이 없으면 에러
if(!$trackback) return $this->dispBlogContent();
Context::set('trackback',$trackback);
$this->setTemplateFile('delete_trackback_form');
}
/**
* @brief 메세지 출력
**/
function dispBlogMessage($msg_code) {
$msg = Context::getLang($msg_code);
if(!$msg) $msg = $msg_code;
Context::set('message', $msg);
$this->setTemplateFile('message');
}
/**
* @brief 댓글의 editor 세팅
* 댓글의 경우 수정하는 경우가 아니라면 고유값이 없음.\n
* 따라서 고유값이 없을 경우 고유값을 가져와서 지정해 주어야
**/
function setCommentEditor($comment_srl=0, $height = 100) {
return;
if(!$comment_srl) {
$comment_srl = getNextSequence();
Context::set('comment_srl', $comment_srl);
}
$oEditorModel = &getModel('editor');
$option->allow_fileupload = $this->grant->comment_fileupload;
$option->enable_autosave = false;
$option->enable_default_component = true;
$option->enable_component = true;
$option->resizable = true;
$option->height = $height;
$comment_editor = $oEditorModel->getEditor($comment_srl, $option);
Context::set('comment_editor', $comment_editor);
}
}
?>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<module version="0.1">
<title xml:lang="ko">블로그</title>
<title xml:lang="jp">ブログ</title>
<title xml:lang="en">Blog</title>
<title xml:lang="es">Blog</title>
<title xml:lang="zh-CN">博客</title>
<author email_address="zero@zeroboard.com" link="http://www.zeroboard.com" date="2007. 2. 28">
<name xml:lang="ko">제로</name>
<name xml:lang="jp">Zero</name>
<name xml:lang="en">zero</name>
<name xml:lang="es">zero</name>
<name xml:lang="zh-CN">zero</name>
<description xml:lang="ko">
블로그의 기능을 담당하는 모듈.
게시판과 비슷하지만 보여지는 view가 다르고 블로그에 적합한 method가 추가되었음.
레이아웃과 기본 메뉴를 직접 담당
</description>
<description xml:lang="jp">
ブログの機能を担当するモジュール
掲示板と似ているが、内容の表示が異なり、ブログに適切なメソッドが追加されている。
レイアウトと基本メニューを直接担当します。
</description>
<description xml:lang="en">
This module contains the blog functions.
It's similar to the bbs module, but it has diffent views and more suitable methods for blog has been included.
This module manages layout and basic menu itself.
</description>
<description xml:lang="es">
Es el módulo para funcióne a blog.
Casi mismo del boletín, pero la vista es diferente, y incluye metodo para blog. Maneja directo al diseño y menú principal.
</description>
<description xml:lang="zh-CN">
是负责博客功能的模块。
虽然类似版面但其显示模式不同且还添加了适合博客的method。
内置布局和基本的菜单。
</description>
</author>
</module>

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<module>
<grants>
<grant name="list" default="guest">
<title xml:lang="ko">목록</title>
<title xml:lang="en">list</title>
<title xml:lang="jp">リスト</title>
</grant>
<grant name="write_document" default="guest">
<title xml:lang="ko">글 작성</title>
<title xml:lang="en">write document</title>
<title xml:lang="jp">書き込む</title>
</grant>
<grant name="write_comment" default="guest">
<title xml:lang="ko">댓글 작성</title>
<title xml:lang="en">write comment</title>
<title xml:lang="jp">コメント作成</title>
</grant>
<grant name="fileupload" default="guest">
<title xml:lang="ko">파일 첨부</title>
<title xml:lang="en">file upload</title>
<title xml:lang="jp">添付ファイル</title>
</grant>
<grant name="comment_fileupload" default="guest">
<title xml:lang="ko">댓글 파일 첨부</title>
<title xml:lang="en">comment file upload</title>
<title xml:lang="jp">コメントファイル添付</title>
</grant>
<grant name="manager" default="root">
<title xml:lang="ko">관리</title>
<title xml:lang="en">manager</title>
<title xml:lang="jp">管理</title>
</grant>
</grants>
<actions>
<action name="dispBlogContent" type="view" index="true" />
<action name="dispBlogWrite" type="view" />
<action name="dispBlogDelete" type="view" />
<action name="dispBlogReplyComment" type="view" />
<action name="dispBlogModifyComment" type="view" />
<action name="dispBlogDeleteComment" type="view" />
<action name="dispBlogDeleteTrackback" type="view" />
<action name="dispBlogMessage" type="view" />
<action name="procBlogInsertDocument" type="controller" />
<action name="procBlogDeleteDocument" type="controller" />
<action name="procBlogInsertComment" type="controller" />
<action name="procBlogDeleteComment" type="controller" />
<action name="procBlogDeleteTrackback" type="controller" />
<action name="procBlogVerificationPassword" type="controller" />
<action name="procBlogDeleteFile" type="controller" />
<action name="procBlogUploadFile" type="controller" />
<action name="procBlogDownloadFile" type="controller" />
<action name="getBlogAdminCategoryTplInfo" type="model" standalone="true" />
<action name="dispBlogAdminContent" type="view" standalone="true" admin_index="true" />
<action name="dispBlogAdminBlogInfo" type="view" standalone="true" />
<action name="dispBlogAdminInsertBlog" type="view" standalone="true" />
<action name="dispBlogAdminDeleteBlog" type="view" standalone="true" />
<action name="dispBlogAdminCategoryInfo" type="view" standalone="true" />
<action name="dispBlogAdminSkinInfo" type="view" standalone="true" />
<action name="dispBlogAdminGrantInfo" type="view" standalone="true" />
<action name="procBlogAdminInsertGrant" type="controller" standalone="true" />
<action name="procBlogAdminUpdateSkinInfo" type="controller" standalone="true" />
<action name="procBlogAdminInsertBlog" type="controller" standalone="true" />
<action name="procBlogAdminDeleteBlog" type="controller" standalone="true" />
<action name="procBlogAdminInsertCategory" type="controller" standalone="true" />
<action name="procBlogAdminDeleteCategory" type="controller" standalone="true" />
<action name="procBlogAdminMakeXmlFile" type="controller" standalone="true" />
<action name="procBlogAdminMoveCategory" type="controller" standalone="true" />
</actions>
</module>

View file

@ -0,0 +1,33 @@
<?php
/**
* @file en.lang.php
* @author zero (zero@nzeo.com)
* @brief Basic language pack for blog module
**/
// Words used in button
$lang->cmd_blog_list = 'Blog list';
$lang->cmd_module_config = 'Common blog setting';
$lang->cmd_view_info = 'Blog info';
$lang->cmd_manage_menu = 'Menu management';
$lang->cmd_make_child = 'Add child category';
$lang->cmd_enable_move_category = "Change category position (Drag the top menu after selection)";
$lang->cmd_remake_cache = 'Rebuild cache file';
$lang->cmd_layout_setup = 'Configure layout';
$lang->cmd_layout_edit = 'Edit layout';
// Item
$lang->parent_category_name = 'Parent category';
$lang->category_name = 'Category';
$lang->expand = 'Expand';
$lang->category_group_srls = 'Accessable Group';
$lang->search_result = 'Search result';
// blah blah..
$lang->about_category_name = 'Please input category name';
$lang->about_expand = 'By selecting this option, it will be always expanded';
$lang->about_category_group_srls = 'Only the selected group will be able to see current categories. (Manually open xml file to expose)';
$lang->about_layout_setup = 'You can manually modify blog layout code. Insert or manage the widget code anywhere you want';
$lang->about_blog_category = 'You can make blog categories.<br />When blog category is broken, try rebuilding the cache file manually.';
$lang->about_blog = "This is a blog module that can create and manage blog.\nAfter creating a blog, please decorate your blog by category and skin management because this blog module uses layout that is included in the blog skin.\nIf you want to connect other boards inside the blog, use the menu module to create a menu and then connect it with the skin manager";
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @file es.lang.php
* @author zero (zero@nzeo.com)
* @brief Paquete lingual para módulo blog simple.
**/
// Palabras en botónes
$lang->cmd_blog_list = 'lista de blogs';
$lang->cmd_module_config = 'configuración común de blogs ';
$lang->cmd_view_info = 'Información de blog';
$lang->cmd_manage_menu = 'manejar menú';
$lang->cmd_make_child = 'agregar sub categoria';
$lang->cmd_enable_move_category = "mover posición de categoria. (arrastrar y soltar la selección)";
$lang->cmd_remake_cache = 'rehacer caché';
$lang->cmd_layout_setup = 'configuración del diseño';
$lang->cmd_layout_edit = 'editar el diseño';
// Artículo
$lang->parent_category_name = 'Nombre de la categoria preferencia';
$lang->category_name = 'Nombre de la categoria';
$lang->expand = 'Abrir';
$lang->category_group_srls = 'Limitar grupos';
$lang->search_result = 'Resulto de la busqueda';
// bla bla...
$lang->about_category_name = 'Por favor escribe nombre de la categoria.';
$lang->about_expand = 'Si seleccióna, sera abierto siempre.';
$lang->about_category_group_srls = 'Solo muestra categoria a grupo selecciónado. (pero muestra todo en XML)';
$lang->about_layout_setup = 'Puede modificar directamente los codigo de diseño del blog. Inserta o modifica codigo de widget.';
$lang->about_blog_category = 'Puede crear las categorias.<br />A veces no funcióna blog, rehacer caché manualmente puede ser solución.';
$lang->about_blog = "Es el módulo para crear y manejar blog.\nEl módulo de blog usa la diseña que incluydo en la carátula de blog. Es necesarario decorar su blog manejar las categorias y carátulas.\nSi desea conectar otro boletín en su blog, crea otro menú y connecta en manejar las carátulas.";
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com) 翻訳keinicht
* @brief ブログ(blog) モジュルの基本言語パッケージ
**/
// ボタンに使用する言語
$lang->cmd_blog_list = 'ブログリスト';
$lang->cmd_module_config = 'ブログ共通設定';
$lang->cmd_view_info = 'ブログ情報';
$lang->cmd_manage_menu = 'メニュー管理';
$lang->cmd_make_child = '下位カテゴリ追加';
$lang->cmd_enable_move_category = "カテゴリ位置変更(選択後上のメニューをドラッグして下さい)";
$lang->cmd_remake_cache = 'キャッシュファイル再生性';
$lang->cmd_layout_setup = 'レイアウト設定';
$lang->cmd_layout_edit = 'レイアウト編集';
// 項目
$lang->parent_category_name = '上位カテゴリ名';
$lang->category_name = 'カテゴリ名';
$lang->expand = '拡張表示';
$lang->category_group_srls = 'グループ制限';
$lang->search_result = '検索結果';
// その他
$lang->about_category_name = 'カテゴリ名を入力して下さい';
$lang->about_expand = 'チェックすると常に開いた状態にします';
$lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになりますXMLファイルを直接閲覧すると表示されます';
$lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正できます。ウィジェットコードを入力、又は管理して下さい';
$lang->about_blog_category = 'ブログのカテゴリが作成できます。<br />ブログのカテゴリが誤作動する場合キャッシュファイルの再生性を手動で行うと解決される事があります。';
$lang->about_blog = "ブログを作成し管理できるブログモジュールです。ブログモジュールはブログスキンに含まれているレイアウトを利用するので生成後必ずカテゴリ、又はスキン管理を用いてブログを編集して下さい。ブログ内に他の掲示板を連結したい時はメニュモジュールでメニューを作成した後、スキン管理で連結して下さい。";
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @file ko.lang.php
* @author zero (zero@nzeo.com)
* @brief 블로그(blog) 모듈의 기본 언어팩
**/
// 버튼에 사용되는 언어
$lang->cmd_blog_list = '블로그 목록';
$lang->cmd_module_config = '블로그 공통 설정';
$lang->cmd_view_info = '블로그 정보';
$lang->cmd_manage_menu = '메뉴관리';
$lang->cmd_make_child = '하위 카테고리 추가';
$lang->cmd_enable_move_category = "카테고리 위치 변경 (선택후 위 메뉴를 드래그하세요)";
$lang->cmd_remake_cache = '캐시파일 재생성';
$lang->cmd_layout_setup = '레이아웃 설정';
$lang->cmd_layout_edit = '레이아웃 편집';
// 항목
$lang->parent_category_name = '상위 카테고리명';
$lang->category_name = '분류명';
$lang->expand = '펼침';
$lang->category_group_srls = '그룹제한';
$lang->search_result = '검색결과';
// 주절 주절..
$lang->about_category_name = '카테고리 이름을 입력해주세요';
$lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)';
$lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요';
$lang->about_blog_category = '블로그 분류를 만드실 수 있습니다.<br />블로그 분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.';
$lang->about_blog = "블로그를 만드시고 관리할 수 있는 블로그 모듈입니다.\n블로그 모듈은 블로그 스킨에 포함된 레이아웃을 이용하니 생성후 꼭 분류 및 스킨 관리를 통해서 블로그를 꾸미시기 바랍니다.\n블로그내에 다른 게시판을 연결하시고 싶을때에는 메뉴모듈로 메뉴를 만들고 나서 스킨관리에 연결해 주시면 됩니다";
?>

View file

@ -0,0 +1,33 @@
<?php
/**
* @file zh-CN.lang.php
* @author zero (zero@nzeo.com)
* @brief 博客(blog) 模块的基本语言包
**/
// 按钮使用的语言
$lang->cmd_blog_list = '博客目录';
$lang->cmd_module_config = '博客共同设定';
$lang->cmd_view_info = '博客信息';
$lang->cmd_manage_menu = '菜单管理';
$lang->cmd_make_child = '添加下级分类';
$lang->cmd_enable_move_category = "更改分类顺序 (选择后拖动菜单)";
$lang->cmd_remake_cache = '重新生成缓冲文件';
$lang->cmd_layout_setup = '布局设置';
$lang->cmd_layout_edit = '编辑布局';
// 项目
$lang->parent_category_name = '上级分类名';
$lang->category_name = '分类名';
$lang->expand = '展开';
$lang->category_group_srls = '用户组';
$lang->search_result = '搜索结果';
// 信息、提示..
$lang->about_category_name = '请输入分类名。';
$lang->about_expand = '选择此项将维持展开状态。';
$lang->about_category_group_srls = '被选的用户组才可以查看此分类。';
$lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。';
$lang->about_blog_category = '可以添加/删除博客分类<br />博客分类有异常情况时,可以尝试重新生成缓冲文件。';
$lang->about_blog = "可生成,管理博客的模块。\n博客模块将利用博客皮肤里包含的布局,因此生成博客后尽早布置为适。\n在博客内,想使用其他版面时,可以先在菜单模块当中生成菜单后,在博客皮肤管理中连接即可。";
?>

View file

@ -0,0 +1,8 @@
<query id="deleteCategories" action="delete">
<tables>
<table name="blog_category" />
</tables>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,8 @@
<query id="deleteCategory" action="delete">
<tables>
<table name="blog_category" />
</tables>
<conditions>
<condition operation="equal" column="category_srl" var="category_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,14 @@
<query id="getAllBlog" action="select">
<tables>
<table name="modules" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module" default="blog" />
</conditions>
<navigation>
<index var="sort_index" default="mid" order="asc" />
</navigation>
</query>

View file

@ -0,0 +1,14 @@
<query id="getBlogCategories" action="select">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
</conditions>
<navigation>
<index var="sort_index" default="listorder" order="desc" />
</navigation>
</query>

View file

@ -0,0 +1,24 @@
<query id="getBlogList" action="select">
<tables>
<table name="modules" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module" default="blog" />
<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,11 @@
<query id="getCategory" action="select">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="getCategoryItem" action="select">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="category_srl" var="category_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,11 @@
<query id="getChildCategoryCount" action="select">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="count(*)" alias="count" />
</columns>
<conditions>
<condition operation="equal" column="parent_srl" var="category_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,15 @@
<query id="insertCategory" action="insert">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="category_srl" var="category_srl" filter="number" notnull="notnull" />
<column name="parent_srl" var="parent_srl" filter="number" default="0" />
<column name="module_srl" var="module_srl" filter="number" notnull="notnull" />
<column name="name" var="name" notnull="notnull" />
<column name="expand" var="expand" />
<column name="group_srls" var="group_srls" />
<column name="listorder" var="listorder" notnull="notnull" />
<column name="regdate" var="regdate" default="curdate()" />
</columns>
</query>

View file

@ -0,0 +1,13 @@
<query id="updateCategory" action="update">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="name" var="name" notnull="notnull" />
<column name="expand" var="expand" />
<column name="group_srls" var="group_srls" />
</columns>
<conditions>
<condition operation="equal" column="category_srl" var="category_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="updateCategoryParent" action="update">
<tables>
<table name="blog_category" />
</tables>
<columns>
<column name="parent_srl" var="parent_srl" default="0" />
<column name="listorder" var="listorder" notnull="notnull" />
</columns>
<conditions>
<condition operation="equal" column="category_srl" var="category_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,10 @@
<table name="blog_category">
<column name="category_srl" type="number" size="12" notnull="notnull" primary_key="primary_key" />
<column name="parent_srl" type="number" size="12" notnull="notnull" default="0" />
<column name="module_srl" type="number" size="12" notnull="notnull" index="idx_module_srl" />
<column name="name" type="varchar" size="250" />
<column name="expand" type="char" size="1" default="N" />
<column name="group_srls" type="text" />
<column name="listorder" type="number" size="11" default="0" inex="idx_listorder" />
<column name="regdate" type="date" index="idx_regdate" />
</table>

View file

@ -0,0 +1,62 @@
<div id="reply" class="comment">
{@ $idx = 0 }
<!--@if($oDocument->getCommentCount())-->
<!--@foreach($oDocument->getComments() as $key => $val)-->
<a name="comment_{$key}"></a>
<div class="contentBox <!--@if($val->depth>0)-->indent_box<!--@end--> <!--@if($idx>0)-->top_border<!--@end-->">
<!--@if($val->depth>0)-->
<div style="margin-left:{($val->depth*1.5)}em;">
<div class="indent">
<!--@end-->
<table cellspacing="0" width="100%">
<col />
<col width="120" />
<tr>
<td>{$val->content}</td>
<td class="tRight" valign="top">
<!--@if($val->is_granted || !$val->member_srl || $grant->is_admin)-->
<a href="{getUrl('act','dispBlogDeleteComment','comment_srl',$val->comment_srl)}"><img src="./images/common/btn_delete.gif" alt="{$lang->cmd_delete}" /></a>
<a href="{getUrl('act','dispBlogModifyComment','comment_srl',$val->comment_srl)}"><img src="./images/common/btn_edit.gif" alt="{$lang->cmd_modify}" /></a>
<!--@end-->
<a href="{getUrl('act','dispBlogReplyComment','comment_srl',$val->comment_srl)}"><img src="./images/common/btn_reply.gif" alt="{$lang->cmd_reply}" /></a>
</td>
</tr>
<!--@if($val->uploaded_count && $val->uploaded_list)-->
<tr>
<td colspan="2">
<div class="fileAttached">
<ul>
<!--@foreach($val->uploaded_list as $key => $file)-->
<li><img src="./images/common/iconFile.gif" alt="attached file" /><a href="{getUrl('')}{$file->download_url}">{$file->source_filename} ({FileHandler::filesize($file->file_size)})({number_format($file->download_count)})</a></li>
<!--@end-->
</ul>
</div>
<div class="clear"></div>
</td>
</tr>
<!--@end-->
<tr>
<td><div class="author member_{$val->member_srl}">{htmlspecialchars($val->nick_name)}</div></td>
<td>
<span class="date">
{zdate($val->regdate, "Y.m.d H:i")}
<!--@if($grant->is_admin)-->
({$val->ipaddress})
<!--@end-->
</span>
</td>
</tr>
</table>
<!--@if($val->depth>0)-->
</div>
</div>
<!--@end-->
</div>
{@ $idx++}
<!--@end-->
<!--@end-->
</div>

View file

@ -0,0 +1,68 @@
<!--%import("filter/insert_comment.xml")-->
<!--%import("js/blog.js")-->
<!--@if($source_comment || $comment)-->
<!--#include("header.html")-->
<!--@end-->
<!-- 만약 댓글의 답을 다는 것이라면 원문 보여줌 -->
<!--@if($source_comment)-->
<div class="blogRead">
<div id="reply" class="comment topBorder">
<div class="contentBox">
<div class="content">
{$source_comment->content}
</div>
<div class="author member_{$source_comment->member_srl} author">{htmlspecialchars($source_comment->nick_name)}</div>
<span class="date">
{zdate($source_comment->regdate, "Y.m.d H:i")}
<!--@if($grant->is_admin)-->
({$source_comment->ipaddress})
<!--@end-->
</span>
</div>
</div>
</div>
<!--@end-->
<!-- 글쓰기 폼 -->
<div class="blogWrite">
<form action="./" method="post" onsubmit="return procFilter(this, insert_comment)" <!--@if($grant->fileupload)-->enctype="multipart/form-data"<!--@end--> class="blogEditor" id="fo_comment_write" >
<fieldset>
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="document_srl" value="{$document_srl?$document_srl:$comment->document_srl}" />
<input type="hidden" name="comment_srl" value="{$comment_srl}" />
<input type="hidden" name="parent_srl" value="{$parent_srl}" />
<!--@if(!$is_logged)-->
<div class="userNameAndPw">
<label for="userName">{$lang->writer}</label>
<input type="text" name="nick_name" value="{$comment->nick_name}" class="userName inputTypeText" id="userName"/>
<label for="userPw">{$lang->password}</label>
<input type="password" name="password" value="" id="userPw" class="userPw inputTypeText" />
<label for="emailAddress">{$lang->email_address}</label>
<input type="text" name="email_address" value="{htmlspecialchars($comment->email_address)}" id="emailAddress" class="emailAddress inputTypeText"/>
<label for="homePage">{$lang->homepage}</label>
<input type="text" name="homepage" value="{htmlspecialchars($comment->homepage)}" id="homePage" class="homePage inputTypeText"/>
</div>
<!--@end-->
<div class="commentForm">
<textarea class="inputTypeTextArea" name="content">{strip_tags($comment->content)}</textarea>
<div class="tCenter"><input type="image" src="./images/common/btn_reply2.gif" accesskey="s" /></div>
</div>
</fieldset>
</form>
</div>
<!--@if($source_comment)-->
<!--#include("footer.html")-->
<!--@end-->

View file

@ -0,0 +1,88 @@
#blog_category .title_box { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;}
*:first-child+html #blog_category .title_box { height:20px; color:#ef2121;}
#blog_category .category_list { padding:.8em 0 .8em 0; }
#blog_category .node_item a { color:#6b6b6b; }
#blog_category .unselected { cursor:pointer; font-size:1em; color:#54564b; }
#blog_category .document_count {
margin-left:5px;
color:#AAAAAA;
font-size:.8em;
}
#blog_category .page {
cursor:pointer;
background:url(../images/common/iconList.gif) no-repeat left;
}
#blog_category .folder_open {
cursor:pointer;
background:url(../images/common/iconFolderClose.gif) no-repeat left;
}
#blog_category .folder_close {
cursor:pointer;
background:url(../images/common/iconFolderClose.gif) no-repeat left;
}
#blog_category .item_open {
display:block;
padding-left:18px;
}
#blog_category .item_close {
display:none;
padding-left:18px;
}
#blog_category .line_null {
padding-left:13px;
}
#blog_category .line_open {
display:block;
padding-left:18px;
/*background:url(../images/tree_menu/line.gif) repeat-y left;*/
}
#blog_category .line_close {
display:none;
padding-left:18px;
/*background:url(../images/tree_menu/line.gif) repeat-y left;*/
}
#blog_category .plus {
padding-left:18px;
/*background:url(../images/tree_menu/plus.gif) repeat-y left;*/
}
#blog_category .plus_bottom {
padding-left:18px;
/*background:url(../images/tree_menu/plusbottom.gif) no-repeat left;*/
}
#blog_category .minus {
padding-left:18px;
/*background:url(../images/tree_menu/minus.gif) repeat-y left;*/
}
#blog_category .minus_bottom {
padding-left:18px;
/*background:url(../images/tree_menu/minusbottom.gif) no-repeat left;*/
}
#blog_category .join {
padding-left:18px;
margin:0;
/*background:url(../images/tree_menu/join.gif) repeat-y left;*/
}
#blog_category .join_bottom {
padding-left:18px;
/*background:url(../images/tree_menu/joinbottom.gif) no-repeat left;*/
}

View file

@ -0,0 +1,25 @@
@charset "utf-8";
/* Blog Layout - Header */
#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#1187d8 url(../images/blue/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;}
#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#1187d8; }
#header #globalNavigation li.on a { color:#1187d8;}
#header #tagLine { padding:0 0 0 30px; color:#bfdff4;}
/* blogHeader */
.blogHeader { position:relative; _width:100%; background:#1187d8 url(../images/blue/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.blogList { width:100%; position:relative; border-bottom:2px solid #1187d8; border-collapse:collapse; }
.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/blue/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.blogList td .replyAndTrackback { font:.8em Tahoma; color:#007ed5; cursor:default; position:relative; top:-.2em;}
.blogList td.recommend { font:bold .8em Tahoma; color:#007ed5; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#007ed5; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #1187d8;}
.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #1187d8; overflow:hidden;}
.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#007ed5;}
.blogWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;}
.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom;}
.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/blue/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,25 @@
@charset "utf-8";
/* Blog Layout - Header */
#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#9ab09f url(../images/bluish_green/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;}
#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#9ab09f; }
#header #globalNavigation li.on a { color:#9ab09f;}
#header #tagLine { padding:0 0 0 30px; color:#e6ebe7;}
/* blogHeader */
.blogHeader { position:relative; _width:100%; background:#9ab09f url(../images/bluish_green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.blogList { width:100%; position:relative; border-bottom:2px solid #9ab09f; border-collapse:collapse; }
.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/bluish_green/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.blogList td .replyAndTrackback { font:.8em Tahoma; color:#9ab09f; cursor:default; position:relative; top:-.2em;}
.blogList td.recommend { font:bold .8em Tahoma; color:#9ab09f; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#9ab09f; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #9ab09f;}
.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #9ab09f; overflow:hidden;}
.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#9ab09f;}
.blogWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;}
.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom;}
.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/bluish_green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,441 @@
@charset "utf-8";
/*
NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/)
Jeong, Chan Myeong 070601~070630
*/
/* ----- List+Read+Write+Modify | Start ----- */
.blogHeader h3 { float:left; clear:both; padding:1.9em 1.5em 1.8em 1.5em; font-size:1.2em; color:#FFFFFF;}
/* blogInformation */
.blogInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;}
.articleNum { float:left; padding:.5em 0 .5em 2.3em; font:.8em Tahoma;}
.articleNum strong { margin:0 0 0 .5em; padding:0 0 0 .7em; font:bold .9em Tahoma; color:#6F6F6F; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat left .1em;}
.accountNavigation { float:right; margin:.3em .5em 0 0; overflow:hidden;}
.accountNavigation li { list-style:none; float:left; margin:0 0 0 -.1em; padding:.1em .8em 0 .8em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .3em;}
.accountNavigation li a {}
/* blogList */
.blogList tr:first-child td, .blogList tr.first-child td {}
.blogList tr.notice {}
.blogList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;}
.blogList th a { color:#3e3f3e;}
.blogList th span.on { font-weight:bold;}
.blogList th.num { background-position:-3px bottom; padding:0;}
.blogList th select { height:20px; }
.blogList th.category { padding:0 .2em 0 .5em;}
.blogList th.category.thumbStyle { background-position:-3px bottom !important; border-left:1px solid #ffffff; text-align:left;}
.blogList th:first-child { background-position:-2px bottom;}
.blogList th.first-child { background-position:-2px bottom;}
.blogList th.author {}
.blogList th.title {}
.blogList th.reading { white-space:nowrap;}
.blogList th.recommend { white-space:nowrap;}
.blogList th.reply { white-space:nowrap;}
.blogList th.date {}
.blogList th.check { padding:0;}
.blogList th.user {}
.blogList th.registDate {}
.blogList th.checkDate {}
.blogList th.friendGroup {}
.blogList th.userId {}
.blogList th.userName {}
.blogList th.userNick {}
.blogList th.sendMessage {}
.blogList th.last-child { border-right:1px solid #ffffff;}
.blogList th .sort { padding:0 .2em; vertical-align:middle;}
.blogList th select,
.blogList th input { vertical-align:middle;}
.blogList td { padding:.3em; border-bottom:1px solid #e4e4e2;}
.blogList td.noline { border-bottom:none;}
.blogList td.num { font:.8em Tahoma; color:#999999; padding:.5em .5em .5em 1.5em;}
.blogList td.category {}
.blogList tr.notice td { padding:.3em; white-space:nowrap;}
.blogList tr.notice td img { margin:-.1em .3em 0 0;}
.blogList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;}
.blogList td.thumb * { vertical-align:middle;}
.blogList td.title.bold { font-size:1em; font-weight:bold;}
.blogList td.title.bold a { position:relative; top:.3em;}
.blogList td.title * { vertical-align:middle;}
.blogList td.title,
.blogList td.title a { color:#444444; text-decoration:none; }
.blogList td.title a:visited { color:#777777;}
.blogList td.title .title_wrap { width:100%; overflow:hidden; white-space:nowrap;}
.blogList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
.blogList td.author a { font-size:1em; color:#333333;}
.blogList td.reading { font:.8em Tahoma; color:#999999; text-align:center;}
.blogList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;}
.blogList td.date { font:.8em Tahoma; color:#999999; text-align:center;}
.blogList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;}
.blogList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;}
.blogList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;}
.blogList td.summary a { color:#666666; text-decoration:none; line-height:inherit;}
.blogList td.summary a:visited { color:#999999;}
.blogList td.check { text-align:center;}
.blogList td.user { color:#333333; font-size:.9em;}
.blogList td.user a { color:#333333;}
.blogList td.userId { font:.9em Tahoma;}
.blogList td.userName {}
.blogList td.userNick { font-size:.9em; color:#999999;}
.blogList td.friendGroup {}
.blogList td.sendMessage { text-align:center; padding:0;}
.blogList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;}
*:first-child+html .blogList td.sendMessage .buttonFixedLeft { left:0;}
.blogList td input { _margin:-3px;}
.blogList td.title.bold .replyAndTrackback { font:.6em Tahoma; color:#ff6600; cursor:default; position:relative; top:.3em;}
.blogList td .replyAndTrackback strong { font:bold 1em Tahoma;}
.blogList td .thumbnailSmall { margin:0 .3em 0 .3em;}
.blogList td .thumbnailSmall img {}
.blogList td .thumbnailMedium { margin:0 .3em 0 .3em;}
.blogList td .thumbnailMedium img {}
.blogList.thumbnail {}
.blogList.thumbnail td { border-top:none; border-bottom:1px solid #eff0ed; padding:1.5em 0 0 1.5em; overflow:hidden;}
.blogList.thumbnail div.cell { float:left; width:131px; margin:0 1.6em 0 0; padding-bottom:1.5em;}
.blogList.thumbnail div.cell .fix_img { width:131px; height:106px; overflow:hidden;}
.blogList.thumbnail div.title { color:#444444; margin:.5em 0 .2em 0;}
.blogList.thumbnail div.title a { color:#444444;}
.blogList.thumbnail div.nameAndDate { font-size:.9em; color:#999999; margin-bottom:.2em; padding-left:3px;}
.blogList.thumbnail div.nameAndDate a { color:#999999;}
.blogList.thumbnail div.nameAndDate .date { font:.8em Tahoma; color:#999999;}
.blogList.thumbnail div.readAndRecommend { font-size:.9em; color:#666666; padding-left:3px;}
.blogList.thumbnail div.readAndRecommend .num { font:.8em Tahoma;}
.blogList.thumbnail div.readAndRecommend .vr { color:#dddddd;}
.blogList.thumbnail div.readAndRecommend strong.num { font:bold .8em Tahoma; color:#494949;}
/* blogSearch */
.blogSearch { clear:both; text-align:center; margin-top:3em;}
.blogSearch fieldset { display:inline; padding:10px 15px 10px 15px; border:none; background:#F4F4F4; overflow:hidden; }
.blogSearch fieldset legend { overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.blogSearch * { vertical-align:middle;}
.blogSearch select { float:left;}
.blogSearch input { float:left; margin:0 .3em; background:#fbfbfb;}
.searchButton ul { overflow:hidden;}
.searchButton li { float:left; margin-right:.3em; list-style:none;}
.buttonTypeGo { border:none; cursor:pointer; width:24px; height:20px; background:url(../images/common/buttonTypeInput24.gif) no-repeat; font:.75em Tahoma; text-align:center;}
/* pageNavigation */
.pageNavigation { text-align:center; display:block; margin:2.2em 0 2em 1.1em; font:bold .8em Tahoma; }
.pageNavigation a, .pageNavigation a:visited, .pageNavigation a:active { margin-left:-4px; font:bold .8em Tahoma; color:#676767; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.pageNavigation a:hover { text-decoration:none; }
.pageNavigation a.goToFirst,
.pageNavigation a.goToLast { border:none; border-right:1px solid #ffffff; border-left:1px solid #ffffff; z-index:99; padding:1px 5px 3px 4px;}
.pageNavigation a.goToFirst img,
.pageNavigation a.goToLast img { vertical-align:middle;}
.buttonBox { float:right; margin:1.2em 0 0 0; }
/* blogRead */
#blog .blogRead { position:relative; margin:0; _overflow:hidden;}
.blogRead .originalContent { padding:2em 0 2em 0;}
.blogRead .titleAndCategory { float:left;}
.blogRead .titleAndCategory h4 { font-size:1.4em; display:inline; padding-left:.2em;}
.blogRead .titleAndCategory .vr { font-size:.9em; margin:0 .3em; color:#c5c7c0;}
.blogRead .titleAndCategory .category { font-size:.9em; color:#999999; white-space:nowrap;}
.blogRead .dateAndModify { font-size:.8em; float:right; white-space:nowrap;}
.blogRead .dateAndModify .date { font-size:.8em; font-family:Tahoma; color:#999999; margin-right:.5em; float:left; position:relative; top:.1em;}
.blogRead .dateAndModify .date strong { font-size:1em; font-family:Tahoma;}
.blogRead .dateAndModify ul { display:inline; margin:0 .4em 0 0;}
.blogRead .dateAndModify ul li { float:left; margin-left:.3em; list-style:none;}
.blogRead dl.uri { float:right; overflow:hidden; margin:0 0 3em .3em;}
.blogRead dl.uri dt { float:left; clear:left; font-size:.9em; margin-right:.3em; color:#999999;}
.blogRead dl.uri dd { clear:right; font-size:.8em; color:#d4d5d0;}
.blogRead dl.uri dd span { font-family:Tahoma; color:#d4d5d0;}
.blogRead .readBody { padding:0 .3em; color:#555555; overflow:hidden; margin-bottom:2em;}
.blogRead .readBody p { margin:1em 0; line-height:1.5em;}
.blogRead .contentBody { width:100%; overflow:hidden; }
.blogRead .userInfo { float:left; white-space:nowrap;}
.blogRead .userInfo .author { padding:0 .3em 0 0; color:#3074a5; margin-right:.3em;}
.blogRead .userInfo .ipaddress { font-size:.9em; font-family:Tahoma; color:#888888; margin-right:.5em; }
/* extraVars list */
.extraVarsList { width:100%; border:1px solid #e0e1db; clear:both; margin-bottom:1em;}
.extraVarsList tr.notice { background:#f8f8f8;}
.extraVarsList tr.notice .num { font-size:.9em; font-weight:bold;}
.extraVarsList tr.bg1 { background:#ffffff}
.extraVarsList tr.bg2 { background:#fbfbfb;}
.extraVarsList th { color:#3e3f3e; font-weight:bold; padding:.8em .5em .5em .5em; border-bottom:1px solid #eff0ed; border-right:1px solid #eff0ed;}
.extraVarsList td { border-bottom:1px solid #eff0ed; padding:.5em .5em .5em 1em;}
.blogRead .readFooter { border-top:1px solid #dfe0db; }
.blogRead .readFooter .tag { margin-bottom:1em; padding:1em 0 0 0; }
.blogRead .readFooter .tag h5 { display:inline; font-size:1em; margin:0 .3em 0 1.8em;}
.blogRead .readFooter .tag ul,
.blogRead .readFooter .tag li { display:inline;}
.blogRead .readFooter .tag a { color:#444444; text-decoration:none;}
.blogRead .readFooter .tag .tagIcon { vertical-align:middle;}
.blogRead .readFooter .fileAttached { padding:1em 1em .8em 0; position:relative; _width:100%; border-bottom:1px solid #dfdfdd; overflow:hidden; background:#f9f9f9;}
.blogRead .readFooter .fileAttached h5 {}
.blogRead .readFooter .fileAttached ul { margin-left:1.8em;}
.blogRead .readFooter .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;}
.blogRead .readFooter .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; }
.blogRead .readFooter .fileAttached li a:visited { color:#777777;}
.listButton li { list-style:none; clear:both; text-align:right; margin-top:.5em; }
.blogRead .replyAndTrackback { float:left; width:100%; background:url(../images/common/bg_repeat_x_eaeaea.gif) repeat-x left bottom; overflow:hidden;}
.blogRead .replyAndTrackback li { float:left; font-weight:bold; margin:.3em 0 0 0; padding:.7em 1.1em .7em 1.2em; color:#FFFFFF; background:#B8B8B8; list-style:none;}
.blogRead .replyAndTrackback li a { color:#FFFFFF; text-decoration:none; }
.blogRead .replyAndTrackback li strong { padding:0 1.1em 0 0; background:#B8B8B8 url(../images/common/icon_close.gif) no-repeat right .2em;}
.blogRead .replyAndTrackback li.selected a { color:#666666;}
.blogRead .replyAndTrackback li.selected strong { padding:0 1.1em 0 0; background:#FFFFFF url(../images/common/icon_open.gif) no-repeat right .2em;}
.blogRead .replyAndTrackback a#toggleReply { background:url(../images/common/buttonToggleReply.gif) no-repeat right top;}
.blogRead .replyAndTrackback a#toggleTrackback { background:url(../images/common/buttonToggleReply.gif) no-repeat right -13px;}
.blogRead #reply,
.blogRead #trackback { color:#666666; border-left:1px solid #EAEAEA; border-right:1px solid #EAEAEA; border-bottom:1px solid #EAEAEA; padding-top:1em;}
.blogRead #reply { }
.blogRead #trackback { display:none;}
.blogRead .topBorder { border-top:1px solid #EAEAEA; }
.blogRead #reply .contentBox,
.blogRead #trackback .contentBox { line-height:1.25em; color:#676767; clear:both; padding:1em; overflow:hidden;}
.blogRead #reply .top_border,
.blogRead #trackback .top_border { border-top:1px dashed #d8d8d8; }
.blogRead .contentBox .content { width:100%; overflow:hidden; clear:both; margin-bottom:1em; }
.blogRead .contentBox .author { float:left; overflow:hidden; color:#3173a3;}
.blogRead .contentBox .date { float:right; font:.8em Tahoma; color:#cccccc; margin-left:.5em; }
.blogRead .contentBox .replyOption { float:right; display:inline; white-space:nowrap; margin-left:.5em; }
.blogRead .contentBox .replyOption img { vertical-align:middle;}
.blogRead .contentBox .fileAttached { position:relative; _width:100%; overflow:hidden; clear:both; }
.blogRead .contentBox .fileAttached h5 {}
.blogRead .contentBox .fileAttached ul { margin-bottom:.5em;}
.blogRead .contentBox .fileAttached li { float:left; margin-right:.75em; line-height:1.6em; color:#888888; white-space:nowrap; list-style:none;}
.blogRead .contentBox .fileAttached li a { font-size:.9em; padding:.1em 0 .1em .2em; white-space:nowrap; position:relative; color:#888888; text-decoration:none; }
.blogRead .contentBox .fileAttached li a:visited { color:#777777;}
.blogRead .contentBox .title a { color:#676767 ; margin-right:.3em; text-decoration:none;}
.blogRead .contentBox address a { font-size:.9em; color:#3173a3; margin-right:.3em; text-decoration:none; }
.blogRead .contentBox address .trackback_date { font:.8em Tahoma; color:#cccccc; margin-left:.5em; }
.blogRead .indent_box { background-color:#FBFBFB; }
.blogRead .contentBox .indent {padding-left:1.5em; background:url(../images/common/icon_arrow_reply.gif) no-repeat left .1em;}
/* blogEditor */
.blogEditor { padding:.5em 0 1em 0; width:100%; overflow:hidden;}
.blogEditor.reply { padding:.5em 1em 1em 1em; width:auto; overflow:hidden;}
.blogEditor legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em;}
.blogEditor fieldset { _width:100%; border:0px solid #eaeae7; border-top:none;}
.blogEditor .userNameAndPw { position:relative; background:#fbfbfb; border-top:1px solid #eaeae7; border-bottom:1px solid #e1e1e1; padding:.5em 1em; white-space:nowrap;}
.blogEditor .userNameAndPw * { vertical-align:middle;}
.blogEditor .userNameAndPw label { margin-right:.2em; color:#666760;}
.blogEditor .userNameAndPw input { color:#aaaaaa;}
.blogEditor .userNameAndPw .userName { width:6em; margin-right:.8em;}
.blogEditor .userNameAndPw .userPw { width:5em;}
.blogEditor .userNameAndPw .emailAddress { width:6em;}
.blogEditor .userNameAndPw .homePage { width:6em;}
.blogEditor .userNameAndPw .checkSecret { position:absolute; right:2em; top:.7em;}
.blogEditor .commentForm { width:100%; padding-bottom:.5em;}
.blogEditor .commentForm textarea { width:632px; margin:.3em; height:100px;}
/* blogWrite */
.blogWrite { width:100%; position:relative;}
.blogWrite .userNameAndPw { margin-bottom:-1px;}
.blogWrite div.title label.title { display:block; float:left; font-weight:bold; padding:.4em 0 0 1.5em; width:9.5em; white-space:nowrap;}
.blogWrite div.title input#title { width:350px;}
.blogWrite .option dt { display:block; float:left; font-weight:bold; padding:.3em 0 0 1.5em; width:9.5em; white-space:nowrap;}
.blogWrite .option dd { float:left; margin-right:1em; padding-top:.2em; _padding-top:.1em;}
.blogWrite .option dd * { vertical-align:middle;}
.blogWrite .inputTypeText { background:#fbfbfb;}
.blogWrite .trackbackURI { clear:both; border-top:1px solid #eff0ed; padding:4px 0 .8em 0;}
.blogWrite .trackbackURI label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;}
.blogWrite .trackbackURI .inputTypeText { width:50%;}
.blogWrite .tag { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;}
.blogWrite .tag label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;}
.blogWrite .tag .inputTypeText { width:50%;}
.blogWrite .tag .help { vertical-align:middle;}
.blogWrite .tag .info { padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;}
.blogWrite .extra_vars { clear:both; border-top:1px solid #eff0ed; padding:.8em 0;}
.blogWrite .extra_vars label { display:block; float:left; color:#333333; font-weight:bold; padding:.4em 0 0 1.5em; width:11em;}
.blogWrite .extra_vars .info { clear:both; padding:.5em 0 0 .6em; margin-left:14em; font-size:.9em; color:#999999; background:url(../images/common/iconArrowD8.gif) no-repeat left center;}
.blogWrite .extra_vars ul li { float:left; margin-right:1em; }
/* ----- List+Read+Write+Modify | End ----- */
/* ----- Member | Start ----- */
.memberHeader { position:relative; _width:100%; background:#ED2027 url(../images/common/bg_top_title.gif) no-repeat 23px -6px; overflow:hidden;}
.memberHeader h3 { float:left; clear:both; padding:1.2em 0 1em 1.7em; font-size:1.1em; color:#FFFFFF;}
.memberInformation { width:100%; clear:both; margin:0 0 .5em 0; background:#EFEFEF; color:#8D8D8D; overflow:hidden;}
.memberInformation .friendNum { float:left; padding:.7em 0 .7em 2em; background:url(../images/common/iconFriend.gif) no-repeat .5em .4em;}
.memberInformation .friendNum strong { font:bold 11px Tahoma; color:#ec2127;}
.memberInformation .addGroup { float:right; margin:.8em 1em .7em 0;}
.memberInformation .instantMessage { float:right; margin:.7em; overflow:hidden;}
.memberInformation .instantMessage li { float:left; margin:0 0 0 -.1em; padding:0 .5em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left .25em;}
.memberInformation .instantMessage li a {white-space:nowrap; color:#666666;}
.memberInformation .instantMessage li.on a { background-position:left -14px; font-weight:bold;}
.memberInformation .instantMessage li a strong { font:bold 0.75em tahoma; color:#ee202a;}
/* 친구목록 */
.memberList { width:100%; position:relative; border-bottom:2px solid #ED2A32; border-collapse:collapse;}
.memberList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.memberList th.check { padding:0;}
.memberList th.friendGroup { padding:0 0 0 .3em; text-align:left;}
.memberList th select,
.memberList th input { vertical-align:middle;}
.memberList th.repeat_bg { background:#ffffff url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom;}
.memberList td { padding:.3em; border-bottom:1px solid #e4e4e2;}
.memberList td.noline { border-bottom:none;}
.memberList td.check { text-align:center;}
.memberList td.friendGroup { }
.memberList td.userId { text-align:center; font:.9em Tahoma;}
.memberList td.userName { text-align:center;}
.memberList td.userNick { text-align:center; color:#999999;}
.memberList td.registDate { text-align:center; font:.8em Tahoma;}
.memberList td.sendMessage { text-align:center;}
.smallBox { margin:5em auto 1em auto;}
.smallBox.w268 { width:268px;}
.smallBox.w298 { width:298px;}
.smallBox.w498 { width:498px;}
.smallBox .header { position:relative; _width:100%; background:#ed2027; overflow:hidden;}
.smallBox .header h3 { font-size:1.2em; color:#FFFFFF; padding:1em 2em .8em 1em;}
.smallBox .login { position:relative; border:none; padding:2.4em 0 2em 2.3em;}
.smallBox .login legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.smallBox .login dl { overflow:hidden; width:162px; float:left;}
.smallBox .login dl dt { float:left; width:55px; color:#54564b; height:22px; padding-top:5px;}
.smallBox .login dl dd { float:left; width:105px; height:27px;}
.smallBox .login dl dd input { width:90px;}
.smallBox .login .loginButton { display:block; float:left; margin-top:27px; _margin-top:28px;}
*:first-child+html .smallBox .login .loginButton { margin-top:28px;}
.smallBox .login .keep { float:left; clear:both; white-space:nowrap; position:relative; left:55px; _left:52px;}
*:first-child+html .smallBox .login .keep { left:52px;}
.smallBox .login .keep input { vertical-align:middle;}
.smallBox .login .keep label { font-size:11px; color:#999999;}
.smallBox .help { background:#F7F7F7; border-top:1px solid #ed2a32; border-bottom:2px solid #ee2b33; overflow:hidden; padding:1.1em; text-align:center; height:1em;}
.smallBox .help li { display:inline; padding:0 .3em 0 .7em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;}
.smallBox .help li:first-child { background:none;}
.smallBox .help li.first-child { _background:none;}
.smallBox .help li a { font-size:11px; color:#54564b;}
.smallBox .text { color:#54564b; text-align:center; padding:4.25em 2em 4.8em 2em;}
.smallBox .text p { margin-bottom:.5em;}
.smallBox .button img { vertical-align:top;}
.smallBox.w268 .button ul { position:absolute; left:79px; }
.smallBox.w298 .button ul { position:absolute; left:110px; }
.smallBox.w498 .button ul { position:absolute; left:220px; }
.smallBox .button ul li { float:left; margin-right:.3em;}
.smallBox .complex { padding:1.5em 2em 2em 2em;}
.smallBox .friend { width:100%;}
.smallBox .friend th { width:7em; padding:.9em; border-bottom:1px solid #e4e5e0;}
.smallBox .friend td { padding:.9em; border-bottom:1px solid #e4e5e0; background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;}
.smallBox .leftHeaderType { border-top:1px solid #e0e1db; border-left:1px solid #e0e1db; width:100%;}
.smallBox .leftHeaderType th,
.smallBox .leftHeaderType td { border-right:1px solid #e0e1db; border-bottom:1px solid #e0e1db; padding:.8em 1em .6em 1em;}
.smallBox .leftHeaderType th { color:#333333; text-align:left; background:#f5f5f3;}
.smallBox .leftHeaderType td { color:#444444;}
.smallBox .inputTypeText { background:#fbfbfb;}
.smallBox .group { overflow:hidden; padding:.5em 0; margin-top:.7em;}
.smallBox .group select { float:left; width:180px; margin-top:1px;}
.smallBox .pwModify { border:none;}
.smallBox .pwModify legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.smallBox .pwModify input { width:9em;}
.smallBox .pwModify br { display:block; margin-bottom:.2em}
.smallBox .pwModify p { text-align:center; margin-top:1em; color:#54564b;}
/* messageList */
.messageList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse;}
.messageList tr.notice .num { font:.9em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif; font-weight:bold;}
.messageList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/common/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.messageList th:first-child,
.messageList th.first-child { background-position:-3px bottom;}
.messageList th.author { background:url(../images/common/bg_title_repeat_x.gif) repeat-x left bottom; text-align:left;}
.messageList th.check { padding:0;}
.messageList th select,
.messageList th input { vertical-align:middle;}
.messageList td { padding:.3em; border-bottom:1px solid #EFEFEF;}
.messageList td.noline { border-bottom:none;}
.messageList td.category {}
.messageList tr.notice td { padding:.7em .7em .7em .9em; white-space:nowrap;}
.messageList tr.notice td img { margin:-.1em .3em 0 0;}
.messageList td.thumb { padding:.5em 0 .5em .5em; width:145px; table-layout:fixed; white-space:nowrap;}
.messageList td.thumb * { vertical-align:middle;}
.messageList td.title {}
.messageList td.title.bold { font-size:1em; font-weight:bold;}
.messageList td.title.bold a { position:relative; top:.3em;}
.messageList td.title * { vertical-align:middle;}
.messageList td.title,
.messageList td.title a { color:#444444;}
.messageList td.title a:visited { color:#777777;}
.messageList td.author { padding:0 .5em 0 1.3em; color:#333333; font:.95em "돋움", Dotum, "굴림", Gulim, AppleGothic, Sans-serif;}
.messageList td.author a { font-size:1em; color:#333333;}
.messageList td.reading { font:.8em Tahoma; color:#999999; text-align:center;}
.messageList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;}
.messageList td.reply { font:bold .8em Tahoma; color:#ff6600; text-align:center;}
.messageList td.date { font:.8em Tahoma; color:#999999; text-align:center;}
.messageList td.registDate { font:.8em Tahoma; color:#999999; text-align:center;}
.messageList td.checkDate { font:.8em Tahoma; color:#333333; text-align:center;}
.messageList td.summary { border-top:none; vertical-align:top; color:#666666; line-height:1.25em;}
.messageList td.summary a { color:#666666; text-decoration:none; line-height:inherit;}
.messageList td.summary a:visited { color:#999999;}
.messageList td.check { text-align:center;}
.messageList td.user { color:#333333; font-size:.9em;}
.messageList td.user a { color:#333333;}
.messageList td.userId { font:.9em Tahoma;}
.messageList td.userNick { font-size:.9em; color:#999999;}
.messageList td.sendMessage { text-align:center; padding:0;}
.messageList td.sendMessage .buttonFixedLeft { position:relative; left:20%; _left:0;}
.readMessage { margin-bottom:2em;}
.readMessage .messageHeader { padding:1.5em; height:1em; overflow:hidden;}
.readMessage .messageHeader h4 { float:left; padding-left:.5em; font-size:1em; background:url(../images/common/iconArrow99.gif) no-repeat left .3em;}
.readMessage .messageHeader address { float:right; white-space:nowrap;}
.readMessage .messageHeader address em { font-size:.9em; font-style:normal; color:#333333; margin-right:.3em;}
.readMessage .messageHeader address em a { color:#333333;}
.readMessage .messageHeader address .date { font:.8em Tahoma; color:#999999;}
.readMessage .messageBody { border:1px solid #e0e1db; margin:0 1.5em 1.5em 1.5em; padding:1em; position:relative; color:#666666;}
.readMessage .deleteOrKeep { padding:.5em 0; overflow:hidden; background:#f5f5f3; border-top:1px solid #eaebe7; _width:100%;}
.readMessage .deleteOrKeep li { position:relative; left:40%; float:left; margin-right:.5em;}
.readMessage .button { position:relative; background:#f7f7f7; border-top:1px solid #ee2b33; border-bottom:2px solid #ee2b33; overflow:hidden; padding:.7em; text-align:center;}
.joinTable.typeA { border-top:2px solid #ee1b24; border-collapse:collapse;}
.joinTable.typeB { border-bottom:2px solid #ee1b24; background:#f9f9f9;}
.joinTable.typeC { border-top:2px solid #ee2b33; border-bottom:2px solid #ee2b33; border-collapse:collapse;}
.joinTable.typeB caption { border-top:1px dashed #919191; background:#f9f9f9;}
.joinTable { width:100%;}
.joinTable caption { padding:2em 0 .5em 1.5em; font-weight:bold; text-align:left; background:url(../images/common/iconH3.gif) no-repeat .5em 2em;}
.joinTable th,
.joinTable td { padding:.7em .5em .7em 1.5em; text-align:left; border-top:1px solid #eff0eb;}
.joinTable td { background:url(../images/common/bar_1x18_e4e5e0.gif) no-repeat left bottom;}
.joinTable th { width:10em;}
.joinTable td textarea { width:40em; height:4.5em; border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666; overflow:auto;}
.joinTable td input { border:1px solid; border-color:#a6a6a6 #d8d8d8 #d8d8d8 #a6a6a6; padding:3px; height:1em; line-height:1em; background:#fbfbfb; vertical-align:middle; float:left; margin-right:.5em; margin-bottom:.5em; color:#666666;}
.joinTable td input.radio,
.joinTable td input.check { border:none; padding:0; margin:0; background:none; margin-top:.4em;}
.joinTable td input.w4em { width:4em;}
.joinTable td input.w2em { width:2em;}
.joinTable td select { float:left; margin-right:.5em;}
.joinTable td .fl { margin-right:.5em;}
.joinTable td br { clear:both;}
.joinTable td p { float:left; font-size:.9em; color:#999999; padding-top:.5em; margin-right:.5em;}
.joinTable td label { float:left; color:#3f4040; padding-top:.3em; margin-right:.5em;}
.joinTable td a { color:#333333;}
.joinTable .no_line { border:none;}
.join_button { margin:1em 0 0 0; text-align:center;}
.joinTable .add_info { padding:2.5em .5em .7em 1.5em; background:#f9f9f9; border-top:1px dashed #919191;}
.buttonTypeWrite.join { margin-top:1.2em;}
/* ----- Member | End ----- */
.smallBox .inputPassword { position:relative; border:none; padding:2em 2em 1.5em 2em;}
.smallBox .inputPassword .inputTypeText { float:left; margin-right:.5em; width:8em;}
.smallBox .inputPassword legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}

View file

@ -0,0 +1,26 @@
@charset "utf-8";
/* Blog Layout - Header */
#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#8dc63f url(../images/green/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;}
#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#8dc63f; }
#header #globalNavigation li.on a { color:#8dc63f;}
#header #tagLine { padding:0 0 0 30px; color:#e2f1cf;}
/* blogHeader */
.blogHeader { position:relative; _width:100%; background:#8dc63f url(../images/green/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.blogList { width:100%; position:relative; border-bottom:2px solid #8dc63f; border-collapse:collapse; }
.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/green/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.blogList td .replyAndTrackback { font:.8em Tahoma; color:#27a939; cursor:default; position:relative; top:-.2em;}
.blogList td.recommend { font:bold .8em Tahoma; color:#27a939; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#27a939; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #8dc63f;}
.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #8dc63f; overflow:hidden;}
.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#8dc63f;}
.blogWrite fieldset.bottomBorder { border-bottom:2px solid #8dc63f;}
.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom;}
.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/green/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,94 @@
@charset "utf-8";
/*
NHN UIT Lab. WebStandardization Team (http://html.nhndesign.com/)
Jeong, Chan Myeong 070601~070630
*/
li { list-style:none; }
a { text-decoration:none; }
/* Common Layout of Content Group */
#content { width:100%; position:relative; padding-bottom:2em;}
/* Blog Layout - Common */
#bodyWrap { width:860px; margin:0 auto; overflow:hidden; background-color:#FFFFFF;}
/* Blog Layout - Content Body */
#contentBody { overflow:hidden; padding-bottom:2em; _width:100%;}
/* Blog Layout - ColumnLeft */
#columnLeft { float:left; width:182px; margin:0px 8px 0px 10px; _margin-left:5px;padding:0px;}
/* Blog Layout - ColumnRight */
#columnRight {}
/* Blog Layout - Content */
#content { float:left; width:650px; overflow:hidden; padding-right:10px; _width:640px; }
/* ----- Blog | Start ----- */
#headerWrap { width:860px; margin:0 auto; overflow:hidden;}
#headerWrap #login_menu { margin-top:20px; padding:0 1.2em;}
#headerWrap #login_menu .login {float:right}
#headerWrap #login_menu .member { float:right}
#headerWrap #login_menu .member li {display:inline; margin:0 0 0 -.1em; padding:0 .6em; background:url(../images/common/bar_1x7_c0c0c0.gif) no-repeat left center;}
/* Blog header Child*/
#header h1 { font:bold 1.3em ; margin:2em 0 .4em 30px; letter-spacing:-.05em; }
#header h1 a { color:#FFFFFF;}
#header #globalNavigation { width:100%; margin:2.4em 0 0 0; padding:.8em 0 .8em 0; background:#e4e4e4; overflow:hidden;}
#header #globalNavigation ul { float:right; }
#header #globalNavigation li { float:left; margin-left:-1px; background:url(../images/common/bar_1x10_c0c0c0.gif) no-repeat left bottom;}
#header #globalNavigation li.no_bg { background:none;}
#header #globalNavigation li a { display:block; float:left; padding:0 1.2em; font:bold .8em Tahoma; color:#54564b; white-space:nowrap;}
/* Column Left & Right Common Child */
.boxTypeA { position:relative; border:5px solid #F2F2F2; margin-bottom:.7em;}
.boxTypeB { position:relative; margin-bottom:.7em;}
.boxTypeB h2 { position:relative; padding:7px 0 0 12px; height:21px; _height:20px; background:#f5f5f5; font-size:1em; color:#ef2121; font-family:Tahoma;}
*:first-child+html .boxTypeB h2 { height:20px; color:#ef2121;}
.boxTypeB .toggleMask {position:absolute; top:8px; right:5px; cursor:pointer; width:13px; height:13px; overflow:hidden;}
.boxTypeB .showHide { position:relative;}
.boxTypeB .optionList { position:absolute; top:8px; right:0; overflow:hidden;}
.boxTypeB .optionList li { float:left; padding:0 .5em; margin-left:-1px; background:url(../images/common/line_1x10_e0e0e0.gif) no-repeat left center;}
.boxTypeB .optionList li a { color:#a4a4a4; font-size:.9em;}
.boxTypeB .optionList li.on a { color:#000000;}
.boxTypeB .showAll { color:#737373; font:bold .9em tahoma; white-space:nowrap; display:inline-block; padding:.4em .8em; background:url(../images/common/bar_1x8_c0c0c0.gif) no-repeat right center;}
.boxTypeB .showAll.no_bg { background:none;}
/* Profile */
div#profile { padding:6px; overflow:hidden;}
div#profile img.profile { width:153px; display:block; margin-bottom:1.2em;}
div#profile dl#hello {}
div#profile dl#hello dt { color:#333333; margin-bottom:.5em;}
div#profile dl#hello dt a { color:#333333;}
div#profile dl#hello dd { color:#777777; margin-bottom:1em;}
div#profile ul#admin { overflow:hidden; height:1.2em;}
div#profile ul#admin li { float:left; padding:0 .4em; font-size:.8em;}
div#profile ul#admin li a { display:block;}
div#profile ul#admin li.write a {}
div#profile ul#admin li.setup { border-left:1px solid #e3e3e3;}
div#profile ul#admin li.setup a {}
div#profile ul#admin li a { color:#666666;}
/* Category */
div#category {}
div#category #categoryList { padding:1em .8em .5em .8em;}
div#category #categoryList li { position:relative; padding:0 0 0 15px; background:url(../images/common/iconFolderClose.gif) no-repeat 2px top;}
div#category #categoryList li li {}
div#category #categoryList li li li { background:url(../images/common/iconList.gif) no-repeat 5px top;}
div#category #categoryList a { display:block; _display:inline-block; color:#6b6b6b; margin:0 0 6px 5px;}
/* Search Box */
div#searchBox { margin-bottom:.7em; padding:.6em; background:#f5f5f5; overflow:hidden; _height:25px;}
div#searchBox fieldset { border:none;}
div#searchBox fieldset legend { position:absolute; overflow:hidden; width:1px; height:1px; font-size:.001em; text-indent:-100em;}
.blogWrite div.title { border-top:2px solid #ed1b24;}
.write_post h3 {margin:1.5em 1em 1em 1em; font:bold 1.2em ;}
/* ----- Blog | End ----- */
.blogHeader2 { width:100%; overflow:hidden; padding:2em 0 2em 0; color:#333333;}
.blogHeader2 h3 { float:left; font-size:1.2em; padding-left:1em; background:url(../images/common/iconH3.gif) no-repeat .5em center;}
.blogHeader2 .info { float:right; position:relative; right:1.2em; top:.3em; font-size:.8em; color:#8d8d8d;}
.blogHeader2 .info q { quotes:none; font-weight:bold; font:bold 1.2em ; color:#676767;}
.blogHeader2 .info strong { font:bold .9em Tahoma; color:#696969;}

View file

@ -0,0 +1,25 @@
@charset "utf-8";
/* Blog Layout - Header */
#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#f70795 url(../images/pink/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;}
#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#f70795; }
#header #globalNavigation li.on a { color:#f70795;}
#header #tagLine { padding:0 0 0 30px; color:#fdc1e4;}
/* blogHeader */
.blogHeader { position:relative; _width:100%; background:#f70795 url(../images/pink/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.blogList { width:100%; position:relative; border-bottom:2px solid #f70795; border-collapse:collapse; }
.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/pink/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.blogList td .replyAndTrackback { font:.8em Tahoma; color:#f70795; cursor:default; position:relative; top:-.2em;}
.blogList td.recommend { font:bold .8em Tahoma; color:#f70795; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#f70795; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #f70795;}
.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #f70795; overflow:hidden;}
.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#f70795;}
.blogWrite fieldset.bottomBorder { border-bottom:2px solid #f9f9f9;}
.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom;}
.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/pink/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,25 @@
@charset "utf-8";
/* Blog Layout - Header */
#header { margin:0 9px .8em 9px; clear:both; margin-top:.6em; background:#ed2027 url(../images/red/bg_header.gif) no-repeat 2.5em top; border:1px solid #FFFFFF; overflow:hidden;}
#blog_category .selected { font-weight:bold; cursor:default; font-size:1em; color:#ed2027; }
#header #globalNavigation li.on a { color:#ee2126;}
#header #tagLine { padding:0 0 0 30px; color:#f6c8c8;}
/* blogHeader */
.blogHeader { position:relative; _width:100%; background:#ED2027 url(../images/red/bg_top_title.gif) no-repeat 23px top; overflow:hidden;}
.blogList { width:100%; position:relative; border-bottom:2px solid #ed2a32; border-collapse:collapse; }
.blogList th {padding:1.2em .5em 1.1em .6em; background:#ffffff url(../images/red/bg_title.gif) no-repeat left bottom; white-space:nowrap;}
.blogList td .replyAndTrackback { font:.8em Tahoma; color:#ed1f29; cursor:default; position:relative; top:-.2em;}
.blogList td.recommend { font:bold .8em Tahoma; color:#ec2127; text-align:center;}
.pageNavigation .current { margin-left:-4px; font:bold .8em Tahoma; color:#ff6600; display:inline-block; padding:1px 5px 2px 4px; border-left:1px solid #dedfde; border-right:1px solid #CCCCCC; text-decoration:none; line-height:1em; }
.blogRead { position:relative; _width:100%; margin:1em 0 0 0; padding: 0 0 .6em 0; border-bottom:3px solid #ed2228;}
.blogRead .readHeader { width:100%; padding-bottom:.5em; margin-bottom:1em; border-bottom:3px solid #ee202a; overflow:hidden;}
.blogRead .replyAndTrackback li.selected { margin:0; padding:1em 1.1em .7em 1.4em; border:1px solid #EAEAEA; border-bottom:none; background:#FFFFFF; color:#eb1c22;}
.blogWrite fieldset.bottomBorder { border-bottom:2px solid #ed1b24;}
.blogWrite div.title { padding:.5em 0 .65em 0; white-space:nowrap; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom;}
.blogWrite .option { width:100%; padding:.5em 0 .65em 0; background:#FFFFFF url(../images/red/bg_title_norepeat.gif) no-repeat left bottom; overflow:hidden;}

View file

@ -0,0 +1,24 @@
<!--%import("filter/delete_comment.xml")-->
<!--#include("header.html")-->
<div class="smallBox w268">
<div class="header">
<h3>{$lang->confirm_delete}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, delete_comment)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="comment_srl" value="{$comment_srl}" />
<div class="inputPassword tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></span>
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_cancel}</span></a>
</div>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,23 @@
<!--%import("filter/delete_document.xml")-->
<!--#include("header.html")-->
<div class="smallBox w268">
<div class="header">
<h3>{$lang->confirm_delete}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, delete_document)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<div class="inputPassword tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></span>
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_cancel}</span></a>
</div>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,25 @@
<!--%import("filter/delete_trackback.xml")-->
<!--#include("header.html")-->
<div class="smallBox w268">
<div class="header">
<h3>{$lang->confirm_delete}</h3>
</div>
<form action="./" method="get" onsubmit="return procFilter(this, delete_trackback)">
<input type="hidden" name="mid" value="{$mid}" />
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="document_srl" value="{$document_srl}" />
<input type="hidden" name="trackback_srl" value="{$trackback_srl}" />
<div class="inputPassword tCenter">
<span class="button"><input type="submit" value="{$lang->cmd_delete}" accesskey="s" /></span>
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_cancel}</span></a>
</div>
</form>
</div>
<!--#include("footer.html")-->

View file

@ -0,0 +1,65 @@
<!-- 이 파일은 extra_vars의 form을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
<!-- type=select,checkbox이고 기본값이 , 로 연결되어 있으면 , 를 기준으로 explode하여 배열로 만든다 -->
<!--@if(in_array($val->type,array('select','checkbox'))&&strpos($val->default,",")!==false)-->
{@ $val->default = explode(',',$val->default) }
<!--@end-->
<!-- 확장변수의 이름을 지정 -->
{@ $val->column_name = "extra_vars".$key}
<!-- 확장변수의 값을 documentItem::getExtraValue로 가져옴 -->
{@ $val->value = $oDocument->getExtraValue($key)}
<!-- 일반 text -->
<!--@if($val->type == 'text')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w400" />
<!-- 홈페이지 주소 -->
<!--@elseif($val->type == 'homepage')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w400" />
<!-- Email 주소 -->
<!--@elseif($val->type == 'email_address')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value)}" class="inputTypeText w400" />
<!-- 전화번호 -->
<!--@elseif($val->type == 'tel')-->
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[0])}" size="4" class="inputTypeText" />
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[1])}" size="4" class="inputTypeText" />
<input type="text" name="{$val->column_name}" value="{htmlspecialchars($val->value[2])}" size="4" class="inputTypeText" />
<!-- textarea -->
<!--@elseif($val->type == 'textarea')-->
<textarea name="{$val->column_name}" class="inputTypeTextArea w400">{htmlspecialchars($val->value)}</textarea>
<!-- 다중 선택 -->
<!--@elseif($val->type == 'checkbox')-->
<!--@if($val->default)-->
<ul style="list-style:none;">
<!--@foreach($val->default as $v)-->
<li><input type="checkbox" name="{$val->column_name}" value="{$v}" <!--@if(is_array($val->value)&&in_array($v, $val->value))-->checked="checked"<!--@end-->/> {$v}</li>
<!--@end-->
</ul>
<!--@end-->
<!-- 단일 선택 -->
<!--@elseif($val->type == 'select')-->
<select name="{$val->column_name}">
<!--@if($val->default)-->
<!--@foreach($val->default as $v)-->
<option value="{$v}" <!--@if($v == $val->value)-->selected="selected"<!--@end-->>{$v}</option>
<!--@end-->
<!--@end-->
</select>
<!-- 날짜 입력 -->
<!--@elseif($val->type == 'date')-->
<input type="hidden" name="{$val->column_name}" id="date_{$val->column_name}" value="{$val->value}" />
<div class="fl inputTypeText w80" id="str_{$val->column_name}">{zdate($val->value,"Y-m-d")}</div>
<a href="#" onclick="open_calendar('{$val->column_name}','{$val->value}');return false;" class="button"><span>{$lang->cmd_open_calendar}</span></a>
<!--@end-->
<!--@if($val->desc)-->
<p class="info">{$val->desc}</p>
<!--@end-->

View file

@ -0,0 +1,57 @@
<!-- 이 파일은 extra_vars의 결과값을 출력하는 파일이며 다른 스킨에서 그대로 가져가서 css만 바꾸어 주면 된다 -->
<!-- 확장변수의 이름을 지정 -->
{@ $val->column_name = "extra_vars".$key}
<!-- 확장변수의 값을 documentItem::getExtraValue로 가져옴 -->
{@ $val->value = $oDocument->getExtraValue($key)}
<!-- 일반 text -->
<!--@if($val->type == 'text')-->
{htmlspecialchars($val->value)}
<!-- 홈페이지 주소 -->
<!--@elseif($val->type == 'homepage')-->
<!--@if($val->value)-->
<a href="{htmlspecialchars($val->value)}" onclick="window.open(this.href);return false;">{$val->value}</a>
<!--@else-->
&nbsp;
<!--@end-->
<!-- Email 주소 -->
<!--@elseif($val->type == 'email_address')-->
<!--@if($val->value)-->
<a href="mailto:{htmlspecialchars($val->value)}">{$val->value}</a>
<!--@else-->
&nbsp;
<!--@end-->
<!-- 전화번호 -->
<!--@elseif($val->type == 'tel')-->
{htmlspecialchars($val->value[0])}
<!--@if($val->value[1])-->-<!--@end-->
{htmlspecialchars($val->value[1])}
<!--@if($val->value[2])-->-<!--@end-->
{htmlspecialchars($val->value[2])}
<!-- textarea -->
<!--@elseif($val->type == 'textarea')-->
{nl2br(htmlspecialchars($val->value))}
<!-- 다중 선택 -->
<!--@elseif($val->type == 'checkbox')-->
<!--@foreach($val->value as $v)-->
{@ $_tmp_value[] = htmlspecialchars($v)}
<!--@end-->
{implode(",",$_tmp_value)}
<!-- 단일 선택 -->
<!--@elseif($val->type == 'select')-->
{htmlspecialchars($val->value)}
<!-- 날짜 입력 -->
<!--@elseif($val->type == 'date')-->
{zdate($val->value,"Y-m-d")}
<!--@end-->
<!--@if(!$val->value)-->&nbsp;<!--@end-->

View file

@ -0,0 +1,18 @@
<filter name="delete_comment" module="blog" act="procBlogDeleteComment">
<form>
<node target="comment_srl" required="true" />
</form>
<parameter>
<param name="mid" target="mid" />
<param name="page" target="page" />
<param name="document_srl" target="document_srl" />
<param name="comment_srl" target="comment_srl" />
</parameter>
<response callback_func="completeDeleteComment">
<tag name="error" />
<tag name="message" />
<tag name="mid" />
<tag name="document_srl" />
<tag name="page" />
</response>
</filter>

View file

@ -0,0 +1,16 @@
<filter name="delete_document" module="blog" act="procBlogDeleteDocument">
<form>
<node target="document_srl" required="true" />
</form>
<parameter>
<param name="mid" target="mid" />
<param name="page" target="page" />
<param name="document_srl" target="document_srl" />
</parameter>
<response callback_func="completeDeleteDocument">
<tag name="error" />
<tag name="message" />
<tag name="mid" />
<tag name="page" />
</response>
</filter>

View file

@ -0,0 +1,18 @@
<filter name="delete_trackback" module="blog" act="procBlogDeleteTrackback">
<form>
<node target="trackback_srl" required="true" />
</form>
<parameter>
<param name="mid" target="mid" />
<param name="page" target="page" />
<param name="document_srl" target="document_srl" />
<param name="trackback_srl" target="trackback_srl" />
</parameter>
<response callback_func="completeDeleteTrackback">
<tag name="error" />
<tag name="message" />
<tag name="mid" />
<tag name="document_srl" />
<tag name="page" />
</response>
</filter>

View file

@ -0,0 +1,16 @@
<filter name="input_password" module="blog" act="procBlogVerificationPassword" >
<form>
<node target="document_srl" required="true" />
<node target="password" required="true" />
</form>
<parameter>
<param name="mid" target="mid" />
<param name="document_srl" target="document_srl" />
<param name="comment_srl" target="comment_srl" />
<param name="password" target="password" />
</parameter>
<response>
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -0,0 +1,18 @@
<filter name="insert" module="blog" act="procBlogInsertDocument" confirm_msg_code="confirm_submit">
<form>
<node target="document_srl" required="true" />
<node target="nick_name" required="true" />
<node target="password" required="true" />
<node target="email_address" maxlength="250" />
<node target="homepage" maxlength="250"/>
<node target="title" required="true" minlength="1" maxlength="250" />
<node target="content" required="true" />
</form>
<response callback_func="completeDocumentInserted">
<tag name="error" />
<tag name="message" />
<tag name="mid" />
<tag name="document_srl" />
<tag name="category_srl" />
</response>
</filter>

View file

@ -0,0 +1,28 @@
<filter name="insert_comment" module="blog" act="procBlogInsertComment" confirm_msg_code="confirm_submit">
<form>
<node target="document_srl" required="true" />
<node target="nick_name" required="true" />
<node target="password" required="true" />
<node target="email_address" maxlength="250" />
<node target="homepage" maxlength="250"/>
<node target="content" required="true" minlength="1" />
</form>
<parameter>
<param name="mid" target="mid" />
<param name="document_srl" target="document_srl" />
<param name="comment_srl" target="comment_srl" />
<param name="parent_srl" target="parent_srl" />
<param name="nick_name" target="nick_name" />
<param name="password" target="password" />
<param name="email_address" target="email_address" />
<param name="homepage" target="homepage" />
<param name="content" target="content" />
</parameter>
<response callback_func="completeInsertComment">
<tag name="error" />
<tag name="message" />
<tag name="mid" />
<tag name="document_srl" />
<tag name="comment_srl" />
</response>
</filter>

View file

@ -0,0 +1,2 @@
<!-- 하단 텍스트 출력 -->
{$module_info->footer_text}

View file

@ -0,0 +1,2 @@
<!-- 상단 텍스트 출력 -->
{$module_info->header_text}

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,016 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 B

Some files were not shown because too many files have changed in this diff Show more