diff --git a/module/group/config.php b/module/group/config.php
index 7c5db1716d..0c031248bb 100644
--- a/module/group/config.php
+++ b/module/group/config.php
@@ -21,6 +21,18 @@ $config->privPackage->edit->requiredFields = 'name,module';
global $lang;
$config->group->priv = new stdclass();
$config->group->priv->search['module'] = 'priv';
-$config->group->priv->search['fields']['name'] = $lang->group->name;
-$config->group->priv->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
+$config->group->priv->search['fields']['name'] = $lang->group->privName;
+$config->group->priv->search['fields']['view'] = $lang->group->view;
+$config->group->priv->search['fields']['module'] = $lang->group->module;
+$config->group->priv->search['fields']['package'] = $lang->privpackage->belong;
+$config->group->priv->search['fields']['recommendPrivs'] = $lang->group->recommendPrivs;
+$config->group->priv->search['fields']['dependentPrivs'] = $lang->group->dependentPrivs;
+$config->group->priv->search['fields']['desc'] = $lang->group->privDesc;
+$config->group->priv->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
+$config->group->priv->search['params']['view'] = array('operator' => '=', 'control' => 'select', 'values' => '');
+$config->group->priv->search['params']['module'] = array('operator' => '=', 'control' => 'select', 'values' => '');
+$config->group->priv->search['params']['package'] = array('operator' => '=', 'control' => 'select', 'values' => '');
+$config->group->priv->search['params']['recommendPrivs'] = array('operator' => 'include', 'control' => 'select', 'values' => '');
+$config->group->priv->search['params']['dependentPrivs'] = array('operator' => 'include', 'control' => 'select', 'values' => '');
+$config->group->priv->search['params']['desc'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
diff --git a/module/group/control.php b/module/group/control.php
index db54bdaf57..f57fee425b 100644
--- a/module/group/control.php
+++ b/module/group/control.php
@@ -382,7 +382,7 @@ class group extends control
}
/**
- * edit manage priv.
+ * Edit manage priv.
*
* @param string $browseType
* @param string $view
@@ -395,26 +395,86 @@ class group extends control
*/
public function editManagePriv($browseType = '', $view = '', $paramID = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1)
{
- if(empty($browseType)) $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard';;
+ if(empty($browseType) and $browseType != 'bysearch') $browseType = $this->cookie->managePrivEditType ? $this->cookie->managePrivEditType : 'bycard';;
+ if($browseType == 'bysearch' and $this->cookie->managePrivEditType == 'bycard') $browseType = 'bycard';
- $this->app->loadClass('pager', $static = true);
- $pager = new pager($recTotal, $recPerPage, $pageID);
+ $moduleLang = $this->group->getMenuModules('', true);
- $privList = $browseType != 'bysearch' ? $this->group->getPrivsListByView($view, $pager) : $this->group->getPrivsListBySearch($pager);
+ if($browseType == 'bycard')
+ {
+ $moduleList = $this->loadModel('setting')->getItem("owner=system&module=priv§ion=&key={$view}Modules");
+ $privGroup = $this->group->getPrivGroup($moduleList);
+ $privPackages = $this->group->getPrivPackagePairs();
+ $privLang = $this->group->getPrivLangPairs();
- /* Build the search form. */
- $queryID = ($browseType == 'bysearch') ? (int)$paramID : 0;
- $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recTotal=$recTotal&recPerPage=$recPerPage");
- $this->group->buildPrivSearchForm($queryID, $actionURL);
+ $privList = array();
+ foreach($privGroup as $module => $privs)
+ {
+ if(!isset($privList[$module])) $privList[$module] = array();
+ foreach($privs as $priv)
+ {
+ if(!isset($privList[$module][$priv->package])) $privList[$module][$priv->package] = array();
+ $privList[$module][$priv->package][$priv->id] = $priv;
+ }
+ }
+
+ $this->view->privLang = $privLang;
+ $this->view->privPackages = $privPackages;
+ }
+ else
+ {
+ $this->app->loadClass('pager', $static = true);
+ $pager = new pager($recTotal, $recPerPage, $pageID);
+
+ $privList = $browseType != 'bysearch' ? $this->group->getPrivsListByView($view, $pager) : $this->group->getPrivsListBySearch($paramID, $pager);
+
+ /* Build the search form. */
+ $queryID = ($browseType == 'bysearch') ? (int)$paramID : 0;
+ $actionURL = $this->createLink('group', 'editManagePriv', "browseType=bysearch&view=¶mID=myQueryID&recTotal=$recTotal&recPerPage=$recPerPage");
+ $this->group->buildPrivSearchForm($queryID, $actionURL);
+
+ $privRelations = $this->group->getPrivRelationsByIdList(array_keys($privList));
+ if(!isset($privRelations['recommend'])) $privRelations['recommend'] = array();
+ if(!isset($privRelations['dependent'])) $privRelations['dependent'] = 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->getPrivPackagesByView($view);
+ $this->view->moduleLang = $moduleLang;
+ $this->view->modulePackages = $this->group->getModuleAndPackageTree();
- $this->view->title = $this->lang->group->editManagePriv;
- $this->view->browseType = $browseType;
- $this->view->privList = $privList;
- $this->view->packages = $this->group->getPrivPackagesByView($view);
- $this->view->pager = $pager;
$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('priv', $privID, 'Edited');
+ $this->action->logHistory($actionID, $changes);
+ }
+ return print(js::reload('parent'));
+ }
+
/**
* Manage privilege packages.
*
@@ -501,52 +561,56 @@ class group extends control
/**
* Add recommendation.
*
- * @param int $privID
+ * @param string $privIdList
* @access public
* @return void
*/
- public function addRecommendation($privID)
+ public function addRecommendation($privIdList)
{
if($_POST)
{
- $this->group->saveRelation(array($privID), 'recommend');
+ $this->group->saveRelation($privIdList, 'recommend');
return print(js::reload('parent'));
}
- $priv = $this->group->getPrivByID($privID);
+ $privs = $this->group->getPrivByIdList($privIdList);
+ $modules = array();
+ foreach($privs as $priv) $modules[$priv->module] = $priv->module;
- $this->view->priv = $priv;
+ $this->view->privs = $privs;
$this->view->modules = array('' => $this->lang->group->selectModule) + $this->group->getMenuModules(null, true);
- $this->view->modulePrivs = $this->group->getPrivByModule($priv->module);
- $this->view->recommends = $this->group->getPrivRelation($priv->id, 'recommend');
+ $this->view->modulePrivs = $this->group->getPrivByModule($modules);
+ $this->view->recommends = $this->group->getPrivRelation($privIdList, 'recommend');
$this->display();
}
/**
* Ajax get priv tree.
*
- * @param int $privID
+ * @param string $privIdList
* @param string $module
* @access public
* @return void
*/
- public function ajaxGetPrivTree($privID, $module)
+ public function ajaxGetPrivTree($privIdList, $module)
{
+ if(is_string($privIdList)) $privIdList = explode(',', $privIdList);
+
$modules = $this->group->getMenuModules(null, true);
$modulePrivs = $this->group->getPrivByModule($module);
- $recommends = $this->group->getPrivRelation($privID, 'recommend', $module);
+ $recommends = $this->group->getPrivRelation($privIdList, 'recommend', $module);
- $tree = '
';
+ $tree = "- ";
$tree .= html::a('#', $modules[$module]);
$tree .= "
";
foreach($modulePrivs[$module] as $id => $modulePriv)
{
- if($privID == $id) continue;
+ if(in_array($id, $privIdList)) continue;
$tree .= '- ';
- $tree .= html::checkbox('relation', array($id => $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : '');
+ $tree .= html::checkbox("relation[$module]", array($id => $modulePriv->name), (empty($recommends) or isset($recommends[$id])) ? $id : '');
$tree .= '
';
}
- $tree .= '
';
+ $tree .= '
';
return print($tree);
}
@@ -554,27 +618,27 @@ class group extends control
* Sort priv packages.
*
* @param int $parentID
- * @param int $grade
+ * @param string $type
* @access public
* @return void
*/
- public function sortPrivPackages($parentID = 0, $grade = 0)
+ public function sortPrivPackages($parentID = 0, $type = '')
{
$orders = $_POST['orders'];
if(empty($orders)) return false;
- if($grade == '1')
+ if($type == 'view')
{
$orders = str_replace('View,', ',', $orders);
$orders = trim($orders, ',');
$this->loadModel('setting')->setItem("system.priv.views", $orders);
}
- if($grade == '2')
+ if($type == 'module')
{
$orders = trim($orders, ',');
$parentID = rtrim($parentID, 'View');
$this->loadModel('setting')->setItem("system.priv.{$parentID}Modules", $orders);
}
- if($grade == '3')
+ if($type == 'package')
{
$orders = explode(',', $orders);
foreach($orders as $index => $id)
@@ -583,18 +647,19 @@ class group extends control
}
}
}
+
/**
* edit priv
*
- * @param int $privID
- * @access public
- * @return void
+ * @param int $privID
+ * @access public
+ * @return void
**/
public function editPriv($privID)
{
- $privID = intval($privID);
+ $privID = intval($privID);
$currentLang = $this->app->clientLang ? : 'zh-cn';
- $priv = $this->group->getPrivInfo($privID, $currentLang);
+ $priv = $this->group->getPrivInfo($privID, $currentLang);
if(!$priv)
{
@@ -624,4 +689,46 @@ class group extends control
$this->view->priv = $priv;
$this->display();
}
+
+ /**
+ * Add dependent privs.
+ *
+ * @access public
+ * @return void
+ */
+ public function addDependent()
+ {
+ $this->display();
+ }
+
+ /**
+ * AJAX: Get priv's related priv list.
+ *
+ * @param int $privID
+ * @param string $type
+ * @access public
+ * @return bool
+ */
+ public function ajaxGetPrivRelations($privID, $type = 'depend')
+ {
+ $moduleLang = $this->group->getMenuModules('', true);
+ $relatedPrivs = $this->group->getPrivRelation($privID);
+
+ if(empty($relatedPrivs)) return print('');
+
+ $privList = array();
+ foreach($relatedPrivs as $relatedPrivID => $relatedPriv)
+ {
+ if(!isset($privList[$relatedPriv->type])) $privList[$relatedPriv->type] = array();
+ if(!isset($privList[$relatedPriv->type][$relatedPriv->module])) $privList[$relatedPriv->type][$relatedPriv->module] = array();
+ $privList[$relatedPriv->type][$relatedPriv->module]['title'] = zget($moduleLang, $relatedPriv->module, $relatedPriv->module);
+ $privList[$relatedPriv->type][$relatedPriv->module]['module'] = $relatedPriv->module;
+ $privList[$relatedPriv->type][$relatedPriv->module]['children'][] = array('title' => $relatedPriv->name);
+ }
+
+ $privList['depend'] = array_values($privList['depend']);
+ $privList['recommend'] = array_values($privList['recommend']);
+
+ return print(json_encode($privList));
+ }
}
diff --git a/module/group/css/editmanagepriv.css b/module/group/css/editmanagepriv.css
index ab30377650..bb94dca5a6 100644
--- a/module/group/css/editmanagepriv.css
+++ b/module/group/css/editmanagepriv.css
@@ -1,8 +1,8 @@
.mt-m {margin-top: 16px;}
-
+.flex-center {display: flex; justify-content: center; align-items: center;}
.flex-space-center {display: flex; justify-content: space-between; align-items: center;}
#mainContent {display: flex; gap: 16px; height: calc(100vh - 120px)}
-#mainContent > .main {flex: 1 1 75%;}
+#mainContent > .main {flex: 1 1 75%; overflow-y: auto; min-height: 480px;}
#mainContent > .side {flex: 1 1 25%;}
.priv-panel {background: #fff; padding: 10px; box-shadow: 0 1px 1px rgb(0 0 0 / 5%), 0 2px 6px 0 rgb(0 0 0 / 5%);}
@@ -10,19 +10,22 @@
.priv-panel > .panel-bottom {padding-top: 20px;}
/* permission-table */
-/* .permission-head {padding-right: 20px;}*/
#permissionEditForm tr {display: flex;}
-#permissionEditForm {overflow-y: auto; height: calc(100vh - 180px)}
.flex-sm {flex: 1 1 15%;}
+.flex-md {flex: 1 1 30%;}
.flex-content {flex: 1 1 70%;}
.sorter-group {display: flex; flex-wrap: wrap;}
-.sorter-group > .group-item {flex: 0 0 25%;}
+.sorter-group > .group-item {flex: 0 0 25%; overflow: hidden;}
.checkbox-primary > input {width: 20px;}
+.permission-row label.active {background: #e6f0ff;}
/* tree */
.tree ul > li {display: inline-block; width: 50%;}
.priv-item > .icon {padding-left: 5px;}
+.empty-tip {height: 100%;}
+#privList .c-name {min-width: 100px;}
#privList .c-view, #privList .c-module, #privList .c-package {width: 100px;}
-#privList .c-privs {width: 180px;}
+#privList .c-privs {min-width: 180px;}
#privList .c-actions {width: 50px;}
+#privList tbody tr td {overflow: hidden; white-space: nowrap;}
diff --git a/module/group/css/manageprivpackage.css b/module/group/css/manageprivpackage.css
index 239f3d0587..6581007e0d 100644
--- a/module/group/css/manageprivpackage.css
+++ b/module/group/css/manageprivpackage.css
@@ -8,4 +8,5 @@
#privPackageTableList > tr.drop-not-allowed {opacity: 0.1!important}
tbody.sortable > tr > td.sort-handler .table-nest-toggle:before {cursor: pointer !important;}
tbody.sortable > tr > td.sort-handler {color: #3c4353 !important;}
-
+.has-nest-child > td > .table-nest-toggle {opacity: unset;}
+.table-nest-toggle {opacity: 0;}
diff --git a/module/group/js/editmanagepriv.js b/module/group/js/editmanagepriv.js
index 7234ab73dc..ad394eea16 100644
--- a/module/group/js/editmanagepriv.js
+++ b/module/group/js/editmanagepriv.js
@@ -1,33 +1,76 @@
+/**
+ * Init comp recomend-tree.
+ *
+ * @param array data
+ * @access public
+ * @return void
+ */
+function initRecomendTree(data)
+{
+ $(".menuTree.depend").tree(
+ {
+ data: data,
+ initialState: 'active',
+ itemCreator: function($li, item)
+ {
+ $li.append('' + item.title + (item.children ? '' : '') + '');
+ if(item.active) $li.addClass('active open in');
+ }
+ });
+};
+
+/**
+ * Init comp depend-tree.
+ *
+ * @param array data
+ * @access public
+ * @return void
+ */
+function initDependTree(data)
+{
+ $(".menuTree.recommend").tree(
+ {
+ data: data,
+ initialState: 'active',
+ itemCreator: function($li, item)
+ {
+ $li.append('' + item.title + (item.children ? '' : '') + '');
+ if(item.active) $li.addClass('active open in');
+ }
+ });
+};
+
+/**
+ * update comp tree after click checkbox-label.
+ *
+ * @param obj objTree
+ * @access public
+ * @return void
+ */
+function updatePrivTree(objTree)
+{
+ $(".menuTree.depend").data('zui.tree').reload(objTree.dependData || [] );
+ if(objTree.dependData && objTree.dependData.length)
+ {
+ $(".menuTree.depend + .empty-tip").addClass('hidden');
+ }
+ else
+ {
+ $(".menuTree.depend + .empty-tip").removeClass('hidden');
+ }
+ $(".menuTree.recommend").data('zui.tree').reload(objTree.recommendData || []);
+ if(objTree.recommendData && objTree.recommendData.length)
+ {
+ $(".menuTree.recommend + .empty-tip").addClass('hidden');
+ }
+ else
+ {
+ $(".menuTree.recommend + .empty-tip").removeClass('hidden');
+ }
+};
+
$(function()
{
- function initRecomendTree(data)
- {
- $(".menuTree.depend").tree(
- {
- data: data,
- initialState: 'active',
- itemCreator: function($li, item)
- {
- $li.append('' + item.title + (item.children ? '' : '') + '');
- if (item.active) $li.addClass('active open in');
- }
- });
- };
-
- function initDependTree(data)
- {
- $(".menuTree.recommend").tree(
- {
- data: data,
- initialState: 'active',
- itemCreator: function($li, item)
- {
- $li.append('' + item.title + (item.children ? '' : '') + '');
- if (item.active) $li.addClass('active open in');
- }
- });
- };
-
$(".menuTree").on('mouseover', ".priv-item", function()
{
$(this).addClass('text-primary');
@@ -38,45 +81,45 @@ $(function()
$(this).find('.icon').addClass('hidden');
});
- var data = [
- {
- title: '地盘',
- children: [
- {title: '地盘仪表盘'},
- {title: '我的项目'},
- {title: '个性化设置'},
- {title: '维护联系人'},
- {title: '我的日程'},
- {title: '地盘仪表盘'},
- {title: '我的项目'},
- {title: '个性化设置'},
- {title: '维护联系人'},
- {title: '我的日程'},
- {title: '地盘仪表盘'},
- {title: '我的项目'},
- {title: '个性化设置'},
- {title: '维护联系人'},
- {title: '我的日程'},
- ]
- }
- ];
- initRecomendTree(data);
- initDependTree(data);
+ initRecomendTree([]);
+ initDependTree([]);
+
$('li.has-list > ul').addClass("menu-active-primary menu-hover-primary");
- $('.sorter-group').sortable();
+ $('.sorter-group').sortable(
+ {
+ 'selector': '.group-item'
+ });
$('.btn-switch').on('click', function()
{
$.cookie('managePrivEditType', $(this).data('type'), {expires: config.cookieLife, path: config.webRoot});
location.href = location.href;
});
- $('.permission-row .checkbox-primary').on('click', 'input', function(e)
+
+ $('.permission-row .checkbox-primary').on('click', 'label', function(e)
{
- console.log($(e.target).attr('type'));
- }).on('click', 'label', function(e)
- {
- if($(e.target).prop('tagName') == 'LABEL');
- console.log('label');
+ e.stopPropagation();
+ if($(e.target).prop('tagName') == 'LABEL')
+ {
+ if($('.permission-row label.bg-primary-pale').length)
+ {
+ $('.permission-row label.bg-primary-pale').removeClass('bg-primary-pale');
+ }
+ $(e.target).addClass('bg-primary-pale');
+ var selectedID = $(this).siblings('input:checkbox').data('id');
+ $.get(createLink('group', 'ajaxGetPrivRelations', "privID=" + selectedID), function(data)
+ {
+ var objTree = {};
+ if(data)
+ {
+ var relatedPriv = JSON.parse(data);
+ objTree = {
+ dependData: relatedPriv.depend,
+ recommendData: relatedPriv.recommend
+ };
+ }
+ updatePrivTree(objTree);
+ })
+ }
});
});
-
diff --git a/module/group/js/manageprivpackage.js b/module/group/js/manageprivpackage.js
index 1f17308144..55b0eec102 100644
--- a/module/group/js/manageprivpackage.js
+++ b/module/group/js/manageprivpackage.js
@@ -6,10 +6,6 @@ $(function()
selector: 'tr',
dragCssClass: 'drag-row',
trigger: $list.find('.sort-handler').length ? '.sort-handler' : null,
- before: function(e)
- {
- // if($(e.event.target).closest('a,.btn').length) return false;
- },
canMoveHere: function($ele, $target)
{
return $ele.data('parent') === $target.data('parent');
@@ -20,15 +16,15 @@ $(function()
},
finish: function(e)
{
- var orders = '';
- var $parent = $(e.element).data('parent');
- var parentID = typeof $parent == 'object' ? $parent.id : 0;
- var grade = typeof $parent == 'object' ? parseInt($parent.level + 1) : 1;
+ var orders = '';
+ var $item = $(e.element);
+ var type = $item.data('type');
+ var parentID = type == 'view' ? 0 : $(e.element).data('parent').id;
$list.find('tr[data-parent="' + parentID + '"]').each(function(){
orders += $(this).data('id') + ',';
});
- $.post(createLink('group', 'sortPrivPackages', 'parent=' + parentID + '&grade=' + grade), {'orders': orders});
+ $.post(createLink('group', 'sortPrivPackages', 'parent=' + parentID + '&type=' + type), {'orders': orders});
e.element.addClass('drop-success');
setTimeout(function(){e.element.removeClass('drop-success');}, 800);
diff --git a/module/group/lang/de.php b/module/group/lang/de.php
index f67ff53f3c..e9549e5f3f 100644
--- a/module/group/lang/de.php
+++ b/module/group/lang/de.php
@@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = 'Sort Priv Package';
$lang->group->addRecommendation = 'Add Recommendation';
$lang->group->selectedPrivs = 'Selected Privilege: %s';
$lang->group->selectModule = 'Select Module';
+$lang->group->recommendPrivs = 'Recommended Privs';
+$lang->group->dependentPrivs = 'Dependented Privs';
-$lang->group->id = 'ID';
-$lang->group->name = 'Name';
-$lang->group->desc = 'Beschreibung';
-$lang->group->role = 'Rolle';
-$lang->group->acl = 'Rechte';
-$lang->group->users = 'Benutzer';
-$lang->group->module = 'Module';
-$lang->group->method = 'Methoden';
-$lang->group->priv = 'Gruppe';
-$lang->group->option = 'Option';
-$lang->group->inside = 'Gruppenbenutzer';
-$lang->group->outside = 'Andere Benutzer';
-$lang->group->limited = 'Limited Users';
-$lang->group->other = 'Andere';
-$lang->group->all = 'Alle';
-$lang->group->config = 'Config';
+$lang->group->id = 'ID';
+$lang->group->name = 'Name';
+$lang->group->desc = 'Beschreibung';
+$lang->group->role = 'Rolle';
+$lang->group->acl = 'Rechte';
+$lang->group->users = 'Benutzer';
+$lang->group->module = 'Module';
+$lang->group->method = 'Methoden';
+$lang->group->priv = 'Gruppe';
+$lang->group->option = 'Option';
+$lang->group->inside = 'Gruppenbenutzer';
+$lang->group->outside = 'Andere Benutzer';
+$lang->group->limited = 'Limited Users';
+$lang->group->other = 'Andere';
+$lang->group->all = 'Alle';
+$lang->group->config = 'Config';
+$lang->group->unassigned = 'Unassigned';
+$lang->group->view = 'View';
if(!isset($lang->privPackage)) $lang->privPackage = new stdclass();
$lang->privpackage->common = 'Priv Package';
diff --git a/module/group/lang/en.php b/module/group/lang/en.php
index c2024c7d9b..04ce460a69 100644
--- a/module/group/lang/en.php
+++ b/module/group/lang/en.php
@@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = 'Sort Priv Package';
$lang->group->addRecommendation = 'Add Recommendation';
$lang->group->selectedPrivs = 'Selected Privilege: %s';
$lang->group->selectModule = 'Select Module';
+$lang->group->recommendPrivs = 'Recommended Privs';
+$lang->group->dependentPrivs = 'Dependented Privs';
-$lang->group->id = 'ID';
-$lang->group->name = 'Group';
-$lang->group->desc = 'Description';
-$lang->group->role = 'Role';
-$lang->group->acl = 'Right';
-$lang->group->users = 'Group Members';
-$lang->group->module = 'Module';
-$lang->group->method = 'Method';
-$lang->group->priv = 'Privilege Group';
-$lang->group->option = 'Option';
-$lang->group->inside = 'Group Users';
-$lang->group->outside = 'Other Users';
-$lang->group->limited = 'Limited Users';
-$lang->group->other = 'Others';
-$lang->group->all = 'All Privileges';
-$lang->group->config = 'Config';
+$lang->group->id = 'ID';
+$lang->group->name = 'Group';
+$lang->group->desc = 'Description';
+$lang->group->role = 'Role';
+$lang->group->acl = 'Right';
+$lang->group->users = 'Group Members';
+$lang->group->module = 'Module';
+$lang->group->method = 'Method';
+$lang->group->priv = 'Privilege Group';
+$lang->group->option = 'Option';
+$lang->group->inside = 'Group Users';
+$lang->group->outside = 'Other Users';
+$lang->group->limited = 'Limited Users';
+$lang->group->other = 'Others';
+$lang->group->all = 'All Privileges';
+$lang->group->config = 'Config';
+$lang->group->unassigned = 'Unassigned';
+$lang->group->view = 'View';
if(!isset($lang->privpackage)) $lang->privpackage = new stdclass();
$lang->privpackage->common = 'Priv Package';
diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php
index fa9776dcf0..d75d5035f7 100644
--- a/module/group/lang/fr.php
+++ b/module/group/lang/fr.php
@@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = 'Sort Priv Package';
$lang->group->addRecommendation = 'Add Recommendation';
$lang->group->selectedPrivs = 'Selected Privilege: %s';
$lang->group->selectModule = 'Select Module';
+$lang->group->recommendPrivs = 'Recommended Privs';
+$lang->group->dependentPrivs = 'Dependented Privs';
-$lang->group->id = 'ID';
-$lang->group->name = 'Groupe';
-$lang->group->desc = 'Description';
-$lang->group->role = 'Rôle';
-$lang->group->acl = 'Right';
-$lang->group->users = 'Membres Groupe';
-$lang->group->module = 'Module';
-$lang->group->method = 'Méthode';
-$lang->group->priv = 'Groupe de Privilèges';
-$lang->group->option = 'Option';
-$lang->group->inside = "Groupe d'utilisateurs";
-$lang->group->outside = 'Autres utilisateurs';
-$lang->group->limited = 'Limited Users';
-$lang->group->other = 'Autres';
-$lang->group->all = 'Tous les Privilèges';
-$lang->group->config = 'Config';
+$lang->group->id = 'ID';
+$lang->group->name = 'Groupe';
+$lang->group->desc = 'Description';
+$lang->group->role = 'Rôle';
+$lang->group->acl = 'Right';
+$lang->group->users = 'Membres Groupe';
+$lang->group->module = 'Module';
+$lang->group->method = 'Méthode';
+$lang->group->priv = 'Groupe de Privilèges';
+$lang->group->option = 'Option';
+$lang->group->inside = "Groupe d'utilisateurs";
+$lang->group->outside = 'Autres utilisateurs';
+$lang->group->limited = 'Limited Users';
+$lang->group->other = 'Autres';
+$lang->group->all = 'Tous les Privilèges';
+$lang->group->config = 'Config';
+$lang->group->unassigned = 'Unassigned';
+$lang->group->view = 'View';
if(!isset($lang->privpackage)) $lang->privpackage = new stdclass();
$lang->privpackage->common = 'Priv Package';
diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php
index d35a1cc8b3..ab60c59d4e 100644
--- a/module/group/lang/zh-cn.php
+++ b/module/group/lang/zh-cn.php
@@ -51,9 +51,9 @@ $lang->group->noGroup = '暂时没有分组。';
$lang->group->repeat = "『%s』已经有『%s』这条记录了,请调整后再试。";
$lang->group->noneProject = '暂时没有项目';
$lang->group->addPriv = '新增权限';
-$lang->group->editPriv = '编辑权限';
-$lang->group->privName = '权限名称';
-$lang->group->privDesc = '描述';
+$lang->group->editPriv = '编辑权限';
+$lang->group->privName = '权限名称';
+$lang->group->privDesc = '描述';
$lang->group->add = '添加';
$lang->group->batchSetDependency = '批量设置依赖';
$lang->group->managePrivPackage = '维护权限包';
@@ -64,23 +64,27 @@ $lang->group->sortPrivPackages = '权限包排序';
$lang->group->addRecommendation = '添加推荐';
$lang->group->selectedPrivs = '选中权限:%s';
$lang->group->selectModule = '选择模块';
+$lang->group->recommendPrivs = '依赖权限';
+$lang->group->dependentPrivs = '推荐权限';
-$lang->group->id = '编号';
-$lang->group->name = '分组名称';
-$lang->group->desc = '分组描述';
-$lang->group->role = '角色';
-$lang->group->acl = '权限';
-$lang->group->users = '用户列表';
-$lang->group->module = '模块';
-$lang->group->method = '方法';
-$lang->group->priv = '权限';
-$lang->group->option = '选项';
-$lang->group->inside = '组内用户';
-$lang->group->outside = '组外用户';
-$lang->group->limited = '受限用户组';
-$lang->group->other = '其他模块';
-$lang->group->all = '所有权限';
-$lang->group->config = '配置';
+$lang->group->id = '编号';
+$lang->group->name = '分组名称';
+$lang->group->desc = '分组描述';
+$lang->group->role = '角色';
+$lang->group->acl = '权限';
+$lang->group->users = '用户列表';
+$lang->group->module = '模块';
+$lang->group->method = '方法';
+$lang->group->priv = '权限';
+$lang->group->option = '选项';
+$lang->group->inside = '组内用户';
+$lang->group->outside = '组外用户';
+$lang->group->limited = '受限用户组';
+$lang->group->other = '其他模块';
+$lang->group->all = '所有权限';
+$lang->group->config = '配置';
+$lang->group->unassigned = '未分配';
+$lang->group->view = '视图';
if(!isset($lang->privpackage)) $lang->privpackage = new stdclass();
$lang->privpackage->common = '权限包';
@@ -89,6 +93,7 @@ $lang->privpackage->name = '权限包名称';
$lang->privpackage->module = '所属模块';
$lang->privpackage->desc = '权限包说明';
$lang->privpackage->belong = '所属权限包';
+
$lang->group->copyOptions['copyPriv'] = '复制权限';
$lang->group->copyOptions['copyUser'] = '复制用户';
diff --git a/module/group/model.php b/module/group/model.php
index 12398d3067..83d4586d52 100644
--- a/module/group/model.php
+++ b/module/group/model.php
@@ -723,11 +723,12 @@ class groupModel extends model
/**
* Get modules in menu
*
- * @param string $menu
+ * @param string $menu
+ * @param bool $translateLang
* @access public
* @return array
*/
- public function getMenuModules($menu, $translateLang = false)
+ public function getMenuModules($menu = '', $translateLang = false)
{
$modules = array();
foreach($this->lang->resource as $moduleName => $action)
@@ -769,16 +770,15 @@ class groupModel extends model
* Create a privilege package.
*
* @access public
- * @return bool
+ * @return int
*/
public function createPrivPackage()
{
$package = fixer::input('post')->get();
- if(isset($package->module))
- {
- $packages = $this->getPrivPackagesByModule($package->module);
- $package->order = (count($packages) + 1) * 5;
- }
+
+ $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');
@@ -790,7 +790,7 @@ class groupModel extends model
*
* @param int $packageID
* @access public
- * @return bool
+ * @return array
*/
public function updatePrivPackage($packageID)
{
@@ -811,6 +811,13 @@ class groupModel extends model
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();
@@ -819,11 +826,11 @@ class groupModel extends model
}
/**
- * Get priv package by ID.
+ * Get priv package by id.
*
* @param int $packageID
* @access public
- * @return void
+ * @return object
*/
public function getPrivPackageByID($packageID)
{
@@ -835,24 +842,47 @@ class groupModel extends model
*
* @param string $module
* @access public
- * @return void
+ * @return array
*/
public function getPrivPackagesByModule($module)
{
return $this->dao->select('*')->from(TABLE_PRIVPACKAGE)->where('module')->eq($module)->orderBy('order_asc')->fetchAll('id');
}
+ /**
+ * Get all priv package pairs.
+ *
+ * @access public
+ * @return array
+ */
+ public function getPrivPackagePairs()
+ {
+ return $this->dao->select('id,name')->from(TABLE_PRIVPACKAGE)->fetchPairs();
+ }
+
/**
* Get priv packages by view.
*
* @param string $view
* @access public
- * @return void
+ * @return array
*/
public function getPrivPackagesByView($view = '')
{
- $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules");
- return $this->dao->select('*')->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('order_asc')->fetchAll('id');
+ $this->loadModel('setting');
+ if(empty($view))
+ {
+ $modules = '';
+ $views = $this->setting->getItem("owner=system&module=priv&key=views");
+ $views = explode(',', $views);
+ foreach($views as $view) $modules .= ',' . $this->setting->getItem("owner=system&module=priv&key={$view}Modules");
+ }
+ else
+ {
+ $modules = $this->setting->getItem("owner=system&module=priv&key={$view}Modules");
+ }
+ $modules = trim($modules, ',');
+ return $this->dao->select('id,name')->from(TABLE_PRIVPACKAGE)->where('module')->in($modules)->orderBy('order_asc')->fetchPairs();
}
/**
@@ -866,10 +896,11 @@ class groupModel extends model
{
$this->loadModel('setting');
- $tree = array();
- $views = empty($viewName) ? $this->setting->getItem("owner=system&module=priv&key=views") : $viewName;
- $views = explode(',', $views);
- $modules = array();
+ $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");
@@ -878,8 +909,7 @@ class groupModel extends model
$viewModules = explode(',', $viewModules);
foreach($viewModules as $index => $module)
{
- $this->app->loadLang($module);
- $modules[$module] = $this->lang->{$view}->common . '/' . $this->lang->{$module}->common;
+ $modules[$module] = $this->lang->{$view}->common . '/' . zget($moduleLang, $module);
unset($viewModules[$index]);
}
}
@@ -901,13 +931,14 @@ class groupModel extends model
if(empty($views)) return array();
$views = explode(',', $views);
- $modules = array();
+ $modules = array();
+ $moduleLang = $this->getMenuModules('', true);
foreach($views as $viewIndex => $view)
{
- $this->app->loadLang($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},";
@@ -922,11 +953,10 @@ class groupModel extends model
$viewModules = explode(',', $viewModules);
foreach($viewModules as $moduleIndex => $module)
{
- $this->app->loadLang($module);
-
$treeModule = new stdclass();
$treeModule->id = $module;
- $treeModule->name = $this->lang->{$module}->common;
+ $treeModule->type = 'module';
+ $treeModule->name = zget($moduleLang, $module);
$treeModule->parent = $viewID;
$treeModule->path = ",{$viewID},{$module},";
$treeModule->grade = 2;
@@ -939,6 +969,7 @@ class groupModel extends model
{
$treePackage = new stdclass();
$treePackage->id = $packageID;
+ $treePackage->type = 'package';
$treePackage->name = $package->name;
$treePackage->parent = $module;
$treePackage->path = ",{$viewID},{$module},{$packageID},";
@@ -1034,6 +1065,22 @@ class groupModel extends model
->fetch();
}
+ /**
+ * Get priv by id list.
+ *
+ * @param string $privIdList
+ * @access public
+ * @return array
+ */
+ public function getPrivByIdList($privIdList)
+ {
+ return $this->dao->select('t1.*,t2.name,t2.desc')->from(TABLE_PRIV)->alias('t1')
+ ->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv')
+ ->where('t1.id')->in($privIdList)
+ ->andWhere('t2.lang')->eq($this->app->getClientLang())
+ ->fetchAll('id');
+ }
+
/**
* Get priv by module.
*
@@ -1061,15 +1108,22 @@ class groupModel extends model
*/
public function getPrivsListByView($view = '', $pager = null)
{
- $modules = $this->loadModel('setting')->getItem("owner=system&module=priv&key={$view}Modules");
- return $this->dao->select('t1.*,t2.name,t2.desc')->from(TABLE_PRIV)->alias('t1')
+ $this->loadModel('setting');
+ $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, ',');
+
+ $privs = $this->dao->select("t1.*,t2.name,t2.desc, INSTR('$modules', `module`) as moduleOrder")->from(TABLE_PRIV)->alias('t1')
->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv')
->where('1=1')
->beginIF(!empty($view))->andWhere('t1.module')->in($modules)->fi()
->andWhere('t2.lang')->eq($this->app->getClientLang())
- ->orderBy('`order`')
+ ->orderBy("moduleOrder asc, `order` asc")
->page($pager)
->fetchAll('id');
+ return $privs;
}
/**
@@ -1094,12 +1148,57 @@ class groupModel extends model
$privQuery = $this->session->privQuery;
- return $this->dao->select('t1.*,t2.name,t2.desc')->from(TABLE_PRIV)->alias('t1')
+ $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);
+ $privQuery = str_replace(array('`recommendPrivs` =', '`recommendPrivs` LIKE', '`recommendPrivs` =', '`recommendPrivs` !=', '`recommendPrivs` NOT LIKE'), array('`recommendPrivs` IN', '`recommendPrivs` IN', '`recommendPrivs` IN', '`recommendPrivs` NOT IN', '`recommendPrivs` NOT IN'), $privQuery);
+ foreach($out[1] as $priv)
+ {
+ $priv = str_replace('%', '', $priv);
+ $privs = $this->dao->select('priv,priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('recommend')->fetchPairs();
+ $privs = implode("','", $privs);
+ $privQuery = preg_replace("/`recommendPrivs`([^']+)'([%]?{$priv}[%]?)'/Ui", (!empty($privs) ? "`id`$1('{$privs}')" : '0=1'), $privQuery);
+ }
+ }
+ if(strpos($privQuery, '`dependentPrivs`') !== false)
+ {
+ preg_match_all("/`dependentPrivs`[^']+'([^']+)'/Ui", $privQuery, $out);
+ $privQuery = str_replace(array('`dependentPrivs` =', '`dependentPrivs` LIKE', '`dependentPrivs` =', '`dependentPrivs` !=', '`dependentPrivs` NOT LIKE'), array('`dependentPrivs` IN', '`dependentPrivs` IN', '`dependentPrivs` IN', '`dependentPrivs` NOT IN', '`dependentPrivs` NOT IN'), $privQuery);
+ foreach($out[1] as $priv)
+ {
+ $priv = str_replace('%', '', $priv);
+ $privs = $this->dao->select('priv,priv')->from(TABLE_PRIVRELATION)->where('relationPriv')->eq($priv)->andWhere('type')->eq('dependent')->fetchPairs();
+ $privs = implode(',', $privs);
+ $privQuery = preg_replace("/`dependentPrivs`([^']+)'([%]?{$priv}[%]?)'/Ui", (!empty($privs) ? "`id`$1('{$privs}')" : '0=1'), $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', `module`) as moduleOrder")->from(TABLE_PRIV)->alias('t1')
->leftJoin(TABLE_PRIVLANG)->alias('t2')->on('t1.id=t2.priv')
->where('1=1')
->andWhere($privQuery)
->andWhere('t2.lang')->eq($this->app->getClientLang())
- ->orderBy('`order`')
+ ->orderBy('`moduleOrder` asc, `order`')
->page($pager)
->fetchAll('id');
}
@@ -1113,16 +1212,62 @@ class groupModel extends model
* @access public
* @return array
*/
- public function getPrivRelation($priv, $type, $module = '')
+ public function getPrivRelation($priv, $type = '', $module = '')
{
- return $this->dao->select('t2.*')->from(TABLE_PRIVRELATION)->alias('t1')
+ return $this->dao->select('t1.type,t2.*,t3.name')->from(TABLE_PRIVRELATION)->alias('t1')
->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id')
- ->where('t1.priv')->eq($priv)
- ->andWhere('t1.type')->eq($type)
+ ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv')
+ ->where('t1.priv')->in($priv)
+ ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi()
->beginIF($module)->andWhere('t2.module')->eq($module)->fi()
->fetchAll('id');
}
+ /**
+ * Get priv relation.
+ *
+ * @param int $priv
+ * @param string $type
+ * @param string $module
+ * @access public
+ * @return array
+ */
+ public function getPrivRelationPairs($priv, $type = '', $module = '')
+ {
+ return $this->dao->select('t2.id,t3.name')->from(TABLE_PRIVRELATION)->alias('t1')
+ ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id')
+ ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv')
+ ->where('t1.priv')->in($priv)
+ ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi()
+ ->beginIF($module)->andWhere('t2.module')->eq($module)->fi()
+ ->fetchPairs();
+ }
+
+ /**
+ * Get priv relation.
+ *
+ * @param array $privs
+ * @access public
+ * @return array
+ */
+ public function getPrivRelationsByIdList($privs, $type = '')
+ {
+ $privs = $this->dao->select('t1.priv,t3.name,t1.type,t1.relationPriv')->from(TABLE_PRIVRELATION)->alias('t1')
+ ->leftJoin(TABLE_PRIV)->alias('t2')->on('t1.relationPriv=t2.id')
+ ->leftJoin(TABLE_PRIVLANG)->alias('t3')->on('t2.id=t3.priv')
+ ->where('t1.priv')->in($privs)
+ ->beginIF(!empty($type))->andWhere('t1.type')->eq($type)->fi()
+ ->fetchGroup('type');
+ $relationPrivs = array();
+ foreach($privs as $type => $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.
*
@@ -1133,18 +1278,28 @@ class groupModel extends model
*/
public function saveRelation($privIdList, $type)
{
+ if(is_string($privIdList)) $privIdList = explode(',', $privIdList);
$data = fixer::input('post')->get();
- $this->dao->delete()->from(TABLE_PRIVRELATION)->where('priv')->in($privIdList)->andWhere('type')->eq($type)->exec();
+ $deleteModuleSQL = $this->dao->select('id')->from(TABLE_PRIV)->where('module')->in(array_keys($data->relation))->get();
+ $this->dao->delete()->from(TABLE_PRIVRELATION)
+ ->where('priv')->in($privIdList)
+ ->andWhere('type')->eq($type)
+ ->andWhere('relationPriv IN(' . $deleteModuleSQL . ')')
+ ->exec();
+
foreach($privIdList as $privID)
{
$relation = new stdclass();
$relation->priv = $privID;
$relation->type = $type;
- foreach($data->relation as $privRelation)
+ foreach($data->relation as $privModule => $privRelations)
{
- $relation->relationPriv = $privRelation;
- $this->dao->insert(TABLE_PRIVRELATION)->data($relation)->exec();
+ foreach($privRelations as $privRelation)
+ {
+ $relation->relationPriv = $privRelation;
+ $this->dao->insert(TABLE_PRIVRELATION)->data($relation)->exec();
+ }
}
}
}
@@ -1152,12 +1307,13 @@ class groupModel extends model
/**
* get a priv
*
- * @param int $privID
- * @return object
+ * @param int $privID
+ * @param string $lang
+ * @return object
**/
public function getPrivInfo($priv,$lang)
{
- $privInfo = $this->dao->select("t1.priv,t1.name,t1.desc,t2.module,t2.package")->from(TABLE_PRIVLANG)->alias('t1')
+ $privInfo = $this->dao->select("t1.priv, t1.name, t1.desc, t2.module, t2.package")->from(TABLE_PRIVLANG)->alias('t1')
->leftJoin(TABLE_PRIV )->alias('t2')
->on("t1.priv = t2.id")
->where('t1.priv')->eq($priv)
@@ -1168,7 +1324,7 @@ class groupModel extends model
return $privInfo;
}
-
+
/**
* get prvi package tree
@@ -1177,14 +1333,14 @@ class groupModel extends model
**/
public function getModuleAndPackageTree()
{
- $modules = $this->getMenuModules(null,true);
+ $modules = $this->getMenuModules(null, true);
$tree = [];
foreach($modules as $module => $moduleName)
{
- $tree[$module] = $moduleName;
- $packages = $this->getPrivPackagesByModule($module);
+ $tree[$module] = $moduleName;
+ $packages = $this->getPrivPackagesByModule($module);
foreach($packages as $packageID => $package)
{
$tree[$module . ',' . $packageID] = $moduleName . '/' . $package->name;
@@ -1195,8 +1351,8 @@ class groupModel extends model
/**
* update Priv Info
*
- * @param void
- * @return void
+ * @param void
+ * @return void
**/
public function updatePrivLang($privID, $lang)
{
@@ -1207,7 +1363,7 @@ class groupModel extends model
if($data->module)
{
$update = [];
- $module = explode(",",$data->module);
+ $module = explode(",", $data->module);
$update['module'] = $module[0];
$update['package'] = 0;
if(count($module) > 1) $update['package'] = $module[1];
@@ -1216,12 +1372,105 @@ class groupModel extends model
}
}
+ /**
+ * 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] = $this->lang->{$view}->common;
+ 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->getPrivPackagesByView('');
+
+ $privs = $this->getPrivLangPairs();
+
+ $this->config->group->priv->search['params']['view']['values'] = array('' => '') + $views;
+ $this->config->group->priv->search['params']['module']['values'] = array('' => '') + $modules;
+ $this->config->group->priv->search['params']['package']['values'] = array('' => '') + $packages;
+ $this->config->group->priv->search['params']['recommendPrivs']['values'] = array('' => '') + $privs;
+ $this->config->group->priv->search['params']['dependentPrivs']['values'] = array('' => '') + $privs;
+
$this->loadModel('search')->setSearchParams($this->config->group->priv->search);
}
-}
+ /**
+ * Get priv group by module.
+ *
+ * @param array $moduleList
+ * @access public
+ * @return array
+ */
+ public function getPrivGroup($moduleList = array())
+ {
+ return $this->dao->select('*')->from(TABLE_PRIV)
+ ->beginIF(!empty($moduleList))->where('module')->in($moduleList)->fi()
+ ->orderBy('order_asc')
+ ->fetchGroup('module');
+ }
+
+ /**
+ * Get all priv's lang pairs.
+ *
+ * @access public
+ * @return array
+ */
+ public function getPrivLangPairs()
+ {
+ return $this->dao->select('priv,name')->from(TABLE_PRIVLANG)
+ ->where('lang')->eq($this->app->clientLang)
+ ->fetchPairs();
+ }
+}
diff --git a/module/group/view/addrecommendation.html.php b/module/group/view/addrecommendation.html.php
index 51c4613ff6..3013e5a81b 100644
--- a/module/group/view/addrecommendation.html.php
+++ b/module/group/view/addrecommendation.html.php
@@ -13,6 +13,7 @@
@@ -20,33 +21,54 @@
-
group->selectedPrivs, $priv->name)?>
+
+ name;
+ $privModules[$priv->module][] = $priv->id;
+ }
+ $privName = implode('、', $privName);
+ printf($lang->group->selectedPrivs, $privName);
+ ?>
+
-id);?>
+
diff --git a/module/group/view/editmanagepriv.html.php b/module/group/view/editmanagepriv.html.php
index d35956ce29..6da4f38a02 100644
--- a/module/group/view/editmanagepriv.html.php
+++ b/module/group/view/editmanagepriv.html.php
@@ -15,6 +15,9 @@
+
-
依赖的权限
- ' . $lang->group->add, '', 'btn btn-primary');?>
+ inLink('addDependent'), $lang->group->add, '', "class='btn btn-primary'");?>
推荐的权限
' . $lang->group->add, '', "class='btn btn-primary iframe'");?>
diff --git a/module/group/view/editmanageprivbycard.html.php b/module/group/view/editmanageprivbycard.html.php
index 950bb72b4e..d61627b047 100644
--- a/module/group/view/editmanageprivbycard.html.php
+++ b/module/group/view/editmanageprivbycard.html.php
@@ -21,49 +21,30 @@
+ $packages):?>
+
+ $privs):?>
- | 首页 |
- 首页 |
-
-
- |
-
-
- | 地盘 |
- 地盘 |
+
+ |
+
+
+ group->unassigned);?> |
+ $priv):?>
-
-
-
+
|
+
+
+
-
diff --git a/module/group/view/editmanageprivbylist.html.php b/module/group/view/editmanageprivbylist.html.php
index 576300167f..02bb2d04e1 100644
--- a/module/group/view/editmanageprivbylist.html.php
+++ b/module/group/view/editmanageprivbylist.html.php
@@ -11,42 +11,77 @@
*/
$lang->privp = new stdclass();
-$lang->privp->name = '权限名称';
-$lang->privp->view = '视图';
-$lang->privp->module = '模块';
-$lang->privp->package = '所属权限包';
$lang->privp->p1 = '依赖权限';
$lang->privp->p2 = '推荐权限';
-$lang->privp->module = '模块';
-$lang->privp->desc = '说明';
?>
-
-
-
- | privp->name;?> |
- privp->view;?> |
- privp->module;?> |
- privp->package;?> |
- privp->p1;?> |
- privp->p2;?> |
- actions;?> |
-
-
-
-
-
- | name;?> |
- lang->navGroup->{$priv->module}) ? $this->lang->navGroup->{$priv->module} : $priv->module;?>
- {$view}->common) ? $lang->{$view}->common : $view;?> |
- {$priv->module}->common) ? $lang->{$priv->module}->common : $priv->module;?> |
- package, '');?> |
- |
- |
- id", '', 'list', 'edit', '', 'iframe', true);?> |
-
-
-
-
-