メニューの表示
まず最初に図1に表示されている、リンク集を出力する方法について見ていきます。ここでは対象とするリンク集は、リスト1のような階層構造を持っているとします。
(コンテナ) ├─サイト内トップ(index/index) │ └─ ナビゲーションの種類(index/index) │ ├─ メニュー(index/menu) │ ├─ リンク(index/links) │ ├─ XMLサイトマップ(index/sitemap) │ └─ パンくずリスト(index/breacrumbs) └─外部リンク集(index/outgoing) ├─ コードジン(http://codezine.jp/) └─ Zend Framework(http://framework.zend.com/)
このうち、「(index/menu)」のようになっているのはZend FrameworkのMVCモデル内のルートでの指定で、この場合には「indexアクションコントローラのmenuアクション」が指すリンクを示しています。それ以外の「http」で始まるリンクはURIでリンク先を指定しているものです。
これから図1のようなHTMLを出力するコードはリスト2のようになっています。
/* Zend_Navigation_Pageオブジェクトの作成(1) */
//Zend Framework MVCモデルのルートで指定
$top_page = Zend_Navigation_Page::factory(
array(
'action' => 'index',
'controller' => 'index',
'module' => 'default',
'label' => 'サイト内トップ'));
/* コンテナの作成と登録(2) */
$container = new Zend_Navigation();
$container->addPage($top_page);
...
/* Navigationビューヘルパを利用して変換(3) */
$navigation = $this->view->navigation();
$navigation->setContainer($container);
$menu = $navigation->menu();
$menu_html = $menu->render();
$this->view->assign('menu', $menu_html);
このように、Zend_Navigationを利用してメニュー等を表示するには、次のような手順で行います。
- Zend_Navigation_Pageクラスのオブジェクトの作成
- コンテナへのZend_Navigation_Pageオブジェクトの登録
- Navigationビューヘルパを利用してHTMLへの変換
それでは、各手順を追っていきましょう。
Zend_Navigation_Pageオブジェクトの作成
まず、ウェブページへのリンクとそのリンクに関係する情報を扱うためのZend_Navigation_Pageクラスのオブジェクトを作成します。これにはいくつか方法があるのですが、ここではZend_Navigation_Pageクラスのfactory静的メソッドを利用します。
このfactory静的メソッドにはリンク先に関する情報を配列で指定します。例えばリスト2で作成したZend_Navigation_Pageオブジェクトを見てみましょう(リスト3)。
$top_page = Zend_Navigation_Page::factory(
array(
'action' => 'index', //アクションを指定
'controller' => 'index', //アクションコントローラを指定
'module' => 'default', //モジュールを指定
'label' => 'サイト内トップ')); //リンクで表示されるラベルを指定
このリンク先の指定の方法は同じサイト内のページを指定するための方法で、MVCモデルのルートでページを指定しています。ここでは「index/index」への「サイト内トップ」と表示されるリンクを作成しています。
もっと単純に、URIでリンク先を直接指定する方法もあります(リスト4)。
$codezine_page = Zend_Navigation_Page::factory(
array(
'label' => 'コードジン', //リンクで表示されるラベルを指定
'uri' => 'http://codezine.jp/'));//リンク先をURIで指定
外部サイトへのリンクは、こちらを利用することになります。
このように作成したZend_Navigation_Pageオブジェクトはリンク1つ分を表現しています。これをまとめて扱うための機能が次に紹介するZend_Navigationのコンテナです。
なお、Zend_Navigation_Pageクラスには、この他にも色々とリンクやリンク先に関する情報を登録することができます。これについては、また後で紹介することにします。
コンテナへのZend_Navigation_Pageオブジェクトの登録
Zend_Navigation_Containerクラス(コンテナ)はリンクのリストを扱うためのクラスです。このZend_Navigation_Containerクラスは抽象クラスなので、実際にコンテナを利用する際にはZend_Navigationクラス等を利用することになります。
コンテナへのZend_Navigation_Pageオブジェクトの登録はZend_Navigation_ContainerクラスのaddPageメソッドを利用します。
$container = new Zend_Navigation(); //コンテナの作成 $container->addPage($top_page); //コンテナへZend_Navigation_Pageの登録
このように作成したコンテナは配列のような機能を持っていて、登録されたZend_Navigation_Pageオブジェクトのリストを管理します。単純なリストたけでは階層構造を持つリンク集を管理することはできませんが、Zend_Navigation_PageクラスもZend_Navigation_Containerクラスを継承しているので、ここで階層構造のあるリンク集を作成することができます(リスト6)。
$zend_navigation_page = Zend_Navigation_Page::factory(
...
'label' => 'ナビゲーションの種類'));
$top_page->addPage($zend_navigation_page);//ページに子ページを登録
$menu_page = Zend_Navigation_Page::factory(
array(
...
'label' => 'メニュー'));
$zend_navigation_page->addPage($menu_page);//更に孫ページを登録
これでリンク集に関するデータを作成することができました。次に、これをHTMLに変換するNavigationビューヘルパの利用方法を見ていきます。
Navigationビューヘルパを利用してHTMLへの変換
NavigationビューヘルパはZend_Navigationの部品をHTMLに変換する機能があります。ビューヘルパなので、Zend_Viewクラスのオブジェクト経由でアクセスすることになります。
$navigation = $this->view->navigation(); //Navigationビューヘルパの取得 $navigation->setContainer($container); //コンテナの登録
このように、まずNavigationビューヘルパを取得した後で、まず描画したいリンク集を格納しているコンテナを登録します。
ここで取得したNavigationビューヘルパ(ここでは「navigation」変数)は「プロキシNavigationビューヘルパ」と呼ばれるもので、実際に描画を行うNavigationビューヘルパを仲介する機能があります。ここから更に、実際に描画を行うNavigationビューヘルパを取得する必要があります。
$menu = $navigation->menu(); //メニューの取得
$menu_html = $menu->render(); //メニューの描画
$this->view->assign('menu', $menu_html); //ビュースクリプトに渡す
プロキシNavigationビューヘルパ(ここでは「$navigation」変数)の、描画したい内容に応じたメソッド(ここでは「menu」メソッド)を呼び出すことで、実際に描画を行うNavigationビューヘルパ(ここでは「$menu」変数に格納されているメニューNavigationビューヘルパ)を取得することができます。この実際に描画を行うNavigationビューヘルパのrenderメソッドを呼び出すことでHTMLへの変換が行われます。
ここまででZend_Navigationを利用してリンク集を表示する手順を一通り見てみました。それでは、今紹介したクラスについてもう少し細かく見ていきましょう。
