在 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

回到顶部