在 Drupal 7 有机组中创建自定义用户管理操作
Drupal7中的OrganicGroups(OG)有一个基于角色的权限系统,可以按组工作。这个权限系统与主要的Drupal权限系统分开工作,这可能会导致一些问题。例如,如果您想授予组角色访问权限以授予其他用户角色,那么您需要授予他们“管理组”权限。这样做的缺点是它覆盖了Drupal的核心权限来处理节点删除并允许角色删除组。允许任何用户删除组可能会导致各种问题,因此需要替代方案。
群组人员管理页面(位于group/node/%nid%/admin/people)有一个批量操作表单,允许用户访问表单来管理用户组成员资格。要允许或拒绝成员,用户只需从列表中选择他们,选择所需的操作并单击更新。这是该页面的select语句。
管理组权限还向此操作列表添加了一些选项,以允许他们将角色分配给特定用户。可以使用hook_og_user_operations()钩子将选项添加到此列表中。人员管理页面的正常内容是通过函数控制的og_ui_og_user_operations(),它是这个钩子的一个实现。该函数创建一个操作数组并返回它。
我想要做的是在此列表中添加几个选项,以便具有组权限“更新组”但没有组权限“管理组”的用户能够授予其他用户“组”的角色领导者'。这只是一个特殊的角色,允许他们更新组并管理组内的人员。
实现这一点的最简单方法是创建一个关联的操作数组。每个数组包含选项的“标签”和用于处理命令操作的函数的“回调”。下面的函数将两个元素添加到选择列表中,一个用于添加角色“组长”,另一个用于再次将其删除。
/** * Implements hook_og_user_operations(). */ function mymodule_og_user_operations($form = array(), $form_state = array()) { $operations = array(); if (og_user_access($gid, 'update group') && !og_user_access($gid, 'administer group')) { 'group_lead_grant' => array( 'label' => t('Grant group lead role to user'), 'callback' => 'group_leader_grant', ), 'group_lead_revoke' => array( 'label' => t('Revoke group lead role to user'), 'callback' => 'group_leader_revoke', ) } return $operations; }
这将创建一个这样的选择列表。
ThecallbackfunctionsfortheaboveoperationstakethegroupID(notthenodeID)andanarrayofuserID'sasadefault.ThesefunctionsuseafunctionIwrotetoloadorganicgrouprolesbytheirname,ratherthanusingthegid.Thereisalsoasmallchecktomakesurethatauserdoesn'trevoketheirownrole.
/** * Callback function from mymodule_og_user_operations(). */ function group_leader_grant($gid, $uids) { if (og_user_access($gid, 'update group')) { $accounts = user_load_multiple($uids); $group = mymodule_og_roles_by_name('group leader'); foreach ($accounts as $account) { og_role_grant($gid, $account->uid, $group['rid']); } } } /** * Callback function from mymodule_og_user_operations(). */ function group_leader_revoke($gid, $uids) { global $user; if (og_user_access($gid, 'update group')) { $accounts = user_load_multiple($uids); $group = mymodule_og_roles_by_name('group leader'); foreach ($accounts as $account) { if ($user->uid == $account->uid) { form_set_error('', "You can't revoke your own user account!"); break; } og_role_revoke($gid, $account->uid, $group['rid']); } } }
也可以通过传递一个关联的项目数组作为标签来创建一组选项。数组的索引是选择列表中的组标签。这种方法稍微复杂一些,因为它需要从钩子函数本身内部分配正确的动作。选择的标签数组的索引被传递给$form_state中的函数,并且一个动作用于决定采取什么动作。您可以将代码添加到此函数中,使用与以前相同的回调函数,甚至可以使用接受参数的单个回调函数。
下面的函数实现了一组选项,允许用户选择一个动作,然后定义一个回调函数来运行以处理更改。
/** * Implements hook_og_user_operations(). */ function mymodule_og_user_operations($form = array(), $form_state = array()) { $operations = array(); if (og_user_access($gid, 'update group') && !og_user_access($gid, 'administer group')) { $operations['Group leader administration'] = array( 'label' => array( 'group_leader_grant' => 'Grant group leader status', 'group_leader_revoke' => 'Revoke group leader status' ) ); } if (!empty($form_state['submitted'])) { switch ($form_state['values']['operation']) { case 'group_leader_grant': $operations[$form_state['values']['operation']] = array( 'callback' => 'group_leader_role_edit', 'callback arguments' => array('grant'), ); break; case 'group_leader_revoke': $operations[$form_state['values']['operation']] = array( 'callback' => 'group_leader_role_edit', 'callback arguments' => array('revoke'), ); break; } } return $operations; }
这将创建一个如下所示的选择列表。
这是上面钩子中使用的回调函数。它是一个单一的功能,它会根据从该mymodule_og_user_operations()功能中选择的操作来授予或撤销用户的组长角色。
function group_leader_role_edit($gid, $uids, $op) { global $user; if (og_user_access($gid, 'update group')) { $accounts = user_load_multiple($uids); $group = mymodule_og_roles_by_name('group leader'); foreach ($accounts as $account) { switch ($op) { case 'grant': og_role_grant($gid, $account->uid, $group['rid']); break; case 'revoke': if ($user->uid == $account->uid) { form_set_error('', "You can't revoke your own user account!"); break; } og_role_revoke($gid, $account->uid, $group['rid']); break; } } } }
有了这个,我现在可以正确设置组角色权限,这样用户就不能删除组,但可以管理他们组内的用户角色。