CakePHP2と違い、CakePHP3、CakePHP4では、ページネーションヘルパーのオプションでclass等を指定できなくなっている。
テンプレートと呼ばれるものを使って、どういうHTMLで出力させるかを事前に決めておき、それを全体で使うように設定するか、個別に設定するか、使う直前に設定するなどで対応し、柔軟に対応しつつも、DRYなコードを保つことが出来るらしい。
どこで設定するかはともかく、設定方法として、事前にテンプレートを用意しておくパターンと直書きパターンの2種類がある。
直書きパターン
お忙しい方、考えるのが面倒な方、このページだけどうにかなればいい方は、以下をテンプレートファイルの先頭に書けば、現在のテンプレートの中身の確認と、その場での設定が可能です。
// 現在のテンプレート値を読み込みます 後はdebugとかで$resultの中身みたらテンプレート文字列が見れる
$result = $this->Paginator->getTemplates('number');
// テンプレートを変更します bootstarapのclassを追加してあげた
$this->Paginator->setTemplates([
'number' => '<li class="page-item"><a class="page-link" href="{{url}}">{{text}}</a></li>'
]);
事前にテンプレートを用意しておくパターン
configの中に、適当にphpファイルを作成して、そのファイルの中に、以下のように書いてテンプレートを用意しておきます。今回のファイル名は paginator-templates .phpとする
return [
'number' => '<li class="page-item"><a class="page-link" href="{{url}}">{{text}}</a></li>',
];
んで、AppView.phpのinitializeで、さっき作ったphpのファイル名を指定してあげる。
これですべてのtemplateの中で使える。
// AppView.php の中で
public function initialize()
{
$this->loadHelper('Paginator', ['templates' => 'paginator-templates']);
}
全部のページがこのテンプレートでなくていいとかなら、こんな感じ?
// AppView.php の中で
public function initialize()
{
//indexだけ
if ($this->request->getParam('action') === 'index') {
$this->loadHelper('Paginator', ['templates' => 'paginator-templates']);
}
}
あと、いつものように特定のコントローラーだけで呼び出すなら、ControllerのbeforeRnderで設定する
public function beforeRender(\Cake\Event\EventInterface $event)
{
parent::beforeRender($event);
$this->viewBuilder()->setHelpers(['Paginator'=>['templates' => 'paginator-templates']]);
//4.3からは追加の場合こっちらしい
//$this->viewBuilder()->addHelper('Paginator', ['templates' => 'paginator-templates']);
}
全体にセットしたあとで、コントローラーで違うものを上書きしたいと思って、ヘルパーのドキュメントに、コントローラーから設定をけせる云々書いてあり、以下のコードがあったが、
class PostsController extends AppController
{
public function beforeRender(EventInterface $event)
{
parent::beforeRender($event);
$builder = $this->viewBuilder();
$builder->helpers([
'CustomStuff' => $this->_getCustomStuffConfig(),
]);
}
}
viewBuilderのhelpersがとうの昔に破棄されてて、setHelpersに書き換えて試したが、既に登録済みのを変えようとしてます。みたいなエラーになった。
The “Paginator” alias has already been loaded. The
templates
key has a value of"paginator-templates"
but previously had a value of"paginator-default-templates"
この辺りは出来るかちょっと良く分からず。
デフォルトのテンプレート
ちなみにデフォルトのテンプレートは以下
'nextActive' => '<li class="next"><a rel="next" href="{{url}}">{{text}}</a></li>',
'nextDisabled' => '<li class="next disabled"><a href="" onclick="return false;">{{text}}</a></li>',
'prevActive' => '<li class="prev"><a rel="prev" href="{{url}}">{{text}}</a></li>',
'prevDisabled' => '<li class="prev disabled"><a href="" onclick="return false;">{{text}}</a></li>',
'counterRange' => '{{start}} - {{end}} of {{count}}',
'counterPages' => '{{page}} of {{pages}}',
'first' => '<li class="first"><a href="{{url}}">{{text}}</a></li>',
'last' => '<li class="last"><a href="{{url}}">{{text}}</a></li>',
'number' => '<li><a href="{{url}}">{{text}}</a></li>',
'current' => '<li class="active"><a href="">{{text}}</a></li>',
'ellipsis' => '<li class="ellipsis">…</li>',
'sort' => '<a href="{{url}}">{{text}}</a>',
'sortAsc' => '<a class="asc" href="{{url}}">{{text}}</a>',
'sortDesc' => '<a class="desc" href="{{url}}">{{text}}</a>',
'sortAscLocked' => '<a class="asc locked" href="{{url}}">{{text}}</a>',
'sortDescLocked' => '<a class="desc locked" href="{{url}}">{{text}}</a>',
それぞれが使われるタイミングは
nextActive
next() によって生成されたリンクの有効な状態。nextDisabled
next() の無効な状態。prevActive
prev() によって生成されたリンクの有効な状態。prevDisabled
prev() の無効な状態。counterRange
counter() で format == range の場合のテンプレート。counterPages
counter() で format == pages の場合のテンプレート。first
first() によって生成されたリンクに使用されるテンプレート。last
last() によって生成されたリンクに使用されるテンプレート。number
numbers() によって生成されたリンクに使用されるテンプレート。current
現在のページで使用されているテンプレート。ellipsis
numbers() によって生成された省略記号に使用されるテンプレート。sort
方向のないソートリンクのテンプレート。sortAsc
昇順のソートリンクのテンプレート。sortDesc
降順のソートリンクのテンプレート。
まとめ
デザイナー側で上がってきたページネーションのHTML構造と、ヘルパーの主力する構造が違って、CakePHP2だとなかなか苦労したり、自前でヘルパー作ったりと厄介だったけど、これがあれば仲良くできそうですね。
索引