게시판의 분류(카테고리) 관리를 메뉴(menu)와 같이 ajax로 부모-자식 관계로 생성할 수 있도록 기능 수정. 카테고리별 권한 설정을 통해 글작성시 카테고리 선별 제공 가능

git-svn-id: http://xe-core.googlecode.com/svn/sandbox@3545 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
zero 2008-01-18 12:14:12 +00:00
parent a6a082dfce
commit 205324a735
27 changed files with 716 additions and 149 deletions

View file

@ -257,59 +257,140 @@
/**
* @brief 카테고리 추가
**/
function procBoardAdminInsertCategory() {
// 일단 입력된 값들을 모두 받아서 db 입력항목과 그외 것으로 분리
$module_srl = Context::get('module_srl');
$category_title = Context::get('category_title');
function procBoardAdminInsertCategory($args = null) {
// 입력할 변수 정리
if(!$args) $args = Context::gets('module_srl','category_srl','parent_srl','title','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;
// module_srl이 있으면 원본을 구해온다
$oDocumentController = &getController('document');
$args->module_srl = $module_srl;
$args->title = $category_title;
$output = $oDocumentController->insertCategory($args);
if(!$output->toBool()) return $output;
$oDocumentModel = &getModel('document');
$this->add('page',Context::get('page'));
$this->add('module_srl',$module_srl);
$this->setMessage('success_registed');
$oDB = &DB::getInstance();
$oDB->begin();
// 이미 존재하는지를 확인
if($args->category_srl) {
$category_info = $oDocumentModel->getCategory($args->category_srl);
if($category_info->category_srl != $args->category_srl) $args->category_srl = null;
}
// 존재하게 되면 update를 해준다
if($args->category_srl) {
$output = $oDocumentController->updateCategory($args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// 존재하지 않으면 insert를 해준다
} else {
$output = $oDocumentController->insertCategory($args);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
}
// XML 파일을 갱신하고 위치을 넘겨 받음
$xml_file = $oDocumentController->makeCategoryFile($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 procBoardAdminDeleteCategory() {
// 변수 정리
$args = Context::gets('module_srl','category_srl');
$oDB = &DB::getInstance();
$oDB->begin();
$oDocumentModel = &getModel('document');
// 원정보를 가져옴
$category_info = $oDocumentModel->getCategory($args->category_srl);
if($category_info->parent_srl) $parent_srl = $category_info->parent_srl;
// 자식 노드가 있는지 체크하여 있으면 삭제 못한다는 에러 출력
if($oDocumentModel->getCategoryChlidCount($args->category_srl)) return new Object(-1, 'msg_cannot_delete_for_child');
// DB에서 삭제
$oDocumentController = &getController('document');
$output = $oDocumentController->deleteCategory($args->category_srl);
if(!$output->toBool()) {
$oDB->rollback();
return $output;
}
// XML 파일을 갱신하고 위치을 넘겨 받음
$xml_file = $oDocumentController->makeCategoryFile($args->module_srl);
$oDB->commit();
$this->add('xml_file', $xml_file);
$this->add('category_srl', $parent_srl);
$this->setMessage('success_deleted');
}
/**
* @brief 카테고리의 내용 수정
* @brief 카테고리 이동
**/
function procBoardAdminUpdateCategory() {
$module_srl = Context::get('module_srl');
$category_srl = Context::get('category_srl');
$mode = Context::get('mode');
$title = Context::get('category_title');
function procBoardAdminMoveCategory() {
$source_category_srl = Context::get('source_category_srl');
$target_category_srl = Context::get('target_category_srl');
$oDocumentModel = &getModel('document');
$oDocumentController = &getController('document');
switch($mode) {
case 'up' :
$output = $oDocumentController->moveCategoryUp($category_srl);
$msg_code = 'success_moved';
break;
case 'down' :
$output = $oDocumentController->moveCategoryDown($category_srl);
$msg_code = 'success_moved';
break;
case 'delete' :
$output = $oDocumentController->deleteCategory($category_srl);
$msg_code = 'success_deleted';
break;
case 'update' :
$selected_category = $oDocumentModel->getCategory($category_srl);
$selected_category->title = $title;
$output = $oDocumentController->updateCategory($selected_category);
$msg_code = 'success_updated';
break;
}
$target_category = $oDocumentModel->getCategory($target_category_srl);
$source_category = $oDocumentModel->getCategory($source_category_srl);
// target_category의 list_order값을 +1해 준다
$output = $oDocumentController->updateCategoryListOrder($target_category->module_srl, $target_category->list_order);
if(!$output->toBool()) return $output;
$this->add('module_srl', $module_srl);
$this->setMessage($msg_code);
// source_category에 target_category_srl의 parent_srl, list_order 값을 입력
$source_args->category_srl = $source_category_srl;
$source_args->parent_srl = $target_category->parent_srl;
$source_args->list_order = $target_category->list_order;
$output = $oDocumentController->updateCategory($source_args);
if(!$output->toBool()) return $output;
// xml파일 재생성
$xml_file = $oDocumentController->makeCategoryFile($source_category->module_srl);
// return 변수 설정
$this->add('xml_file', $xml_file);
$this->add('source_category_srl', $source_category_srl);
}
/**
* @brief xml 파일을 갱신
* 관리자페이지에서 메뉴 구성 간혹 xml파일이 재생성 안되는 경우가 있는데\n
* 이럴 경우 관리자의 수동 갱신 기능을 구현해줌\n
* 개발 중간의 문제인 같고 현재는 문제가 생기지 않으나 굳이 없앨 필요 없는 기능
**/
function procBoardAdminMakeXmlFile() {
// 입력값을 체크
$module_srl = Context::get('module_srl');
// xml파일 재생성
$oDocumentController = &getController('document');
$xml_file = $oDocumentController->makeCategoryFile($module_srl);
// return 값 설정
$this->add('xml_file',$xml_file);
}
}
?>

View file

@ -0,0 +1,65 @@
<?php
/**
* @class boardAdminModel
* @author zero (zero@nzeo.com)
* @version 0.1
* @brief board 모듈의 admin model class
**/
class boardAdminModel extends board {
/**
* @brief 초기화
**/
function init() {
}
/**
* @brief 특정 카테고리의 정보를 이용하여 템플릿을 구한후 return
* 관리자 페이지에서 특정 메뉴의 정보를 추가하기 위해 서버에서 tpl을 컴파일 한후 컴파일 html을 직접 return
**/
function getBoardAdminCategoryTplInfo() {
// 해당 메뉴의 정보를 가져오기 위한 변수 설정
$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);
$oDocumentModel = &getModel('document');
// parent_srl이 있고 category_srl 이 없으면 하부 메뉴 추가임
if(!$category_srl && $parent_srl) {
// 상위 메뉴의 정보를 가져옴
$parent_info = $oDocumentModel->getCategory($parent_srl);
// 추가하려는 메뉴의 기본 변수 설정
$category_info->category_srl = getNextSequence();
$category_info->parent_srl = $parent_srl;
$category_info->parent_category_title = $parent_info->title;
// root에 메뉴 추가하거나 기존 메뉴의 수정일 경우
} else {
// category_srl 이 있으면 해당 메뉴의 정보를 가져온다
if($category_srl) $category_info = $oDocumentModel->getCategory($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

@ -181,32 +181,18 @@
* @brief 카테고리의 정보 출력
**/
function dispBoardAdminCategoryInfo() {
// module_srl을 구함
$module_srl = Context::get('module_srl');
$module_srl = $this->module_info->module_srl;
// 카테고리의 목록을 구해
// 카테고리 정보를 가져
$oDocumentModel = &getModel('document');
$category_list = $oDocumentModel->getCategoryList($module_srl);
Context::set('category_list', $category_list);
$category_xml_file = $oDocumentModel->getCategoryXmlFile($module_srl);
// 수정하려는 카테고리가 있다면해당 카테고리의 정보를 가져옴
$category_srl = Context::get('category_srl');
Context::set('category_xml_file', $category_xml_file);
Context::addJsFile('./common/js/tree_menu.js');
if($category_srl) {
$selected_category = $oDocumentModel->getCategory($category_srl);
if(!$selected_category) Context::set('category_srl','');
else Context::set('selected_category',$selected_category);
$this->setTemplateFile('category_update_form');
} else {
$this->setTemplateFile('category_list');
}
Context::set('layout','none');
$this->setTemplateFile('category_list');
}
/**

View file

@ -13,15 +13,6 @@
* board 모듈은 일반 사용과 관리자용으로 나누어진다.\n
**/
function init() {
/**
* 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅
**/
if($this->module_info->use_category=='Y') {
$oDocumentModel = &getModel('document');
$this->category_list = $oDocumentModel->getCategoryList($this->module_srl);
Context::set('category_list', $this->category_list);
}
/**
* 스킨등에서 사용될 module_srl이나 module_info등을 context set
**/
@ -55,12 +46,19 @@
* @brief 목록 선택된 출력
**/
function dispBoardContent() {
/**
* 목록보기 권한 체크 (모든 권한은 ModuleObject에서 xml 정보와 module_info의 grant 값을 비교하여 미리 설정하여 놓음)
**/
if(!$this->grant->list) return $this->dispBoardMessage('msg_not_permitted');
/**
* 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅
**/
if($this->module_info->use_category=='Y') {
$oDocumentModel = &getModel('document');
Context::set('category_list', $oDocumentModel->getCategoryList($this->module_srl));
}
/**
* 목록이 노출될때 같이 나오는 검색 옵션을 정리하여 스킨에서 있도록 context set
**/
@ -214,12 +212,47 @@
// 권한 체크
if(!$this->grant->write_document) return $this->dispBoardMessage('msg_not_permitted');
$oDocumentModel = &getModel('document');
/**
* 카테고리를 사용하는지 확인후 사용시 카테고리 목록을 구해와서 Context에 세팅, 권한도 함께 체크
**/
if($this->module_info->use_category=='Y') {
// 로그인한 사용자의 그룹 정보를 구함
if(Context::get('is_logged')) {
$logged_info = Context::get('logged_info');
$group_srls = array_keys($logged_info->group_list);
} else {
$group_srls = array();
}
$group_srls_count = count($group_srls);
// 카테고리 목록을 구하고 권한을 체크
$normal_category_list = $oDocumentModel->getCategoryList($this->module_srl);
if(count($normal_category_list)) {
foreach($normal_category_list as $category_srl => $category) {
$is_granted = true;
if($category->group_srls) {
$category_group_srls = explode(',',$category->group_srls);
$is_granted = false;
for($i=0;$i<$group_srls_count;$i++) {
if(in_array($group_srls[$i],$category_group_srls)) {
$is_granted = true;
break;
}
}
}
if($is_granted) $category_list[$category_srl] = $category;
}
}
Context::set('category_list', $category_list);
}
// GET parameter에서 document_srl을 가져옴
$document_srl = Context::get('document_srl');
// document 모듈 객체 생성
$oDocumentModel = &getModel('document');
$oDocument = $oDocumentModel->getDocument(0, $this->grant->manager);
$oDocument->setDocument($document_srl);

View file

@ -52,6 +52,8 @@
<permission action="procBoardUploadFile" target="manager" />
<permission action="procBoardDownloadFile" target="manager" />
<permission action="getBoardAdminCategoryTplInfo" target="manager" />
<permission action="dispBoardAdminInsertBoard" target="manager" />
<permission action="dispBoardAdminBoardInfo" target="manager" />
<permission action="dispBoardAdminBoardAdditionSetup" target="manager" />
@ -62,6 +64,9 @@
<permission action="procBoardAdminUpdateSkinInfo" target="manager" />
<permission action="procBoardAdminInsertCategory" target="manager" />
<permission action="procBoardAdminUpdateCategory" target="manager" />
<permission action="procBoardAdminDeleteCategory" target="manager" />
<permission action="procBoardAdminMakeXmlFile" target="manager" />
<permission action="procBoardAdminMoveCategory" target="manager" />
</permissions>
<actions>
<action name="dispBoardContent" type="view" index="true" />
@ -85,6 +90,8 @@
<action name="procBoardUploadFile" type="controller" />
<action name="procBoardDownloadFile" type="controller" />
<action name="getBoardAdminCategoryTplInfo" type="model" standalone="true" />
<action name="dispBoardAdminContent" type="view" standalone="true" admin_index="true" />
<action name="dispBoardAdminBoardInfo" type="view" standalone="true" />
<action name="dispBoardAdminBoardAdditionSetup" type="view" standalone="true" />
@ -100,5 +107,8 @@
<action name="procBoardAdminDeleteBoard" type="controller" standalone="true" />
<action name="procBoardAdminInsertCategory" type="controller" standalone="true" />
<action name="procBoardAdminUpdateCategory" type="controller" standalone="true" />
<action name="procBoardAdminDeleteCategory" type="controller" standalone="true" />
<action name="procBoardAdminMakeXmlFile" type="controller" standalone="true" />
<action name="procBoardAdminMoveCategory" type="controller" standalone="true" />
</actions>
</module>

View file

@ -9,11 +9,28 @@
$lang->except_notice = "공지사항 제외";
$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)";
// Item
$lang->parent_category_title = 'Parent category';
$lang->category_title = 'Category';
$lang->expand = 'Expand';
$lang->category_group_srls = 'Accessable Group';
$lang->search_result = 'Search result';
// words used in button
$lang->cmd_board_list = 'Board list';
$lang->cmd_module_config = 'Common board setting';
$lang->cmd_view_info = 'Board info';
// blah blah..
$lang->about_category_title = '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 board layout code. Insert or manage the widget code anywhere you want';
$lang->about_board_category = 'You can make board categories.<br />When board category is broken, try rebuilding the cache file manually.';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";
$lang->about_board = "This module is for creating and managing boards.\nYou may select the module name from the list after creating one to configure specifically.\nPlease be careful with board's module name, since it will be the url. (ex : http://domain/zb/?mid=modulename)";
?>

View file

@ -8,12 +8,31 @@
$lang->board = "Tablero";
$lang->except_notice = "공지사항 제외";
$lang->cmd_manage_menu = 'Manejo del menú';
$lang->cmd_make_child = 'Agregar sub categoría';
$lang->cmd_enable_move_category = "Cambiar la posición de la categoría. (arrastrar y soltar luego de haber selecionado)";
$lang->cmd_remake_cache = 'Rehacer archivo caché';
$lang->cmd_layout_setup = 'Configuración del diseño';
$lang->cmd_layout_edit = 'Editar el diseño';
// Artículos
$lang->parent_category_title = 'Categoría Superior';
$lang->category_title = 'Nombre de la categoría';
$lang->expand = 'Expandir';
$lang->category_group_srls = 'Limitar el grupo';
$lang->search_result = 'Resultado de la búsqueda';
// Palabras utilizadas en los botones
$lang->cmd_board_list = 'Lista del tableros';
$lang->cmd_module_config = 'Configuración común del Tablero';
$lang->cmd_view_info = 'Información del Tablero';
// bla bla...
$lang->about_category_title = 'Ingresar el nombre de la categoría.';
$lang->about_expand = 'Si seleccionas esta opción, siempre estará expandido.';
$lang->about_category_group_srls = 'Solo se verán los grupos seleccionados en la actual categoría. (Abrir manualmente en archivo xml para la exposición)';
$lang->about_layout_setup = 'Puede modificar manualmente el código del diseño de tableros. Insertar o modificar el código de widget.';
$lang->about_board_category = 'Puede crear las categorias de tableros.<br />Cuando no funciona la categoría de tableros, rehacer el archivo caché manualmente para solucionar.';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";
$lang->about_board = "Este módulo es para crear y manejar los tableros.\nLuego de crear un Tablero, seleciona el nombre del módulo para la configuración más detallada.\nSea cuidadoso con el nombre del módulo, ya que ese nombre va a ser la dirección URL. (ej : http://dominio/zb/?mid=nombre del módulo)";
?>

View file

@ -9,11 +9,31 @@
$lang->except_notice = "공지사항 제외";
$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_title = '上位カテゴリ名';
$lang->category_title = 'カテゴリ名';
$lang->expand = '拡張表示';
$lang->category_group_srls = 'グループ制限';
$lang->search_result = '検索結果';
// ボタンに使用する用語
$lang->cmd_board_list = '掲示板リスト';
$lang->cmd_module_config = '掲示板共通設定';
$lang->cmd_view_info = '掲示板情報';
// その他
$lang->about_category_title = 'カテゴリ名を入力して下さい。';
$lang->about_expand = 'チェックすると常に展開された状態になります。';
$lang->about_category_group_srls = '選択したグループのみ現在のカテゴリが見えるようになりますXMLファイルを直接閲覧すると表示されます。';
$lang->about_layout_setup = 'ブログのレイアウトのコードを直接修正します。ウィジェットコードを好きなところに入力、又は管理して下さい。';
$lang->about_board_category = 'ブログのカテゴリを作成します。<br />ブログのカテゴリが誤作動する場合、「キャッシュファイルの再生性」を手動で行うことで解決できます。';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";
$lang->about_board = "掲示板の生成、および管理する掲示板モジュールです。\n生成後、リストからモジュール名を選択すると詳細な設定ができます。\n掲示板のモジュール名はURLになりますので注意してください。 (ex : http://ドメイン/zb/?mid=モジュール名)";
?>

View file

@ -9,11 +9,28 @@
$lang->except_notice = "공지사항 제외";
$lang->cmd_manage_menu = '메뉴관리';
$lang->cmd_make_child = '하위 카테고리 추가';
$lang->cmd_enable_move_category = "카테고리 위치 변경 (선택후 위 메뉴를 드래그하세요)";
// 항목
$lang->parent_category_title = '상위 카테고리명';
$lang->category_title = '분류명';
$lang->expand = '펼침';
$lang->category_group_srls = '그룹제한';
$lang->search_result = '검색결과';
// 버튼에 사용되는 언어
$lang->cmd_board_list = '게시판 목록';
$lang->cmd_module_config = '게시판 공통 설정';
$lang->cmd_view_info = '게시판 정보';
// 주절 주절..
$lang->about_category_title = '카테고리 이름을 입력해주세요';
$lang->about_expand = '선택하시면 늘 펼쳐진 상태로 있게 합니다';
$lang->about_category_group_srls = '선택하신 그룹만 현재 카테고리가 보이게 됩니다. (xml파일을 직접 열람하면 노출이 됩니다)';
$lang->about_layout_setup = '블로그의 레이아웃 코드를 직접 수정할 수 있습니다. 위젯 코드를 원하는 곳에 삽입하시거나 관리하세요';
$lang->about_board_category = '분류를 만드실 수 있습니다.<br />분류가 오동작을 할 경우 캐시파일 재생성을 수동으로 해주시면 해결이 될 수 있습니다.';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";
$lang->about_board = "게시판을 생성하고 관리할 수 있는 게시판 모듈입니다.\n생성하신 후 목록에서 모듈이름을 선택하시면 자세한 설정이 가능합니다.\n게시판의 모듈이름은 접속 url이 되므로 신중하게 입력해주세요. (ex : http://도메인/zb/?mid=모듈이름)";
?>

View file

@ -9,11 +9,31 @@
$lang->except_notice = "공지사항 제외";
$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_title = 'Родительская категория';
$lang->category_title = 'Категория';
$lang->expand = 'Расширить';
$lang->category_group_srls = 'Доступные группы';
$lang->search_result = 'Результат поиска';
// слова, использованные в кнопке
$lang->cmd_board_list = 'Список форумов';
$lang->cmd_module_config = 'Общие настройки форума';
$lang->cmd_view_info = 'Информация форума';
// blah blah.. или чушь всякая... ;)
$lang->about_category_title = 'Пожалуйста, введите название категории';
$lang->about_expand = 'Если эта опция выбрана, расширение будут применено всегда';
$lang->about_category_group_srls = 'Только выбранная группа будет способна видеть ткущие категории. (Вручную откройте xml файл, чтобы сделать видимыми)';
$lang->about_layout_setup = 'Вы можете вручную изменять лейаут код блога. Вставляйте или управляйте кодом виджетов везде, где хотите';
$lang->about_board_category = 'Вы можете сделать категории блога.<br />Когда категория блога испорчена, попробуйте перепостроить файл кеша вручную.';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";
$lang->about_board = "Этот модуль служит для создания и управления форумами.\nВы можете выбрать имя модуля из списка после создания для дополнительного конифигурирования.\nПожалуйста, будте осторожны с именем модуля форума, поскольку оно будет URL. (например : http://domain/zb/?mid=имя_модуля)";
?>

View file

@ -9,11 +9,32 @@
$lang->except_notice = "공지사항 제외";
$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_title = '上级分类名';
$lang->category_title = '分类名';
$lang->expand = '展开';
$lang->category_group_srls = '用户组';
$lang->search_result = '搜索结果';
// 按钮语言
$lang->cmd_board_list = '版面目录';
$lang->cmd_module_config = '版面共同设置';
$lang->cmd_view_info = '版面信息';
// 信息、提示..
$lang->about_category_title = '请输入分类名。';
$lang->about_expand = '选择此项将维持展开状态。';
$lang->about_category_group_srls = '被选的用户组才可以查看此分类。';
$lang->about_layout_setup = '可直接编辑博客布局代码。可以把控件代码插入到您喜欢的位置。';
$lang->about_board_category = '可以添加/删除博客分类<br />博客分类有异常情况时,可以尝试重新生成缓冲文件。';
$lang->about_except_notice = "목록 상단에 늘 나타나는 공지사항을 일반 목록에서 공지사항을 출력하지 않도록 합니다.";
$lang->about_board = "可生成,管理版面的模块。\n生成版面后,点击模块名即可对其详细设置。";
?>

View file

@ -91,7 +91,7 @@ Jeong, Chan Myeong 070601~070630
.boardRead .fileAttached li a { text-decoration:none; font-size:.9em; padding:0 0 2px 17px; white-space:nowrap; color:#444444; }
.boardRead .fileAttached li a:visited { color:#777777;}
.boardRead .contentButton { text-align:right;margin:10px 0 5px 0; border-bottom:1px solid #DDDDDD; padding-bottom:10px;}
.boardRead .contentButton { text-align:right;margin:10px 0 5px 0; border-top:1px solid #DDDDDD; padding-top:10px;}
.trackbackBox { padding:.6em .6em; color:#666666; border:1px solid #e0e1db;;margin-top:.5em; }

View file

@ -33,7 +33,7 @@
</div>
<div class="clear"></div>
<div class="rightButtonBox">
<div class="rightButtonBox gap1">
<a href="{getUrl('act','')}" class="button"><span>{$lang->cmd_back}</span></a>
</div>

View file

@ -39,7 +39,7 @@
<!--@if($grant->manager)-->
{@ $_color = array('555555','222288','226622','2266EE','8866CC','88AA66','EE2222','EE6622','EEAA22','EEEE22') }
<dd><select name="title_color" id="title_color" <!--@if($oDocument->get('title_color'))-->style="background-color:#{$oDocument->get('title_color')};"<!--@end--> onchange="this.style.backgroundColor=this.options[this.selectedIndex].style.backgroundColor;">
<option value="" style="background-color:none;">{$lang->title_color}</option>
<option value="" style="background-color:#FFFFFF;">{$lang->title_color}</option>
<!--@foreach($_color as $_col)-->
<option value="{$_col}" style="background-color:#{$_col}" <!--@if($oDocument->get('title_color')==$_col)-->selected="selected"<!--@end-->>{$lang->title_color}</option>
<!--@end-->

View file

@ -0,0 +1,48 @@
<input type="hidden" name="category_srl" value="{$category_info->category_srl}" />
<input type="hidden" name="parent_srl" value="{$category_info->parent_srl}" />
<table cellspacing="0" class="adminTable">
<col width="140" />
<col width="*" />
<!--@if($category_info->parent_category_title)-->
<tr>
<th scope="row">{$lang->parent_category_title}</th>
<td>{$category_info->parent_category_title}</td>
</tr>
<!--@end-->
<tr>
<th scope="row">{$lang->category_title}</th>
<td>
<input type="text" name="category_title" value="{htmlspecialchars($category_info->title)}" class="inputTypeText" />
<p>{$lang->about_category_title}</p>
</td>
</tr>
<tr>
<th scope="row">{$lang->expand}</th>
<td>
<input type="checkbox" name="expand" value="Y" <!--@if($category_info->expand=="Y")-->checked="checked"<!--@end--> class="checkbox" />
{$lang->about_expand}
</td>
</tr>
<tr>
<th scope="row">{$lang->category_group_srls} <input type="checkbox" onclick="checkboxSelectAll(this.form, 'group_srls'); return false;" /></th>
<td>
<!--@foreach($group_list as $key=>$val)-->
<div><input type="checkbox" name="group_srls" value="{$key}" id="group_{$key}" <!--@if(is_array($category_info->group_srls)&&in_array($key, $category_info->group_srls))-->checked="checked"<!--@end--> class="checkbox" /> <label for="group_{$key}">{$val->title}</label></div>
<!--@end-->
<p>{$lang->about_category_group_srls}</p>
</td>
</tr>
<tr>
<th scope="row" colspan="2" class="button">
<!--@if($category_info->title)-->
<a href="#" onclick="doDeleteCategory('{$category_srl->category_srl}');return false" class="button"><span>{$lang->cmd_delete}</span></a>
<!--@end-->
<a href="#" onclick="hideCategoryInfo();return false" class="button"><span>{$lang->cmd_close}</span></a>
<span class="button"><input type="submit" value="{$lang->cmd_save}" /></span>
<!--@if($category_info->title)-->
<a href="#" onclick="doInsertCategory('{$category_info->category_srl}');return false" class="button"><span>{$lang->cmd_make_child}</span></a>
<!--@end-->
</th>
</tr>
</table>

View file

@ -1,70 +1,46 @@
<!--%import("filter/insert_category.xml")-->
<!--%import("filter/update_category.xml")-->
<!--%import("filter/delete_category.xml")-->
<!--%import("filter/move_category.xml")-->
<!--%import("css/board.css")-->
<!--%import("js/board_admin.js")-->
<!--#include("./header.html")-->
<script type="text/javascript">
var category_title = "{$lang->category}";
</script>
<!-- 카테고리의 위/아래, 삭제와 관련된 form -->
<form id="fo_category_info" action="./" method="get">
<input type="hidden" name="module_srl" value="{$module_srl}" />
<input type="hidden" name="category_srl" value="" />
<input type="hidden" name="mode" value="" />
</form>
<h3>{$lang->board} <span class="gray">{$lang->cmd_management}</span></h3>
<div class="infoText">{nl2br($lang->about_board_category)}</div>
<table cellspacing="0" class="adminTable">
<col />
<col width="100" />
<col width="50" />
<col width="50" />
<col width="50" />
<thead>
<tr>
<th scope="col">{$lang->category_title}</th>
<th scope="col">{$lang->last_update}</th>
<th scope="col">{$lang->cmd_modify}</th>
<th scope="col">{$lang->cmd_move}</th>
<th scope="col">{$lang->cmd_delete}</th>
</tr>
</thead>
<tbody>
<!--@if(!count($category_list))-->
<tr>
<td colspan="5">{$lang->msg_category_is_null}</td>
</tr>
<!--@end-->
<div class="gap">
<a href="#" onclick="doInsertCategory(0);return false;" class="button"><span>{$lang->cmd_insert}</span></a>
<a href="#" onclick="doReloadTreeCategory('{$module_info->module_srl}');return false;" class="button"><span>{$lang->cmd_remake_cache}</span></a>
<a href="#" onclick="openAllTreeMenu('category');return false;" class="button"><span>{$lang->cmd_open_all}</span></a>
<a href="#" onclick="closeAllTreeMenu('category');return false;" class="button"><span>{$lang->cmd_close_all}</span></a>
<a href="#" onclick="window.close();return false;" class="button"><span>{$lang->cmd_close}</span></a>
</div>
<!--@foreach($category_list as $category_srl => $category_info)-->
<tr>
<td>{htmlspecialchars($category_info->title)}</td>
<td class="tahoma">{zdate($category_info->last_update,"Y-m-d H:i:s")}</td>
<td class="blue"><a href="{getUrl('category_srl',$category_info->category_srl)}">{$lang->cmd_modify}</a></td>
<td>
<a href="#" onclick="doUpdateCategory('{$category_info->category_srl}','up');return false;"><img src="../../admin/tpl/images/button_up.gif" alt="{$lang->cmd_move_up}" width="14" height="14" /></a>
<a href="#" onclick="doUpdateCategory('{$category_info->category_srl}','down');return false;"><img src="../../admin/tpl/images/button_down.gif" alt="{$lang->cmd_move_down}" width="14" height="14" /></a>
</td>
<td class="red"><a href="#" onclick="doUpdateCategory('{$category_info->category_srl}','delete','{$lang->confirm_delete}');return false;">{$lang->cmd_delete}</a></td>
</tr>
<!--@end-->
</tbody>
</table>
<p class="gap1"><input type="checkbox" class="checkbox" id="category_enable_move" onclick="hideCategoryInfo()" /> <label for="category_enable_move">{$lang->cmd_enable_move_category}</label></p>
<!-- 카테고리 추가 -->
<form action="./" method="post" onsubmit="return procFilter(this, insert_category)">
<input type="hidden" name="page" value="{$page}" />
<input type="hidden" name="module_srl" value="{$module_srl}" />
<input type="hidden" name="category_srl" value="" />
<!-- 카테고리의 위/아래, 삭제와 관련된 form -->
<form id="fo_move_category" action="./" method="get">
<input type="hidden" name="module_srl" />
<input type="hidden" name="source_category_srl" />
<input type="hidden" name="target_category_srl" />
</form>
<table cellspacing="0" class="adminTable">
<col width="150" />
<col />
<col width="100" />
<tr>
<th scope="row">{$lang->category_title}</th>
<td>
<input type="text" name="category_title" class="inputTypeText w300" />
</td>
<th scope="row" class="centerButton"><span class="button"><input type="submit" value="{$lang->cmd_registration}" accesskey="s" /></span></th>
</tr>
</table>
<div class="gap1">
<form id="fo_category" action="./" method="get" onsubmit="return procFilter(this, insert_category)">
<input type="hidden" name="module_srl" value="{$module_info->module_srl}" />
<input type="hidden" name="xml_file" value="{$category_xml_file}" />
</form>
<div id="category_list">
<div id="zone_category"></div>
</div>
<div id="category_info"></div>
</form>
<script type="text/javascript">
loadTreeMenu("{$category_xml_file}", "category", "zone_category", category_title, '', doGetCategoryInfo, 0, doMoveTree);
</script>
</div>

View file

@ -0,0 +1,11 @@
@charset "utf-8";
body { margin:10px; }
.menuListZone { table-layout:fixed; }
.menuListZone td { vertical-align:top; }
.menuListZone td.category_zone { padding-right:10px; }
#category_list { padding:.5em 0 .5em 0; margin-bottom:2em; width:250px; overflow:hidden; float:left; position:absolute; left:10px;}
#category_info { margin-left:10px; width:560px; _width:540px; float:left; position:absolute; right:10px;}
*:first-child+html #category_info { width:550px; }

View file

@ -0,0 +1,11 @@
<filter name="delete_category" module="board" act="procBoardAdminDeleteCategory" confirm_msg_code="confirm_delete">
<form>
<node target="category_srl" required="true" />
</form>
<response callback_func="completeDeleteCategory">
<tag name="error" />
<tag name="message" />
<tag name="xml_file" />
<tag name="category_srl" />
</response>
</filter>

View file

@ -1,12 +1,23 @@
<filter name="insert_category" module="board" act="procBoardAdminInsertCategory" confirm_msg_code="confirm_submit">
<form>
<node target="module_srl" required="true" />
<node target="category_srl" required="true" />
<node target="category_title" required="true" />
</form>
<response callback_func="completeUpdateCategory">
<parameter>
<param name="module_srl" target="module_srl" />
<param name="category_srl" target="category_srl" />
<param name="parent_srl" target="parent_srl" />
<param name="title" target="category_title" />
<param name="expand" target="expand" />
<param name="group_srls" target="group_srls" />
</parameter>
<response callback_func="completeInsertCategory">
<tag name="error" />
<tag name="message" />
<tag name="page" />
<tag name="module_srl" />
<tag name="category_srl" />
<tag name="parent_srl" />
<tag name="xml_file" />
</response>
</filter>

View file

@ -0,0 +1,10 @@
<filter name="move_category" module="board" act="procBoardAdminMoveCategory" confirm_msg_code="confirm_move">
<form />
<parameter />
<response callback_func="completeMoveCategory">
<tag name="error" />
<tag name="message" />
<tag name="xml_file" />
<tag name="source_category_srl" />
</response>
</filter>

View file

@ -18,7 +18,7 @@
<!--@end-->
<li <!--@if($act=='dispBoardAdminBoardInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminBoardInfo')}">{$lang->cmd_view_info}</a></li>
<li <!--@if($act=='dispBoardAdminBoardAdditionSetup')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminBoardAdditionSetup')}">{$lang->cmd_addition_setup}</a></li>
<li <!--@if($act=='dispBoardAdminCategoryInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminCategoryInfo')}">{$lang->cmd_manage_category}</a></li>
<li <!--@if($act=='dispBoardAdminCategoryInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminCategoryInfo')}" onclick="winopen(this.href,'BoardMenu','width=850,height=800,resizable=yes,scrollbars=yes,toolbars=no');return false;">{$lang->cmd_manage_category}</a></li>
<li <!--@if($act=='dispBoardAdminGrantInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminGrantInfo')}">{$lang->cmd_manage_grant}</a></li>
<li <!--@if($act=='dispBoardAdminSkinInfo')-->class="on"<!--@end-->><a href="{getUrl('act','dispBoardAdminSkinInfo')}">{$lang->cmd_manage_skin}</a></li>
</ul>

View file

@ -51,7 +51,9 @@ function completeUpdateCategory(ret_obj) {
var page = ret_obj['page'];
alert(message);
location.href = current_url.setQuery('category_srl','');
var url = current_url.setQuery('module_srl',module_srl).setQuery('act','dispBoardAdminCategoryInfo');
if(page) url.setQuery('page',page);
location.href = url;
}
/* 권한 관련 */
@ -115,3 +117,155 @@ function doCartSetup(act_type) {
var url = current_url.setQuery('act',act_type).setQuery('module_srl','').setQuery('module_srls',module_srl.join(','));
location.href = url;
}
/**
* 카테고리 관리
**/
/* 빈 카테고리 아이템 추가 */
function doInsertCategory(parent_srl) {
if(typeof(parent_srl)=='undefined') parent_srl = 0;
var params = {node_srl:0, parent_srl:parent_srl}
doGetCategoryInfo(null, params);
deSelectNode();
}
/* 카테고리 클릭시 적용할 함수 */
function doGetCategoryInfo(category_id, obj) {
// category, category_id, node_srl을 추출
var fo_obj = xGetElementById("fo_category");
var module_srl = fo_obj.module_srl.value;
var node_srl = 0;
var parent_srl = 0;
if(typeof(obj)!="undefined") {
if(typeof(obj.getAttribute)!="undefined") {
node_srl = obj.getAttribute("node_srl");
} else {
node_srl = obj.node_srl;
parent_srl = obj.parent_srl;
}
}
var params = new Array();
params["category_srl"] = node_srl;
params["parent_srl"] = parent_srl;
params["module_srl"] = module_srl;
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
var response_tags = new Array('error','message','tpl');
exec_xml('board', 'getBoardAdminCategoryTplInfo', params, completeGetCategoryTplInfo, response_tags, params);
}
/* 서버로부터 받아온 카테고리 정보를 출력 */
xAddEventListener(document,'mousedown',checkMousePosition);
var _xPos = 0;
var _yPos = 0;
function checkMousePosition(e) {
var evt = new xEvent(e);
_xPos = evt.pageX;
_yPos = evt.pageY;
}
function hideCategoryInfo() {
var obj = xGetElementById('category_info');
obj.style.display = "none";
}
function completeGetCategoryTplInfo(ret_obj, response_tags) {
var obj = xGetElementById('category_info');
if(xScrollTop()>200) {
obj.style.marginTop = ( xScrollTop() - 210 )+'px';
} else {
obj.style.marginTop = '0px';
}
var tpl = ret_obj['tpl'];
xInnerHtml(obj, tpl);
obj.style.display = 'block';
var fo_obj = xGetElementById("fo_category");
fo_obj.category_title.focus();
}
/* 카테고리 아이템 입력후 */
function completeInsertCategory(ret_obj) {
var xml_file = ret_obj['xml_file'];
var category_srl = ret_obj['category_srl'];
var module_srl = ret_obj['module_srl'];
var parent_srl = ret_obj['parent_srl'];
if(!xml_file) return;
loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '',doGetCategoryInfo, category_srl, doMoveTree);
if(!category_srl) {
xInnerHtml("category_info", "");
} else {
var params = {node_srl:category_srl, parent_srl:parent_srl}
doGetCategoryInfo(null, params)
}
if(typeof('fixAdminLayoutFooter')=="function") fixAdminLayoutFooter();
}
/* 카테고리를 드래그하여 이동한 후 실행할 함수 , 이동하는 category_srl과 대상 category_srl을 받음 */
function doMoveTree(category_id, source_category_srl, target_category_srl) {
source_category_srl = source_category_srl.replace(/menu_category_/,'');
target_category_srl = target_category_srl.replace(/menu_category_/,'');
var p_fo_obj = xGetElementById("fo_category");
var fo_obj = xGetElementById("fo_move_category");
fo_obj.source_category_srl.value = source_category_srl;
fo_obj.target_category_srl.value = target_category_srl;
fo_obj.module_srl.value = p_fo_obj.module_srl.value;
// 이동 취소를 선택하였을 경우 다시 그림;;
if(!procFilter(fo_obj, move_category)) {
var params = new Array();
params["xml_file"] = xGetElementById('fo_category').xml_file.value;
params["source_category_srl"] = source_category_srl;
completeMoveCategory(params);
}
}
function completeMoveCategory(ret_obj) {
var source_category_srl = ret_obj['source_category_srl'];
var xml_file = ret_obj['xml_file'];
loadTreeMenu(xml_file, 'category', "zone_category", category_title, '', doGetCategoryInfo, source_category_srl, doMoveTree);
}
/* 카테고리 목록 갱신 */
function doReloadTreeCategory(module_srl) {
var params = new Array();
params["module_srl"] = module_srl;
// 서버에 요청하여 해당 노드의 정보를 수정할 수 있도록 한다.
var response_tags = new Array('error','message', 'xml_file');
exec_xml('board', 'procBoardAdminMakeXmlFile', params, completeInsertCategory, response_tags, params);
}
/* 카테고리 삭제 */
function doDeleteCategory(category_srl) {
var fo_obj = xGetElementById("fo_category");
if(!fo_obj) return;
procFilter(fo_obj, delete_category);
}
/* 카테고리 아이템 삭제 후 */
function completeDeleteCategory(ret_obj) {
var module_srl = ret_obj['module_srl'];
var category_srl = ret_obj['category_srl'];
var xml_file = ret_obj['xml_file'];
alert(ret_obj['message']);
loadTreeMenu(xml_file, 'category', 'zone_category', category_title, '', doGetCategoryInfo, category_srl, doMoveTree);
var obj = xGetElementById('category_info');
xInnerHtml(obj, "");
obj.style.display = 'none';
}

View file

@ -522,14 +522,36 @@
* @brief 카테고리 추가
**/
function insertCategory($obj) {
$obj->list_order = $obj->category_srl = getNextSequence();
// 특정 카테고리의 하단으로 추가시 정렬순서 재정렬
if($obj->parent_srl) {
// 부모 카테고리 구함
$oDocumentModel = &getModel('document');
$parent_category = $oDocumentModel->getCategory($obj->parent_srl);
$obj->list_order = $parent_category->list_order;
$this->updateCategoryListOrder($parent_category->module_srl, $parent_category->list_order+1);
if(!$obj->category_srl) $obj->category_srl = getNextSequence();
} else {
$obj->list_order = $obj->category_srl = getNextSequence();
}
$output = executeQuery('document.insertCategory', $obj);
if($output->toBool()) $output->add('category_srl', $obj->category_srl);
if($output->toBool()) {
$output->add('category_srl', $obj->category_srl);
$this->makeCategoryFile($obj->module_srl);
}
return $output;
}
/**
* @brief 특정 카테고리 부터 list_count 증가
**/
function updateCategoryListOrder($module_srl, $list_order) {
$args->module_srl = $module_srl;
$args->list_order = $list_order;
return executeQuery('document.updateCategoryOrder', $args);
}
/**
* @brief 카테고리에 문서의 숫자를 변경
**/
@ -550,7 +572,9 @@
* @brief 카테고리의 정보를 수정
**/
function updateCategory($obj) {
return executeQuery('document.updateCategory', $obj);
$output = executeQuery('document.updateCategory', $obj);
if($output->toBool()) $this->makeCategoryFile($obj->module_srl);
return $output;
}
/**
@ -559,17 +583,27 @@
**/
function deleteCategory($category_srl) {
$args->category_srl = $category_srl;
$oDocumentModel = &getModel('document');
$category_info = $oDocumentModel->getCategory($category_srl);
// 자식 카테고리가 있는지 체크하여 있으면 삭제 못한다는 에러 출력
$output = executeQuery('document.getChildCategoryCount', $args);
if(!$output->toBool()) return $output;
if($output->data->count>0) return new Object(-1, 'msg_cannot_delete_for_child');
// 카테고리 정보를 삭제
$output = executeQuery('document.deleteCategory', $args);
if(!$output->toBool()) return $output;
$this->makeCategoryFile($category_info->module_srl);
// 현 카테고리 값을 가지는 문서들의 category_srl을 0 으로 세팅
unset($args);
$args->target_category_srl = 0;
$args->source_category_srl = $category_srl;
$output = executeQuery('document.updateDocumentCategory', $args);
return $output;
}

View file

@ -387,7 +387,7 @@
if($node->group_srls) {
$group_srls = explode(',',$node->group_srls);
unset($node->group_srls);
$node->group_srls = explode(',',$node->group_srls);
$node->group_srls = $group_srls;
} else {
unset($node->group_srls);
$node->group_srls = array();

View file

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

View file

@ -0,0 +1,12 @@
<query id="updateCategoryOrder" action="update">
<tables>
<table name="document_categories" />
</tables>
<columns>
<column name="list_order" default="plus(1)" />
</columns>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" filter="number" notnull="notnull" />
<condition operation="more" column="list_order" var="list_order" filter="number" notnull="notnull" pipe="and" />
</conditions>
</query>

View file

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