diff --git a/config/config.php b/config/config.php index 6935b8fcec..8820ae3218 100644 --- a/config/config.php +++ b/config/config.php @@ -169,6 +169,7 @@ define('TABLE_EXTENSION', '`' . $config->db->prefix . 'extension`'); define('TABLE_CRON', '`' . $config->db->prefix . 'cron`'); define('TABLE_MAILQUEUE', '`' . $config->db->prefix . 'mailqueue`'); define('TABLE_BLOCK', '`' . $config->db->prefix . 'block`'); +define('TABLE_DOCCONTENT', '`' . $config->db->prefix . 'doccontent`'); if(!defined('TABLE_LANG')) define('TABLE_LANG', '`' . $config->db->prefix . 'lang`'); $config->objectTables['product'] = TABLE_PRODUCT; diff --git a/db/update8.2.6.sql b/db/update8.2.6.sql index ee611ba304..71dc76120d 100644 --- a/db/update8.2.6.sql +++ b/db/update8.2.6.sql @@ -2,3 +2,22 @@ ALTER TABLE `zt_doclib` ADD `product` mediumint(8) unsigned NOT NULL AFTER `id`, ADD `project` mediumint(8) unsigned NOT NULL AFTER `product`, ADD `groups` varchar(255) COLLATE 'utf8_general_ci' NOT NULL AFTER `name`, ADD `users` text COLLATE 'utf8_general_ci' NOT NULL AFTER `groups`; + +CREATE TABLE IF NOT EXISTS `zt_doccontent` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `doc` mediumint(8) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `digest` varchar(255) NOT NULL, + `content` text NOT NULL, + `files` text NOT NULL, + `type` varchar(10) NOT NULL, + `version` smallint(5) unsigned NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `doc_version` (`doc`,`version`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +ALTER TABLE `zt_doc` ADD `version` smallint unsigned NOT NULL DEFAULT '1' AFTER `editedDate`; +ALTER TABLE `zt_doc` ADD `groups` varchar(255) NOT NULL AFTER `editedDate`, +ADD `users` text NOT NULL AFTER `groups`; +ALTER TABLE `zt_doc` DROP `type`; +ALTER TABLE `zt_doclib` ADD `acl` varchar(10) COLLATE 'utf8_general_ci' NOT NULL DEFAULT 'public' AFTER `name`; +ALTER TABLE `zt_doc` ADD `acl` varchar(10) NOT NULL DEFAULT 'public' AFTER `editedDate`; diff --git a/module/doc/config.php b/module/doc/config.php index c2f4da974e..e71b77984a 100644 --- a/module/doc/config.php +++ b/module/doc/config.php @@ -13,7 +13,7 @@ $config->doc->create->requiredFields = 'title'; $config->doc->edit->requiredFields = 'title'; $config->doc->editor = new stdclass(); -$config->doc->editor->create = array('id' => 'content', 'tools' => 'fullTools'); +$config->doc->editor->create = array('id' => 'content,digest', 'tools' => 'fullTools'); $config->doc->editor->edit = array('id' => 'content,digest,comment', 'tools' => 'fullTools'); $config->doc->search['module'] = 'doc'; @@ -22,28 +22,22 @@ $config->doc->search['fields']['id'] = $lang->doc->id; $config->doc->search['fields']['keywords'] = $lang->doc->keywords; $config->doc->search['fields']['product'] = $lang->doc->product; $config->doc->search['fields']['project'] = $lang->doc->project; -$config->doc->search['fields']['type'] = $lang->doc->type; $config->doc->search['fields']['module'] = $lang->doc->module; $config->doc->search['fields']['lib'] = $lang->doc->lib; -$config->doc->search['fields']['digest'] = $lang->doc->digest; -$config->doc->search['fields']['content'] = $lang->doc->content; -$config->doc->search['fields']['url'] = $lang->doc->url; $config->doc->search['fields']['addedBy'] = $lang->doc->addedBy; $config->doc->search['fields']['addedDate'] = $lang->doc->addedDate; $config->doc->search['fields']['editedBy'] = $lang->doc->editedBy; $config->doc->search['fields']['editedDate'] = $lang->doc->editedDate; +$config->doc->search['fields']['version'] = $lang->doc->version; $config->doc->search['params']['title'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); $config->doc->search['params']['keywords'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); $config->doc->search['params']['product'] = array('operator' => '=', 'control' => 'select', 'values' => ''); $config->doc->search['params']['module'] = array('operator' => '=', 'control' => 'select', 'values' => ''); $config->doc->search['params']['project'] = array('operator' => '=', 'control' => 'select', 'values' => ''); -$config->doc->search['params']['type'] = array('operator' => '=', 'control' => 'select', 'values' => $lang->doc->types); $config->doc->search['params']['lib'] = array('operator' => '=', 'control' => 'select', 'values' => '' ); -$config->doc->search['params']['digest'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); -$config->doc->search['params']['content'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); -$config->doc->search['params']['url'] = array('operator' => 'include', 'control' => 'input', 'values' => ''); $config->doc->search['params']['addedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); $config->doc->search['params']['addedDate'] = array('operator' => '>=', 'control' => 'input', 'values' => '', 'class' => 'date'); $config->doc->search['params']['editedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users'); $config->doc->search['params']['editedDate'] = array('operator' => '>=', 'control' => 'input', 'values' => '', 'class' => 'date'); +$config->doc->search['params']['version'] = array('operator' => '=', 'control' => 'input', 'values' => ''); diff --git a/module/doc/control.php b/module/doc/control.php index d81014ace0..3db90c4e52 100644 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -234,16 +234,13 @@ class doc extends control */ public function create($libID, $moduleID = 0, $productID = 0, $projectID = 0, $from = 'doc') { - $projectID = (int)$projectID; - $lib = $this->doc->getLibByID($libID); - $type = $lib->product ? 'product' : ($lib->project ? 'project' : 'custom'); - $this->libs = $this->doc->getLibs($type); if(!empty($_POST)) { $docResult = $this->doc->create(); if(!$docResult or dao::isError()) die(js::error(dao::getError())); $docID = $docResult['id']; + $lib = $this->doc->getLibByID($this->post->lib); if($docResult['status'] == 'exists') { echo js::alert(sprintf($this->lang->duplicate, $this->lang->doc->common)); @@ -251,34 +248,33 @@ class doc extends control } $this->action->create('doc', $docID, 'Created'); - if($from == 'product') $link = $this->createLink('product', 'doc', "productID={$this->post->product}"); - if($from == 'project') $link = $this->createLink('project', 'doc', "projectID={$this->post->project}"); + if($from == 'product') $link = $this->createLink('product', 'doc', "productID={$lib->product}"); + if($from == 'project') $link = $this->createLink('project', 'doc', "projectID={$lib->project}"); if($from == 'doc') { - $productID = intval($this->post->product); - $projectID = intval($this->post->project); - $vars = "libID=$libID&moduleID={$this->post->module}&productID=$productID&projectID=$projectID"; + $vars = "libID=$libID&browseType=byModule&moduleID={$this->post->module}"; $link = $this->createLink('doc', 'browse', $vars); } die(js::locate($link, 'parent')); } - $this->loadModel('product'); - $this->loadModel('project'); + $lib = $this->doc->getLibByID($libID); + $type = $lib->product ? 'product' : ($lib->project ? 'project' : 'custom'); + $this->libs = $this->doc->getLibs($type); /* According the from, set menus. */ if($from == 'product') { $this->lang->doc->menu = $this->lang->product->menu; $this->lang->doc->menuOrder = $this->lang->product->menuOrder; - $this->product->setMenu($this->product->getPairs(), $productID); + $this->product->setMenu($this->product->getPairs(), $lib->product); $this->lang->set('menugroup.doc', 'product'); } elseif($from == 'project') { $this->lang->doc->menu = $this->lang->project->menu; $this->lang->doc->menuOrder = $this->lang->project->menuOrder; - $this->project->setMenu($this->project->getPairs('nocode'), $projectID); + $this->project->setMenu($this->project->getPairs('nocode'), $lib->project); $this->lang->set('menugroup.doc', 'project'); } else @@ -286,28 +282,14 @@ class doc extends control $this->doc->setMenu($this->libs, $libID); } - /* Get the modules. */ - if($libID == 'product' or $libID == 'project') + $libs = $this->libs; + if($productID) { - $moduleOptionMenu = $this->tree->getOptionMenu(0, $libID . 'doc', $startModuleID = 0); + $libs = $this->doc->getLibsByObject('product', $productID, 'onlylib'); } - else + elseif($projectID) { - $moduleOptionMenu = $this->tree->getOptionMenu($libID, 'customdoc', $startModuleID = 0); - } - - $products = $projectID == 0 ? $this->product->getPairs() : $this->project->getProducts($projectID, false); - if($libID == 'product' and empty($products)) - { - echo js::alert($this->lang->doc->errorEmptyProduct); - die(js::locate('back')); - } - - $projects = $this->project->getPairs('all'); - if($libID == 'project' and empty($projects)) - { - echo js::alert($this->lang->doc->errorEmptyProject); - die(js::locate('back')); + $libs = $this->doc->getLibsByObject('project', $projectID, 'onlylib'); } $this->view->title = $this->libs[$libID] . $this->lang->colon . $this->lang->doc->create; @@ -315,12 +297,12 @@ class doc extends control $this->view->position[] = $this->lang->doc->create; $this->view->libID = $libID; - $this->view->moduleOptionMenu = $moduleOptionMenu; + $this->view->libs = $libs; + $this->view->moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0); $this->view->moduleID = $moduleID; - $this->view->productID = $productID; - $this->view->projectID = $projectID; - $this->view->products = $products; - $this->view->projects = $projects; + $this->view->type = $type; + $this->view->groups = $this->loadModel('group')->getPairs(); + $this->view->users = $this->user->getPairs('nocode'); $this->display(); } @@ -336,9 +318,10 @@ class doc extends control { if(!empty($_POST)) { - $changes = $this->doc->update($docID); + $result = $this->doc->update($docID); if(dao::isError()) die(js::error(dao::getError())); - $files = $this->loadModel('file')->saveUpload('doc', $docID); + $changes = $result['changes']; + $files = $result['files']; if($this->post->comment != '' or !empty($changes) or !empty($files)) { $action = !empty($changes) ? 'Edited' : 'Commented'; @@ -353,28 +336,22 @@ class doc extends control /* Get doc and set menu. */ $doc = $this->doc->getById($docID); $libID = $doc->lib; - $this->doc->setMenu($this->libs, $libID); - /* Get modules. */ - if($libID == 'product' or $libID == 'project') - { - $moduleOptionMenu = $this->tree->getOptionMenu(0, $libID . 'doc', $startModuleID = 0); - } - else - { - $moduleOptionMenu = $this->tree->getOptionMenu($libID, 'customdoc', $startModuleID = 0); - } + $lib = $this->doc->getLibByID($libID); + $type = $lib->product ? 'product' : ($lib->project ? 'project' : 'custom'); + $this->libs = $this->doc->getLibs($type); + $this->doc->setMenu($this->libs, $libID); $this->view->title = $this->libs[$libID] . $this->lang->colon . $this->lang->doc->edit; $this->view->position[] = html::a($this->createLink('doc', 'browse', "libID=$libID"), $this->libs[$libID]); $this->view->position[] = $this->lang->doc->edit; $this->view->doc = $doc; - $this->view->libID = $libID; $this->view->libs = $this->libs; - $this->view->moduleOptionMenu = $moduleOptionMenu; - $this->view->products = $doc->project == 0 ? $this->product->getPairs() : $this->project->getProducts($doc->project, false); - $this->view->projects = $this->loadModel('project')->getPairs('all'); + $this->view->moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0); + $this->view->type = $type; + $this->view->groups = $this->loadModel('group')->getPairs(); + $this->view->users = $this->user->getPairs('nocode'); $this->display(); } @@ -385,27 +362,19 @@ class doc extends control * @access public * @return void */ - public function view($docID) + public function view($docID, $version = 0) { /* Get doc. */ - $doc = $this->doc->getById($docID, true); + $doc = $this->doc->getById($docID, $version, true); if(!$doc) die(js::error($this->lang->notFound) . js::locate('back')); /* Check priv when lib is product or project. */ - $systemLib = ($doc->lib == 'project' or $doc->lib == 'product') ? $doc->lib : ''; - if($systemLib and $doc->{$systemLib} and !$this->{$systemLib}->checkPriv($this->{$systemLib}->getById($doc->{$systemLib}))) - { - echo(js::alert($this->lang->error->accessDenied)); - die(js::locate('back')); - } - - /* Get library. */ - $lib = $doc->libName; - if($doc->lib == 'product') $lib = $doc->productName; - if($doc->lib == 'project') $lib = $doc->productName . $this->lang->arrow . $doc->projectName; + $lib = $this->doc->getLibByID($doc->lib); + $type = $lib->product ? 'product' : ($lib->project ? 'project' : 'custom'); + $this->libs = $this->doc->getLibs($type); /* Set menu. */ - $this->doc->setMenu($this->libs, $doc->lib); + $this->doc->setMenu($this->libs, $doc->lib, $type); $this->view->title = "DOC #$doc->id $doc->title - " . $this->libs[$doc->lib]; $this->view->position[] = html::a($this->createLink('doc', 'browse', "libID=$doc->lib"), $this->libs[$doc->lib]); @@ -413,6 +382,8 @@ class doc extends control $this->view->doc = $doc; $this->view->lib = $lib; + $this->view->type = $type; + $this->view->version = $version ? $version : $doc->version; $this->view->actions = $this->loadModel('action')->getList('doc', $docID); $this->view->users = $this->user->getPairs('noclosed,noletter'); $this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('doc', $docID); @@ -508,6 +479,19 @@ class doc extends control $this->display(); } + /** + * Ajax get modules by libID. + * + * @param int $libID + * @access public + * @return void + */ + public function ajaxGetModules($libID) + { + $moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0); + die(html::select('module', $moduleOptionMenu, 0, "class='form-control'")); + } + /** * Show all libs by type. * diff --git a/module/doc/css/view.css b/module/doc/css/view.css index b880b028b4..4f675fa44a 100644 --- a/module/doc/css/view.css +++ b/module/doc/css/view.css @@ -1,3 +1 @@ -.file-content fieldset .files-list{font-size:16px;} -.file-content fieldset .files-list i.icon-file-text{font-size:16px;} #url-content{v:expressio !important} diff --git a/module/doc/js/common.js b/module/doc/js/common.js index 171519c944..0577677165 100644 --- a/module/doc/js/common.js +++ b/module/doc/js/common.js @@ -1,34 +1,23 @@ -/* Load the products of the roject. */ -function loadProducts(project) +function loadModules(libID) { - link = createLink('project', 'ajaxGetProducts', 'projectID=' + project); - $('#productBox').load(link, function(){$('#productBox').find('select').chosen(defaultChosenOptions)}); + link = createLink('doc', 'ajaxGetModules', 'libID=' + libID); + $('#moduleBox').load(link, function(){$('#moduleBox').find('select').chosen(defaultChosenOptions)}); } -/* Set doc type. */ -function setType(type) +function toggleAcl(acl) { - if(type == 'url') + if(acl == 'custom') { - $('#urlBox').show(); - $('#fileBox').hide(); - $('#contentBox').hide(); - } - else if(type == 'text') - { - $('#urlBox').hide(); - $('#fileBox').hide(); - $('#contentBox').show(); + $('#whiteListBox').removeClass('hidden'); } else { - $('#urlBox').hide(); - $('#fileBox').show(); - $('#contentBox').hide(); + $('#whiteListBox').addClass('hidden'); } } $(document).ready(function() { + $('[data-id="create"] a').modalTrigger({type: 'iframe', width: 800}); if(typeof(type) != 'undefined') $('#modulemenu .nav li[data-id="' + type + '"]').addClass('active'); }); diff --git a/module/doc/js/create.js b/module/doc/js/create.js index af308440d6..424fa8a892 100644 --- a/module/doc/js/create.js +++ b/module/doc/js/create.js @@ -1 +1,4 @@ -loadProducts($('#project').val()); +$(function() +{ + toggleAcl($('#acl').val()); +}) diff --git a/module/doc/js/createlib.js b/module/doc/js/createlib.js index e50c342b91..30445cd5b5 100644 --- a/module/doc/js/createlib.js +++ b/module/doc/js/createlib.js @@ -19,4 +19,5 @@ $(function() $('table tr.project').addClass('hidden'); } }) + toggleAcl($('#acl').val()); }); diff --git a/module/doc/js/edit.js b/module/doc/js/edit.js index 70afdd7caf..424fa8a892 100644 --- a/module/doc/js/edit.js +++ b/module/doc/js/edit.js @@ -1,49 +1,4 @@ -function loadModule(lib) -{ - if(lib == 'product') - { - type = 'productdoc'; - root = 0; - } - else if(lib == 'project') - { - type = 'projectdoc'; - root = 0; - } - else - { - type = 'customdoc'; - root = lib; - } - - $.get(createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + root + '&viewType=' + type), function(data) - { - $('#module').closest('td').html(data); - $("#module").removeAttr('onchange'); - $("#module").chosen(defaultChosenOptions); - }); -} - -function changeByLib(lib) -{ - if(lib == 'product') - { - $('#product').closest('tr').show(); - $('#project').closest('tr').hide(); - } - else if(lib == 'project') - { - $('#product').closest('tr').show(); - $('#project').closest('tr').show(); - } - else - { - $('#product').closest('tr').hide(); - $('#project').closest('tr').hide(); - } -} - $(function() { - changeByLib($('#lib').val()); + toggleAcl($('#acl').val()); }) diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php index 6c39847923..22faacb2bd 100644 --- a/module/doc/lang/zh-cn.php +++ b/module/doc/lang/zh-cn.php @@ -28,9 +28,11 @@ $lang->doc->addedBy = '由谁添加'; $lang->doc->addedDate = '添加时间'; $lang->doc->editedBy = '由谁编辑'; $lang->doc->editedDate = '编辑时间'; +$lang->doc->version = '版本号'; $lang->doc->basicInfo = '基本信息'; $lang->doc->deleted = '已删除'; $lang->doc->fileObject = '所属对象'; +$lang->doc->whiteList = '白名单'; $lang->doc->moduleDoc = '按模块浏览'; $lang->doc->searchDoc = '搜索'; @@ -64,9 +66,9 @@ $lang->doc->libTypeList['custom'] = '自定义文档库'; $lang->doc->systemLibs['product'] = $lang->productCommon . '文档库'; $lang->doc->systemLibs['project'] = $lang->projectCommon . '文档库'; -$lang->doc->types['file'] = '文件'; -$lang->doc->types['url'] = '链接'; -$lang->doc->types['text'] = '网页'; +$lang->doc->aclList['public'] = '公开'; +$lang->doc->aclList['custom'] = '自定义'; +$lang->doc->aclList['private'] = '私有'; $lang->doc->confirmDelete = "您确定删除该文档吗?"; $lang->doc->confirmDeleteLib = "您确定删除该文档库吗?"; @@ -74,13 +76,16 @@ $lang->doc->errorEditSystemDoc = "系统文档库无需修改。"; $lang->doc->errorEmptyProduct = "没有{$lang->productCommon},无法创建文档"; $lang->doc->errorEmptyProject = "没有{$lang->projectCommon},无法创建文档"; $lang->doc->errorEmptySysLib = "系统文档库不能全部删除!"; +$lang->doc->accessDenied = "您没有权限访问该文档库!"; +$lang->doc->noMatched = '找不到包含"%s"的文档库'; $lang->doc->placeholder = new stdclass(); $lang->doc->placeholder->url = '相应的链接地址'; $lang->doclib = new stdclass(); -$lang->doclib->name = '文档库名称'; -$lang->doclib->acl = '文档库权限'; -$lang->doclib->group = '分组'; -$lang->doclib->user = '用户'; +$lang->doclib->name = '文档库名称'; +$lang->doclib->control = '访问控制'; +$lang->doclib->acl = '权限'; +$lang->doclib->group = '分组'; +$lang->doclib->user = '用户'; $lang->doclib->files = '附件库'; diff --git a/module/doc/model.php b/module/doc/model.php index 6f879a8b0f..c2e94b40da 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -26,6 +26,15 @@ class docModel extends model { $currentModule = 'doc'; $currentMethod = 'browse'; + if($libID) + { + $lib = $this->getLibById($libID); + if(!$this->checkPriv($lib)) + { + echo(js::alert($this->lang->doc->accessDenied)); + die(js::locate('back')); + } + } $selectHtml = "{$libs[$libID]}