エス技研

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.

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

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

  関連記事

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

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

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

CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。

CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で複数項目を入力した場合の AND検索、OR検索についての解説です。

CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説

入力された値によってバリデーション(入力チェック)の内容を切り替える。その処理をCakePHPで実装する方法を解説。条件ごとに unset関数を使ってバリデーションを削除する、という方法を採る。

CakePHP3ログファイルの出力方法・$this->log()の解説
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説

コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。

CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法

コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!

CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力

CakePHPの Modelや Controllerの変数の中身をログとして出力して見る方法を提供します。

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

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

CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。

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

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