Seite 1 von 3

Statt Custom BBCode ein Ersatz-Bild parsen - Wie?

Verfasst: 17.03.2008 06:16
von 4seven
Hallo,

mit dem Plugin Vereinfachtes Verbieten und Erlauben der BBCodes habe ich es schon geschafft, das Benutzen und damit Posten von BBCodes und Custom-BBCodes für Gäste, User und Gruppen zu restriktieren.

In dem Snippet No_Pics_4_Guests habe ich ferner realisiert, das für Gäste statt dem tatsächlich geposteten Bild ein Ersatz-Bild angezeigt wird. Klappt auch super und zuverlässig, da der [img]-Tag dem Include-System (bbcode.php) bekannt ist.

So, nun mein Problem, an dem ich schon einige Tage hänge und nicht weiterkomme:

Wie erreiche ich das für einen Custom-BBCode, also selbst angelegten, wie [youtube], der dem Include-System vom phpbb3 auf php-Ebene (zumindest erstmal) nicht bekannt ist ?

Ich bin mir ziemlich sicher, das es die message_parser.php oder bbcode.php ist, wo man ansetzen müsste, aber ich bin hier auf sql/php-Ebene know-how technisch an der Grenze angelangt. Mit der Bitte um Hilfe.

lg
4seven

Verfasst: 19.03.2008 22:37
von 4seven
Ich frag nochmal nach, ob da wer einen Ansatz für mich hätte :wink:

Verfasst: 19.03.2008 23:59
von djchrisnet

Code: Alles auswählen

$sql = 'SELECT *
				FROM ' . BBCODES_TABLE . '
				WHERE ' . $db->sql_in_set('bbcode_id', $sql);
			$result = $db->sql_query($sql, 3600);

Code: Alles auswählen

$sql = 'SELECT *
				FROM ' . BBCODES_TABLE . '
				WHERE ' . $db->sql_in_set('bbcode_id', $sql) . "
 AND bbcode_tag != 'youtube'";
$result = $db->sql_query($sql, 3600);
vll hilft dir das als anstoß

Verfasst: 20.03.2008 03:33
von 4seven
Der Tip war schonmal Gold wert, Danke :grin:

Sieht jetzt in der bbcode.php so aus***

Resultat > http://sekuro.se.funpic.de/phpbb3/viewt ... &f=13&t=16

youtube wird nicht geparst, sondern im Klartext ausgeworfen.
Schonmal ein Zwischenschritt

Jetzt hänge ich an der Stelle, das statt des non-parsing ein Ersatzbild ausgeworfen wird :-?


***

Code: Alles auswählen

		if (sizeof($sql))
		{
			global $db;
			
	    if ($user->data['user_id'] == ANONYMOUS)		
           {
		   
            $sql = 'SELECT *
            FROM ' . BBCODES_TABLE . '
            WHERE ' . $db->sql_in_set('bbcode_id', $sql) . "
            AND bbcode_tag != 'youtube'";
           $result = $db->sql_query($sql, 3600);

		  while ($row = $db->sql_fetchrow($result))
			{
				// To circumvent replacing newlines with <br /> for the generated html,
				// we use carriage returns here. They are later changed back to newlines
				 $row['bbcode_tpl'] = str_replace("\n", "\r", $row['bbcode_tpl']);
				 $row['second_pass_replace'] = str_replace("\n", "\r", $row['second_pass_replace']);

				 $rowset[$row['bbcode_id']] = $row;
			}
			$db->sql_freeresult($result);
		} 
		else
		{
			$sql = 'SELECT *
				FROM ' . BBCODES_TABLE . '
				WHERE ' . $db->sql_in_set('bbcode_id', $sql);
			$result = $db->sql_query($sql, 3600);

			while ($row = $db->sql_fetchrow($result))
			{
				// To circumvent replacing newlines with <br /> for the generated html,
				// we use carriage returns here. They are later changed back to newlines
				$row['bbcode_tpl'] = str_replace("\n", "\r", $row['bbcode_tpl']);
				$row['second_pass_replace'] = str_replace("\n", "\r", $row['second_pass_replace']);

				$rowset[$row['bbcode_id']] = $row;
			}
			$db->sql_freeresult($result);
		}}

Verfasst: 23.03.2008 22:54
von 4seven
Hallo,

ich frag nochmal, ob wer eine Idee hat, wie der letzte Punkt zu knacken ist?
Ansätze oder Ideen werden auch gern genommen :wink:

Ostergrüße
4seven

Verfasst: 24.03.2008 00:16
von Helmut
Hallo 4seven,

für die Custom BBCodes ist die funktions_display.php verantwortlich, hier die entsprechende Stelle:

Code: Alles auswählen

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

	// Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
	$num_predefined_bbcodes = 22;

	$sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline
		FROM ' . BBCODES_TABLE . '
		WHERE display_on_posting = 1
		ORDER BY bbcode_tag';
	$result = $db->sql_query($sql);

	$i = 0;
	while ($row = $db->sql_fetchrow($result))
	{
		$template->assign_block_vars('custom_tags', 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']),
		));

		$i++;
	}
	$db->sql_freeresult($result);
}
Du könntest hier z.B. über eine zusätzliche Spalte in der Tabelle phpbb3_bbcodes die Berechtigungen mit verarbeiten. Dann könnte man noch im ACP eine zusätzliche Abfrage einbauen, welche Gruppe diesen BBCode verwenden darf. In dieser Funktion kannst du auch die Reihenfolge der Anzeige (ORDER BY bbcode_tag) festlegen.

Gruß Helmut :wink:

Verfasst: 24.03.2008 00:22
von 4seven
Wow, danke für die Info :grin:

Ich denke mal, das hilft (hoffe ich). Mit ACP-Modulen basteln bin ich allerdings (noch) nicht firm.
Ferner wüßte ich jetzt nicht, wie man die von dir genannte Verarbeitung da einfügt.
Vielleicht finde ich mal die Zeit, mich da einzufummeln :-?

thx
4seven

Verfasst: 24.03.2008 00:27
von Helmut
Hallo 4seven,

du brauchst ja nur das vorhande ACP Modul acp_bbcodes.php erweitern und die html dazu anpassen.

Gruß Helmut :wink:

Verfasst: 24.03.2008 00:29
von 4seven
Hm, recht hast Du. Im Grunde dürfte das zu wuppen sein.
Muß aber erstmal die reine Funktion auf functions_display-Ebene realisieren.
Dann schau ich mal weiter :)

Verfasst: 25.03.2008 20:12
von Helmut
Hallo 4seven,

ich habe in ein paar freien Minuten die Sortierung für die BBCodes ins ACP eingebaut. Ich brauchte nur am Anfang etwas bis ich das raus hatte, wie es mit den UP/DOWN Buttons geht. Hier nun die Anleitung:


1. Öffne die includes/acp/acp_bbcodes.php und finde darin

Code: Alles auswählen

$sql_ary['bbcode_id'] = (int) $bbcode_id;
Füge danach ein:

Code: Alles auswählen

$sql_ary['bbcode_order'] = (int) $bbcode_id;
Finde darin

Code: Alles auswählen

			case 'delete':

				$sql = 'SELECT bbcode_tag
					FROM ' . BBCODES_TABLE . "
					WHERE bbcode_id = $bbcode_id";
				$result = $db->sql_query($sql);
				$row = $db->sql_fetchrow($result);
				$db->sql_freeresult($result);

				if ($row)
				{
					if (confirm_box(true))
					{
						$db->sql_query('DELETE FROM ' . BBCODES_TABLE . " WHERE bbcode_id = $bbcode_id");
						$cache->destroy('sql', BBCODES_TABLE);
						add_log('admin', 'LOG_BBCODE_DELETE', $row['bbcode_tag']);
					}
					else
					{
						confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
							'bbcode'	=> $bbcode_id,
							'i'			=> $id,
							'mode'		=> $mode,
							'action'	=> $action))
						);
					}
				}

			break;
Füge danach ein

Code: Alles auswählen

			//BBCode sort
			case 'move_up':
			case 'move_down':

				// Get current order id...
				$sql = 'SELECT bbcode_order as current_order
					FROM ' . BBCODES_TABLE . "
					WHERE bbcode_id = $bbcode_id";
				$result = $db->sql_query($sql);
				$current_order = (int) $db->sql_fetchfield('current_order');
				$db->sql_freeresult($result);

				if ($current_order == 0 && $action == 'move_up')
				{
					break;
				}

				// on move_down, switch position with next order_id...
				// on move_up, switch position with previous order_id...
				$switch_order_id = ($action == 'move_down') ? $current_order + 1 : $current_order - 1;

				//
				$sql = 'UPDATE ' . BBCODES_TABLE . "
					SET bbcode_order = $current_order
					WHERE bbcode_order = $switch_order_id
						AND bbcode_id <> $bbcode_id";
				$db->sql_query($sql);

				// Only update the other entry too if the previous entry got updated
				if ($db->sql_affectedrows())
				{
					$sql = 'UPDATE ' . BBCODES_TABLE . "
						SET bbcode_order = $switch_order_id
						WHERE bbcode_order = $current_order
							AND bbcode_id = $bbcode_id";
					$db->sql_query($sql);
				}
			break;
			//-----------
Finde darin

Code: Alles auswählen

		$sql = 'SELECT *
			FROM ' . BBCODES_TABLE . '
			ORDER BY bbcode_tag';
		$result = $db->sql_query($sql);
und ersetze mit folgendem

Code: Alles auswählen

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

Code: Alles auswählen

		while ($row = $db->sql_fetchrow($result))
		{
			$template->assign_block_vars('bbcodes', array(
				'BBCODE_TAG'		=> $row['bbcode_tag'],
				'U_EDIT'			=> $this->u_action . '&action=edit&bbcode=' . $row['bbcode_id'],
				'U_DELETE'			=> $this->u_action . '&action=delete&bbcode=' . $row['bbcode_id'])
			);
		}
		$db->sql_freeresult($result);
und ersetze mit folgendem

Code: Alles auswählen

		while ($row = $db->sql_fetchrow($result))
		{
			$template->assign_block_vars('bbcodes', array(
				'BBCODE_TAG'		=> $row['bbcode_tag'],
				'U_EDIT'			=> $this->u_action . '&action=edit&bbcode=' . $row['bbcode_id'],
				'U_DELETE'			=> $this->u_action . '&action=delete&bbcode=' . $row['bbcode_id'],
				'U_MOVE_UP'		=> $this->u_action . '&action=move_up&bbcode=' . $row['bbcode_id'],
				'U_MOVE_DOWN'		=> $this->u_action . '&action=move_down&bbcode=' . $row['bbcode_id'])
			);
		}
		$db->sql_freeresult($result);

2. Öffne die adm/style/acp_bbcodes.html und finde darin

Code: Alles auswählen

	<!-- BEGIN bbcodes -->
		<!-- IF bbcodes.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
			<td style="text-align: center;">{bbcodes.BBCODE_TAG}</td>
			<td style="text-align: right; width: 40px;"><a href="{bbcodes.U_EDIT}">{ICON_EDIT}</a> <a href="{bbcodes.U_DELETE}">{ICON_DELETE}</a></td>
		</tr>
	<!-- END bbcodes -->
und ersetze mit folgendem

Code: Alles auswählen

	<!-- BEGIN bbcodes -->
		<!-- IF bbcodes.S_ROW_COUNT is even --><tr class="row1"><!-- ELSE --><tr class="row2"><!-- ENDIF -->
			<td style="text-align: center;">{bbcodes.BBCODE_TAG}</td>
			<td style="text-align: right; white-space: nowrap;">
				<!-- IF bbcodes.S_FIRST_ROW -->{ICON_MOVE_UP_DISABLED}<!-- ELSE --><a href="{bbcodes.U_MOVE_UP}">{ICON_MOVE_UP}</a><!-- ENDIF -->&nbsp;
				<!-- IF bbcodes.S_LAST_ROW -->{ICON_MOVE_DOWN_DISABLED}<!-- ELSE --><a href="{bbcodes.U_MOVE_DOWN}">{ICON_MOVE_DOWN}</a><!-- ENDIF -->
				&nbsp;<a href="{bbcodes.U_EDIT}">{ICON_EDIT}</a> <a href="{bbcodes.U_DELETE}">{ICON_DELETE}</a></a>
			</td>			
		</tr>
	<!-- END bbcodes -->

3. Öffne die includes/functions_display.php und finde darin

Code: Alles auswählen

function display_custom_bbcodes()
finde ein paar Zeilen später

Code: Alles auswählen

	$sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline
		FROM ' . BBCODES_TABLE . '
		WHERE display_on_posting = 1
		ORDER BY bbcode_tag';
	$result = $db->sql_query($sql);
und ersetze es mit folgendem

Code: Alles auswählen

	$sql = 'SELECT bbcode_id, bbcode_tag, bbcode_helpline
		FROM ' . BBCODES_TABLE . '
		WHERE display_on_posting = 1
		ORDER BY bbcode_order';
	$result = $db->sql_query($sql);

4. Führe folgende Anweisung in phpAyAdmin aus

Code: Alles auswählen

ALTER TABLE `phpbb3_bbcodes` ADD `bbcode_order` MEDIUMINT( 8 ) UNSIGNED NOT NULL DEFAULT '0';
So, das wars damit müsste ich alles beschrieben haben. Mit dieser Erweiterung können die selbst erstellten BBCodes im ACP sortiert werden. Diese Reihenfolge wird auch beim Posting im Forum so angezeigt.


[EDIT]
Wichtiger Hinweis!
Ich hatte noch was vergessen zu schreiben und zwar müssen in der neuen mit phpMyAdmin erzeugten Spalte die bbcode_id 1:1 für jeden BBCode in die bbcode_order übertragen werden, sonst geht es nicht.



@Dr.Death, bantu, gn#36
Ihr könnt die Anleitung gerne ins phpBB 3.0: Snippets übernehmen oder vielleicht auch einen Mod daraus machen. Schaut es euch noch einmal an, ob ich etwas vergessen habe.

Gruß Helmut :wink:



P.S. Vielleicht hat jemand noch etwas Lust und macht noch eine Erweiterung für die Gruppenauswahl (Berechtigungen) für jeden BBCode dazu. :oops: