Skye McCloud Posted August 24, 2013 Share Posted August 24, 2013 Recently I've been learning how to create a template engine, partially for my own knowledge and partially because I find most pre-existing template engines, like Smarty, carry a lot more functions in them than I need.For the most part, I've gotten it down. However, there's one thing I've not been able to figure out that I've seen done: how to use a piece of a template file repeatedly on a single page.I know this function is doable, as I've been using phpBB as a basis for my learning and THEY do this when you're viewing a topic: all the posts use a small portion of the viewtopic_body.html template file over and over for each post. What I'm trying to figure it is how I can do this as well. I've spent a while now reading over their files, following from one function to the other and trying to find the right function, but I've not found what I need (Or if I have, I was too confused by it to recognize it). Quote Link to comment https://forums.phpfreaks.com/topic/281508-template-engines-repeat-use-of-a-portion-of-a-template-file/ Share on other sites More sharing options...
kicken Posted August 24, 2013 Share Posted August 24, 2013 You just create a looping construct in your template. How you do this depends on how you are doing your templates. If you do like smarty for instance and use {tag} placeholders then you'd create a tag such as {foreach}. As you parse the template you extract the text between {foreach} and {/foreach} and use that in a loop. This is just off the top of my head and untested, so there may be bugs, but as a basic example: $tplVars['var']=array(1,2,3,4); $template = 'Before the loop. {foreach $var}In the loop!{/foreach} After the loop!'; for ($pos=0; ($pos=strpos($template,'{foreach ',$pos)) !== false; $pos++){ $end = strpos($template,$pos+1); if ($end === false) die('Error'); $end += 10; //length of '{/foreach}' //Extract the code for the loop from the template (including tags) $code = substr($template, $pos, $end-$pos); //Extract the variable name $varToLoop = substr($code, 0, strpos($code, '}')); $varToLoop = substr($varToLoop, strrpos($varToLoop, ' ')); //Strip the tags from the code $code = substr($code, strpos($code, '}')+1); $code = substr($code, 0, strrpos($code, '{')); if (!isset($tplVars[$varToLoop])) die('Error'); $output = ''; foreach ($tplVars[$varToLoop] as $var){ $output .= $code; } //Replace the tags in the original template w/ the generated output. $template = substr_replace($template, $output, $pos, $end-$pos); } var_dump($template); On the other hand, you could just let PHP handle the templating for you in which case you don't need to do anything other than write a normal loop. This is what I do: Before the loop! <?php foreach ($var as $v): ?> In the loop! <?php endforeach; ?> After the loop! When you want to use the template, it's just a simple matter of include()ing it. Quote Link to comment https://forums.phpfreaks.com/topic/281508-template-engines-repeat-use-of-a-portion-of-a-template-file/#findComment-1446543 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.