Seite 1 von 2

Bestimmte BBCodes für bestimmte Gruppen

Verfasst: 27.12.2006 00:39
von scheibenbrot
Hallo,
ich brauche einen Script, der einen bestimmten BBCode (es sollten sich mehrere einstellen lassen) nur bei Mitgliedern einer bestimmten Gruppe funktions fähig macht.

Sollte ein Benutzer, welcher kein Mitglied der ausgewählten Gruppe ist, diesen BBCode benutzen soll das gleiche passieren, wie wenn man einen nicht eingebauten Code benutzt:
[bbcode]test[/bbcode] :wink:

mfg

Verfasst: 27.12.2006 02:57
von gn#36
in der bbcode.php Datei in der bbencode_first_pass die zu den Codes gehörigen Zeilen in if Abfragen einfügen, die prüfen, ob der User in einer best. Gruppe ist. Dann wird dem bbcode falls nicht die bbcode_UID nicht hinzugefügt und dementsprechend bei der Darstellung das ganze behandelt wie Illegale bbCodes: gar nicht.
z.B.:

Code: Alles auswählen

if(in_array($userdata['user_id'],array(1,32,45,67)))
{
$text = preg_replace(...[img]xyz[/img]...);
}
Statt

Code: Alles auswählen

$text = preg_replace(...[img]xyz[/img]...);
Dann werden Bilder nur noch dargestellt, wenn der user die ID 1,32,45 oder 67 hat, bei allen anderen wird das als
[img]link[/img] dargestellt.

Vermutlich muss auch noch ein global $userdata; in die Funktion hinein.

Wichtig ist, dass du das nicht die zweite Funktion erwischt, denn diese ist für die Darstellung verantwortlich. Wenn du das dort änderst werden die User in ALLEN Posts die entsprechenden BBcodes nicht mehr betrachten können.

Verfasst: 27.12.2006 10:11
von scheibenbrot
Kann man es noch so abändern, dass man statt die Userid die Gruppenid einträgt??

mfg



edit: Der BBCode soll nur für bestimmte Gruppenmitglieder funktionieren, aber die Funktion soll für normale Mitglieder sichtbar sein, also das Endergebnis, welches ein Gruppen Mitglied erzeugt hat.
Nur wenn eins den BBCode verwendet soll er nicht funktionieren :wink:

Verfasst: 27.12.2006 13:31
von gn#36
Also gut jetzt schaue ich doch noch mal in die Funktion rein, ich habe das nämlich schon irgendwann mal gebraucht in ähnlicher Art und Weise....

So wie ich das angegeben habe wird das grob funktionieren. Ich spiele das mal anhand des bbcodes für das IMG Tag durch, es funktioniert aber auch bei jedem beliebigen anderen.

Also:

Öffne die includes/bbcode.php und betrachte dort die funktion bbencode_first_pass($text, $uid):
Hier findet sich der folgende Code für das IMG Tag:

Code: Alles auswählen

// [img]image_url_here[/img] code..
	$text = preg_replace("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie", "'[img:$uid]\\1' . str_replace(' ', '%20', '\\3') . '[/img:$uid]'", $text);
Dieser macht aus

Code: Alles auswählen

[img]http://www.testbild.de/bild.jpg[/img]
Soetwas:

Code: Alles auswählen

[img:a32de]http://www.testbild.de/bild.jpg[/img:a32de]
Wenn das :a32de fehlt wird der Code beim Anzeigen nicht ersetzt sondern so wie er ist dargestellt.
=> If Abfrage drum herum.

Die sieht dann z.B. so aus:

Code: Alles auswählen

global $db,$userdata;
		$sql = 'SELECT user_id FROM '. USER_GROUP_TABLE . ' WHERE (group_id=8) AND user_id='.$userdata['user_id'];
		if (!$result = $db->sql_query($sql))
		{
			message_die(GENERAL_ERROR, 'Could not obtain group data', '', __LINE__, __FILE__, $sql);
		}
		if($db->sql_numrows($result) || $userdata['user_level'] == ADMIN)
		{
---CODE---
}
Fertig sieht das ganze dann also so aus:

Code: Alles auswählen

global $db,$userdata;
		$sql = 'SELECT user_id FROM '. USER_GROUP_TABLE . ' WHERE (group_id=8) AND user_id='.$userdata['user_id'];
		if (!$result = $db->sql_query($sql))
		{
			message_die(GENERAL_ERROR, 'Could not obtain group data', '', __LINE__, __FILE__, $sql);
		}
		if($db->sql_numrows($result) || $userdata['user_level'] == ADMIN)
		{
// [img]image_url_here[/img] code..
	$text = preg_replace("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie", "'[img:$uid]\\1' . str_replace(' ', '%20', '\\3') . '[/img:$uid]'", $text);
}
Danach können in diesem Fall nur noch user, die in Gruppe 8 Mitglied sind diesen Tag verwenden. - Zumindest in der Theorie, denn getestet habe ich das jetzt noch nicht, aber es funktioniert bei mir in einer ähnlichen Situation.

--> Backup machen und ausprobieren.

EDIT: Ups da habe ich ursprünglich den Originalcode kopiert der in einem anderen Kontext ist, daher ist der 2. Codeblock mit If Abfrage leider falsch gewesen und der Teil mit der Admin-Abfrage bewirkt genau das Gegenteil des gewünschten. Bitte korrigieren.

Verfasst: 27.12.2006 16:58
von scheibenbrot
Und den fertigen Code (den letzen den du gepostet hast) muss ich dann mit dem jetzigen img tag ersetzen??

mfg


edit: toll danke, funktioniert super und genauso wie ich es wollte :wink:

Verfasst: 28.12.2006 14:06
von gn#36
scheibenbrot hat geschrieben:Und den fertigen Code (den letzen den du gepostet hast) muss ich dann mit dem jetzigen img tag ersetzen??
Stimmt genau.
(Damit andere das auch wissen wenn sie das hier in der Suche finden).

Verfasst: 22.01.2007 22:03
von xpressive
Muss man wirklich extra eine Datenbankabfrage durchführen? Raubt doch sicher nur unnötig Performance. Geht das evtl. nicht effizienter? :(

Verfasst: 22.01.2007 22:12
von gn#36
Tja wenn du mir sagst in welcher Variable steht in welchen Gruppen der User Mitglied ist geht das sicher besser. Meines Wissens werden diese Daten jedoch nicht generell abgefragt. Wenn du nur bestimmte User aussperren willst braucht man die Abfrage nicht, dann gehts auch "hardcoded". Genauso wenn du es für alle "normalen" User sperren willst und nur der Admin oder ein beliebiger Moderator die Funktion benutzen darf.

Ich halte das aber nicht für sonderlich Performance - lastig da dieser Code nur dann ausgeführt wird wenn etwas in die Datenbank geschrieben wird oder die Preview Funktion für das Posten genutzt wird, nicht aber beim Darstellen im Forum. Der Code präpariert den Post vor dem Datenbankeintrag, danach muss dann nichts weiter gemacht werden.

Verfasst: 23.01.2007 12:11
von xpressive
Sorry, hab ich vergessen, zu erwähnen -ja, in meinem Fall möchte ich, das NUR der Admin bestimmte BB-Codes benutzen darf.

Verfasst: 23.01.2007 22:36
von gn#36
Na dann sieht das so aus:

Code: Alles auswählen

global $userdata;
if($userdata['user_level'] == ADMIN)
      {
// [img]image_url_here[/img] code..
   $text = preg_replace("#\[img\]((http|ftp|https|ftps)://)([^ \?&=\#\"\n\r\t<]*?(\.(jpg|jpeg|gif|png)))\[/img\]#sie", "'[img:$uid]\\1' . str_replace(' ', '%20', '\\3') . '[/img:$uid]'", $text);
}
Wobei es sich natürlich nicht zwingend um den IMG Tag handeln muss...

Solltest du allerdings auf die Idee kommen URLs sperren zu wollen ist das leider nicht so einfach möglich, da diese erst im bbencode_second_pass verarbeitet werden und somit überhaupt nicht gesichert werden -> Da ist eine kompliziertere Abfrage nötig oder evtl. ein Umbau des bbcode Systems.

Wie immer: Bitte vorher alle zu ändernden Daten sichern!