CodeLab技術ブログ

プログラミング技術まとめ

[CakePHP3]Cake3で検索プラグイン(friendsofcake/search)を使う

CakePHP2でお世話になっているSerchプラグインですが、CakePHP3にもあったので設定方法のメモ

friendsofcake/search というプラグインなのですが、どうも情報がはっきりしない。
説明書の通りにやってもうまくいかず、ネットで情報を調べても書き方がまちまちでよくわからない。

結論としては3.6?あたりで記述方法が変わったらしいですので、その違いも含めて記載します。

バージョン
CakePHP3.7

スポンサードリンク

導入

インストールはcomposer 経由で行うのが楽です。

composer require friendsofcake/search
./bin/cake plugin load Search

これで設定ファイルなども書き換えてくれますので終了です。
古いバージョンでも導入方法は変わらないはずです。

使い方

問題はここから
モデル

use Search\Manager;

class UsersTable extends Table
{
    public function initialize()
    {
        parent::initialize();
        $this->addBehavior("Search.Search");
    }

    public function searchConfiguration()
    {
        $search = new Manager($this);
        $search->value("name");
        return $search;
    }
}

コントローラー

class UsersController extends Controller
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent("Search.Prg",[
            "actions" => ["index"]
        ]);
    }

    public function index()
    {
        $filter = $this->Users->filterParams($this->request->getQuery());
        $query = $this->Users->find("search", $filter);
        $users = $this->paginate($query);
        $this->set(compact("users"));
    }
}

こんな感じだったのですが、

スポンサードリンク
use Search\Manager;

class UsersTable extends Table
{

    public function initialize()
    {
        parent::initialize();
        $this->addBehavior("Search.Search");
        // 1. 初期化時に直接書く場合
        $this->searchManager()
            ->value("name");
    }

    // 2. 別で書く場合
    public function searchManager()
    {
        $searchManager = $this->behaviors()->Search->searchManager();
        $searchManager
            ->useCollection('default')
            ->value('name');
        return $searchManager;
    }
}
class ApplesController extends Controller
{
    public function initialize()
    {
        parent::initialize();
        $this->loadComponent("Search.Prg",[
            "actions" => ["index"]
        ]);
    }

    public function index()
    {
        $this->Users->searchManager();//2の方法の場合は設定用のメソッドを呼ぶ必要がある
        $filter = $this->request->getQuery();
        $query = $this->Users->find("search", [
            'collection'=>'default',
            'search' => $this->request->getQueryParams()
        ]);
        $apples = $this->paginate($query);
        $this->set(compact("users"));
    }
}

こんな感じになります。

大きな違いは以下の通り。
・filterParams()がなくなった
・searchConfiguration()は自動的に呼ばれなくなった

Tableを2の方法で記述した場合はsearchManager()メソッドをどこかで読んであげる必要があります。
裏を返せば、検索用のパラメータを何個でも切り替えて使うことが可能ということです。ただ、useCollection()メソッドを使って検索パターンを複数登録して、呼び出し時に選べる機能もあるようです。
後でめんどくさくならないように、例では記載しています。

また、テンプレートファイルでForm:create()メソッドの後に以下の記載をしないと、Form部品に検索パラメータが初期値として入ってきません

<?php $this->Form->setValueSources('query');?>
スポンサードリンク
スポンサードリンク

コメントは受け付けていません。