Gruppenzugehörigkeit prüfen

In diesem moderierten Forum werden Code-Schnipsel, die zu klein sind, um richtige Mods zu sein, abgelegt.
Bei Fragen oder Problemen benutze bitte das Forum phpBB 2.0: Mod Support.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17392
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Gruppenzugehörigkeit prüfen

Beitrag 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.
Antworten

Zurück zu „phpBB 2.0: Snippets“