login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Alpha testers

Offline Fenrir - 19/02/2005 14:18 (laatste wijziging 19/02/2005 22:27)
Avatar van FenrirPHP expert Ik heb een template engine gemaakt (php).
En het werkt allemaal goed op mijn localhost (php windowsXP). Maar nu wil ik graag weten of het ook werkt op andere systemen, en of het php5-only is.

Dus ik wil het graag op verschillende systemen testen (php4, php5, linux, windows), om te kijken of het daar ook werkt.

En het kan natuurlijk ook dat er sowieso nog fouten in zitten, die op mijn pc ook fout gaan.

Het ondersteunt het volgende:

- Template-Compilatie naar php-code.
- Templates worden alleen gecompileerd als dat nodig is.
- Oneindig-geneste-dynamische-block-parsing.
- Controle voor verkeerd geneste/niet-gesloten blocks
- Variabelen.
- Constants.
- Oneindig diepe boomstructuren weergeven.
- PHP-code in templates wordt geblokkeerd.
- Nog meer, maar ben ik vergeten.

Een voorbeeld:

// Het .php bestand:
  1. <?php
  2.  
  3. include('includes/FTemplate.class.php');
  4.  
  5. # Create a new template-object
  6. $tpl = new FTemplate('templates/Template.tpl', array('forcecompile' => true));
  7.  
  8. # Set the page-title
  9. $tpl->assign('title', 'FTemplate');
  10.  
  11. # Set the image-dir
  12. $tpl->assignConstant('ImageDir', '/images/');
  13.  
  14. # Create a new chapter
  15. $tpl->newBlock('Chapter');
  16. $tpl->assign('title', 'Chapter 1');
  17.  
  18. # Create a new paragraph in chapter 1
  19. $tpl->newBlock('Paragraph');
  20. $tpl->assign('title', 'Paragraph 1');
  21. $tpl->assign('content', 'Lorem ipsum, dolor sit amet...');
  22.  
  23. # Create a new paragraph in chapter 1
  24. $tpl->newBlock('Paragraph');
  25. $tpl->assign('title', 'Paragraph 2');
  26. $tpl->assign('content', 'Lorem ipsum, dolor sit amet...');
  27.  
  28. # Create a new chapter
  29. $tpl->newBlock('Chapter');
  30. $tpl->assign('title', 'Chapter 2');
  31.  
  32. # Create a new paragraph in chapter 2
  33. $tpl->newBlock('Paragraph');
  34. $tpl->assign('title', 'Paragraph 1');
  35. $tpl->assign('content', 'Lorem ipsum, dolor sit amet...');
  36.  
  37. # Create a new paragraph in chapter 2
  38. $tpl->newBlock('Paragraph');
  39. $tpl->assign('title', 'Paragraph 2');
  40. $tpl->assign('content', 'Lorem ipsum, dolor sit amet...');
  41.  
  42. # Create a new tree
  43. $tree = new FT_Recurse();
  44.  
  45. # Create three nodes
  46. $node1 = new FT_Node(array('title' => 'Node1'));
  47. $node2 = new FT_Node(array('title' => 'Node2'));
  48. $node3 = new FT_Node(array('title' => 'Node3'));
  49.  
  50. # Create three subnodes for node 1
  51. $sub11 = new FT_Node(array('title' => 'SubNode1'));
  52. $sub12 = new FT_Node(array('title' => 'SubNode2'));
  53. $sub13 = new FT_Node(array('title' => 'SubNode3'));
  54.  
  55. # Create two subnodes for subnode 2
  56. $sub121 = new FT_Node(array('title' => 'SubSubNode1'));
  57. $sub122 = new FT_Node(array('title' => 'SubSubNode2'));
  58. $sub123 = new FT_Node(array('title' => 'SubSubNode3'));
  59.  
  60. # Assign the subsubnodes to subnode 2
  61. $sub12->addItem($sub121);
  62. $sub12->addItem($sub122);
  63. $sub12->addItem($sub123);
  64.  
  65. # Assign the subnode to node 1
  66. $node1->addItem($sub11);
  67. $node1->addItem($sub12);
  68. $node1->addItem($sub13);
  69.  
  70. # Assign the nodes/subnodes to the tree
  71. $tree->addItem($node1);
  72. $tree->addItem($node2);
  73. $tree->addItem($node3);
  74.  
  75. # Assign the tree to the template
  76. $tpl->assignTree('Tree', $tree);
  77.  
  78. # Output the template
  79. $tpl->PrintToScreen();
  80.  
  81. ?>


// Het template

  1. <html>
  2. <head>
  3. <title>{title}</title>
  4. </head>
  5. <body>
  6.  
  7. Constant Imagedir: [ImageDir] (This is set in ALL blocks and subblocks!)<br />
  8.  
  9. [START BLOCK : Chapter]
  10. <h2>{title}</h2>
  11. [START BLOCK : Paragraph]
  12. <h4>{title}</h4>
  13. <p>{content}</p>
  14. [END BLOCK : Paragraph]
  15. [END BLOCK : Chapter]
  16.  
  17. [START RECURSE : Tree]
  18. <ul>
  19. [RECURSE : START_ITEM]
  20. <li>
  21. <h4>{title}</h4>
  22. [RECURSE : DEEPER_LEVEL]
  23. </li>
  24. [RECURSE : END_ITEM]
  25. </ul>
  26. [END RECURSE : Tree]
  27.  
  28. </body>
  29. </html>


Dit output dan:
- de imagedir
- 2 Chapters met ieder 2 Paragraphs
- Een geneste list (boomstructuur)

Als je me wilt helpen, PM me!

Ik post het nog bij de scripts als het werkt.

Download:
Citaat:
ga naar deze url:
http://members.lycos.nl/leerphpfast/

en klik dan ff op FTemplate.zip


mvd,
Fenrir

6 antwoorden

Gesponsorde links
Offline numlockrond - 30/11/1999 00:00
Avatar van numlockrond Onbekend moeten we gewoon dat script kopiëren en kijken of het werkt, of moeten we ook variaties gaan maken en uitproberenrnrnAls het alleen dat eerste is wil ik wel ff helpen. Heb een server met PHP 4.3.10, Apache 1.3.33 op FreeBSD 4.10.
Offline Fenrir - 30/11/1999 00:00 (laatste wijziging 30/11/1999 00:00)
Avatar van Fenrir PHP expert Nee, de eigenlijke engine staat er niet bij, maar ik stuur je als je wilt een .zip dat je kunt uitpakken, uploaden, en dan index.php bekijken.rnrnEn als je variaties gaat proberen is dat natuurlijk nog veel beter )rnrnEDITrnIk kan de code ook hier posten, maar je moet dan wel een paar bestandendirs makenrnrnindex.php - zie code hierbovenrntemplatestemplate.tpl - zie code hierbovenrncache - deze dir moet je zelf aanmaken, voor de gecompileerde templatesrnincludesFTemplate.class.php - hierin moet je de code van de engine zetten (zie beneden)rnrnEnginern[code]phprnrnclass FT_Nodern{rnrn rn An array that holds the variables for this nodern rn var $vars = array();rn rn rn An array that holds the children for this nodern rn var $items = array();rn rn rn Constructorrn Sets the variables for this node that are in $vars rn rn function FT_Node($vars = array())rn {rn $this-vars = $vars;rn }rn rn rn Adds a new child-node to this nodern rn function &addItem(&$item)rn {rn $this-items[] = &$item;rn return $this-items[count($this-items) - 1];rn }rnrn function toArray()rn {rn $arr = array();rn $arr['VARS'] = $this-vars;rn $arr['CHILDREN'] = array();rn rn foreach($this-items as $item)rn {rn $arr['CHILDREN'][] = $item-toArray();rn }rn rn return $arr;rn }rnrn}rnrnclass FT_Recursern{rn rn An array that holds the children for this recursern rn var $items = array();rn rn function FT_Node()rn {rn }rn rn function &addItem(&$item)rn {rn $this-items[] = &$item;rn return $this-items[count($this-items) - 1];rn }rn rn function toArray()rn {rn $arr = array();rn rn foreach($this-items as $item)rn {rn $arr[] = $item-toArray();rn }rn rn return $arr;rn }rn}rnrnfunction recurse($array, $set_begin, $set_end, $item_begin, $item_end)rn{rn echo $set_begin;rn rn foreach($array as $item)rn {rn rn $item_begin2 = $item_begin;rn $item_end2 = $item_end;rn rn foreach($item['VARS'] as $var = $content)rn {rn $item_begin2 = str_replace('{recurse_var '.$var.'}', $content, $item_begin2);rn $item_end2 = str_replace('{recurse_var '.$var.'}', $content, $item_end2);rn }rn rn $item_begin2 = preg_replace('{recurse_var ([a-zA-Z0-9])}', '', $item_begin2);rn $item_end2 = preg_replace('{recurse_var ([a-zA-Z0-9])}', '', $item_end2);rn rn echo $item_begin2;rn rn if(!empty($item['CHILDREN']))rn {rn recurse($item['CHILDREN'], $set_begin, $set_end, $item_begin, $item_end);rn }rn rn echo $item_end2;rn rn }rn rn echo $set_end;rn}rnrnfunction recurse_arg($str)rn{rn $str = str_replace(, , $str);rn $str = str_replace('', '', $str);rn $str = preg_replace('[([a-zA-Z0-9])]', ' . @$constants[1] . ', $str);rn $str = preg_replace('{([a-zA-Z0-9])}', '{recurse_var 1}', $str);rnrn return $str;rn}rnrnclass FTemplatern{rnrn # The non-compiled templatefilern var $TemplateFile = '';rn rn # The cached (compiled) templatefilern var $CompiledTemplateFile = '';rn rn # The cached configrn var $CompiledTemplateConfigFile = '';rn rn # The cache-dirrn var $CacheDir = 'cache';rn rn # The contents of the non-compiled templatern var $Template = '';rn rn # The templatedata (blocks and vars)rn var $TemplateData = array(rn 'BLOCKS' = array(),rn 'VARS' = array()rn );rn rn # The constantsrn var $constants = array();rn rn # The contents of the compiled templatern var $CompiledTemplate = '';rn rn # The parsed templatern var $ParsedTemplate = '';rn rn # Is the template compiled yetrn var $Compiled = false;rnrn # Is the template parsed yetrn var $Parsed = false;rnrn # The options arrayrn var $Options = array(rn 'forcecompile' = falsern );rnrn # The blocksrn var $blocks = array();rnrn # The current blockrn var $currBlock = array();rn rnrn rn # FTemplate($Template)rn # Constructorrn # $Template contains the path to the templatefilern rn function FTemplate($Template, $options = array())rn {rn $this-currBlock = &$this-TemplateData;rn rn foreach($options as $Opt = $OptVal)rn {rn $this-Options[$Opt] = $OptVal;rn }rnrn if(is_file($Template))rn {rn $this-TemplateFile = $Template;rn $this-CompiledTemplateFile = md5($Template) . '_TEMLPATE.ctpl';rn $this-CompiledTemplateConfigFile = md5($Template) . '_CONFIG.ctpl';rn rn echo 'TEMPLATE MOD TIME ' . filemtime($this-TemplateFile) . 'br ';rn echo 'CTEMPLATE MOD TIME ' . filemtime($this-CacheDir . $this-CompiledTemplateFile) . 'br ';rn rn if(!is_file($this-CacheDir . $this-CompiledTemplateConfigFile) rn filemtime($this-CacheDir . $this-CompiledTemplateConfigFile) filemtime($this-TemplateFile) rn !is_file($this-CacheDir . $this-CompiledTemplateFile) rn filemtime($this-CacheDir . $this-CompiledTemplateFile) filemtime($this-TemplateFile) rn $this-Options['forcecompile'])rn {rn #The template isn't compiled yet, compile it nowrn $this-Template = file_get_contents($this-TemplateFile);rn $this-Compile();rn $this-CacheCompiled();rn }elsern {rn # The template is already compiledrn $this-CompiledTemplate = file_get_contents($this-CacheDir . $this-CompiledTemplateFile);rn $this-blocks = unserialize(file_get_contents($this-CacheDir . $this-CompiledTemplateConfigFile));rn $this-Compiled = true;rn }rn }elsern {rn $this-Error('The Templatefile doesn't exist!');rn }rn }rn rn function Compile()rn {rn if(!empty($this-Template))rn {rn $Template = str_replace('', '&lt', str_replace('', '&gt', $this-Template));rnrn preg_match_all('#[START RECURSE ([A-Za-z0-9_-]+)]rn((s).)rn[RECURSE START_ITEM]((s).)[RECURSE DEEPER_LEVEL]((s).)[RECURSE END_ITEM]rn((s).)rn[END RECURSE 1]#i', $Template, $matches);rnrn$search = $matches[0];rnrnrn$count = count($matches[0]);rnfor($i = 0; $i $count; $i++)rn{rn $replace[] = 'php @recurse($block[VARS][' . $matches[1][$i] . '], 'rn . recurse_arg($matches[2][$i]) . ', 'rn . recurse_arg($matches[5][$i]) . ', ' rn . recurse_arg($matches[3][$i]) . ', ' rn . recurse_arg($matches[4][$i]) . '); ';rn}rnrn$Template = str_replace($search, $replace, $Template);rnrn rn rn # The Variablesrn $Template = preg_replace('{([a-zA-Z0-9])}', '=@$block[VARS][1]', $Template);rn rn # The constantsrn $Template = preg_replace('[([a-zA-Z0-9])]', '=@$constants[1]', $Template);rnrn rn # The templatearrayrn $tplarray = array();rn rn preg_match_all('[(STARTEND) BLOCK ([A-Za-z0-9_-]+)]', $Template, $parts);rn rn # Array to hold the blocks that are currently openrn $openBlocks = array();rn rn # Array that will be stored in the conpiledtemplate_config filern $blocks = array();rn rn # Validate the blocksrn $count = count($parts[0]);rn for($i = 0; $i $count; ++$i)rn {rn $blockName = $parts[2][$i];rn $blockType = $parts[1][$i];rn rn if($blockType == 'START')rn {rn if(!in_array($blockName, $openBlocks))rn {rn rn $blocks[$blockName] = $openBlocks;rn rn $openBlocks[] = $blockName;rn }elsern {rn $this-Error('There are two or more blocks with the same name!');rn }rn }elsern {rn if($openBlocks[count($openBlocks) - 1] == $blockName)rn {rn array_pop($openBlocks);rn }elsern {rn $this-Error('The blocks are not properly nested!');rn }rn }rn }rn rn $this-blocks = $blocks;rn rn if(count($openBlocks) != 0)rn {rn $this-Error('There are blocks that are not closed!', 2);rn }rn rn # Compile the templatern rn # The array with the tag-stringsrn $search = array();rn rn # The array with the php-code stringsrn $replace = array();rn rn $count = count($parts[0]);rn for($i = 0; $i $count; ++$i)rn {rn $blockName = $parts[2][$i];rn $blockType = $parts[1][$i];rn $blockTag = $parts[0][$i];rn rn $search[] = $blockTag;rn rn if($blockType == 'START')rn {rn rn $replace[] = 'phprn if(isset($block[BLOCKS][' . $blockName . ']))rn foreach($block[BLOCKS][' . $blockName . '] as $block)rn ';rn }elsern {rn $replace[] = 'phprn endforeach;rn endif;rn ';rn }rn }rn rn $Template = str_replace($search, $replace, $Template);rn rn $this-CompiledTemplate = $Template;rn $this-Compiled = true;rn $this-Config = serialize($blocks);rn rn }elsern {rn $this-Error('The Template isn't set!');rn }rn }rn rn function CacheCompiled()rn {rn if($this-Compiled)rn {rn $h = fopen($this-CacheDir . $this-CompiledTemplateFile, 'w');rn rn fwrite($h, $this-CompiledTemplate);rn fclose($h);rn rn $h = fopen($this-CacheDir . $this-CompiledTemplateConfigFile, 'w');rn fwrite($h, $this-Config);rn fclose($h);rn }elsern {rn $this-Error('The Template isn't compiled yet!');rn }rn }rn rn function GetTemplate()rn {rn if(empty($this-Template))rn {rn $this-Error('The Template isn't set!');rn }elsern {rn return $this-Template;rn }rn }rn rn function GetCompiledTemplate()rn {rn if(empty($this-CompiledTemplate))rn {rn $this-Error('The Compiled Template isn't set!');rn }elsern {rn return $this-CompiledTemplate;rn }rn }rn rn function GetTemplateData()rn {rn return $this-blocks;rn }rn rn function newBlock($block)rn {rnrn $pblock = &$this-TemplateData;rn rn if(isset($this-blocks[$block]))rn {rn $blockparents = $this-blocks[$block];rn }elsern {rn $this-Error('The block i' . $block . 'i doesn't exist in the template i' . $this-TemplateFile . 'i.');rn }rn rn foreach($blockparents as $pname)rn {rn if(!isset($pblock['BLOCKS'][$pname]))rn {rn $pblock['BLOCKS'][$pname] = array();rn }rnrn $pblock = &$pblock['BLOCKS'][$pname][count($pblock['BLOCKS'][$pname]) - 1];rn }rn rn if(!isset($pblock['BLOCKS'][$block]))rn {rn $pblock['BLOCKS'][$block] = array();rn }rn rn $pblock = &$pblock['BLOCKS'][$block][count($pblock['BLOCKS'][$block])];rn rn $this-currBlock = &$pblock;rn rn }rn rn function Assign($var, $content)rn {rn $this-currBlock['VARS'][$var] = $content;rn }rn rn function AssignConstant($var, $content)rn {rn $this-constants[$var] = $content;rn }rn rn function AssignTree($var, $content)rn {rn $this-currBlock['VARS'][$var] = $content-toArray();rn }rn rn function Parse()rn {rnrn if($this-Compiled)rn {rn ob_start();rn $block = &$this-TemplateData;rn $constants = &$this-constants;rn include($this-CacheDir . $this-CompiledTemplateFile);rn $this-ParsedTemplate = ob_get_contents();rn ob_end_clean();rn }elsern {rn $this-Error('The template isn't compiled yet!');rn }rn rn $this-Parsed = true;rn }rn rn function PrintToScreen()rn {rn if($this-Parsed)rn {rn echo $this-ParsedTemplate;rn }elsern {rn if($this-Compiled)rn {rn $block = &$this-TemplateData;rn $constants = &$this-constants;rn include($this-CacheDir . $this-CompiledTemplateFile);rn }elsern {rn $this-Error('The template isn't compiled yet!');rn }rn }rn }rn rn function GetParsedTemplate()rn {rn if($this-Parsed)rn {rn return $this-ParsedTemplate;rn }elsern {rn $this-Parse();rn return $this-ParsedTemplate;rn }rn }rn rn function Error($msg, $eLevel = 1)rn {rn if($eLevel == 2)rn {rn die($msg);rn }elsern {rn die($msg);rn }rn }rn}rnrn[code]
Offline numlockrond - 30/11/1999 00:00 (laatste wijziging 30/11/1999 00:00)
Avatar van numlockrond Onbekend [quote]Nee, de eigenlijke engine staat er niet bij, maar ik stuur je als je wilt een .zip dat je kunt uitpakken, uploaden, en dan index.php bekijken[quote] Dat snapte ik, vroeg me alleen of het alleen daarom ging of dat ik veel moest doen rnrn[quote]En als je variaties gaat proberen is dat natuurlijk nog veel beter[quote] Als ik zin heb misschien, maar ik heb nog meer te doen...rnrnEdit ok, ga ff proberen.
Offline numlockrond - 30/11/1999 00:00 (laatste wijziging 30/11/1999 00:00)
Avatar van numlockrond Onbekend [code]$count = count($matches[0]);rnfor($i = 0; $i $count; $i++)rn{rn $replace[] = 'php @recurse($block[VARS][' . $matches[1][$i] . '], 'rn . recurse_arg($matches[2][$i]) . ', 'rn . recurse_arg($matches[5][$i]) . ', ' rn . recurse_arg($matches[3][$i]) . ', ' rn . recurse_arg($matches[4][$i]) . '); ';rn}rnrn$Template = str_replace($search, $replace, $Template);[code]rnrnhier krijg ik Undefined variable replace. Blijkbaar is count($matches[0]) 0, zodat de for niet uitgevoerd wordt. ff een $replace = array(); erboven en je bent klaar.rnrnVerder krijg ik deze meldingenrnrnEdit Sorry, lag aan mij. Het werkt nu wel, maar nog niet helemaal perfect Eerst krijg ik de imagedir, 2 chapters met 2 paragrafen en dan dit (uit de bron)rnrn[code][START RECURSE Tree]rnulrn[RECURSE START_ITEM]rn lirn h4Paragraph 2h4rn [RECURSE DEEPER_LEVEL]rn lirn[RECURSE END_ITEM]rnulrn[END RECURSE Tree][code]rnrnLijkt me niet helemaal de bedoeling... rnrnEr zit nog een typefoutje in TEM[b]LP[b]ATE (zie warnings hierboven).rnrnEdit2 zo'n recurse functie is helemaal geen gek idee trouwens. Ik gebruik zoiets nauwelijks, maar als je het een keer wilt gebruiken is het wel handig.rnJe kunt natuurlijk ook een workaround gebruiken als je een template engine zonder ondersteuning daarvoor hebt, maar het is een leuk idee (zelf bedacht).
Offline biertie - 30/11/1999 00:00 (laatste wijziging 30/11/1999 00:00)
Avatar van biertie Onbekend ik wil het wel testen, op een configuratie naar keuze prnheb php4.1rn4.3rn5.0.3rnrnen zowel apache 1.3.33 als 2.0.5rnrndus ik kan alles testen rnrn[edit]rnheb wel geen zin om alles te copy pasten )
Offline Fenrir - 30/11/1999 00:00 (laatste wijziging 30/11/1999 00:00)
Avatar van Fenrir PHP expert Bedankt!rnrn@numlockround rnrnDat recurse werkt dus niet... Krijg je errorsrnrnen staat ditrnrn[code]# Assign the nodessubnodes to the treern$tree-addItem($node1);rn$tree-addItem($node2);rn$tree-addItem($node3);rnrn# Assign the tree to the templatern$tpl-assignTree('Tree', $tree);[code]rnIn index.phprnrn[quote]Er zit nog een typefoutje in TEMLPATE (zie warnings hierboven).[quote] rnWelke zijn datrnrnIk zal zo ff een .zip online zetten, wil je die dan eens proberenrnrn[quote]maar het is een leuk idee (zelf bedacht).[quote]rnJa )rnrnEDITrnHet zip-bestandrnhttpmembers.lycos.nlleerphpfastFTemplate.ziprnrnEDIT2rnga naar deze urlrnhttpmembers.lycos.nlleerphpfastrnrnen klik dan ff op FTemplate.zip
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.667s