エス技研

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でCookieを保存、呼び出し、削除の操作・CakePHP3.7対応
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
CakePHP3のdatetime型カラムの日時の扱い。秒まで正しく表示する方法
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説

CakePHP3でJavaScriptやCSSを編集する基本形から、それらやテンプレート(エレメント)を特定のテンプレートを読み込んだときのみ編集、実行するための方法、ブロック化について解説。

CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法

CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。

CakePHP 2.3でファイルのアップロード処理を作る

CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。

CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定

CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。

CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説
CakePHP3のCakeDC/Usersのバリデーションのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。Usersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。

CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数

CakePHP3で特定フォルダのパスの定数を解説。root、DocumentRoot、app、config、webroot、tests、tmp、cache、vendor、コア、コアの srcが設定済み。realpath()関数を使うと柔軟なパス指定が可能。

CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方

CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点

ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。

CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルのアップロード処理を自作・解説付き・その1

CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!