Statt Custom BBCode ein Ersatz-Bild parsen - Wie?

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

Ist ja oberklasse :grin:

Allerdings bin ich mit meinem Ansatz noch nicht weiter, bzw.
hab noch keine Muße gehabt zu schauen, wie nun das Ersatzbild ausgeworfen wird :-?
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo 4seven,

du könntest es in die Tabelle mit ablegen (Link zum Bild) und dann über die functions_display.php mit ausgeben lassen. Praktisch wäre dann, wenn man das Bild im ACP bei den BBCodes mit angeben könnte.

Gruß Helmut :wink:
Ich bin nicht ganz dicht.... na und.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

mir würde erstmal eine zeile a la

if ([youtube] && guest) {
ersatzbild
}
else
{
[youtube]
}

reichen,

wobei deine begeisterung ansteckend ist :grin:

gruß
4seven
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo 4seven,

besser ist es, wenn du es über die bbcode_id machst, dann kannst du es leichter bei der Abfrage der Tabelle filtern. Ich bin mir jetzt nur nicht sicher, ob das reicht, oder ob ich trotzdem noch den BBCode verwenden kann wenn ich den Code kenne. Wenn das der Fall ist, dann müsste noch an einer anderen Stelle die Abfrage der Berechtigungen gemacht werden.

Gruß Helmut :wink:
Ich bin nicht ganz dicht.... na und.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

Meinte ja auch
4seven hat geschrieben: if (user anonymous) {
ersatzbild
}
else
{
[youtube]
}
sinngemäß natürlich.

bei dem No_Pics_4_Guests gehts ja auch,
das bild wird tatsächlich nicht geparst,
nichtmal im quelltext ist es zu finden

ich check das nochmal und sag dann hier bescheid.

p.s.
ich würd da einen mod draus machen @helmut
ist "genial genug" sag ich ma
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo 4seven,

ich habe nochmal etwas geschaut, in der functions_display.php kannst du die Buttons nur ausblenden. Es geht aber in der message_parser.php und zwar in dem Teil:

Code: Alles auswählen

		// Zero the parsed items array
		$this->parsed_items = array();

		foreach ($this->bbcodes as $tag => $bbcode_data)
		{
			$this->parsed_items[$tag] = 0;
		}

		if (!is_array($rowset))
		{
			global $db;
			$rowset = array();

			$sql = 'SELECT *
				FROM ' . BBCODES_TABLE ."
			$result = $db->sql_query($sql);

			while ($row = $db->sql_fetchrow($result))
			{
				$rowset[] = $row;
			}
			$db->sql_freeresult($result);
		}

		foreach ($rowset as $row)
		{
			$this->bbcodes[$row['bbcode_tag']] = array(
				'bbcode_id'	=> (int) $row['bbcode_id'],
				'regexp'	=> array($row['first_pass_match'] => str_replace('$uid', $this->bbcode_uid, $row['first_pass_replace']))
			);
		}
Wenn du in der SQL Abfrage die betreffenden bbcode_id in einer WHERE Abfrage selektierst, dann kannst du diese nicht parsen lassen. Dazu musst du die SQL Abfrage etwa so gestalten:

Code: Alles auswählen

			$sql = 'SELECT *
				FROM ' . BBCODES_TABLE ."
				WHERE bbcode_id != 15";
			$result = $db->sql_query($sql);
Wenn du die Gruppenabfrage in beiden Dateien machst, dann kannst du die betreffenden BBCodes ausblenden und gleichzeitig nicht parsen lassen. Schwieriger wird es, wenn bestehende BBCodes aber trotzdem gezeigt werden sollen und der User diese nur nicht selber verwenden darf, dann müsste das in der posting.php irgendwie realisiert werden.


[EDIT]
Bei meinen weiteren Versuchen hat sich gezeigt, dass ein einmal so ausgeklammerte BBCode im Forum nicht angezeigt wird, auch wenn diese Änderung WHERE bbcode_id != 15"; wieder zurück genommen wird. Ich vermute daher mal, dass der entsprechende BBCode ohne der Kennung abgespeichert wird, habe es aber noch nicht getestet.


[EDIT2]
Mir ist gerade was eingefallen, wie du das mit dem Ersatzbild realisieren kannst. Du musst dazu noch zwei weitere Spalten in der phpbb3_bbcodes anlegen und zwar eine mit der Kennung ob ein alternativer Code angegeben werden soll und eine Spalte mit dem dazugehörenden Alternativcode. Damit brauchst du nur noch bei der Abfrage zu prüfen, ob der Status für den Alternativcode 1 ist und dann einfach den Code aus der anderen Spalte nehmen. Das ganze lässt sich dann noch mit den Berechtigungen verknüpfen. Damit sollte es eigentlich möglich sein, jeden beliebigen Ersatzcode anzubieten.


Gruß Helmut :wink:
Ich bin nicht ganz dicht.... na und.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo 4seven,

ich habe jetzt noch etwas mit der Sortierung der BBCodes in Verbindung mit den Grafiken rumprobiert, das scheint ein etwas schwerer zu lösendes Problem zu sein. Vermutlich wird es nur gehen, wenn man eine weitere Tabelle anlegt, in welcher die Zuordnungen der fest vorgegebenen BBCodes und die selbst erstellten BBCodes gespeichert sind. Erst dann könnte man eine Sortierung auf alle BBCodes anwenden.

Aber im Grunde funktioniert es, wenn ich die Namen der Grafiken mit zum BBCode ablege und dann aus der Tabelle auslese. Ich habe es so für die ersten Versuche gemacht:

posting_buttons.html

Code: Alles auswählen

<!-- BEGIN custom_tags_pic -->
<img src="{T_IMAGESET_PATH}/buttons/{custom_tags_pic.BBCODE_PIC}.gif" alt=""
id="{custom_tags_pic.BBCODE_TAG}" onclick="bbstyle({custom_tags_pic.BBCODE_NR})"
onmouseover="{custom_tags_pic.BBCODE_TAG}.src='{T_IMAGESET_PATH}/buttons/{custom_tags_pic.BBCODE_PIC}1.gif'; helpline('{custom_tags_pic.BBCODE_TAG}')"
onmouseout="{custom_tags_pic.BBCODE_TAG}.src='{T_IMAGESET_PATH}/buttons/{custom_tags_pic.BBCODE_PIC}.gif'; helpline('tip')" />
<!-- END custom_tags_pic -->
functions_display.php

Code: Alles auswählen

function display_custom_bbcodes_pic()
{
	global $db, $template;

	// Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
	// note for bbcodebox3 : new start counting from 78 for the bbcode ids (every bbcode takes two ids - opening/closing)
	$num_predefined_bbcodes = 78;

	$sql = 'SELECT *
		FROM ' . BBCODES_TABLE . '
		WHERE display_on_posting = 0 
		ORDER BY bbcode_order';
	$result = $db->sql_query($sql);

	$i = 0;
	while ($row = $db->sql_fetchrow($result))
	{
			//echo $row['bbcode_pic'];

	
		$template->assign_block_vars('custom_tags_pic', array(
			'BBCODE_NAME'		=> "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",
			'BBCODE_ID'			=> $num_predefined_bbcodes + ($i * 2),
			'BBCODE_TAG'		=> $row['bbcode_tag'],
			'BBCODE_HELPLINE'	=> $row['bbcode_helpline'],
			'A_BBCODE_HELPLINE'	=> str_replace(array('&', '"', "'", '<', '>'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),
			'BBCODE_PIC'		=> $row['bbcode_pic'],
			'BBCODE_NR'		=> $row['bbcode_nr'],
		));

		$i++;
		
	}
	$db->sql_freeresult($result);
}
Die zusätzlichen Daten habe ich noch von Hand in die Tabelle eingetragen. Hierbei sind noch keine Platzhalter und der gleichen berücksichtigt. Was auch noch ein Problem darstellt, das ist die Mehrsprachigkeit so wie es auch bei den fest vorgegebenen BBCodes der Fall ist.


[EDIT]
Also ich bin ein kleines Stück weiter, es lassen sich alle Buttons beliebig in der Reihenfolge anordnen (im ACP einstellbar). Ich bin dazu her gegangen und habe eine zweite Tabelle angelegt, in der die Infos für die Buttons stehen. Jetzt muss ich noch beide Tabellen miteinander Verbinden, so dass bei der Erstellung eines BBCodes auch die zweite Tabelle entsprechend angepasst wird.

In die zweite Tabelle muss ich dann auch noch eine Funktion einbauen, mit welcher man einen Zeilenumbruch und einen Platzhalter einfügen kann. Danach kommt die Sache mit den Rechten dran, Die Darstellung der Buttons in Abhängigkeit der Rechte ist mit der zweiten Tabelle kein Problem, nur dass dann auch der BBCode entsprechend ausgegeben wird, das ist noch ein größeres Problem.



Gruß Helmut :wink:
Ich bin nicht ganz dicht.... na und.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

Hallo Helmut,

also erstmal herzlichen Dank für deine echt genialen Lösungsansätze :grin:

Hab die Sache nicht weiter verfolgt und erst heute deine Antworten gesehen.
Wenn ich wieder etwas mehr Zeit habe, werde ich das weiter vorantreiben.

Also gibt es definitiv keine andere Lösung!?

Ich hatte die Hoffnung, das es einfacher geht, a la:

Code: Alles auswählen

if (($user->data['user_id'] == ANONYMOUS) && (Datenbankabfrage: Enthält das Post einen youtube Tag))
{
Parse den youtube-Tag + Inhalt nicht, sondern zeige ein Ersatzbild
}
else
{
Parse den youtube-Tag + Inhalt
}
Vielen Dank nochmal

lg
4seven
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Beitrag von Helmut »

Hallo 4seven,

ich habe in letzter Zeit auch nicht mehr weiter gemacht, da ich gerade recht wenig Zeit habe. Wenn ich dich richtig verstanden habe, dann willst du nur bei der Anzeige des Topics die entsprechenden BBCodes durch was anderes ersetzen.

Bis jetzt habe ich die Lösung immer bei der message_parser.php gesucht, aber da ist es nicht so leicht zu lösen. Mir ist dazu noch ein anderer Lösungsweg eingefallen wenn du nur statt dem BBCode mit dem Inhalt an dieser Stelle was anderes anzeigen lassen willst und zwar könnte es in der viewtopic.php gehen. Das müsste die Stelle sein

Code: Alles auswählen

	// Parse the message and subject
	$message = censor_text($row['post_text']);

	// Second parse bbcode here
	if ($row['bbcode_bitfield'])
	{
		$bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
	}

	$message = bbcode_nl2br($message);
	$message = smiley_text($message);
Da könnte man doch mit sowas (Beispiel) was machen,

Code: Alles auswählen

		$row['post_text'] = preg_replace('/\[(center)\]\[(size)=[0-9][0-9][0-9]\:[0-9a-z\:]+\](.*?)\[\/?(size)\:[0-9a-z\:]+\]\[\/?(center)\]/sim', '', $row['post_text']);
den BBCode ausfiltern und durch was anderes ersetzen.

Bei der Sache mit der Sortierung und den Berechtigungen für die BBCodes bleibe ich dran, denke schon dass das so geht wie ich mir das Vorstelle.

Gruß Helmut :wink:
Ich bin nicht ganz dicht.... na und.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Beitrag von 4seven »

Hallo Helmut,

das ist verblüffend, da ich heute früh, nach (mal wieder) stundenlangem rumprobieren :-?, genau die gleichen Gedanken im Kopf hatte: Warum greift man nicht im Postbereich direkt an, in dem man z.b. den Inhalt das Posts, wo sich der Ziel-Tag befindet, einfach ausblendet, dann auch meinetwegen mit einem Ersatztext: "Dieses Post hat Inhalte, die nur von Mitgliedern gesehen werden können, bitte registriere dich, bla.."

Ich glaube das war ein guter Wink. Ich check das mal :)

gruß
4seven
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“