CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
2019/09/28
CakePHP3でパンくずをヘルパーを使って編集する
CakePHP3にはパンくずを指定する方法は 2つある
CakePHP3では、パンくずを指定する方法は、下記の 2つ用意されています。
Cookbook Html HtmlHelper でパンくずリストを作成
https://book.cakephp.org/3.0/ja/views/helpers/html.html#id11
Cookbook Breadcrumbs (パンくず)
https://book.cakephp.org/3.0/ja/views/helpers/breadcrumbs.html
後者の方は、CakePHP 3.3.6で追加された、パンくずを生成するためのヘルパーで、より柔軟なパンくずを設定することができるようになっています。
ですが、パンくずの表現方法にこだわりがあまりない場合は、前者の HTMLヘルパーを使って構築するほうが簡単に生成できます。
というわけで、今回の記事では全社の HTMLヘルパーを使った簡単な生成方法を解説します。
ちなみに、リンクを設定する HTMLヘルパーについては下記の記事にまとめていますので参考にしてください。
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
パンくずを生成する基本形
HTMLヘルパーを使ったパンくずの生成は非常に簡単です。
まず、レイアウトファイルにパンくずのベースとなる処理を記述します。
パス付きのレイアウトファイルは以下になります。
/src/Template/Layout/default.ctp
1 2 3 4 5 6 7 |
<div> <?php echo $this->Html->getCrumbs(' > ', array( 'text' => 'Home', 'url' => '/', 'escape' => false, )); ?> </div> |
これを記述した場所にベースとなる「Home」の部分が出力されます。
続いて、テンプレートファイルごとに「$this->Html->addCrumb()
」を使ってページごとのパンくずを指定します。
パス付きのテンプレートファイルは以下になります。
/src/Template/Topics/view.ctp
1 2 |
$this->Html->addCrumb('Topics', '/Topics/'); $this->Html->addCrumb('View', '/Topics/view/1'); |
レイアウトファイルに記述した「$this->Html->getCrumbs()
」の場所に「$this->Html->addCrumb()
」で指定した順番にパンくずが出力されていきます。
「addCrumb()」はいくつでも設定が可能です。
HTMLヘルパーを使って指定するパンくずは指定の順番が大切
また、「getCrumbs()」と「addCrumb()」を同一のテンプレートファイル内に記述する場合は記述する順番が大切です。
1 2 3 4 5 6 7 8 9 10 11 |
<?php $this->Html->addCrumb('Topics', '/Topics/'); $this->Html->addCrumb('View', '/Topics/view/1'); ?> <div> <?php echo $this->Html->getCrumbs(' > ', array( 'text' => 'Home', 'url' => '/', 'escape' => false, )); ?> </div> |
上記のサンプルのように「addCrumb()」を記述した後に「getCrumbs()」を記述します。
「getCrumbs()」でパンくずを出力した後に「addCrumb()」でページの情報を追加しても追加出力はされません。
Bootstrap対応の場合は「$this->Html->getCrumbList()
」を使う
ここで解説した「getCrumbs()」を使うと、下記のような HTMLが出力されます。
1 2 3 |
<div> <a href="/">Home</a> > <a href="/Topics/">Topics</a> > <a href="/Topics/view/1">View</a> </div> |
これは見た通りの HTMLですので、これで問題ない場合も多々あるでしょう。
ですが、Bootstrapのパンくずは liタグで項目を指定する想定になっていますので、それに合わせたい、という場合は下記のように「getCrumbList()」が用意されています。
1 2 3 4 5 6 7 8 9 10 |
<div> <?php echo $this->Html->getCrumbList( [ 'firstClass' => false, 'lastClass' => 'active', 'class' => 'breadcrumb' ], 'Home' ); ?> </div> |
設定内容の
「firstClass」は、liタグの最初の項目に設定するクラスを指定します。
「lastClass」は、liタグの最後の項目に設定するクラスを指定します。
「class」は、パンくず全体の ulタグに設定するクラスを指定します。
上記のように「getCrumbs()」を設定する箇所を「getCrumbList()」の設定に置き換えると、下記のように liタグで処理された HTMLが出力されます。
1 2 3 |
<div> <ul class="breadcrumb"><li><a href="/">Home</a></li><li><a href="/Topics/">Topics</a></li><li class="active"><a href="/Topics/view/1">View</a></li></ul> </div> |
「addCrumb()」の処理は、「getCrumbs()」「getCrumbList()」はどちらも同じ様に動作しますので、出力したい HTMLに合わせて選択してください。
パンくず生成の応用編・パンくずの HTMLをテンプレート化する
パンくずのベースとなる「$this->Html->getCrumbs()
」を記述する場所が、前項と同じ様にレイアウトファイル 1箇所の場合は前項のように処理をしても問題ありません。
ですが、パンくずを編集する場所がレイアウトファイルではなく、テンプレートファイル上にある場合は、パンくずを編集するレイアウトファイルの全てに「$this->Html->getCrumbs()
」を記述する必要があります。
万一「$this->Html->getCrumbs()
」の内容を修正する必要が発生したときなどは大変です。
というわけで、パンくずの設置処理に少し柔軟性をもたせるために、パンくずの「$this->Html->getCrumbs()
」をエレメント化(パーツ化)する方法を解説します。
まず、「$this->Html->getCrumbs()
」をエレメント化します。
下記のファイルを生成し、コードの内容を保存します。
/src/Template/Element/crumbsElement.ctp
1 2 3 4 5 6 7 |
<div> <?php echo $this->Html->getCrumbs(' > ', array( 'text' => 'Home', 'url' => '/', 'escape' => false, )); ?> </div> |
続けて、テンプレートファイル「/src/Template/Topics/view.ctp」のパンくずを編集する場所に下記の内容を追記します。
1 |
<?= $this->element("crumbsElement"); ?> |
また、テンプレートファイル「/src/Template/Topics/view.ctp」に記述する下記の処理は特に変更ありません。
1 2 |
$this->Html->addCrumb('Topics', '/Topics/'); $this->Html->addCrumb('View', '/Topics/view/1'); |
ただし、上記の内容は「$this->Html->getCrumbs()
」より前に記述しておく必要がありますので、「= $this->element("crumbsElement"); ?>
」より前に記述しておく必要があります。
パンくず生成の応用編・パンくずの HTMLをテンプレート化し、ブロック化する
CakePHP3のデフォルトのデザインを使用する場合、パンくずを編集する場所はテンプレートファイルになりますので、前項のエレメント化までで問題ないでしょう。
ですが、独自のデザインを作成しているときなどで共通のエレメント(テンプレート)などにパンくずを指定する場合に問題が発生する場合があります。
それは、「$this->Html->getCrumbs()
」を記述すると当然のごとく、必要がないページにもパンくずの「Home」が表示されてしまうのです。
そのため、表示するかしないかの分岐処理が必要になりますが、そういう場合は「fetch()」でブロック化することで、表示、非表示の処理をフレームワークに任せてしまうことができるようになります。
今回は、サンプルのため「fetch()」はレイアウトファイルに設置をして試します。
パス付きのレイアウトファイルは以下になります。
/src/Template/Layout/default.ctp
レイアウトファイルにパンくずを編集する場所に下記の処理を記述します。
1 |
<?= $this->fetch('crumbs') ?> |
エレメントファイル「/src/Template/Element/crumbsElement.ctp」は、前項の内容と同一です。
1 2 3 4 5 6 7 |
<div> <?php echo $this->Html->getCrumbs(' > ', array( 'text' => 'Home', 'url' => '/', 'escape' => false, )); ?> </div> |
続いて、各ページごとのテンプレートファイル(/src/Template/Topics/view.ctp)には以下のように記述します。
1 2 3 4 5 |
$this->start("crumbs"); $this->Html->addCrumb('Topics', '/Topics/'); $this->Html->addCrumb('View', '/Topics/view/1'); echo $this->element("crumbsElement"); $this->end(); |
上記のように、テンプレートファイルに「$this->start("crumbs");
」があるページが呼びされれば、「fetch(‘crumbs’)」の場所にパンくずを出力をします。
なければ何も処理されませんので、記述する内容はシンプルになります。
また、もう一つのポイントは、「$this->Html->addCrumb()
」と「$this->element()
」の順番です。
「$this->Html->addCrumb()
」を先に記述して、その後に「$this->element()
」を記述します。
逆だと「addCrumb()」で追加した部分は表示されません。
サイト全体に共通する処理をページごとに切り替える処理
今回は、サイト全体に共通して指定をする必要はあるものの、ページごとにそれぞれ違うテキストを切り替えて編集していく必要があるパンくずを指定する方法を解説しました。
同じような考え方をする仕組みとして、下記の記事で書いている titleタグ、h1タグの値を指定する方法や、使用する JavaScriptや CSSをページごとに設定する方法、metaタグの「keywords」「description」を指定する方法、OGPタグの一種である OGPを指定する方法などにも活用することができます。
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
これらは、レイアウトファイルに変数を指定しておき、そこに編集する値を各ページ用のテンプレートファイルで指定する、という仕組みです。
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。
-
CakePHP3のインストールでURL rewriting……のエラーが!その解決方法解説
CakePHP3をインストールしたら URL rewriting is not properly configured.のエラーが。原因は.htaccessが有効になっていないこと。httpd.confに設定を追加すればOK。
-
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
CakePHP3でデータ保存処理のログを取得する方法。save()では true、falseの戻り値しか取得できないが、saveOrFail()と try…catch文を使いエラーログ、エンティティを取得し、不具合の解析を行う。
-
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
CakePHP3でcomposerを使ってパッケージ(ライブラリ、プラグイン)をインストールする方法の解説。PHPを使うのはCakePHP3が初めてというような方への使い方から解説。
-
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。
-
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。
-
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。