🍣

検索機能とソート機能をつけよう

2024/02/11に公開

定番ですね
ユーザー側管理側それぞれ実装していこう
まずコントローラーから

PostsController.php
// showメソッドに追加する
// 管理側はindexメソッドに
$query = $this->Posts->find();

// 検索クエリを取得
$search = trim($this->request->getQuery('q', ''));

if (!empty($search)) {
    // 検索クエリでフィルタリング
    $query->where([
        'OR' => [
            'Posts.title LIKE' => '%' . $search . '%',
            'Posts.body LIKE' => '%' . $search . '%',
        ]
    ]);
} else {
    // 空の検索クエリに対する処理を書く
    // 今回は特に何もせず全投稿を表示するため特に記載しない(else自体不要)
}

 $posts = $this->paginate($query);

ヘッダーに検索フォームを追加する

header.php
<!-- 検索フォームの追加 -->
<li class="nav-item my-auto">
    <?= $this->Form->create(null, ['type' => 'get', 'url' => ['controller' => 'Posts', 'action' => 'show'], 'class' => 'd-flex']) ?>
        <?= $this->Form->text('q', ['class' => 'form-control form-control-sm me-2', 'placeholder' => 'Search', 'aria-label' => 'Search']) ?>
        <?= $this->Form->button(__('Go'), ['class' => 'btn btn-outline-success btn-sm']) ?>
    <?= $this->Form->end() ?>
</li>

ほんとはAppControler.phpに処理書いてbakeコマンド改造してデフォルトでそれぞれのコントローラのindexメソッドに検索用のクラスを呼ぶ記載があるようにした方がいいんだろうな

PostsController.php
$this->paginate = [
    'contain' => ['Categories'],
    'limit' => 10,
    'order' => [
        'Posts.created' => 'desc'
    ]
];

ソートはメソッドにこれを入れるだけで出来た

Discussion