Create a file called layout.php
. Where you want the content to
appear add <?php echo $content ?>
. Here is an example:
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<div id="page">
<?php echo $content ?>
</div>
</body>
</html>
This should be placed in the same directory a your scripts.
Now just add the following to the top of every script (or some include the scripts pull in):
<?php require_once 'lib/layout.php'; ?>
My page content. This will be placed where $content is.
Any content outputted in your script will be placed where $content
is outputted. Note I call the default layout file layout.php
but
also the file you are including is called layout.php
. This is why
I put it in the lib directory. To differentiate it. The one in your
root directory is your layout content. The one in the lib directory
is the one attached to this gist that does the magic.
The $title
variable is automatically pulled into the layout scope.
To set the title simply place the following in your script:
<?php $title = 'Home page' ?>
You can place this before or after the layout require.
If you want to change where the layout file is located just set the $layout variable before calling layout. For example:
<?php
$layout = __DIR__.'/path/to/layout.php';
require_once 'lib/layout.php';
?>
This script provides an excellent opportunity to apply a filter to the
entire output. Similar to an after_filter in Rails. Simply add a callback
function to the global variable $content_filters
. You can do this before
the call to layout.php
(so you are defining $content_filters
or after
by simply appending. Example:
<?php
require_once 'lib/layout.php';
$content_filter[] = 'adjust_markup';
?>
The callback should take the HTML as input and return the final HTML. Content
filters only apply to the $content
and not the layout. Also if the layout
is not used then the content filters are not called.
Redirects are automatically handled. If you set the Location header and exit the layout script will automatically avoid rendering the layout and instead just exit.
This script will set
$content
for you. There is no need for any sort of concatenation mess or using ob_start (this is used internally by this gist for you).Let's say your PHP script is called
index.php
that has your content. It would look like this:The
layout.php
in this gist you would place in thelib
directory (since that is where we require it from). Then your layout file we can just put at the root of the directory and also call itlayout.php
. See the section above titled "Creating a Layout File" for what this file should look like.End result is that you can easily wrap any script with a "layout" by doing one require. Your page content is automatically assigned to $content.