CodeZine(コードジン)

特集ページ一覧

PHPアプリでのナビゲーションUIの管理と表示
- Zend_Navigation -

Zend Frameworkによる実践的なPHPアプリケーション開発 26

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/12/22 14:00

ダウンロード sample.zip (9.8 KB)

目次

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クラスでは、主にリンクに関する補助的な情報を管理するプロパティを持っています。

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クラスです。このクラスは、アクションコントローラー名やアクション名などを利用してリンクを作成するのに利用します。

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メソッドの自動判別

 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」メソッドがありした。これを含め、コンテナを操作するためのメソッドには次のようなものがあります。

Zend_Navigation_Containerクラスを操作するためのメソッド
メソッド名 引数 説明
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)。

[リスト9]Zend_Navigationクラスの作成(IndexController.php)
/* コンテナの検索 */
$outgoing = $container->findOneBy('label', '外部リンク集');

 コンテナからページを検索するためのメソッドには、次のようなものがあります。

Zend_Navigation_Containerクラスを検索するためのメソッド
メソッド名 引数 説明
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)。

[リスト10]リスト9をマジックメソッドと利用したメソッドで書く
/* コンテナの検索 */
$outgoing = $container->findOneByLabel('外部リンク集');

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Zend Framework入門

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5