Toon posts:

[php] zelf template parser maken.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik weet dat er al wat template parsers/engines (hoe noem je zoiets? :)) zijn, maar ik wil er zelf eentje bouwen, en die dan vergelijken met bestaande scripts om dan de verschillen in de aanpak te zien. Voor wie het wil weten, ik wil het zelf maken om meer van php te leren.

Maar, heeft iemand nog wat hints/tips voor me? B.v. wat er een beetje in moet staan, hoe het globaal gezien ongeveer moet gaan werken. Let op, ik vraag niet om scripts, of complete oplossingen, maar meer hints en tips.

Bij voorbaat dank :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik denk dat je dat best wel zelf het beste kunt bedenken.

Wat wil je er in, en hoe ga je dat aanpakken. Als je zover bent, ben ik wel genegen antwoord te geven op wat gerichtere vragen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 09-09 14:51

thomaske

» » » » » »

Kijk eens rond naar bestaande template parsers/engines en kijk watvoor functionaliteit zij bieden..

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • oh,when?
  • Registratie: April 2000
  • Niet online

oh,when?

...

Wat denk ik een (heel) belangrijk punt is in het ontwerpen van een template-parser is de snelheid. Dus ga op zoek naar goede, logische algoritmes, bijt je vast op miliseconden, etc. Denk aan dingen regular expressions vs substring methodes etc. Hoe sneller hoe beter.

:)

"You're only as good, as what you did last week."


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 29 oktober 2001 13:14 schreef thomaske het volgende:
Kijk eens rond naar bestaande template parsers/engines en kijk watvoor functionaliteit zij bieden..
En dat is precies iets wat je juist niet moet doen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op maandag 29 oktober 2001 13:16 schreef dusty het volgende:

[..]

En dat is precies iets wat je juist niet moet doen.
En dat is dus ook precies wat ik niet wil doen. Als ik ga afkijken hoe de andere het doen kan ik die code net zo goed copieren.

En ja, wat wil ik erin, wat moet het voor me doen. Tot zo ver ben ik nog niet echt ver ermee.

Error reporting en handeling (alssie bv een template niet kan laden, checken met file_exists() bv?).

Variable of je op win32 of een ander systeem draait (omdat je anders last krijgt met forward en backward slashes toch?).

Mijn idee zou zijn dat een template wordt ingeladen, en bepaalde stukken d.m.v reg exp's worden vervangen door data.
(b.v. in de template {data1} wordt dan vervangen door de data die je erin wilt hebben).

Maakt dat het proces trouwens langzaam of niet (dat je dus een template in een variable of array opslaat, alles vervangt en dan output?)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 29 oktober 2001 13:23 schreef Gio het volgende:
Maakt dat het proces trouwens langzaam of niet (dat je dus een template in een variable of array opslaat, alles vervangt en dan output?)
Zover ik het heb kunnen onderzoeken maakt het het alleen maar sneller.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op maandag 29 oktober 2001 13:29 schreef dusty het volgende:

[..]

Zover ik het heb kunnen onderzoeken maakt het het alleen maar sneller.
Ok, bedankt. Kan je me misschien vertellen waarom dat dan sneller is. (misschien een beetje newbie vraagje, maar dit is iets in php wat ik tot zo ver nog niet heb gedaan, en ik wil graag het hoe en waarom weten i.p.v. het hoe :))

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Zal vanavond eens kijken of ik het in makkelijke taal kan omschrijven zodat iedereen het kan volgen in plaats van alleen de mensen die het al weten :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op maandag 29 oktober 2001 13:50 schreef dusty het volgende:
Zal vanavond eens kijken of ik het in makkelijke taal kan omschrijven zodat iedereen het kan volgen in plaats van alleen de mensen die het al weten :)
Dat zal ik (en vele met mij) erg waarderen :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Gio:
En dat is dus ook precies wat ik niet wil doen. Als ik ga afkijken hoe de andere het doen kan ik die code net zo goed copieren.
en terecht. Daar leer je helemaal niets van.
En ja, wat wil ik erin, wat moet het voor me doen. Tot zo ver ben ik nog niet echt ver ermee.

Error reporting en handeling (alssie bv een template niet kan laden, checken met file_exists() bv?).
Ik denk dat je nu te gedetailleerd bezig bent. Dat is maar een heel klein onderdeel van het geheel.

Je moet iets meer in lagen denken: Je haalt data ergens uit, die moet naar de gebruiker, daarvoor gebruik je een template, hoe zit die template in elkaar, blablablablablablablablabla...
Variable of je op win32 of een ander systeem draait (omdat je anders last krijgt met forward en backward slashes toch?).
Nee is niet nodig. Je kunt forward slashes ook gewoon op Win32 gebruiken.
Mijn idee zou zijn dat een template wordt ingeladen, en bepaalde stukken d.m.v reg exp's worden vervangen door data.
(b.v. in de template {data1} wordt dan vervangen door de data die je erin wilt hebben).
zo doe ik het ook (min of meer). Ik heb een object Template met een method "output". method geef je een associatieve array mee. Als die array bijv. de key "content" bevat, gaat de template parser {content} vervangen door de value op de "content" index.

oftewel:
PHP:
1
2
3
4
<?
foreach ( $array as $key => $value )
   str_replace ( '{'.$key.'}', $value, $output );
?>

zoiets

dat is een manier.
Maakt dat het proces trouwens langzaam of niet (dat je dus een template in een variable of array opslaat, alles vervangt en dan output?)
Ik zie dat dusty er alles over gaat vertellen :9~

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Bedankt drm, maar 1 vraagje over die forward/backward slashes en OS'en. In de .ini van php staat het wel verschillend:
code:
1
2
3
4
5
; UNIX: "/path1:/path2"  
;include_path = ".:/php/includes"
;
; Windows: "\path1;\path2"
;include_path = ".;c:\php\includes"

maar dat maakt voor win32 dus niets uit.(?)

  • tomato
  • Registratie: November 1999
  • Niet online
Op maandag 29 oktober 2001 14:48 schreef drm het volgende:
zo doe ik het ook (min of meer). Ik heb een object Template met een method "output". method geef je een associatieve array mee. Als die array bijv. de key "content" bevat, gaat de template parser {content} vervangen door de value op de "content" index.

oftewel:
PHP:
1
2
3
4
<?
foreach ( $array as $key => $value )
   str_replace ( '{'.$key.'}', $value, $output );
?>

zoiets

dat is een manier.
Een manier inderdaad. Mijn template engine doet het andersom. Hij gaat een stuk template bekijken en wanneer hij daarin een variable reference tegenkomt vervangt hij die door de waarde van deze variabele.
Op die manier hoef je een stuk template maar 1 keer te doorzoeken en niet voor iedere variabele een keer (terwijl waarschijnlijk zelfs niet eens al die variabelen in het stuk template voor hoeven te komen!).

Nog een paar ideetjes uit mijn engine:

* {Variabele}
Reference naar variabele

* {ARRAY.Variabele}
Reference naar item in array

* {time,{POST.Time},d-m-Y H:i}
Om ingebouwde dateformat te gebruiken

* {time,,d-m-Y H:i}
Om huidige datum/tijd op te vragen

* {{TOPIC.PostCount}?Er zijn {TOPIC.PostCount} posts:Er zijn geen posts}
Conditional statements

* {{Bericht}=Gefeliciteerd?Dankje:Moet je mij niet feliciteren\?}
Ander conditioneel voorbeeld

Denk verder eens na over textfiles vs database vs ??? en ook interessant is goede errorhandling. Vooral dat eerste is belangrijk om goed over na te denken, met het onderliggende systeem staat of valt je template performance!

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 29 oktober 2001 15:03 schreef Gio het volgende:
maar dat maakt voor win32 dus niets uit.(?)
Dat is voor de configuratie van PHP zelf, heeft niets te maken met jouw eigen code. :)

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Op maandag 29 oktober 2001 15:11 schreef dusty het volgende:

[..]

Dat is voor de configuratie van PHP zelf, heeft niets te maken met jouw eigen code. :)
Mjah, zover was ik al wel (ben geen complete newbie meer ;)) maar ik dacht omdat het zo erin stond, dat het verschilt per os hoe die slashes staan m.b.t. de file acces (dus dat bla/bla/hoi.php niet zou werken onder windows e.d.)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op maandag 29 oktober 2001 15:10 deed tomato zijn wat uitgebreidere versie uit de doeken
Een dergelijk systeem ben ik idd ook mee bezig. Mijn eerste voorstel is een versie die ik in ca. 2 tellen geklopt heb :D, maar is idd lang niet toereikend voor een "echte" template engine.

Doe je dit trouwens met PHP :?

* drm vraagt zich af of Arien zich nog in deze discussie gaat mengen :P

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • tomato
  • Registratie: November 1999
  • Niet online
Op maandag 29 oktober 2001 15:21 schreef drm het volgende:
Een dergelijk systeem ben ik idd ook mee bezig. Mijn eerste voorstel is een versie die ik in ca. 2 tellen geklopt heb :D, maar is idd lang niet toereikend voor een "echte" template engine.
De basis moet klein, simpel en goed zijn.
Doe je dit trouwens met PHP :?
Ja. (en een (My)SQL database)
edit:
Maar ik zou het vrij simpel naar Perl kunnen porten, waarschijnlijk in veel minder regels code.
* drm vraagt zich af of Arien zich nog in deze discussie gaat mengen :P
Ik wil /me niet zien in template threads :P

Ik begin overigens wel langzaam over te stappen op XML/XSLT, maar omdat ik dat nog niet overal kan gebruiken schiet dat nog niet echt op. Erg mooie technieken, dat wel.

En als ik in andere talen dan PHP programmeer gebruik in natuurlijk zowiezo geen iTemplate (ja, ik moest ook een naam verzinnen ;) ).

Verwijderd

drm: * drm vraagt zich af of Arien zich nog in deze discussie gaat mengen :P
/me mag er niets meer over zeggen... :P
tomato: Ik wil /me niet zien in template threads :P
* tomato ==/me ? >:) :P

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

tomato:
De basis moet klein, simpel en goed zijn.
Maar wel toereikend. Is altijd jammer als je weer tegen extra functionaliteit oploopt, die je er toch wel in wou hebben, maar eerst niet aan gedacht had...
* drm heeft daar vaak last van...
Ja. (en een (My)SQL database)
edit:
Maar ik zou het vrij simpel naar Perl kunnen porten, waarschijnlijk in veel minder regels code.
Ik twijfel er niet aan :D
Ik wil /me niet zien in template threads :P
* drm can imagine >:)
Ik begin overigens wel langzaam over te stappen op XML/XSLT, maar omdat ik dat nog niet overal kan gebruiken schiet dat nog niet echt op. Erg mooie technieken, dat wel.
Ja ik had laatst een idee over een template engine, en toen kwam ik er achter dat ik XML aan het re-inventen was :)
Het enige verschil was dat ik { en } gebruikte ipv < en >.
:D

.
Arien:
/me mag er niets meer over zeggen... :P
Ach, je bent niet voor niets perl-spammer ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

drm: Ja ik had laatst een idee over een template engine, en toen kwam ik er achter dat ik XML aan het re-inventen was :) Het enige verschil was dat ik { en } gebruikte ipv < en >. :D
AxKit
Ach, je bent niet voor niets perl-spammer ;)
Hoeft niet perse met Perl, maar het idee om dit met PHP of [AJ]SP te gaan doen is wat krom IMHO. :)

/me will shut up now.

Verwijderd

Dusty we wachten op je :)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Okay ff een snelle uitleg omdat ik op het moment weinig tijd hebt.

Er zijn verschillende manieren, je kan de "template file" openen en invullen en per regel invullen, echter betekent dat tegelijker tijd de HD wel eens met iets anders bezig kan zijn. Kost transactie kosten en wordt dus de code langzamer van. (seeking time),

Je leest de file in een keer in. (minimale HD load) staat het in een string (of in een array), echter bij een array moet je elke keer elke "string" apart aflopen waarbij hij elke keer een pointer moet gebruiken naar het begin van elke string, dus hoe meer regels hoe meer "werk" hij moet verrichten ( kost dus tijd, is de code dus langzamer)

Door alles eerst in de string te verwerken en niet meteen naar de output te gooien betekent dat hij nite hoeft te switchen naar output routines naar de client, (wat extra tijd kost) heb je alles in een string staan, alles vervangen gooi je het er in een keer uit, gaat alles in een keer naar de gebruiker. Waardoor elke packet die je verstuurt maximaal wordt benutigd, (en dus niet veel "loze" bits bevat..)

Dit is een indicatie waarom het sneller is, het gaat eigenlijk nog dieper, maar op het moment geen tijd om het verder uit te leggen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Arien:

[..]

AxKit
[..]

Hoeft niet perse met Perl, maar het idee om dit met PHP of [AJ]SP te gaan doen is wat krom IMHO. :)

/me will shut up now.
* drm gelooft dat/me dat punt al eens duidelijk had gemaakt en plaatst daarom een linkje naar [topic=299075] voor de geinteresseerden. ;)

De eerste ca. 40 posts kun je overslaan


dusty >
Heb je een goed punt mee, ja.

Gio >
Ik zou het wel leuk vinden als je ons op de hoogte hield van je ontwikkelingen :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Leuk stukje dusty :) Als je de tijd ervoor hebt, kan je dan de uitgebreide versie hier neerzetten? Ik wil er nu toch het fijnere van weten.

Drm, ik laat jullie wel weten hoe het gaat met mijn codeklopperij (waarschijnlijk ga ik toch weer vragen stellen en dan schop ik dit topic wat omhoog ;))

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Bij mijn template engine zit de template data in een tabel in de database.
Hiermee kan ik overschakelen van html naar bijvoorbeeld xml zonder code aan te passen.
Ik weet niet of dit ook kan met mysql/php.

Who is John Galt?


Verwijderd

Topicstarter
schopje omhoog om aan dusty te vragen of hij al tijd heeft gevonden om zijn lange verhaal te vertellen ;)

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Nope nog geen tijd gevonden en ik vraag me af of het wel zin heeft om een hele uitgebreide versie te gaan geven.

Het meeste is wel zelf te bedenken als je goed nadenkt.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 14-09 13:24
Hier staat een mooi voorbeeld denk ik :


http://www.yapter.com/
Pagina: 1