mmofacts.com

Template-System

gepostet vor 19 Jahre, 7 Monate von Kampfhoernchen
Ich wollte mal fragen, ob und welches Templatesystem ihr verwendet.
gepostet vor 19 Jahre, 7 Monate von neit
Na klar, Smarty.
gepostet vor 19 Jahre, 7 Monate von Gambler
Benutze ein selbstgeschriebenes.
Wir ham ma auf ner größeren Seite versch. durchgetestet und das selbstgeschriebene war meistens 30% schneller. Ist einfach zuviel Kram bei den fertigen dabei die kein Mensch braucht.
gepostet vor 19 Jahre, 7 Monate von None
Hab auch ein eigenes auf Arrays basierend geschrieben. Smarty ist zwar sehr nett, aber wie schon gesagt wurde: die Hälfte der Features werden aber nie benutzt...
gepostet vor 19 Jahre, 7 Monate von smf68
Benutze ein in der aktuellen Version meines Spiels gar keines (kaum zu glauben wa ^^), in der neuen Version, die ich gerade entwickle, ein selbstgeschriebenes. Finde ich am flexibelsten

mfg smf68
gepostet vor 19 Jahre, 7 Monate von TheUndeadable
Nutze ebenfalls ein eigenes. Smarty und der Rest mögen zwar für einfache CMS-Systeme ausreichend sein, aber ich benötigte doch ein Plugin-System für Templates
gepostet vor 19 Jahre, 7 Monate von woodworker
vorher ein eigenes aber bin jetzt dabei auf smarty umzusteigen

habe vorher auch eine eigne db klasse genommen aber die fertigen sidn einfach besser (ich steige auch gleichzeitig auf adodb um)
gepostet vor 19 Jahre, 7 Monate von neit
Hmm ich bin zwar Smarty-Nutzer aber von AdoDB würde ich dir abraten, ich bin davon schon länger weg weil es unter Last extrem ressourcenfressend ist. Ich würde es auf jeden Fall vorher mal ausgiebig testen.
gepostet vor 19 Jahre, 7 Monate von woodworker
mhh habe mir die ganzen benshmarks angeshen die die da so rumliegen haben und scheine doch recht schnell zu sein
setze ausserdem auch die c extension ein
gepostet vor 19 Jahre, 7 Monate von Kampfhoernchen
Ich danke euch allen. Wir haben uns jetzt für die Entwicklung eines eigenen Template-Systems entschieden. Smarty scheint mir (uns) mehr für CMS geeignet zu sein. Und laut einem PHP-Magazin-Artikel ist ein selbstgeschriebenes bis zu 20% schneller als Smarty, dass das schnellste unter den Templatesystemen ist (PHP

Datenbankklasse nehmen wir sowieso eine eigene.
gepostet vor 19 Jahre, 6 Monate von Amun Ra
ich nehm einfach mal den alten thread hier,
der scheint passend.

grundidee von templates ist ja die trennung von code und design.

angenommen, man hat ein kleines festes entwicklerteam, 2 - 3 leute,
die möglichkeit sich fast täglich persönlich zu sehen besteht und
man ist sich übers design einig...
die trennung von code und design ist also nicht zwingend erforderlich.
macht eine templateengine dann eigentlich sinn ?

aus eigenen kleinen tests geht eindeutig hervor das es extrem auf die performance geht.

das wär ja so die einfachste, abgespeckte form einer engine...

class Template {


var $XHTML;

function Tload($datei_pfad) {
$d_p = fopen($datei_pfad,'r');
$this->XHTML = fread($d_p,filesize($datei_pfad));
fclose($d_p);
}

function Treplace($ziel,$ersatz) {
$this->XHTML = str_replace('{'.$ziel.'}',$ersatz,$this->XHTML);
}

function Tdisplay() {
return $this->XHTML;
}

}

selbst diese einfache variante generiert den content circa 6 mal langsamer,
als ganz ohne templates.

bei nem cms kann man das ja mit nem cache umgehen.
in nem browsergame sollte der content ja immer möglichst aktuell sein,
ein cache würde also nicht wirlich viel bringen.

wie löst ihr das, templates verwenden, wenn die performance doch so wichtig ist ?

mfg rahq
gepostet vor 19 Jahre, 6 Monate von Kampfhoernchen
Da mein Designer vor Coden keinen Schimmer hat, und ich noch weniger Ahnung von design, ist ein Template-Sys zwingend.

Nach langem grübeln haben wirs dann gefunden.
Er erstellt die Templates ganz normal ( {VARIABLE} ), da, wo ich was reinsetzen soll.

Das ganze wird dann vor-compiliert, genauer gesagt in eine PHP ausgabe umgewandelt. Damit spar ich mir die Zeitraubenden str_replaces.

Beispiel: aus
 



TUL - {TITLE}


wird nach dem Parsen das hier:
 

function index_header($assigns){
return '

TUL - '.$assigns['TITLE'].'';
?>


Das wird dann included, und die Funktion aufgerufen.

Der Compiler sieht dann so aus:
 

 

$gen_time = microtime();
$basedir = '../template';
$target_dir = '../template_c';
compile($basedir, $target_dir);
echo 'Runtime: '.number_format((microtime() - $gen_time)*100, 5, ',','.');

function compile ($basedir, $target_dir){
$b = "\n";
$p = " ........ ";
echo 'Lade Verzeichnis: "'.$basedir.'"';
$base = opendir($basedir);
echo $p.'Geladen'.$b;
while ($filename = readdir($base)) {
if($filename != '.' && $filename != '..'){
echo 'Nächste Datei laden'.$p.'Geladen'.$b.'Zugriffsrechte prüfen';
if(is_readable($basedir.'/'.$filename)){
echo $p.'Zugriffrechte vorhanden'.$b.'Datei wird gelesen'.$p;
if(is_dir($basedir.'/'.$filename)){
echo 'Datei ist Verzeichnis'.$b.$b;
compile($basedir.'/'.$filename, $target_dir.'/'.$filename);
} else {
$handle = fopen ($basedir.'/'.$filename, "r");
$template = fread ($handle, filesize ($basedir.'/'.$filename));
fclose($handle);
echo 'Datei gelesen'.$b.'Datei wird geparsed'.$p;
$template = chop($template);
$template = str_replace("'", "\\'", $template);
$template = str_replace('{', '\'.$assigns[\'', $template);
$template = str_replace('}', '\'].\'', $template);
$template = ' 'function '.substr($filename, 0, strpos($filename, '.')) .'($assigns){'.$b.
'return \''.$template.$b.'\';} ?'.'>';
echo 'Datei geparsed.'.$b.'Prüfen, ob Zielpfad vorhanden'.$p;
if(!is_dir($target_dir)){
echo 'Zielverzeichnis nicht vorhanden. Anlegen'.$p;
mkdir($target_dir);
echo 'Angelegt'.$b;
}
else {
echo 'Zielverzeichnis vorhanden'.$b;
}
echo 'Zieldatei laden'.$p;
$target = @fopen($target_dir.'/'.$filename, 'w');
if($target){
echo 'Datei geladen'.$b.'Template in Datei schreiben'.$p;
if(fwrite($target, $template, strlen($template))){
echo 'Datei geschrieben'.$b;
} else {
echo 'Datei konnte nicht geschrieben werden'.$b;
}
fclose($target);

} else {
echo 'Datei konnte nicht geladen werden'.$b;
}

}// else isdir

} else echo 'Zugriff verweigert'.$b;
}
echo $b;
} //end while
return true;
}


?>


und die Template-Engine so:
 

/**
* Template-System
* @package THR_lib
* @version 1.1
* @author Turbohummel
*/


class Template{

var $template, $assigns;

/**
* Legt ein neues Template an. $Template ist der Name des Templates
*/
function Template($template){
global $DOC_ROOT, $IMG, $CSS, $JS;
$this->template = $template;
$this->assigns = array('LINK' => $DOC_ROOT, 'IMG' => $IMG, 'CSS' => $CSS,
'JS' => $JS, 'GESCH_A' => '{', 'GESCH_Z' => '}',
'BANNER' => ''
);
}
/**
* Setzt die Variablen im Template
*/
function assign($var, $value){
$this->assigns[$var] = $value;
}

/**
* Assigned ein ganzes Array
*/
function assign_array($array){
$this->assigns = array_merge($this->assigns, $array);
}


/**
* Liefert den Inhalt des Templates
*/
function get_content(){
include_once($this->template);
$function = basename(substr($this->template, 0, strlen($this->template)), '.tpl');
return $function($this->assigns);
}

/*
* Gibt den Inhalt des Templates aus.
*/
function display(){
echo $this->get_content();
}

} // End Class


Rückfragen / Verbesserungsvorschläge werden angenommen.

EDIT: Das ganze Templatesys is OpenSource (LGPL)
gepostet vor 19 Jahre, 5 Monate von Amun Ra
Danke, das ist ein gute Idee.
Werd ich mir mal genauer ansehen...

Ich meine jeder hat sein eigenen Programmierstil und
mich persönlich stört es nicht,
wenn Code und Design sich vermischen.

Aber kann man zusammen fassend sagen,
wenn Templates nicht zwingend erforderlich sind,
dann wär es aus Performancegründen besser darauf zu verzichten ?
gepostet vor 19 Jahre, 5 Monate von Chojin
Original von rahq

dann wär es aus Performancegründen besser darauf zu verzichten ?


Naja, jeder str_replace oder include kostet zeit und rechenleistung.
Jetzt kommt es auf den umfang deines spiels an und was für technik dir zu verfügung steht.

reg4rds
chojin
gepostet vor 19 Jahre, 5 Monate von woodworker
Kampfhoernchen man könnte auch einfach sagen nimm smarty ;P
gepostet vor 19 Jahre, 5 Monate von Kampfhoernchen
Smarty tut auch etwas in dieser Art, ist aber um vieles vieles vieles langsamer (30%) als meins )
gepostet vor 19 Jahre, 5 Monate von Störti
Also ich benutze ganz halbprofessionell die Engine von phpBB. Da ich mein BG auf einem Kern von phpBB aufgebaut habe (ich war damals ein PHP-Anfänger und da hatte ich schon das Session-System und die DB- und TPL-Klassen) war das das einfachste...

Aber für mein nächstes Projekt ist die Idee mit dem Vorkompilieren nicht schlecht, das spart bestimmt so einiges (auch wenn das Einsparen von Templates am meisten bringt)...
gepostet vor 19 Jahre, 5 Monate von mow
was ihr bedenken solltet:

ja, fremde templatesysteme sind langsamer. demgegenüber steht aber der aufwand für die entwicklung eines leistungsfähigen eigenen systems.

oftmals bringt es mehr, die verfügbare zeit in das optimieren des eigenen codes zu stecken als etwas eigenes zu entwickeln, debuggen, pflegen.

zumal die generierung der ausgabe (anständig implementiert) nur einen kleinen und konstanten teil der gesamtrechenzeit ausmachen sollte
gepostet vor 19 Jahre, 5 Monate von Kampfhoernchen
Dieses System zu schreiben, hat mich ca. 3 Stunden gekostet. Dazu habe ich noch direkt einen Bannerrotator mit eingebaut, den ich hier, da er auf die Datenbank zugreift, deren Struktur ich hier nicht im detail bekanntgeben möchte, rausgelassen habe.
gepostet vor 19 Jahre, 5 Monate von Derpendja
Wenn ich mir CSS Zengarden anschaue frage ich mich, wozu ich überhaupt auf Templates setzen soll, wenn ich das Design zum Gros zuwieso über css-Files steuern kann, einschließlich der Position der einzelnen Elemente.
CSS verwenden heisst ja, Design und Code zu trennen. Dann kommt es doch eigentlich nur noch auf eine vernünftige Bezeichnung der ids an oder sehe ich das falsch?
gepostet vor 19 Jahre, 5 Monate von Kallisti
Original von Derpendja
Wenn ich mir CSS Zengarden anschaue frage ich mich, wozu ich überhaupt auf Templates setzen soll, wenn ich das Design zum Gros zuwieso über css-Files steuern kann, einschließlich der Position der einzelnen Elemente.
CSS verwenden heisst ja, Design und Code zu trennen. Dann kommt es doch eigentlich nur noch auf eine vernünftige Bezeichnung der ids an oder sehe ich das falsch?


Natuerlich, Design wird ausschliesslich ueber CSS definiert.

Aber templates heisst ja nicht Design und Code trennen, sondern HTML und PHP Code, also Struktur und Berechnung.
gepostet vor 19 Jahre, 5 Monate von Derpendja
andieStirnklatsch Das war einfach zu früh heute Morgen...
Danke
gepostet vor 19 Jahre, 5 Monate von Kampfhoernchen
Naja, es gibt da 2 verschiedene Ansätze, die sich doch um einiges Unterscheiden:

1. Trennung von Design und Codierung
Hier wird in einem Teil das REINE HTML mit Platzhaltern gespeichert, in dem anderen werden die Aktionen ausgeführt (bauen, forschen ...) und die Anzeige aufbereitet. Auf diese Art arbeitet mein Templatesys.
Vorteil: Designer muss keine Ahnung von Programmierung haben, klare Trennung zwischen Backend und GUI. Notfalls lassen sich die Templates ohne große Änderungen auch für Systeme von 2. verwenden.

2. Trennung von Anzeigelogik und Applikationslogik
Hier wird die komplette Anzeigenlogik vom Templatesystem übernommen. Der Coder muss ich darum kein Stück kümmern, sondern nur die ensprechenden Daten zur Verfügung stellen. Bekanntestes Beispiel hier ist Smarty, dass praktisch seine eigene Template-Programmiersprache mit sich bringt.
Vorteil: Coder muss sich nur auf die Applikationslogik konzentrieren
Nachteile: Designer muss was von Schleifen ect. verstehen, keine klare Trennung zwischen Backend und GUI.

Welche man einsetzt, ist geschmackssache. Ich finde die 2. Art unsauber, da kann dann auch gleich der Designer eine Vorlage machen, und der Code bindet es direkt ein, dass is dann schneller.
gepostet vor 19 Jahre, 5 Monate von woodworker
ich fand die 2. methode auch unsbauer aber habe noch etwas drüber nachgedacht und eingtlich ist es nix anderes als mvc
gepostet vor 19 Jahre, 5 Monate von Kampfhoernchen
Kann sein, dass ich immo net so ganz auf dem damm bin (hab grad ne Klausur hinter mir), aber was is mvc?
gepostet vor 19 Jahre, 5 Monate von Kallisti
Original von Kampfhoernchen
Naja, es gibt da 2 verschiedene Ansätze, die sich doch um einiges Unterscheiden:

1. Trennung von Design und Codierung
Hier wird in einem Teil das REINE HTML mit Platzhaltern gespeichert, in dem anderen werden die Aktionen ausgeführt (bauen, forschen ...) und die Anzeige aufbereitet. Auf diese Art arbeitet mein Templatesys.
Vorteil: Designer muss keine Ahnung von Programmierung haben, klare Trennung zwischen Backend und GUI. Notfalls lassen sich die Templates ohne große Änderungen auch für Systeme von 2. verwenden.


HTML != Design
gepostet vor 19 Jahre, 5 Monate von TheUndeadable
HTML >= Design
X-HTML != Design

Ansonsten würde ich auf jeden Fall eine Trennung zwischen Design oder der Darstellung in HTML und dem eigentlichen Code trennen. Ich kann ein Mix aus PHP-Code und HTML absolut nicht ausstehen. Lieber erzeuge ich mir Hilfsklassen, die mir HTML-Code erzeugen.

Beispiel:
$oParser->AddVariable ( 'selectfield', HTML_CreateSelect ( $szName, $szValue, $aszOptions, $aszOtherTags ) );

oder noch geiler wäre natürlich folgendes:

PHP:
$oParser->AddVariable ( 'optionsforx', $aszOptions );

HTML:
Rasse:


oder halt wie in ASP.Net:

HTML:


PHP:
$this->race->options [ "race1" ] = "race1";
etc

Mit Hilfe dieser 3 Möglichkeiten sollten auch bei ordentlicher Implementierung die Möglichkeit zu Exploits ausgeschlossen sein
gepostet vor 19 Jahre, 5 Monate von woodworker
wenn du so auf asp.net abfärst und aber auch php nutzen willst schau dir mal prado¹ an


1: http://www.xisc.com/
gepostet vor 19 Jahre, 5 Monate von TheUndeadable
Vielen Dank, sieht richtig gut aus!

Weißt du zufällig, was die Geschwindigkeit sagt?
gepostet vor 19 Jahre, 5 Monate von woodworker
ja

als ich es das letze mal getestet habe haben sich alle über dne speed aufgetregt aber ich hatte nicht mehr als 0,x sekunden meist sogar eher 0,0x beim seitenaufbau

Auf diese Diskussion antworten