CakePHP4のPaginatorで生成したページングURLを変更する方法
2023年10月11日2023年10月11日
CakePHP4ではページング機能を簡単に実装できるようにPaginator機能が準備されています。
Paginator機能は、簡単に設定ができ非常に便利なのですが、routesの設定でカスタム要素を使用した場合、適したURLを生成してくれません。
そこでCakePHP4のPaginatorで生成したページングURLを変更する方法を紹介します。
現象
当ブログでもPaginator機能を使用しているのですが、routesでカスタム要素を使っているページがあります。
~/config/routes.php
$builder->connect("/categories/{id_str}", ['controller' => "Categories", 'action' => 'articles']);
SEOを意識してURLにカテゴリの文字列を指定するようにしています。
しかし、カスタム要素を使用することでPaginatorが生成するURLが意図しないURLで出力されます。
// frameworkカテゴリであれば下記のように出力したい
/categories/framework?page=2
// 実際出力されるリンク
<ul class="pagination ">
<li class="page-item page-prev disabled"><a class="page-link" href="">前へ</a></li>
<li class="page-item active"><a class="page-link" href="/categories/article">1</a></li>
<li class="page-item"><a class="page-link" href="/categories/article?page=2">2</a></li>
<li class="page-item page-next"><a class="page-link" href="/categories/article?page=2">次へ</a></li>
</ul>
意図しないURLになってしまう理由として、カスタム要素「id_str」に値を設定してないからです。
PaginatorのURLを指定するには
Paginatorが出力するURLを意図したいURLに変更したい場合はtemplateファイル側に下記のように指定します。
<?php
/**
*
* @var \App\View\AppView $this
*/
$this->Paginator->options(['url' => ["id_str" => $category->id_str]])
?>
<ul class="pagination ">
<?= $this->Paginator->prev('前へ') ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next('次へ') ?>
</ul>
Paginatorヘルパーにオプションを設定できるようになっています。オプションの引数のURLを定義することでURLを変更することができます。
<ul class="pagination ">
<li class="page-item page-prev disabled"><a class="page-link" href="">前へ</a></li>
<li class="page-item active"><a class="page-link" href="/categories/framework">1</a></li>
<li class="page-item"><a class="page-link" href="/categories/framework?page=2">2</a></li>
<li class="page-item page-next"><a class="page-link" href="/categories/framework?page=2">次へ</a></li>
</ul>
公式リファレンスサイトにもPaginatorヘルパーにオプションの使い方が紹介されているので詳細は公式サイトで確認してください。
最後に
CakePHP4のPaginatorで生成したページングURLを変更する方法を紹介しました。
ページング機能はデータの件数が足りなくて確認漏れとか発生するので、カスタム要素を使っているページでページングする際は注意が必要です。
ちなみに当ブログはサーチコンソールのエラー検知で気付きましたm(__)m
コメント
コメントを残す