ファイルの記述
まず、ファイルの記述方法から見ていきましょう。リンク集を記述するファイルにはXML形式とINIファイル形式の2種類が選べますが、基本はどちらでも同じですので、とりあえずここでは、XMLファイルで記述するものとします。
XMLで記述したリンク集の大枠はリスト2のようになります。
<?xml version="1.0"?>
<config> <!-- (1) 一番外側 -->
<navigation_sample> <!-- (2) リンク集の記述 -->
<top_page> <!-- (3) 1つ目のリンク -->
<action>index</action>
<controller>index</controller>
<module>default</module>
<label>サイト内トップ</label>
<pages>
(子リンクに関する記述)
</pages>
</top_page> <!-- (3) ここまで -->
<outgoing> <!-- (4) 2つ目のリンク -->
<action>outgoing</action>
<controller>index</controller>
<module>default</module>
<label>外部リンク集</label>
<resource>private</resource>
<pages>
(子リンクに関する記述)
</pages>
</outgoing> <!-- (4) ここまで -->
</navigation_sample> <!-- (2) ここまで -->
</config> <!-- (1) ここまで -->
リスト2で示したのはリスト1にあるリンク集のうち、次の部分に対応しています。
(コンテナ) (1)と(2) ├─サイト内トップ(index/index) (3) ... └─外部リンク集 (4) ...
一番外側にある(1)の「configタグ」はファイル全体を包んでいるタグです(実は、このタグはどんな名前でもかまいません)。「このタグの内側がXMLファイルの中身ですよ」という程度の意味だと思っておいてください。
その内側にある(2)の「navigation_sample」タグですが、このタグの内側にリンク集に関して記述します。この「navigation_sample」タグの部分も好きな名前をつけることができますが、こちらは後から使うので、分かりやすい名前にしておくのが良いでしょう。気持ちとしては「これからnavigation_sampleという名前のリンク集について記述するよ」と宣言してると思ってください。
(3)と(4)は、それぞれ具体的なリンクを宣言しています。(3)は「サイト内トップ」に、(4)は「外部リンク集」に対応しています。この、それぞれのリンクの書き方について、もう少し細かく見ていきましょう。
リスト3の(3)で記述されている「サイト内トップ」のリンクを、もう少し詳細に見てみるとリスト4のようになります。構造としては、「top_pageタグ」で囲まれた内側に、定義したいプロパティ一つごとに、一つのタグを記述を記述する形になっています。
<top_page> <!-- リンクの名前 --> <action>index</action> <!-- action プロパティ --> <controller>index</controller> <!-- controller プロパティ --> <module>default</module> <!-- module プロパティ --> <label>サイト内トップ</label> <!-- label プロパティ --> <pages> <!-- pages プロパティここから --> (子リンクに関する記述) </pages> <!-- pages プロパティここまで --> </top_page> <!-- リンクここまで -->
これらのうち「action」「controller」「module」プロパティはサイト内向けのリンクに関するプロパティで、MVCのルートでリンク先を指定するためのもの、「label」プロパティはリンクのラベルを指定するためのものです。
また、「pages」プロパティは階層構造になっているリンク集を作成するためのものです。ここに「サイト内トップ」の下に下に来るリンク(「ナビゲーションの種類」「ACLのテスト」)についての記述をします(リスト5)。
<top_page> <!-- 親: サイト内トップ -->
...
<pages>
<zend_navigation> <!-- 子: ナビゲーションの種類 -->
...
</zend_navigation>
<zend_navigation_acl> <!-- 子: ACLのテスト -->
...
</zend_navigation_acl>
</pages>
</top_page>
これでXML形式でのファイルができました。ここでは、作成したファイルを「link.xml」という名前で、MVCアプリケーションのトップフォルダ(サンプルを「C:\codezine」に展開しているのなら「C:\codezine\application」)に保存するとします。
ファイルの読み込み
いったんファイルを作成したら、これを読み込んでコンテナを作成する手順は非常に簡単です。ここでの手順は先ほども紹介したとおり、(1)ファイルからZend_Configクラスのオブジェクトを作成し、(2)ここからZend_Navigationのコンテナを作成します(リスト6)。
/* (1) XMLファイルからZend_Configのオブジェクトを作成 */
$navigation_config = new Zend_Config_Xml(APPLICATION_PATH.'/links.xml',
'navigation_sample');
/* (2) Zend_ConfigのオブジェクトからZend_Navigationのコンテナを作成 */
$container = new Zend_Navigation($navigation_config);
まず(1)ではZend_Configのオブジェクトをファイルから作成しています。ここではXMLファイルから作成しているので、Zend_Config_Xmlクラスのコンストラクタを利用してファイルの中身を読み込んでいます。ここで2つの引数を与えています。
- 1つ目の引数では読み込むファイルの場所を指定しています。ここの「APPLICATION_PATH」はZend Framework MVCアプリケーションのトップフォルダを示す定数で、「links.xml」と併せて先ほど作成したファイルの位置(C:\codezine\application\link.xml)を示しています。
- 2つ目の引数には、利用するリンク集の名前です。これは、先ほど記入した「navigation_sample」を指定します。
ここで読み込んだ内容を(2)でZend_Navigationクラスのコンストラクタに渡しています。ここの2行だけで、先ほど作成したXMLファイルの中身に対応するZend_Navigationのコンテナができました。ここからは前回の記事と同様で、リンク集のメニューを作ることができます(リスト7)。
... /* 作成したコンテナは$containerに格納されている */ /* Navigationビューヘルパを取得する */ $navigation = $this->view->navigation(); $navigation->setContainer($container); /* メニューの表示等 */ $menu = $navigation->menu(); $menu_html = $menu->render();
XMLファイルを作成するのは少し手間ですが、いったんファイルにリンク集を作成したら、後は簡単にZend_Navigationのコンテナに変換し、利用することができることが分かると思います。
INIファイルもXMLファイルと同じように利用することができます。階層構造についてもXMLファイルと同様に記述していきます。
[navigation_sample] top_page.action = index top_page.controller = index top_page.module = default top_page.label = サイト内トップ ...
ファイルからZend_Configクラスのオブジェクトを作成する際にはZend_Config_Iniクラスのコンストラクタを利用します。
/* INIファイルでも同様 */
$navigation_config = new Zend_Config_Ini(APPLICATION_PATH.'/links.ini',
'navigation_sample');
$container = new Zend_Navigation($navigation_config);
