Feedback på ny type template

Tags:    php

Jeg har arbejdet lidt på en ny type template engine, som gør brug af nogle features jeg ikke har spottet før i andre frameworks mm.

Da der er mange af jer, der bruger inline PHP kunne jeg godt tænke mig at høre om denne type template er overskuelig eller ej. De ligner lidt de templates der bruges fra f.eks Wordpress eller Magento. I denne form for templates kan data struktureres mere lige til og baseres på JSON.

En template kan se ud som følgende:
Fold kodeboks ind/udHTML kode 


Outputtet af ovenstående ser ud som nedestående. Rendering holdes i gennemsnit på 0.006s med en master template og en sub template (lokalt).
Fold kodeboks ind/udHTML kode 




Indlæg senest redigeret d. 04.08.2010 15:51 af Bruger #10216
10 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Jeg synes det er alt for besværligt/grimt at have php tags over det hele. Så når du f.eks. skriver <h1><?php $page->header->title() ?></h1>
vil jeg normalt sige <h1>{{header.title}}</h1>.

Det tager selvfølgelig lidt længere tid at parse så, men til gengæld kan jeg så også smide alle mulige andre smarte features ind som f.eks. at templates kan nedarve fra hinanden (i modsætning til de gængse template engines hvor du inkluderer templates i hinanden).

Hvis jeg skal bruge en foreach løkke eller noget andet mere avanceret bruger jeg dog helt almindelig php ligesom du gør i dit eksempel.



Indlæg senest redigeret d. 04.08.2010 16:12 af Bruger #3275
Umiddelbart er der vel ikke videre svært at skrive en funktion der konvertere fra JSON til XML som du så kan give til XSLT.

Mig bekendt er JSON syntaksen ikke tilladt i PHP, men du kunne vel bare bruge array syntaks:

JSON
Fold kodeboks ind/udKode 



PHP
Fold kodeboks ind/udKode 


Eneste forskel er at du skal skrive =>,[,] i stedet for :,{,}

Godt nok skal du så teste om et array har string eller number keys, under antagelse at folk er fornuftige og ikke blander dem i samme array og, at et tomt array er et number keyed array, så burde det her fortælle typen:

Fold kodeboks ind/udKode 


Og konverterings funktionen kunne se ud nogenlunde som det her:
Fold kodeboks ind/udKode 




Personligt foretrækker jeg at bruge "rigtig" PHP. Altså med tags, som du gør.
Jeg føler at det giver mig større handlefrihed, og flere muligheder for at ændre i layoutet ved forskellige værdier.
(Som fx, hvis man skal udskrive tags til en blog, og der skal være en speciel handling ved kun 1 tag)

EDIT: Tjek evt. 'export' funktionen ud. Det sparer dig for din $page variable.



Indlæg senest redigeret d. 04.08.2010 16:57 af Bruger #11328
@Jonas: jeg er til dels enig med dig langt hen ad vejen. Men hvis man skal lave en logisk template løsning, så skal det være med eller uden PHP tags. I princippet skal man jo undgå det, da en template/et view ikke skal indeholde PHP kode i nogen form.

@Sæbekassebil: jeg er bekendt med export. Men trods export giver mere handlefrihed giver den også et større rod af unødvendige variabler. Derudover benytter jeg et dataobject der rekursivt kan gennemløbe et array af værdier, og imitere XSL failsafe kode ved ikke at smide fejl, når man looper en variabel der ikke er et array (ligesom en alm. foreach loop :) ).

Jeg er stor fan af XSLT som er klart den bedste form for template engine jeg har set. XSLT er dog kun til XML. Men hvis man nu kunne portere denne engine til at bruge JSON.

Til de interesserede så er her et ny eksempel. Dette er er en overbygning på første klump kode fra tidligere indlæg.
Fold kodeboks ind/udHTML kode 




Når du bruger {} klammer, er det så fordi det skal konverteres af PHP engine, og i så fald, hvorfor bruger du ikke også XSLT til det?



@Nørden: ved ikke hvor du har hørt at JSON ikke skulle være tilladt i PHP. Ligeledes ved jeg heller ikke hvorfor det ikke skulle være det. Da det efterhånden er blevet til en anerkendt datastruktur. Ydermere må jeg henlede opmærksomheden på http://www.php.net/manual/en/ref.json.php

Der er ingen pointe i at lave flere lag end højst nødvendigt. At konvertere JSON til XML er et lag for meget. XSLT til PHP er lækkert at arbejde i, men er desværre ikke blevet opgraderet til den eksisterende v2.0 som findes i dag.

@Saebkassebil: {} klammerne er til udtræk af værdier, og fungerere i princippet som et "value-of"-tag. Det kan bedst beskrives til inline brug, f.eks når du skal indsætte værdier i HTML attributter.



@Michael:
Inspireret af din idé, og at jeg altid har elsket XML (og derved og XSL(T)), så lavede jeg mig selv en simpel template class:
Fold kodeboks ind/udPHP kode 


Og en simpel XSL fil:
Fold kodeboks ind/udXML kode 


Hvad synes du? Er LIGE startet på XSL, så måske er syntaxen ikke så smuk? Og hvad med klassen? Det er længe siden jeg har udviklet i PHP...



Der er en væsentlig forskel på, at skrive en streng som er JSON encoded, og på, at skrive JSON i php.

JSON encoded streng:
Fold kodeboks ind/udKode 


JSON i PHP:
Fold kodeboks ind/udKode 


Jeg holder stadigvæk på at det ikke er lovligt at skrive JSON i PHP.



Der er en væsentlig forskel på, at skrive en streng som er JSON encoded, og på, at skrive JSON i php.

JSON encoded streng:
Fold kodeboks ind/udKode 


JSON i PHP:
Fold kodeboks ind/udKode 


Jeg holder stadigvæk på at det ikke er lovligt at skrive JSON i PHP.

Men at bruge det, som transportering til data, er helt fint...



Der er vel ca. 3 muligheder:

1. Løse templaten til HTML på serveren med PHP og sende HTML, i dette tilfælde ser jeg ikke stor grund til at encode data til json med php for at en template engine i php så kan decode det, og dermed er mit forslag met at bruge et array i stedet for JSON vel ligeså godt.

2. Lad browserens indlæser visualiser templaten, så skal browseren både have templaten(XSLT) og dataerne(XML). Ud fra Gnu's post antager jeg at XSLT ikke kan læse JSON, derfor igen ikke meget ide i at sende JSON til XSLT, og min ide med at bruge et array på serveren og xml genereringsfunktioner virker. Den anden mulighed ville være at skrive en engine og få den implementeret i alle browsere til filer i json formatet (Og med en .json endelse eller noget.)

3. Mulighed sende JSON, Template og Template Engine til browseren som javascripts i en HTML fil. Template Engine læser JSON filen og templaten og danner HTML. Denne sidste mulighed har dog den lille fordel at den formentlig kunne kombineres med AJAX på skumle og uforudsete måder.


Det kan selvfølgelig være at der er andre muligheder.








t