在Xoops模块中添加组权限
导航: 上一页 | 首页 | DedeCMS | 帝国CMS | Drupal | PHPCMS | PHP168 | Joomla | PowerEasy | SupeSite
管理员端[ ]
添加权限
一些初始设置(/modules/foo/admin/index.php)
include '../../../include/cp_header.php'; include_once XOOPS_ROOT_PATH.'/class/xoopsform/grouppermform.php'; $module_id = $xoopsModule->getVar('mid');
我们将要设置权限的条目的列表。
大多数情况下,这个将从数据库中检索得到。在这里我们使用静态数组做例子。
<?php $item_list = array('1' => 'Category 1', '2' => 'Category 2', '3' => 'Category 3'); //组权限表单的标题 $title_of_form = 'Permission form for my module'; //权限名称在该模块中应该是唯一的 $perm_name = 'category_permission'; //权限的一个简短描述 $perm_desc = 'Select categories that each group is allowed to view'; //创建及显示表单 $form = new XoopsGroupPermForm($title_of_form, $module_id, $perm_name, $perm_desc); foreach ($item_list as $item_id => $item_name) { $form->addItem($item_id, $item_name); } xoops_cp_header(); echo $form->render(); xoops_cp_footer(); ?>
然后会显示如下图的表单,周围是XOOPS管理面板:
权限设置通过表单提交,该表单会被/modules/system/admin/groupperm.php自动存储在数据库中。
删除权限
如果你从模块中删除了一个条目(例如:删除了一个分类,一个主题),你必须删除该条目的所有组权限。
可以直接调用函数:
xoops_groupperm_deletebymoditem ($module_id, $perm_name, $item_id);
- $module_id:模块ID (必需的)
- $perm_name:权限名称(可选的)
- $item_id:删除条目的ID (可选的)
用户端[ ]
获取当前条目ID
假如一个用户通过HTTP GET方式请求一个分类的内容,变量$_GET['category_id']将被用来识别请求的分类。
该条目唯一的ID将用于校验权限:
$perm_itemid = intval($_GET['category_id']);
指定将要校验的权限
一般情况下这是管理员创建的一个权限名称。
$perm_name = 'Category Permission';
获取当前用户所属群组ID
if ($xoopsUser) { $groups = $xoopsUser->getGroups(); } else { $groups = XOOPS_GROUP_ANONYMOUS; }
获取当前模块ID
$module_id = $xoopsModule->getVar('mid');
得到组权限的句柄
$gperm_handler =& xoops_gethandler('groupperm');
检查当前用户对当前条目的权限
通过访问句柄类的checkRight()方法检查当前用户是否可以使用该分类。
if ($gperm_handler->checkRight($perm_name, $perm_itemid, $groups, $module_id)) { //allowed, so display contents within the category } else { //not allowed, display an error message or redirect to another page }
高级话题:树结构权限处理[ ]
如果条目需要校验有父子树结构的权限,条目的父节点ID作为XoopsGroupForm::addItem() 方法的第三个参数提供。
操作XoopsGroupForm类会生成一个以树型结构显示每个条目的表单。一个条目的权限只有在赋予了与其父节点同样的权限时才可能被添加。
假设我们的分类有如下的树型结构:
Category 1 (ID: 1) +++ Category 2 (ID: 2) ++++++ Category 3 (ID: 3) ++++++ Category 4 (ID: 4) +++++++++ Category 6 (ID: 6) +++ Category 5 (ID: 5) ++++++ Category 8 (ID: 8) Category 7 (ID: 7) +++ Category 9 (ID: 9) ++++++ Category 14 (ID: 14) Category 10 (ID: 10) +++ Category 11 (ID: 11) +++ Category 13 (ID: 13) Category 12 (ID: 12)
上述的分类结构可以用如下的一个数组表现:
$categories[1] = array('name' => 'Category 1', 'parent' => 0); $categories[2] = array('name' => 'Category 2', 'parent' => 1); $categories[3] = array('name' => 'Category 3', 'parent' => 2); $categories[4] = array('name' => 'Category 4', 'parent' => 2); $categories[5] = array('name' => 'Category 5', 'parent' => 1); $categories[6] = array('name' => 'Category 6', 'parent' => 4); $categories[7] = array('name' => 'Category 7', 'parent' => 0); $categories[8] = array('name' => 'Category 8', 'parent' => 5); $categories[9] = array('name' => 'Category 9', 'parent' => 7); $categories[10] = array('name' => 'Category 10', 'parent' => 0); $categories[11] = array('name' => 'Category 11', 'parent' => 10); $categories[12] = array('name' => 'Category 12', 'parent' => 0); $categories[13] = array('name' => 'Category 13', 'parent' => 10); $categories[14] = array('name' => 'Category 14', 'parent' => 9);
当我们添加一个条目到组权限表单,必须提供它的父节点ID作为第三个参数
,pre> foreach ($categories as $cat_id => $cat_data) { $form->addItem($cat_id, $cat_data['name'], $cat_data['parent']); }
如果$cat_id或$cat_data['parent']被MySQL补零,请不要忘记在$form->addItem()前要对其进行intval()操作。
这将生成如下的一个表单:
当该表单被提交,提交的数据将会被验证,所以条目的权限在没有给其父节点相同的权限的情况下是不会被授权的。该验证既要通过客户端 (javascript)也要通过服务器端(php)的验证。因此,在模块的用户方面,没有必要检查请求的条目的父节点条目的权限,只要检查被请求的条目即可。