Zend Framework Quick Start
Create a Layout
You may have noticed that the view scripts in the previous sections were HTML fragments- not complete pages. This is by design; we want our actions to return content only related to the action itself, not the application as a whole.
Now we must compose that generated content into a full HTML page. We'd also like to have a consistent look and feel for the application. We will use a global site layout to accomplish both of these tasks.
There are two design patterns that Zend Framework uses to implement layouts: Two Step View and Composite View. Two Step View is usually associated with the Transform View pattern; the basic idea is that your application view creates a representation that is then injected into the master view for final transformation. The Composite View pattern deals with a view made of one or more atomic, application views.
In Zend Framework, Zend_Layout combines the ideas behind these patterns. Instead of each action view script needing to include site-wide artifacts, they can simply focus on their own responsibilities.
Occasionally, however, you may need application-specific information in your site-wide view script. Fortunately, Zend Framework provides a variety of view placeholders to allow you to provide such information from your action view scripts.
To get started using Zend_Layout, first we need to make some modifications to our bootstrap.php file:
// application/bootstrap.php
//
// Add the following code prior to the comment marked "Step 5" in
// application/bootstrap.php.
//
// LAYOUT SETUP - Setup the layout component
// The Zend_Layout component implements a composite (or two-step-view) pattern
// With this call we are telling the component where to find the layouts scripts.
Zend_Layout::startMvc(APPLICATION_PATH . '/layouts/scripts');
// VIEW SETUP - Initialize properties of the view object
// The Zend_View component is used for rendering views. Here, we grab a "global"
// view instance from the layout object, and specify the doctype we wish to
// use. In this case, XHTML1 Strict.
$view = Zend_Layout::getMvcInstance()->getView();
$view->doctype('XHTML1_STRICT');
// CLEANUP - remove items from global scope
// This will clear all our local boostrap variables from the global scope of
// this script (and any scripts that called bootstrap). This will enforce
// object retrieval through the applications's registry.
unset($view);
Calling startMvc() registers a plugin with the front
controller, allowing layouts to work seamlessly and without further interaction
in most cases. An action helper is registered, as is a view helper, in case you
do need to interact with the layout object.
Note the call to the doctype() view helper; this is one of the
placeholders mentioned above. By setting this in the bootstrap, we can assure
that other doctype-aware view helpers know the selected doctype.
Now that we've initialized Zend_Layout, let's create our site-wide layout:
<? /* application/layouts/scripts/layout.phtml
This line outputs the doctype we set in the bootstrap */ ?>
<?= $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zend Framework Quickstart Application</title>
<?= $this->headLink()->appendStylesheet('/css/global.css') ?>
</head>
<body>
<!--
Layouts are a great place to put header and footer content that will be
needed on all pages that share the same layout. To understand fully what
having layouts inside a MVC application mean, check out the Zend_Layout
section of the manual.
http://framework.zend.com/manual/en/zend.layout.html
-->
<div id="header" style="background-color: #EEEEEE; height: 30px;">
<div id="header-logo" style="float: left">
<b>ZF Quickstart Application</b>
</div>
<div id="header-navigation" style="float: right">
<!-- To keep urls consistent with the applications router (right now we
are using the default router), we will employ the use of the url
view helper
http://framework.zend.com/manual/en/zend.view.helpers.html
-->
<a href="<?= $this->url(
array('controller'=>'guestbook'),
'default',
true) ?>">Guestbook</a>
</div>
</div>
<!-- This next call will now include any content that was generated in the
dispatching of a controllers action (or series of actions). -->
<?= $this->layout()->content ?>
<!-- If your application requires it, this would be a great place to put a
footer for all pages. -->
</body>
</html>
We grab our application content using the layout() view
helper, and accessing the "content" key. You may render to other response
segments if you wish to, but in most cases, this is all that's necessary.
Note also the use of the headLink() placeholder. This is an
easy way to generate the HTML for <link> elements, as well as to keep
track of them throughout your application. If you need to add additional CSS
sheets to support a single action, you can do so, and be assured it will be
present in the final rendered page.
Checkpoint
Now go to http://localhost; and check out the source. You should see your xhtml header, head, title, and body sections.
Quickstart Navigation
- ZF & MVC Introduction
- Set Up the Project Structure
- Download & Install ZF
- Create a Rewrite Rule
- Create a Bootstrap File
- Create an Action Controller & View
- Create an Error Controller & View
- Create a Layout
- Create a Configuration and Registry
- Create a Model and Database Table
- Create a Form
- Congratulations
ZF Reference Guide - now in PDF!
The Zend Framework Reference Guide is now available in PDF format from Zend's
high-speed content distribution network. Registration is required.
Documentation Archives
If you're looking for an older version of our reference guide, you'll find it in our download archives.
