Jump to content

I can't figure how to work Output Buffer


Bisa

Recommended Posts

I'm working on a basic structure for websites containing user management and a template engine.

I've run into troubles with the template engine when I try to allow for including scripted pages.

 

This function is supposed to include and buffer the scripted page:

	function parse_file($file) {
		ob_start();
		include($file);
		$buffer = ob_get_clean();

		return $buffer;
	}

 

In my template class I check to see if the data entered is a file or not, if it is then I run these lines to replace place holder-tags with the output buffer of the file included:

			foreach ($tags as $tag => $data) {
				if (file_exists($data)){
					$data = $this->parse_file($data);
				}

				$this->page = preg_replace('/{' . $tag . '}|<!-- '.$tag.' -->/', $data, $this->page);
			}

 

now here is the hitch, it seems the preg_replace is only replacing one of several identical place holder-tags and I am puzzled as of why this happens, could it be the buffer or what?

Link to comment
Share on other sites

If it's replacing at least one placeholder tag, then that means parse_file() is working.  (You are using OB the right way)

 

So, are you saying your "template" contains multiple {test} tags (just used test as an example), and only one of them is being replaced?  If so, I think the error lies somewhere else in your code, because the loop you provided should work just fine.  The only thing I would do to it is wrap the occurences of $tag with preg_quote in your preg_replace call.

Link to comment
Share on other sites

I see.

 

And yes, I use {PAGE_TITLE} two times for example. One time in the header.html that I am including (the html gets printed out just fine) and a second time in the body. The only time I actually get the title printed is in the body where it's preg_replaced based on a tag associative array " Title" => "My Page Title"

 

what seems to be the issue here is that whenever Ive included a file such as my header.html the preg_replace won't replace my {PAGE_TITLE} which should be located in the buffer output string - instead it just skips it and I'm left with the place holder being echoed rather then my desired title.

Link to comment
Share on other sites

Hmm wait.

 

What's the structure of $tags? (do a print_r on it and paste)

 

I would assume it would be like you said, array('title' => 'My Page Title', 'meta_keywords' => 'foo, bar').

If so, why are you trying to load the value of each element as if it were a file.  I was mistaken above.. now I do think your logic is flawed in the loop.

 

You should:

1. Parse (load) the file before the loop (i.e. $this->page = $this->parse_file('header.html') ).

2. Loop through $tags. It should contain the preg_replace call you already use, but not the if file exists control structure.

Link to comment
Share on other sites

$tags print_r results in this:

Array ( [PAGE_TITLE] => Index [PAGE_HEAD] => ./templates/page_head.html [PAGE_FOOT] => ./templates/page_foot.html ) 1

 

and by that you might figure that I cannot simply parse the file before the loop as I would need to parse both head and foot thus making the buffer consist of only head and foot, or am I thinking wrong there?

Link to comment
Share on other sites

Actually, yes, the loop logic was kinda flawed, what I realized due to your input was the following:

 

Since the {PAGE_TITLE} had already been handled in the first circulation it couldn't be replaced magically in some way once the files had been included which also contained {PAGE_TITLE}. What I did to solve this was, as u suggested, simply to include the pages first and then loop through the tags that had only replacements in it for them :D

 

Thnx ;)

Link to comment
Share on other sites

Ok I see what you are trying to do.  Now we're back to square 1.  I'm fairly certain it's a problem somewhere else in your code.

 

<?php
function parse_file($file) {
ob_start();
include($file);
$buffer = ob_get_clean();
return $buffer;
}

$tags = array('header' => 'header.php', 'footer' => 'footer.php', 'title' => 'Index');

$template = '{header}

<h1><!-- title --></h1>
<p>Hello world</p>

{footer}';

echo '<pre>';
foreach ($tags AS $tag => $data) {
if (is_file($data)) {
	$data = parse_file($data);
}

$template = preg_replace('/{'. preg_quote($tag,'/') .'}|<!-- '. preg_quote($tag,'/') .' -->/', $data, $template);

echo "\n\nTag: $tag";
echo "\nData: $data";
}
echo '</pre>';

echo '<hr>';
echo $template;

That is basically what you are doing. header.php contains Foo and footer.php contains Bar. Works just fine.

 

 

Edit: Glad you got it worked out.  :)

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • 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.