SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

PHPアプリでのナビゲーションUIの応用
- Zend_Navigation -

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

ファイルの記述

 まず、ファイルの記述方法から見ていきましょう。リンク集を記述するファイルにはXML形式とINIファイル形式の2種類が選べますが、基本はどちらでも同じですので、とりあえずここでは、XMLファイルで記述するものとします。

 XMLで記述したリンク集の大枠はリスト2のようになります。

リスト2 XML設定ファイルの大枠
<?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にあるリンク集のうち、次の部分に対応しています。

リスト3 リンク構造の大枠
(コンテナ)                       (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タグ」で囲まれた内側に、定義したいプロパティ一つごとに、一つのタグを記述を記述する形になっています。

リスト4 リンクの記述
<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)。

リスト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)。

リスト6 XMLファイルからコンテナの作成(IndexController.php)
/* (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)。

リスト7 コンテナから(IndexController.php)
...
/* 作成したコンテナは$containerに格納されている */

/* Navigationビューヘルパを取得する */
$navigation = $this->view->navigation();
$navigation->setContainer($container);

/* メニューの表示等 */
$menu = $navigation->menu();
$menu_html = $menu->render();

 XMLファイルを作成するのは少し手間ですが、いったんファイルにリンク集を作成したら、後は簡単にZend_Navigationのコンテナに変換し、利用することができることが分かると思います。

INIファイルの利用

 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);

次のページ
Zend_Aclとの連携

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4940 2010/03/19 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング