Bestimmte BBCodes für bestimmte Gruppen

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
scheibenbrot
Mitglied
Beiträge: 1552
Registriert: 23.12.2005 14:32

Bestimmte BBCodes für bestimmte Gruppen

Beitrag 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
Love is the slowest form of suicide.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
scheibenbrot
Mitglied
Beiträge: 1552
Registriert: 23.12.2005 14:32

Beitrag 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:
Love is the slowest form of suicide.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
scheibenbrot
Mitglied
Beiträge: 1552
Registriert: 23.12.2005 14:32

Beitrag 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:
Love is the slowest form of suicide.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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).
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
xpressive
Mitglied
Beiträge: 96
Registriert: 04.06.2004 13:39

Beitrag von xpressive »

Muss man wirklich extra eine Datenbankabfrage durchführen? Raubt doch sicher nur unnötig Performance. Geht das evtl. nicht effizienter? :(
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Benutzeravatar
xpressive
Mitglied
Beiträge: 96
Registriert: 04.06.2004 13:39

Beitrag 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.
Benutzeravatar
gn#36
Ehrenadmin
Beiträge: 9313
Registriert: 01.10.2006 16:20
Wohnort: Ganz in der Nähe...
Kontaktdaten:

Beitrag 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!
Zuletzt geändert von gn#36 am 24.01.2007 17:30, insgesamt 1-mal geändert.
Begegnungen mit dem Chaos sind fast unvermeidlich, Aber nicht katastrophal, solange man den Durchblick behält.
Übertreiben sollte man's im Forum aber nicht mit dem Chaos, denn da sollen ja andere durchblicken und nicht nur man selbst.
Antworten

Zurück zu „Coding & Technik“