Seite 1 von 1

Gruppenzugehörigkeit prüfen

Verfasst: 30.08.2007 19:57
von Dr.Death
Hier noch ein nettes Snippet von S2B

Am Ende (vor dem ?>) in die includes/functions.php einfügen:

Code: Alles auswählen

//
// Überprüft die Zugehörigkeit eines Benutzers zu einer oder mehreren Gruppen
//
function user_in_group($group_ids, $user_id = false, $and = false)
{
	global $db, $userdata;
	static $cache = array();
	
	if (!$user_id)
	{
		$user_id = $userdata['user_id'];
	}
	
	if (is_string($group_ids))
	{
		$group_ids = explode(',', $group_ids);
	}
	elseif (is_int($group_ids)) 
	{ 
		$group_ids = array($group_ids); 
	}
	
	$check_ids = array();
	for ($i = 0, $count = count($group_ids); $i < $count; $i++)
	{
		$group_ids[$i] = intval($group_ids[$i]);
		if (!isset($cache[$user_id][$group_ids[$i]]))
		{
			$check_ids[] = $group_ids[$i];
		}
	}
	
	if (!empty($check_ids))
	{
		if (!isset($cache[$user_id]))
		{
			$cache[$user_id] = array();
		}
		
		foreach ($check_ids as $check_id)
		{
			$cache[$user_id][$check_id] = false;
		}
		
		$sql = 'SELECT g.group_id
			FROM ' . USER_GROUP_TABLE . ' ug, ' . GROUPS_TABLE . ' g
			WHERE g.group_id = ug.group_id
				AND (ug.user_id = ' . intval($user_id) . '
					OR g.group_moderator = ' . intval($user_id) . ')
				AND ug.group_id IN(' . implode(', ', $check_ids) . ')
			GROUP BY g.group_id';
		if (!$result = $db->sql_query($sql))
		{
			message_die(GENERAL_ERROR, 'Could not obtain groups', '', __LINE__, __FILE__, $sql);
		}
		
		while ($row = $db->sql_fetchrow($result))
		{
			$cache[$user_id][$row['group_id']] = true;
		}
		$db->sql_freeresult($result);
	}
	
	if ($and)
	{
		foreach ($group_ids as $group_id)
		{
			if (!$cache[$user_id][$group_id])
			{
				return false;
			}
		}
		
		return true;
	}
	else
	{
		foreach ($group_ids as $group_id)
		{
			if ($cache[$user_id][$group_id])
			{
				return true;
			}
		}
		
		return false;
	}
}
Beispiele zur Verwendung:

Code: Alles auswählen

user_in_group(3); // aktueller Benutzer in Gruppe 3?
user_in_group('3,5'); // aktueller Benutzer in Gruppen 3 oder 5?
user_in_group(array(3, 5)); // aktueller Benutzer in Gruppen 3 oder 5?
user_in_group('3,5', false, true); // aktueller Benutzer in Gruppen 3 und 5?
user_in_group('3,5,8', $user_id); // Benutzer mit der ID $user_id in Gruppen 3, 5 oder 8?
user_in_group('3,5,8', $user_id, true); // Benutzer mit der ID $user_id in Gruppen 3, 5 und 8?

Edit: Kleinen Fehler ausgebügelt. Danke an Punkface.