在 Drupal 7 有机组中创建自定义用户管理操作
Drupal 7 中的 Organic Groups (OG) 有一个基于角色的权限系统,可以按组工作。这个权限系统与主要的 Drupal 权限系统分开工作,这可能会导致一些问题。例如,如果您想授予组角色访问权限以授予其他用户角色,那么您需要授予他们“管理组”权限。这样做的缺点是它覆盖了 Drupal 的核心权限来处理节点删除并允许角色删除组。允许任何用户删除组可能会导致各种问题,因此需要替代方案。
群组人员管理页面(位于 group/node/%nid%/admin/people)有一个批量操作表单,允许用户访问表单来管理用户组成员资格。要允许或拒绝成员,用户只需从列表中选择他们,选择所需的操作并单击更新。这是该页面的 select 语句。
<select><option value="unblock" selected="selected">Approve membership of the selected users</option>
<option value="deny">Deny membership from the selected users</option>
<option value="block">Block membership from the selected users</option>
</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;
}
这将创建一个这样的选择列表。
<select><option value="unblock" selected="selected">Approve membership of the selected users</option>
<option value="deny">Deny membership from the selected users</option>
<option value="block">Block membership from the selected users</option>
<option value="group_lead_grant">Grant group lead role to user </option>
<option value="group_lead_revoke"> Revoke group lead role to user </option>
</select>
The callback functions for the above operations take the group ID (not the node ID) and an array of user ID's as a default. These functions use a function I wrote to load organic group roles by their name, rather than using the gid. There is also a small check to make sure that a user doesn't revoke their own role.
/*** 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;
}
这将创建一个如下所示的选择列表。
<select><option value="unblock" selected="selected">Approve membership of the selected users</option>
<option value="deny">Deny membership from the selected users</option>
<option value="block">Block membership from the selected users</option>
<optgroup label="Group leader administration">
<option value="group_leader_grant">Grant group leader status </option>
<option value="group_leader_revoke">Revoke group leader status </option>
</optgroup>
</select>
这是上面钩子中使用的回调函数。它是一个单一的功能,它会根据从该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;
}
}
}
}
有了这个,我现在可以正确设置组角色权限,这样用户就不能删除组,但可以管理他们组内的用户角色。
以上是 在 Drupal 7 有机组中创建自定义用户管理操作 的全部内容, 来源链接: utcz.com/z/317334.html