エス技研

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の関連記事

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にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 2.x 3.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

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

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

CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座

CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。

CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定

CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。また、エレメントとして分割することでメンテナンス性も向上させる。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可
CakePHP3のプラグイン「CakeDC/Users」を日本語化・翻訳ファイルもダウンロード可

CakePHP3のユーザ管理、ログイン認証プラグインである「CakeDC/Users」のメッセージを日本語にする手順の解説とともに、日本語の翻訳ファイルを提供。ファイルを設置すれば日本語になる!

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

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

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP 2.3 bakeの超初心者向けフォロー講座

CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説

CakePHP3でパンくずの指定方法の解説。2つのヘルパーがあるが簡単なHTMLヘルパーを使った方法を、実際の状況に合わせて3つのパターン(エレメント化、ブロック化)にして解説。

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

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