CodeIgniter4のページャー機能からVueでカスタマイズしやすいデータを送る
この記事は2022/09/30に作成されました。
データを一覧表示させるときにページャーを配置する機会は多いと思います。
弊社ではCodeIgniter(以降CI4)というPHPフレームワークを使用していますが、その中ではページャーを作ってくれる機能があります。
公式の使い方ではViewファイル内で$pager->links();
などを使ってHTMLが組みあがった状態で出力されます。
これだとVueファイルなどで使用するときにカスタマイズがしにくいです。
CI4のページャー機能を利用しながら、Vue側でカスタマイズしやすい方法を紹介していきたいと思います。
CI4でカスタムのテンプレートを使用できるようにする
まずは、CI4でページャーを用意していきます。
Viewファイル内、$pager->links(グループ名,テンプレート)
でページャーを出力できますが、最後の引数の指定がないとフレームワークが用意したデフォルトのテンプレートを使用してしまいます。
なので追加のテンプレートを作成・設定していきます。
app/Config/Pager.php
に以下のようにテンプレートを追加
public $templates = [
'default_full' => 'CodeIgniter\Pager\Views\default_full',
'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
'custom_full' => 'App\Views\Pagers\custom_full',//追加
];
ここまででカスタムのテンプレートを使えるようになったので実際にviewを作成していきます。
テンプレートViewを作成
フロント側で組み立てたいので、PHPで出力されている変数だけまとめてJSONで送ります。
以下が実際のテンプレートです。
<?php
use CodeIgniter\Pager\PagerRenderer;
//現在のページリンクの両側にいくつのリンクを表示するかを指定
$pager->setSurroundCount(2);
//現在のページの前側に表示できるリンクが他にもあるかどうか
$hasPrevious = ($pager->hasPrevious()) ? 1 : 0;
//---------- first ----------
//$getFirstPageNumber = $pager->getFirstPageNumber();//メソッドは存在するがページナンバーが正しくないためコメントアウト
$getFirst = $pager->getFirst();//最初ページへのリンク
//正しいと思われるuriを分析してpage=の部分を取得する
$firstPageComponents = parse_url($getFirst);
parse_str($firstPageComponents['query'], $firstPageResults);
$getFirstPageNumber = $firstPageResults['page'];//最初ページのページ番号
$langPagerFirst = lang('Pager.first');//最初ページの文言
//---------- ----------
//---------- previous ----------
$getPreviousPageNumber = $pager->getPreviousPageNumber();//前ページのページ番号
$getPrevious = $pager->getPrevious();//前ページへのリンク
$langPagerPrevious = lang('Pager.previous');//前ページの文言
//---------- ----------
$pagerLinks = $pager->links();//すべての番号付きリンクに関するデータの配列
//---------- next ----------
$hasNext = ($pager->hasNext()) ? 1 : 0;
$getNextPageNumber = $pager->getNextPageNumber();
$getNext = $pager->getNext();
$langPagerNext = lang('Pager.next');
//---------- ----------
//---------- last ----------
//$getLastPageNumber = $pager->getLastPageNumber();//メソッドは存在するがページナンバーが正しくないためコメントアウト
$getLast = $pager->getLast();//最後ページへのリンク
//正しいと思われるuriを分析してpage=の部分を取得する
$lastPageComponents = parse_url($getLast);
parse_str($lastPageComponents['query'], $lastPageResults);
$getLastPageNumber = $lastPageResults['page'];//最後ページのページ番号
$langPagerLast = lang('Pager.last');//最後ページの文言
//---------- ----------
$getCurrentPageNumber = $pager->getCurrentPageNumber();//現在のページ番号
$jsonData = compact(
'hasPrevious',//現在のページの前側に表示できるリンクが他にもあるかどうか
'getFirstPageNumber',//最初ページのページ番号
'getFirst',//最初ページへのリンク
'langPagerFirst',//最初ページの文言
'getPreviousPageNumber',//前ページのページ番号
'getPrevious',//前ページへのリンク
'langPagerPrevious',//前ページの文言
'pagerLinks',//すべての番号付きリンクに関するデータの配列
'hasNext',//現在のページの後側に表示できるリンクが他にもあるかどうか
'getNextPageNumber',//前ページのページ番号
'getNext',//最初ページへのリンク
'langPagerNext',//前ページの文言
'getLastPageNumber',//最後ページのページ番号
'getLast',//最後ページへのリンク
'langPagerLast',//最後ページの文言
'getCurrentPageNumber',//現在のページ番号
);
echo json_encode($jsonData); ?>
使う上で最低限見る部分は、以下のコメントで変数の説明を行っている箇所になります。
最初へ遷移するときのリンクを例にすると。
hasPreviousで前ページ・最初ページへのボタンの有無を分岐。
getFirstをaタグのhrefに設定、getFirstPageNumberをjs側に送るdata属性に設定、ボタンに表示する文言はlangPagerFirstを設定。このように自分の作ったページャーパーツに各項目を設定してください。
$jsonData = compact(
'hasPrevious',//現在のページの前側に表示できるリンクが他にもあるかどうか
'getFirstPageNumber',//最初ページのページ番号
'getFirst',//最初ページへのリンク
'langPagerFirst',//最初ページの文言
'getPreviousPageNumber',//前ページのページ番号
'getPrevious',//前ページへのリンク
'langPagerPrevious',//前ページの文言
'pagerLinks',//すべての番号付きリンクに関するデータの配列
'hasNext',//現在のページの後側に表示できるリンクが他にもあるかどうか
'getNextPageNumber',//前ページのページ番号
'getNext',//最初ページへのリンク
'langPagerNext',//前ページの文言
'getLastPageNumber',//最後ページのページ番号
'getLast',//最後ページへのリンク
'langPagerLast',//最後ページの文言
'getCurrentPageNumber',//現在のページ番号
);
Viewでの実装は完了です。
次にVueファイルのtemplate内での使い方を軽く紹介。
Vueファイルで使ってみる
<template>
<template v-if="pagerObj.hasPrevious">
<li>
<a :href="pagerObj.getFirst" :aria-label="pagerObj.langPagerFirst" aria-hidden="true"><
span dLead">{{ pagerObj.langPagerFirst }}</span>
</a>
</li>
<li>
<a href="pagerObj.getPrevious" aria-label="pagerObj.langPagerPrevious" aria-hidden="true">
<span dPove">{{ pagerObj.langPagerPrevious }}</span></a></li>
</template>
</template>
JSONをデコードして取得したオブジェクトがpagerObjです。
最初と前の要素の部分だけですがこのように組み込めます。
ページャーに関係ありませんが、v-ifをtemplateタグに記述すると無駄にdivで囲まなくてもよくなるので便利です。
まとめ
Vueを使用するとフロントエンドの役割が増えます。
バックエンド側でもフロントで使いやすいデータを送る必要がありますね。
以上になります、ありがとうございました。
プログラマー/K.D