Jump to content

[SOLVED] Help with template class - include statements


john010117

Recommended Posts

I have managed to build a small template class that can so far parse template variables. Now, to move one step further, I have begun to put in a template include part (includes separate templates within a template file). Here's what I have so far (only the include parts are shown):

 

<?php
class template
{
var $template_root = './template';
var $output;

function _include_template($filename)
{
	ob_start();
	include($this->template_root . '/' . $filename);
	$content = ob_get_contents();
	ob_end_clean();
	return $content;
}

function compile($filename)
{
	$this->output = @file_get_contents($this->template_root . '/' . $filename);

	// Locates all the include statements (looks like: <!-- INCLUDE some_file.html -->)
	preg_match_all('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->output, $include_matches);

	if(!empty($include_matches[1]))
	{
		for($i = 0, $size = sizeof($include_matches[1]); $i < $size; $i++)
		{
			$this->output = preg_replace('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->_include_template($include_matches[1][0]), $this->output);
			array_shift($include_matches[1]);
		}
	}
	echo $this->display();
}

function display()
{
	return $this->output;
}
}
?>

 

If I include one file in a template file, the file shows up fine. However, if I include two or more files, the first file that was included in the template keeps on getting included over and over again. Does anyone see a problem with this code? Help will be much appreciated.

explain !

However, if I include two or more files, the first file that was included in the template keeps on getting included over and over again.

 

What I mean is this:

 

Let's say I had the template file "index_body.html" (called from index.php). Then, in that template file, I include "index_2.html". So far, so good. But, if I include "index_3.html" or any other file below the first include statement, only "index_2.html" shows up within "index_body.html". That happens  the number of include statements (stated in index_body.html) times.

i believe the problem is inside the loop because you put the value in the array but i dont see a code that will call the index of that array from preg match eg.. $array[ist ], $array[2nd ] etc...

 

Can you please elaborate on that a bit more? I'm confused as to what you're implying.

maybe

instead of

		for($i = 0, $size = sizeof($include_matches[1]); $i < $size; $i++)
		{
			$this->output = preg_replace('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->_include_template($include_matches[1][0]), $this->output);
			array_shift($include_matches[1]);
		}

 

try

		foreach($include_matches[1] as $IM)
		{
			$this->output = preg_replace('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->_include_template($IM), $this->output);
		}

Ok, I tried that method, but that outputted no difference. To make sure, I've echo'ed the value of $IM within the loop, and it shows what it's supposed to show. Here's the updated code:

 

<?php
class template
{
var $template_root = './template';
var $output;

function _include_template($filename)
{
	ob_start();
	include($this->template_root . '/' . $filename);
	$content = ob_get_contents();
	ob_end_clean();
	return $content;
}

function compile($filename)
{
	$this->output = @file_get_contents($this->template_root . '/' . $filename);

	preg_match_all('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->output, $include_matches);

	if(!empty($include_matches[1]))
	{
		foreach($include_matches[1] as $IM)
		{
			$this->output = preg_replace('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->_include_template($IM), $this->output);
		}
	}
	echo $this->display();
}

function display()
{
	return $this->output;
}
}
?>

 

I'm just guessing, but could the problem lie in the _include_template() function with the output buffering?

the logic isn't right..

 

$this->output = preg_replace('#<!-- INCLUDE ([a-zA-Z0-9\_\-\+\./]+) -->#', $this->_include_template($IM), $this->output);

 

should be

$this->output = preg_replace($IM, $this->_include_template($IM), $this->output);

 

 

Warning: i haven't had much sleep!

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.