mmofacts.com

Templates über Json + ajax laden

gepostet vor 14 Jahre, 9 Monate von BlackScorp

Hi leute,

ich habe mir mal überlegt ob es nicht resourcensparender wäre, wenn ich in php datei ein json objekt erzeuge und mittels ajax, html datein lade und die platzhalter in der html datei mit json objekt ersetze. wäre das ressourcen sparender als die php funktion file_get_contents mit der combination str_replace? ich will das ganze mit jquery umsetzen.

hoffe ihr könnt mir weiterhelfen

MFG

gepostet vor 14 Jahre, 9 Monate von altertoby

Ich denke, dass es weniger Ressourcen beansprucht (zumindest severseitig).

Da gibts auch ein nettes JQuery Plugin, dass dir praktisch alle Arbeit abnimmt (nur die Template-Syntax ist etwas gewöhnungsbedürftig):

http://jtemplates.tpython.com/

setTemplateURL heißt glaube ich die Funktion, um das Template zu laden.

gepostet vor 14 Jahre, 9 Monate von BlackScorp

das template ist zwar ok, jedoch finde ich dass in einem template keine quellcodes reingehören, sondern reiner HTML/XHTML code. im grunde will ich mit php, daten aus db laden, die daten an JSON übergeben und mit jquery das JSON objekt holen und in die template html einfügen. also nichts in der eigentlichen template datei einstellen wie {#if} und{#else} etc sondern nur innerHTML ändern.

Ich denke, dass es weniger Ressourcen beansprucht (zumindest severseitig).

Was ist mit den Clientseitigen Ressourcen? heist das etwa wenn ich das Template auf JavaScript umstelle, dass die user beim ersten aufruf der Seite ziemlich lange warten müssen?

MFG

gepostet vor 14 Jahre, 9 Monate von Phoscur

Ich hatte zuerst jBind (auch ein jQuery Plugin) und mittlerweile mein eigenes System geschrieben. Ist auf eine Seite auslegt, die nicht neu läd, und noch unausgereift und unoptimiert.

Du musst die Daten formatieren, sei es schon auf PHPseite in deiner View (MVC) oder gar auf JavaScriptseite, wo ich gerade dabei bin mir ein MVC Kontstrukt zu überlegen, das teils direkt auf PHPseitige Models zugreift.

Dazu kommt bei mir noch die i18n, die ich gleich mit in den Templateparser gepackt habe. Hier ein kurzes Beispiel:

JavaScript:

 $tpl(templateID).parse(deineDaten).lang(zugehörigeSprachID).appendTo('#deinContent');

Ich habe einige Zeit gebraucht, bis ich es in dieser schönen Schreibweise hatte.

Das bisher unterstützt der Parser nur ein Sonderfeature: wiederholbare Blöcke, recht praktsich wenn du dynamisch Datenmengen ausgeben willst. IF Abfragen sind (noch) nicht implementiert, ich spüre aber bisher auch noch keinen Bedarf daran.

Meld dich nochmal wenn du am Code interessiert bist, ich würde ihn dann nochmal für dich überarbeiten.

gepostet vor 14 Jahre, 9 Monate von Phoscur

Falls du dir eine einfache Lösung selbst basteln willst:

Per AJAX Daten (JSON Objekt) und Template laden (einfacher String) und folgende Funktion drüberlaufen lassen:

JavaScript:

 tpl = tpl.replace(/{([^{}]*)}/g, function(i, r){ // i match all, r match ( )

     return data[r];

// oder falls du bei nichtzuweisbaren Platzhaltern anstatt undefined den Platzhalter behalten willst:

     //return (typeof data[r] === 'string' || typeof data[r] === 'number') ? data[r] : i;
 });

gepostet vor 14 Jahre, 9 Monate von altertoby

Schleifen oder Verzweigungen braucht man mMn doch schneller als man denkt...z.B. du willst ähnlich wie in OGame eine Liste der Gebäude ausgeben. Du bekommst von php eine schöne Liste mit Gebäude-Objekten und willst die jetzt anzeigen. Foreach springt einem dort förmlich an und if könnte z.B. zum hervorheben jeder zweiten Zeile dienen.

Obwohl das if in dem Fall nicht umbedingt erforderlich ist (und man da wohl immer wege drumherum findet), aber wenn du sie nicht brauchst, dann benutze sie einfach nicht :-)

(Wofür hat eigentlich die Template-Sprache php solche unnützen Dinge :-))

Wegen dem Overhead: Du verlagerst das Erstellen von Html-Code vom Server auf den Clienten - Nicht mehr und nicht weniger. Dadurch sparst du dir logischeweise Rechenzeit auf dem Server, also bekommt der Client schneller eine Antwort (oder dein Server kann mehr User bedienen). Auf der anderen Seite muss der Client jetzt das Html erzeugen. Wie lange das dauert, kann ich dir nich sagen... aber es dürfte bei normalen Mengen an Daten im Normalfall nicht wirklich zu spüren sein (sooo viel langsamer ist JS auch nicht als php). Am Besten einfach mal ausprobieren. 

gepostet vor 14 Jahre, 9 Monate von buhrmi

Original von BlackScorp

das template ist zwar ok, jedoch finde ich dass in einem template keine quellcodes reingehören, sondern reiner HTML/XHTML code. 

wie soll das funktionieren

gepostet vor 14 Jahre, 9 Monate von BlackScorp

Original von buhrmi

wie soll das funktionieren

naja wenn du schon in php den azuzeigenden inhalt generierst und später dann den inhalt anzeigst. atm mache ich zb die prüfung if(isloggedin) in der php datei und je nachdem ob ich eingeloggt bin kriege ich ein anderen content denn ich dann in den platzhalter von der html datei reinsetze. somit habe ich in der html datei NUR html code und keine if abfragen

und auch so in etwa dachte ich, setze ich es in js um also quasi

if(!isLoggedIn()){

$contentArray = array('{header}'=>'Hier einloggen');

}else{

$contentArray = array('{header}'=>'Willkommen userxxx');

return json_encode($contentArray);

oder so

gepostet vor 14 Jahre, 9 Monate von buhrmi

Aber was ist wenn du im 1. Fall einen Link haben willst und im 2. Fall nicht? In ein Template gehört auch Darstellungslogik hinein.

gepostet vor 14 Jahre, 9 Monate von BlackScorp

also mit links mache ich das dann so:

header=>irgendwas

also ich überge im qullcode noch ein kleinen html code. genauso wie bei oder sonstigen kleinen tags. finde es eigentlich bequemer kleine html tags einzufügen anstatt ein kompletten html parser zu proggen

gepostet vor 14 Jahre, 9 Monate von buhrmi

HTML/CSS im Quellcode ist um einiges widerlicher als Logik in den Templates. Und damit man es nicht selber schreiben muss greift man ja auch üblicherweise auf eine der zahlreichen vorhandenen Template Engines zurück. Die gibt es ja nicht umsonst (umsonst im Sinne von "die Entwickler haben sich da schon was bei gedacht")

gepostet vor 14 Jahre, 9 Monate von Dunedan

Ich finde den Ansatz von Django ganz gut: Eigene Templatesprache in die kein Python-Code eingebettet werden kann, aber denoch mächtig genug ist um die meisten Sachen die man in Templates machen können soll zu erledigen. Außerdem besteht die Möglichkeit, dass Benutzer ihre eigenen Tags und Filter je nach Bedürfnissen hinzufügen. Mehr dazu auch unter: http://docs.djangoproject.com/en/dev/topics/templates/#topics-templates

gepostet vor 14 Jahre, 9 Monate von buhrmi

Hehe wenn Django in diesen Thread Einzug erhält, dann muss ich hier auch meinen Lieblingsansatz einer Template Engine hinein werfen: HAML für Ruby/Rails: http://haml-lang.com/

gepostet vor 14 Jahre, 9 Monate von BlackScorp

hm.. jetzt kommen wir tiefer in das thema rein. gibts eigentlich bgs die solche template frameworks/parser verwenden? oder sieht es dann unproffissionell aus wenn ein bg was vorgefertigtes verwendet?

EDIT: habe mir mal jBind angeschaut. also ich denke das müsste mir alles geben was ich brauche ohne dass ich html code in php generieren muss

gepostet vor 14 Jahre, 9 Monate von Nerosmeel

Original von buhrmi

Hehe wenn Django in diesen Thread Einzug erhält, dann muss ich hier auch meinen Lieblingsansatz einer Template Engine hinein werfen: HAML für Ruby/Rails: http://haml-lang.com/

Pro für mehr Ruby on Rails mit HAML

gepostet vor 14 Jahre, 9 Monate von BlackScorp

Original von Nerosmeel

Pro für mehr Ruby on Rails mit HAML

Naja RoR kann ich aktuell nicht, und werde mich erstmal nicht damit beschäftigen bis ich PHP einigermaßen gut kann.

gepostet vor 14 Jahre, 9 Monate von buhrmi

Original von BlackScorp

 oder sieht es dann unproffissionell aus wenn ein bg was vorgefertigtes verwendet?

ob ein bg professionell oder unprofessionell aussieht hat relativ wenig damit zu tun :P hmm nein ich glaube wenn man ein etabliertes template system benutzt sind die chancen höher dass am ende etwas professionelleres rauskommt, zumindest wenn man noch in den anfängerschuhen steckt.

Auf diese Diskussion antworten