Programmer - an organism that turns coffee into software.
wijs-neusOp vrijdag 05 april 2002 15:21 schreef LuCarD het volgende:
[..]
Das een nadeel en daar vroeg je niet naar...
'vroeger' kon het alleen foutgaan met HTML. Dat was de enige stap waardoor er verschillen konden zijn.
Nu komt daar weer een stap bij, XSLT. Nu zijn er dus 2 stappen waar het fout kan gaan. Lijkt me geen optimale situatie.
Denk geen een....Op vrijdag 05 april 2002 15:39 schreef Grum het volgende:
Noem eens een paar browsers die 95%+ compliant zijn met xml/xslt aub, dat zijn volgens mij namelijk niet alle bekende browsers.
Maar dat was met HTML in het begin ook niet....
Komt wel.. en dat is een van de grootste voordelen van XSL. Het gaat zometeen net zo uitgebreid worden ondersteund als HTML.
Programmer - an organism that turns coffee into software.
Maar dit doet natuurlijk niets af aan de waarde van XSLT in het algemeen
Maar wat is dan wel een interessantse toepassing, want veel meer dan voor html kan ik er niet voor bedenkenOp vrijdag 05 april 2002 16:58 schreef tomato het volgende:
Het gebruik als stylesheets voor HTML pagina's is bij lange na niet de interessantste of meest logische toepassing van XSLT, zeker niet client-side.
Maar dit doet natuurlijk niets af aan de waarde van XSLT in het algemeen

XSLT is een transformatie taal van XML data naar een andere vorm. Je kan met gemak transformeren naar HTML (duhOp vrijdag 05 april 2002 17:06 schreef Nielsz het volgende:
[..]
Maar wat is dan wel een interessantse toepassing, want veel meer dan voor html kan ik er niet voor bedenken![]()
En volgens mij zijn er geen beperkingen waar je naar toe kan transformeren....
Programmer - an organism that turns coffee into software.
Best gek, want na deze text van jou snap ik het ineens een stuk beterOp vrijdag 05 april 2002 17:10 schreef LuCarD het volgende:
[..]
XSLT is een transformatie taal van XML data naar een andere vorm. Je kan met gemak transformeren naar HTML (duh), XML, CSV, PLAIN TEXT, WAP(?), PRINTER, speciaal formaat voor blinden...
En volgens mij zijn er geen beperkingen waar je naar toe kan transformeren....
en ik ben nog serieus ook

Hmmm dat is best gek ja.....Op vrijdag 05 april 2002 17:15 schreef Nielsz het volgende:
[..]
Best gek, want na deze text van jou snap ik het ineens een stuk beter
en ik ben nog serieus ook![]()
Programmer - an organism that turns coffee into software.
1
| <?function ParseText($text, $arr){ if(is_array($arr)){ $arr_keys=array_keys($arr); while(count($arr)){ $itm=array_pop($arr); $key=array_pop($arr_keys); $text=str_replace("%" . $key . "%", $itm, $text); } } return $text; }?> |
Gebruik:
1
| <?$tekst="<html><head><title>%title%</title></head><body>%bodytext%</body></html>";$array=array( "title"=>"Mijn site", "bodytext"=>"<h1>Hoi Wereld</h1>");ParseText($tekst, $array);?> |
De uitpoep kan je zelf wel raden....
Dat lijkt me opzich dus niet zo handig, wat als je dan een waarde wilt overschrijven? Gaat het opeens foutOp donderdag 04 april 2002 21:12 schreef Grum het volgende:
[/edit][/sup]
Timpie:
$array[$i][0] = $key
$array[$i][1] = $value
en dat doe je dan dus gewoon met
code:
1 $array[$key][] = $value;
Waarom vooral niet client-side?Op vrijdag 05 april 2002 16:58 schreef tomato het volgende:
Het gebruik als stylesheets voor HTML pagina's is bij lange na niet de interessantste of meest logische toepassing van XSLT, zeker niet client-side.
Rustacean
Misschien was het laatste deel van de zin een beetje krom. Ik bedoelde iig dat je HTML stylesheets als interessante toepassing van XSLT niet client-side moet zoeken.Manuzhai: Waarom vooral niet client-side?
In ieder geval niet nu. Of je moet een beperkte doelgroep hebben of eisen kunnen stellen aan de doelgroep van je applicatie. Wanneer je bijvoorbeeld Mozilla 0.9.7+ of Internet Explorer 6 kunt eisen wordt client-side processing wel degelijk interessant.
Maar dan nog zal server-side gebruik van XSLT in de vorm van HTML stylesheets interessant blijven, er kunnen bijvoorbeeld meerdere stappen in het proces zijn waarvan enkele wel server-side moeten (denk bijvoorbeeld aan security etc).
Maar wat ik vooral met mijn post bedoelde: XSLT heeft zoveel meer toepassingen dan als HTML template engine.
Je kan performance-wise mensen met Moz of IE de XSLT zelf laten doen, en de rest server-transformed shit geven.Op vrijdag 05 april 2002 18:52 schreef tomato het volgende:
Misschien was het laatste deel van de zin een beetje krom. Ik bedoelde iig dat je HTML stylesheets als interessante toepassing van XSLT niet client-side moet zoeken.
In ieder geval niet nu. Of je moet een beperkte doelgroep hebben of eisen kunnen stellen aan de doelgroep van je applicatie. Wanneer je bijvoorbeeld Mozilla 0.9.7+ of Internet Explorer 6 kunt eisen wordt client-side processing wel degelijk interessant.
Maar dan nog zal server-side gebruik van XSLT in de vorm van HTML stylesheets interessant blijven, er kunnen bijvoorbeeld meerdere stappen in het proces zijn waarvan enkele wel server-side moeten (denk bijvoorbeeld aan security etc).
Rustacean
Verwijderd
ik heb een paar speciale keys gemaakt die door de template engine zelf vervangen worden. Een hiervan is taalafhankelijke keys erg handig als je een site in 2 talen wilt maken.
Verder kun je ook 1 hele file met een key includen en nog wat andere handige shit... Als er interesse is mail dan ff. Aan de documentatie wordt gewerkt (anders ben ik zelf ook zo weer vergeten hoe ie werkt
En heeft iemand ook een oplossing voor mijn probleem? grin... want zag/las meer dingen over template engines in het algemeen (XLT ofzo
je zei eerder:Op vrijdag 05 april 2002 18:04 schreef Timpie het volgende:
Dat lijkt me opzich dus niet zo handig, wat als je dan een waarde wilt overschrijven? Gaat het opeens fout
maar dan kan je geen dubbele keys invoeren
Je mist de hele context nu dus
sorry maar dit vat ik niet, het lijkt allemaal zo gemakkelijk maar de /(\/?) etc code is voor mijOp vrijdag 05 april 2002 10:55 schreef marcusk het volgende:
[..]
Met de eval-modifier (/e) kun je een functie uitvoeren op de gematchde tekst. In de php manual staat dit voorbeeld:
code:
1 2 3 4 // This would capitalize all HTML tags in the input text. preg_replace ("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", $html_body);
Je kunt dus de gematchde %tekst% en <htmlshitbladiebla> doorgeven aan een functie die <htmlshitbladiebla> terug geeft als %tekst% bestaat, anders een lege string.
Gewoon stukje voor stukje lezen dan valt het wel mee:Op vrijdag 05 april 2002 21:03 schreef xtentic het volgende:
[..]
sorry maar dit vat ik niet, het lijkt allemaal zo gemakkelijk maar de /(\/?) etc code is voor mij![]()
![]()
![]()
1
2
3
| (<\/?) - probeer de < te matchen met daarachter optioneel(=?) een / teken, de \ is om de / te escapen, anders zou dit het einde van de regex betekenen. (\w+) - pak 1 woord en stop dit in een groep. \w staat voor een alpha-numeriek karakter, de + betekent dat er een of meer direct achter elkaar moeten staan. ([^>]*>) - stop nu alle tekens in de 3e groep behalve het '>' teken, dit is immers het einde van de tag, het sterretje betekent 'zoveel mogelijk'. Hier komen dus de parameters van een tag in te staan |
ik snap nu de (<\/?) nu denk ik wel... dat zou dan in mijn gevalOp vrijdag 05 april 2002 21:11 schreef Orphix het volgende:
[..]
Gewoon stukje voor stukje lezen dan valt het wel mee:
code:
1 2 3 4 5 6 7 (<\/?) - probeer de < te matchen met daarachter optioneel(=?) een / teken, de \ is om de / te escapen, anders zou dit het einde van de regex betekenen. (\w+) - pak 1 woord en stop dit in een groep. \w staat voor een alpha-numeriek karakter, de + betekent dat er een of meer direct achter elkaar moeten staan. ([^>]*>) - stop nu alle tekens in de 3e groep behalve het '>' teken, dit is immers het einde van de tag, het sterretje betekent 'zoveel mogelijk'. Hier komen dus de parameters van een tag in te staan
([ifset=\"w+\"](.*)([/ifset])) moeten worden?
voor het uitlezen van [ifset="[b]%text%[/b]"]detextenzo[/ifset]
dus wanneer ik in mijn template parser de %text% heb gedefinieerd wil ik dat [ifset="%text%"] & [/ifset] weg gehaald worden, zoniet moet alles weg gehaald worden
als je [ gebruikt ipv < moet je dat natuurlijk escapen. verder wil je w+ capturen (tussen haakjes zetten) en [/ifset] en de gehele regex niet (dus de buitenste haakjes moeten ook weg), aangezien je die captures niet nodig hebt.Op vrijdag 05 april 2002 21:19 schreef xtentic het volgende:
dat zou dan in mijn geval
([ifset=\"w+\"](.*)([/ifset])) moeten worden?
om precies te zijn: als %tekst% gedefinieerd is moet je de boel vervangen door detekstenzo, anders vervangen door nietsdus wanneer ik in mijn template parser de %text% heb gedefinieerd wil ik dat [ifset="%text%"] & [/ifset] weg gehaald worden, zoniet moet alles weg gehaald worden(i.v.m de output)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| * Database driven * Webbased template editor * Variabele substitutie: - {VarName} - {HashName.Key} voor arrays * Conditional statements: - {{VarName}?Var is true:Var is niet true} - {{VarName}=34?Gelijk aan 34:Niet gelijk aan 34} - {{VarName}={OtherVarName}?Gelijk:Niet gelijk} * Datum en tijd opmaak: - {time,{},} Huidige tijd in standaard opmaak - {time,{TijdVar},} Tijd in standaard opmaak - {time,{TijdVar},H:i, d-m-Y} Tijd in opgegeven opmaak * Alle taalconstructies kunnen genest worden * Runtime caching * Debug mode * Sneller dan alle bij mij bekende PHP template engines Todo: * Template cooker om templates om te zetten in native PHP * Documentatie :D * Uitgebreidere foutmelding bij syntax errors in template |
Eigenlijk is het nog steeds een Quick Hack (tm) by tomato, maar voor mezelf is ie al geruime tijd zeer bruikbaar. Huidige versie is 0.91.
Op zondag 22 Maart 1998 19:52 schreef Orphix het volgende:
Mijn template engine heb ik vrij generiek opgezet. Het kan elke gestructureerde data dat van XML is afgeleid zeg maar 'transformeren' naar een andere data formaat en daarbij de data muteren. En ja ik heb er ook loopjes in zitten, templatematching, node-pattern-matching en the usual..ach het werkt voor mij dus waarom niet he, misschien dat ik het ooit nog eens ga uitwerken en publiceren![]()

Verwijderd
Nu, dat vind ik persoonlijk de 2 handigste opties eruitOp vrijdag 05 april 2002 22:54 schreef tomato het volgende:
Nog wat ideetjes voor jullie uit mijn template engine:
code:
1 2 3 4 5 * Database driven * Conditional statements: - {{VarName}?Var is true:Var is niet true} - {{VarName}=34?Gelijk aan 34:Niet gelijk aan 34} - {{VarName}={OtherVarName}?Gelijk:Niet gelijk}
EDIT:
als je ut zo bekijkt heeft ie er 5Op zaterdag 06 april 2002 10:02 schreef Grum het volgende:
DiEana: Nu, dat vind ik persoonlijk de 2 handigste opties eruit
Je noemt er anders 3
Verwijderd
Die condities moet ik ook dringend maken in mijn template systeempje, want ik word er zo moe van als ik steeds een nieuwe templatefile moet aanmaken, voor maar 1 kleine verandering :\
daarom add ik er nu ook een [ifset="%bladediebla%"]regel[/ifset] inOp zaterdag 06 april 2002 10:06 schreef DiEana het volgende:
Die condities moet ik ook dringend maken in mijn template systeempje, want ik word er zo moe van als ik steeds een nieuwe templatefile moet aanmaken, voor maar 1 kleine verandering :\
Tnx
Verwijderd
Verwijderd
ik wil deze tag maken:
[BLOCK content]content hier[/END content]
Hij moet dan "content hier" in een array genaamd $block plaatsen.
$block["content"] = "content hier";
Ik krijg dit niet voor elkaar met preg_replace
ik heb dit:
1
| <? function saveblock ($name, $data) { $this->block["$name"][1] = $data; return "[BLOCK $name]";// Geef [BLOCK $name] terug, omdat deze later weer overschreven word. }preg_replace("/\[BLOCK (.*)\](.*|\n)\\[\/END (.*)\]/ise", "$this->saveblock('\\1','\\2')", $this->data["$name"][1]);// $this->data["$name"][1] daar zit de hele template in.?> |
Alleen werkt die preg_replace nie.. ik zou ook graag willen dat je meerdere blocks in elkaar kon doen
[block content]
[block tabel]
blaat
[/end tabel]
[/end content]
iemand een idee?
Verwijderd
Uhh, stackbasedOp zaterdag 06 april 2002 15:30 schreef Grum het volgende:
Stoel: iemand een idee?
Stackbased parser maken, dit kan per definitie beter NIET met regexps.
nested - a whatis definition:Arien: Waarom?
Because the definition says sonested
In general, something that is nested is fully contained within something else of the same kind. In programming, nested describes code that performs a particular function and that is contained within code that performs a broader function. One well-known example is the procedure known as the nested do-loop. In data structures, data organizations that are separately identifiable but also part of a larger data organization are said to be nested within the larger organization. A table within a table is a nested table. A list within a list is a nested list.
You'd rather not parse nested structures with a regular expression. Use a stack-based parser instead.
A common alternative to nested is the prefix sub, as in subprocedure, substructure, subtransaction, and so forth.
Verwijderd
Waarom zou ik een template eninge moeten hebbeb? Ik maak toch geen forum ofzo?Grum: Well .. what are you waiting for ... show of your skilllzzz.
En met regexen parsen: zie eerste reply van [topic=452595].
(Waarom niet templates via XSLT vertalen? Hallo Martin!
Een stack is een LIFO collectie. LIFO staat voor 'Last In First Out'.Stoel: wat is stackbased
Een andere vorm van collecties is een FIFO stucture (First In First Out), bijvoorbeeld Queues.
Een voorbeeld van een stack is een array in PHP waar je alleen een item afhaalt als dat als laatste is toegevoegd.
Met stack-based parsen wordt dan ook een manier van parsen bedoeld waarbij je gebruik maakt van een stack. Doorgaans wordt het subject (de string) van begin tot eind doorlopen en worden in de stack states opgeslagen.
Wanneer je bijvoorbeeld een openings-<B> tegenkomt sla je die op in de stack (met een 'push' method). Hierna kun je natuurlijk alleen nieuwe openingstags tegenkomen, of een sluitings-</B> tag. Iedere openingstag push je weer op de stack en bij een sluitingstag haal je weer een element van de stack af (en als het goed is, is dat altijd het bijbehorende element, je haalt ze weer in omgekeerde volgorde eraf). Een item van de stack halen doe je met een 'pop' method.
Heb je heel je string doorlopen, dan moet je stack weer leeg zijn.
De loop is dan de engine van je parser en de stack gebruik je om de state in op te slaan.
Je kunt zelf een LIFO stucture ontwerpen, maar je kunt ook gewoon een PHP array nemen en je bij het gebruik daarvan aan de regels houden die bij een stack horen.
Valt nogal tegen, volgens mij. Maar het principe is heel simpel. Je hebt een stack(een stapel). Daar gooi je wat op, en omdat het een stapel is, moet je steeds de bovenste er van afhalen(LIFO - Last In, First Out). Het kan ook andersom(FIFO - First In, First Out), maar dan heb je een queue(een wachtrij).Op zaterdag 06 april 2002 16:59 schreef Grum het volgende:
Stackbased is een term die je op google.com kan invullen en dan enorme bergen info over terug krijgt.
Dit kan je bijvoorbeeld gebruiken voor HTML-parsers en template engines. Als je een tag tegenkomt, gooi je die op de stack, als je dan de afsluitende tag tegenkomt, haal je 'm van de stack af. Je kunt dan ook meteen checken of het de tags goed in elkaar zitten, want als er een tag niet afgesloten is, dan klopt de tag op de stack niet met de afsluitende tag die je net gevonden hebt(waarna je dus fijn een error naar de browser kan sturen
[Edit]
Tomato was wat eerder en duidelijker.
Overigens vind ik het een beetje raar dat je een template engine gaat schrijven in PHP. PHP is nu juist zo bedoeld dat het zelf een template-engine is. Eigenlijk probeer je de taal steeds simpeler te maken. Is PHP niet simpel genoeg?
Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet
De scheiding tussen code en layout is vaak nog steeds erg wenselijk. Als je bv een forum levert aan klanten dan wil je niet dat ze in je PHP's moeten klooien en vervolgens allerlei parse errors krijgen en jou de schuld geven.Op zaterdag 06 april 2002 17:06 schreef Johannes het volgende:
Overigens vind ik het een beetje raar dat je een template engine gaat schrijven in PHP. PHP is nu juist zo bedoeld dat het zelf een template-engine is. Eigenlijk probeer je de taal steeds simpeler te maken. Is PHP niet simpel genoeg?
dus ik kan mijn header, content en footer apart laden en weergeven
Ik snap de voordelen van templates wel, maar ik vind het een kludge om een template-taal(ik moet toegeven, een krachtige), te gebruiken om een template-engine te bouwen voor een nieuwe template-taal(is 't nog duidelijk?).Op zaterdag 06 april 2002 17:18 schreef Orphix het volgende:
[..]
De scheiding tussen code en layout is vaak nog steeds erg wenselijk. Als je bv een forum levert aan klanten dan wil je niet dat ze in je PHP's moeten klooien en vervolgens allerlei parse errors krijgen en jou de schuld geven.
Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet
Op zaterdag 06 april 2002 16:17 schreef Arien het volgende:
[..]
Recursieve regex.
Oftewel ik ben bezig met een parser die dmv regexp's recursief een stack opbouwt
woeiJohannes:
Ik snap de voordelen van templates wel, maar ik vind het een kludge om een template-taal(ik moet toegeven, een krachtige), te gebruiken om een template-engine te bouwen voor een nieuwe template-taal(is 't nog duidelijk?).
Ik heb de volgende "tegenwerping":
- PHP overstijgt doorgaans een template-taal behoorlijk. Je zou kunnen zeggen dat het het midden houdt tussen een script-taal en een template-engine.
- Laten we er vanuit gaan dat we code (data-verwerking) en layout zoveel mogelijk willen scheiden
- Als je dat puur in PHP zou moeten doen, is PHP niet toereikend als template engine (imo), plus dat je gauw de fout maakt toch weer code te gebruiken in de template
- conclusie: maak je eigen template engine
just my $0,02
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Arien: Waarom niet templates via XSLT vertalen? Hallo Martin!
Template Languages in XSLT
Ik zeg niet dat ik het mooi vind
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
En nog steedsdrm: woeiKan me herinneren dat Arien er ongeveer een jaar geleden precies hetzelfde over zei...
Hmmm, dat ben ik niet met je eens. Wat bedoel je met een template taal? Wanneer je kijkt naar 'professionele' oplossingen zie je vaak dat je toch in je templates een taal als Perl of Python kunt gebruiken. Dus nog een stuk krachtiger dan PHP.PHP overstijgt doorgaans een template-taal behoorlijk. Je zou kunnen zeggen dat het het midden houdt tussen een script-taal en een template-engine.
Hmmmjah, eigenlijk zou ik het zo niet willen omschrijven. Het processen van een template kun je ook data-verwerking noemen.Laten we er vanuit gaan dat we code (data-verwerking) en layout zoveel mogelijk willen scheiden
Je eigenlijk je applicatie in lagen opzetten. De business-logica en de presentatie-laag wil je natuurlijk scheiden (en dat kan in meer dan 2 stappen).
</li><li> Als je dat puur in PHP zou moeten doen, is PHP niet toereikend als template engine (imo), plus dat je gauw de fout maakt toch weer code te gebruiken in de template
Maar het leuke van een presentatie-laag is dat er ook logica in kan voorkomen. In veel template systemen voor PHP is ook een soort primitieve vorm van programmeren mogelijk (zie bijv conditional statements). In professionele oplossingen gaat dit nog veel verder, waar je je templates lekker kunt vullen met bijvoorbeeld Perl code.
Deze code heeft dan niets te maken met de business-logica, maar met presentatie. Denk bijvoorbeeld aan de logica die nodig is om in een tabel iedere row om en om zwart en wit te kleuren. Hier is logica voor nodig, maar dit wil je niet in je business-logica opnemen. Het is onderdeel van de presentatie, dus als je met templates werkt wil je dat daar in kunnen verwerken.
Ik gebruik het zelf ook hoordesalniettemin kan ik me heel goed voorstellen waarom je het een kludge vindt, maar ik vind het geen slechte keuze een template-engine naast PHP te gebruiken, wanneer je PHP verder alleen voor data-extractie etc gebruikt.
Maar misschien kun je het in een wat breder perspectief zien, al is dat voor relatief kleine projecten wellicht niet echt relevant.
warempel ben ik het daar mee eenstomato zei er e.e.a. over...
[o.a. "code (logica) in presentatielaag vaak ook nodig"]
Maar de keuze tussen een losse template-engine (los van waar die op draait) en puur PHP blijven gebruiken, zou imo hetzelfde zijn als dat ik bijvoorbeeld niet Perl en PHP zou mogen combineren, wanneer ik het misschien wel prettig vind om het ene in PHP te doen en het andere in Perl, for instance.
Ben zelf al een tijd bezig met een template parser in PHP, en die werkt echt een stuk fijner dan PHP zelf (imo
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
komt nog wel...Stoel:
re: drm
Source postuhhhh
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Verwijderd
kee dan,kunnen we wat van leren ..Op dinsdag 09 april 2002 11:31 schreef drm het volgende:
[..]
komt nog wel...
Heb helaas veel te weinig tijd om er eens een beetje docs etc. voor te schrijven, en 'm helemaal goed door te testen.Stoel:
kee dan,kunnen we wat van leren ..![]()
Maar als ik weer een beetje gesettled ben (moet nu nog verhuizen, etc...) dan komt het allemaal wel
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
1
2
3
4
5
| [ONCE] Bladediebla etc etc [ENDONCE] |
nu heb ik de volgende routine er in gemaakt om dit te removen als het meer dan 1x is laten zien...
1
| <?$thePattern = '!\\[ONCE\](\w.*?)\\[ENDONCE\]!i'; preg_match_all($thePattern, $theString, $theBackRef);// echo '<pre>';// var_dump($theBackRef);// echo '</pre>'; $theString = str_replace($theBackRef[0][$i], "", $theString);?> |
Maar als dit op meerdere regels staat werkt het niet, iemand een idee?
Echt waar? Koel!Op maandag 08 april 2002 11:13 schreef drm het volgende:
woeiKan me herinneren dat Arien er ongeveer een jaar geleden precies hetzelfde over zei...
Omdat Tomato hier al aardig wat op gereageerd heeft, zal ik alleen nog wat toevoegingen doen.Ik heb de volgende "tegenwerping":
Waarom zou PHP niet toereikend zijn voor een template-engine? Als PHP daarvoor niet toereikend is, kan een template-engine in PHP ook niet toereikend zijn. Dus eigenlijk zeg je: het is makkelijker om een template-engine te coden, dan om de templates gewoon in PHP te doen. Dat is wel een punt, maar ik vind het zelf niet nodig.• Als je dat puur in PHP zou moeten doen, is PHP niet toereikend als template engine (imo), plus dat je gauw de fout maakt toch weer code te gebruiken in de template
Er zijn er al veels te veel. Dat vind ik sowieso jammer aan PHP: omdat iedereen de applicaties zelf kan maken, doet iedereen dat ook. Als er meer mensen aan minder projecten zouden werken, zouden er waarschijnlijk hogere kwaliteits-applicaties in PHP zijn. Er zijn nog zoveel projecten die hulp nodig hebben, waarom dan een nieuwe starten?</li><li> conclusie: maak je eigen template engine
(Dit is trouwens niet alleen kritiek op PHP'ers, maar op developers in het algemeen.)
Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet
Ik gebruik al een jaartje ofzo Smarty en dat werkt gewoon helemaal perfect. Het is vreselijk uitbreidbaar, en makkelijk te gebruiken. Als het moet kan je er ook PHP in gebuiken, maar bij mij hebben de standaard functies altijd volstaan. Het werkt door de tempate-code te compilen naar PHP, Dit compilen gebeurd maar een keer, daarna wordt gewoon PHP code uitgevoerd. dus het werkt rete-snel in tegenstelling tot de meeste regexp-template-engines.
De auteurs (een er van is een van de makers van php) steken erg veel tijd in het project, en iedere maand verschijnt er wel een keer een update. Verder is alles perfect gedocumenteerd, en georganiseerd. het is project open source. Ik heb een of 2 keer dingetjes ingebracht in de mailing list die later ook zijn opgenomen in het project.
Oftewel, ik ben wel overtuigd en ga mooi niet zelf aan een template engine zitten programmeren, want ik kan gewoon geen betere template-engine maken. zonde van mijn tijd dus.
Kijk er eens naar, en laat eens weten waarom je hem niet gebruikt.
Hoe bedoel je?...Op woensdag 10 april 2002 22:21 schreef marcusk het volgende:
moet je ff de /s modifier gebruiken.
---
Sommige mensen vinden dat programmeren kunst is. En die gaan liever 10 uur schilderen dan 1 uur het schilderij bekijken.Op donderdag 11 april 2002 17:58 schreef Martijn02 het volgende:
Jeetje wat een discussie.
Oftewel, ik ben wel overtuigd en ga mooi niet zelf aan een template engine zitten programmeren, want ik kan gewoon geen betere template-engine maken. zonde van mijn tijd dus.
Kijk er eens naar, en laat eens weten waarom je hem niet gebruikt.
Andere mensen weigeren gewoon om code te gebruiken die niet zelfgeschreven is.
Ik zit in het midden
maar hoe moet ik die toevoegen als ik bv... een regex heb vanOp donderdag 11 april 2002 20:06 schreef TweakBoy het volgende:
de /s modifier interpreteerd je te bewerken text als 1 regel wat het makkelijk maakt om de text in 1 maal door te werken en dan te parsen
'!\\[CODE\](.*?)\\[ENDCODE\]!i'
?
Heb je wel een beetje gelijk in, Ikzelf heb dat ook wel een beetje. En natuurlijk is het ook hobby/sport, en natuurlijk heb ik er zelf ook wel eens een gebouwd, maar met een regexp ding kom je niet in de buurt van iets als SmartyOp donderdag 11 april 2002 20:37 schreef Nielsz het volgende:
[..]
Sommige mensen vinden dat programmeren kunst is. En die gaan liever 10 uur schilderen dan 1 uur het schilderij bekijken.
Andere mensen weigeren gewoon om code te gebruiken die niet zelfgeschreven is.
Ik zit in het midden
Aan de andere kant kan je enorm veel leren als je eens kijkt hoe een goed programma is opgebouwd. En ik denk dat deze zeker in de categorie "goede programma's" behoort. Als je kijkt hoe het is opgebouwd, en hoe alles werkt. Ik heb er erg veel van geleerd.
het vage is dat ik dat heb geprobeerd maar dat werkte nietOp donderdag 11 april 2002 21:39 schreef marcusk het volgende:
gewoon een s achter de i zetten.
lees anders dit ff door, daar staat het allemaal uitgelegd.
http://members.lycos.nl/phpfreak/template/
heeft iemand mischien nog suggesties?
Was XSLT al genoemd?Op vrijdag 12 april 2002 19:05 schreef xtentic het volgende:
heeft iemand mischien nog suggesties?
Verwijderd
dullie, we kunnen de parser niet downloaden, de rest wel. .moet je nog ff onlijn zetten, btw leuke functies zijn [blocks] dus dat je heleboel blocks in 1 file zet en die dan kan parsen zovaak als je wil..Op vrijdag 12 april 2002 19:05 schreef xtentic het volgende:
Nou ut werkt, alleen weet ik nu op dit moment geen dingen meer om te addenik heb um gedeeltelijk online gezet
http://members.lycos.nl/phpfreak/template/
heeft iemand mischien nog suggesties?
jah, maar is dat PHP?... ow neeOp vrijdag 12 april 2002 20:06 schreef freak007 het volgende:
Was XSLT al genoemd?

Mischien later, maar zou je dit eens kunnen specificeren?... zou handig zijnOp vrijdag 12 april 2002 21:17 schreef Stoel het volgende:
dullie, we kunnen de parser niet downloaden, de rest wel. .moet je nog ff onlijn zetten, btw leuke functies zijn [blocks] dus dat je heleboel blocks in 1 file zet en die dan kan parsen zovaak als je wil..
for example parsing this
[loop]
<a href="%link%">%linkname%</a> - %hits% - %views<br>
[/loop]
dan wordt de input daarvoor denk ik
$array[$template][%link%][0] = "link.html";
$array[$template][%linkname%][0] = "link";
$array[$template][%hits%][0] = "10";
$array[$template][%views%][0] = "15";
$array[$template][%link%][1] = "link.html";
$array[$template][%linkname%][1] = "link";
$array[$template][%hits%][1] = "10";
$array[$template][%views%][1] = "15";
maaruh stel ik voer hits niet in maar bij de volgende wel, dan loopt ut helemaal stuk
hoe kan ik een manier / functie maken die dat checkt ofzo?... of dat ik dit speciaal kan parsen?
Tnx... 't wordt steeds ingewikkelder
Er is een php interface en is zeer uitgebreidOp vrijdag 12 april 2002 21:49 schreef xtentic het volgende:
jah, maar is dat PHP?... ow needus next
ik niet begrijpOp donderdag 18 april 2002 19:07 schreef freak007 het volgende:
[..]
Er is een php interface en is zeer uitgebreid
Dat je het ook gewoon in php kan gebruiken en een hoop meer functionaliteit bied dan template parsers.Op donderdag 18 april 2002 22:47 schreef xtentic het volgende:
ik niet begrijp
isSet misschienOp donderdag 18 april 2002 18:19 schreef xtentic het volgende:
Ik heb weer eens wat nieuws bedacht, stel ik wil een stukje meerdere keren gebruiken (uit een template) dan moet ik een of andere array hebben waaruit ik de data haal?
for example parsing this
[loop]
<a href="%link%">%linkname%</a> - %hits% - %views<br>
[/loop]
dan wordt de input daarvoor denk ik
$array[$template][%link%][0] = "link.html";
$array[$template][%linkname%][0] = "link";
$array[$template][%hits%][0] = "10";
$array[$template][%views%][0] = "15";
$array[$template][%link%][1] = "link.html";
$array[$template][%linkname%][1] = "link";
$array[$template][%hits%][1] = "10";
$array[$template][%views%][1] = "15";
maaruh stel ik voer hits niet in maar bij de volgende wel, dan loopt ut helemaal stuk
hoe kan ik een manier / functie maken die dat checkt ofzo?... of dat ik dit speciaal kan parsen?
Tnx... 't wordt steeds ingewikkelder
Tuurlijk isSet, maar mischien een 'voor routine' die zorgt voor een correcte afwerking van deze variabelen? alleen weet ik niet hoe ik dat moet aanpakken.Op vrijdag 19 april 2002 11:24 schreef Nielsz het volgende:
[..]
isSet misschien
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| function forEachFunction($foreach,$do="") { $foreach=strtoupper(trim($foreach)); $count=count($this->parseableVars["$foreach"]); $row=0; $stringValue=""; while($row<$count) { //echo $row; $stringValue.=preg_replace('/\{\.(.*?)\}/ies','$this->getValue("$foreach.$row.\1")',$do); $row++; } return $stringValue; } |
Nu kijk ik hoeveel records die heeft, en voer $do zovaak uit. Voor elke keer dat ik dat doe replace ik {.1} met $array.$row.1
simpel
Als hij niet bestaat krijg ik gewoon "" terug of {.1}, ligt eraan wat ik instel
3 keuzes, je kan ook je programma in een class stouwenOp zaterdag 20 april 2002 09:28 schreef xtentic het volgende:
hmmz, ik zal um eens ombouwen of zelf herschrijven, want jij maakt gebruik van een class en ik van een include
[quote]
Programmeren is kunst, en ik ben Picasso.
[/quote]
Is die niet dood?
dat is zo alleen heb ik daar nog weinig verstand van... mischien kan je me helpen met het volgendeOp zaterdag 20 april 2002 09:40 schreef Nielsz het volgende:
[..]
3 keuzes, je kan ook je programma in een class stouwen
ik heb de volgede code gebrouwen en zou volgens mij moeten werken
1
| <?/*for example parsing this[loop]<a href="%link%">%linkname%</a> - %hits% - %views<br>[/loop]dan wordt dat denk ik$array[$template][%link%][0] = "link.html";$array[$template][%linkname%][0] = "link";$array[$template][%hits%][0] = "10";$array[$template][%views%][0] = "15";$array[$template][%link%][1] = "link.html";$array[$template][%linkname%][1] = "link";$array[$template][%hits%][1] = "10";$array[$template][%views%][1] = "15";maaruh stel ik voer hits niet in maar bij de volgende wel, dan loopt ut helemaal stuk :(*/// include("../parser.include.php");$tmp['template'] = '[loop]<a href="%link%">%linkname%</a> - %hits% - %views%<br>[/loop]';function parseArrayRecord(&$kwHash, $inKeyword, $inValue) { if (isSet($kwHash[$inKeyword])) { $kwHash[$inKeyword][count($kwHash[$inKeyword])+1] = $inValue; } else { $kwHash[$inKeyword][1] = $inValue; }}for ($x = 0; $x < 100; $x++) { parseArrayRecord($tmp, "%link%", "link$x"); parseArrayRecord($tmp, "%linkname%", "link$x"); parseArrayRecord($tmp, "%hits%", "link$x"); parseArrayRecord($tmp, "%views%", "link$x");} $theString = $tmp['template']; $thePattern = '!\\[loop\](\w.*)\\[/loop\]!ism'; preg_match_all($thePattern, $theString, $theBackRef); $newStr = "";echo '<pre>';var_dump($theBackRef);echo '</pre>'; for ($i = 0; $i <= count($theBackRef[0]); $i++) { $tmpStr = $theBackRef[1][$i]; if (isSet($name[$tmpStr])) { for ($x = 1; $x <= count($name[$tmpStr]); $x++) { $newStr = $newStr . $tmpStr; foreach ($name as $key => $value) { $tmpStr = eregi_replace($key, $value, $newStr); } } } $theString = str_replace($theBackRef[0][$i], $newStr, $theString); } unset($theBackRef);echo $theString;?> |
heb je anders tips hoe ik het mischien kan aanpakken... etc.
Concreet voorbeeld:
1
| <?$dblayer = new DbLayer;$result=$dblayer->query($query);$array=$dblayer->fetch_array($result);?> |
Stel dat je dit laat werken op een mysql-databeest, maar dat je later multiple selects wilt uitvoeren en besluit om over te stappen naar MSSQL. Dan hoef je alleen die ene class te veranderen en hoef je er in je code niet meer naar uit te kijken.
Maarja dit zal wel allemaal lekker vaag zijn enzo,
de mensen bij DevShed kunnen het veel beter
Op zich is wat je schrijft best begrijpelijk, maar dat is toch eingelijk het zelfde met een include?... wanneer je overstapt naar iets anders moet je gewoon de 'include' aanpassenOp zaterdag 20 april 2002 11:55 schreef /dev/null het volgende:
Het voordeel van classes is dat je heel makkelijk verschillende dingen kan scheiden. Je kan bijvoorbeeld een class voor de templates bouwen, en een class voor de database. Als je b.v. een database class bouwt, kan je met 'extended' heel makkelijk een class bouwen voor verschillende talen die je allemaal op dezelfde manier kan aanspreken.
Concreet voorbeeld:
PHP:
1 <?$dblayer = new DbLayer;$result=$dblayer->query($query);$array=$dblayer->fetch_array($result);?>
Stel dat je dit laat werken op een mysql-databeest, maar dat je later multiple selects wilt uitvoeren en besluit om over te stappen naar MSSQL. Dan hoef je alleen die ene class te veranderen en hoef je er in je code niet meer naar uit te kijken.
Maarja dit zal wel allemaal lekker vaag zijn enzo,
de mensen bij DevShed kunnen het veel beter
1
| <?/*for example parsing this[loop]<a href="%link%">%linkname%</a> - %hits% - %views<br>[/loop]dan wordt dat denk ik$array[$template][%link%][0] = "link.html";$array[$template][%linkname%][0] = "link";$array[$template][%hits%][0] = "10";$array[$template][%views%][0] = "15";$array[$template][%link%][1] = "link.html";$array[$template][%linkname%][1] = "link";$array[$template][%hits%][1] = "10";$array[$template][%views%][1] = "15";maaruh stel ik voer hits niet in maar bij de volgende wel, dan loopt ut helemaal stuk :(*/// include("../parser.include.php");$tmp['template'] = 'bladeidebla[loop="%items%"]<a href="%link%">%linkname%</a> - %hits% - %views%<br>[/loop]bleeeeeeehougoaih';function parseArrayRecord(&$kwHash, $inKeyword, $inValue) { if (isSet($kwHash[$inKeyword])) { $kwHash[$inKeyword][count($kwHash[$inKeyword])+1] = $inValue; } else { $kwHash[$inKeyword][1] = $inValue; }}for ($x = 0; $x < 100; $x++) { parseArrayRecord($tmp, "%link%", "link$x"); parseArrayRecord($tmp, "%linkname%", "link$x"); parseArrayRecord($tmp, "%hits%", "link$x"); parseArrayRecord($tmp, "%views%", "link$x");}$tmp['items'] = "10"; $theString = $tmp['template']; $thePattern = '!\[loop="(.*?)"\](.*?)\\[/loop\]!ism'; preg_match_all($thePattern, $theString, $theBackRef); $newStr = "";echo '<pre>';var_dump($theBackRef);echo '</pre>'; for ($i = 0; $i <= count($theBackRef[0]); $i++) { $tmpStr = $theBackRef[2][$i]; if (isSet($name[$theBackRef[1][$i]])) { echo "Yes!"; for ($x = 1; $x <= $name[$theBackRef[2][$i]]; $x++) { $newStr = $newStr . $tmpStr; foreach ($name as $key => $value) { $tmpStr = eregi_replace($key, $value, $newStr); } } } $theString = str_replace($theBackRef[0][$i], $newStr, $theString); } unset($theBackRef);echo $theString;?> |
1
| <?$string = "hoi hier komt een [loop=array]ik ben <font color='%kleur%'>%naam%</font>[/loop] loopje";$array[] = array('kleur' => '#00FF00', 'naam' => 'groen');while($string != $oldstring{ $oldstring = $string; foreach(array('/\[loop=(.*?)\](.*)][\/loop\]/sie' => 'loop') as $pattern => $function) { $string = preg_replace_callback($pattern,$function,$string); }}function loop(){ GLOBAL $array; // iets met get_func_args() enzo, of doe iets hierboven met \\1 en \\2 etc. foreach($array as $find => $value) { $patterns[] = '/'.preg_quote('%'.$find.'%') .'/si'; $replace[] = $value; } while($string != $oldstring) { $oldstring = $string; $string = preg_replace($pattern,$replace,$string); } return $string;}?> |
Klaar voor een nieuwe uitdaging.
Ja daswaar, maarOp zaterdag 20 april 2002 18:12 schreef xtentic het volgende:
[..]
Op zich is wat je schrijft best begrijpelijk, maar dat is toch eingelijk het zelfde met een include?... wanneer je overstapt naar iets anders moet je gewoon de 'include' aanpassen
Spreekt voor zich?5 Oktober 200 schreef DevShed het volgende:
[..]
Once a class has been defined, PHP allows you to spawn as many instances of the class as you like. Each of these instances is a completely independent object, with its own properties and methods, and can thus be manipulated independently of other objects.
Now, you're probably wondering whether this is a little redundant, since PHP also allows you to create your own functions and use them wherever required in your code. And you're correct, to some extent - if you're only planning to spawn a single object, a class is redundant and a function will work just as well.
But there are situations where you need to spawn more than one instance of an object - for example, two simultaneous database links for two simultaneous queries, or two shopping carts. In such a situation, classes are preferred, since each instance of the class comes with its own variables and functions, and thus can be manipulated with affecting other variables within the program.
Classes also help you keep your code modular - you can define a class in a separate file, and include that file only in the pages where you plan to use the class - and simplify code changes, since you only need to edit a single file to add new functionality to all your spawned objects.
[..]
/dev/null
Je kan dus als het ware een functie wel 10x gebruiken zonder dat je eingelijk de zelfde functie gebruikt...
Deze heeft een aantal functies, bijvoorbeeld $winkwag->addProduct($product) of $winkwag->showContents(). Dit kan ook wel met include's, maar dan krijg je een probleem als je bijvoorbeeld 2 winkelwagentjes wilt. Dan moet je alles helemaal aan gaan passen enzo. Hier is gewoon de definitie:
1
| <?$winkwag1 = new WinkelWagentje();$winkwag2 = new WinkelWagentje();?> |
Je kan vervolgens allerlei bewerkingen en functies uitvoeren onafhankelijk van elkaar. Maarja.
1
| <?// dit is als het ware de 'template'.$tmp['template'] = 'bladeidebla[loop="%items%"]<a href="%link%">%linkname%</a> - %hits% - %views%<br>[/loop]bleeeeeeehougoaih';// deze functie saves de keys in de array, lijkt me wel logisch...function parseArrayRecord(&amp;$kwHash, $inKeyword, $inValue) { if (isSet($kwHash[$inKeyword])) { $kwHash[$inKeyword][count($kwHash[$inKeyword])+1] = $inValue; } else { $kwHash[$inKeyword][1] = $inValue; }}// loopje om een zogenaamde array te crearen.for ($x = 1; $x <= 10; $x++) { parseArrayRecord($tmp, "%link%", "link: $x"); parseArrayRecord($tmp, "%linkname%", "linkname: $x"); parseArrayRecord($tmp, "%hits%", "hits: $x"); parseArrayRecord($tmp, "%views%", "views: $x");}// zeg ff voor het gemak dat er 10 items zijn$tmp['%items%'] = 10; // met deze 3 regels lees ik alle [loop="etc"]bla[/loop]'s uit, lekker simpel. $theString = $tmp['template']; $thePattern = '!\[loop="(.*?)"\](.*?)\\[/loop\]!ism'; preg_match_all($thePattern, $theString, $theBackRef); $newStr = ""; // loopje voor zovaak er een [loop=][/loop] gevonden is. for ($i = 0; $i <= count($theBackRef[0]); $i++) { $tmpStr = $theBackRef[2][$i]; // loopje voor het aantal 'items' dat er gevonden is [loop="%items%"] for ($x = 1; $x <= $tmp[$theBackRef[1][$i]]; $x++) { $newStr = $tmpStr; // dit stukje zou het item moeten vervangen door een juiste waarde. foreach ($tmp as $key => $value) { $xC = $value[$x]; echo 'change: ' . $key . ' to ' . $xC . '<br>'; $tmpStr = str_replace($key, $xC, $newStr); } $addStr .= $newStr; } $theString = str_replace($theBackRef[0][$i], $addStr, $theString); } unset($theBackRef);echo $theString;?> |
de output is het volgende.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
| change: template to l change: %link% to link: 0 change: %linkname% to linkname: 0 change: %hits% to hits: 0 change: %views% to views: 0 change: %items% to change: template to a change: %link% to link: 1 change: %linkname% to linkname: 1 change: %hits% to hits: 1 change: %views% to views: 1 change: %items% to change: template to d change: %link% to link: 2 change: %linkname% to linkname: 2 change: %hits% to hits: 2 change: %views% to views: 2 change: %items% to change: template to e change: %link% to link: 3 change: %linkname% to linkname: 3 change: %hits% to hits: 3 change: %views% to views: 3 change: %items% to change: template to i change: %link% to link: 4 change: %linkname% to linkname: 4 change: %hits% to hits: 4 change: %views% to views: 4 change: %items% to change: template to d change: %link% to link: 5 change: %linkname% to linkname: 5 change: %hits% to hits: 5 change: %views% to views: 5 change: %items% to change: template to e change: %link% to link: 6 change: %linkname% to linkname: 6 change: %hits% to hits: 6 change: %views% to views: 6 change: %items% to change: template to b change: %link% to link: 7 change: %linkname% to linkname: 7 change: %hits% to hits: 7 change: %views% to views: 7 change: %items% to change: template to l change: %link% to link: 8 change: %linkname% to linkname: 8 change: %hits% to hits: 8 change: %views% to views: 8 change: %items% to bladeidebla %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% %linkname% - %hits% - %views% bleeeeeeehougoaih |
het blijkt dus dat de items niet veranderd worden, al snap ik niet waarom dat niet gebeurd?
HELP!..