* @package doc * @version $Id: model.php 881 2010-06-22 06:50:32Z chencongzhi520 $ * @link http://www.zentao.net */ ?> {$libs[$libID]}
"; common::setMenuVars($this->lang->doc->menu, 'list', $selectHtml); foreach($this->lang->doc->menu as $key => $menu) { if($key != 'list') common::setMenuVars($this->lang->doc->menu, $key, $libID); } } /** * Get library by id. * * @param int $libID * @access public * @return object */ public function getLibById($libID) { return $this->dao->findByID($libID)->from(TABLE_DOCLIB)->fetch(); } /** * Get libraries. * * @access public * @return array */ public function getLibs($type = '') { if($type == 'product' or $type == 'project') { $stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where($type)->ne(0)->andWhere('deleted')->eq(0)->query(); } else { $stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere('product')->eq('0')->andWhere('project')->eq(0)->query(); } $libPairs = array(); while($lib = $stmt->fetch()) { if($this->checkPriv($lib)) $libPairs[$lib->id] = $lib->name; } return $libPairs; } /** * Create a library. * * @access public * @return void */ public function createLib() { $lib = fixer::input('post')->get(); $this->dao->insert(TABLE_DOCLIB) ->data($lib) ->autoCheck() ->batchCheck('name', 'notempty') ->check('name', 'unique') ->exec(); return $this->dao->lastInsertID(); } /** * Update a library. * * @param int $libID * @access public * @return void */ public function updateLib($libID) { $libID = (int)$libID; $oldLib = $this->getLibById($libID); $lib = fixer::input('post')->get(); $this->dao->update(TABLE_DOCLIB) ->data($lib) ->autoCheck() ->batchCheck('name', 'notempty') ->check('name', 'unique', "id != $libID") ->where('id')->eq($libID) ->exec(); if(!dao::isError()) return common::createChanges($oldLib, $lib); } /** * Get docs by browse type. * * @param int $productID * @param int $projectID * @param string $browseType * @param string $libID * @param int $queryID * @param int $moduleID * @param string $sort * @param object $pager * @access public * @return array */ public function getDocsByBrowseType($libID, $browseType, $queryID, $moduleID, $sort, $pager) { if($browseType == "bymodule") { $modules = 0; if($moduleID) $modules = $this->loadModel('tree')->getAllChildId($moduleID); $docs = $this->getDocs($libID, $modules, $sort, $pager); } elseif($browseType == "bysearch") { if($queryID) { $query = $this->loadModel('search')->getQuery($queryID); if($query) { $this->session->set('docQuery', $query->sql); $this->session->set('docForm', $query->form); } else { $this->session->set('docQuery', ' 1 = 1'); } } else { if($this->session->docQuery == false) $this->session->set('docQuery', ' 1 = 1'); } $docQuery = str_replace("`product` = 'all'", '1', $this->session->docQuery); // Search all producti. $docQuery = str_replace("`project` = 'all'", '1', $docQuery); // Search all project. $docs = $this->dao->select('*')->from(TABLE_DOC)->where($docQuery)->andWhere('deleted')->eq(0)->orderBy($sort)->page($pager)->fetchAll(); } $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'doc'); if($docs) return $docs; return array(); } /** * Get docs. * * @param int|string $libID * @param int $productID * @param int $projectID * @param int $module * @param string $orderBy * @param object $pager * @access public * @return void */ public function getDocs($libID, $module, $orderBy, $pager) { return $this->dao->select('*')->from(TABLE_DOC) ->where('deleted')->eq(0) ->andWhere('lib')->in($libID) ->beginIF($module)->andWhere('module')->in($module)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll(); } /** * Get doc info by id. * * @param int $docID * @param bool $setImgSize * @access public * @return void */ public function getById($docID, $setImgSize = false) { $doc = $this->dao->select('*') ->from(TABLE_DOC) ->where('id')->eq((int)$docID) ->fetch(); if(!$doc) return false; if($setImgSize) $doc->content = $this->loadModel('file')->setImgSize($doc->content); $doc->files = $this->loadModel('file')->getByObject('doc', $docID); $doc->libName = ''; $doc->productName = ''; $doc->projectName = ''; $doc->moduleName = ''; if($doc->lib) $doc->libName = $this->dao->findByID($doc->lib)->from(TABLE_DOCLIB)->fetch('name'); if($doc->product) $doc->productName = $this->dao->findByID($doc->product)->from(TABLE_PRODUCT)->fetch('name'); if($doc->project) $doc->projectName = $this->dao->findByID($doc->project)->from(TABLE_PROJECT)->fetch('name'); if($doc->module) $doc->moduleName = $this->dao->findByID($doc->module)->from(TABLE_MODULE)->fetch('name'); return $doc; } /** * Create a doc. * * @access public * @return void */ public function create() { $now = helper::now(); $doc = fixer::input('post') ->add('addedBy', $this->app->user->account) ->add('addedDate', $now) ->setDefault('product, project, module', 0) ->stripTags($this->config->doc->editor->create['id'], $this->config->allowedTags) ->encodeURL('url') ->cleanInt('product, project, module') ->remove('files, labels') ->get(); $condition = "lib = '$doc->lib' AND module = $doc->module"; $result = $this->loadModel('common')->removeDuplicate('doc', $doc, $condition); if($result['stop']) return array('status' => 'exists', 'id' => $result['duplicate']); $doc = $this->loadModel('file')->processEditor($doc, $this->config->doc->editor->create['id']); $this->dao->insert(TABLE_DOC) ->data($doc) ->autoCheck() ->batchCheck($this->config->doc->create->requiredFields, 'notempty') ->check('title', 'unique', $condition) ->exec(); if(!dao::isError()) { $docID = $this->dao->lastInsertID(); $this->loadModel('file')->saveUpload('doc', $docID); return array('status' => 'new', 'id' => $docID); } return false; } /** * Update a doc. * * @param int $docID * @access public * @return void */ public function update($docID) { $oldDoc = $this->getById($docID); $now = helper::now(); $doc = fixer::input('post') ->cleanInt('module') ->setDefault('module', 0) ->setIF($this->post->lib == 'product', 'project', 0) ->setIF(($this->post->lib != 'product' and $this->post->lib != 'project'), 'project', 0) ->setIF(($this->post->lib != 'product' and $this->post->lib != 'project'), 'product', 0) ->stripTags($this->config->doc->editor->edit['id'], $this->config->allowedTags) ->encodeURL('url') ->add('editedBy', $this->app->user->account) ->add('editedDate', $now) ->remove('comment,files, labels') ->get(); $condition = "lib = '$doc->lib' AND module = $doc->module AND id != $docID"; $doc = $this->loadModel('file')->processEditor($doc, $this->config->doc->editor->edit['id']); $this->dao->update(TABLE_DOC)->data($doc) ->autoCheck() ->batchCheck($this->config->doc->edit->requiredFields, 'notempty') ->check('title', 'unique', $condition) ->where('id')->eq((int)$docID) ->exec(); if(!dao::isError()) return common::createChanges($oldDoc, $doc); } /** * Build search form. * * @param string $libID * @param array $libs * @param int $queryID * @param string $actionURL * @access public * @return void */ public function buildSearchForm($libID, $libs, $queryID, $actionURL, $type) { $this->config->doc->search['actionURL'] = $actionURL; $this->config->doc->search['queryID'] = $queryID; $this->config->doc->search['params']['product']['values'] = array(''=>'') + $this->loadModel('product')->getPairs('nocode') + array('all'=>$this->lang->doc->allProduct); $this->config->doc->search['params']['project']['values'] = array(''=>'') + $this->loadModel('project')->getPairs('nocode') + array('all'=>$this->lang->doc->allProject); $this->config->doc->search['params']['lib']['values'] = array(''=>'') + $libs; $this->config->doc->search['params']['type']['values'] = array(''=>'') + $this->config->doc->search['params']['type']['values']; /* Get the modules. */ if($type == 'product' or $type == 'project') { $moduleOptionMenu = $this->loadModel('tree')->getOptionMenu(0, $libID . 'doc', $startModuleID = 0); } else { $moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($libID, 'customdoc', $startModuleID = 0); } $this->config->doc->search['params']['module']['values'] = $moduleOptionMenu; $this->loadModel('search')->setSearchParams($this->config->doc->search); } /** * Get docs of a product. * * @param int $productID * @access public * @return array */ public function getProductDocs($productID) { return $this->dao->select('t1.*, t2.name as module') ->from(TABLE_DOC)->alias('t1') ->leftjoin(TABLE_MODULE)->alias('t2')->on('t1.module = t2.id') ->where('t1.product')->eq($productID) ->andWhere('t1.deleted')->eq(0) ->orderBy('t1.id_desc') ->fetchAll(); } /** * Get docs of a project. * * @param int $projectID * @access public * @return array */ public function getProjectDocs($projectID) { return $this->dao->findByProject($projectID)->from(TABLE_DOC)->andWhere('deleted')->eq(0)->orderBy('id_desc')->fetchAll(); } /** * Get pairs of product modules. * * @access public * @return array */ public function getProductModulePairs() { return $this->dao->findByType('productdoc')->from(TABLE_MODULE)->fetchPairs('id', 'name'); } /** * Get pairs of project modules. * * @access public * @return array */ public function getProjectModulePairs() { return $this->dao->findByType('projectdoc')->from(TABLE_MODULE)->andWhere('type')->eq('projectdoc')->fetchPairs('id', 'name'); } /** * Get doc tree menu. * * @param string $libID * @access public * @return array */ public function getDocTreeMenu($libID) { if($libID == 'product') { $moduleTree = $this->loadModel('tree')->getProductDocTreeMenu(); } elseif($libID == 'project') { $moduleTree = $this->loadModel('tree')->getProjectDocTreeMenu(); } else { $moduleTree = $this->loadModel('tree')->getTreeMenu($libID, $viewType = 'customdoc', $startModuleID = 0, array('treeModel', 'createDocLink')); } return $moduleTree; } /** * Extract css styles for tables created in kindeditor. * * Like this: * * @param string $content * @access public * @return void */ public function extractKETableCSS($content) { $css = ''; $rule = '/
', '', $attributeValue)); } if(!isset($class)) continue; $className = $class; $borderSize = isset($border) ? $border . 'px' : '1px'; $borderColor = isset($bordercolor) ? $bordercolor : 'gray'; $borderStyle = "{border:$borderSize $borderColor solid}\n"; $css .= ".$className$borderStyle"; $css .= ".$className td$borderStyle"; } } return $css; } /** * Check priv. * * @param object $docLib * @access public * @return bool */ public function checkPriv($docLib) { if(empty($docLib->groups) and empty($docLib->users)) return true; $account = ',' . $this->app->user->account . ','; if(strpos($this->app->company->admins, $account) !== false) return true; if(strpos(",$docLib->users,", $account) !== false) return true; $userGroups = $this->app->user->groups; foreach($userGroups as $groupID) { if(strpos(",$docLib->groups,", ",$groupID,") !== false) return true; } return false; } /** * Get doc link. * * @param string $module * @param string $method * @param string $extra * @access public * @return string */ public function getDocLink($module, $method, $extra = '') { return helper::createLink($module, $method, "type=custom&libID=%s"); } /** * Get all libs by type. * * @param string $type * @param int $pager * @param string $extra * @access public * @return void */ public function getAllLibs($type, $pager = null, $extra = '') { if($extra) { parse_str($extra); if(isset($product) and $type == 'project') $projects = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('product')->eq($product)->fetchPairs('project', 'project'); } $key = ($type == 'product' or $type == 'project') ? $type : 'id'; $stmt = $this->dao->select("DISTINCT $key")->from(TABLE_DOCLIB)->where('deleted')->eq(0); if($type == 'product' or $type == 'project') { $stmt = $stmt->andWhere($type)->ne(0); } else { $stmt = $stmt->andWhere('project')->eq(0)->andWhere('product')->eq(0); } if(isset($projects)) $stmt = $stmt->andWhere('project')->in($projects); $condition = ''; $account = ',' . $this->app->user->account . ','; if(strpos($this->app->company->admins, $account) === false) { $condition .= "(groups='' and users='')"; foreach($this->app->user->groups as $groupID) $condition .= " OR (CONCAT(',', groups, ',') like '%,$groupID,%')"; $condition .= " OR (CONCAT(',', users, ',') like '%$account%')"; } $idList = $stmt->beginIF($condition)->andWhere("($condition)")->fi()->orderBy("{$key}_desc")->page($pager)->fetchPairs($key, $key); if($type == 'product' or $type == 'project') { $table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT; $libs = $this->dao->select('id,name')->from($table)->where('id')->in($idList)->orderBy('`order` desc, id desc')->fetchAll('id'); } else { $libs = $this->dao->select('id,name')->from(TABLE_DOCLIB)->where('id')->in($idList)->orderBy('id desc')->fetchAll('id'); } return $libs; } /** * Get limit libs. * * @param string $type * @param int $limit * @access public * @return array */ public function getLimitLibs($type, $limit = 6) { if($type == 'product' or $type == 'project') { $stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere($type)->ne(0)->orderBy("$type desc")->query(); } else { $stmt = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere('project')->eq(0)->andWhere('product')->eq(0)->orderBy('id desc')->query(); } $i = 1; $libs = array(); while($docLib = $stmt->fetch()) { if($i > $limit) break; $key = ($type == 'product' or $type == 'project') ? $type : 'id'; if($this->checkPriv($docLib) and !isset($libs[$docLib->$key])) { $libs[$docLib->$key] = $docLib->name; $i++; } } if($type == 'product' or $type == 'project') { $table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT; $libs = $this->dao->select('id,name')->from($table)->where('id')->in(array_keys($libs))->orderBy('`order` desc, id desc')->fetchAll('id'); } return $libs; } /** * Get project or product libs groups. * * @param string $type * @param array $idList * @param int $limit * @access public * @return array */ public function getSubLibGroups($type, $idList, $limit = 3) { $libGroups = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere($type)->in($idList)->orderBy('id desc')->fetchGroup($type, 'id'); if($type == 'product') { $hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') ->where('t1.product')->in($idList) ->andWhere('t2.deleted')->eq(0) ->fetchPairs('product', 'product'); } $buildGroups = array(); foreach($libGroups as $objectID => $libs) { $i = 1; foreach($libs as $lib) { if($limit and $i > $limit) break; if($this->checkPriv($lib)) { $buildGroups[$objectID][$lib->id] = $lib->name; $i++; } } if($type == 'product' and isset($hasProject[$objectID])) $buildGroups[$objectID]['project'] = $this->lang->doc->systemLibs['project']; } return $buildGroups; } /** * Get libs by object. * * @param string $type * @param int $objectID * @access public * @return array */ public function getLibsByObject($type, $objectID) { $objectLibs = $this->dao->select('*')->from(TABLE_DOCLIB)->where('deleted')->eq(0)->andWhere($type)->eq($objectID)->orderBy('id desc')->fetchAll('id'); if($type == 'product') { $hasProject = $this->dao->select('DISTINCT product')->from(TABLE_PROJECTPRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') ->where('t1.product')->eq($objectID) ->andWhere('t2.deleted')->eq(0) ->fetchPairs('product', 'product'); } $libs = array(); foreach($objectLibs as $lib) { if($this->checkPriv($lib)) $libs[$lib->id] = $lib->name; } if($type == 'product' and isset($hasProject[$objectID])) $libs['project'] = $this->lang->doc->systemLibs['project']; return $libs; } }