Seite 1 von 8

Auslesen der Gruppenzugehörigkeiten eines benutzers

Verfasst: 02.07.2007 11:08
von FBI
Hi,

bei der Einbindung meines Forums in die Website bin ich auf folgende problemstellung gestoßen:

Ich möchte auf meiner Website einige Seiten machen, die nur für bestimmte Gruppen zugänglich sind. Also z.B. freunde.php nur für Mittglieder der Gruppe "Freunde", kollegen.php nur für Mitglieder der Gruppe "Kollegen" etc.

Ich habe das Forum in die Homepage wie hier beschrieben eingebunden.

Ich hoffe, dass es nicht nötig ist, die Gruppenzugehörigkeit direkt aus der Datenbank auszulesen, da steig ich nicht ganz durch (also wie die Gruppen und die Gruppenzugehörigkeiten in den Datenbanken gespeichert werden, das Tabellenlayout blick ich net...)
Falls doch, könnte mir das ja vielleicht jemand erklären, wäre nett.

Ich dachte mir aber eigentlich, dass die $user-Klasse doch diese Informationen schon enthalten sollte.
Also irgendeine Möglichkeit, ein Array aller Gruppen zu bekommen, in denen ein User mitglied ist, wie gesagt, am besten ohne nocheinmal extra auf die Datenbank zugreifen zu müssen.

Über eine Antwort würde ich mich freuen

FBI

Verfasst: 02.07.2007 11:14
von Dr.Death
Hallo,

nein, diese Info wird nicht im $user Array gespeichert.

Ich habe mir um die Gruppenzugehörigkeit abzufragen eine kleine Funktion gebastelt, die einfach "ja, User ist in der entsprechenden Gruppe" oder "Nein, kein Mitglied" zurückliefert.

Code: Alles auswählen

/**
* get_formel_auth
*
* Get formel auth status
* Returns TRUE if user_id is in $access_group
*/
function get_formel_auth()
{
	global $db, $formel_config, $user;

	$access_group = $formel_config['restrict_to'];
	$sql = 'SELECT g.group_id 
		FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
		WHERE g.group_id = ug.group_id
			AND ug.user_id = ' . $db->sql_escape($user->data['user_id']) . '
			AND ug.user_pending <> ' . TRUE . '
			AND g.group_id = ' . $db->sql_escape($access_group);
	$result = $db->sql_query($sql);

	$check_formel_auth = $db->sql_affectedrows($result);
	$db->sql_freeresult($result);
	if ( $check_formel_auth <> 0 )
	{
		return TRUE;
	}
	return FALSE;
}
Die Zeile:

Code: Alles auswählen

$access_group = $formel_config['restrict_to'];
müsstest Du dir auf Deine verwendete Gruppe anpassen.

Beispiel: "Freunde" sind alle in der Gruppe "Freunde" mit der Gruppen ID 5

Code: Alles auswählen

$access_group = 5;

Verfasst: 29.09.2007 14:57
von RyoBerlin
hmm werd da noch nicht ganz schlau draus.

was macht man dann auf den seiten?

<!-- IF $access_group = 5 --> ....

oder wie geht das dann?

Und woher weis man die Nummer der gruppe?

Verfasst: 30.09.2007 15:01
von Berliner Schildkroete
@RoyoBerlin

Die GruppenID findest du über die Datenbank heraus.
_______________________________________________________________

1. Wo muss ich den Code einbauen, wenn ich ihn mit einem IF-Code einbauen
möche?

Code: Alles auswählen

<!-- IF --> 
2. Wo muss ich den Code einbauen, wenn ich ihn so einbauen möchte:

Code: Alles auswählen

if (!$user->data['is_in irgendeiner Gruppe'])

Verfasst: 30.09.2007 15:34
von RyoBerlin
hmm da hab ich wohl was falsch gemacht

Code: Alles auswählen

Parse error: syntax error, unexpected ')' in /www/htdocs/w0090034/includes/template.php(518) : eval()'d code on line 148

Code: Alles auswählen

<!-- IF --> if (!$user->data['is_in 18']) <a href="{U_USER_MAP}" title="Mitglieder-Karte">MAP</a> | <!-- ENDIF -->

Verfasst: 30.09.2007 21:01
von Dr.Death
Ich glaube Ihr solltet Euch mal in diesem Artikel vertiefen:

http://olympuswiki.naderman.de/Template_Syntax

Die PHP Datei, die Eurer HTML Template steuern soll muss die u.g. Funktion eingebaut haben.

Code: Alles auswählen

/** 
* get_group_auth 
* 
* Get group auth status 
* Returns TRUE if user_id is in $access_group 
*/ 
function get_group_auth($access_group = 5) 
{ 
   global $db, $user; 

    
   $sql = 'SELECT g.group_id 
      FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug 
      WHERE g.group_id = ug.group_id 
         AND ug.user_id = ' . $db->sql_escape($user->data['user_id']) . ' 
         AND ug.user_pending <> ' . TRUE . ' 
         AND g.group_id = ' . $db->sql_escape($access_group); 
   $result = $db->sql_query($sql); 

   $check_group_auth = $db->sql_affectedrows($result); 
   $db->sql_freeresult($result); 
   if ( $check_group_auth <> 0 ) 
   { 
      return TRUE; 
   } 
   return FALSE; 
}
Dann erstellt Ihr Euch in der gleichen PHP eine Abfrage:

Code: Alles auswählen

// Die folgende Zahl ist die ID der Gruppe die Ihr prüfen möchtet
$check_group = 10;

// Ist der User, der diese PHP Datei aufgerufen hat, in der Gruppe mit der o.g. ID ??
$is_in_group = get_group_auth($check_group);

// Wenn der User in dieser Gruppe ist, liefert die Funktion den Wert TRUE zurück.
if ($is_in_group == true)
{
    // Teile dem Template System mit, das die Variable "S_IN_GROUP" den Wert TRUE bekommt
	$template->assign_var('S_IN_GROUP', true);
}
In der zur PHP Datei passenden HTML Template Datei kommt nun folgender "Switch":

Code: Alles auswählen

<!-- IF S_IN_GROUP --><a href="{U_USER_MAP}" title="Mitglieder-Karte">MAP</a> | <!-- ENDIF -->
Sollte der User nicht in der Gruppe gewesen sein, so hat die Variable S_IN_GROUP den Wert "false" und wird somit nicht aktiv.

Verfasst: 30.09.2007 21:55
von RyoBerlin
hmm iss ja schlecht das muss man also in jeder php ändern

index, viewtopic usw...

habs erstmal in die index gepackt und die IF anweisung in die overall header..

resultat ist das beim aufrufen auf der seite steht

Code: Alles auswählen

// Die folgende Zahl ist die ID der Gruppe die Ihr prüfen möchtet $check_group = 18; // Ist der User, der diese PHP Datei aufgerufen hat, in der Gruppe mit der o.g. ID ?? $is_in_group = get_group_auth($check_group); // Wenn der User in dieser Gruppe ist, liefert die Funktion den Wert TRUE zurück. if ($is_in_group == true) { // Teile dem Template System mit, das die Variable "S_IN_GROUP" den Wert TRUE bekommt $template->assign_var('S_IN_GROUP', true); }
hmmm

Verfasst: 30.09.2007 21:58
von Dr.Death
Ich glaube du hast da etwas verwechselt bzw. etwas komplett falsch eingebaut.

Verlinke doch mal bitte deine veränderte index.php ( oder die Datei wo der Code rein soll ) als TXT Datei.

Zudem noch ein kleiner Hinweis:

Die index.php steuert NICHT die overall_header.html
Dafür ist die includes/functions.php zuständig.

Ich werde hier aber keine Schritt für Schritt Anleitung geben, der Code war auch nur ein Beispiel, den sich jeder selber anpassen muss.

Verfasst: 30.09.2007 22:03
von RyoBerlin
ja fehler gerade gesehen... doing ;)

mit dem steuern schau ich gleich danke
---------
nagut ich gebs auf.. jenachdem wo ichs hinsetze kommt ne andere fehlermeldung.. mach ichs weiter oben z,b,

Code: Alles auswählen

Fatal error: Call to a member function on a non-object in /www/htdocs/w0090034/includes/functions.php on line 16
und das war der text in der functions

Code: Alles auswählen

/**
* get_group_auth
*
* Get group auth status
* Returns TRUE if user_id is in $access_group
*/
function get_group_auth($access_group = 5)
{
   global $db, $user;

   
   $sql = 'SELECT g.group_id
      FROM ' . GROUPS_TABLE . ' g, ' . USER_GROUP_TABLE . ' ug
      WHERE g.group_id = ug.group_id
         AND ug.user_id = ' . $db->sql_escape($user->data['user_id']) . '
         AND ug.user_pending <> ' . TRUE . '
         AND g.group_id = ' . $db->sql_escape($access_group);
   $result = $db->sql_query($sql);

   $check_group_auth = $db->sql_affectedrows($result);
   $db->sql_freeresult($result);
   if ( $check_group_auth <> 0 )
   {
      return TRUE;
   }
   return FALSE;
}
// Die folgende Zahl ist die ID der Gruppe die Ihr prüfen möchtet
$check_group = 18;

// Ist der User, der diese PHP Datei aufgerufen hat, in der Gruppe mit der o.g. ID ??
$is_in_group = get_group_auth($check_group);

// Wenn der User in dieser Gruppe ist, liefert die Funktion den Wert TRUE zurück.
if ($is_in_group == true)
{
    // Teile dem Template System mit, das die Variable "S_IN_GROUP" den Wert TRUE bekommt
   $template->assign_var('S_IN_GROUP', true);
}

Verfasst: 01.10.2007 15:45
von Berliner Schildkroete
versuch mal das:
es liegt an:

Code: Alles auswählen

// Teile dem Template System mit, das die Variable "S_IN_GROUP" den Wert TRUE bekommt
   $template->assign_var('S_IN_GROUP', true); 
lösche ihn und füge nach:

Code: Alles auswählen

// The following assigns all _common_ variables that may be used at any point in a template.
	$template->assign_vars(array(
danach einfügen:

Code: Alles auswählen

'S_IN_GROUP'					=> true,
EDIT: DANN IST DER CODE WIRKUNGSLOS :cry:

Mach es einfach in die "normalen Datein"

DANKE DOC DER CODE GEHT WUNDERBAR!!!!!