CodeZine(コードジン)

特集ページ一覧

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

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

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

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

目次

メニューの表示

 まず最初に図1に表示されている、リンク集を出力する方法について見ていきます。ここでは対象とするリンク集は、リスト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のようになっています。

[リスト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を利用してメニュー等を表示するには、次のような手順で行います。

  1. Zend_Navigation_Pageクラスのオブジェクトの作成
  2. コンテナへのZend_Navigation_Pageオブジェクトの登録
  3. Navigationビューヘルパを利用してHTMLへの変換

 それでは、各手順を追っていきましょう。

Zend_Navigation_Pageオブジェクトの作成

 まず、ウェブページへのリンクとそのリンクに関係する情報を扱うためのZend_Navigation_Pageクラスのオブジェクトを作成します。これにはいくつか方法があるのですが、ここではZend_Navigation_Pageクラスのfactory静的メソッドを利用します。

 このfactory静的メソッドにはリンク先に関する情報を配列で指定します。例えばリスト2で作成したZend_Navigation_Pageオブジェクトを見てみましょう(リスト3)。

[リスト3]Zend_Navigation_Pageオブジェクトの作成(MVC)
$top_page = Zend_Navigation_Page::factory(
    array(
        'action' => 'index',           //アクションを指定
        'controller' => 'index',       //アクションコントローラを指定
        'module' => 'default',         //モジュールを指定
        'label' => 'サイト内トップ')); //リンクで表示されるラベルを指定

 このリンク先の指定の方法は同じサイト内のページを指定するための方法で、MVCモデルのルートでページを指定しています。ここでは「index/index」への「サイト内トップ」と表示されるリンクを作成しています。

 もっと単純に、URIでリンク先を直接指定する方法もあります(リスト4)。

[リスト4]Zend_Navigation_Pageオブジェクトの作成(URI)
$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メソッドを利用します。

[リスト5]コンテナへのZend_Navigation_Pageオブジェクトの登録
$container = new Zend_Navigation(); //コンテナの作成
$container->addPage($top_page);     //コンテナへZend_Navigation_Pageの登録

 このように作成したコンテナは配列のような機能を持っていて、登録されたZend_Navigation_Pageオブジェクトのリストを管理します。単純なリストたけでは階層構造を持つリンク集を管理することはできませんが、Zend_Navigation_PageクラスもZend_Navigation_Containerクラスを継承しているので、ここで階層構造のあるリンク集を作成することができます(リスト6)。

[リスト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クラスのオブジェクト経由でアクセスすることになります。

[リスト7]ビューヘルパの取得
$navigation = $this->view->navigation(); //Navigationビューヘルパの取得
$navigation->setContainer($container);   //コンテナの登録

 このように、まずNavigationビューヘルパを取得した後で、まず描画したいリンク集を格納しているコンテナを登録します。

 ここで取得したNavigationビューヘルパ(ここでは「navigation」変数)は「プロキシNavigationビューヘルパ」と呼ばれるもので、実際に描画を行うNavigationビューヘルパを仲介する機能があります。ここから更に、実際に描画を行うNavigationビューヘルパを取得する必要があります。

[リスト8]リンク集の描画
$menu = $navigation->menu();             //メニューの取得
$menu_html = $menu->render();            //メニューの描画
$this->view->assign('menu', $menu_html); //ビュースクリプトに渡す

 プロキシNavigationビューヘルパ(ここでは「$navigation」変数)の、描画したい内容に応じたメソッド(ここでは「menu」メソッド)を呼び出すことで、実際に描画を行うNavigationビューヘルパ(ここでは「$menu」変数に格納されているメニューNavigationビューヘルパ)を取得することができます。この実際に描画を行うNavigationビューヘルパのrenderメソッドを呼び出すことでHTMLへの変換が行われます。

 ここまででZend_Navigationを利用してリンク集を表示する手順を一通り見てみました。それでは、今紹介したクラスについてもう少し細かく見ていきましょう。


  • 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