Als ik een site programmeer, maak ik bijna altijd gebruik van een header.php en een footer.php. De eerste bevat o.a. de van een site en de onderste bevat vaak de onderste regels HTML code. In het middelste deel wordt bepaald welke content daar geplaatst moet worden. Dit betekent dat ik vaak wijzigingen wil doorvoeren in de content header.php, nadat header.php al geparsed is. Een typisch voorbeeld is de van de pagina. Dit kun je oplossen door de output buffering functies van PHP.
In het kort komt het idee er op neer dat je de hele HTML bron die geprint zal gaan worden eerst in een variabele stopt. Vervolgens vervang je de content die je wilt vervangen en pas dan print je de HTML.
Helemaal bovenaan in header.php geven we d.m.v. aan dat de output buffering gestart moet worden. Er mag helemaal niks voor deze functie staan, ook geen spatie of een witregel.
Vervolgens plaatsen we een variabele voor de paginatitel:
Als we in het middenstuk van onze pagina bepalen welke pagina geladen moet worden, kunnen we ook bepalen welke titel we moeten gebruiken. Deze stoppen we in de variabele $paginaTitel.
In footer.php lezen we via de functie ob_get_contents() de waarde van de output buffer uit. Vervolgens vervangen we variabele van de pagina-titel en via ob_end_clean() legen we de output buffer. De laatste stap is dat we de variabele met de gewijzigde titel printen naar het scherm. In code komt dat hierop neer:
$data = ob_get_contents();
$data = str_replace("%paginaTitel%", $paginaTitel, $data);
ob_end_clean();
echo $data;
?>
Ik heb een iets andere werkwijze die er voor zorgt dat je geen output-buffering hoeft te gebruiken:
inhoud.php:
< ?php
$dingen = $databaseGateway->haalDingen();
$template = array (
‘content-file’ => ‘inhoud.tpl.php’,
‘dingen’ => $dingen,
‘pagina-titel’ => ‘Dit is de pagina titel voor inhoud.tpl.php’
);
require TEMPLATES_PATH . ‘shell.tpl.php’;
?>
In Shell.tpl.php staat de html-omlijsting (html,head,body) waar je $template['pagina-titel'] in kunt tonen en in de body wordt de file die door $template['content-file'] wordt beschreven ook geinclude. Die file kan dan gewoon $template['dingen'] gebruiken.
Scheelt geheugen en code.