tags:

views:

46

answers:

1

So I have a function such as:

public static function UnorderedList($items, $field, $view = false){
    if(count($items) > 0){
        echo '<ul>';
        foreach($items as $item){
            echo '<li>';
            if($view){
                echo '<a href="'.$view.'id='.$item->sys_id.'" title="View Item">'.$item->$field.'</a>';
            }else{
                echo $item->$field;
            }   
            echo '</li>';
        }
        echo '</ul>'; 
    }else{
        echo '<p>No Items...</p>';
    }
}

This function loops over some items and renders a unordered list. What I am wondering is if its possible to capture the echo output if I wish.

I make a call to use this function by doing something like:

Render::UnorderedList(Class::getItems(), Class::getFields(), true); 

And this will dump a unordered list onto my page. I Know I can just change echo to a variable and return the variable but I was just curious if its possible to capture echo output without modifying that function, merely modifying the call to the function in some way?

Thanks!

+6  A: 

Yes, using output buffering.

<?php
ob_start(); // Start output buffering

Render::UnorderedList(Class::getItems(), Class::getFields(), true); 

$list = ob_get_contents(); // Store buffer in variable

ob_end_clean(); // End buffering and clean up

echo $list; // will contain the contents
 ?>
Pekka
+1 Same answer, 1 minute earlier.
Gazler
Very interesting, thanks for the concise and good answer. :-)
Chris
@Pekka: In terms of design for a small MVC framework specific to a project of mine would this be a good way to go? I have an application that relies on a soap web service for its data and this is a Render class which accepts objects by argument and renders HTML based on them as you saw with this unorderedlist function. Just curious what your thoughts are on this. Based on that solution I can see pages like index.php having a lot of ob_start, ob_end_cleans with function calls in between. Perhaps I learned something new but still need to rework the static library of rendering functions ?
Chris
@Pekka: perhaps I could have Render class's functions all have ob_start(), ob_get_contents(), ob_end_clean() in them and have a public field for this class which is appended the result of ob_get_contents? This way I could build the page up using the Render class and at the very end do a simple echo Render::$contentsfield; ?
Chris
@Chris Mmm, using output buffering as part of a library doesn't sound like good practice to me. This is more the kind of thing you do when you *have* to, e.g. when working with an external library that echoes stuff. Why not change the behaviour of the class methods to return the data instead of echoing it, and make the page itself (the one calling the Render class) echo the results?
Pekka
Fair enough, based on from what I have seen of you around SE I will take your advice whole heartedly. :-) Cheers mate.
Chris