View Helpers
In your view scripts, often it is necessary to perform certain
complex functions over and over: e.g., formatting a date,
generating form elements, or displaying action links. You can
use helper classes to perform these behaviors for you.
A helper is simply a class. Let's say we want a helper named 'fooBar'.
By default, the class is prefixed with 'Zend_View_Helper_'
(you can specify a custom prefix when setting a helper path), and the
last segment of the class name is the helper name; this segment should
be TitleCapped; the full class name is then:
Zend_View_Helper_FooBar. This class should contain at the
minimum a single method, named after the helper, and camelCased:
fooBar().
Note: Watch the Case
Helper names are always camelCased, i.e., they never begin with an
uppercase character. The class name itself is MixedCased, but the
method that is actually executed is camelCased.
Note: Default Helper Path
The default helper path always points to the Zend Framework view
helpers, i.e., 'Zend/View/Helper/'. Even if you call
setHelperPath() to overwrite the existing paths, this
path will be set to ensure the default helpers work.
To use a helper in your view script, call it using
$this->helperName(). Behind the scenes,
Zend_View will load the
Zend_View_Helper_HelperName class, create an object
instance of it, and call its helperName() method. The
object instance is persistent within the Zend_View
instance, and is reused for all future calls to
$this->helperName().
Initial Helpers
Zend_View comes with an initial set of helper classes,
most of which relate to form element generation and perform
the appropriate output escaping automatically. In addition, there
are helpers for creating route-based URLs and HTML
lists, as well as declaring variables. The currently shipped helpers include:
-
declareVars(): Primarily for use when using
strictVars(), this helper can be used to declare
template variables that may or may not already be set in the
view object, as well as to set default values. Arrays passed as
arguments to the method will be used to set default values;
otherwise, if the variable does not exist, it is set to an empty string.
-
fieldset($name, $content, $attribs): Creates an
XHTML fieldset. If $attribs contains a
'legend' key, that value will be used for the fieldset legend. The
fieldset will surround the $content as provided to
the helper.
-
form($name, $attribs, $content): Generates an
XHTML form. All $attribs are escaped and
rendered as XHTML attributes of the form tag. If
$content is present and not a boolean
FALSE, then that content is rendered within the start and
close form tags; if $content is a boolean
FALSE (the default), only the opening form tag is
generated.
-
formButton($name, $value, $attribs): Creates an
<button /> element.
-
formCheckbox($name, $value, $attribs, $options):
Creates an <input type="checkbox" /> element.
By default, when no $value is provided and no $options are
present, '0' is assumed to be the unchecked value, and '1'
the checked value. If a $value is passed, but no $options
are present, the checked value is assumed to be the value
passed. The unchecked value is implemented by rendering a
hidden input element before rendering the checkbox.
$options should be an array. If the array is indexed, the
first value is the checked value, and the second the
unchecked value; all other values are ignored. You may also
pass an associative array with the keys 'checked' and
'unChecked'. The key 'disableHidden' can be set to true to
prevent rendering of the hidden field for the unchecked value.
If $options has been passed, if $value matches the checked
value, then the element will be marked as checked. You may
also mark the element as checked or unchecked by passing a
boolean value for the attribute 'checked'.
The above is probably best summed up with some examples:
// '1' and '0' as checked/unchecked options; not checked
'foo');
// '1' and '0' as checked/unchecked options; checked
'foo''checked'// 'bar' and '0' as checked/unchecked options; not checked
'foo', 'bar');
// 'bar' and '0' as checked/unchecked options; checked
'foo', 'bar''checked'// 'bar' and 'baz' as checked/unchecked options; unchecked
'foo''bar', 'baz'));
// 'bar' and 'baz' as checked/unchecked options; unchecked
'foo''checked' => 'bar',
'unChecked' => 'baz'
));
// 'bar' and 'baz' as checked/unchecked options; checked
'foo', 'bar''bar', 'baz''foo''checked''bar', 'baz'));
// 'bar' and 'baz' as checked/unchecked options; unchecked
'foo', 'baz''bar', 'baz''foo''checked''bar', 'baz'));
In all cases, the markup prepends a hidden element with the
unchecked value; this way, if the value is unchecked, you
will still get a valid value returned to your form.
-
formErrors($errors, $options): Generates an
XHTML unordered list to show errors.
$errors should be a string or an array of strings;
$options should be any attributes you want
placed in the opening list tag.
You can specify alternate opening, closing, and separator
content when rendering the errors by calling several methods
on the helper:
-
setElementStart($string); default is
'<ul class="errors"%s"><li>', where %s
is replaced with the attributes as specified in
$options.
-
setElementSeparator($string); default
is '</li><li>'.
-
setElementEnd($string); default is
'</li></ul>'.
-
formFile($name, $attribs): Creates an
<input type="file" /> element.
-
formHidden($name, $value, $attribs): Creates an
<input type="hidden" /> element.
-
formImage($name, $value, $attribs): Creates an
<input type="image" /> element.
span style="color: #ff0000;">'foo',
'bar''src' => 'images/button.png',
'alt' => 'Button',
)
);
// Output: <input type="image" name="foo" id="foo" src="images/button.png" value="bar" alt="Button" />
-
formLabel($name, $value, $attribs): Creates a
<label> element, setting the for attribute to
$name, and the actual label text to
$value. If disable is passed in
attribs, nothing will be returned.
-
formMultiCheckbox($name, $value, $attribs, $options,
$listsep): Creates a list of checkboxes.
$options should be an associative array, and may be
arbitrarily deep. $value may be a single value or
an array of selected values that match the keys in the
$options array. $listsep is an
HTML break ("<br />") by default. By default, this
element is treated as an array; all checkboxes share the same name, and are
submitted as an array.
// Using list separator ($listsep):
'<ul><li>''foo''class' => 'baz''One',
2 => 'Two',
3 => 'Three',
),
"</li>\n<li>"'</li></ul>';
/*
Output:
<ul>
<li>
<label for="foo-1">
<input type="checkbox" name="foo[]" id="foo-1" value="1" class="baz" />One
</label>
</li>
<li>
<label for="foo-2">
<input type="checkbox" name="foo[]" id="foo-2" value="2" checked="checked" class="baz" />Two
</label>
</li>
<li>
<label for="foo-3">
<input type="checkbox" name="foo[]" id="foo-3" value="3" class="baz" />Three</label>
</li>
</ul>
*/
// Using options for label elements:
'foo''label_placement' => 'prepend',
'label_class' => 'baz''One',
2 => 'Two',
3 => 'Three',
)
);
/*
Output:
<label class="baz" for="foo-1">
One<input type="checkbox" name="foo[]" id="foo-1" value="1" />
</label>
<br />
<label class="baz" for="foo-2">
Two<input type="checkbox" name="foo[]" id="foo-2" value="2" checked="checked" />
</label>
<br />
<label class="baz" for="foo-3">
Three<input type="checkbox" name="foo[]" id="foo-3" value="3" />
</label>
*/
-
formNote($name, $value = null): Creates a
simple text note. (e.g. as element for headlines in a
Zend_Form object)
span style="color: #ff0000;">'This is an example text.');
// Output: This is an example text.
-
formPassword($name, $value, $attribs): Creates an
<input type="password" /> element.
-
formRadio($name, $value, $attribs, $options, $listsep):
Creates a series of <input type="radio" /> elements, one
for each of the $options elements. In the $options array, the
element key is the radio value, and the element value is the
radio label. The $value radio will be preselected for you.
// Using list separator ($listsep)
'<ul><li>''foo''class' => 'baz''One',
2 => 'Two',
3 => 'Three',
),
"</li>\n<li>"'</li></ul>';
/*
Output:
<ul>
<li>
<label for="foo-1">
<input type="radio" name="foo" id="foo-1" value="1" class="baz" />One
</label>
</li>
<li>
<label for="foo-2">
<input type="radio" name="foo" id="foo-2" value="2" checked="checked" class="baz" />Two
</label>
</li>
<li>
<label for="foo-3">
<input type="radio" name="foo" id="foo-3" value="3" class="baz" />Three
</label>
</li>
</ul>
*/
// Using options for label elements:
'foo''label_placement' => 'prepend',
'label_class' => 'baz''One',
2 => 'Two',
3 => 'Three',
)
);
/*
Output:
<label class="baz" for="foo-1">
One<input type="radio" name="foo" id="foo-1" value="1" />
</label>
<br />
<label class="baz" for="foo-2">
Two<input type="radio" name="foo" id="foo-2" value="2" checked="checked" />
</label>
<br />
<label class="baz" for="foo-3">
Three<input type="radio" name="foo" id="foo-3" value="3" />
</label>
*/
-
formReset($name, $value, $attribs): Creates an
<input type="reset" /> element.
-
formSelect($name, $value, $attribs, $options):
Creates a <select>...</select> block, with one
<option>one for each of the $options elements. In the
$options array, the element key is the option value, and the
element value is the option label. The $value option(s) will be
preselected for you.
// Using option groups:
'foo''class' => 'baz''One',
'Two''2.1' => 'One',
'2.2' => 'Two',
'2.3' => 'Three',
),
3 => 'Three',
)
);
/*
Output:
<select name="foo" id="foo" class="baz">
<option value="1" label="One">One</option>
<optgroup id="foo-optgroup-Two" label="Two">
<option value="2.1" label="One">One</option>
<option value="2.2" label="Two">Two</option>
<option value="2.3" label="Three">Three</option>
</optgroup>
<option value="3" label="Three">Three</option>
</select>
*/
// First example with 'multiple' option:
'foo[]''One',
2 => 'Two',
3 => 'Three',
)
);
/*
Output:
<select name="foo[]" id="foo" multiple="multiple">
<option value="1" label="One">One</option>
<option value="2" label="Two" selected="selected">Two</option>
<option value="3" label="Three">Three</option>
</select>
*/
// Second example with 'multiple' option:
'foo''multiple''One',
2 => 'Two',
3 => 'Three',
)
);
/*
Output:
<select name="foo[]" id="foo" multiple="multiple">
<option value="1" label="One" selected="selected">One</option>
<option value="2" label="Two" selected="selected">Two</option>
<option value="3" label="Three">Three</option>
</select>
*/
-
formSubmit($name, $value, $attribs): Creates an
<input type="submit" /> element.
-
formText($name, $value, $attribs): Creates an
<input type="text" /> element.
-
formTextarea($name, $value, $attribs): Creates a
<textarea>...</textarea> block.
-
url($urlOptions, $name, $reset, $encode): Creates a
URL string based on a named route.
$urlOptions should be an associative array of key/value pairs
used by the particular route.
// Using without options: (current request is: user/id/1)
// Output: user/info/id/1
// Set URL options:
'controller' => 'user', 'action' => 'info', 'username' => 'foobar')
);
// Output: user/info/username/foobar
// Using a route:
$router->addRoute(
'user''user/:username''controller' => 'user',
'action' => 'info''name' => 'foobar'), 'user');
// Output: user/foobar
// Using reset: (current request is: user/id/1)
'controller' => 'user', 'action' => 'info'// Output: user/info/id/1
'controller' => 'user', 'action' => 'info'// Output: user/info
// Using encode:
'controller' => 'user', 'action' => 'info', 'username' => 'John Doe'// Output: user/info/username/John Doe
'controller' => 'user', 'action' => 'info', 'username' => 'John Doe'// Output: user/info/username/John+Doe
-
serverUrl($requestUri = null): Helper
for returning the current server URL (optionally with request URI).
// Current server URL in the example is: http://www.example.com/foo.html
// Output: http://www.example.com
// Output: http://www.example.com/foo.html
'/foo/bar');
// Output: http://www.example.com/foo/bar
// Output: www.example.com
// Output: http
$this->serverUrl()->setHost('www.foo.com');
$this->serverUrl()->setScheme('https'// Output: https://www.foo.com
-
htmlList($items, $ordered, $attribs, $escape):
generates unordered and ordered lists based on the $items
passed to it. If $items is a multidimensional
array, a nested list will be built. If the $escape
flag is TRUE (default), individual items will be escaped
using the view objects registered escaping mechanisms; pass a
FALSE value if you want to allow markup in your lists.
Using these in your view scripts is very easy, here is an example.
Note that you all you need to do is call them; they will load
and instantiate themselves as they are needed.
// inside your view script, $this refers to the Zend_View instance.
//
// say that you have already assigned a series of select options under
// the name $countries as array('us' => 'United States', 'il' =>
// 'Israel', 'de' => 'Germany').
"action.php" method= "post"'email', '[email protected]''size''country', 'us''opt_in', 'yes''yes', 'no'
The resulting output from the view script will look something like this:
span style="color: #ff0000;">"action.php" method= "post""text" name= "email" value= "[email protected]" size= "32""country">
<option value="us" selected="selected""il">Israel</option>
<option value="de">Germany</option>
</select>
</label></p>
<p><label>Would you like to opt in?
<input type="hidden" name="opt_in" value="no" />
<input type="checkbox" name="opt_in" value="yes" checked="checked"
Action View Helper
The Action view helper enables view scripts to dispatch a
given controller action; the result of the response object following the
dispatch is then returned. These can be used when a particular action
could generate re-usable content or "widget-ized" content.
Actions that result in a _forward() or redirect are
considered invalid, and will return an empty string.
The API for the Action view helper follows that of
most MVC components that invoke controller actions:
action($action, $controller, $module = null, array $params = array()).
$action and $controller are required; if no
module is specified, the default module is assumed.
Example #1 Basic Usage of Action View Helper
As an example, you may have a CommentController with a
listAction() method you wish to invoke in order to pull
a list of comments for the current request:
<div id="sidebar right""item"'list',
'comment''count'
BaseUrl Helper
While most URLs generated by the framework have the base
URL prepended automatically, developers will need to prepend the
base URL to their own URLs in order for paths
to resources to be correct.
Usage of the BaseUrl helper is very straightforward:
/*
* The following assume that the base URL of the page/application is "/mypage".
*/
/*
* Prints:
* <base href="/mypage/" />
*/"<?php echo $this->baseUrl(); ?>" />
/*
* Prints:
* <link rel="stylesheet" type="text/css" href="/mypage/css/base.css" />
*/"stylesheet" type="text/css"
href="<?php echo $this->baseUrl('css/base.css'); ?>" />
Note:
For simplicity's sake, we strip out the entry PHP file (e.g.,
"index.php") from the base URL that was
contained in Zend_Controller. However, in some situations
this may cause a problem. If one occurs, use
$this->getHelper('BaseUrl')->setBaseUrl() to set your
own BaseUrl.
Currency Helper
Displaying localized currency values is a common task; the
Zend_Currency view helper is intended to simply this task. See the
Zend_Currency documentation for specifics
on this localization feature. In this section, we will focus simply on usage of the view
helper.
There are several ways to initiate the Currency view helper:
-
Registered, through a previously registered instance in
Zend_Registry.
-
Afterwards, through the fluent interface.
-
Directly, through instantiating the class.
A registered instance of Zend_Currency is the preferred usage for
this helper. Doing so, you can select the currency to be used prior to adding the adapter to
the registry.
There are several ways to select the desired currency. First, you may simply provide a
currency string; alternately, you may specify a locale. The preferred way is to use a
locale as this information is automatically detected and selected via the
HTTP client headers provided when a user accesses your application, and
ensures the currency provided will match their locale.
Note:
We are speaking of "locales" instead of "languages" because a language may vary based on
the geographical region in which it is used. For example, English is spoken in different
dialects: British English, American English, etc. As a currency always correlates to a
country you must give a fully-qualified locale, which means providing both the language
and region. Therefore, we say "locale" instead of "language."
Example #2 Registered instance
To use a registered instance, simply create an instance of
Zend_Currency and register it within
Zend_Registry using Zend_Currency as its
key.
// our example currency
'de_AT''Zend_Currency', $currency);
// within your view
// this returns '€ 1.234,56'
If you are more familiar with the fluent interface, then you can also create an instance
within your view and configure the helper afterwards.
Example #3 Within the view
To use the fluent interface, create an instance of Zend_Currency,
call the helper without a parameter, and call the setCurrency()
method.
// within your view
'de_AT');
$this->currency()->setCurrency($currency)->currency(1234.56);
// this returns '€ 1.234,56'
If you are using the helper without Zend_View then you can
also use it directly.
// our example currency
'de_AT');
// initiate the helper
// this returns '€ 1.234,56'
As already seen, the currency() method is used to return the
currency string. Just call it with the value you want to display as a currency. It also
accepts some options which may be used to change the behaviour and output of the helper.
// our example currency
'de_AT');
// initiate the helper
// this returns '€ 1.234,56'
'precision' => 1));
// this returns '€ 1.234,6'
For details about the available options, search for Zend_Currency's
toCurrency() method.
Cycle Helper
The Cycle helper is used to alternate a set of values.
Example #6 Cycle Helper Basic Usage
To add elements to cycle just specify them in constructor
or use assign(array $data) function
span style="color: #ff0000;">"background-color:<?php echo $this->cycle(array("#F0F0F0",
"#FFFFFF"">
<td><?php echo $this->escape($book['author']) ?></td>
</tr>
<?php endforeach;?>
// Moving in backwards order and assign function
$this->cycle()->assign(array("#F0F0F0","#FFFFFF"));
<tr style="background-color:'#F0F0F0'">
<td>First</td>
</tr>
<tr style="background-color:'#FFFFFF'">
<td>Second</td>
</tr>
Example #7 Working with two or more cycles
To use two cycles you have to specify the names of cycles. Just set second parameter in
cycle method. $this->cycle(array("#F0F0F0","#FFFFFF"),'cycle2'). You
can also use setName($name) function.
span style="color: #ff0000;">"background-color:<?php echo $this->cycle(array("#F0F0F0",
"#FFFFFF"">
<td><?php echo $this->cycle(array(1,2,3),'number')->next()?></td>
<td><?php echo $this->escape($book['author'])?></td>
</tr>
<?php endforeach;?>
Partial Helper
The Partial view helper is used to render a specified
template within its own variable scope. The primary use is for reusable
template fragments with which you do not need to worry about variable
name clashes. Additionally, they allow you to specify partial view
scripts from specific modules.
A sibling to the Partial, the PartialLoop view
helper allows you to pass iterable data, and render a partial for each
item.
Note: PartialLoop Counter
The PartialLoop view helper assigns a variable to the view named
partialCounter which passes the current position of the array to
the view script. This provides an easy way to have alternating colors on table rows for
example.
Example #8 Basic Usage of Partials
Basic usage of partials is to render a template fragment in its own
view scope. Consider the following partial script:
span style="color: #808080; font-style: italic;">// partial.phtml ?>
You would then call it from your view script using the following:
span style="color: #ff0000;">'partial.phtml''from' => 'Team Framework',
'subject' => 'view partials'
<ul>
<li>From: Team Framework</li>
<li>Subject: view partials</li>
</ul>
Note: What is a model?
A model used with the Partial view helper can be
one of the following:
-
Array. If an array is passed, it
should be associative, as its key/value pairs are
assigned to the view with keys as view variables.
-
Object implementing toArray() method. If an object is
passed an has a toArray() method, the results of
toArray() will be assigned to the view
object as view variables.
-
Standard object. Any other object
will assign the results of
object_get_vars() (essentially all public
properties of the object) to the view object.
If your model is an object, you may want to have it passed
as an object to the partial script, instead
of serializing it to an array of variables. You can do this by
setting the 'objectKey' property of the appropriate helper:
// Tell partial to pass objects as 'model' variable
'model');
// Tell partial to pass objects from partialLoop as 'model' variable
// in final partial view script:
'model');
This technique is particularly useful when passing
Zend_Db_Table_Rowsets to
partialLoop(), as you then have full access to your
row objects within the view scripts, allowing you to call
methods on them (such as retrieving values from parent or
dependent rows).
Example #9 Using PartialLoop to Render Iterable Models
Typically, you'll want to use partials in a loop, to render the same
content fragment many times; this way you can put large blocks of
repeated content or complex display logic into a single location.
However this has a performance impact, as the partial helper needs
to be invoked once for each iteration.
The PartialLoop view helper helps solve this issue. It
allows you to pass an iterable item (array or object implementing
Iterator) as the model. It then iterates over this,
passing, the items to the partial script as the model. Items in the
iterator may be any model the Partial view helper
allows.
Let's assume the following partial view script:
span style="color: #808080; font-style: italic;">// partialLoop.phtml ?>
And the following "model":
span style="color: #ff0000;">'key' => 'Mammal', 'value' => 'Camel''key' => 'Bird', 'value' => 'Penguin''key' => 'Reptile', 'value' => 'Asp''key' => 'Fish', 'value' => 'Flounder'),
);
In your view script, you could then invoke the
PartialLoop helper:
span style="color: #ff0000;">'partialLoop.phtml'
<dl>
<dt>Mammal</dt>
<dd>Camel</dd>
<dt>Bird</dt>
<dd>Penguin</dd>
<dt>Reptile</dt>
<dd>Asp</dd>
<dt>Fish</dt>
<dd>Flounder</dd>
</dl>
Example #10 Rendering Partials in Other Modules
Sometime a partial will exist in a different module. If you know the
name of the module, you can pass it as the second argument to either
partial() or partialLoop(), moving the
$model argument to third position.
For instance, if there's a pager partial you wish to use that's in
the 'list' module, you could grab it as follows:
span style="color: #ff0000;">'pager.phtml', 'list'
In this way, you can re-use partials created specifically for other
modules. That said, it's likely a better practice to put re-usable
partials in shared view script paths.
Placeholder Helper
The Placeholder view helper is used to persist content
between view scripts and view instances. It also offers some useful
features such as aggregating content, capturing view script content
for later use, and adding pre- and post-text to content (and custom
separators for aggregated content).
Example #11 Basic Usage of Placeholders
Basic usage of placeholders is to persist view data. Each invocation
of the Placeholder helper expects a placeholder name;
the helper then returns a placeholder container object that you can
either manipulate or simply echo out.
span style="color: #ff0000;">'foo')->set("Some text for later"'foo');
// outputs "Some text for later"
Example #12 Using Placeholders to Aggregate Content
Aggregating content via placeholders can be useful at times as well.
For instance, your view script may have a variable array from which
you wish to retrieve messages to display later; a later view script
can then determine how those will be rendered.
The Placeholder view helper uses containers that extend
ArrayObject, providing a rich featureset for
manipulating arrays. In addition, it offers a variety of methods for
formatting the content stored in the container:
-
setPrefix($prefix) sets text with which to
prefix the content. Use getPrefix() at any time
to determine what the current setting is.
-
setPostfix($prefix) sets text with which to
append the content. Use getPostfix() at any time
to determine what the current setting is.
-
setSeparator($prefix) sets text with which to
separate aggregated content. Use getSeparator()
at any time to determine what the current setting is.
-
setIndent($prefix) can be used to set an
indentation value for content. If an integer is passed,
that number of spaces will be used; if a string is passed,
the string will be used. Use getIndent()
at any time to determine what the current setting is.
span style="color: #ff0000;">'foo'
span style="color: #ff0000;">'foo')->setPrefix("<ul>\n <li>")
->setSeparator("</li><li>\n""</li></ul>\n"'foo');
// outputs as unordered list with pretty indentation
Because the Placeholder container objects extend
ArrayObject, you can also assign content to a specific
key in the container easily, instead of simply pushing it into the
container. Keys may be accessed either as object properties or as
array keys.
span style="color: #ff0000;">'foo''foo''foo''bar'
Example #13 Using Placeholders to Capture Content
Occasionally you may have content for a placeholder in a view script
that is easiest to template; the Placeholder view
helper allows you to capture arbitrary content for later rendering
using the following API.
-
captureStart($type, $key) begins capturing
content.
$type should be one of the
Placeholder constants APPEND or
SET. If APPEND, captured content
is appended to the list of current content in the
placeholder; if SET, captured content is used
as the sole value of the placeholder (potentially replacing
any previous content). By default, $type is
APPEND.
$key can be used to specify a specific key in
the placeholder container to which you want content
captured.
captureStart() locks capturing until
captureEnd() is called; you cannot nest
capturing with the same placeholder container. Doing so will
raise an exception.
-
captureEnd() stops capturing content, and
places it in the container object according to how
captureStart() was called.
span style="color: #ff0000;">'foo'"foo"'foo''foo'
span style="color: #ff0000;">'foo')->captureStart('SET', 'data'"foo"'foo''foo'
Concrete Placeholder Implementations
Zend Framework ships with a number of "concrete" placeholder
implementations. These are for commonly used placeholders: doctype,
page title, and various <head> elements. In all cases, calling
the placeholder with no arguments returns the element itself.
Documentation for each element is covered separately, as linked
below:
Doctype Helper
Valid HTML and XHTML documents should include a
DOCTYPE declaration. Besides being difficult to remember, these can
also affect how certain elements in your document should be rendered (for instance,
CDATA escaping in <script> and
<style> elements.
The Doctype helper allows you to specify one of the
following types:
XHTML11
XHTML1_STRICT
XHTML1_TRANSITIONAL
XHTML1_FRAMESET
XHTML1_RDFA
XHTML_BASIC1
HTML4_STRICT
HTML4_LOOSE
HTML4_FRAMESET
HTML5
You can also specify a custom doctype as long as it is well-formed.
The Doctype helper is a concrete implementation of the
Placeholder helper.
Example #14 Doctype Helper Basic Usage
You may specify the doctype at any time. However, helpers that
depend on the doctype for their output will recognize it only after
you have set it, so the easiest approach is to specify it in your
bootstrap:
span style="color: #ff0000;">'XHTML1_STRICT');
And then print it out on top of your layout script:
Example #15 Retrieving the Doctype
If you need to know the doctype, you can do so by calling
getDoctype() on the object, which is returned by
invoking the helper.
Typically, you'll simply want to know if the doctype is XHTML or
not; for this, the isXhtml() method will suffice:
span style="color: #808080; font-style: italic;">// do something differently
}
You can also check if the doctype represents an HTML5 document.
span style="color: #808080; font-style: italic;">// do something differently
}
Example #16 Choosing a Doctype to Use with the Open Graph Protocol
To implement the »
Open Graph Protocol, you may specify the XHTML1_RDFA doctype.
This doctype allows a developer to use the »
Resource Description Framework within an XHTML document.
span style="color: #ff0000;">'XHTML1_RDFA');
The RDFa doctype allows XHTML to validate when the 'property'
meta tag attribute is used per the Open Graph Protocol spec. Example
within a view script:
<?php echo $this->doctype('XHTML1_RDFA'); ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:og="http://opengraphprotocol.org/schema/">
<head>
<meta property="og:type" content="musician" />
In the previous example, we set the property to og:type. The og references
the Open Graph namespace we specified in the html tag.
The content identifies the page as being about a musician. See
the » Open Graph Protocol documentation
for supported properties. The HeadMeta helper
may be used to programmatically set these Open Graph Protocol meta tags.
Here is how you check if the doctype is set to XHTML1_RDFA:
span style="color: #ff0000;">"http://www.w3.org/1999/xhtml""http://opengraphprotocol.org/schema/"
xmlns:fb="http://www.facebook.com/2008/fbml"
Gravatar View Helper
The Gravatar view helper is used to received avatars from Gravatar's
service.
Example #17 Basic Usage of Gravatar View Helper
// From a view script (using XHTML DOCTYPE):
/* results in the following output:
<img src="http://www.gravatar.com/avatar/23463b99b62a72f26ed677cc556c44e8?s=80&d=mm&r=g" />
*/
Note:
Of course we can configure this helper. We can change height of image (by default it is
80px), and add CSS class or other attributes to image tag. The above
simply shows the most basic usage.
WarningUse a valid email address!
The email address you provide the helper should be valid. This class does not validate
the address (only the rating parameter). It is recommended to validate your email
address within your model layer.
Example #18 Advanced Usage of Gravatar View Helper
There are several ways to configure the returned gravatar. In most cases, you may either
pass an array of options as a second argument to the helper, or call methods on the
returned object in order to configure it.
-
The img_size option can be used to specify an alternate
height; alternately, call setImgSize().
-
The secure option can be used to force usage of SSL in
the returned image URI by passing a boolean true value (or
disabling SSL usage by passing false). Alternately, call
the setSecure() method. (By default, the setting
follows the same security as the current page request.)
-
To add attributes to the image, pass an array of key/value pairs as the
third argument to the helper, or call the
setAttribs() method.
// Within the view script (using HTML DOCTYPE)
'[email protected]''imgSize' => 90, 'defaultImg' => 'monsterid', 'secure''class' => 'avatar', 'title' => 'Title for this image')
);
// Or use mutator methods
/* Both generate the following output:
<img class="avatar" title="Title for this image"
src="https://secure.gravatar.com/avatar/23463b99b62a72f26ed677cc556c44e8?s=90&d=monsterid&r=g" >
*/
Options
Zend_Service_Gravatar Options
-
- img_size
-
An integer describing the height of the avatar, in pixels; defaults to "80".
-
- default_img
-
Image to return if the gravatar service is unable to match the email address
provided. Defaults to "mm", the "mystery man" image.
-
- rating
-
Audience rating to confine returned images to. Defaults to "g"; may be one
of "g", "pg", "r", or "x", in order of least offensive to most offensive.
-
- secure
-
Whether or not to load the image via an SSL connection. Defaults to the what
is detected from the current request.
HeadLink Helper
The HTML <link> element is increasingly used
for linking a variety of resources for your site: stylesheets, feeds,
favicons, trackbacks, and more. The HeadLink helper
provides a simple interface for creating and aggregating these elements
for later retrieval and output in your layout script.
The HeadLink helper has special methods for adding
stylesheet links to its stack:
-
appendStylesheet($href, $media, $conditionalStylesheet, $extras)
-
offsetSetStylesheet($index, $href, $media, $conditionalStylesheet,
$extras)
-
prependStylesheet($href, $media, $conditionalStylesheet, $extras)
-
setStylesheet($href, $media, $conditionalStylesheet, $extras)
The $media value defaults to 'screen', but may be any valid
media value. $conditionalStylesheet is a string or boolean
FALSE, and will be used at rendering time to determine if special
comments should be included to prevent loading of the stylesheet on certain platforms.
$extras is an array of any extra values that you want to be added
to the tag.
Additionally, the HeadLink helper has special methods for
adding 'alternate' links to its stack:
-
appendAlternate($href, $type, $title, $extras)
-
offsetSetAlternate($index, $href, $type, $title, $extras)
-
prependAlternate($href, $type, $title, $extras)
-
setAlternate($href, $type, $title, $extras)
The headLink() helper method allows specifying all
attributes necessary for a <link> element, and allows
you to also specify placement -- whether the new element replaces all
others, prepends (top of stack), or appends (end of stack).
The HeadLink helper is a concrete implementation of the
Placeholder
helper.
Example #19 HeadLink Helper Basic Usage
You may specify a headLink at any time. Typically, you
will specify global links in your layout script, and application
specific links in your application view scripts. In your layout
script, in the <head> section, you will then echo the helper
to output it.
span style="color: #808080; font-style: italic;">// setting links in a view script:
'/styles/basic.css''rel' => 'icon',
'href' => '/img/favicon.ico'),
'PREPEND''/styles/moz.css',
'screen''id' => 'my_stylesheet'// rendering the links: ?>
HeadMeta Helper
The HTML <meta> element is used to provide
meta information about your HTML document -- typically keywords, document
character set, caching pragmas, etc. Meta tags may be either of the
'http-equiv' or 'name' types, must contain a 'content' attribute, and
can also have either of the 'lang' or 'scheme' modifier attributes.
The HeadMeta helper supports the following methods for
setting and adding meta tags:
-
appendName($keyValue, $content, $conditionalName)
-
offsetSetName($index, $keyValue, $content, $conditionalName)
-
prependName($keyValue, $content, $conditionalName)
-
setName($keyValue, $content, $modifiers)
-
appendHttpEquiv($keyValue, $content, $conditionalHttpEquiv)
-
offsetSetHttpEquiv($index, $keyValue, $content,
$conditionalHttpEquiv)
-
prependHttpEquiv($keyValue, $content, $conditionalHttpEquiv)
-
setHttpEquiv($keyValue, $content, $modifiers)
-
setCharset($charset)
The following methods are also supported with XHTML1_RDFA doctype
set with the Doctype helper:
-
appendProperty($property, $content, $modifiers)
-
offsetSetProperty($index, $property, $content, $modifiers)
-
prependProperty($property, $content, $modifiers)
-
setProperty($property, $content, $modifiers)
The $keyValue item is used to define a value for the 'name'
or 'http-equiv' key; $content is the value for the
'content' key, and $modifiers is an optional associative
array that can contain keys for 'lang' and/or 'scheme'.
You may also set meta tags using the headMeta() helper
method, which has the following signature: headMeta($content,
$keyValue, $keyType = 'name', $modifiers = array(), $placement =
'APPEND'). $keyValue is the content for the key
specified in $keyType, which should be either 'name' or
'http-equiv'. $keyType may also be specified as 'property' if the
doctype has been set to XHTML1_RDFA. $placement can be 'SET' (overwrites
all previously stored values), 'APPEND' (added to end of stack), or
'PREPEND' (added to top of stack).
HeadMeta overrides each of append(),
offsetSet(), prepend(), and
set() to enforce usage of the special methods as listed above.
Internally, it stores each item as a stdClass token, which it later
serializes using the itemToString() method. This allows you
to perform checks on the items in the stack, and optionally modify these
items by simply modifying the object returned.
The HeadMeta helper is a concrete implementation of the
Placeholder helper.
Example #20 HeadMeta Helper Basic Usage
You may specify a new meta tag at any time. Typically, you
will specify client-side caching rules or SEO keywords.
For instance, if you wish to specify SEO keywords, you'd be creating
a meta name tag with the name 'keywords' and the content the
keywords you wish to associate with your page:
// setting meta keywords
'keywords', 'framework, PHP, productivity');
If you wished to set some client-side caching rules, you'd set
http-equiv tags with the rules you wish to enforce:
// disabling client-side cache
'expires',
'Wed, 26 Feb 1997 08:21:57 GMT''pragma', 'no-cache''Cache-Control', 'no-cache');
Another popular use for meta tags is setting the content type,
character set, and language:
// setting content type and character set
'Content-Type',
'text/html; charset=UTF-8''Content-Language', 'en-US');
If you are serving an HTML5 document, you should provide the
character set like this:
// setting character set in HTML5
$this->headMeta()->setCharset('UTF-8'); // Will look like <meta charset="UTF-8">
As a final example, an easy way to display a transitional message
before a redirect is using a "meta refresh":
// setting a meta refresh for 3 seconds to a new url:
'Refresh',
'3;URL=http://www.some.org/some.html');
When you're ready to place your meta tags in the layout, simply echo the helper:
Example #21 HeadMeta Usage with XHTML1_RDFA doctype
Enabling the RDFa doctype with the Doctype helper
enables the use of the 'property' attribute (in addition to the standard 'name' and 'http-equiv') with HeadMeta.
This is commonly used with the Facebook » Open Graph Protocol.
For instance, you may specify an open graph page title and type as follows:
span style="color: #ff0000;">'og:title', 'my article title');
$this->headMeta()->setProperty('og:type', 'article'// output is:
// <meta property="og:title" content="my article title" />
// <meta property="og:type" content="article" />
HeadScript Helper
The HTML <script> element is used to either
provide inline client-side scripting elements or link to a remote resource
containing client-side scripting code. The HeadScript
helper allows you to manage both.
The HeadScript helper supports the following methods for
setting and adding scripts:
-
appendFile($src, $type = 'text/javascript', $attrs = array())
-
offsetSetFile($index, $src, $type = 'text/javascript', $attrs =
array())
-
prependFile($src, $type = 'text/javascript', $attrs = array())
-
setFile($src, $type = 'text/javascript', $attrs = array())
-
appendScript($script, $type = 'text/javascript', $attrs =
array())
-
offsetSetScript($index, $script, $type = 'text/javascript', $attrs =
array())
-
prependScript($script, $type = 'text/javascript', $attrs =
array())
-
setScript($script, $type = 'text/javascript', $attrs = array())
In the case of the * File() methods, $src is
the remote location of the script to load; this is usually in the form
of a URL or a path. For the * Script() methods,
$script is the client-side scripting directives you wish to
use in the element.
Note: Setting Conditional Comments
HeadScript allows you to wrap the script tag in conditional
comments, which allows you to hide it from specific browsers. To add the conditional
tags, pass the conditional value as part of the $attrs parameter in
the method calls.
Example #22 Headscript With Conditional Comments
// adding scripts
'/js/prototype.js',
'text/javascript''conditional' => 'lt IE 7')
);
Note: Preventing HTML style comments or CDATA wrapping of scripts
By default HeadScript will wrap scripts with HTML
comments or it wraps scripts with XHTML cdata. This behavior can be
problematic when you intend to use the script tag in an alternative way by
setting the type to something other then 'text/javascript'. To prevent such
escaping, pass an noescape with a value of true as part of
the $attrs parameter in the method calls.
Example #23 Create an jQuery template with the headScript
// jquery template
$template = '<div class="book">{{:title}}</div>''text/x-jquery-tmpl''id='tmpl-book', 'noescape' => true)
);
HeadScript also allows capturing scripts; this can be
useful if you want to create the client-side script programmatically,
and then place it elsewhere. The usage for this will be showed in an
example below.
Finally, you can also use the headScript() method to
quickly add script elements; the signature for this is
headScript($mode = 'FILE', $spec, $placement = 'APPEND').
The $mode is either 'FILE' or 'SCRIPT', depending on if
you're linking a script or defining one. $spec is either
the script file to link or the script source itself.
$placement should be either 'APPEND', 'PREPEND', or 'SET'.
HeadScript overrides each of append(),
offsetSet(), prepend(), and
set() to enforce usage of the special methods as listed above.
Internally, it stores each item as a stdClass token, which it later
serializes using the itemToString() method. This allows you
to perform checks on the items in the stack, and optionally modify these
items by simply modifying the object returned.
The HeadScript helper is a concrete implementation of the
Placeholder helper.
Note: Use InlineScript for HTML Body Scripts
HeadScript's sibling helper, InlineScript,
should be used when you wish to include scripts inline in the HTML
body. Placing scripts at the end of your document is a
good practice for speeding up delivery of your page, particularly
when using 3rd party analytics scripts.
Note: Arbitrary Attributes are Disabled by Default
By default, HeadScript only will render
<script> attributes that are blessed by the W3C.
These include 'type', 'charset', 'defer', 'language', and 'src'.
However, some javascript frameworks, notably » Dojo, utilize custom
attributes in order to modify behavior. To allow such attributes,
you can enable them via the
setAllowArbitraryAttributes() method:
Example #24 HeadScript Helper Basic Usage
You may specify a new script tag at any time. As noted above, these
may be links to outside resource files or scripts themselves.
// adding scripts
'/js/prototype.js'
Order is often important with client-side scripting; you may need to
ensure that libraries are loaded in a specific order due to
dependencies each have; use the various append, prepend, and
offsetSet directives to aid in this task:
// Putting scripts in order
// place at a particular offset to ensure loaded last
'/js/myfuncs.js');
// use scriptaculous effects (append uses next index, 101)
'/js/scriptaculous.js');
// but always have base prototype script load first:
'/js/prototype.js');
When you're finally ready to output all scripts in your layout
script, simply echo the helper:
Example #25 Capturing Scripts Using the HeadScript Helper
Sometimes you need to generate client-side scripts programmatically.
While you could use string concatenation, heredocs, and the like,
often it's easier just to do so by creating the script and
sprinkling in PHP tags. HeadScript lets you do
just that, capturing it to the stack:
span style="color: #ff0000;">'<?php echo $this->baseUrl ?>';
$('foo_form'
The following assumptions are made:
-
The script will be appended to the stack. If you wish for it
to replace the stack or be added to the top, you will need
to pass 'SET' or 'PREPEND', respectively, as the first
argument to captureStart().
-
The script MIME type is assumed to be 'text/javascript'; if
you wish to specify a different type, you will need to pass it
as the second argument to captureStart().
-
If you wish to specify any additional attributes for the
<script> tag, pass them in an array as
the third argument to captureStart().
HeadStyle Helper
The HTML <style> element is used to include
CSS stylesheets inline in the HTML
<head> element.
Note: Use HeadLink to link CSS files
HeadLink
should be used to create <link> elements for
including external stylesheets. HeadStyle is used when
you wish to define your stylesheets inline.
The HeadStyle helper supports the following methods for
setting and adding stylesheet declarations:
-
appendStyle($content, $attributes = array())
-
offsetSetStyle($index, $content, $attributes = array())
-
prependStyle($content, $attributes = array())
-
setStyle($content, $attributes = array())
In all cases, $content is the actual CSS declarations.
$attributes are any additional attributes you wish to provide to the
style tag: lang, title, media, or dir are all permissible.
Note: Setting Conditional Comments
HeadStyle allows you to wrap the style tag in conditional
comments, which allows you to hide it from specific browsers. To add the conditional
tags, pass the conditional value as part of the $attributes parameter
in the method calls.
Example #26 Headstyle With Conditional Comments
// adding scripts
'conditional' => 'lt IE 7'));
HeadStyle also allows capturing style declarations; this
can be useful if you want to create the declarations programmatically,
and then place them elsewhere. The usage for this will be showed in an
example below.
Finally, you can also use the headStyle() method to
quickly add declarations elements; the signature for this is
headStyle($content$placement = 'APPEND', $attributes = array()).
$placement should be either 'APPEND', 'PREPEND', or 'SET'.
HeadStyle overrides each of append(),
offsetSet(), prepend(), and
set() to enforce usage of the special methods as listed above.
Internally, it stores each item as a stdClass token, which it later
serializes using the itemToString() method. This allows you
to perform checks on the items in the stack, and optionally modify these
items by simply modifying the object returned.
The HeadStyle helper is a concrete implementation of the
Placeholder
helper.
Note: UTF-8 encoding used by default
By default, Zend Framework uses UTF-8 as its default encoding, and,
specific to this case, Zend_View does as well. Character encoding
can be set differently on the view object itself using the
setEncoding() method (or the encoding
instantiation parameter). However, since Zend_View_Interface does
not define accessors for encoding, it's possible that if you are using a custom view
implementation with this view helper, you will not have a
getEncoding() method, which is what the view helper uses
internally for determining the character set in which to encode.
If you do not want to utilize UTF-8 in such a situation, you will
need to implement a getEncoding() method in your custom view
implementation.
Example #27 HeadStyle Helper Basic Usage
You may specify a new style tag at any time:
Order is very important with CSS; you may need to ensure that
declarations are loaded in a specific order due to the order of the
cascade; use the various append, prepend, and offsetSet directives
to aid in this task:
// Putting styles in order
// place at a particular offset:
$this->headStyle()->offsetSetStyle(100, $customStyles);
// place at end:
// place at beginning
When you're finally ready to output all style declarations in your
layout script, simply echo the helper:
Example #28 Capturing Style Declarations Using the HeadStyle Helper
Sometimes you need to generate CSS style declarations
programmatically. While you could use string concatenation,
heredocs, and the like, often it's easier just to do so by creating
the styles and sprinkling in PHP tags.
HeadStyle lets you do just that, capturing it to the stack:
The following assumptions are made:
-
The style declarations will be appended to the stack. If you
wish for them to replace the stack or be added to the top,
you will need to pass 'SET' or 'PREPEND', respectively, as
the first argument to captureStart().
-
If you wish to specify any additional attributes for the
<style> tag, pass them in an array as
the second argument to captureStart().
HeadTitle Helper
The HTML <title> element is used to provide a
title for an HTML document. The HeadTitle helper
allows you to programmatically create and store the title for later retrieval and output.
The HeadTitle helper is a concrete implementation of the
Placeholder
helper. It overrides the toString() method to
enforce generating a <title> element, and adds a
headTitle() method for quick and easy setting and
aggregation of title elements. The signature for that method is
headTitle($title, $setType = null); by default, the
value is appended to the stack (aggregating title segments) if left at null, but you may
also specify either 'PREPEND' (place at top of stack) or 'SET'
(overwrite stack).
Since setting the aggregating (attach) order on each call to
headTitle can be cumbersome, you can set a default attach order
by calling setDefaultAttachOrder() which is applied
to all headTitle() calls unless you explicitly
pass a different attach order as the second parameter.
Example #29 HeadTitle Helper Basic Usage
You may specify a title tag at any time. A typical usage would have
you setting title segments for each level of depth in your
application: site, controller, action, and potentially resource.
// setting the controller and action name as title segments:
// setting the site in the title; possibly in the layout script:
$this->headTitle('Zend Framework');
// setting a separator string for segments:
$this->headTitle()->setSeparator(' / ');
When you're finally ready to render the title in your layout
script, simply echo the helper:
HTML Object Helpers
The HTML
<object> element is used for embedding
media like Flash or QuickTime in web pages. The object view helpers take
care of embedding media with minimum effort.
There are four initial Object helpers:
-
htmlFlash()
Generates markup for embedding Flash files.
-
htmlObject()
Generates markup for embedding a custom Object.
-
htmlPage()
Generates markup for embedding other (X)HTML pages.
-
htmlQuicktime()
Generates markup for embedding QuickTime files.
All of these helpers share a similar interface. For this reason, this
documentation will only contain examples of two of these helpers.
Embedding Flash in your page using the helper is pretty straight-forward.
The only required argument is the resource URI.
span style="color: #ff0000;">'/path/to/flash.swf'
This outputs the following HTML:
<object data="/path/to/flash.swf"
type="application/x-shockwave-flash"
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
</object>
Additionally you can specify attributes, parameters and content that can
be rendered along with the
<object>. This will
be demonstrated using the htmlObject() helper.
Example #31 Customizing the object by passing additional arguments
The first argument in the object helpers is always required. It is
the URI to the resource you want to embed. The second argument is
only required in the htmlObject() helper. The other helpers
already contain the correct value for this argument. The third
argument is used for passing along attributes to the object element.
It only accepts an array with key-value pairs. classid
and codebase are examples of such attributes. The fourth
argument also only takes a key-value array and uses them to create
<param> elements. You will see an example
of this shortly. Lastly, there is the option of providing additional
content to the object. Now for an example which utilizes all arguments.
span style="color: #ff0000;">'/path/to/file.ext',
'mime/type''attr1' => 'aval1',
'attr2' => 'aval2''param1' => 'pval1',
'param2' => 'pval2'
),
'some content'
);
/*
This would output:
<object data="/path/to/file.ext" type="mime/type"
attr1="aval1" attr2="aval2">
<param name="param1" value="pval1" />
<param name="param2" value="pval2" />
some content
</object>
*/
InlineScript Helper
The HTML <script> element is used to either
provide inline client-side scripting elements or link to a remote resource
containing client-side scripting code. The InlineScript
helper allows you to manage both. It is derived from HeadScript,
and any method of that helper is available; however, use the
inlineScript() method in place of
headScript().
Note: Use InlineScript for HTML Body Scripts
InlineScript, should be used when you wish to include
scripts inline in the HTML body. Placing scripts
at the end of your document is a good practice for speeding up delivery of
your page, particularly when using 3rd party analytics scripts.
Some JS libraries need to be included in the HTML
head; use HeadScript for those scripts.
RenderToPlaceholder Helper
Renders a template (view script) and stores the rendered output as a
placeholder variable for later use.
Note:
The helper uses the Placeholder helper
and his Capture methods.
Example #32 Basic Usage of RenderToPlaceholder
span style="color: #808080; font-style: italic;">// View script (backlink.phtml):
'<p class="older"><a href="%s">Older posts</a></p>''controller' => 'index', 'action' => 'index'// Usage:
'backlink.phtml', 'link''link');
// Output: <p class="older"><a href="index/index">Older posts</a></p>
JSON Helper
When creating views that return JSON, it's important to also set the
appropriate response header. The JSON view helper does exactly that. In
addition, by default, it disables layouts (if currently enabled), as
layouts generally aren't used with JSON responses.
The JSON helper sets the following header:
Content-Type: application/json
Most AJAX libraries look for this header when parsing responses to
determine how to handle the content.
Usage of the JSON helper is very straightforward:
Note: Keeping layouts and enabling encoding using Zend_Json_Expr
Each method in the JSON helper accepts a second, optional argument.
This second argument can be a boolean flag to enable or disable
layouts, or an array of options that will be passed to
Zend_Json::encode() and used internally to encode data.
To keep layouts, the second parameter needs to be boolean
TRUE. When the second parameter is an array, keeping
layouts can be achieved by including a keepLayouts key
with a value of a boolean TRUE.
// Boolean true as second argument enables layouts:
// Or boolean true as "keepLayouts" key:
'keepLayouts'
Zend_Json::encode allows the encoding of native
JSON expressions using Zend_Json_Expr objects.
This option is disabled by default. To enable this option, pass a boolean
TRUE to the enableJsonExprFinder key of
the options array:
span style="color: #ff0000;">'enableJsonExprFinder''keepLayouts'
Note: Sending pre-encoded JSON
By default, the JSON helper will JSON-encode the
data provided to the helper's first parameter. If you wish to pass
in data which has already been encoded into JSON,
the third parameter needs to be set to boolean FALSE.
When the second parameter is an array, disabling JSON
encoding can be achived by including a encodeData
key with the value of boolean FALSE:
// Boolean false as third argument disables internal JSON encoding of data
// Or boolean false as "encodeData" key:
'encodeData'
Navigation Helpers
The navigation helpers are used for rendering navigational elements
from Zend_Navigation_Container
instances.
There are 5 built-in helpers:
-
Breadcrumbs,
used for rendering the path to the currently active page.
-
Links,
used for rendering navigational head links (e.g.
<link rel="next" href="..." />)
-
Menu,
used for rendering menus.
-
Sitemap,
used for rendering sitemaps conforming to the » Sitemaps XML
format.
-
Navigation,
used for proxying calls to other navigational helpers.
All built-in helpers extend
Zend_View_Helper_Navigation_HelperAbstract, which
adds integration with ACL and
translation. The abstract class
implements the interface
Zend_View_Helper_Navigation_Helper, which
defines the following methods:
-
getContainer() and setContainer()
gets and sets the navigation container the helper should operate on by default, and
hasContainer() checks if the helper
has container registered.
-
getTranslator() and
setTranslator() gets and sets the
translator used for translating labels and titles.
getUseTranslator() and
setUseTranslator() controls whether
the translator should be enabled. The method
hasTranslator() checks if the helper has
a translator registered.
-
getAcl(), setAcl(),
getRole() and setRole(),
gets and sets ACL (Zend_Acl) instance and
role ( String or
Zend_Acl_Role_Interface) used for
filtering out pages when rendering. getUseAcl() and
setUseAcl() controls whether ACL should
be enabled. The methods hasAcl() and
hasRole() checks if the helper has an
ACL instance or a role registered.
-
__toString(), magic method to ensure that
helpers can be rendered by echoing the helper instance directly.
-
render(), must be implemented by concrete
helpers to do the actual rendering.
In addition to the method stubs from the interface, the abstract
class also implements the following methods:
-
getIndent() and setIndent()
gets and sets indentation. The setter accepts a String or an
Integer . In the case of an Integer , the helper will use
the given number of spaces for indentation. I.e.,
setIndent(4) means 4 initial spaces of
indentation. Indentation can be specified for all helpers
except the Sitemap helper.
-
getMinDepth() and setMinDepth()
gets and sets the minimum depth a page must have to be included by the helper.
Setting NULL means no minimum depth.
-
getMaxDepth() and setMaxDepth()
gets and sets the maximum depth a page can have to be included by the helper.
Setting NULL means no maximum depth.
-
getRenderInvisible() and
setRenderInvisible() gets and sets whether to
render items that have been marked as invisible or not.
-
__call() is used for proxying calls to the
container registered in the helper, which means you can
call methods on a helper as if it was a container. See example
below.
-
findActive($container, $minDepth, $maxDepth)
is used for finding the deepest active page in the given
container. If depths are not given, the method will use
the values retrieved from getMinDepth() and
getMaxDepth(). The deepest active page must
be between $minDepth and $maxDepth
inclusively. Returns an array containing a reference to the
found page instance and the depth at which the page was
found.
-
htmlify() renders an 'a'
HTML element from a Zend_Navigation_Page
instance.
-
accept() is used for determining if a page
should be accepted when iterating containers. This method
checks for page visibility and verifies that the helper's
role is allowed access to the page's resource and privilege.
-
The static method setDefaultAcl() is used for setting
a default ACL object that will be used by helpers.
-
The static method setDefaultRole() is used for setting
a default ACL that will be used by helpers
If a navigation container is not explicitly set in a helper using
$helper->setContainer($nav), the helper will look
for a container instance with the key Zend_Navigation in
the registry.
If a container is not explicitly set or found in the registry, the
helper will create an empty Zend_Navigation
container when calling $helper->getContainer().
Example #33 Proxying calls to the navigation container
Navigation view helpers use the magic method __call()
to proxy method calls to the navigation container that is
registered in the view helper.
span style="color: #ff0000;">'type' => 'uri',
'label' => 'New page'));
The call above will add a page to the container in the
Navigation helper.
Translation of labels and titles
The navigation helpers support translation of page labels and titles.
You can set a translator of type Zend_Translate
or Zend_Translate_Adapter in the helper using
$helper->setTranslator($translator), or like with other
I18n-enabled components; by adding the translator to
the registry by using the key
Zend_Translate.
If you want to disable translation, use
$helper->setUseTranslator(false).
The
proxy
helper will inject its own translator to the helper it
proxies to if the proxied helper doesn't already have a translator.
Note:
There is no translation in the sitemap helper, since there
are no page labels or titles involved in an XML sitemap.
Integration with ACL
All navigational view helpers support ACL inherently from the
class Zend_View_Helper_Navigation_HelperAbstract.
A Zend_Acl object can be assigned to
a helper instance with $helper->setAcl($acl) , and role
with $helper->setRole('member') or
$helper->setRole(new Zend_Acl_Role('member')) . If ACL
is used in the helper, the role in the helper must be allowed by
the ACL to access a page's resource and/or have the
page's privilege for the page to be included when
rendering.
If a page is not accepted by ACL, any descendant page will also
be excluded from rendering.
The
proxy
helper will inject its own ACL and role to the helper it
proxies to if the proxied helper doesn't already have any.
The examples below all show how ACL affects rendering.
Navigation setup used in examples
This example shows the setup of a navigation container for a
fictional software company.
Notes on the setup:
-
The domain for the site is www.example.com .
-
Interesting page properties are marked with a comment.
-
Unless otherwise is stated in other examples, the user
is requesting the URL
http://www.example.com/products/server/faq/ ,
which translates to the page labeled FAQ
under Foo Server .
-
The assumed ACL and router setup is shown below the
container setup.
/*
* Navigation container (config/array)
* Each element in the array will be passed to
* Zend_Navigation_Page::factory() when constructing
* the navigation container below.
*/'label' => 'Home',
'title' => 'Go Home',
'module' => 'default',
'controller' => 'index',
'action' => 'index',
'order' => -100 // make sure home is the first page
'label' => 'Special offer this week only!',
'module' => 'store',
'controller' => 'offer',
'action' => 'amazing',
'visible'// not visible
'label' => 'Products',
'module' => 'products',
'controller' => 'index',
'action' => 'index',
'pages''label' => 'Foo Server',
'module' => 'products',
'controller' => 'server',
'action' => 'index',
'pages''label' => 'FAQ',
'module' => 'products',
'controller' => 'server',
'action' => 'faq',
'rel''canonical' => 'http://www.example.com/?page=faq',
'alternate''module' => 'products',
'controller' => 'server',
'action' => 'faq',
'params''format' => 'xml''label' => 'Editions',
'module' => 'products',
'controller' => 'server',
'action' => 'editions''label' => 'System Requirements',
'module' => 'products',
'controller' => 'server',
'action' => 'requirements''label' => 'Foo Studio',
'module' => 'products',
'controller' => 'studio',
'action' => 'index',
'pages''label' => 'Customer Stories',
'module' => 'products',
'controller' => 'studio',
'action' => 'customers''label' => 'Support',
'module' => 'prodcts',
'controller' => 'studio',
'action' => 'support''label' => 'Company',
'title' => 'About us',
'module' => 'company',
'controller' => 'about',
'action' => 'index',
'pages''label' => 'Investor Relations',
'module' => 'company',
'controller' => 'about',
'action' => 'investors''label' => 'News',
'class' => 'rss', // class
'module' => 'company',
'controller' => 'news',
'action' => 'index',
'pages''label' => 'Press Releases',
'module' => 'company',
'controller' => 'news',
'action' => 'press''label' => 'Archive',
'route' => 'archive', // route
'module' => 'company',
'controller' => 'news',
'action' => 'archive''label' => 'Community',
'module' => 'community',
'controller' => 'index',
'action' => 'index',
'pages''label' => 'My Account',
'module' => 'community',
'controller' => 'account',
'action' => 'index',
'resource' => 'mvc:community.account' // resource
'label' => 'Forums',
'uri' => 'http://forums.example.com/',
'class' => 'external' // class
'label' => 'Administration',
'module' => 'admin',
'controller' => 'index',
'action' => 'index',
'resource' => 'mvc:admin', // resource
'pages''label' => 'Write new article',
'module' => 'admin',
'controller' => 'post',
'aciton' => 'write'
)
)
)
);
// Create container from array
// Store the container in the proxy helper:
$view->getHelper('navigation')->setContainer($container);
// ...or simply:
$view->navigation($container);
// ...or store it in the reigstry:
'Zend_Navigation', $container);
In addition to the container above, the following setup is assumed:
// Setup router (default routes and 'archive' route):
'archive''/archive/:year''module' => 'company',
'controller' => 'news',
'action' => 'archive',
'year''Y''year' => '\d+')
)
);
// Setup ACL:
'member''admin''mvc:admin''mvc:community.account'));
$acl->allow('member', 'mvc:community.account');
$acl->allow('admin'// Store ACL and role in the proxy helper:
$view->navigation()->setAcl($acl)->setRole('member');
// ...or set default ACL and role statically:
'member');
Breadcrumbs Helper
Breadcrumbs are used for indicating where in a sitemap
a user is currently browsing, and are typically rendered
like this: "You are here: Home > Products > FantasticProduct 1.0".
The breadcrumbs helper follows the guidelines from » Breadcrumbs
Pattern - Yahoo! Design Pattern Library,
and allows simple customization (minimum/maximum depth, indentation,
separator, and whether the last element should be linked), or
rendering using a partial view script.
The Breadcrumbs helper works like this; it finds the deepest active
page in a navigation container, and renders an upwards path to
the root. For MVC pages, the "activeness" of a page is
determined by inspecting the request object, as stated in the
section on Zend_Navigation_Page_Mvc.
The helper sets the minDepth property to 1 by default,
meaning breadcrumbs will not be rendered if the deepest active page
is a root page. If maxDepth is specified, the helper
will stop rendering when at the specified depth (e.g. stop at level
2 even if the deepest active page is on level 3).
Methods in the breadcrumbs helper:
-
{get|set}Separator() gets/sets separator
string that is used between breadcrumbs. Defualt is
' > ' .
-
{get|set}LinkLast() gets/sets whether the
last breadcrumb should be rendered as an anchor or not.
Default is FALSE.
-
{get|set}Partial() gets/sets a partial view
script that should be used for rendering breadcrumbs.
If a partial view script is set, the helper's
render() method will use the
renderPartial() method. If no partial is
set, the renderStraight() method is used.
The helper expects the partial to be a String
or an Array with two elements. If the partial
is a String , it denotes the name of the partial
script to use. If it is an Array , the first
element will be used as the name of the partial view
script, and the second element is the module where the
script is found.
-
renderStraight() is the default render
method.
-
renderPartial() is used for rendering
using a partial view script.
Example #34 Rendering breadcrumbs
This example shows how to render breadcrumbs with default
settings.
span style="color: #ff0000;">"/products">Products</a> > <a href="/products/server">Foo Server</a> > FAQ
Example #35 Specifying indentation
This example shows how to render breadcrumbs with initial
indentation.
span style="color: #ff0000;">"/products">Products</a> > <a href="/products/server">Foo Server</a> > FAQ
Example #36 Customize breadcrumbs output
This example shows how to customze breadcrumbs output by
specifying various options.
span style="color: #808080; font-style: italic;">// link last page
// stop at level 1
->setSeparator(' ▶'// cool separator with newline
"/products">Products</a> ▶
<a href="/products/server">Foo Server</a>
/////////////////////////////////////////////////////
Example #37 Rendering breadcrumbs using a partial view script
This example shows how to render customized breadcrumbs using
a partial vew script. By calling setPartial(),
you can specify a partial view script that will be used
when calling render(). When a partial is specified,
the renderPartial() method will be called. This
method will find the deepest active page and pass an array
of pages that leads to the active page to the partial view
script.
span style="color: #ff0000;">'breadcrumbs.phtml', 'default'));
Contents of
application/modules/default/views/breadcrumbs.phtml :
span style="color: #ff0000;">', ''$a', 'return $a->getLabel();'),
$this->pages));
Products, Foo Server, FAQ
Links Helper
The links helper is used for rendering HTML LINK
elements. Links are used for describing document relationships
of the currently active page. Read more about links and link
types at » Document
relationships: the LINK element (HTML4 W3C Rec.)
and » Link types (HTML4 W3C
Rec.) in the HTML4 W3C Recommendation.
There are two types of relations; forward and reverse, indicated
by the keyords 'rel' and 'rev' . Most
methods in the helper will take a $rel param, which
must be either 'rel' or 'rev' . Most
methods also take a $type param, which is used
for specifying the link type (e.g. alternate, start, next, prev,
chapter, etc).
Relationships can be added to page objects manually, or found
by traversing the container registered in the helper. The method
findRelation($page, $rel, $type) will first try
to find the given $rel of $type from
the $page by calling $page->findRel($type)
or $page->findRel($type) . If the $page
has a relation that can be converted to a page instance, that
relation will be used. If the $page instance doesn't
have the specified $type, the helper will look for
a method in the helper named search$rel$type (e.g.
searchRelNext() or
searchRevAlternate()).
If such a method exists, it will be used for determining the
$page's relation by traversing the container.
Not all relations can be determined by traversing the container.
These are the relations that will be found by searching:
-
searchRelStart(), forward 'start'
relation: the first page in the container.
-
searchRelNext(), forward 'next'
relation; finds the next page in the container, i.e.
the page after the active page.
-
searchRelPrev(), forward 'prev'
relation; finds the previous page, i.e. the page before
the active page.
-
searchRelChapter(), forward 'chapter'
relations; finds all pages on level 0 except the 'start'
relation or the active page if it's on level 0.
-
searchRelSection(), forward 'section'
relations; finds all child pages of the active page if
the active page is on level 0 (a 'chapter').
-
searchRelSubsection(), forward 'subsection'
relations; finds all child pages of the active page if
the active pages is on level 1 (a 'section').
-
searchRevSection(), reverse 'section'
relation; finds the parent of the active page if the
active page is on level 1 (a 'section').
-
searchRevSubsection(), reverse 'subsection'
relation; finds the parent of the active page if the
active page is on level 2 (a 'subsection').
Note:
When looking for relations in the page instance
($page->getRel($type) or
$page->getRev($type) ), the helper accepts the
values of type String , Array ,
Zend_Config, or
Zend_Navigation_Page. If a string
is found, it will be converted to a
Zend_Navigation_Page_Uri. If an array
or a config is found, it will be converted to one or several
page instances. If the first key of the array/config is numeric,
it will be considered to contain several pages, and each
element will be passed to the
page factory.
If the first key is not numeric, the array/config will be
passed to the page factory directly, and a single page will
be returned.
The helper also supports magic methods for finding relations.
E.g. to find forward alternate relations, call
$helper->findRelAlternate($page) , and to find
reverse section relations, call
$helper->findRevSection($page) . Those calls correspond
to $helper->findRelation($page, 'rel', 'alternate');
and $helper->findRelation($page, 'rev', 'section');
respectively.
To customize which relations should be rendered, the helper
uses a render flag. The render flag is an integer value, and will be
used in a
» bitwse
and (& ) operation against the
helper's render constants to determine if the relation that belongs
to the render constant should be rendered.
See the
example
below for more information.
-
Zend_View_Helper_Navigation_Links::RENDER_ALTERNATE
-
Zend_View_Helper_Navigation_Links::RENDER_STYLESHEET
-
Zend_View_Helper_Navigation_Links::RENDER_START
-
Zend_View_Helper_Navigation_Links::RENDER_NEXT
-
Zend_View_Helper_Navigation_Links::RENDER_PREV
-
Zend_View_Helper_Navigation_Links::RENDER_CONTENTS
-
Zend_View_Helper_Navigation_Links::RENDER_INDEX
-
Zend_View_Helper_Navigation_Links::RENDER_GLOSSARY
-
Zend_View_Helper_Navigation_Links::RENDER_COPYRIGHT
-
Zend_View_Helper_Navigation_Links::RENDER_CHAPTER
-
Zend_View_Helper_Navigation_Links::RENDER_SECTION
-
Zend_View_Helper_Navigation_Links::RENDER_SUBSECTION
-
Zend_View_Helper_Navigation_Links::RENDER_APPENDIX
-
Zend_View_Helper_Navigation_Links::RENDER_HELP
-
Zend_View_Helper_Navigation_Links::RENDER_BOOKMARK
-
Zend_View_Helper_Navigation_Links::RENDER_CUSTOM
-
Zend_View_Helper_Navigation_Links::RENDER_ALL
The constants from RENDER_ALTERNATE to
RENDER_BOOKMARK denote standard HTML link types.
RENDER_CUSTOM denotes non-standard relations that
specified in pages. RENDER_ALL denotes standard and
non-standard relations.
Methods in the links helper:
-
{get|set}RenderFlag() gets/sets the render
flag. Default is RENDER_ALL. See examples
below on how to set the render flag.
-
findAllRelations() finds all relations of
all types for a given page.
-
findRelation() finds all relations of a given
type from a given page.
-
searchRel{Start|Next|Prev|Chapter|Section|Subsection}()
traverses a container to find forward relations to
the start page, the next page, the previous page,
chapters, sections, and subsections.
-
searchRev{Section|Subsection}() traverses
a container to find reverse relations to sections or
subsections.
-
renderLink() renders a single link
element.
Example #38 Specify relations in pages
This example shows how to specify relations in pages.
span style="color: #ff0000;">'label' => 'Relations using strings',
'rel''alternate' => 'http://www.example.org/'
),
'rev''alternate' => 'http://www.example.net/''label' => 'Relations using arrays',
'rel''alternate''label' => 'Example.org',
'uri' => 'http://www.example.org/''label' => 'Relations using configs',
'rel''alternate''label' => 'Example.org',
'uri' => 'http://www.example.org/''label' => 'Relations using pages instance',
'rel''alternate''label' => 'Example.org',
'uri' => 'http://www.example.org/'
))
)
)
));
Example #39 Default rendering of links
This example shows how to render a menu from a container
registered/found in the view helper.
span style="color: #ff0000;">"alternate" href="/products/server/faq/format/xml""start" href="/" title="Home""next" href="/products/server/editions" title="Editions""prev" href="/products/server" title="Foo Server""chapter" href="/products" title="Products""chapter" href="/company/about" title="Company""chapter" href="/community" title="Community""canonical" href="http://www.example.com/?page=server-faq""subsection" href="/products/server" title="Foo Server">
Example #40 Specify which relations to render
This example shows how to specify which relations to find
and render.
span style="color: #ff0000;">"start" href="/" title="Home""next" href="/products/server/editions" title="Editions""prev" href="/products/server" title="Foo Server">
span style="color: #ff0000;">"alternate" href="/products/server/faq/format/xml""start" href="/" title="Home""next" href="/products/server/editions" title="Editions""prev" href="/products/server" title="Foo Server""chapter" href="/products" title="Products""chapter" href="/company/about" title="Company""chapter" href="/community" title="Community""subsection" href="/products/server" title="Foo Server">
span style="color: #ff0000;">"alternate" href="/products/server/faq/format/xml""start" href="/" title="Home""next" href="/products/server/editions" title="Editions""prev" href="/products/server" title="Foo Server""canonical" href="http://www.example.com/?page=server-faq""subsection" href="/products/server" title="Foo Server">
|
|