Seite 1 von 2

Include Befehl im Template System benutzen

Verfasst: 08.08.2007 14:57
von amE
Hallo Allerseits..
ich habe das Forum schon nach Begriffen wie "Include" & "Templatesystem" durchsucht, lande aber immer nur bei Leuten die ein Problem haben die richtigen Dateien im Header (template.php usw) einzubinden.

Ich habe ein Projektmanagement Script programmiert bei dem ich auf die Templatefunktion des phpBB zurück greife. Das klappt auch wunderbar. Nun bin ich jedoch an eine Stelle gelangt bei der ich im Code eine andere PHP Datei in einer Schleife include. Das liegt daran das ich in diesem eine Horizontale Scrollbar generiere die es normalerweise ja nicht gibt - sprich sie beinhaltet PHP & HTML, jedoch ebenfalls durch Templates getrennt.

Wenn ich diesen include Befehl jedoch in der PHP Datei lasse und versuche die Seite anzuzeigen bleibt diese Leer als ob man den parse-Befehl vergessen hätte. Kommentiere ich die includes aus funktioniert es.
Nun stellt sich für mich die Frage - wie kann ich diesen Code dann includen?

Es gibt ja die Möglichkeit in der Templatedatei eine andere aufzurufen

Code: Alles auswählen

$template->assign_var_from_handle('FEHLERMELDUNG', 'fehler');
, dies hilft mir aber nicht weiter da ich ja auch einen PHP Code einfügen muss.

Des weiteren bin ich noch auf die Funktion

Code: Alles auswählen

<!-- INCLUDEPHP somefile.php -->
gestoßen. Also habe ich versucht an der Stelle des Includes im PHP File eine Template Funktion aufzurufen in der ich diesen Befehl dann verwende.

Code: Alles auswählen

<!-- BEGIN include_test -->
	<!-- INCLUDEPHP includes/scrollbar.php -->
<!-- EDND include_test -->
so?!..
Dabei bekomm ich dann jedoch diese Fehlermeldung:

Code: Alles auswählen

Parse error: syntax error, unexpected $end in C:\Programme\Xampp\htdocs\scriptname\includes\template.php(127) : eval()'d code on line 171
Könnt ihr mir einen Tipp geben was ich falsch mache oder wie ich das evtl. anders lösen könnte?

Gruß & Dank amE

Verfasst: 08.08.2007 15:14
von Mahony
Hallo
Hast du das so in der Datei?

Code: Alles auswählen

<!-- EDND include_test -->
Es sollte eigentlich

Code: Alles auswählen

<!-- END include_test -->
heißen.


P.S. Schau auch mal hier rein Olympus Coding guidelines

Hast du es mal so versucht wie es im wiki angegeben ist? Also nur

Code: Alles auswählen

<!-- INCLUDEPHP somefile.php -->
Außerdem musst du im ACP unter Allgemein--Sicherheit---Erlaube PHP in Templates: auf Ja einstellen und die einzubindende php-Datei (somefile.php) muss im gleichen Template-Verzeichnis liegen.


Grüße: Mahony

Verfasst: 08.08.2007 15:52
von amE
ups.. peinlich, dieses "END" hab ich echt übersehen :o dabei bin ich den Code 100mal durchgegangen..Danke

Also die Fehlermeldung ist weg und die Seite wird geladen, das include klappt jedoch trotzdem nicht.
Die Stellen bleiben leer.
Ich hab dann die einzufügende Datei + Templateordner mit Template auch noch in den Templatesordner gepackt in der sich das Template befindet welche den include Befehl ausführt aber das hat auch nicht geklappt (habe den Pfad dann so angegeben:

Code: Alles auswählen

<!-- INCLUDEPHP scrollbar.php -->
Funktioniert aber auch nicht :(

Wo wird dieses "Allgemein--Sicherheit---Erlaube PHP in Templates" denn in der Datenbank gespeichert?
Ich habe nämlich kein ACP mehr sondern nur die benötigten Dateien aus dem phpBB und ein eigenes Adminscript mit den Attributen die mein Script betreffen erstellt.

Verfasst: 08.08.2007 17:29
von S2B
Ähm, hast du eigentlich irgendwo erwähnt, welche Template-Klasse du verwendest (also die vom phpBB2 oder die vom phpBB3)? Das wäre nämlich ganz interessant zu wissen.

Verfasst: 08.08.2007 18:11
von amE
Hallo S2B,
ich benutze die phpBB2-Klassen, hilft dir das weiter?
Gruß amE

Verfasst: 08.08.2007 22:39
von gn#36
Ja, denn in phpbb2 gibt es keine Funktion wie <!-- INCLUDEPHP xy -->, in phpbb3 wurde das Templatesystem erweitert und hier gibt es neben der INCLUDEPHP Funktion auch IF, ELSEIF, ELSE Konstrukte und Variablen im Template.
In phpbb2 musst du das auf die altmodische Art machen. Du könntest das z.b. per [php:file], oder evtl. auch durch Nutzung der Ausgabepufferung ([php:ob_start] usw.)

Verfasst: 09.08.2007 17:28
von amE
Achso.. na dann kann ich das ja lang versuchen *g*
Danke für den Hinweis!

Was file() usw. angeht weiß ich nicht genau wie du das meinst. Ich kann die Datei damit ja einlesen und mit file_get_contents z.B. in einen String schrieben aber wenn ich diesen dann versuche auszugeben oder die Variable an das Template zur Ausgabe schicke wird der PHP Code als Klartext ausgegeben und nicht compiliert.

Ich hatte jetzt noch eine andere Idee..
Ich habe bei jeder Datei am Anfang ja den Aufruf

Code: Alles auswählen

 	$template->set_filenames(array(
    	'collab_insert_objectives' => 'collab_insert_objectives.tpl'
	)); 
und am Ende den parse Aufruf

Code: Alles auswählen

$template->pparse('collab_insert_objectives');
Wenn ich zwischen diesen jetzt die Datei include erscheint zwischen diesen beiden Aufrufen ja das gleiche nochmal, sprich ich habe dann 2 (oder mehr) Aufrufe dieser Funktionen, kann es sein das diese sich gegenseitig stören?
Ich könnte dann ja den set_filenames Aufruf aus der Include Datei löschen und ihn mit in den Aufruf der anderen Datei schreiben..

:/ das kann doch nicht so schwer sein..

Trotzdem danke für euer Bemühen...

Verfasst: 09.08.2007 17:39
von gn#36
Also mit file meinte ich das so:

Code: Alles auswählen

$template->assign_vars(array('IRGEND_EINE_VARIABLE' => implode('', file('http://deinedomain.de/pfad/zur/datei.php'))));
Funktioniert natürlich nur dann, wenn dein Server einen derartigen Aufruf erlaubt.
Andere Variante

Code: Alles auswählen

function parse_phpfile($filename)
{
ob_start();
include($filename);
$text = ob_get_contents();
ob_end_clean();
return $text;
}
Ich wüsste nicht dass es schädlich wäre wenn set_filenames mehrfach auf die gleiche Datei angewendet wird, da bin ich mir aber nicht 100% sicher. Wenn du pparse allerdings mehrfach aufrufst wird die Ausgabe natürlich auch mehrfach ausgeführt, und zwar die des gesamten Templates das du der Funktion übergibst, inklusive sämtlicher darin enthaltener Variablen (die werden ja quasi global für das ganze Template gespeichert und sind vollkommen unabhängig von den anderen Funktionsaufrufen des Templatesystems).
Oder aber du verwendest einfach die Template-Engine von phpbb3. Die sollte sämtliche phpbb2 Befehle ebenfalls unterstützen und eben zusätzlich noch includephp.

Verfasst: 21.08.2007 15:37
von amE
Hallo,
ich hab das versucht aber leider gab es das gleiche Ergebnis - die Datei wird ausgegeben und nicht interpretiert.
Ich habe die ganze Datei jetzt einfach mit ins Script eingebunden und an das Template System angepasst und das tut jetzt auch.
Nun bin ich aber beim nächsten Problem angelangt.
Mein Template ist mit einer externen Javascript Datei verknüpft. Diese hatte bisher jedoch Werte per PHP übergeben bekommen. Da meine Templatedatei jedoch kein PHP mehr kann habe ich versucht das ganze über die üblichen Template Funktionen zu machen

Code: Alles auswählen

	
function start()
{
	alert ("test");
	for(var f=0; f <= 181; f=f+6)
	{
   		document.getElementById(f).click();   		document.getElementById(f+"_"+f).style.backgroundColor='#FFFFFF';
   		document.getElementById(f+"_"+f).className='start'; 
   	}	   
   	<!-- BEGIN javascript -->
		document.getElementById({javascript.POS}+{javascript.ROW}).click();	
	
	<!-- END javascript -->
}
Diese Funktion wird beim Seiten "onLoad" aufgerufen und markiert bestehende Auswahlen in einem Formular.
Leider schient das Javascript nicht mit den Templatefunktionen zu agieren und funktioniert nicht.

Habt ihr eine Idee wie ich das Problem lösen könnte?
Danke im vorraus!

Gruß

Verfasst: 21.08.2007 19:26
von gn#36
Wie sieht denn der Zugehörige Code in der passenden PHP Datei aus? Du musst ja in der PHP Datei die Werte zuweisen lassen. Hast du vielleicht auch mal einen Link zu der Seite auf der du das probierst. Es hilft auch häufig z.b. mit dem Firebug mal einen Blick auf den Ergebniscode zu werfen. Wenn da ein JavaScript Fehler drin ist, dann ist der in der Lage, die Stelle im Code zu markieren die nicht funktioniert. Ein Blick auf den Quellcode der als HTML (bzw. hier Javascript) vom Webserver geschickt wird kann sicher auch nicht schaden.