Webサイト発注虎の巻ダウンロード
Webサイト発注虎の巻ダウンロード

パンくずリストの作成方法

まっちー

CakePHPで静的なページ(静的とは限らないけど)を作っていてわりと悩むのがパンくずリストの作り方。パンくずリストってページの下層の方のリンクになれば完全に個別ですけど、トップページへのリンクの部分なんて、どのページでも一緒じゃないですか。

だから僕の場合はelementsにpankuzu.ctpみたいなファイルを作って常にそれをrenderElementするようにしてるんですよ。あとはスイッチ文を使って、コントローラーごとに表示を分けるような感じで。

<?php

 € € € € switch($this->params['controller']) {

 € € € € € € € € € case 'users':

 € € € € € € € € € € € € € € $name = 'ユーザー情報';

 € € € € € € € € € € € € € € break;

 € € € € € € € € € case 'contacts':

 € € € € € € € € € € € € € € $name = 'お問い合わせ';

 € € € € € € € € € € € € € € break;

 € € € € € € € € € case 'company':

 € € € € € € € € € € € € € € $name = '会社概要';

 € € € € € € € € € € € € € € break;

 € € € € }

 € € € € if($this->params['action'] != 'index') {

 € € € € € € € € € $link = $html->link($name, '/'.$this->params['controller'].'/').' > ';

 € € € € } else {

 € € € € € € € € € $link = ' ';

 € € € € }

 € € € € echo $html->link('トップ', '/home/').' > '.$link;

?>

まあ、大雑把に書くとこんな感じですね。これなら、たとえば会社概要のページを作っているコントローラーがあるとして(上の場合でいうcompany)、そこに会社概要(アクションはindex)とスタッフ情報(アクションはstaff)があるとしたらだったら

// company/index/の場合
<?php echo $this->renderElement('pankuzu') ?>

// company/staff/の場合
<?php echo $this->renderElement('pankuzu') ?>スタッフ情報

こんな風に書けば、ページに表示されるのはそれぞれ、

トップ > 会社概要

トップ > 会社概要 > スタッフ情報

まあ、基本PHP部分しかないからvendorsとかの方が良いのかもしれないけど? とりあえずはこんな感じでいつも対処してます。

してますが、でもこれ、上記くらいの感じならそれなりにさっぱりまとめられるんですが、アクションのさらに下層のページがいくつもあったり(スタッフ情報の下に個別スタッフの紹介ページがあってさらにその下に何かしらのページがあるとか)、indexじゃないページでも表示されるパンくずリストが トップ > 該当のページ だけだったりとかすると、意外とソースが汚くなります。まあ、僕の書き方の問題もあるんですけど。

分かりやすくコンパクトにまとめるためにわざわざelements以下にファイルを作ってるのだから、あまりごちゃごちゃしたソースになっても仕方ないしぃ……。

何か上手いパンくずリストの書き方って、ないもんですかねぇ。

M o n g o