HTML_Menuを触ってみる。
前、PHP Hackからアイデアが思いついたものの一つがBreadCrumbsね。前働いていた会社で、初めて聞いたときは、なんでそんな名前なんだろうと小一時間思ったけど、まぁ、「パンくず表示」と訳されている。
で、PHP Hackで確かに独自BreadCrumbsを作っているみたいなんだけど、それってPEARでできるじゃん、ということでいろいろ調査してみた。なので、HTML_Menuに関して結構詳しくなりました。いつか使うときがくるかもね。
HTML_Menuの基本は、配列の構造ね。これをちゃんと作っておけばあとはなんとでもなりそう。サンプルスクリプトからそのまま拝借したけど、こんな感じ。
$data = array(
1 => array(
'title' => 'Menu item 1',
'url' => 'test.php?i=1',
'sub' => array(
11 => array('title' => 'Menu item 1.1', 'url' => 'test.php?i=11'),
12 => array(
'title' => 'Menu item 1.2',
'url' => 'test.php?i=12',
'sub' => array(
121 => array('title' => 'Menu item 1.2.1', 'url' => 'test.php?i=121'),
122 => array('title' => 'Menu item 1.2.2', 'url' => 'test.php?i=122')
)
)
)
),
2 => array(
'title' => 'Menu item 2',
'url' => 'test.php?i=2',
'sub' => array(
21 => array('title' => 'Menu item 2.1', 'url' => 'test.php?i=21'),
22 => array('title' => 'Menu item 2.2', 'url' => 'test.php?i=22')
)
)
);
まぁ、何が言いたいかというと、配列の要素名がとても重要なのよ。1とか2とかの配列のキーが重要。あとurlの値が重要。titleは特に使わなかったので、適当でいいと思う。で、urlの指定先がちょいと曲者。test1.php, test2.php, test3.phpのように違うファイルを指定するときはいいんだけど、test.php?i=1, test.php?i=2のようにすべてtest.phpに処理させるときには、ちょいと工夫が必要。
$menu =& new HTML_Menu($data); $index = (int)$_GET['i'] == 0 ? 1 : (int)$_GET['i']; $menu->forceCurrentIndex($index);
$indexの値を適当に受け取って、forceCurrentIndexメソッドに渡している。さて、このforceCurrentIndexメソッドは、PEAR::Manual::HTML_Menuにはないんだけど、Docs For Class HTML_Menuにはある。まぁ、ソースを見ていたら、あー、これ使ったらいいのね。って思ったので、とりあえずそれを採用。他の方法としては、forceCurrentUrlメソッドでも良さそうだけども、好みの問題だと思う。まぁ、どちらをキーとして、Menuを渡り歩くかということかな。
あとは、適当にrenderするなり、showするなりするだけ。最初は、この現在のMenuの位置をどうやって渡すかに悩んだけど、やりかたがわかってしまえば、なんてことないね。まぁ、indexの値やurlの値を書き換える(内部で)ので、気持ち悪いことは確かだけど。
ところで、話を戻して、BreadCrumbsなんだけども、HTML_Menuの$typeに’urhere’と渡すだけで、渡したデータが正しければ、現在の位置を考慮して表示をしてくれる。つーか、PEARでいいですねということで終了しました。
あー。RendererにHTML_Template_Sigmaが使えるみたいです。Smarty用のでも書いてみようかなー、と思ったけど、データの渡し方がよくわからなかったので、諦めました。勇者の出現を待ちます。
Shin Ohno 2003-2012
昔々、ヘンデルとグレーデルが森に入るときに帰り道がわかるようにと持っていたパンを少しずつちぎって落とし目印にしました。というのが、BreadCrumbsの由来だと聞いたことがあります。
なるほどー。ちょっとしたトリビアですね。