Zend_Navigation_Pageクラス
Zend_Navigation_Pageクラスは、ウェブページへのリンクとそのリンクに関係する情報をまとめて扱うためのオブジェクトを生成するためのクラスです。
Zend_Navigation_Pageクラスは抽象クラスで、実際にページのオブジェクトを作るためにはZend_Navigation_PageのサブクラスのZend_Navigation_Mvcクラスか、Zend_Navigation_Uriクラスを利用します。それぞれ違いや利用方法の説明に入る前に、まずこの2種類に共通なZend_Navigation_Pageクラスのプロパティやメソッドを見ていきましょう。
Zend_Navigation_Pageクラスでは、主にリンクに関する補助的な情報を管理するプロパティを持っています。
| プロパティの種類 | プロパティ名 | 説明 |
| HTMLのAタグ関係 | label | リンクのラベル |
| id | リンクのID | |
| class | リンクのCSSでのクラス | |
| title | リンク先のページのタイトル | |
| target | リンクのtarget属性 | |
| LINKタグ関係 | rel | ページの前向きなリンク |
| rev | ページの逆向きのリンク | |
| ACL関係 | resource | このページが持つACL的なリソース |
| privilege | このページを見るのに必要な権限 | |
| その他 | order | リンクが描画される順番を指定する |
| active | このリンクが有効かどうか(MVCのページで、未指定ないしFALSEの場合は自動的に判定する) | |
| visible | このリンクを表示するかどうか | |
| pages | このリンクの子要素 |
このように、ページからHTMLを生成する際に利用する情報などがプロパティとして設定されています。これらのプロパティは「set(プロパティ名)」メソッドで設定したり、「get(プロパティ名)」メソッドで値を取得することができます。また、コンストラクタにプロパティ名とプロパティの値の配列として渡して設定することもできます。
MVCのルートから作成
一つ目のサブクラスはZend FrameworkのMVCモデルを利用したウェブサイト内で利用するための、Zend_Navigation_Page_Mvcクラスです。このクラスは、アクションコントローラー名やアクション名などを利用してリンクを作成するのに利用します。
| プロパティ名 | 説明 |
| action | アクション名 |
| controller | アクションコントローラー名 |
| module | モジュール名 |
| params | 追加のパラメータを配列にしたもの |
| route | 利用するルータの名前 |
| reset_params | 現在表示しているページのパラメータをリンクに引き継がない(標準ではTRUE) |
これらのパラメータの一部は省略することが可能で、省略した場合、現在表示しているページの値を利用したり(actionプロパティ、controllerプロパティ、moduleプロパティ)、標準の値を利用したり(routeプロパティ)します。
URIを直接指定して作成
次は、URIを直接指定してページオブジェクトを作成するためのZend_Navigation_Page_Uriクラスです。こちらのクラスは、単純にZend_Navigation_Pageクラスに「uri」プロパティを追加しただけの構造になっています。
factoryメソッドは与えられたパラメータから、自動的に作成するオブジェクトのクラスを判定します。具体的には、「action」「controller」「module」「route」の一つでもあればZend_Navigation_Page_Mvcクラスと、それ以外で「uri」があればZend_Navigation_Page_Uriクラスと判定します(どれもない場合にはエラーで、例外を出力します)。
なので、MVCルートの情報とURIと両方を指定するとZend_Navigation_Page_Mvcクラスのオブジェクトを作成します。
なお、Zend_Navigation_Page_MvcクラスもZend_Navigation_Page_Uriクラスも、直接コンストラクタから作成することができます。この場合はfactory静的メソッドと同様に、配列でプロパティを与えます。
コンテナ
Zend_Navigation_Containerクラスはページをまとめておくためのクラスで、SPLのRecursiveIteratorインタフェースとCountableインタフェースを実装しています(つまり、foreach文で中の要素にアクセスしたりすることができます)。
Zend_Navigation_Containerクラスは抽象クラスで、直接作成することはできません。コンテナのインスタンスを利用したい場合には、基本的にZend_NavigationクラスかZend_Navigation_Pageクラスを利用します。
Zend_Navigation_Containerの操作
リスト5で見たように、コンテナには要素を追加するための「addPage」メソッドがありした。これを含め、コンテナを操作するためのメソッドには次のようなものがあります。
| メソッド名 | 引数 | 説明 |
| addPage | $page | ページの登録を追加する |
| addPages | $pages | 配列に格納されたページを追加登録する |
| setPages | $pages | 登録されているページを配列の中身に置き換える |
| getPages | (なし) | 登録されているページを配列として取得する |
| removePage | $page | $pageがページの場合そのページの登録を削除する。$pageが整数の場合には$page番目のページを削除する |
| removePages | (なし) | ページの登録を全て削除する |
| hasPage | $page, $recursive | $pageが登録されているか調べる。$recursiveがTRUEの場合には再帰的に調べる。$recursiveは省略可能で、省略した場合にはFALSE |
| hasPages | (なし) | コンテナが空でないかを調べる |
また、コンストラクタでページを作成しながら登録することもできます。その場合には配列(ないしZend_Configクラスのオブジェクト)で中身を指定します。ここで渡された配列の各要素はZend_Navigation_Pageクラスのfactory静的メソッドに渡され、ページが作成されます。
ページの検索
コンテナに含まれるページを、ページのプロパティを利用して検索することもできます。例えば、「label」プロパティが「コードジン」である要素を一つ検索するには「findOneBy」メソッドを利用します(リスト9)。
/* コンテナの検索 */
$outgoing = $container->findOneBy('label', '外部リンク集');
コンテナからページを検索するためのメソッドには、次のようなものがあります。
| メソッド名 | 引数 | 説明 |
| findOneBy | $property, $value | プロパティ$propertyの値が$valueである最初のページを返す。ない場合にはNULLを返す |
| findAllBy | $property, $value | プロパティ$propertyの値が$valueである全てのページを配列で返す |
| findBy | $property, $value, $all | $allがTRUEの場合findAllByと、FALSEの場合はfindOneByと同じ動作をする |
| findOneBy(プロパティ名) | $value | プロパティ「プロパティ名」の値が$valueである最初のページを返す。ない場合にはNULLを返す |
| findAllBy(プロパティ名) | $value | プロパティ「プロパティ名」の値が$valueである全てのページを配列で返す |
最後の2つのメソッドはマジックメソッドを利用した特殊なメソッドで、検索対象のプロパティ名をメソッド名の最後につける形で利用します。例えばリスト9は次のように書くことができます(リスト10)。
/* コンテナの検索 */
$outgoing = $container->findOneByLabel('外部リンク集');
