エス技研

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


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

      2019/09/28

CakePHP3の検索プラグイン「friendsofcake/search」の設置方法

 

CakePHP3の検索プラグイン「friendsofcake/search」とは

 
CakePHP3で検索処理を実装するにあたってプラグインの利用を検討しました。
結果、CakePHP3の検索プラグインでは「friendsofcake/search」がメジャーなようでした。
 
 
CakePHP2の頃は「CakeDC/search」というプラグインを使っていまして、下記の記事などを書いていました。
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
 
「CakeDC/search」同じ「CakeDC」のグループが作ったプラグインとしては、CakePHP3でも使っている「CakeDC/Users」というユーザ認証に関するプラグインがあります。
CakePHP3のユーザ管理・認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
 
ですが、検索プラグインでは CakePHP3になってからは「friendsofcake/search」が主流となったようです。
 
「friendsofcake」というグループは「CakeDC」と同様、CakePHPを開発している方々が在籍しているグループのようです。
また、「friendsofcake」が作ったプラグインとしては、Bootstrapを組み込むためのプラグイン「friendsofcake/bootstrap-ui」などがあります。
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
 
 
実際に「friendsofcake/search」を使ってみた感じでは、「CakeDC/search」よりも簡単に導入することができ、各条件に合わせたカスタマイズも簡単にできる感じがします。
検索処理のような汎用的な処理は、オリジナルの処理を作るよりプラグインを使うほうが効率的に開発を進めることができるでしょう。
 
 
ちなみに、CakePHP3.6になったときに「friendsofcake/search」の設置方法も変わったと思われ、CakePHP3.6がリリースされた 2018年4月14日以前に書かれた記事のソースコードでは動作しないものが多々ありました。
参考にする際は記事が書かれた日付を確認したほうが良さそうです。
 
この記事は、CakePHP3.7で動作確認しながら書いています。
 
 

CakePHP3の検索プラグイン「friendsofcake/search」の導入手順

 
この章では、「friendsofcake/search」を導入する基本的な手順を解説します。
 
次の章で、記述方法のバリエーションや不具合が発生した場合の対応方法について解説します。
 
 

1.Composerを使って「friendsofcake/search」をインストール

 
まずはじめに、下記のコマンドを実行し、「friendsofcake/search」をインストールします。
コマンドを実行する場所は、アプリケーションのルートフォルダです。
 

 
CakePHP3でプラグインやライブラリをインストールする際には Composerを使うと便利ですが、これまでに Composerがよくわからない方は下記を参照してください。
CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法
 
 

2.「friendsofcake/search」をロード

 
次に、インストールした「friendsofcake/search」をプログラム内で使用するためにロードする設定を記述します。
 
/src/Application.php
に下記の処理を追加します。
 

 
 
ここでは「/src/Application.php」ファイルに手作業で記述しましたが、コマンドラインから下記のコマンドを実行しても OKです。結果は同じになります。
 

 
 

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

 
Model(Table)にビヘイビアと検索条件の追加を行います。
 
/src/Model/Table/TestsTable.php
に下記の処理を追加します。
 

 
「ビヘイビアの追加」と「検索条件の追加」の処理を追加します。
 
「検索条件の追加」の箇所は実際に検索する条件に合わせて設定を変更する箇所です。
ここでは「title」という項目を「like検索」する設定になっています。また、「before」「after」を追加して、対象文字列の中の何処かに一致すればいい「中間一致検索」になる設定になっています。
 
最初の設置の際は、動作確認ができる最低限の項目にしておくことをオススメします。
 
 
また、「検索条件の追加」の部分を「initialize()」メソッドの中に書かずに、function()として独立して記述する方法もあります。
記述するファイルは、変わらず「/src/Model/Table/TestsTable.php」の中です。
 

 
 

4.Controllerに検索処理を追加

 
Controllerに検索処理を追加します。
 
/src/Controller/TestsController.php
に下記の処理を追加します。
 

 
「ページング設定の追加」は、設定内容の変更をしたい場合に追加します。
なくても動作しますので、最初の動作確認の段階ではなくても問題ありません。
 
「検索処理のロードの追加」では、検索処理を追加するアクションを指定します。
今回は「index」アクション内で検索処理を行いますのでそれを指定しています。
 
また、「index()」アクション内では、レコードを取得するクエリーに検索条件を含む「find()」句を追加します。
 
 
ちなみに、「initialize()」メソッド内の「検索処理のロードの追加」の「"actions" => ["index"]」は、デフォルト設定は「"actions" => ["index","lookup"]」となっています。
 
下記のように「actions」の部分をコメントにしても、「index」「lookup」アクション内であれば検索処理は動作します。(とは言え、明示しておくほうが無難ですが。)
 

 
ちなみに、「$this->loadComponent();」の処理は記述しないと検索できません。
 
 

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

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

 
4行目は、検索対象となる項目を指定してください。
 
上記の設定であれば、検索条件のテキストボックスに入力した文字列は、検索結果のページにも表示されます。
古いサイトを参考にすると「$this->Form->create()」と書いてある場合もありますが、その記述だけでは、検索結果ページのテキストボックスに入力した文字列が編集されませんので注意をしてください。
 

 
もしくは、下記の設定でも OKです。
 

 
 
テキストボックスなどをカスタマイズしたい場合は、下記に Form Helperの使い方の記事を書いていますので、こちらを参考にしてください。
CakePHP3のForm Helperの使い方のまとめ
 
 

アンカーリンク付きのフォームタグを生成する方法

 
パソコンのブラウザではあまり気になりませんが、スマホで検索をした場合、ページの一番上に戻ってしまい、検索結果の一覧のところまで画面をスクロールさせるのが面倒、という場合がありました。
 
そんなときは、アンカーリンク(ページ内リンク)を設定しようと思いましたが、ちょっと悩んだところでもありましたのでここに追記しておきます。(2019.09.28 追記)
 
アンカーリンクを設定する方法は簡単です。
通常はリンク先を設定する「action」属性(フォームの POSTする先の URLを指定する箇所)に「#search」のようにアンカーリンク先を指定するだけです。
 

 
上記のように設定すると、下記のような HTMLが生成されます。
 

 
これで検索を実行すると、検索処理が行われ、アンカーリンクを設定しているところに画面がスクロールして表示されます。
 
"url"=>"#search"」を設定すると、検索クエリーが処理されないのではないか、とも思っていましたが、全くそんな心配はいりませんでした。
 
 
ちなみに、アンカー側の記述は HTMLのタグとして下記のように記述します。
 

 
cakephp3の HTML Helperで記述する方法を調べてみましたが、よく分かりませんでした。
 
 


 
 

CakePHP3の検索プラグイン「friendsofcake/search」の導入方法のバリエーション

 
前の章では、検索プラグイン「friendsofcake/search」の基本的な導入方法を解説しました。
ですが、「friendsofcake/search」の導入方法は単一ではなく、いくつものバリエーションが存在しますので、それらの方法を解説します。
 
 

Model(Table)の記述を以前の記述方法で踏襲する

 
以前は、検索条件を「searchConfiguration()」の中に記述する方法がありました。
その方法を踏襲する場合は、下記のように記述することで実現できます。
 
/src/Model/Table/TestsTable.php
に下記の処理を追加します。
 

 
 

Controllerに追加する検索処理のバリエーション

 
Controllerに記述する検索処理は多様な記述の仕方があります。
各人で好みの記述方法があると思いますので、それに合わせた記述方法を試してみてください。
 
 
Controllerに追加する検索処理ですが、$queryの記述の方法を 2分割すると下記のような記述になります。
 

 
 
また、クエリ文字列(クエリストリング、URLパラメーター)を取得する方法は、CakePHP3.4で新しい方法が追加されていますので、CakePHP3.4以降を使っているのであれば、新しい方をオススメします。
 

 
 
また、テーブルの連携先(アソシエーション)の情報も取得したい場合は、「contain()句」を利用しますが、これも連結させるだけで OKです。
 

 
 

検索プラグイン「friendsofcake/search」導入方法時にエラーが発生した!

 
記事の最初に「friendsofcake/search」の導入は簡単でした、と書きましたが、実はエラーが消えなくて延々と悩んでいました。
 
実は、CakePHP3.6以降では少し記述の方法が変更になったのですが、それを分かっておらず、古い記述の方法で書いていたためでした。
 
プラグインの実装の実験などをしている別の環境に、別の記述方法で導入を試してみたらあっさりと動いたため、「この違いはなんなんだ??」と調べていくと、バージョンの違いによって記述の仕方が違う、ということが分かりました。
そんなワケで、CakePHP3に関する記事はなるべく新しい記事を参考にしたほうがいいのかもしれませんね。(そのためには、記事には投稿日時が欠かせませんね。)
 
 
で、そんなこんなで発生したエラーの紹介です。
 

「Custom finder “search” expects search arguments to be nested under key “search” in find() options.」のエラー

 
「friendsofcake/search」を組み込んで動作させると、下記のエラーが発生しました。
Error: [Exception] Custom finder "search" expects search arguments to be nested under key "search" in find() options.
 
私は、TestController.phpの index()アクションの中の処理で下記のように書いていました。
 

 
先に紹介した「$filter」の設定内容を見比べてもらうと分かるのですが、「$filter」に設定する方法が少し変わったようです。
 

 
CakePHPのことをより分かってそうな方が書いているサイトだったのでそれを信じてしまっていましたが、分かったときには「バージョンが古かったんかぁーーいっ!!」という感じでした。
 
 

検索プラグイン「friendsofcake/search」のカスタマイズについて

 
この記事では、CakePHP3の検索プラグイン「friendsofcake/search」を設置して動作させるための基本的な解説を行いました。
記事が長くなりすぎるための実用的なカスタマイズに関しては下記の記事で改めて書いていますので、こちらを参考にしてください。
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
 
 

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で保存前にバリデーション結果を取得する2つの方法
CakePHP3で保存前にバリデーション結果を取得する2つの方法

CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。

CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。

CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説

CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll

主キー(ID)以外のカラムをキーとして更新する方法、updateAllの使い方をサンプルを用いて解説します。

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

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

CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法
CakePHP3の検索プラグイン「friendsofcake/search」の様々な検索の仕方の実装方法

CakePHP3で検索をするプラグイン「friendsofcake/search」の検索条件のカスタマイズ方法の解説。検索項目を増やしたり、以上、以下での検索や、チェックボックスによる検索の方法などを解説。

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

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

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

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

URL短縮サービス「TTTオンライン(https://ttt.onl)」公開
URL短縮サービス「TTTオンライン(https://ttt.onl)」公開

URL短縮サービス「TTTオンライン(https://ttt.onl)」を公開。メールやSNSでは使いにくい長いURLを短いURLに変換するサービス。QRコードも。Google URL Shortenerが2019年3月にサービス終了。