Seite 1 von 1

phpBB + Java Script Popup?

Verfasst: 27.08.2007 05:15
von Memphis01
Hi ich möchte euch mein Problem mal kurz beschreiben.

Also ich hab mir phpBB geladen, nen Forum auf gezogen Unterforen und alles erstellt. so weit so gut...

wir sitzen seit ein paar tagen daran etwas zum nachlesen in unser Forum einzubringen wobei das Problem momentan daraus besteht das wir ein Popup einbringen wollen, nachdem man auf einen link geklickt hat, also hab ich die test seite aufn sever geladen und getest ... geht ohne Probleme.

Jetzt habe ich versucht es ins Forum auf den Begriff der den Link darstellen soll einzubauen und es geht nicht.

Ok nochmal zum besseren Verständnis.

Forum=>Unterforum=>Thread
da hab ich ne Tabelle zusammen gebaut, wobei ich erwähnen muss da ich erst nach langen foren leasen herausgefunden habe das bei phpbb alles in 1 Zeile geschrieben werden muss, gut aber auch diese Hürde ist überwunden.
nun habe ich einen begriff auf den die Foren Mitglieder klicken können, worauf sich ein popup öffnen soll das entsprechende informationen enthält.

mein derzeitiges popup sieht in etwa wie folgt aus

Code: Alles auswählen

		<script language="JavaScript">
		function popup(w,h,site) {
			x=screen.availWidth/2-w/2;
			y=screen.availHeight/2-h/2;
			var popupWindow=window.open('','','width='+w+',height='+h+',left='+x+',top='+y+',screenX='+x+',screenY='+y);
			popupWindow.document.write(site);
		}
		</script>
im Body folgt der begriff, also klick auf >mich< zb.
nachdem die User auf [>mich<] gedrückt haben, soll ein popup aufgehen.
das momentan in folgender weise außerhalb des Forums so funktioniert

Code: Alles auswählen

<a href="javascript:popup(560,263,'<html><head><title>Titel</title></head><body leftmargin=0 topmargin=0><table><tr><td></td></tr></table></body></html>')">Ausdauer</a>
*gekürzte Variante, da das Popup im IE funktioniert und die Tabelle auch Fehlerlos ist*

--
Ich bin seit mehreren Jahren Hobby-HTML-Coder
Habe alles separat getestet
die Tabelle sieht gut aus und Funktioniert
der Link funktioniert
es scheitert lediglich nach der Integration in den Foren thread daran das der Link nicht als Link erkannt wird und ich somit nicht testen kann ob Java Script funktioniert.
Schreibe ich anstatt <a href= .... [url=.... wird mir der komplette java scrippt code fürs popup danach angezeigt. Also hab ich eine riesige Zeile mit der Popup Formatierung stehen.

Kann mir da jemand weiter Helfen?
Funktioniert Java Script in phpBB?
Wir schaffe ich es den Link mit der JS Popup Formatierung richtig ausführen zu lassen?


Für Fehler und Schrift haftet der Stift

Verfasst: 27.08.2007 11:28
von gn#36
Dass das Skript nicht funktioniert ist ein Sicherheitsfeature des phpBB. Ansonsten könnte ja jeder auf die Idee kommen mit einem externen Skript in einem Beitrag XSS zu betreiben. Das Dilemma lässt sich aber mit einem neuen BBcode umgehen. Da die BBcodes vom Admin festgelegt werden müssen (im phpbb3 über den Adminbereich, im phpbb2 in der Datei bbcode.php bzw. im Template bbcode.tpl) ist hier alles erlaubt, das auch in HTML Erlaubt wäre. Allerdings ist die Frage wie viel Dynamik von dem bbCode gefordert ist. Handelt es sich um immer den gleichen Inhalt ist die Erstellung des BBcodes kinderleicht. Soll der BBcode nur Statischen Text formatiert im Popup ausgeben (ohne HTML darin) ist das ebenfalls recht einfach. Komplizierter wird es, wenn der BBcode immer wechselnden HTML Code in das Popup einbauen soll (also beim ersten Mal vielleicht eine Tabelle, beim zweiten eine Liste und beim dritten vielleicht einfach nur roten Text). Wenn dass dann aber z.b. als Vorauswahl aus einer Liste realisierbar ist (also die Möglichkeiten von vorne herein bekannt sind) dann lässt sich das trotzdem realisieren ohne dass die Sicherheit des ganzen großartig abnimmt. Es kommt also ganz darauf an was du genau machen möchtest.

Verfasst: 27.08.2007 12:16
von Memphis01
Ja das Popup soll dynamische Inhalte enthalten

Denoch immer die Selbe Struktur in der Tabel, der unterschied ist lediglich in den Inhalten. Also mal sind es 5 Zeilen, mal 11 oder auch mal nur 3.

Ich sollte noch erwähnen das ich phpBB2 verwende

Verfasst: 27.08.2007 13:01
von gn#36
Solange das alles nur Text ist (Formatierung mit den üblichen bbcodes im Forum ist auch kein Problem, selbst mit hinzugefügten sollte es gehen) sollte das dann recht einfach zu realisieren sein.
  1. Erstelle dir ein Grundgerüst, welches vom BBcode dann als "Wrapper" um den Text gelegt werden soll. In diesem Fall wäre das dann etwas ähnliches wie das folgende(verkürzt und vereinfacht damit das Vorgehen klar wird):

    Code: Alles auswählen

    <!-- BEGIN popup_bbcode_start -->
    <a href="javascript:popup(560, 263, '<html><head><title>{TITEL}</title></head><body> EVENTUELLE WEITERE HTML FORMATIERUNGEN DIE VOR DEM TEXT KOMMEN SOLLEN <!-- END popup_bbcode_start -->
    
    <!-- BEGIN popup_bbcode_end -->
    FORMATIERUNGSBEFEHLE DIREKT NACH DEM TEXT </body></html>')">{LINK_TEXT}</a> <!-- END popup_bbcode_end -->
    Diese Struktur wäre ein grobes Grundgerüst für einen BBcode der als wichtigsten Parameter den Text im Popup nimmt, die Verwendung würde dann etwa so aussehen:

    Code: Alles auswählen

    [popup=LINK TEXT titel=TITEL]TEXT IM POPUP[/popup]
  2. Dieses Grundgerüst kommt ganz ans Ende der bbcode.tpl des Templates
  3. Dann kann die bbcode.php bearbeitet werden. Hier müssen wir zunächst die Platzhalter in der Templatedatei durch die entsprechenden Regulären Ausdrücke ersetzen, damit mit preg_replace() später die Texte ersetzt werden können.
    • Finde

      Code: Alles auswählen

      $bbcode_tpl['email'] = str_replace('{EMAIL}', '\\1', $bbcode_tpl['email']);
    • danach

      Code: Alles auswählen

      $bbcode_tpl['popup_bbcode_start'] = str_replace('{TITEL}', '\\2',$bbcode_tpl['popup_bbcode_start']);
      Analog die andere Ersetzung, allerdings sollten wir hier \\1 wählen
  4. Als nächstes müssen wir uns um die Verarbeitung der Einträge kümmern. Das geschieht in der bbencode_first_pass und der bbencode_second_pass Funktion. Als erstes ist die bbencode_first_pass dran
    • In der Funktion findet sich dieser Code

      Code: Alles auswählen

      // [QUOTE] and [/QUOTE] for posting replies with quote, or just for quoting stuff.
      	$text = bbencode_first_pass_pda($text, $uid, '[quote]', '[/quote]', '', false, '');
      	$text = bbencode_first_pass_pda($text, $uid, '/\[quote=\\\\"(.*?)\\\\"\]/is', '[/quote]', '', false, '', "[quote:$uid=\\\"\\1\\\"]");
      
    • Im Prinzip müssen wir etwas ähnliches erstellen. Hierzu musst du dich ein wenig mit regulären Ausdrücken beschäftigen. in der Funktion bbencode_first_pass wird hauptsächlich die Validierung durchgeführt, so dass man sicher sein kann, dass der bbcode auch korrekt benutzt wurde. Hier könnte man es etwa mit folgendem Probieren:
    • Code: Alles auswählen

      $text = preg_replace("#\[popup=(.*?) titel=(.*?)\](.*?)\[/popup\]#is", "[popup=\\1 titel=\\2:$uid]\\3[/popup:$uid]",$text);
      Das ist jetzt nur eine sehr rudimentäre Prüfung, das lässt sich aber wenn man möchte sicherlich noch verfeinern. Diese markiert lediglich alle die Start und End-Tags, die auch ein zugehöriges gültiges End bzw Start Tag im Text haben.
  5. Als nächstes ist die bbencode_second_pass dran
    • Hier findet die eigentliche Arbeit statt. Wir müssen hier einen weiteren Ausdruck hinzufügen, der das Template ersetzt.
    • Code: Alles auswählen

      $text = preg_replace("#\[popup=(.*?) titel=(.*?):$uid\](.*?)\[/popup:$uid\]#is", $bbcode_tpl['popup_bbcode_start'] . "\\3" . $bbcode_tpl['popup_bbcode_end'],$text);
Das ist einigermaßen Detailliert die Vorgehensweise. So wie das ist sind da vermutlich noch einige Verfeinerungen notwendig, aber das generelle Vorgehen dürfte hoffentlich klar geworden sein. Wenn gewünscht kann man dann im Anschluss den Code noch für bestimmte Nutzer (oder alle außer bestimmten) sperren gemäß dieser Anleitung.

Verfasst: 27.08.2007 14:23
von Memphis01
ooooook

Also in aller erster Form möchte ich mich bei dir für die rasche und umfangreiche Hilfe und die damit verbundene Arbeit bedanken.

Da ich mit jeder gelesenen Zeile immer kleiner wurde und mir immer hilfloser vor kam ... muss ich an dieser stelle echt sagen .... Respekt an die Leute die so etwas schreiben verstehen und weiter helfen können.

An dieser Stelle werde ich nun aufgeben müssen ... da ich glaube das ich das Problem nicht bewältigt bekommen.

Verfasst: 27.08.2007 15:40
von gn#36
Nicht so schnell.... :D
Während ich das geschrieben habe ist mir aufgefallen dass das recht kompliziert wird so. Es ginge auch einfacher, z.b. wenn der Titel und/oder der Linktext nicht dynamisch verändert werden sollen. Ansonsten geht das viel einfacher mit phpbb3.
Der wohl einfachste mögliche bbcode ist einfach nur eine Textersetzung. Jedes Vorkommen von z.b. [popup] wird durch <a href="javascript:popup(... ersetzt und jedes [/popup] durch ...)">text</a> Das erfordert nur sehr wenig Code (im Prinzip nur eine einzige Zeile). Dann sind allerdings die Linktitel und die Titelzeile des Popups nicht dynamisch. Wenn es auch etwas uneleganter geht, dann könnte man auch auf ähnliche Weise ein Konstrukt erzeugen das mit so einer Struktur arbeitet:

Code: Alles auswählen

[popup][titel]Titel hier[/titel][link]Linktext hier[/link]Inhalt des Popups hier[/popup]
Wenn man hier auch noch die Reihenfolge der Argumente festlegt lässt sich das auch in einer Zeile erledigen (genau wie die Variante die ich oben beschrieben habe eigentlich auch). Oben ist quasi die "deluxe Variante" beschrieben die sich auch vom Aufbau her an den üblichen Aufbau hält, so dass man Templateabhängig andere Ersetzungen vornehmen kann. Auf das kann man aber verzichten, so dass man die gesamte Ersetzung in einer einzigen Zeile in der Funktion bbencode_second_pass unterbringen kann:

Code: Alles auswählen

$text = preg_replace("#\[popup=(.*?) titel=(.*?)\](.*?)\[/popup\]#is", "<a href=\"javascript:popup(...parameter...\\1,\\3)\">\\2</a>",$text);
Die \\1 muss hierbei an die Stelle des Titels, die \\3 an die Stelle des Textes. Zusätzlich musst du im Header (z.b. der overall_header.tpl) noch das Javascript Einbinden, in dem die Funktion deklariert wird.
Vielleicht hätte ich mit dieser einfachen Variante anfangen sollen... :oops: