Zend_Navigation
ships with two page types:
MVC pages are link to on-site web pages, and are defined using MVC
parameters (action
, controller
,
module
, 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
,
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
in
Creating custom page types.
Tabela 120. Common page options
Key | Type | Default | Description |
---|---|---|---|
label |
String | NULL |
A page label, such as 'Home' or 'Blog'. |
id |
String | int
|
NULL |
An id tag/attribute that may be used when rendering the page, typically in an anchor element. |
class |
String | NULL |
A CSS class that may be used when rendering the page, typically in an anchor element. |
title |
String | NULL |
A short page description, typically for using
as the title attribute in an anchor.
|
target |
String | NULL |
Specifies a target that may be used for the page, typically in an anchor element. |
accesskey |
String | NULL |
This attribute assigns an access key to an A element.
An access key is a single character from the document character set.
|
fragment |
String | NULL |
The fragment identifier (anchor identifier) pointing to an anchor within a resource that is subordinate to another, primary resource. The fragment identifier introduced by a hash mark '#'. Example: http://www.example.org/foo.html#bar ('bar' is the fragment identifier) |
rel |
Array | array() |
Specifies forward relations for the page.
Each element in the array is a key-value pair, where the
key designates the relation/link type, and the value is
a pointer to the linked page. An example of a key-value
pair is 'alternate' => 'format/plain.html' .
To allow full flexbility, there are no restrictions on
relation values. The value does not have to be a string.
Read more about rel and rev in
the
section on the Links helper..
|
rev |
Array | array() |
Specifies reverse relations for the page. Works exactly
like rel .
|
order |
String | int | NULL
|
NULL |
Works like order for elements in
Zend_Form . If specified,
the page will be iterated in a specific order, meaning
you can force a page to be iterated before others by
setting the order attribute to a low number,
e.g. -100. If a String is given, it must
parse to a valid int . If NULL
is given, it will be reset, meaning the order in which
the page was added to the container will be used.
|
resource |
String | Zend_Acl_Resource_Interface
| NULL
|
NULL |
ACL resource to associate with the page. Read more in the section on ACL integration in view helpers.. |
privilege |
String | NULL
|
NULL |
ACL privilege to associate with the page. Read more in the section on ACL integration in view helpers.. |
active |
bool |
FALSE |
Whether the page should be considered active for the
current request. If active is FALSE or not
given, MVC pages will check its properties against the
request object upon calling $page->isActive() .
|
visible |
bool |
TRUE |
Whether page should be visible for the user, or just be a part of the structure. Invisible pages are skipped by view helpers. |
pages |
Array | Zend_Config |
NULL
|
NULL |
Child pages of the page. This could be an Array
or Zend_Config object containing either page
options that can be passed to the factory()
method, or actual Zend_Navigation_Page
instances, or a mixture of both.
|
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.
Przykład 602. Custom page properties
This example shows how custom properties can be used.
$page = new Zend_Navigation_Page_Mvc(); $page->foo = 'bar'; $page->meaning = 42; echo $page->foo; if ($page->meaning != 42) { // action should be taken }
MVC pages are defined using MVC parameters known from
the Zend_Controller
component. An MVC page will
use Zend_Controller_Action_Helper_Url
internally
in the getHref()
method to generate hrefs, and
the isActive()
method will intersect the
Zend_Controller_Request_Abstract
params
with the page's params to determine if the page is active.
Tabela 121. MVC page options
Key | Type | Default | Description |
---|---|---|---|
action |
String | NULL |
Action name to use when generating href to the page. |
controller |
String | NULL |
Controller name to use when generating href to the page. |
module |
String | NULL |
Module name to use when generating href to the page. |
params |
Array | array() |
User params to use when generating href to the page. |
route |
String | NULL |
Route name to use when generating href to the page. |
reset_params |
bool |
TRUE |
Whether user params should be reset when generating href to the page. |
encode_url |
bool |
TRUE |
Whether href should be encoded when assembling URL. |
Uwaga
The three examples below assume a default MVC setup with
the default
route in place.
The URI returned is relative to the baseUrl
in
Zend_Controller_Front
. In the examples, the baseUrl
is '/' for simplicity.
Przykład 603. getHref() generates the page URI
This example shows that MVC pages use
Zend_Controller_Action_Helper_Url
internally
to generate URIs when calling $page->getHref()
.
// getHref() returns / $page = new Zend_Navigation_Page_Mvc(array( 'action' => 'index', 'controller' => 'index' )); // getHref() returns /blog/post/view $page = new Zend_Navigation_Page_Mvc(array( 'action' => 'view', 'controller' => 'post', 'module' => 'blog' )); // getHref() returns /blog/post/view/id/1337 $page = new Zend_Navigation_Page_Mvc(array( 'action' => 'view', 'controller' => 'post', 'module' => 'blog', 'params' => array('id' => 1337) ));
Przykład 604. isActive() determines if page is active
This example shows that MVC pages determine whether they are active by using the params found in the request object.
/* * Dispatched request: * - module: default * - controller: index * - action: index */ $page1 = new Zend_Navigation_Page_Mvc(array( 'action' => 'index', 'controller' => 'index' )); $page2 = new Zend_Navigation_Page_Mvc(array( 'action' => 'bar', 'controller' => 'index' )); $page1->isActive(); // returns true $page2->isActive(); // returns false /* * Dispatched request: * - module: blog * - controller: post * - action: view * - id: 1337 */ $page = new Zend_Navigation_Page_Mvc(array( 'action' => 'view', 'controller' => 'post', 'module' => 'blog' )); // returns true, because request has the same module, controller and action $page->isActive(); /* * Dispatched request: * - module: blog * - controller: post * - action: view */ $page = new Zend_Navigation_Page_Mvc(array( 'action' => 'view', 'controller' => 'post', 'module' => 'blog', 'params' => array('id' => null) )); // returns false, because page requires the id param to be set in the request $page->isActive(); // returns false
Przykład 605. Using routes
Routes can be used with MVC pages. If a page has a route, this
route will be used in getHref()
to generate the
URL for the page.
Uwaga
Note that when using the route
property in a
page, you should also specify the default params that the
route defines (module, controller, action, etc.), otherwise
the isActive()
method will not be able to
determine if the page is active. The reason for this is that
there is currently no way to get the default params from a
Zend_Controller_Router_Route_Interface
object,
nor to retrieve the current route from a
Zend_Controller_Router_Interface
object.
// the following route is added to the ZF router Zend_Controller_Front::getInstance()->getRouter()->addRoute( 'article_view', // route name new Zend_Controller_Router_Route( 'a/:id', array( 'module' => 'news', 'controller' => 'article', 'action' => 'view', 'id' => null ) ) ); // a page is created with a 'route' option $page = new Zend_Navigation_Page_Mvc(array( 'label' => 'A news article', 'route' => 'article_view', 'module' => 'news', // required for isActive(), see note above 'controller' => 'article', // required for isActive(), see note above 'action' => 'view', // required for isActive(), see note above 'params' => array('id' => 42) )); // returns: /a/42 $page->getHref();
Przykład 606. Set parameters to use when assembling URL
// The following route is added to the ZF router Zend_Controller_Front::getInstance()->getRouter()->addRoute( 'article_list', // route name new Zend_Controller_Router_Route( 'blog/:category/:page', array( 'module' => 'blog', 'controller' => 'article', 'action' => 'list', 'category' => null, 'page' => null, ) ) ); // A page is created with the 'route' option $page = new Zend_Navigation_Page_Mvc(array( 'label' => 'Article list', 'module' => 'blog', 'controller' => 'post', 'action' => 'list', )); // Add multiple parameters at once $page->addParams( array( 'category' => 'news', 'page' => 1, ) ); // Add a single parameter $page->addParam('category', 'news'); // Set multiple parameters at once (Overwrites any previously set parameters!) $page->setParams( array( 'category' => 'news', 'page' => 1, ) ); // Set a single parameter $page->setParam('category', 'news'); // Retrieve all parameters $params = $page->getParams(); // Retrieve a single parameter $category = $page->getParam('category'); // Remove a parameter $page->removeParam('page'); // Clear all parameters $page->clearParams();
Pages of type Zend_Navigation_Page_Uri
can be
used to link to pages on other domains or sites, or to implement
custom logic for the page. URI pages are simple; in addition
to the common page options, a URI page takes only one option —
uri
. The uri
will be returned when
calling $page->getHref()
, and may be a
String or NULL
.
Uwaga
Zend_Navigation_Page_Uri
will not try to determine
whether it should be active when calling $page->isActive()
.
It merely returns what currently is set, so to make a URI page active
you have to manually call $page->setActive()
or
specifying active
as a page option when constructing.
Tabela 122. URI page options
Key | Type | Default | Description |
---|---|---|---|
uri |
String | NULL |
URI to page. This can be any string or
NULL .
|
When extending Zend_Navigation_Page
, 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');.
Przykład 607. The most simple custom page
The only thing a custom page class needs to implement is the
getHref()
method.
class My_Simple_Page extends Zend_Navigation_Page { public function getHref() { return 'something-completely-different'; } }
Przykład 608. A custom page with properties
When adding properties to an extended page, there is no need
to override/modify setOptions()
or
setConfig()
.
class My_Navigation_Page extends Zend_Navigation_Page { private $_foo; private $_fooBar; public function setFoo($foo) { $this->_foo = $foo; } public function getFoo() { return $this->_foo; } 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::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::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, module, 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.
Przykład 609. Creating an MVC page using the page factory
$page = Zend_Navigation_Page::factory(array( 'label' => 'My MVC page', 'action' => 'index' )); $page = Zend_Navigation_Page::factory(array( 'label' => 'Search blog', 'action' => 'index', 'controller' => 'search', 'module' => 'blog' )); $page = Zend_Navigation_Page::factory(array( 'label' => 'Home', 'action' => 'index', 'controller' => 'index', 'module' => 'index', 'route' => 'home' )); $page = Zend_Navigation_Page::factory(array( 'type' => 'mvc', 'label' => 'My MVC page' ));
Przykład 610. Creating a URI page using the page factory
$page = Zend_Navigation_Page::factory(array( 'label' => 'My URI page', 'uri' => 'http://www.example.com/' )); $page = Zend_Navigation_Page::factory(array( 'label' => 'Search', 'uri' => 'http://www.example.com/search', 'active' => true )); $page = Zend_Navigation_Page::factory(array( 'label' => 'My URI page', 'uri' => '#' )); $page = Zend_Navigation_Page::factory(array( 'type' => 'uri', 'label' => 'My URI page' ));
Przykład 611. Creating a custom page type using the page factory
To create a custom page type using the factory, use the option
type
to specify a class name to instantiate.
class My_Navigation_Page extends Zend_Navigation_Page { protected $_fooBar = 'ok'; public function setFooBar($fooBar) { $this->_fooBar = $fooBar; } } $page = Zend_Navigation_Page::factory(array( 'type' => 'My_Navigation_Page', 'label' => 'My custom page', 'foo_bar' => 'foo bar' ));