Als je XSLT overigens wil gebruiken als template-engine, dan kun je (delen van) deze class gebruiken. Ik gebruik 'em zelf ook, en het werkt erg lekker (voordeel is dat je eventueel andere template-engines met dezelfde class kan aanspreken en dus een niveau van abstractie hebt)
Ohja, deze werkt alleen met PHP5
Deze class genereert bijvoorbeeld de volgende XML (met 1 parameter: naam):
Met de XSL-file transform je dit dan alsvolgt naar HTML:
Deze class is een versimpelde versie van de originele pnpTemplate class, die ik heb gemaakt voor mijn pnp-framework. Sommige dingen zul je dus zelf moeten maken of moeten vervangen, zoals de pnpException-class
Het leuke aan deze manier van templaten is dat je zelf ook tags kunt toevoegen die op de server worden gereplaced. Ikzelf gebruik bijvoorbeeld de <pnp:widget name="time"/> als ik ergens de huidige tijd wil hebben staan ofzo. Die tags worden door de eerdergenoemde uitgebreide versie van de pnpTemplate-class allemaal gereplaced met andere tags (ook weer uit een DOM). De code hiervoor (kun je in de Run-methode ergens kwijt denk ik):
Uit ervaring is bij mij gebleken dat XSLT ruim 2x zo snel is als mijn eigengemaakte Stackbased Template Parser (klik hier voor versie met kleurtjes), die toch ook niet traag genoemd kan worden. De reden hiervoor is dat de XSLT in machinetaal is gemaakt (ws in C++ of C) en dat is nou eenmaal een stuk sneller dan alles in PHP te laten interpreteren
Ohja, deze werkt alleen met PHP5
PHP:
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
| <?php class pnpTemplate { protected $_tpl, $_xslt, $_stylesheet; function __construct($module,$tpl_name,$type='unknown') { $xsl_dom = new DomDocument(); $xsl_dom->load(pnpConfig::componentDirectory.$module->GetName()."/".$tpl_name.".xsl"); $this->_xslt = new XsltProcessor(); $this->_xslt->setParameter(null,"prefix",$module->prefix()); $this->_stylesheet = $this->_xslt->importStylesheet($xsl_dom); } private function AddVarsToDOM(&$node, $params,&$inputdom) { foreach($params as $k=>$v) { if(is_array($v)) { $varnode = $inputdom->createElement($k); $this->AddVarsToDOM($varnode,$v,$inputdom); $node->appendChild($varnode); } elseif(is_object($v)) { $varnode = $inputdom->createElement($k); $this->AddVarsToDOM($varnode,$v,$inputdom); $node->appendChild($varnode); } else { $varnode = $inputdom->createElement($k); $valnode = $inputdom->createTextNode($v); $varnode->appendChild($valnode); $node->appendChild($varnode); } } } function Run($params=array(), $debug=false) { $inputdom = new DomDocument(); $root_node = $inputdom->createElement("template"); $this->AddVarsToDOM($root_node,$params,$inputdom); $inputdom->appendChild($root_node); if($debug) { print "<b>Input XML:</b><hr/>"; print htmlentities($inputdom->saveXML()); } $newdom = $this->_xslt->transformToDoc($inputdom); if(!is_object($newdom)) { throw new pnpException("XSLT Transformation failed",pnpException::xsltFailed); } return $newdom->saveXML(); } }; ?> |
Deze class genereert bijvoorbeeld de volgende XML (met 1 parameter: naam):
XML:
1
2
3
4
| <?xml version="1.0"?> <template> <name>jantje</name> </template> |
Met de XSL-file transform je dit dan alsvolgt naar HTML:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?xml version="1.0" encoding="iso-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/template"> <html> <head> <title>Groetjes!</title> </head> <body> Hey <xsl:value-of select="name"/>, leuk je te zien! </body> </html> </xsl:template> </xsl:stylesheet> |
Deze class is een versimpelde versie van de originele pnpTemplate class, die ik heb gemaakt voor mijn pnp-framework. Sommige dingen zul je dus zelf moeten maken of moeten vervangen, zoals de pnpException-class
Het leuke aan deze manier van templaten is dat je zelf ook tags kunt toevoegen die op de server worden gereplaced. Ikzelf gebruik bijvoorbeeld de <pnp:widget name="time"/> als ik ergens de huidige tijd wil hebben staan ofzo. Die tags worden door de eerdergenoemde uitgebreide versie van de pnpTemplate-class allemaal gereplaced met andere tags (ook weer uit een DOM). De code hiervoor (kun je in de Run-methode ergens kwijt denk ik):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| /* in de newdom zoeken naar pnp:widget elementen enzo) */ $items = $newdom->getElementsByTagName("widget"); foreach($items as $k=>&$v) { $params = array(); foreach($v->attributes as $key=>$val) { $params[$key] = $val->textContent; } $params['text'] = $v->textContent; $parent = $v->parentNode; if(!isset($params['name'])) { throw new pnpException("XSLT Transformation failed: a pnp:widget tag was found, but no name attribute was specified.",pnpException::xsltFailed); } $name = $params['name']; // nieuw object maken $obj = [ergens je widget class vandaan plukken] $parent->replaceChild($obj->Widget($params,&$newdom),$v); // gooit exception als Widget niet is geimplementeerd in $obj } |
Uit ervaring is bij mij gebleken dat XSLT ruim 2x zo snel is als mijn eigengemaakte Stackbased Template Parser (klik hier voor versie met kleurtjes), die toch ook niet traag genoemd kan worden. De reden hiervoor is dat de XSLT in machinetaal is gemaakt (ws in C++ of C) en dat is nou eenmaal een stuk sneller dan alles in PHP te laten interpreteren
[ Voor 48% gewijzigd door MisterData op 09-06-2004 08:11 ]