エス技研

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


CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装

      2019/07/22

CakePHP3の「ブックマークチュートリアル」のタグ検索を検索プラグイン「friendsofcake/search」で実装する方法を解説

 

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

 
この記事では、CakePHP3のオフィシャルの Cookbookの中にある「『ブックマークチュートリアル』で『タブを指定してブックマークを取得』」の処理を、検索プラグイン「friendsofcake/search」を利用して実装する方法を解説しています。
 
Cookbook・ブックマークチュートリアル
https://book.cakephp.org/3.0/ja/tutorials-and-examples/bookmarks/intro.html
 
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
 
「ブックマークチュートリアル」にあるような、「ブックマーク」と「タグ」を関連付けているテーブルを検索対象として検索するイメージの検索です。
検索対象のコードが検索対象のテーブルではなく、関連テーブル(アソシエーションしたテーブル)にある 1対N の項目に対する検索です。
(1対1のアソシエーションなどで contain句で接続できるテーブルの場合は、もっと単純に組み込むことができます。その方法は「CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法」で解説していますので、こちらを参考にしてみてください。)
 
 
「friendsofcake/search」の設置方法など、基本的な使い方については下記の記事を参考にしてください。
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
 
また、部分一致検索、完全一致検索、以上/以下などの値の比較検索、複数項目の検索など、「friendsofcake/search」で実装できる様々な検索方法についての解説については下記に記事を書いています。
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
 
また、CakePHP3のオフィシャルの Cookbookの中にある「『ブログチュートリアル・パート3』で『ツリーカテゴリーの作成(ツリービヘイビアの利用)』」で作成されるツリー構造のカテゴリを、自身のカテゴリを含む子階層のカテゴリをすべて対象として実施する検索を、検索プラグイン「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/bookmarks/intro.html
 
「ブックマークチュートリアル」のとおりに環境を構築し、動作しているところに検索プラグイン「friendsofcake/search」を導入することを想定しています。
 
そのため、テーブル名やカラム名について特に説明はしません。
「ブックマークチュートリアル」の記事で確認をしてください。
 
 

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

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

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

 
Model(Table)にビヘイビアと検索条件の追加を行います。
 
/src/Model/Table/BookmarksTable.php
に下記の処理を追加します。
 
まず最初に、下記の use句を追加します。
「BookmarksTags」テーブルにアクセスするために使用します。
 

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

 
「CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応」の記事をベースに記事を書いていますので、最初に tableファイルの編集が来ていますが、ここが最重要ポイントです。
 
「タグ」を検索するポイントは、「callback句」を利用して、まず「bookmarks_tags」テーブルの中から該当する「bookmark_id」を取得することと、その「bookmark_id」を「distinct()」句を使ってユニークにするところです。
(※「distinct()」句を使わなくても問題ありません。「distinct()」句を使わなかった場合は、「$bookmarksArray」の配列の中に重複した「bookmark_id」が入ることになりますが、検索処理自体は正しい結果を得ることができます。)
 
このポイントが理解できれば、ここ以外は普通に「friendsofcake/search」を設定する方法とほぼ変わりがありません。
 
 
※更新情報(2019年07月22日)
上記のサンプルソースですが、デバッグが十分ではなく、正しく動作していなかったことが確認されましたので、全面的な修正を行いました。
 
 

4.Controllerに検索処理を追加

 
Controllerに検索処理を追加します。
 
/src/Controller/BookmarksController.php
に下記の処理を追加します。
 
まず最初に、下記の use句を追加します。
 

 
「tags」テーブルにアクセスするために使用します。
 
 
さらに下記の処理を追加します。
 

 
Controllerの処理は、基本的な「friendsofcake/search」の使い方と違う点はありません。
 
ただ、「タグ」をチェックボックスとして編集するために、「Tagsテーブルを配列として取得」の処理を追加しています。
 
 

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

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

 
タグを検索するチェックボックスは、5~8行目の記述で追加します。
 
チェックボックス自体は「”type”=>”checkbox”」と記述しても表示することができます。
ですが、検索項目のチェックボックスとして機能させるためには、「”type”=>”select”,”multiple”=>”checkbox”」と記述する必要があります。
 
また、チェックボックスの選択肢は「”options”=>$tagsList」で指定します。
「$tagsList」は、Controllerで配列として生成しています。
 
 
加えて、検索した「タグ」の項目も一覧表示する必要がありますので、一覧表は下記のように変更します。
 

 
テンプレートを更新すると、下記の様なイメージになります。
 
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
 
 
以上になります。
 
 
検索プラグイン「friendsofcake/search」の解説記事は、基本的な導入方法にとどまるものがほとんどで、様々な検索方法について解説している記事はほぼありません。
 
参考になる記事が少ないという点で実装が難しいのですが、いざ分かってみれば、実装方法自体は難しくありません。
やはり、効率的な開発を行うには汎用的な処理はプラグインを活用する方がいい、と改めて感じました。
 
 

CakePHP3の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
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」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

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

CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。

CakePHP 2.3 コマンドラインからPHPのシェル実行の方法解説

CakePHP 2.3でコマンドラインから CakePHPで記述した処理を実行する方法を解説します。

CakePHPで Auto Incrementを外すと Duplicate entry '0' for keyのエラーが出るかも
CakePHPで Auto Incrementを外すと Duplicate entry ‘0’ for keyのエラーが出るかも

CakePHPでAuto Incrementの設定を変更したときに「Duplicate entry ‘0’ for key」のエラーが出た。原因はModel内で IDを編集する処理の追加を忘れていたからだった。

CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説

WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。

CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する

CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。

CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説

CakePHP4でバッチ処理を行うためのコマンド・シェルの実装方法について解説。bakeでテンプレートファイルを作成し、「execute()」に処理を記述する方法を解説。

MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない

CakePHPの日付、日時の型であるdate型、datetime型の最大値は2999-12-31となっている。MySQLは9999年までなので違いがあるので注意が必要だ。

CakePHP4の規約外のカラムをキーにアソシエーション(テーブル連結)する方法
CakePHP4の規約外のカラムをキーにアソシエーション(テーブル連結)する方法

CakePHPで規定外のカラム名のキーを指定してアソシエーション(テーブル連結)をする方法を解説。アソシエーション名によってはミスが発生しやすい点もあるので注意も必要。

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

ファイルのアップロード機能の自作サンプルコードとその解説のその2。アップロード機能に関連するファイルの更新や削除の処理や画像、フォルダのパスの指定方法などを含めて解説。

CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法

CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。