mmofacts.com

Templates aus einer Datenbank

gepostet vor 18 Jahre, 9 Monate von DarkSnake
sers leute,

ich suche ideen zur verwirklichung eines scriptes mit dem es möglich ist, templates aus einer datenbank auszulesen und dann an gewünschten orten ausgibt. die templates werden natürlich auch variablen in ihrem html-code enthalten und müssen deshalb so ausgegeben werden, dass die variablen direkt in ihrem wert erscheinen. macht man für gewöhnlich mit eval() richtig?

ich bin mir nur nich ganz sicher, wie ich das richtig mit eval() umsetze, deshalb hoffe ich hier auf ein wenig unterstützung.

auch php.net hat mir da nich wirklich weiter geholfen, wobei ich dadurch natürlich einiges in erfahrung bringen konnte.

würde mich für jede hilfreiche idee bedanken,
danke schonmal im voraus

grüße
DarkSnake
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Ich habe bei meinem Template-Sys auch mit Datenbank und eval() experimentiert.

Nachteil: Hier kann der EAccellator nix machen, da der Code erst zur Laufzeit bekannt wird. Anscheinend wird dann das ganze Script dann nicht optimiert oder der OpCode gecached.
Besser ist eine Lösung über Includes.

Wobei brauchst du denn konkret hilfe?
gepostet vor 18 Jahre, 9 Monate von DarkSnake
Original von Kampfhoernchen
Nachteil: Hier kann der EAccellator nix machen, da der Code erst zur Laufzeit bekannt wird. Anscheinend wird dann das ganze Script dann nicht optimiert oder der OpCode gecached.


was genau meintest du damit? EAccellator is mir auch noch n fremdwort. vielleicht sagt mir auch einfach nur der name nichts.
wenn nich muss ich es halt anders lösen, falls es sich nich so gut eignet. ich dachte nur, dass es eventuell besser zu administrieren wäre.

und wo ich genau hilfe bräuchte wäre bei der ausgabe von dem html-code aus der datenbank.

 

function output($tpl)
{
echo $tpl;
}

eval("output(\"\$template\");");


war eigentlich nur n test, funzt aber auch nich. zeigt mir nämlich die variablen nich als wert an, sondern einfach so als text (z.B. $test = 3; -> angezeigt als $test und nich als 3).
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Der Ansatz is genau falsch rum:

 

function output($tpl)
{
eval ( ('echo "'. $tpl . '";');
}

output($template);


eval behandelt den String, den er übergeben bekommt, wie PHP-Code. Und der PHP-Code muss sagen: Hier soll was ausgegeben werden, also muss vor dem eigentlichen Template ein echo stehen, und das Template muss in " stehen, da es ja ein String ist.
Alternativ könntest du auch das hier machen:
 

function output($tpl)
{
eval ( ('return "'. $tpl . '";');
}

echo output($template);


EAccellator optimiert PHP-Code, damit er schneller ausgeführt werden kann. Guckst du auch hier: http://eaccelerator.net/HomeDe
gepostet vor 18 Jahre, 9 Monate von DarkSnake
alles schön und gut,

 

function output($tpl)
{
eval('echo "'. $tpl .'";');
}

$nachricht = "wenn das klappt freu ich mich";

$tplname = "login_admin";

$tplanfrage = mysql_query('SELECT * FROM templates WHERE name = "'.$tplname.'"');
$tpl = mysql_fetch_array($tplanfrage);

$template = $tpl[template];

output($template);


so sieht mein testgelände aus.

fehlermeldung is aber wie folgt:

Parse error: parse error, unexpected T_LNUMBER, expecting ',' or ';' in D:\...\scripte\lern\test.php(14) : eval()'d code on line 1

eval() is für mich relativ neu, ich weiss nicht genau, welches zeichem ihm nicht passt.
gepostet vor 18 Jahre, 9 Monate von mifritscher
bei eval muss das Argument gültiger php-Code sein

Ich persönliche finde sowohl eval als auch templates in der DB evil:

bei eval von der DB kann jeder, der sich irgendwie Zugang zur DB verschafft beliebigen Code ausführen!

Und templates von der DB können von eaccelerator (ea) nicht gecacht werden, da er nicht vorhersehen kann, was jetzt ausgeführt werden soll! Außerdem sind die templates meist recht groß, für was die DB nur bedingt optimiert ist...

Nehme lieber smarty, der compiliert den template-Code zu echtem php-Code, den er nur noch zu includen braucht->sehr gut cachebar
gepostet vor 18 Jahre, 9 Monate von Sarge
eaccelerator optimiert nicht nur den code ein wenig sondern die eigentliche hauptaufgabe besteht darin dass der einmal interpretierte php-code gespeichert wird und im ram/respektive festplattte gehalten wird.
Ein erneutes Aufrufen des Scriptes erfordert dann keine erneute interpretation die einiges an Performance kostet.

Somit ist eine immense leistungssteigerung zu erreichen. Ein solcher PHP-Cache ist für frequentierte Sites aufjedenfall ans Herz zu legen.
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Habe ich ja auch schon gesagt. Das mit dem Sicherheitsaspekt sehe ich nicht ganz so dramatisch. Wer Zugriff auf die Datenbank hat, kann so und so großen Schaden anrichten.

Nur vor dem Teil mit dem Smarty rate ich ab. Smarty mag vieles sein, aber sicherlich nicht performant. Setze lieber ein anderes fertiges Template-System ein, etwa FastTemplate, auf dem auch mein Templatesystem (mit diversen Optimierungen und etwas zusammengeschnitten) basiert.


function output($tpl)
{
eval('echo "'. $tpl .'";');
}

$nachricht = "wenn das klappt freu ich mich";

$tplname = "login_admin";

$tplanfrage = mysql_query('SELECT * FROM templates WHERE name = "'.$tplname.'"');
$tpl = mysql_fetch_array($tplanfrage);

$template = $tpl[template];

output($template);
sieht eigentlich richtig aus. Der Fehler muss in dem Template selbst stecken.
gepostet vor 18 Jahre, 9 Monate von woodworker
Original von Kampfhoernchen


$template = $tpl[template];


igit ' oder " vergessen

das muss $tpl['template']; sein
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Is mir net aufgefallen, habs ja nur von oben kopiert. Sollte aber eigentlich theoritsch trotzdem funzen, nur ne Notice werfen.
gepostet vor 18 Jahre, 9 Monate von mifritscher
Hmm, hatte mit Smarty bisher keine Performanceprobleme, besonders in Verbindung mit ea...
Hat jemand da genauere Vergleichszeiten?
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Bitteschön:

Mittelwerte bei 1000 Requests, Aufbau der ingame-Startseite meines Spiels, ohne Cache, weil das bei einem BG ja fatal wäre:

PHP_Lib: 74 ms
Smarty: 48 ms
FastTemplate: 39 ms
Eigenbau: 36 ms
Ohne Template: 31 ms
gepostet vor 18 Jahre, 9 Monate von mifritscher
mit oder ohne eaccelerator?
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Selbstverständlich mit.
PHP 5.0.1
gepostet vor 18 Jahre, 9 Monate von DarkSnake
hm, das is komisch

die template dürfte eigentlich nich der fehler sein:

 












$str["HALLO"]

$str["LOGIN"]

$str["DATUM"] $datum .






$nachricht














ich frage mich, was daran falsch ist.

ich denke natürlich auch über FastTemplate nach. wenn man es richtig umändert, dann ist es bestimmt ein gutes system. trotzdem wäre es für mein spiel wichtig wenn ich schnell ein design ändern könnte, oder vielleicht eben mal was hinzufügen könnte.

der fehler is der gleiche geblieben, es hat sich nichts geändert, wenn ich $tpl['template'] nehme.

grüße
DarkSnake
gepostet vor 18 Jahre, 9 Monate von Feagor
@DarkSnake
Wenn du dein Template da mit eval() auswerten willst und da, wo die Variablen stehen, nacher den dazugehörigen Text haben willst, musst du dann nicht da stehen haben?
Und außerdem fängt eval() an, deinen Code als PHP zu interpretieren, auch ohne, dass du mit einem ein, dann funktioniert's. Habs grad getestet.
gepostet vor 18 Jahre, 9 Monate von mifritscher
Hmm, der Geschwindigkeitsunterschied ist nicht so berauschend...
gepostet vor 18 Jahre, 9 Monate von DarkSnake
ich habs zum laufen gebracht, aber so hab ich mir das nich ganz vorgestellt. momentan wird bei mir auch nur die nachricht ausgegeben. der rest nich, weil das wohl nich mit global reingesteckt wurde in die funktion. ich hätte soviel arbeit, dass es sich dann nich mehr lohnt. geht das noch zu verbessern?

 

function output($tpl)
{
global $nachricht;

eval('?>'. $tpl);
}


und...

 
















.


















gepostet vor 18 Jahre, 9 Monate von Fornax
Das was ich mir ausgedacht habe funktioniert leider nicht, aber evtl. könnt ihr den Ansatz ja gebrauchen:

 

function output($tpl)
{
global $var;

$file = fopen($tpl, "r");
$text = fread($file, filesize($tpl));

$text = ereg_replace("(\{\$)+([A-Za-z0-9]*)+(\})", $var["\\2"], $text);

echo($text);
}

$var["hallo"] = "Tach!";
$var["login"] = "Hier ist der Login.";
$var["datum"] = date("d.m.Y");
$var["nachricht"] = "Dies ist eine Nachricht.
Du kannst sie löschen";


$template = "template1.tpl";

output($template);

?>


template1.tpl
 












Hallo = {$hallo}

{$login}

{$datum}






{$nachricht}










gepostet vor 18 Jahre, 9 Monate von Skyrunner
Warum Templates aus einer Datenbank holen?
Man sollte immer versuchen statische von dynamischen Inhalten zu trennen. Templates gehören definitiv zu den statischen Inhalten, deshalb gehören sie auch nicht in die Datenbank.
gepostet vor 18 Jahre, 9 Monate von Chojin
Original von Skyrunner
Warum Templates aus einer Datenbank holen?
Man sollte immer versuchen statische von dynamischen Inhalten zu trennen. Templates gehören definitiv zu den statischen Inhalten, deshalb gehören sie auch nicht in die Datenbank.


Du bist mein Held.

Und was ist wenn ich z.b. ne Quest habe die aus viel Text besteht, den ich aus der Datenbank hole, aber wo auch Textteile durch Werte ersetzt werden müssen [spielername] etc. und wo ich vieleicht noch ein paar [if] abfragen drinhaben will? Das kommt dann aus der Datenbank, muss aber doch irgendwie ausgewertet werden.

Templates die HTML-Design von Programmiercode trennen sind meiner Meinung nach in Zeiten von XHTML eh überflüssig.

reg4rds
chojin
gepostet vor 18 Jahre, 9 Monate von DarkSnake
Original von Chojin
Und was ist wenn ich z.b. ne Quest habe die aus viel Text besteht, den ich aus der Datenbank hole, aber wo auch Textteile durch Werte ersetzt werden müssen [spielername] etc. und wo ich vieleicht noch ein paar [if] abfragen drinhaben will? Das kommt dann aus der Datenbank, muss aber doch irgendwie ausgewertet werden.


das is genau meine rede,

darum gehts mir ja auch und deshalb sollte man Templates aus der Datenbank doch in augenschein nehmen. zumindest für rollenspiel browsergames mit quests oder ähnliches.
gepostet vor 18 Jahre, 9 Monate von Skyrunner
Original von Chojin
Original von Skyrunner
Warum Templates aus einer Datenbank holen?
Man sollte immer versuchen statische von dynamischen Inhalten zu trennen. Templates gehören definitiv zu den statischen Inhalten, deshalb gehören sie auch nicht in die Datenbank.


Du bist mein Held.

Und was ist wenn ich z.b. ne Quest habe die aus viel Text besteht, den ich aus der Datenbank hole, aber wo auch Textteile durch Werte ersetzt werden müssen [spielername] etc. und wo ich vieleicht noch ein paar [if] abfragen drinhaben will? Das kommt dann aus der Datenbank, muss aber doch irgendwie ausgewertet werden.

Templates die HTML-Design von Programmiercode trennen sind meiner Meinung nach in Zeiten von XHTML eh überflüssig.

reg4rds
chojin
Nagut in dem Fall mag es sinnvoll sein das aus der DB zu holen.
Wenn, dann sollte man aber nen anständigen Cache benutzen.
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen
Templates die HTML-Design von Programmiercode trennen sind meiner Meinung nach in Zeiten von XHTML eh überflüssig.

Öhm. Nein.

Was ist wenn du auf Ajax umstellen willst?
Was, wenn du auf XHTML 1.2 umsteigen willst?
Was, wenn du nen Designer einstellst du der am XHTML was ändern will, aber keine Ahnung von Programmierung hat?
gepostet vor 18 Jahre, 9 Monate von Feagor
Original von Kampfhoernchen
Templates die HTML-Design von Programmiercode trennen sind meiner Meinung nach in Zeiten von XHTML eh überflüssig.


Öhm. Nein.

Was ist wenn du auf Ajax umstellen willst?
Was, wenn du auf XHTML 1.2 umsteigen willst?
Was, wenn du nen Designer einstellst du der am XHTML was ändern will, aber keine Ahnung von Programmierung hat?

Ich würd da auch höchstens zustimmen, wenn da stehen würd XML + XSLT...aber das wär ja auch schon wieder ne Trennung.
gepostet vor 18 Jahre, 9 Monate von DarkSnake
jetzt nur kurz zwischen drin...

isn heißes thema, aber mich würde es immer noch interessieren wie ich das jetzt ordentlich umsetzen kann, was ich machen muss, dass es so ist, wie ich das wollte.

von xml hab ich relativ wenig ahnung, sollte ich mich darin schonmal reinlesen?
gepostet vor 18 Jahre, 9 Monate von Fornax
Ich würde dir raten, deine Templates nicht in eine DB zu legen, sondern als File (so wie in meinem Beispiel)
gepostet vor 18 Jahre, 9 Monate von DarkSnake
Original von Fornax
Ich würde dir raten, deine Templates nicht in eine DB zu legen, sondern als File (so wie in meinem Beispiel)


ok, hast mich überredet. aber irgendwie funktioniert dein beispiel auch nich.

 

function output2($tpl)
{
global $var;

$file = fopen($tpl, "r");
$text = fread($file, filesize($tpl));

$text = ereg_replace("(\{\$)+([A-Za-z0-9]*)+(\})", $var["\\2"], $text);

echo($text);
}

$var["hallo"] = "Tach!";
$var["login"] = "Hier ist der Login.";
$var["datum"] = date("d.m.Y");
$var["nachricht"] = "Dies ist eine Nachricht.
Du kannst sie löschen";

$tplordner = "templates";
$template = "$tplordner/login_admin.tpl";

output2($template);


hätte so klappen müssen, oder hab ich was übersehen?
jedenfalls zeigt er mir die tabelle an, bloß halt nur so wie es in der template.tpl datei drin is. sprich... so... {$nachricht} . tja, wandelt also die daten nich um.
gepostet vor 18 Jahre, 9 Monate von Chojin
Original von Fornax
Ich würde dir raten, deine Templates nicht in eine DB zu legen, sondern als File (so wie in meinem Beispiel)

180 Quests, 180 Files, warscheinlich alle schön durchnummeriert?
Ehrlich ich seh bis jetzt keinen Vorteil und die Hindernisse bleiben genau die gleichen, als würde man aus der Datenbank seinen Haupttext ziehen.

Allenfalls die Laufzeit würde beschleunigt werden, wobei ich nicht glaube, dass immer alle 180 Dateistückchen (includes) im cache gehalten werden. :roll:

Ich denke der richtige Weg, ob nun Datenbank oder File muss von Fall zu Fall festgestellt werden. Für mich hat das nichts mit dem beschriebenem Problem zu tun, da die Daten die vom Texttemplate kommen so oder so bearbeitet werden müssen.

reg4rds
chojin
gepostet vor 18 Jahre, 9 Monate von Chojin
Ach ja, hierrauf wollte ich noch antworten:
Original von Kampfhoernchen

Original von Chojin

Templates die HTML-Design von Programmiercode trennen sind meiner Meinung nach in Zeiten von XHTML eh überflüssig.
Öhm. Nein.

Was ist wenn du auf Ajax umstellen willst?Ajax ist eine komplett neue Schicht. Wenn du diese in ein laufendes Spiel implementieren willst, reicht es normalerweise nicht aus, nur am Template Änderungen vorzunehmen. Für gewöhnlich zieht dieser Schritt vor allem größere Änderungen in der Programmierlogic mit sich. (es sei den du willst Ajax nur als Frame-ersatz) :wink:

Original von Kampfhoernchen

Was, wenn du auf XHTML 1.2 umsteigen willst?Für mich der einzige Fall in dem eine Trennung zwischen PHP und HTML Sinn macht. Nur mal ganz ehrlich, wie oft kommt das vor und wie groß sind die Vorteile wenn ich mich heute für einen Umstieg von XHTML 1.0 auf 1.2 entscheide? Wenn ich nun mein Spiel auf HTML 4.0 programmieren würde (weil mir XHTML noch nicht geläufig ist) und kein Ajax im Einsatz hätte (weil man dafür ja JavaScript braucht), würde ich ernsthaft über den Einsatz von Templates zum späteren umstellen nachdenken.

Original von Kampfhoernchen

Was, wenn du nen Designer einstellst du der am XHTML was ändern will, aber keine Ahnung von Programmierung hat?Der Designer darf nichts am XHTML verändern. Das ist auch garnicht nötig, weil hier die Informationen logisch abgepackt und gruppiert sind, was vielmehr mit der Spiellogic als mit der Grafik zu tun hat. Wenn man sein XHTML richtig aufgebaut hat, ist es möglich, dass der Designer alleine durch Verändern des CSS seine Arbeit machen kann.

reg4rds
chojin
gepostet vor 18 Jahre, 9 Monate von Fornax
Original von DarkSnake

ok, hast mich überredet. aber irgendwie funktioniert dein beispiel auch nich.


Da sag ich nur:

Original von Fornax

Das was ich mir ausgedacht habe funktioniert leider nicht, aber evtl. könnt ihr den Ansatz ja gebrauchen
gepostet vor 18 Jahre, 9 Monate von Kampfhoernchen

Ajax ist eine komplett neue Schicht. Wenn du diese in ein laufendes Spiel implementieren willst, reicht es normalerweise nicht aus, nur am Template Änderungen vorzunehmen. Für gewöhnlich zieht dieser Schritt vor allem größere Änderungen in der Programmierlogic mit sich. (es sei den du willst Ajax nur als Frame-ersatz)

Also als ich ein Projekt von mir auf Ajax umgestellt habe, musste ich einzig und allein die HTML-Start- und HTML-Ende-Module und sämtliche Templates umschreiben. Z.B. von
 


td>Hinz3480Hampelmann
td>Kunz2240Butzemann


nach
 


Hinz3480Hampelmann
....

Auf diese Diskussion antworten