I think GDmac's answer is the way to go. But I thought it would be fun to start on an extension....
This seems to do the trick, though it is pretty bare-bones (no settings, not much detail in the message shown to the user).
Using the member_delete
hook:
public function member_delete($member_ids)
{
// Array of member group_ids for which to restrict delete permissions
$supervised_member_groups = array('7');
// Array of member group_ids for wich deletion is disallowed
$protected_member_groups = array('5','6');
// The group_id of the current admin
$current_admin_group_id = ee()->session->userdata('group_id');
// Check if the current admin is in the supervised member group
if (in_array($current_admin_group_id, $supervised_member_groups))
{
// Generate an array of group_ids to which the deleted member(s) belong(s)
$member_groups = array();
$query = ee()->db->select('group_id')->where_in('member_id', $member_ids)->get('members');
foreach ($query->result() as $row)
{
array_push($member_groups, $row->group_id);
}
// Check if the deleted member belongs to one of the protected member groups
// and if so throw an error
$overlap = count(array_intersect($protected_member_groups, $member_groups));
if ($overlap) show_error('You are attempting to delete a member from a protected group. Please adjust your selection.');
}
return $member_ids;
}
Gist with full extension