Zend\Navigation ships with two page types:
MVC pages are link to on-site web pages, and are defined using MVC parameters (action, controller, route, params). URI pages are defined by a single property uri, which give you the full flexibility to link off-site pages or do other things with the generated links (e.g. an URI that turns into <a href="#">foo<a>).
All page classes must extend Zend\Navigation\Page\AbstractPage, and will thus share a common set of features and properties. Most notably they share the options in the table below and the same initialization process.
Option keys are mapped to set methods. This means that the option order maps to the method setOrder(), and reset_params maps to the method setResetParams(). If there is no setter method for the option, it will be set as a custom property of the page.
Read more on extending Zend\Navigation\Page\AbstractPage in Creating custom page types.
Note
Custom properties
All pages support setting and getting of custom properties by use of the magic methods __set($name, $value), __get($name), __isset($name) and __unset($name). Custom properties may have any value, and will be included in the array that is returned from $page->toArray(), which means that pages can be serialized/deserialized successfully even if the pages contains properties that are not native in the page class.
Both native and custom properties can be set using $page->set($name, $value) and retrieved using $page->get($name), or by using magic methods.
This example shows how custom properties can be used.
1 2 3 4 5 6 7 8 9 | $page = new Zend\Navigation\Page\Mvc();
$page->foo = 'bar';
$page->meaning = 42;
echo $page->foo;
if ($page->meaning != 42) {
// action should be taken
}
|
When extending Zend\Navigation\Page\AbstractPage, there is usually no need to override the constructor or the methods setOptions() or setConfig(). The page constructor takes a single parameter, an Array or a Zend\Config object, which is passed to setOptions() or setConfig() respectively. Those methods will in turn call set() method, which will map options to native or custom properties. If the option internal_id is given, the method will first look for a method named setInternalId(), and pass the option to this method if it exists. If the method does not exist, the option will be set as a custom property of the page, and be accessible via $internalId = $page->internal_id; or $internalId = $page->get('internal_id');.
The only thing a custom page class needs to implement is the getHref() method.
1 2 3 4 5 6 7 | class My\Simple\Page extends Zend\Navigation\Page\AbstractPage
{
public function getHref()
{
return 'something-completely-different';
}
}
|
When adding properties to an extended page, there is no need to override/modify setOptions() or setConfig().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | class My\Navigation\Page extends Zend\Navigation\Page\AbstractPage
{
protected $foo;
protected $fooBar;
public function setFoo($foo)
{
$this->foo = $foo;
}
public function getFoo()
{
return $this->oo;
}
public function setFooBar($fooBar)
{
$this->fooBar = $fooBar;
}
public function getFooBar()
{
return $this->fooBar;
}
public function getHref()
{
return $this->foo . '/' . $this->fooBar;
}
}
// can now construct using
$page = new My\Navigation\Page(array(
'label' => 'Property names are mapped to setters',
'foo' => 'bar',
'foo_bar' => 'baz'
));
// ...or
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'type' => 'My\Navigation\Page',
'label' => 'Property names are mapped to setters',
'foo' => 'bar',
'foo_bar' => 'baz'
));
|
All pages (also custom classes), can be created using the page factory, Zend\Navigation\Page\AbstractPage::factory(). The factory can take an array with options, or a Zend\Config object. Each key in the array/config corresponds to a page option, as seen in the section on Pages. If the option uri is given and no MVC options are given (action, controller, route), an URI page will be created. If any of the MVC options are given, an MVC page will be created.
If type is given, the factory will assume the value to be the name of the class that should be created. If the value is mvc or uri and MVC/URI page will be created.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $page = Zend\Navigation\Page\AbstractPage::factory(array(
'label' => 'My MVC page',
'action' => 'index',
));
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'label' => 'Search blog',
'action' => 'index',
'controller' => 'search',
));
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'label' => 'Home',
'route' => 'home',
));
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'type' => 'mvc',
'label' => 'My MVC page',
));
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $page = Zend\Navigation\Page\AbstractPage::factory(array(
'label' => 'My URI page',
'uri' => 'http://www.example.com/',
));
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'label' => 'Search',
'uri' => 'http://www.example.com/search',
'active' => true,
));
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'label' => 'My URI page',
'uri' => '#',
));
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'type' => 'uri',
'label' => 'My URI page',
));
|
To create a custom page type using the factory, use the option type to specify a class name to instantiate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class My\Navigation\Page extends Zend\Navigation\Page\AbstractPage
{
protected $_fooBar = 'ok';
public function setFooBar($fooBar)
{
$this->_fooBar = $fooBar;
}
}
$page = Zend\Navigation\Page\AbstractPage::factory(array(
'type' => 'My\Navigation\Page',
'label' => 'My custom page',
'foo_bar' => 'foo bar',
));
|
The source code of this file is hosted on GitHub. Everyone can update and fix errors in this document with few clicks - no downloads needed.