[CakePHP4] PaginatorHelperのテンプレート

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">&hellip;</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だとなかなか苦労したり、自前でヘルパー作ったりと厄介だったけど、これがあれば仲良くできそうですね。

索引

https://book.cakephp.org/4/ja/views/helpers/paginator.html

https://book.cakephp.org/4/ja/views/helpers.html

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>