エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法

      2019/07/22

CakePHP3の「ブログチュートリアル・パート3」のツリーカテゴリー(ツリービヘイビア)の子階層も含めたカテゴリ検索を検索プラグイン「friendsofcake/search」を使って実装する方法を解説

 

「friendsofcake/search」は CakePHP3で使われる検索処理のプラグイン

 
この記事では、CakePHP3のオフィシャルの Cookbookの中にある「『ブログチュートリアル・パート3』で『ツリーカテゴリーの作成(ツリービヘイビアの利用)』」で作成されるツリー構造のカテゴリを、自身のカテゴリを含む子階層のカテゴリをすべて対象として実施する検索を、検索プラグイン「friendsofcake/search」を利用して実装する方法を解説しています。
 
Cookbook・ブログチュートリアル パート3
https://book.cakephp.org/3.0/ja/tutorials-and-examples/bookmarks/intro.html
 
Cookbook・Tree(ツリービヘイビア)
https://book.cakephp.org/3.0/ja/orm/behaviors/tree.html
 
 
ツリービヘイビアを利用すると、下記のようなツリー構造のカテゴリを簡単に実装することができます。
 

 
上記のようなツリー構造のカテゴリがある場合、「カテゴリ1-1」で検索すると、「カテゴリ1-1」だけではなく、そのカテゴリに属する子カテゴリも含めて下記の部分が検索にヒットさる、というのが今回の記事の趣旨です。
 

 
 
「friendsofcake/search」の設置方法など、基本的な使い方については下記の記事を参考にしてください。
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
 
また、部分一致検索、完全一致検索、以上/以下などの値の比較検索、複数項目の検索など、「friendsofcake/search」で実装できる様々な検索方法についての解説については下記に記事を書いています。
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
 
また、CakePHP3のオフィシャルの Cookbookの中にある「『ブックマークチュートリアル』で『タブを指定してブックマークを取得』」の処理を、検索プラグイン「friendsofcake/search」を利用して実装する方法についての解説は下記に記事を書いています。
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
 
 
ちなみに、「friendsofcake/search」の設置方法は、CakePHP3.6になったときに少し変わっていますので、CakePHP3.6がリリースされた 2018年4月14日以前に書かれた記事では動作しないものもあるように感じます。
「friendsofcake/search」の実装をするときは、記事が書かれた日付を確認しつつ参考にしたほうが良さそうです。
 
この記事は、CakePHP3.7で動作確認しながら書いています。
 
 


 
 

ブログチュートリアルのツリーカテゴリーを「friendsofcake/search」を使って子階層も含めて検索を実装する

 

ブログチュートリアル・ツリーカテゴリーの環境構築

 
今回構築する検索処理ですが、使用するテーブル構成やプログラムは、下記の「ブログチュートリアル」の内容を利用しています。
まずは、下記のチュートリアルに従って環境を構築してください。
 
Cookbook・ブログチュートリアル
https://book.cakephp.org/3.0/ja/tutorials-and-examples/blog/blog.html
https://book.cakephp.org/3.0/ja/tutorials-and-examples/blog/part-two.html
https://book.cakephp.org/3.0/ja/tutorials-and-examples/blog/part-three.html
 
Cookbook・ツリービヘイビア
https://book.cakephp.org/3.0/ja/orm/behaviors/tree.html
 
「ブログチュートリアル」のとおりに環境を構築し、動作しているところに検索プラグイン「friendsofcake/search」を導入することを想定しています。
 
そのため、テーブル名やカラム名について特に説明はしません。
「ブログチュートリアル」の記事で確認をしてください。
 
 

「friendsofcake/search」のインストールとロード

 
「friendsofcake/search」のインストールまではできているものとします。
 
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
 
具体的には、上記の記事の
「1.Composerを使って「friendsofcake/search」をインストール」
「2.「friendsofcake/search」をロード」
まではできている想定です。
 
まだの場合は、上記の記事を参考に実行してください。
 
 

3.Model(Table)に検索処理を追加

 
Model(Table)に、use句と、ビヘイビア、検索条件の追加を行います。
 
作業対象ファイルは以下になります。
/src/Model/Table/ArticlesTable.php
 
 
まず、「Categories」テーブルを呼び出すために下記の use句を追加します。
 

 
 
続けて、「ビヘイビア(friendsofcake/search)の追加」「検索条件の追加」を行います。(「ブログチュートリアルで追加した処理」の部分は、ブログチュートリアルの中ですでに追加してあるはずものです。)
 

 
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応」の記事をベースに記事を書いていますので、最初に Tableファイルの編集が来ていますが、「friendsofcake/search」では、検索条件を Tableファイルに記述しますので、ここが最重要ポイントです。
 
ポイントは、「callback句」を利用することと、「$categories->find("children",["for"=>$args["search02"]]);」で子階層のカテゴリの IDを取得するところです。
 
ノードの子孫のフラットなリストを取得する方法($categories->find("children",["for"=>1]);)として、Cookbookの割とはじめの方に書いてあります。
 
このポイントが理解できれば、ここ以外は普通に「friendsofcake/search」を設定する方法とほぼ変わりがありません。
 
 

4.Controllerに検索処理を追加

 
Controllerに検索処理を追加します。
 
/src/Controller/ArticlesController.php
に下記の処理を追加します。
 
まず、「Categories」テーブルを呼び出すために下記の use句を追加します。
 

 
 
さらに下記の処理を追加します。
 

 
Controllerの処理は、基本的な「friendsofcake/search」の使い方と違う点はありません。
 
ただ、「カテゴリ」をセレクトボックスとして編集するために、「Categoriesテーブルを配列として取得」の処理を追加しています。
 
この中で、ツリービヘイビア特有の項目が「$this->Categories->find("treeList")」の部分です。
 
セレクトボックスなどを作成するために必要な配列を取得するときは「find("list")」としますが、下記のようにツリーリストにしたい場合には「find("treeList")」を使用します。
 

 
また、「order(["lft"=>"ASC"])」を入れることで、カテゴリの親子関係を維持した順番に並べることができます。
 
また、小カテゴリの階層化のための文字として、上記の設定では「--(全角ハイフン 2つ)」を指定しています。
これは、「"spacer"=>"--"」で指定しているもので、好きなものに変更することができます。
これを指定しない場合は、デフォルトとして設定されている「_(半角アンダースコア)」が使われます。
 
 

5.Templateに検索条件のセレクトボックスを追加

 
最後に、Templateに検索条件を入力するセレクトボックスを追加します。
 
/src/Template/Articles/index.ctp
に下記の処理を追加します。
 

 
タグを検索するセレクトボックスは、5~7行目の記述で追加します。
 
また、セレクトボックスの選択肢は「”options”=>$categoriesList」で指定します。
「$categoriesList」は、Controllerで配列として生成しています。
 
 
また、Cookbookのとおりに実行しただけでは、検索結果の一覧表示に「カテゴリー」が表示されません。
検索結果が正しいかどうかの確認のためにも、検索結果の一覧表示に「カテゴリー」を追加したほうがいいでしょう。
 
 
以上になります。
 
 


 
 

検索プラグイン「friendsofcake/search」の検索選択肢をチェックボックスで用意する

 
今回この解説では、カテゴリーの選択肢はセレクトボックスで 1つだけ選択する方法を採っています。
 
ですが、チェックボックスにして複数選択にする方式に変更する方法は簡単です。
 
 
まず、「/src/Template/Articles/index.ctp」の検索フォームエリアを下記のように変更します。
変更点は、6行目の「"multiple"=>"checkbox",」の追加です。
 

 
 
続いて、「ArticlesTable.php」の「initialize()」の中の「検索条件の追加」を下記のように変更します。
 

 
$args["search02"]」として受け取った値が配列になっていますので、それを foreach()文で取り出す、という部分が増えています。
 
 
検索プラグイン「friendsofcake/search」で、チェックボックスを利用して検索処理を実装する方法としては、下記の記事にも解説をしていますので、あわせて参考にしてみてください。
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
 
 

Cookbookのブログチュートリアル・パート3の不具合点

 
Cookbookのブログチュートリアル・パート3は、解説のとおりにソースコードを修正しても、Articlesの追加、更新でカテゴリの情報が正しく保存されません。
(カテゴリIDが常に「0」で保存されてしまいます。)
 
これは、「/src/Model/Entity/Article.php」の更新について触れていないためです。
下記の通り 4行目の「‘category_id’ => true,」を追加しましょう。
 

 
 

CakePHP3の関連記事

CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを

CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。

CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定

CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。

CakePHP3のユーザ管理・認証プラグイン CakeDC/Usersの導入・機能解説・3.1.5対応
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応

CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。

CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応

CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!

CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法

アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。

CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」

CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。

CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法

CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。

CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説

CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。

MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認

MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。