From 2f83bc3034538628328744ea73f58fb76262f1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E9=87=91=E5=8B=87?= Date: Fri, 15 Dec 2023 11:04:00 +0800 Subject: [PATCH] * Refactor group: format functions, remove unused functions. --- module/group/control.php | 629 +------ module/group/lang/de.php | 2 +- module/group/lang/en.php | 2 +- module/group/lang/fr.php | 2 +- module/group/lang/vi.php | 2 +- module/group/lang/zh-cn.php | 2 +- module/group/lang/zh-tw.php | 2 +- module/group/model.php | 1647 +---------------- module/group/test/group.class.php | 137 +- .../test/model/checkModuleAndPackageTree.php | 20 - module/group/test/model/checkmenumodule.php | 21 - module/group/test/model/editpriv.php | 22 - .../test/model/getaccessprogramgroup.php | 20 - module/group/test/model/getbyaccounts.php | 43 - module/group/test/model/getmenumodules.php | 25 - module/group/test/model/getpriv.php | 20 - module/group/test/model/getuserprograms.php | 27 - module/group/zen.php | 81 + 18 files changed, 148 insertions(+), 2556 deletions(-) delete mode 100644 module/group/test/model/checkModuleAndPackageTree.php delete mode 100755 module/group/test/model/checkmenumodule.php delete mode 100644 module/group/test/model/editpriv.php delete mode 100755 module/group/test/model/getaccessprogramgroup.php delete mode 100755 module/group/test/model/getbyaccounts.php delete mode 100755 module/group/test/model/getmenumodules.php delete mode 100644 module/group/test/model/getpriv.php delete mode 100755 module/group/test/model/getuserprograms.php diff --git a/module/group/control.php b/module/group/control.php index aa02ac970a..9b7d8795f4 100644 --- a/module/group/control.php +++ b/module/group/control.php @@ -1,4 +1,5 @@ loadModel('user'); @@ -25,71 +29,7 @@ class group extends control } /** - * Append packages in resource. - * - * @access public - * @return void - */ - public function appendResourcePackages() - { - $allPrivs = array(); - foreach($this->config->group->package as $packageCode => $package) - { - if(empty($package->privs)) continue; - - foreach($package->privs as $privCode => $priv) - { - $allPrivs[$privCode] = $privCode; - } - } - - /* Privs in resource but not in package. */ - foreach($this->lang->resource as $module => $methodList) - { - foreach($methodList as $method => $methodLang) - { - if(isset($allPrivs[$module . '-' . $method])) continue; - - /* Create subset. */ - if(!isset($this->config->group->subset->$module)) - { - $this->config->group->subset->$module = new stdclass(); - $this->config->group->subset->$module->order = 10000; - $this->config->group->subset->$module->nav = $module; - } - - /* Create subset. */ - $methodPackage = array('create' => 'manage', 'batchcreate' => 'manage', 'browse' => 'browse', 'view' => 'browse', 'delete' => 'delete', 'batchdelete' => 'delete', 'edit' => 'manage', 'batchedit' => 'manage'); - $packageName = isset($methodPackage[$method]) ? $methodPackage[$method] : 'other'; - $packageCode = $module . $packageName; - if(!isset($this->config->group->package->$packageCode)) - { - $this->config->group->package->$packageCode = new stdclass(); - $this->config->group->package->$packageCode->order = 5; - $this->config->group->package->$packageCode->subset = $module; - $this->config->group->package->$packageCode->privs = array(); - $this->lang->group->package->$packageCode = $this->lang->group->package->$packageName; - } - - /* Browse action in workflow. */ - if(isset($this->lang->$module->menus) && $method == 'browse') - { - $this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,or', 'order' => 5, 'depend' => array(), 'recommend' => array()); - - foreach($this->lang->$module->menus as $flowMethod => $flowName) - { - $this->config->group->package->$packageCode->privs["$module-$flowMethod"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,or', 'order' => 5, 'depend' => array("$module-$method"), 'recommend' => array()); - } - } - else - { - $this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,or', 'order' => 5, 'depend' => array(), 'recommend' => array()); - } - } - } - } - - /** + * 权限分组列表页面。 * Browse groups. * * @access public @@ -160,6 +100,7 @@ class group extends control } /** + * 复制权限分组。 * Copy a group. * * @param int $groupID @@ -183,6 +124,7 @@ class group extends control } /** + * 视野维护。 * Manage view. * * @param int $groupID @@ -244,6 +186,7 @@ class group extends control } /** + * 分配分组权限。 * Manage privleges of a group. * * @param string $type byPackage|byGroup|byModule @@ -253,7 +196,7 @@ class group extends control * @access public * @return void */ - public function managePriv($type = 'byPackage', $param = 0, $nav = '', $version = '') + public function managePriv(string $type = 'byPackage', int $param = 0, string $nav = '', string $version = '') { if($type == 'byGroup' or $type == 'byPackage') $groupID = $param; @@ -276,6 +219,7 @@ class group extends control } /** + * 维护分组成员。 * Manage members of a group. * * @param int $groupID @@ -283,7 +227,7 @@ class group extends control * @access public * @return void */ - public function manageMember($groupID, $deptID = 0) + public function manageMember(int $groupID, int $deptID = 0) { if(!empty($_POST)) { @@ -308,6 +252,7 @@ class group extends control } /** + * 维护项目管理员。 * Manage members of a group. * * @param int $groupID @@ -315,7 +260,7 @@ class group extends control * @access public * @return void */ - public function manageProjectAdmin($groupID, $deptID = 0) + public function manageProjectAdmin(int $groupID, int $deptID = 0) { if(!empty($_POST)) { @@ -354,7 +299,7 @@ class group extends control public function delete(int $groupID) { $group = $this->group->getByID($groupID); - $this->group->delete($groupID); + $this->group->remove($groupID); /* if ajax request, send result. */ if(dao::isError()) @@ -371,548 +316,6 @@ class group extends control return $this->send($response); } - /** - * Edit manage priv. - * - * @param string $browseType - * @param string $view - * @param int $paramID - * @param int $recPerPage - * @param int $pageID - * @access public - * @return void - */ - public function editManagePriv($browseType = '', $view = '', $paramID = 0, $recPerPage = 100, $pageID = 1) - { - if(empty($browseType) and $browseType != 'bysearch') $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard'; - if($browseType == 'bysearch' and $this->cookie->managePrivEditType == 'bycard') $browseType = 'bycard'; - - $moduleLang = $this->group->getMenuModules($view, true); - - if($browseType == 'bycard') - { - $privs = $this->group->getPrivsListByView($view); - $privs = $this->group->transformPrivLang($privs); - $privPackages = $this->group->getPrivManagerPairs('package'); - - $privList = array(); - foreach($privs as $privID => $priv) - { - if(!isset($privList[$priv->parentCode])) $privList[$priv->parentCode] = array(); - if(!is_array($privList[$priv->parentCode])) $privList[$priv->parentCode] = array(); - if(!isset($privList[$priv->parentCode][$priv->parent])) $privList[$priv->parentCode][$priv->parent] = array(); - $privList[$priv->parentCode][$priv->parent][$priv->key] = $priv; - } - - $this->view->privPackages = $privPackages; - } - else - { - $privList = $browseType != 'bysearch' ? $this->group->getPrivsListByView($view) : $this->group->getPrivsListBySearch($paramID); - $privs = $this->group->transformPrivLang($privList); - - /* Pager. */ - $this->app->loadClass('pager', $static = true); - $total = count($privList); - $pager = new pager($total, $recPerPage, $pageID); - $privList = array_chunk($privList, $pager->recPerPage, true); - $privList = empty($privList) ? $privList : $privList[$pageID - 1]; - - /* Build the search form. */ - $queryID = ($browseType == 'bysearch') ? (int)$paramID : 0; - $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recPerPage=$recPerPage"); - $this->group->buildPrivSearchForm($queryID, $actionURL); - - $privRelations = $this->group->getPrivRelationsByIdList(array_keys($privList)); - if(!isset($privRelations['recommend'])) $privRelations['recommend'] = array(); - if(!isset($privRelations['depend'])) $privRelations['depend'] = array(); - - $this->view->pager = $pager; - $this->view->privRelations = $privRelations; - } - - $this->view->title = $this->lang->group->editManagePriv; - $this->view->browseType = $browseType; - $this->view->privList = $privList; - $this->view->packages = $this->group->getPrivPackagePairs($view); - $this->view->moduleLang = $moduleLang; - $this->view->modulePackages = $this->group->getModuleAndPackageTree(); - $this->view->view = $view; - - $this->display(); - } - - /** - * Batch change package. - * - * @param string $module - * @param int $packageID - * @access public - * @return void - */ - public function batchChangePackage($module, $packageID) - { - if(empty($_POST['privIdList'])) return print(js::reload('parent')); - $privIdList = array_unique($_POST['privIdList']); - $allChanges = $this->group->batchChangePackage($privIdList, $module, $packageID); - if(dao::isError()) return print(js::error(dao::getError())); - - $this->loadModel('action'); - foreach($allChanges as $privID => $changes) - { - $actionID = $this->action->create('privlang', $privID, 'Edited'); - $this->action->logHistory($actionID, $changes); - } - return print(js::reload('parent')); - } - - /** - * Manage privilege packages. - * - * @access public - * @return void - */ - public function managePrivPackage() - { - $this->view->title = $this->lang->group->managePrivPackage; - $this->view->packagesTreeList = $this->group->getPrivPackageTreeList(); - $this->display(); - } - - /** - * Create a privilege package. - * - * @access public - * @return void - */ - public function createPrivPackage() - { - if(!empty($_POST)) - { - $packageID = $this->group->createPrivPackage(); - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent')); - } - - $this->view->title = $this->lang->group->createPrivPackage; - $this->view->modules = $this->group->getPrivModules(); - $this->display(); - } - - /** - * Edit a privilege package. - * - * @access public - * @return void - */ - public function editPrivPackage($privPackageID) - { - if(!empty($_POST)) - { - $changes = $this->group->updatePrivPackage($privPackageID); - if($changes) - { - $actionID = $this->loadModel('action')->create('privpackage', $privPackageID, 'Edited'); - $this->action->logHistory($actionID, $changes); - } - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent')); - } - - $this->view->title = $this->lang->group->editPrivPackage; - $this->view->privPackage = $this->group->getPrivPackageByID($privPackageID); - $this->view->modules = $this->group->getPrivModules(); - $this->view->actions = $this->loadModel('action')->getList('privpackage', $privPackageID); - $this->view->users = $this->loadModel('user')->getPairs(); - $this->display(); - } - - /** - * Sort priv packages. - * - * @param int $parentID - * @param string $type - * @access public - * @return void - */ - public function sortPrivPackages($parentID = 0, $type = '') - { - $orders = $_POST['orders']; - if(empty($orders)) return false; - if($type == 'view') - { - $orders = str_replace('View,', ',', $orders); - $orders = trim($orders, ','); - $this->loadModel('setting')->setItem("system.priv.views", $orders); - } - if($type == 'module') - { - $orders = trim($orders, ','); - $parentID = rtrim($parentID, 'View'); - $this->loadModel('setting')->setItem("system.priv.{$parentID}Modules", $orders); - } - if($type == 'package') - { - $orders = explode(',', $orders); - foreach($orders as $index => $id) - { - if(!empty($id)) $this->group->updatePackageOrder($id, ($index + 1) * 5); - } - } - } - - /** - * Delete a priv package. - * - * @param int $privPackageID - * @access public - * @return void - */ - public function deletePrivPackage($privPackageID, $confirm = 'no') - { - if($confirm == 'no') - { - return print(js::confirm($this->lang->group->confirmDeleteAB, $this->createLink('group', 'deletePrivPackage', "privPackageID=$privPackageID&confirm=yes"))); - } - else - { - $privPackage = $this->group->getPrivPackageByID($privPackageID); - $this->group->deletePrivPackage($privPackageID); - if(!dao::isError()) $this->loadModel('action')->create('privpackage', $privPackageID, 'deleted', '', zget($privPackage, 'name')); - - return print(js::reload('parent')); - } - } - - /** - * Add recommendation. - * - * @param string $privIdList - * @param string $type depend|recommend - * @access public - * @return void - */ - public function addRelation($privIdList, $type) - { - if(strpos("depend|recommend", $type) === false) return print('Error type'); - - if($this->server->request_method == 'POST') - { - if(empty($_POST['relation'])) return print(js::alert($this->lang->group->noticeNoChecked)); - - $this->group->saveRelation($privIdList, $type); - if(strpos($privIdList, ',') === false) print(js::execute("if(typeof(parent.parent.getSideRelation) == 'function') parent.parent.getSideRelation({$privIdList})")); - return print(js::reload('parent')); - } - - $privs = $this->group->getPrivByIdList($privIdList); - $modules = array(); - foreach($privs as $priv) $modules[$priv->module] = $priv->module; - - $modulePrivs = $this->group->getPrivByModule($modules); - $packageIdList = array(); - foreach($modulePrivs as $packagePrivs) $packageIdList = array_unique(array_merge($packageIdList, array_keys($packagePrivs))); - - $this->view->privs = $privs; - $this->view->modules = array('' => $this->lang->group->selectModule) + $this->group->getMenuModules(null, true); - $this->view->packages = $this->group->getPackagePairs($packageIdList); - $this->view->modulePrivs = $modulePrivs; - $this->view->type = $type; - $this->display(); - } - - /** - * Delete relation. - * - * @param string $type recommend|depend - * @param int $privID - * @param int $relationPriv - * @access public - * @return void - */ - public function deleteRelation($type, $privID, $relationPriv) - { - $this->dao->delete()->from(TABLE_PRIVRELATION)->where('type')->eq($type)->andWhere('priv')->eq($privID)->andWhere('relationPriv')->eq($relationPriv)->exec(); - } - - /** - * Batch delete relation. - * - * @param string $privIdList - * @param string $type recommend|depend - * @access public - * @return void - */ - public function batchDeleteRelation($privIdList, $type) - { - if(strpos("depend|recommend", $type) === false) return print('Error type'); - - if($this->server->request_method == 'POST') - { - if(empty($_POST['relation'])) return print(js::alert($this->lang->group->noticeNoChecked)); - - $data = fixer::input('post')->get(); - $deletedPriv = array(); - foreach($data->relation as $module => $relations) $deletedPriv = array_merge($deletedPriv, $relations); - $this->dao->delete()->from(TABLE_PRIVRELATION)->where('type')->eq($type)->andWhere('priv')->in($privIdList)->andWhere('relationPriv')->in($deletedPriv)->exec(); - - return print(js::reload('parent')); - } - - $privs = $this->group->getPrivByIdList($privIdList); - $modules = array(); - foreach($privs as $priv) $modules[$priv->module] = $priv->module; - - $modulePrivs = $this->group->getPrivByModule($modules); - $packageIdList = array(); - foreach($modulePrivs as $packagePrivs) $packageIdList = array_unique(array_merge($packageIdList, array_keys($packagePrivs))); - - $this->view->privs = $privs; - $this->view->modules = array('' => $this->lang->group->selectModule) + $this->group->getMenuModules(null, true); - $this->view->packages = $this->group->getPackagePairs($packageIdList); - $this->view->modulePrivs = $modulePrivs; - $this->view->type = $type; - $this->display('group', 'addrelation'); - } - - /** - * Ajax get priv tree. - * - * @param string $privIdList - * @param string $module - * @param string $type recommend|depend - * @access public - * @return void - */ - public function ajaxGetPrivTree($privIdList, $module, $type = 'recommend') - { - if(is_string($privIdList)) $privIdList = explode(',', $privIdList); - - $modulePrivs = $this->group->getPrivByModule($module); - $packageIdList = array(); - foreach($modulePrivs as $packagePrivs) $packageIdList = array_unique(array_merge($packageIdList, array_keys($packagePrivs))); - - $modules = $this->group->getMenuModules(null, true); - $packages = $this->group->getPackagePairs($packageIdList); - - $tree = "'; - return print($tree); - } - - /** - * Create a priv. - * - * @access public - * @return void - */ - public function createPriv() - { - if(!empty($_POST)) - { - $packageID = $this->group->createPriv(); - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent')); - } - $views = $this->loadModel('setting')->getItem("owner=system&module=priv&key=views"); - $views = explode(',', $views); - $moduleLang = $this->group->getMenuModules('', true); - foreach($views as $index => $view) - { - $views[$view] = isset($this->lang->{$view}->common) ? $this->lang->{$view}->common : zget($moduleLang, $view); - unset($views[$index]); - } - - $this->view->title = $this->lang->group->createPriv; - $this->view->views = $views; - $this->view->modules = $this->group->getPrivModules('', 'noViewName'); - $this->view->packages = $this->group->getPrivPackagePairs(); - $this->view->moduleViewPairs = $this->group->getPrivModuleViewPairs(); - $this->view->packageModulePairs = $this->group->getPrivPackagePairs('', '', 'module'); - $this->display(); - } - - /** - * Edit a priv. - * - * @param int $privID - * @access public - * @return void - **/ - public function editPriv($privID) - { - $privID = intval($privID); - $priv = $this->group->getPrivByID($privID); - - if(!$priv) - { - return print(js::alert($this->lang->group->noneProject)); - } - - if(!empty($_POST)) - { - $currentLang = $this->app->clientLang ? : 'zh-cn'; - $changes = $this->group->updatePriv($privID, $currentLang); - if($changes) - { - $actionID = $this->loadModel('action')->create('privlang', $privID, 'Edited'); - $this->action->logHistory($actionID, $changes); - } - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => true, 'closeModal' => true)); - - $this->send(array('result' => $responseResult, 'message' => $responseMessage, 'load' => $locate)); - } - - $views = $this->loadModel('setting')->getItem("owner=system&module=priv&key=views"); - $views = explode(',', $views); - $moduleLang = $this->group->getMenuModules('', true); - foreach($views as $index => $view) - { - $views[$view] = isset($this->lang->{$view}->common) ? $this->lang->{$view}->common : zget($moduleLang, $view); - unset($views[$index]); - } - $moduleViewPairs = $this->group->getPrivModuleViewPairs(); - $priv->view = zget($moduleViewPairs, $priv->module, ''); - - $this->view->title = $this->lang->group->editPriv; - $this->view->views = $views; - $this->view->modules = $this->group->getPrivModules($priv->view, 'noViewName'); - $this->view->packages = $this->group->getPrivPackagePairs($priv->view, $priv->module); - $this->view->moduleViewPairs = $moduleViewPairs; - $this->view->packageModulePairs = $this->group->getPrivPackagePairs('', '', 'module'); - $this->view->priv = $priv; - $this->view->actions = $this->loadModel('action')->getList('privlang', $privID); - $this->view->users = $this->loadModel('user')->getPairs(); - $this->display(); - } - - /** - * Delete a priv. - * - * @param int $privID - * @access public - * @return void - */ - public function deletePriv($privID, $confirm = 'no') - { - if($confirm == 'no') - { - return print(js::confirm($this->lang->group->confirmDeleteAB, $this->createLink('group', 'deletePriv', "privID=$privID&confirm=yes"))); - } - else - { - $priv = $this->group->getPrivByID($privID); - $this->group->deletePriv($privID); - if(!dao::isError()) $this->loadModel('action')->create('privlang', $privID, 'deleted', '', "$priv->moduleName-$priv->methodName"); - - return print(js::reload('parent')); - } - } - - /** - * Ajax get priv modules by view. - * - * @param string $viewName - * @access public - * @return string - */ - public function ajaxGetPrivModules($viewName = '') - { - $modules = $this->group->getPrivModules($viewName, 'noViewName'); - echo html::select('module', array('' => '') + $modules, '', "class='form-control picker-select' onchange='loadPackages(this.value, \"module\")'"); - } - - /** - * Ajax get priv packages by view or module. - * - * @param string $object - * @param string $type - * @access public - * @return string - */ - public function ajaxGetPrivPackages($object = '', $type = 'view') - { - $packages = array(); - if($type == 'view') $packages = $this->group->getPrivPackagePairs($object); - if($type == 'module') $packages = $this->group->getPrivPackagePairs('', $object); - echo html::select('package', array('' => '') + $packages, '', "class='form-control picker-select' onchange='changeViewAndModule(this.value)'"); - } - - /** - * AJAX: Get priv's related priv list. - * - * @param int $privID - * @access public - * @return bool - */ - public function ajaxGetPrivRelations($privID) - { - $relatedPrivs = $this->group->getPrivRelation($privID); - if(empty($relatedPrivs)) return print(''); - - $moduleLang = $this->group->getMenuModules('', true); - $privList = array('depend' => array(), 'recommend' => array()); - foreach($relatedPrivs as $type => $relations) - { - foreach($relations as $relatedPriv) - { - $module = $relatedPriv->module; - if(!isset($privList[$type][$module])) $privList[$type][$module] = array(); - $privList[$type][$module]['text'] = zget($moduleLang, $module, $module); - $privList[$type][$module]['module'] = $relatedPriv->module; - $privList[$type][$module]['children'][] = array('text' => $relatedPriv->name, 'relationPriv' => $relatedPriv->id, 'privID' => $privID); - } - $privList[$type] = array_values($privList[$type]); - } - return print(json_encode($privList)); - } - - /** - * AJAX: update priv order. - * - * @access public - * @return void - */ - public function ajaxUpdatePrivOrder() - { - if(!empty($_POST)) $this->group->updatePrivOrder(); - } - /** * AJAX: Get privs by parents. * @@ -921,7 +324,7 @@ class group extends control * @access public * @return bool */ - public function ajaxGetPrivByParents($selectedSubset, $selectedPackages) + public function ajaxGetPrivByParents(string $selectedSubset, string $selectedPackages) { $privs = $this->group->getPrivByParents($selectedSubset, $selectedPackages); diff --git a/module/group/lang/de.php b/module/group/lang/de.php index 10dc3c60d2..086d45f17e 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -20,7 +20,7 @@ $lang->group->manageView = 'Anzeigen'; $lang->group->managePriv = 'Assign Privileges'; $lang->group->managePrivByGroup = 'Assign Privileges by Group'; $lang->group->managePrivByModule = 'Modul Rechte'; -$lang->group->byModuleTips = '(SHIFT/STRG für Multi-Select)'; +$lang->group->byModuleTips = '(SHIFT/STRG für Multi-Select)'; $lang->group->allTips = 'After checking this option, the administrator can manage all objects in the system, including objects created later.'; $lang->group->manageMember = 'Mitglieder'; $lang->group->manageProjectAdmin = "Manage {$lang->projectCommon} Admins"; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index 28b8bb302a..aae79cb4f6 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -20,7 +20,7 @@ $lang->group->manageView = 'Manage Sight'; $lang->group->managePriv = 'Assign Privileges'; $lang->group->managePrivByGroup = 'Assign Privileges by Group'; $lang->group->managePrivByModule = 'Manage Privileges by Module'; -$lang->group->byModuleTips = '(Press Shift/Ctrl to Multi-select)'; +$lang->group->byModuleTips = '(Press Shift/Ctrl to Multi-select)'; $lang->group->allTips = 'After checking this option, the administrator can manage all objects in the system, including objects created later.'; $lang->group->manageMember = 'Manage Members'; $lang->group->manageProjectAdmin = "Manage {$lang->projectCommon} Admins"; diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php index bb9a363334..3920c883b0 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -20,7 +20,7 @@ $lang->group->manageView = 'Gérer droits consultation'; $lang->group->managePriv = 'Assign Privileges'; $lang->group->managePrivByGroup = 'Assign Privileges by Group'; $lang->group->managePrivByModule = 'Gérer Privilèges par Module'; -$lang->group->byModuleTips = '(Shift/Ctrl pour sélection multiple)'; +$lang->group->byModuleTips = '(Shift/Ctrl pour sélection multiple)'; $lang->group->allTips = 'After checking this option, the administrator can manage all objects in the system, including objects created later.'; $lang->group->manageMember = 'Gérer Membres'; $lang->group->manageProjectAdmin = "Manage {$lang->projectCommon} Admins"; diff --git a/module/group/lang/vi.php b/module/group/lang/vi.php index de9923d7ab..32850c41b1 100644 --- a/module/group/lang/vi.php +++ b/module/group/lang/vi.php @@ -19,7 +19,7 @@ $lang->group->manageView = 'Quản lý Sight'; $lang->group->managePriv = 'Quản lý Privileges'; $lang->group->managePrivByGroup = 'Quản lý Privileges by Group'; $lang->group->managePrivByModule = 'Quản lý Privileges by Module'; -$lang->group->byModuleTips = '(Press Shift/Ctrl to Multi-select)'; +$lang->group->byModuleTips = '(Press Shift/Ctrl to Multi-select)'; $lang->group->manageMember = 'Quản lý Members'; $lang->group->manageProjectAdmin = 'Manage Program Admins'; $lang->group->editManagePriv = 'Permission Edit'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index 5dff018e5f..c1013f15a3 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -20,7 +20,7 @@ $lang->group->manageView = '视野维护'; $lang->group->managePriv = '分配权限'; $lang->group->managePrivByGroup = '分配权限'; $lang->group->managePrivByModule = '按模块分配权限'; -$lang->group->byModuleTips = '(可以按住Shift或者Ctrl键进行多选)'; +$lang->group->byModuleTips = '(可以按住Shift或者Ctrl键进行多选)'; $lang->group->allTips = '勾选此项后,管理员可管理系统中所有对象,包括后续创建的对象。'; $lang->group->manageMember = '成员维护'; $lang->group->manageProjectAdmin = "维护{$lang->projectCommon}管理员"; diff --git a/module/group/lang/zh-tw.php b/module/group/lang/zh-tw.php index 34df49879c..4f031d5cd5 100644 --- a/module/group/lang/zh-tw.php +++ b/module/group/lang/zh-tw.php @@ -19,7 +19,7 @@ $lang->group->manageView = '視野維護'; $lang->group->managePriv = '權限維護'; $lang->group->managePrivByGroup = '權限維護'; $lang->group->managePrivByModule = '按模組分配權限'; -$lang->group->byModuleTips = '(可以按住Shift或者Ctrl鍵進行多選)'; +$lang->group->byModuleTips = '(可以按住Shift或者Ctrl鍵進行多選)'; $lang->group->manageMember = '成員維護'; $lang->group->manageProjectAdmin = '維護項目管理員'; $lang->group->confirmDelete = '您確定刪除該用戶分組嗎?'; diff --git a/module/group/model.php b/module/group/model.php index 0a48fc17a2..a12abfddd1 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -1,4 +1,5 @@ dao->findByGroup($fromGroup)->from(TABLE_GROUPPRIV)->fetchAll(); + $privs = $this->dao->findByGroup($fromGroupID)->from(TABLE_GROUPPRIV)->fetchAll(); foreach($privs as $key => $priv) { - $privs[$key]->group = $toGroup; + $privs[$key]->group = $toGroupID; } $this->insertPrivs($privs); } @@ -109,17 +110,17 @@ class groupModel extends model /** * Copy user. * - * @param string $fromGroup - * @param string $toGroup + * @param int $fromGroup + * @param int $toGroup * @access public * @return void */ - public function copyUser($fromGroup, $toGroup) + public function copyUser($fromGroupID, $toGroupID) { - $users = $this->dao->findByGroup($fromGroup)->from(TABLE_USERGROUP)->fetchAll(); + $users = $this->dao->findByGroup($fromGroupID)->from(TABLE_USERGROUP)->fetchAll(); foreach($users as $user) { - $user->group = $toGroup; + $user->group = $toGroupID; $this->dao->insert(TABLE_USERGROUP)->data($user)->exec(); } } @@ -131,7 +132,7 @@ class groupModel extends model * @access public * @return array */ - public function getList($projectID = 0) + public function getList(int $projectID = 0) { return $this->dao->select('*')->from(TABLE_GROUP) ->where('project')->eq($projectID) @@ -147,7 +148,7 @@ class groupModel extends model * @access public * @return array */ - public function getPairs($projectID = 0) + public function getPairs(int $projectID = 0) { return $this->dao->select('id, name')->from(TABLE_GROUP) ->where('project')->eq($projectID) @@ -162,7 +163,7 @@ class groupModel extends model * @access public * @return object */ - public function getByID($groupID) + public function getByID(int $groupID) { $group = $this->dao->findById($groupID)->from(TABLE_GROUP)->fetch(); if($group->acl) $group->acl = json_decode($group->acl, true); @@ -178,7 +179,7 @@ class groupModel extends model * @access public * @return array */ - public function getByAccount($account, $allVision = false) + public function getByAccount(string $account, bool $allVision = false) { return $this->dao->select('t2.*')->from(TABLE_USERGROUP)->alias('t1') ->leftJoin(TABLE_GROUP)->alias('t2') @@ -189,23 +190,6 @@ class groupModel extends model ->fetchAll('id'); } - /** - * Get groups by accounts. - * - * @param array $accounts - * @access public - * @return array - */ - public function getByAccounts($accounts) - { - return $this->dao->select('t1.account, t2.acl, t2.id')->from(TABLE_USERGROUP)->alias('t1') - ->leftJoin(TABLE_GROUP)->alias('t2') - ->on('t1.`group` = t2.id') - ->where('t1.account')->in($accounts) - ->andWhere('t2.vision')->eq($this->config->vision) - ->fetchGroup('account'); - } - /** * Get the account number in the group. * @@ -213,7 +197,7 @@ class groupModel extends model * @access public * @return array */ - public function getGroupAccounts($groupIdList = array()) + public function getGroupAccounts(array $groupIdList = array()) { $groupIdList = array_filter($groupIdList); if(empty($groupIdList)) return array(); @@ -227,7 +211,7 @@ class groupModel extends model * @access public * @return array */ - public function getPrivs($groupID) + public function getPrivs(int $groupID) { $privs = array(); $stmt = $this->dao->select('module, method')->from(TABLE_GROUPPRIV)->where('`group`')->eq($groupID)->orderBy('module')->query(); @@ -242,7 +226,7 @@ class groupModel extends model * @access public * @return array */ - public function getUserPairs($groupID) + public function getUserPairs(int $groupID) { return $this->dao->select('t2.account, t2.realname') ->from(TABLE_USERGROUP)->alias('t1') @@ -409,50 +393,13 @@ class groupModel extends model } /** - * Get the ID of the group that has access to the program. - * - * @access public - * @return array - */ - public function getAccessProgramGroup() - { - $accessibleGroup = $this->getList(); - $accessibleGroupID = array(0); - foreach($accessibleGroup as $group) - { - if($group->acl) $group->acl = json_decode($group->acl, true); - if(!isset($group->acl) || !is_array($group->acl)) $group->acl = array(); - - if(empty($group->acl)) - { - $accessibleGroupID[] = $group->id; - continue; - } - - if(!isset($group->acl['views']) || empty($group->acl['views'])) - { - $accessibleGroupID[] = $group->id; - continue; - } - - if(in_array('program', $group->acl['views'])) - { - $accessibleGroupID[] = $group->id; - continue; - } - } - return $accessibleGroupID; - } - - /** - * Delete a group. + * Remove group. * * @param int $groupID - * @param null $null compatible with that of model::delete() * @access public * @return void */ - public function delete($groupID, $null = null) + public function remove(int $groupID) { $this->dao->delete()->from(TABLE_GROUP)->where('id')->eq($groupID)->exec(); $this->dao->delete()->from(TABLE_USERGROUP)->where('`group`')->eq($groupID)->exec(); @@ -468,7 +415,7 @@ class groupModel extends model * @access public * @return bool */ - public function updatePrivByGroup($groupID, $nav, $version) + public function updatePrivByGroup(int $groupID, string $nav, string $version) { /* Delete old. */ $privs = array_keys($this->getPrivListByNav($nav, $version)); @@ -548,7 +495,7 @@ class groupModel extends model * @access protected * @return bool */ - protected function insertPrivs($privs) + protected function insertPrivs(array $privs) { $groups = array(); foreach($privs as $priv) $groups[$priv->group] = $priv->group; @@ -575,7 +522,7 @@ class groupModel extends model * @access public * @return bool */ - public function updateView($groupID) + public function updateView(int $groupID) { $actions = $this->post->actions; $oldGroup = $this->getByID($groupID); @@ -660,7 +607,7 @@ class groupModel extends model * @access public * @return void */ - public function updateUser($groupID) + public function updateUser(int $groupID) { $members = $this->post->members ? $this->post->members : array(); $groupUsers = $this->dao->select('account')->from(TABLE_USERGROUP)->where('`group`')->eq($groupID)->fetchPairs('account'); @@ -701,7 +648,7 @@ class groupModel extends model * @access public * @return void */ - public function updateProjectAdmin($groupID) + public function updateProjectAdmin(int $groupID) { $this->loadModel('user'); @@ -834,7 +781,7 @@ class groupModel extends model * @access public * @return bool */ - public function checkNavSubset($nav, $subset) + public function checkNavSubset(string $nav, string $subset): bool { if(empty($nav)) return true; @@ -845,62 +792,6 @@ class groupModel extends model && $this->config->group->subset->$subset->nav == $nav; } - /** - * Check nav have module. - * - * @param string $nav - * @param string $moduleName - * @access public - * @return bool - */ - public function checkNavModule($nav, $moduleName, $methodName = '') - { - if(empty($nav)) return true; - - if($nav == 'general' and (isset($this->lang->navGroup->$moduleName) or isset($this->lang->mainNav->$moduleName))) return false; - if($nav != 'general') - { - if($moduleName === $nav) return true; - if(isset($this->lang->navGroup->{$moduleName . '_' . $methodName})) - { - if($this->lang->navGroup->{$moduleName . '_' . $methodName} === $nav) return true; - return false; - } - if(isset($this->lang->navGroup->$moduleName) and $this->lang->navGroup->$moduleName == $nav) return true; - return false; - } - if($nav == 'project' and strpos('caselib|testsuite|report', $moduleName) !== false) return false; - - return true; - } - - /** - * Get modules in menu - * - * @param string $menu - * @param bool $translateLang - * @access public - * @return array - */ - public function getMenuModules($menu = '', $translateLang = false) - { - $modules = array(); - foreach($this->lang->resource as $moduleName => $action) - { - if($this->checkNavModule($menu, $moduleName)) - { - $modules[$moduleName] = $moduleName; - if($translateLang) - { - if(!isset($this->lang->{$moduleName}->common)) $this->app->loadLang($moduleName); - $modules[$moduleName] = isset($this->lang->{$moduleName}->common) ? $this->lang->{$moduleName}->common : $moduleName; - if($moduleName == 'requirement') $modules[$moduleName] = $this->lang->URCommon; - } - } - } - return $modules; - } - /** * Judge an action is clickable or not. * @@ -910,7 +801,7 @@ class groupModel extends model * @access public * @return bool */ - public static function isClickable($group, $action) + public static function isClickable(object $group, string $action): bool { $action = strtolower($action); @@ -921,910 +812,6 @@ class groupModel extends model return true; } - /** - * Create a privilege package. - * - * @access public - * @return int - */ - public function createPrivPackage() - { - $package = fixer::input('post')->get(); - - $packages = $this->getPrivPackagesByModule($package->module); - $package->order = (count($packages) + 1) * 5; - - $this->dao->insert(TABLE_PRIVPACKAGE)->data($package)->batchCheck($this->config->privPackage->create->requiredFields, 'notempty')->exec(); - $packageID = $this->dao->lastInsertId(); - $this->loadModel('action')->create('privpackage', $packageID, 'Opened'); - return $packageID; - } - - /** - * Update a privilege package. - * - * @param int $packageID - * @access public - * @return array - */ - public function updatePrivPackage($packageID) - { - $oldPackage = $this->getPrivPackageByID($packageID); - - $package = fixer::input('post')->get(); - if($oldPackage->module != $package->module) - { - $packages = $this->getPrivPackagesByModule($package->module); - $package->order = (count($packages) + 1) * 5; - - $priv = new stdclass(); - $priv->module = $package->module; - } - $this->dao->update(TABLE_PRIVPACKAGE)->data($package)->batchCheck($this->config->privPackage->edit->requiredFields, 'notempty')->where('id')->eq($packageID)->exec(); - if(dao::isError()) return false; - if(isset($priv)) $this->dao->update(TABLE_PRIV)->data($priv)->where('package')->eq($packageID)->exec(); - - $package = $this->getPrivPackageByID($packageID); - $changes = common::createChanges($oldPackage, $package); - - return $changes; - } - - /** - * Delete a priv package. - * - * @param int $packageID - * @access public - * @return bool - */ - public function deletePrivPackage($packageID) - { - $this->dao->delete()->from(TABLE_PRIVPACKAGE)->where('id')->eq($packageID)->exec(); - if(dao::isError()) return false; - $this->dao->update(TABLE_PRIV)->set('package')->eq(0)->where('package')->eq($packageID)->exec(); - } - - /** - * Get priv package by id. - * - * @param int $packageID - * @access public - * @return object - */ - public function getPrivPackageByID($packageID) - { - return $this->dao->select('distinct t1.*,t2.`value` as name')->from(TABLE_PRIVMANAGER)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID') - ->where('t1.id')->eq($packageID) - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->andWhere('t2.objectType')->eq('manager') - ->fetch(); - } - - /** - * Get priv packages by module. - * - * @param string $module - * @access public - * @return array - */ - public function getPrivPackagesByModule($module) - { - $moduleID = $this->dao->select('id')->from(TABLE_PRIVMANAGER)->where('`code`')->eq($module)->andWhere('type')->eq('module')->fetch('id'); - - return $this->dao->select('t1.*,t2.value as name')->from(TABLE_PRIVMANAGER)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID') - ->where('t1.parent')->eq($moduleID) - ->andWhere('t1.type')->eq('package') - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->orderBy('order_asc') - ->fetchAll('id'); - } - -// /** -// * Get priv packages group by module. -// * -// * @param array $modules -// * @access public -// * @return array -// */ -// public function getPrivPackageGroupByModules($modules = array()) -// { -// return $this->dao->select('t1.*,t2.`code` as parentCode')->from(TABLE_PRIVMANAGER)->alias('t1') -// ->leftJoin(TABLE_PRIVMANAGER)->alias('t2')->on('t1.parent=t2.id') -// ->where('t1.`type`')->eq('package') -// ->beginIF(!empty($modules))->andWhere('t2.`code`')->in($modules)->fi() -// ->andWhere('t2.`type`')->eq('module') -// ->andWhere('t1.edition')->like("%,{$this->config->edition},%") -// ->andWhere('t1.vision')->like("%,{$this->config->vision},%") -// ->fetchGroup('parentCode', 'id'); -// } - - /** - * Get priv package pairs by view. - * - * @access public - * @return array - */ - public function getPrivPackagePairs($view = '', $module = '', $field = '`value` as name') - { - $modules = ''; - if(!empty($module)) - { - $modules = $this->dao->select('id')->from(TABLE_PRIVMANAGER)->where('type')->eq('module')->andWhere('code')->eq($module)->fetch('id'); - } - else - { - $modules = $this->getPrivManagerPairs('module', $view); - $modules = array_keys($modules); - $modules = implode(',', $modules); - } - $modules = trim($modules, ','); - - return $this->dao->select("id,{$field}") - ->from(TABLE_PRIVMANAGER)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID') - ->where('1=1') - ->andWhere('t2.objectType')->eq('manager') - ->beginIF(!empty($modules))->andWhere('parent')->in($modules)->fi() - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->andWhere('t2.lang')->eq($this->app->getClientLang()) - ->orderBy('order_asc') - ->fetchPairs(); - } - - /** - * 获取权限包id:name的键值对。 - * Get priv package pairs. - * - * @param array $packageIdList - * @access public - * @return array - */ - public function getPackagePairs(array $packageIdList): array - { - return $this->dao->select('*')->from(TABLE_PRIVPACKAGE)->where('id')->in($packageIdList)->orderBy('`order`')->fetchPairs('id', 'name'); - } - - /** - * Get priv modules. - * - * @param string $viewName - * @param string $param - * @access public - * @return array - */ - public function getPrivModules($viewName = '', $param = '') - { - $this->loadModel('setting'); - - $tree = array(); - $views = empty($viewName) ? $this->setting->getItem("owner=system&module=priv&key=views") : $viewName; - $views = explode(',', $views); - $modules = array(); - $moduleLang = $this->getMenuModules('', true); - foreach($views as $view) - { - $viewModules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - if(empty($viewModules)) continue; - - $viewModules = explode(',', $viewModules); - foreach($viewModules as $index => $module) - { - $modules[$module] = $param == 'noViewName' ? zget($moduleLang, $module) : $this->lang->{$view}->common . '/' . zget($moduleLang, $module); - unset($viewModules[$index]); - } - } - - return $modules; - } - - /** - * Get priv module view pairs. - * - * @access public - * @return void - */ - public function getPrivModuleViewPairs() - { - $this->loadModel('setting'); - - $views = $this->setting->getItem("owner=system&module=priv&key=views"); - if(empty($views)) return array(); - $views = explode(',', $views); - - $pairs = array(); - foreach($views as $viewIndex => $view) - { - $viewModules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - $viewModules = explode(',', $viewModules); - - foreach($viewModules as $module) $pairs[$module] = $view; - } - - return $pairs; - } - - /** - * Get priv package tree list. - * - * @access public - * @return void - */ - public function getPrivPackageTreeList() - { - $this->loadModel('setting'); - - $views = empty($viewName) ? $this->setting->getItem("owner=system&module=priv&key=views") : $viewName; - if(empty($views)) return array(); - $views = explode(',', $views); - - $modules = array(); - $moduleLang = $this->getMenuModules('', true); - foreach($views as $viewIndex => $view) - { - $viewID = $view . 'View'; - $treeView = new stdclass(); - $treeView->id = $viewID; - $treeView->type = 'view'; - $treeView->name = $this->lang->{$view}->common; - $treeView->parent = 0; - $treeView->path = ",{$viewID},"; - $treeView->grade = 1; - $treeView->order = $viewIndex; - $treeView->desc = ''; - $tree[$viewID] = $treeView; - - $viewModules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - if(empty($viewModules)) continue; - - $viewModules = explode(',', $viewModules); - foreach($viewModules as $moduleIndex => $module) - { - $treeModule = new stdclass(); - $treeModule->id = $module; - $treeModule->type = 'module'; - $treeModule->name = zget($moduleLang, $module); - $treeModule->parent = $viewID; - $treeModule->path = ",{$viewID},{$module},"; - $treeModule->grade = 2; - $treeModule->order = $moduleIndex; - $treeModule->desc = ''; - $tree[$module] = $treeModule; - - $packages = $this->getPrivPackagesByModule($module); - foreach($packages as $packageID => $package) - { - $treePackage = new stdclass(); - $treePackage->id = $packageID; - $treePackage->type = 'package'; - $treePackage->name = $package->name; - $treePackage->parent = $module; - $treePackage->path = ",{$viewID},{$module},{$packageID},"; - $treePackage->grade = 3; - $treePackage->desc = $package->desc; - $treePackage->order = $package->order; - $tree[$packageID] = $treePackage; - } - } - } - - return $tree; - } - - /** - * Super Model: Init Privs. - * - * @param bool $onlyUpdateModule - * @access public - * @return void - */ - public function initPrivs($onlyUpdateModule = true) - { - $this->sortResource(); - $resource = json_decode(json_encode($this->lang->resource), true); - if(!$onlyUpdateModule) - { - $this->dao->delete()->from(TABLE_PRIVLANG)->exec(); - $this->dao->delete()->from(TABLE_PRIVRELATION)->exec(); - $this->dao->delete()->from(TABLE_PRIV)->exec(); - $this->dao->delete()->from(TABLE_CONFIG)->where('module')->eq('priv')->exec(); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' auto_increment = 1'); - } - - $viewModules = array(); - $this->loadModel('setting'); - foreach($resource as $moduleName => $methods) - { - $groupKey = $moduleName; - $view = isset($this->lang->navGroup->{$groupKey}) ? $this->lang->navGroup->{$groupKey} : $moduleName; - $viewModules[$view][] = $moduleName; - - if($onlyUpdateModule) continue; - $order = 1; - foreach($methods as $methodName => $methodLang) - { - $priv = new stdclass(); - $priv->moduleName = $moduleName; - $priv->methodName = $methodName; - $priv->module = $moduleName; - $priv->package = 0; - $priv->system = 1; - $priv->order = $order * 5; - $order ++; - - $this->dao->replace(TABLE_PRIV)->data($priv)->exec(); - if(!dao::isError()) - { - $privID = $this->dao->lastInsertId(); - - $this->app->loadLang($moduleName); - foreach($this->config->langs as $lang => $langValue) - { - if($lang != 'zh-cn') continue; - $privLang = new stdclass(); - $privLang->priv = $privID; - $privLang->lang = $lang; - $privLang->name = isset($this->lang->{$moduleName}->{$methodLang}) ? $this->lang->{$moduleName}->{$methodLang} : "{$moduleName}-{$methodLang}"; - $privLang->desc = ''; - $this->dao->replace(TABLE_PRIVLANG)->data($privLang)->exec(); - } - } - } - } - - foreach($viewModules as $viewName => $modules) - { - $modules = implode(',', $viewModules[$viewName]); - $this->setting->setItem("system.priv.{$viewName}Modules", $modules); - } - - $views = array_keys($viewModules); - $this->setting->setItem("system.priv.views", implode(',', $views)); - - if(!dao::isError()) return true; - } - - /** - * Super Model: Init Data for priv package. - * - * @access public - * @return void - */ - public function initData() - { - $allResourceFile = $this->app->getModuleRoot() . 'group/lang/allresources.php'; - - $views = $this->loadModel('setting')->getItem("owner=system&module=priv&key=views"); - $views = array_filter(explode(',', $views)); - $views[] = 'general'; - - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVLANG . " CHANGE `priv` `objectID` mediumint(8) unsigned NOT NULL;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVLANG . " ADD `objectType` enum('priv','manager') NOT NULL DEFAULT 'priv' AFTER `objectID`;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVLANG . " ADD `key` varchar(100) NOT NULL AFTER `lang`;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVLANG . " CHANGE `name` `value` varchar(255) NOT NULL;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVLANG . " ADD UNIQUE KEY `objectlang` (`objectID`,`objectType`,`lang`);"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVLANG . " DROP INDEX `privlang`;"); - $this->dbh->exec("DROP TABLE IF EXISTS " . TABLE_PRIVMANAGER . ";"); - $this->dbh->exec("CREATE TABLE IF NOT EXISTS " . TABLE_PRIVMANAGER . " ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `parent` varchar(30) NOT NULL, `code` varchar(100) NOT NULL, `type` enum('view','module','package') NOT NULL DEFAULT 'package', `order` tinyint(3) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIV . " ADD `edition` varchar(30) NOT NULL DEFAULT ',open,biz,max,' AFTER `package`;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIV . " ADD `vision` varchar(30) NOT NULL DEFAULT ',rnd,' AFTER `edition`;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVMANAGER . " ADD `edition` varchar(30) NOT NULL DEFAULT ',open,biz,max,' AFTER `type`;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIVMANAGER . " ADD `vision` varchar(30) NOT NULL DEFAULT ',rnd,' AFTER `edition`;"); - - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' CHANGE `order` `order` mediumint(8) NOT NULL;'); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIVMANAGER . ' CHANGE `order` `order` mediumint(8) NOT NULL;'); - - $this->dbh->exec("ALTER TABLE " . TABLE_PRIV . " CHANGE `package` `package` varchar(100) NOT NULL;"); - $this->dbh->exec("UPDATE " . TABLE_PRIV . " SET `package`=`module` WHERE `package`=0;"); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIV . " CHANGE `package` `parent` varchar(100) NOT NULL;"); - - $this->loadModel('dev'); - - /* 插入权限所有语言项 */ - $storedPrivs = array(); - $privList = $this->dao->select('*')->from(TABLE_PRIV)->fetchAll('id'); - foreach($privList as $privID => $priv) - { - foreach($this->config->langs as $lang => $langValue) - { - $methodLang = isset($this->lang->resource->{$priv->moduleName}->{$priv->methodName}) ? $this->lang->resource->{$priv->moduleName}->{$priv->methodName} : $priv->methodName; - - $privLang = new stdclass(); - $privLang->objectID = $privID; - $privLang->objectType = 'priv'; - $privLang->lang = $lang; - $privLang->key = "{$priv->moduleName}-{$methodLang}"; - $privLang->value = ''; - $privLang->desc = ''; - $this->dao->replace(TABLE_PRIVLANG)->data($privLang)->exec(); - } - - $storedPrivs["{$priv->moduleName}-{$priv->methodName}"] = $priv; - } - - $originResource = json_decode(json_encode($this->lang->resource), true); - $originPrivs = array(); - foreach($originResource as $moduleName => $methods) - { - foreach($methods as $methodName => $methodLang) - { - $originPrivs["$moduleName-$methodName"] = "$moduleName-$methodName"; - } - } - - /* 删掉语言项中不存在的权限 */ - foreach($storedPrivs as $moduleMethod => $storedPriv) - { - if(!empty($originPrivs[$moduleMethod])) continue; - $this->dao->delete()->from(TABLE_PRIV)->where('id')->eq($storedPriv->id)->exec(); - $this->dao->delete()->from(TABLE_PRIVLANG)->where('objectType')->eq('priv')->andWhere('objectID')->eq($storedPriv->id)->exec(); - } - - /* 迁移权限包数据 privpackage => privmanager */ - /* 迁移权限包语言项 privpackage => privlang */ - $packageList = $this->dao->select('*')->from(TABLE_PRIVPACKAGE)->fetchAll('id'); - foreach($packageList as $packageID => $package) - { - $packageData = new stdclass(); - $packageData->id = $packageID; - $packageData->parent = $package->module; - $packageData->type = 'package'; - $packageData->order = $package->order; - $packageData->vision = ',rnd,lite,'; - - $this->dao->insert(TABLE_PRIVMANAGER)->data($packageData)->exec(); - - $packageLang = new stdclass(); - $packageLang->objectID = $packageID; - $packageLang->objectType = 'manager'; - $packageLang->lang = 'zh-cn'; - $packageLang->key = ''; - $packageLang->value = $package->name; - $packageLang->desc = $package->desc; - - $this->dao->insert(TABLE_PRIVLANG)->data($packageLang)->exec(); - } - - /* 初始化视图和模块到zt_privmanager */ - $viewPairs = array(); - $modulePairs = array(); - $indexMenu = array(); - $hasStored = false; - $this->app->loadLang('index'); - $this->lang->mainNav = json_decode(json_encode($this->lang->mainNav), true); - - $indexMenu['index'] = "{$this->lang->navIcons['my']} {$this->lang->index->common}|index|index|"; - $this->lang->mainNav = (object)array_merge($indexMenu, $this->lang->mainNav); - foreach($this->config->langs as $lang => $langValue) - { - /* 视图 */ - $viewOrder = 1; - $moduleOrder = 1; - $this->lang->mainNav->general = "{$this->lang->navIcons['my']} {$this->lang->my->shortCommon}|my|index|"; - foreach($views as $moduleMenu) - { - $viewID = 0; - if($moduleMenu != 'general' and isset($this->lang->mainNav->{$moduleMenu})) - { - if(!$hasStored) - { - $viewData = new stdclass(); - $viewData->parent = ''; - $viewData->code = $moduleMenu; - $viewData->type = 'view'; - $viewData->order = $viewOrder * 10; - $viewOrder ++; - - $this->dao->insert(TABLE_PRIVMANAGER)->data($viewData)->exec(); - $viewID = $this->dao->lastInsertId(); - } - else - { - $viewID = $this->dao->select('id')->from(TABLE_PRIVMANAGER) - ->where('`type`')->eq('view') - ->andWhere('code')->eq($moduleMenu) - ->fetch('id'); - } - - $viewLang = new stdclass(); - $viewLang->objectID = $viewID; - $viewLang->objectType = 'manager'; - $viewLang->lang = $lang; - $viewLang->key = $moduleMenu; - $viewLang->value = ''; - $viewLang->desc = ''; - - $this->dao->insert(TABLE_PRIVLANG)->data($viewLang)->exec(); - $viewPairs[$moduleMenu] = $viewID; - } - - /* 模块 */ - $modules = $this->getMenuModules($moduleMenu); - $viewModules = $this->setting->getItem("owner=system&module=priv&key={$moduleMenu}Modules"); - $viewModules = array_filter(explode(',', $viewModules)); - foreach($viewModules as $moduleName) - { - if(!$hasStored) - { - $moduleData = new stdclass(); - $moduleData->parent = (isset($this->lang->navGroup->{$moduleName}) and !in_array($moduleMenu, array('misc', 'conference'))) ? $viewPairs[$moduleMenu] : 0; - $moduleData->code = $moduleName; - $moduleData->type = 'module'; - $moduleData->order = $moduleOrder * 10; - $moduleOrder ++; - - $this->dao->insert(TABLE_PRIVMANAGER)->data($moduleData)->exec(); - $moduleID = $this->dao->lastInsertId(); - } - else - { - $moduleID = $this->dao->select('id')->from(TABLE_PRIVMANAGER) - ->where('`type`')->eq('module') - ->andWhere('code')->eq($moduleName) - ->fetch('id'); - } - - $moduleLang = new stdclass(); - $moduleLang->objectID = $moduleID; - $moduleLang->objectType = 'manager'; - $moduleLang->lang = $lang; - $moduleLang->key = $moduleName; - $moduleLang->value = ''; - $moduleLang->desc = ''; - - $this->dao->insert(TABLE_PRIVLANG)->data($moduleLang)->exec(); - $modulePairs[$moduleName] = $moduleID; - - /* 更新权限包的parent字段 */ - $this->dao->update(TABLE_PRIVMANAGER)->set('`parent`')->eq($moduleID) - ->where('`parent`')->eq($moduleName) - ->andWhere('`type`')->eq('package') - ->exec(); - - /* 更新权限的parent字段 */ - $this->dao->update(TABLE_PRIV)->set('`parent`')->eq($moduleID) - ->where('`parent`')->eq($moduleName) - ->exec(); - } - } - - $hasStored = true; - } - - /* 初始化 view 的edition和vision字段 */ - include $allResourceFile; - $editionMap = array('open' => ',open,biz,max,', 'biz' => ',biz,max,', 'max' => ',max,'); - foreach($views as $edition => $visions) - { - foreach($visions as $vision => $viewList) - { - $vision = $vision == 'lite' ? ',rnd,lite,' : ',rnd,'; - $viewList = unserialize($viewList); - foreach($viewList as $view) - { - if($view == 'menuOrder') continue; - - $this->dao->update(TABLE_PRIVMANAGER) - ->set('edition')->eq("{$editionMap[$edition]}") - ->set('vision')->eq("$vision") - ->where('id')->eq($viewPairs[$view]) - ->exec(); - } - } - } - - /* 初始化 module 和 priv 的edition和vision字段 */ - foreach($resources as $edition => $visions) - { - foreach($visions as $vision => $modules) - { - $vision = $vision == 'lite' ? ',rnd,lite,' : ',rnd,'; - $modules = unserialize($modules); - foreach($modules as $module => $resourceList) - { - if(!empty($modulePairs[$module])) - { - $this->dao->update(TABLE_PRIVMANAGER) - ->set('edition')->eq("{$editionMap[$edition]}") - ->set('vision')->eq("$vision") - ->where('id')->eq($modulePairs[$module]) - ->exec(); - } - - foreach($resourceList as $method => $methodLang) - { - $this->dao->update(TABLE_PRIV) - ->set('edition')->eq("{$editionMap[$edition]}") - ->set('vision')->eq("$vision") - ->where('moduleName')->eq($module) - ->andWhere('methodName')->eq($method) - ->exec(); - } - } - } - } - - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' DROP `module`;'); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' CHANGE `moduleName` `module` varchar(30) NOT NULL;'); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' CHANGE `methodName` `method` varchar(30) NOT NULL;'); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' DROP INDEX `priv`;'); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIV . ' ADD UNIQUE `priv` (`module`,`method`);'); - $this->dbh->exec("ALTER TABLE " . TABLE_PRIV . " CHANGE `parent` `parent` mediumint(8) unsigned NOT NULL;"); - $this->dbh->exec('ALTER TABLE ' . TABLE_PRIVMANAGER . ' CHANGE `parent` `parent` mediumint(8) unsigned NOT NULL;'); - $this->dbh->exec('DROP TABLE IF EXISTS ' . TABLE_PRIVPACKAGE . ';'); - - echo 'success'; - helper::end(); - } - - /** - * Super Model: Init system view, module and privileges. - * - * @access public - * @return void - */ - public function initSystemResources() - { - $allResourceFile = $this->app->getModuleRoot() . 'group/lang/allresources.php'; - if(!file_exists("$allResourceFile")) die("Please execute the commands: touch $allResourceFile; chmod 777 $allResourceFile"); - - $resourceContents = file_get_contents($allResourceFile); - if(!$resourceContents) file_put_contents($allResourceFile, "sortResource(); - $resource = json_decode(json_encode($this->lang->resource), true); - $resource = serialize($resource); - $view = array_keys(json_decode(json_encode($this->lang->mainNav), true)); - $view = serialize($view); - - file_put_contents($allResourceFile, "\$views['{$this->config->edition}']['{$this->config->vision}'] = '$view';\n", FILE_APPEND); - file_put_contents($allResourceFile, "\$resources['{$this->config->edition}']['{$this->config->vision}'] = '$resource';\n", FILE_APPEND); - - echo 'success'; - helper::end(); - } - - /** - * Super Model: Init views, modules and privileges for IPD. - * - * @access public - * @return bool - */ - public function initPrivs4IPD() - { - $views = array_keys(json_decode(json_encode($this->lang->mainNav), true)); - $resources = json_decode(json_encode($this->lang->resource), true); - - $hasStoredPrivs = $this->dao->select('*')->from(TABLE_PRIV)->fetchAll('id'); - foreach($hasStoredPrivs as $privID => $hasStoredPriv) - { - $hasStoredPrivs["{$hasStoredPriv->module}-{$hasStoredPriv->method}"] = $hasStoredPriv; - unset($hasStoredPrivs[$privID]); - } - - $hasStoredManagered = $this->dao->select('*')->from(TABLE_PRIVMANAGER)->where('type')->ne('package')->fetchGroup('type', 'code'); - $hasStoredViews = $hasStoredManagered['view']; - $hasStoredModules = $hasStoredManagered['module']; - - $viewOrder = 1; - $viewPairs = array(); - foreach($views as $view) - { - if($view == 'menuOrder') continue; - - if(!empty($hasStoredViews[$view])) - { - $vision = strpos($hasStoredViews[$view]->vision, ",{$this->config->vision},") !== false ? $hasStoredViews[$view]->vision : $hasStoredViews[$view]->vision . "{$this->config->vision},"; - $edition = strpos($hasStoredViews[$view]->edition, ",{$this->config->edition},") !== false ? $hasStoredViews[$view]->edition : $hasStoredViews[$view]->edition . "{$this->config->edition},"; - - $viewID = $hasStoredViews[$view]->id; - $this->dao->update(TABLE_PRIVMANAGER) - ->set('vision')->eq($vision) - ->set('edition')->eq($edition) - ->where('id')->eq($viewID) - ->exec(); - } - else - { - $viewManager = new stdclass(); - $viewManager->parent = 0; - $viewManager->code = $view; - $viewManager->type = 'view'; - $viewManager->edition = ',ipd,'; - $viewManager->vision = ",{$this->config->vision},"; - $viewManager->order = $viewOrder * 10; - $viewOrder ++; - - $this->dao->insert(TABLE_PRIVMANAGER)->data($viewManager)->exec(); - $viewID = $this->dao->lastInsertId(); - - foreach($this->config->langs as $lang => $langValue) - { - $viewLang = new stdclass(); - $viewLang->objectID = $viewID; - $viewLang->objectType = 'manager'; - $viewLang->lang = $lang; - $viewLang->key = $view; - $viewLang->value = ''; - $viewLang->desc = ''; - - $this->dao->insert(TABLE_PRIVLANG)->data($viewLang)->exec(); - } - } - - $viewPairs[$view] = $viewID; - } - - $moduleOrder = 1; - foreach($resources as $module => $privs) - { - if(!empty($hasStoredModules[$module])) - { - $vision = strpos($hasStoredModules[$module]->vision, ",{$this->config->vision},") !== false ? $hasStoredModules[$module]->vision : $hasStoredModules[$module]->vision . "{$this->config->vision},"; - $edition = strpos($hasStoredModules[$module]->edition, ",{$this->config->edition},") !== false ? $hasStoredModules[$module]->edition : $hasStoredModules[$module]->edition . "{$this->config->edition},"; - - $moduleID = $hasStoredModules[$module]->id; - $this->dao->update(TABLE_PRIVMANAGER) - ->set('vision')->eq($vision) - ->set('edition')->eq($edition) - ->where('id')->eq($moduleID) - ->exec(); - } - else - { - $moduleMenu = isset($this->lang->navGroup->{$module}) ? $this->lang->navGroup->{$module} : ''; - $moduleManager = new stdclass(); - $moduleManager->parent = $moduleMenu ? $viewPairs[$moduleMenu] : 0; - $moduleManager->code = $module; - $moduleManager->type = 'module'; - $moduleManager->edition = ',ipd,'; - $moduleManager->vision = ",{$this->config->vision},"; - $moduleManager->order = $moduleOrder * 10; - $moduleOrder ++; - - $this->dao->insert(TABLE_PRIVMANAGER)->data($moduleManager)->exec(); - $moduleID = $this->dao->lastInsertId(); - - foreach($this->config->langs as $lang => $langValue) - { - $moduleLang = new stdclass(); - $moduleLang->objectID = $moduleID; - $moduleLang->objectType = 'manager'; - $moduleLang->lang = $lang; - $moduleLang->key = $module; - $moduleLang->value = ''; - $moduleLang->desc = ''; - - $this->dao->insert(TABLE_PRIVLANG)->data($moduleLang)->exec(); - } - } - - $privOrder = 1; - foreach($privs as $methodName => $methodLang) - { - if(!empty($hasStoredPrivs["$module-$methodName"])) - { - $vision = strpos($hasStoredPrivs["$module-$methodName"]->vision, ",{$this->config->vision},") !== false ? $hasStoredPrivs["$module-$methodName"]->vision : $hasStoredPrivs["$module-$methodName"]->vision . "{$this->config->vision},"; - $edition = strpos($hasStoredPrivs["$module-$methodName"]->edition, ",{$this->config->edition},") !== false ? $hasStoredPrivs["$module-$methodName"]->edition : $hasStoredPrivs["$module-$methodName"]->edition . "{$this->config->edition},"; - - $this->dao->update(TABLE_PRIV) - ->set('vision')->eq($vision) - ->set('edition')->eq($edition) - ->where('id')->eq($hasStoredPrivs["$module-$methodName"]->id) - ->exec(); - } - else - { - $priv = new stdclass(); - $priv->module = $module; - $priv->method = $methodName; - $priv->parent = $moduleID; - $priv->edition = ',ipd,'; - $priv->vision = ",{$this->config->vision},"; - $priv->system = '1'; - $priv->order = $privOrder * 10; - $privOrder ++; - - $this->dao->insert(TABLE_PRIV)->data($priv)->exec(); - $privID = $this->dao->lastInsertId(); - - foreach($this->config->langs as $lang => $langValue) - { - $privLang = new stdclass(); - $privLang->objectID = $privID; - $privLang->objectType = 'priv'; - $privLang->lang = $lang; - $privLang->key = "{$module}-{$methodLang}"; - $privLang->value = ''; - $privLang->desc = ''; - $this->dao->replace(TABLE_PRIVLANG)->data($privLang)->exec(); - } - } - } - } - - return true; - } - - /** - * Get priv by id. - * - * @param int $privID - * @param string $lang - * @access public - * @return object - */ - public function getPrivByID($privID, $lang = '') - { - if(empty($lang)) $lang = $this->app->getClientLang(); - return $this->dao->select('t1.*,t2.key,t2.value,t2.desc')->from(TABLE_PRIV)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID') - ->where('t1.id')->eq((int)$privID) - ->andWhere('t2.objectType')->eq('priv') - ->andWhere('t2.lang')->eq($lang) - ->fetch(); - } - - /** - * Get priv by id list. - * - * @param string $privIdList - * @access public - * @return array - */ - public function getPrivByIdList($privIdList) - { - return $this->dao->select('t1.*,t2.key,t2.value,t2.desc')->from(TABLE_PRIV)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID') - ->where('t1.id')->in($privIdList) - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->andWhere('t2.lang')->eq($this->app->getClientLang()) - ->andWhere('t2.objectType')->eq('priv') - ->orderBy('order_asc') - ->fetchAll('id'); - } - - /** - * Get priv by module. - * - * @param array $modules - * @access public - * @return array - */ - public function getPrivByModule($modules) - { - $moduleIdList = $this->dao->select('id')->from(TABLE_PRIVMANAGER) - ->where('code')->in($modules) - ->andWhere('`type`')->eq('module') - ->fetchAll('id'); - - $packageIdList = $this->dao->select('id')->from(TABLE_PRIVMANAGER) - ->where('`parent`')->in(array_keys($moduleIdList)) - ->fetchAll('id'); - - $parentsIdList = array_merge(array_keys($moduleIdList), array_keys($packageIdList)); - - $stmt = $this->dao->select('t1.*,t3.`parent` as moduleID,t2.`key`,t2.value,t2.`desc`')->from(TABLE_PRIV)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.objectID') - ->leftJoin(TABLE_PRIVMANAGER)->alias('t3')->on('t1.parent=t3.id') - ->where('t3.id')->in($parentsIdList) - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->andWhere('t2.lang')->eq($this->app->getClientLang()) - ->andWhere('t2.objectType')->eq('priv') - ->orderBy('t1.`order`') - ->query(); - - $privs = array(); - while($priv = $stmt->fetch()) $privs[$priv->moduleID][$priv->parent][$priv->id] = $priv; - return $privs; - } - /** * Get priv list by nav. * @@ -1833,7 +820,7 @@ class groupModel extends model * @access public * @return array */ - public function getPrivListByNav($nav = '', $version = '') + public function getPrivListByNav(string $nav = '', string $version = ''): array { $privList = array(); $allPrivs = array(); @@ -1886,542 +873,13 @@ class groupModel extends model return $privList; } - /** - * Get privs list by module. - * - * @param int $queryID - * @param object $pager - * @access public - * @return array - */ - public function getPrivsListBySearch($queryID = 0, $pager = null) - { - $query = $queryID ? $this->loadModel('search')->getQuery($queryID) : ''; - - /* Get the sql and form status from the query. */ - if($query) - { - $this->session->set('privQuery', $query->sql); - $this->session->set('privForm', $query->form); - } - if($this->session->privQuery == false) $this->session->set('privQuery', ' 1 = 1'); - - $privQuery = $this->session->privQuery; - - $this->loadModel('setting'); - if(strpos($privQuery, '`view`') !== false) - { - preg_match_all("/`view`[^']+'([^']+)'/Ui", $privQuery, $out); - $privQuery = str_replace(array('`view` =', '`view` LIKE', '`view` =', '`view` !=', '`view` NOT LIKE'), array('`view` IN', '`view` IN', '`view` IN', '`view` NOT IN', '`view` NOT IN'), $privQuery); - foreach($out[1] as $view) - { - $view = str_replace('%', '', $view); - $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - $modules = str_replace(',', "','", $modules); - $privQuery = preg_replace("/`view`([^']+)'([%]?{$view}[%]?)'/Ui", "`module`$1('{$modules}')", $privQuery); - } - } - - if(strpos($privQuery, '`recommendPrivs`') !== false) - { - preg_match_all("/`recommendPrivs`[^']+'([^']+)'/Ui", $privQuery, $out); - foreach($out[1] as $priv) - { - $priv = str_replace('%', '', $priv); - if(!empty($priv)) - { - $privQuery = preg_replace(array('/`recommendPrivs`[ ]+=/', '/`recommendPrivs`[ ]+LIKE/', '/`recommendPrivs`[ ]+=/', '/`recommendPrivs`[ ]+!=/', '/`recommendPrivs`[ ]+NOT LIKE/'), array('`recommendPrivs` IN', '`recommendPrivs` IN', '`recommendPrivs` IN', '`recommendPrivs` NOT IN', '`recommendPrivs` NOT IN'), $privQuery); - $privs = $this->dao->select('priv,priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('recommend')->fetchPairs(); - } - else - { - $privQuery = preg_replace(array('/`recommendPrivs`[ ]+=/', '/`recommendPrivs`[ ]+LIKE/', '/`recommendPrivs`[ ]+=/', '/`recommendPrivs`[ ]+!=/', '/`recommendPrivs`[ ]+NOT LIKE/'), array('`recommendPrivs` NOT IN', '`recommendPrivs` NOT IN', '`recommendPrivs` NOT IN', '`recommendPrivs` IN', '`recommendPrivs` IN'), $privQuery); - $privs = $this->dao->select('priv,relationPriv')->from(TABLE_PRIVRELATION)->where('type')->eq('recommend')->fetchPairs(); - $privs = array_unique(array_keys($privs) + array_values($privs)); - } - $privs = implode("','", $privs); - $privs = !empty($privs) ? $privs : 0; - $privQuery = preg_replace("/`recommendPrivs`([^']+)'([%]?{$priv}[%]?)'/Ui", "t1.`id`$1('{$privs}')", $privQuery); - } - } - if(strpos($privQuery, '`dependPrivs`') !== false) - { - preg_match_all("/`dependPrivs`[^']+'([^']*)'/Ui", $privQuery, $out); - foreach($out[1] as $priv) - { - $priv = str_replace('%', '', $priv); - if(!empty($priv)) - { - $privQuery = preg_replace(array('/`dependPrivs`[ ]+=/', '/`dependPrivs`[ ]+LIKE/', '/`dependPrivs`[ ]+=/', '/`dependPrivs`[ ]+!=/', '/`dependPrivs`[ ]+NOT LIKE/'), array('`dependPrivs` IN', '`dependPrivs` IN', '`dependPrivs` IN', '`dependPrivs` NOT IN', '`dependPrivs` NOT IN'), $privQuery); - $privs = $this->dao->select('priv,priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('depend')->fetchPairs(); - } - else - { - $privQuery = preg_replace(array('/`dependPrivs`[ ]+=/', '/`dependPrivs`[ ]+LIKE/', '/`dependPrivs`[ ]+=/', '/`dependPrivs`[ ]+!=/', '/`dependPrivs`[ ]+NOT LIKE/'), array('`dependPrivs` NOT IN', '`dependPrivs` NOT IN', '`dependPrivs` NOT IN', '`dependPrivs` IN', '`dependPrivs` IN'), $privQuery); - $privs = $this->dao->select('priv,relationPriv')->from(TABLE_PRIVRELATION)->where('type')->eq('depend')->fetchPairs(); - $privs = array_unique(array_keys($privs) + array_values($privs)); - } - $privs = implode("','", $privs); - $privs = !empty($privs) ? $privs : 0; - $privQuery = preg_replace("/`dependPrivs`([^']+)'([%]?{$priv}[%]?)'/Ui", "t1.`id`$1('{$privs}')", $privQuery); - } - } - if(strpos($privQuery, '`name`') !== false) $privQuery = str_replace('`name`', 't2.`name`', $privQuery); - if(strpos($privQuery, '`module`') !== false) $privQuery = str_replace('`module`', 't1.`module`', $privQuery); - if(strpos($privQuery, '`desc`') !== false) $privQuery = str_replace('`desc`', 't2.`desc`', $privQuery); - - $views = empty($view) ? $this->setting->getItem("owner=system&module=priv&key=views") : $view; - $views = explode(',', $views); - $modules = ''; - foreach($views as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - $modules = trim($modules, ','); - - return $this->dao->select("t1.*,t2.name,t2.desc, INSTR('$modules', t1.`module`) as moduleOrder")->from(TABLE_PRIV)->alias('t1') - ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv') - ->leftJoin(TABLE_PRIVPACKAGE)->alias('t3')->on('t1.parent=t3.id') - ->where('1=1') - ->andWhere($privQuery) - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->andWhere('t2.lang')->eq($this->app->getClientLang()) - ->orderBy("moduleOrder asc, t3.order asc, `order` asc") - ->page($pager) - ->fetchAll('id'); - } - - /** - * Get priv relation. - * - * @param int $priv - * @param string $type depend|recommend - * @param string $module - * @access public - * @return array - */ - public function getPrivRelation($priv, $type = '', $module = '') - { - $relations = $this->dao->select('t1.type,t2.*,t3.`key`,t3.value')->from(TABLE_PRIVRELATION)->alias('t1') - ->leftJoin(TABLE_PRIV)->alias('t2')->on("t1.relationPriv=CONCAT(t2.module, '-', t2.method)") - ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.objectID') - ->where('t1.priv')->eq($priv) - ->andWhere('t2.edition')->like("%,{$this->config->edition},%") - ->andWhere('t2.vision')->like("%,{$this->config->vision},%") - ->andWhere('t3.objectType')->eq('priv') - ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() - ->beginIF($module)->andWhere('t2.module')->eq($module)->fi() - ->fetchGroup('type', 'id'); - - foreach($relations as $type => $privList) $relations[$type] = $this->transformPrivLang($privList); - - if(!empty($type)) return zget($relations, $type, array()); - return $relations; - } - - /** - * Get priv relation. - * - * @param array $privs - * @param string $type depend|recommend - * @access public - * @return array - */ - public function getPrivRelationsByIdList($privs, $type = '', $returnType = 'name') - { - $privs = $this->dao->select('t1.priv,t3.`key`,t3.value,t1.type,t1.relationPriv')->from(TABLE_PRIVRELATION)->alias('t1') - ->leftJoin(TABLE_PRIV)->alias('t2')->on("t1.relationPriv=CONCAT(t2.module, '-', t2.method)") - ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.objectID') - ->where('t1.priv')->in($privs) - ->andWhere('t2.edition')->like("%,{$this->config->edition},%") - ->andWhere('t2.vision')->like("%,{$this->config->vision},%") - ->andWhere('t3.objectType')->eq('priv') - ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi() - ->fetchGroup('type', 'relationPriv'); - if($returnType == 'idGroup') return $privs; - - $relationPrivs = array(); - foreach($privs as $type => $typePrivs) - { - $typePrivs = $this->transformPrivLang($typePrivs); - $relationPrivs[$type] = array(); - foreach($typePrivs as $priv) $relationPrivs[$type][$priv->priv] = empty($relationPrivs[$type][$priv->priv]) ? $priv->name : "{$relationPrivs[$type][$priv->priv]},{$priv->name}"; - } - - return $relationPrivs; - } - - /** - * Save relation. - * - * @param array $privIdList - * @param string $type depend|recommend - * @access public - * @return bool - */ - public function saveRelation($privIdList, $type) - { - if(is_string($privIdList)) $privIdList = explode(',', $privIdList); - $data = fixer::input('post')->get(); - if(empty($data->relation)) return false; - - foreach($privIdList as $privID) - { - $relation = new stdclass(); - $relation->priv = $privID; - $relation->type = $type; - foreach($data->relation as $privModule => $privRelations) - { - foreach($privRelations as $privRelation) - { - if($privID == $privRelation) continue; - $relation->relationPriv = $privRelation; - $this->dao->replace(TABLE_PRIVRELATION)->data($relation)->exec(); - } - } - } - return true; - } - - /** - * Get priv package tree. - * - * @param string $type - * @return array - **/ - public function getModuleAndPackageTree($type = 'all') - { - $modules = $this->getMenuModules(null, true); - - $tree = array(); - - foreach($modules as $module => $moduleName) - { - if($type == 'all') $tree[$module] = $moduleName; - $packages = $this->getPrivPackagesByModule($module); - foreach($packages as $packageID => $package) - { - $tree[$module . ',' . $packageID] = $moduleName . '/' . $package->name; - } - } - return $tree; - } - - /** - * Create a privilege package. - * - * @access public - * @return int - */ - public function createPriv() - { - $data = fixer::input('post')->get(); - - if(!empty($data->moduleName) and !empty($data->methodName)) - { - $method = $this->dao->select('`moduleName`,`methodName`')->from(TABLE_PRIV)->where('`moduleName`')->eq($data->moduleName)->andWhere('`methodName`')->eq($data->methodName)->fetchPairs(); - if(count($method) > 0) dao::$errors['methodName'] = $this->lang->group->repeatPriv; - } - - $this->config->priv->create->requiredFields = explode(',', $this->config->priv->create->requiredFields); - foreach($this->config->priv->create->requiredFields as $field) - { - if(isset($data->{$field}) and empty($data->{$field})) - { - $langField = 'priv' . ucfirst($field); - dao::$errors[$field] = sprintf($this->lang->error->notempty, $this->lang->group->{$langField}); - } - } - - if(dao::isError()) return false; - - $priv = fixer::input('post')->remove('name,desc,view')->get(); - if(!empty($priv->module)) $priv->order = $this->dao->select('(count(`id`) + 1) * 5 as `order`')->from(TABLE_PRIV)->where('`module`')->eq($priv->module)->andWhere('`package`')->eq($priv->package)->fetch('order'); - $this->dao->insert(TABLE_PRIV)->data($priv)->exec(); - if(dao::isError()) return false; - - $privID = $this->dao->lastInsertId(); - - $privLang = fixer::input('post')->remove('moduleName,methodName,view,module,package')->get(); - $privLang->priv = $privID; - $privLang->lang = $this->app->clientLang; - $this->dao->insert(TABLE_PRIVLANG)->data($privLang)->exec(); - - $this->loadModel('action')->create('privlang', $privID, 'Opened'); - return $packageID; - } - - /** - * update priv info - * - * @param void - * @return void - **/ - public function updatePriv($privID, $lang) - { - $oldPriv = $this->getPrivByID($privID, $lang); - - $data = fixer::input('post')->get(); - - if(!empty($data->moduleName) and !empty($data->methodName)) - { - $method = $this->dao->select('moduleName,methodName')->from(TABLE_PRIV)->where('`moduleName`')->eq($data->moduleName)->andWhere('`methodName`')->eq($data->methodName)->andWhere('id')->ne($privID)->fetchAll('methodName'); - if(count($method) > 0) dao::$errors['methodName'] = $this->lang->group->repeatPriv; - } - - $this->config->priv->edit->requiredFields = explode(',', $this->config->priv->edit->requiredFields); - foreach($this->config->priv->edit->requiredFields as $field) - { - if(isset($data->{$field}) and empty($data->{$field})) - { - $langField = 'priv' . ucfirst($field); - dao::$errors[$field] = sprintf($this->lang->error->notempty, $this->lang->group->{$langField}); - } - } - - if(dao::isError()) return false; - - $priv = fixer::input('post')->remove('name,desc,view')->get(); - if(!empty($priv->module) and $priv->module != $oldPriv->module and $priv->package != $oldPriv->package) $priv->order = $this->dao->select('(count(`id`) + 1) * 5 as `order`')->from(TABLE_PRIV)->where('`module`')->eq($priv->module)->andWhere('`package`')->eq($priv->package)->fetch('order'); - $this->dao->update(TABLE_PRIV)->data($priv)->where('id')->eq($privID)->exec(); - - $privLang = fixer::input('post')->remove('moduleName,methodName,view,module,package')->get(); - $this->dao->update(TABLE_PRIVLANG)->data($privLang)->where('priv')->eq($privID)->andWhere('lang')->eq($lang)->exec(); - - $priv = $this->getPrivByID($privID, $lang); - - $changes = common::createChanges($oldPriv, $priv); - return $changes; - - } - - /** - * Delete a priv. - * - * @param int $privID - * @access public - * @return bool - */ - public function deletePriv($privID) - { - $this->dao->delete()->from(TABLE_PRIV)->where('id')->eq($privID)->exec(); - $this->dao->delete()->from(TABLE_PRIVLANG)->where('priv')->eq($privID)->exec(); - $this->dao->delete()->from(TABLE_PRIVRELATION)->where('priv')->eq($privID)->orWhere('relationPriv')->eq($privID)->exec(); - if(dao::isError()) return false; - } - - /** - * Batch change package. - * - * @param array $privIdList - * @param string $module - * @param int $packageID - * @access public - * @return void - */ - public function batchChangePackage($privIdList, $module, $packageID) - { - $oldPrivs = $this->getPrivByIdList($privIdList); - foreach($privIdList as $privID) - { - $oldPriv = $oldPrivs[$privID]; - if($packageID == $oldPriv->package and $module == $oldPriv->module) continue; - - $priv = new stdclass(); - $priv->module = $module; - $priv->package = $packageID; - - $this->dao->update(TABLE_PRIV)->data($priv)->autoCheck()->where('id')->eq((int)$privID)->exec(); - if(!dao::isError()) $allChanges[$privID] = common::createChanges($oldPriv, $priv); - } - return $allChanges; - } - - /** - * Build priv search form. - * - * @param int $queryID - * @param string $actionURL - * @access public - * @return void - */ - public function buildPrivSearchForm($queryID, $actionURL) - { - $this->config->group->priv->search['actionURL'] = $actionURL; - $this->config->group->priv->search['queryID'] = $queryID; - - $this->loadModel('setting'); - - $views = $this->setting->getItem("owner=system&module=priv&key=views"); - $views = explode(',', $views); - foreach($views as $index => $view) - { - $views[$view] = isset($this->lang->{$view}->common) ? $this->lang->{$view}->common : $view; - unset($views[$index]); - } - - $modules = ''; - foreach(array_keys($views) as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules"); - $modules = trim($modules, ','); - $modules = explode(',', $modules); - $moduleLang = $this->getMenuModules('', true); - foreach($modules as $index => $module) - { - $modules[$module] = zget($moduleLang, $module); - unset($modules[$index]); - } - - $packages = $this->getPrivPackagePairs(); - $packageModules = $this->getPrivPackagePairs('', '', 'module'); - foreach($packages as $packageID => $package) - { - $packages[$packageID] = $modules[$packageModules[$packageID]] . '/' . $package; - } - - $privs = array(); - $privList = $this->getPrivsListByView(); - foreach($privList as $privID => $priv) - { - $privs[$privID] = $modules[$priv->module] . '/' . $priv->name; - } - - $this->config->group->priv->search['params']['view']['values'] = $views; - $this->config->group->priv->search['params']['module']['values'] = $modules; - $this->config->group->priv->search['params']['package']['values'] = $packages; - $this->config->group->priv->search['params']['recommendPrivs']['values'] = $privs; - $this->config->group->priv->search['params']['dependPrivs']['values'] = $privs; - - $this->loadModel('search')->setSearchParams($this->config->group->priv->search); - } - - /** - * Get all priv's lang pairs. - * - * @access public - * @return array - */ - public function getPrivLangPairs() - { - return $this->dao->select('objectID as priv,value as name')->from(TABLE_PRIVLANG) - ->where('lang')->eq($this->app->clientLang) - ->fetchPairs(); - } - - /** - * Update priv order. - * - * @access public - * @return void - */ - public function updatePrivOrder() - { - $data = fixer::input('post')->get(); - foreach($data->orders as $privID => $order) $this->dao->update(TABLE_PRIV)->set('order')->eq($order)->where('id')->eq($privID)->exec(); - } - - /** - * Transform priv lang. - * - * @param array $privs - * @param bool $needPairs - * @access public - * @return array - */ - public function transformPrivLang($privs, $needPairs = false) - { - $privPairs = array(); - foreach($privs as $moduleMethod => $priv) - { - $priv->name = ''; - if(!empty($priv->value)) - { - $priv->name = $priv->value; - } - else - { - list($moduleName, $methodLang) = explode('-', $priv->key); - $actualModule = $moduleName == 'requirement' ? 'story' : $moduleName; - $this->app->loadLang($actualModule); - - $hasLang = (!empty($moduleName) and !empty($methodLang) and isset($this->lang->resource->{$priv->module}) and isset($this->lang->resource->{$priv->module}->{$priv->method})); - if(!$hasLang) - { - unset($privs[$moduleMethod]); - continue; - } - - $priv->name = (!empty($moduleName) and !empty($methodLang) and isset($this->lang->{$moduleName}->$methodLang)) ? $this->lang->{$moduleName}->$methodLang : $priv->method; - } - - $privPairs[$moduleMethod] = $priv->name; - } - - return $needPairs ? $privPairs : $privs; - } - - /** - * Get custom privs. - * - * @param string $menu - * @param array $privs - * @access public - * @return array - */ - public function getCustomPrivs($menu, $privs = array()) - { - $allPrivs = $this->dao->select('module,method')->from(TABLE_PRIV)->where('edition')->like("%,{$this->config->edition},%")->andWhere('vision')->like("%,{$this->config->vision},%")->fetchGroup('module', 'method'); - foreach($this->lang->resource as $module => $methods) - { - if(isset($this->lang->$module->menus) and (empty($menu) or $menu == 'general')) - { - foreach($this->lang->$module->menus as $method => $value) - { - $key = "{$module}-{$method}"; - $priv = new stdclass(); - $priv->id = $key; - $priv->module = $module; - $priv->method = $method; - $priv->action = $key; - $priv->parent = 0; - $priv->key = "{$module}-{$method}"; - $priv->parentCode = $module; - $priv->moduleOrder = 0; - $priv->name = $value; - - $privs[$key] = $priv; - } - } - - foreach($methods as $method => $methodLabel) - { - if(isset($allPrivs[$module][$method])) continue; - if(!$this->checkNavModule($menu, $module)) continue; - if(!isset($this->lang->{$module}->{$methodLabel})) $this->app->loadLang($module); - if(isset($this->lang->$module->menus) and $method == 'browse') continue; - - $key = "{$module}-{$method}"; - $priv = new stdclass(); - $priv->id = $key; - $priv->module = $module; - $priv->method = $method; - $priv->action = $key; - $priv->parent = 0; - $priv->key = "{$module}-{$methodLabel}"; - $priv->parentCode = $module; - $priv->moduleOrder = 0; - $priv->name = isset($this->lang->{$module}->{$methodLabel}) ? $this->lang->{$module}->{$methodLabel} : $method; - - $privs[$key] = $priv; - } - } - return $privs; - } - /** * Load language of resource. * * @access public * @return void */ - public function loadResourceLang() + public function loadResourceLang(): void { foreach($this->lang->resource as $moduleName => $action) $this->app->loadLang($moduleName); @@ -2444,7 +902,7 @@ class groupModel extends model * @access protected * @return array */ - protected function processDepends($depends, $privs, $excludes) + protected function processDepends(array $depends, array $privs, array $excludes): array { foreach($privs as $priv) { @@ -2476,7 +934,7 @@ class groupModel extends model * @access public * @return array */ - public function getRelatedPrivs($allPrivList, $selectedPrivList, $recommendSelect = array()) + public function getRelatedPrivs(array $allPrivList, array $selectedPrivList, array $recommendSelect = array()): array { $this->loadResourceLang(); @@ -2533,25 +991,6 @@ class groupModel extends model return array('depend' => array_values($subsetPrivs['depend']), 'recommend' => array_values($subsetPrivs['recommend'])); } - /** - * Get unassigned privs by module. - * - * @param string $module - * @access public - * @return array - */ - public function getUnassignedPrivsByModule($module) - { - return $this->dao->select('t1.*')->from(TABLE_PRIV)->alias('t1') - ->leftJoin(TABLE_PRIVMANAGER)->alias('t2')->on('t1.parent=t2.id') - ->where('t2.`code`')->eq($module) - ->andWhere('t1.edition')->like("%,{$this->config->edition},%") - ->andWhere('t1.vision')->like("%,{$this->config->vision},%") - ->andWhere('t2.type')->eq('module') - ->orderBy('order_asc') - ->fetchAll('id'); - } - /** * Get privs list by group. * @@ -2559,7 +998,7 @@ class groupModel extends model * @access public * @return array */ - public function getPrivListByGroup($groupID) + public function getPrivListByGroup(int $groupID): array { return $this->dao->select("CONCAT(module, '-', method) AS action")->from(TABLE_GROUPPRIV)->where('`group`')->eq($groupID)->fetchPairs(); } @@ -2570,9 +1009,9 @@ class groupModel extends model * @param string $selectedSubset * @param string $selectedPackages * @access public - * @return bool + * @return array */ - public function getPrivByParents($selectedSubset, $selectedPackages = '') + public function getPrivByParents(string $selectedSubset, string $selectedPackages = ''): array { $allPrivs = array(); $privs = array(); @@ -2580,6 +1019,7 @@ class groupModel extends model /* Privs in package. */ foreach($this->config->group->package as $packageCode => $packageData) { + if(!isset($packageData->privs)) continue; foreach($packageData->privs as $privCode => $priv) { list($moduleName, $methodName) = explode('-', $privCode); @@ -2622,7 +1062,7 @@ class groupModel extends model * @access public * @return string */ - public function getPrivsAfterVersion($version) + public function getPrivsAfterVersion(string $version): string { $realVersion = str_replace('_', '.', $version); $changelog = array(); @@ -2634,19 +1074,4 @@ class groupModel extends model return $versionPrivs; } - - /** - * 更新权限包的排序。 - * Update the order of package. - * - * @param int $id - * @param int $order - * @access public - * @return bool - */ - public function updatePackageOrder(int $id, int $order): bool - { - $this->dao->update(TABLE_PRIVPACKAGE)->set('order')->eq($order)->where('id')->eq($id)->exec(); - return !dao::isError(); - } } diff --git a/module/group/test/group.class.php b/module/group/test/group.class.php index 8d42b1c8a2..b8dce79e19 100755 --- a/module/group/test/group.class.php +++ b/module/group/test/group.class.php @@ -180,22 +180,6 @@ class groupTest return $objects; } - /** - * Get groups by accounts. - * - * @param array $accounts - * @access public - * @return array - */ - public function getByAccountsTest($accounts) - { - $objects = $this->objectModel->getByAccounts($accounts); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - /** * Get the account number in the group. * @@ -245,47 +229,30 @@ class groupTest } /** - * Get user programs of a group. + * 测试getAdmins方法。 + * Test getAdmins method. * - * @param int $groupID + * @param array $idList + * @param string $field * @access public * @return array */ - public function getUserProgramsTest($groupID) + public function getAdminsTest(array $idList, string $field = 'programs'): array { - $objects = $this->objectModel->getUserPrograms($groupID); - - if(dao::isError()) return dao::getError(); - - return $objects; + return $this->objectModel->getAdmins($idList, $field); } /** - * Get the ID of the group that has access to the program. - * - * @access public - * @return array - */ - public function getAccessProgramGroupTest() - { - $objects = $this->objectModel->getAccessProgramGroup(); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - - /** - * Delete a group. + * Remove a group. * * @param int $groupID * @param null $null compatible with that of model::delete() * @access public * @return void */ - public function deleteTest($groupID, $null = null) + public function removeTest($groupID) { - $this->objectModel->delete($groupID, $null = null); + $this->objectModel->remove($groupID); if(dao::isError()) return dao::getError(); @@ -369,90 +336,4 @@ class groupTest return $objects; } - - /** - * Check menu have module - * - * @param string $menu - * @param string $moduleName - * @access public - * @return void - */ - public function checkMenuModuleTest($menu, $moduleName) - { - $objects = $this->objectModel->checkMenuModule($menu, $moduleName); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - - /** - * Get modules in menu - * - * @param string $menu - * @access public - * @return void - */ - public function getMenuModulesTest($menu) - { - $objects = $this->objectModel->getMenuModules($menu); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - - /** - * 获取一条权限的基本信息 - * - * @param int $privID - * @param string $lang - * @access public - * @return void - */ - public function getPrivInfoTest($priv, $lang) - { - $object = $this->objectModel->getPrivInfo($priv, $lang); - if(dao::isError()) return dao::getError(); - return $object; - } - - /** - * 获取模块和权限包option - * - * @access public - * @return array - */ - public function getModuleAndPackageTreeTest() - { - return $this->objectModel->getModuleAndPackageTree(); - } - - /** - * 更新权限 - * - * @access public - * @return void - */ - public function updatePrivTest($privID, $lang) - { - $this->objectModel->updatePrivLang($privID,$lang); - if(dao::isError()) return false; - return true; - } - - /** - * 测试getAdmins方法。 - * Test getAdmins method. - * - * @param array $idList - * @param string $field - * @access public - * @return array - */ - public function getAdminsTest(array $idList, string $field = 'programs'): array - { - return $this->objectModel->getAdmins($idList, $field); - } } diff --git a/module/group/test/model/checkModuleAndPackageTree.php b/module/group/test/model/checkModuleAndPackageTree.php deleted file mode 100644 index 28eb9e0a7c..0000000000 --- a/module/group/test/model/checkModuleAndPackageTree.php +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env php -getModuleAndPackageTree(); -cid=1 -pid=1 - - -*/ -$group = new groupTest(); -var_dump($group->getModuleAndPackageTreeTest()); -r($group->getModuleAndPackageTreeTest()) && p() && e("获取数据"); - diff --git a/module/group/test/model/checkmenumodule.php b/module/group/test/model/checkmenumodule.php deleted file mode 100755 index 9db493507c..0000000000 --- a/module/group/test/model/checkmenumodule.php +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env php -checkMenuModule(); -cid=1 -pid=1 - - - -*/ - -$group = new groupTest(); - -r($group->checkMenuModuleTest('','index')) && p('') && e(1); // 测试获取 '','index' 的返回结果 -r($group->checkMenuModuleTest('my','tree')) && p('') && e(''); // 测试获取 'my','tree' 的返回结果 -r($group->checkMenuModuleTest('none','tree')) && p('') && e(''); // 测试获取 'none','tree' 的返回结果 \ No newline at end of file diff --git a/module/group/test/model/editpriv.php b/module/group/test/model/editpriv.php deleted file mode 100644 index 172b458195..0000000000 --- a/module/group/test/model/editpriv.php +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env php -getPrivInfo(); - * - * cid=1 - * pid=1 - * - */ - -$group = new groupTest(); - -$_POST['name'] = '修改test'; -$_POST['desc'] = '描述描述描述'; -$_POST['module'] = 'webhook'; -r($group->updatePrivTest(3324,'zh-cn')) && p('priv') && e("这是获取到的一条权限"); - -//测试获取 id为3324的权限信息 diff --git a/module/group/test/model/getaccessprogramgroup.php b/module/group/test/model/getaccessprogramgroup.php deleted file mode 100755 index 97f98b3205..0000000000 --- a/module/group/test/model/getaccessprogramgroup.php +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env php -getAccessProgramGroup(); -cid=1 -pid=1 - -测试获取group中用户个数 >> 14 - -*/ - -$group = new groupTest(); -$AccessProgramGroup = $group->getAccessProgramGroupTest(); - -r(count($AccessProgramGroup)) && p('') && e('14'); //测试获取group中用户个数 \ No newline at end of file diff --git a/module/group/test/model/getbyaccounts.php b/module/group/test/model/getbyaccounts.php deleted file mode 100755 index 7b5383737d..0000000000 --- a/module/group/test/model/getbyaccounts.php +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env php -getByAccounts(); -cid=1 -pid=1 - -测试获取用户 outside3 的权限分组信息 >> outside3 -测试获取用户 top2 的权限分组信息 >> top2 -测试获取用户 pd2 的权限分组信息 >> pd2 -测试获取用户 td1 的权限分组信息 >> td1 -测试获取用户 pm1 的权限分组信息 >> pm1 -测试获取用户 po48 的权限分组信息 >> po48 -测试获取用户 dev100 的权限分组信息 >> dev100 -测试获取用户 test2 的权限分组信息 >> test2 - -*/ - -$accountList = array(); -$accountList[0] = array('outside3', 'top2'); -$accountList[1] = array('td1', 'pd2'); -$accountList[2] = array('po48', 'pm1'); -$accountList[3] = array('dev100', 'test2'); - -$group = new groupTest(); -$groups0 = $group->getByAccountsTest($accountList[0]); -$groups1 = $group->getByAccountsTest($accountList[1]); -$groups2 = $group->getByAccountsTest($accountList[2]); -$groups3 = $group->getByAccountsTest($accountList[3]); - -r($groups0['outside3']) && p('0:account') && e('outside3'); //测试获取用户 outside3 的权限分组信息 -r($groups0['top2']) && p('0:account') && e('top2'); //测试获取用户 top2 的权限分组信息 -r($groups1['pd2']) && p('0:account') && e('pd2'); //测试获取用户 pd2 的权限分组信息 -r($groups1['td1']) && p('0:account') && e('td1'); //测试获取用户 td1 的权限分组信息 -r($groups2['pm1']) && p('0:account') && e('pm1'); //测试获取用户 pm1 的权限分组信息 -r($groups2['po48']) && p('0:account') && e('po48'); //测试获取用户 po48 的权限分组信息 -r($groups3['dev100']) && p('0:account') && e('dev100'); //测试获取用户 dev100 的权限分组信息 -r($groups3['test2']) && p('0:account') && e('test2'); //测试获取用户 test2 的权限分组信息 \ No newline at end of file diff --git a/module/group/test/model/getmenumodules.php b/module/group/test/model/getmenumodules.php deleted file mode 100755 index d41130dc34..0000000000 --- a/module/group/test/model/getmenumodules.php +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env php -getMenuModules(); -cid=1 -pid=1 - -测试查询 product 菜单的模块 >> product,branch,story -测试查询 my 菜单的模块 >> my,todo -测试查询 qa 菜单的模块 >> qa,bug,caselib -测试查询 project 菜单的模块 >> design,projectbuild,projectstory - -*/ - -$group = new groupTest(); - -r($group->getMenuModulesTest('product')) && p('0,1,2') && e('product,branch,story'); // 测试查询 product 菜单的模块 -r($group->getMenuModulesTest('my')) && p('0,1') && e('my,todo'); // 测试查询 my 菜单的模块 -r($group->getMenuModulesTest('qa')) && p('0,1,6') && e('qa,bug,caselib'); // 测试查询 qa 菜单的模块 -r($group->getMenuModulesTest('project')) && p('0,3,4') && e('design,projectbuild,projectstory'); // 测试查询 project 菜单的模块 \ No newline at end of file diff --git a/module/group/test/model/getpriv.php b/module/group/test/model/getpriv.php deleted file mode 100644 index 47ec50a552..0000000000 --- a/module/group/test/model/getpriv.php +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env php -getPrivInfo(); - * - * cid=1 - * pid=1 - * - */ - -$group = new groupTest(); - - -r($group->getPrivInfoTest(3324,'zh-cn')) && p('priv') && e("这是获取到的一条权限"); - -//测试获取 id为3324的权限信息 diff --git a/module/group/test/model/getuserprograms.php b/module/group/test/model/getuserprograms.php deleted file mode 100755 index dba3891e58..0000000000 --- a/module/group/test/model/getuserprograms.php +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env php -getUserPrograms(); -cid=1 -pid=1 - - - -*/ - -$groupList = array(1,2,3,4,5); -$userIDList = array('td81','dev100','pd10','td50','td64'); -$resultList = array(74,29,13,43,57); - -$group = new groupTest(); - -r($group->getUserProgramsTest($groupList[0])) && p($userIDList[0]) && e(74); //检查权限分组 1 的用户项目信息 -r($group->getUserProgramsTest($groupList[1])) && p($userIDList[1]) && e(29); //检查权限分组 2 的用户项目信息 -r($group->getUserProgramsTest($groupList[2])) && p($userIDList[2]) && e(13); //检查权限分组 3 的用户项目信息 -r($group->getUserProgramsTest($groupList[3])) && p($userIDList[3]) && e(43); //检查权限分组 4 的用户项目信息 -r($group->getUserProgramsTest($groupList[4])) && p($userIDList[4]) && e(57); //检查权限分组 5 的用户项目信息 \ No newline at end of file diff --git a/module/group/zen.php b/module/group/zen.php index 8bc1fcb5db..fbebcd6101 100644 --- a/module/group/zen.php +++ b/module/group/zen.php @@ -11,6 +11,86 @@ declare(strict_types=1); */ class groupZen extends group { + /** + * 有些权限在resource里添加了,但没有在packagemanager里同步更新,需要追加上 + * Append packages in resource. + * + * @access public + * @return void + */ + public function appendResourcePackages() + { + $allPrivs = array(); + foreach($this->config->group->package as $packageCode => $package) + { + if(empty($package->privs)) continue; + + foreach($package->privs as $privCode => $priv) + { + $allPrivs[$privCode] = $privCode; + } + } + + /* Privs in resource but not in package. */ + foreach($this->lang->resource as $module => $methodList) + { + foreach($methodList as $method => $methodLang) + { + if(isset($allPrivs[$module . '-' . $method])) continue; + + /* Create subset. */ + if(!isset($this->config->group->subset->$module)) + { + $this->config->group->subset->$module = new stdclass(); + $this->config->group->subset->$module->order = 10000; + $this->config->group->subset->$module->nav = $module; + } + + /* Create subset. */ + $methodPackage = array('create' => 'manage', 'batchcreate' => 'manage', 'browse' => 'browse', 'view' => 'browse', 'delete' => 'delete', 'batchdelete' => 'delete', 'edit' => 'manage', 'batchedit' => 'manage'); + $packageName = isset($methodPackage[$method]) ? $methodPackage[$method] : 'other'; + $packageCode = $module . $packageName; + if(!isset($this->config->group->package->$packageCode)) + { + $this->config->group->package->$packageCode = new stdclass(); + $this->config->group->package->$packageCode->order = 5; + $this->config->group->package->$packageCode->subset = $module; + $this->config->group->package->$packageCode->privs = array(); + $this->lang->group->package->$packageCode = $this->lang->group->package->$packageName; + } + + $this->appendWorkflowMenu($packageCode, $module, $method); + } + } + } + + /** + * 工作流列表页面的菜单也需要拆分不同的权限,比如全部、未关闭、已完成 + * Append priv to package of workflow browse menu. + * + * @param string $packageCode + * @param string $module + * @param string $method + * @access protected + * @return mixed + */ + protected function appendWorkflowMenu(string $packageCode, string $module, string $method) + { + /* Browse action in workflow. */ + if(isset($this->lang->$module->menus) && $method == 'browse') + { + $this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,or', 'order' => 5, 'depend' => array(), 'recommend' => array()); + + foreach($this->lang->$module->menus as $flowMethod => $flowName) + { + $this->config->group->package->$packageCode->privs["$module-$flowMethod"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,or', 'order' => 5, 'depend' => array("$module-$method"), 'recommend' => array()); + } + } + else + { + $this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,or', 'order' => 5, 'depend' => array(), 'recommend' => array()); + } + } /** * Manage priv by package or group. * @@ -117,6 +197,7 @@ class groupZen extends group /* Subsets in package. */ foreach($this->config->group->package as $packageCode => $packageData) { + if(!isset($packageData->privs)) continue; foreach($packageData->privs as $privCode => $priv) { list($moduleName, $methodName) = explode('-', $privCode);