Template Parser
Hallo allemaal,
Ik ben bezig met mijn eigen framework. Nu loop ik een beetje vast bij het laatste stuk. De template parser.
Ik werk in mijn framework met content en components. In mijn template staan stukjes tekst zoals <frwork module="header">
Het stukje '<frwork module="header">' word vervangen door een component die op deze positie staat bijvoorbeeld 'slider component'.
in slidercomponent.php staat bijvoorbeeld '
Als ik alle components heb gereplaced eval ik de code. Dit doe ik met eval zodat slidercomponent.php dan word uitgevoerd en alleen 'dit is een slider' laat zien.
Nu is mijn probleem dat eval() niet echt veilig / moelijk te beveiligen is.
Weten jullie misschien andere optie's om mijn components te replacen in de template?
Mvg,
Tijme
Ik ben bezig met mijn eigen framework. Nu loop ik een beetje vast bij het laatste stuk. De template parser.
Ik werk in mijn framework met content en components. In mijn template staan stukjes tekst zoals <frwork module="header">
Het stukje '<frwork module="header">' word vervangen door een component die op deze positie staat bijvoorbeeld 'slider component'.
in slidercomponent.php staat bijvoorbeeld '
Als ik alle components heb gereplaced eval ik de code. Dit doe ik met eval zodat slidercomponent.php dan word uitgevoerd en alleen 'dit is een slider' laat zien.
Nu is mijn probleem dat eval() niet echt veilig / moelijk te beveiligen is.
Weten jullie misschien andere optie's om mijn components te replacen in de template?
Mvg,
Tijme
Zou je dit niet kunnen oplossen met blocks? Als je nou eerst de html code genereerd en dan dat block inlaadt. Dan moet je wel elke component voorladen en dat kan eventueel problemen opleveren als je site groter wordt.
Met eval zou ik het zowieso niet doen. Wel vind ik het een leuk idee, ik gebruik zelf ook zoiets maar dan met xml en Java. De hele site bestaat uit een xml file, waarbij je dan dingen kan doen als
Waarbij header dan een widget is en zeg maar 1 file inlaadt, hetzelfde principe wat jij wilt. Ik zie echter niet echt in hoe je dit zo makkelijk met php kan bereiken. Heb je al eens gekeken naar bijvoorbeeld Twig? Daar kan je zelf extensies maken, en zou je in theorie dit kunnen maken als extensie
Met eval zou ik het zowieso niet doen. Wel vind ik het een leuk idee, ik gebruik zelf ook zoiets maar dan met xml en Java. De hele site bestaat uit een xml file, waarbij je dan dingen kan doen als
Waarbij header dan een widget is en zeg maar 1 file inlaadt, hetzelfde principe wat jij wilt. Ik zie echter niet echt in hoe je dit zo makkelijk met php kan bereiken. Heb je al eens gekeken naar bijvoorbeeld Twig? Daar kan je zelf extensies maken, en zou je in theorie dit kunnen maken als extensie
Ik zal even kijken naar Twig.
Ik wil alleen zeker niet werken met blocks. De projecten die op het framework runnen worden namelijk heel groot.
Ik wil alleen zeker niet werken met blocks. De projecten die op het framework runnen worden namelijk heel groot.
Optie 1: vervang gewoon de strings in je document met output strings, waarna je direct het hele document kan echo-en.
Optie 2: creeer een set aan php classes die allemaal de __toString methode implementeren. Die kan je dan aanmaken, en in je document plaatsen waar je maar wilt. Op het moment dat het een string moet worden krijg je dan automatisch de juiste ouput.
Voorbeeld:
Hierbij moet je dan alleen wel opletten dat je component wordt vertaald naar een string op het moment dat je de replace uitvoert. Daarvoor kan je dus nog allerlei properties veranderen. Nadat je de replace hebt uitgevoerd niet meer (althans, kan wel, maar dat zie je dan niet terug op je pagina).
Wil je het nog uitgebreider doen, dan kan je ook nog het template inlezen in een class. Die class behandelt dan ook alle replace operaties en doet dat dan weer in zijn __toString methode.
Optie 2: creeer een set aan php classes die allemaal de __toString methode implementeren. Die kan je dan aanmaken, en in je document plaatsen waar je maar wilt. Op het moment dat het een string moet worden krijg je dan automatisch de juiste ouput.
Voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class Test_Component{
public function __toString(){
return 'dit is een slider';
}
}
$slider = new Test_Component();
$file = file_get_contents( 'template.txt' );
$file = str_replace( '<frwork module="header">', $slider, $file );
echo $file;
?>
class Test_Component{
public function __toString(){
return 'dit is een slider';
}
}
$slider = new Test_Component();
$file = file_get_contents( 'template.txt' );
$file = str_replace( '<frwork module="header">', $slider, $file );
echo $file;
?>
Hierbij moet je dan alleen wel opletten dat je component wordt vertaald naar een string op het moment dat je de replace uitvoert. Daarvoor kan je dus nog allerlei properties veranderen. Nadat je de replace hebt uitgevoerd niet meer (althans, kan wel, maar dat zie je dan niet terug op je pagina).
Wil je het nog uitgebreider doen, dan kan je ook nog het template inlezen in een class. Die class behandelt dan ook alle replace operaties en doet dat dan weer in zijn __toString methode.
Dit stukje is wat ik bedoel: http://twig.sensiolabs.org/doc/advanced.html Een extensie maken in Twig is heel simpel. Het zou er dan iets van zo uit kunnen zien:
wat je dan zou kunnen verwijzen binnen je eigen-gemaakte extensie naar header.php Zo ook heel makkelijk load('slider'). Je kunt zelfs argumenten meegeven als array
wat je dan zou kunnen verwijzen binnen je eigen-gemaakte extensie naar header.php Zo ook heel makkelijk load('slider'). Je kunt zelfs argumenten meegeven als array




