本ページではXoops Cube の機能(ページナビゲータ)について説明します。
1. ページナビゲータの作成
ページナビゲータを作ろう
ページナビゲータとは、画像のように前後ページへ移動可能にしてくれる機能です。
本画像の例では、テーブルデータが10個まで表示していますが、10個以上表示データがある場合に
リンクを押下することで、次のデータが表示されていきます。
<?php if(!defined('XOOPS_ROOT_PATH')) exit(); require_once XOOPS_ROOT_PATH.'/core/XCube_PageNavigator.class.php'; class sample2PageNavi { var $_Criteria = null; var $_Handler = null; var $Navi = null; var $_Pagenum = null; var $_Url = null; var $_Total = 0; function sample2PageNavi(&$handler, $pagenum, $url, $criteria=null) { $this->_Handler = $handler; if(is_object($criteria)){ $this->_Criteria = & $criteria; } else { $this->_Criteria = new CriteriaCompo(); } $this->_Pagenum = $pagenum; $this->_Url = $url; } function addSort($sort, $order='ASC') { $this->_Criteria->setSort($sort, $order); } function addCriteria($criteria) { $this->_Criteria->add($criteria); } function getTotalItem(&$total) { $total = $this->_Total; } function fetch() { $this->_Total = $this->_Handler->getCount($this->_Criteria); $this->Navi = new XCube_PageNavigator($this->_Url); $this->Navi->mGetTotalItems->add(array(&$this, 'getTotalItem')); $this->Navi->setPerpage($this->_Pagenum); $this->Navi->fetch(); } function getCriteria() { $this->_Criteria->setStart($this->Navi->getStart()); $this->_Criteria->setLimit($this->Navi->getPerpage()); return $this->_Criteria; } }
以下にコードの説明をします。
まず、本ファイルはページナビゲータの機能を持つクラスを作成するために追加しました。
3行目は、 XCube_PageNavigator.class.php ファイルを require_once することで、ページナビゲータ機能を使用可能にしています。
6行目の、 sample2PageNavi(&$handler, $pagenum, $url, $criteria=null) でコンストラクタの第四引数の $criteria=null
となっていますが、これはこの関数を呼ぶ場合に省略可能なことを示しています。省略した場合には、第4引数には null が入ります。
そのためこの関数をコールする場合は sample2PageNavi(&$handler, $pagenum, $url) でも、 sample2PageNavi(&$handler, $pagenum, $url, $criteria) でも呼ぶことは可能です。
第1引数の $handler はデータベースへ接続可能なハンドラオブジェクトを指定します。
第2引数の $pagenum はページ辺りに表示するデータ数を指定します。
第3引数の $url はページナビゲータを使用するURLを指定します。
各引数の使用方法については、「indexAction.class.php」の中で例示します。
30行目の addSort() はデータベースからデータを取得する際のソート設定を設定しにいきます。第1引数の $sort には、ソートするテーブルフィールド名を
第2引数の $order はソートする方法を指定します。デフォルトは「ASC」となっており、昇順の指定です。「DESC」を指定すると降順の指定になります。
40行目の getTotalItem() はデータベースのテーブルに保存されている総データ数を取得する関数です。
この関数は get関数(取得関数) にも関わらず、 return されておらず、 戻り値 がありません。これは第1引数が &$total となり、 参照型 になっているため、
引数に値を設定することで呼び元の変数に値が設定されるため、戻り値がないが get関数 となっています。
45行目の fetch() でページナビゲータ機能に各値を設定登録しています。
47行目の $this->_Handler->getCount($this->_Criteria); で、テーブルデータ総数をこのクラスの変数に設定しています。
48行目の new XCube_PageNavigator($this->_Url); で、ページナビゲータを使用するURLを設定したオブジェクトを作成します
49行目の $this->Navi->mGetTotalItems->add(array(&$this, 'getTotalItem')); で、ページナビゲータにトータル数を取得する時の関数を登録しています。
50行目の $this->Navi->setPerpage($this->_Pagenum); で、1ページ辺りに表示するデータ数をページナビゲータに設定しています。
51行目の $this->Navi->fetch(); をコールすることで、ページナビゲータの設定を完了します。
54行目の getCriteria() は、ページナビゲータを使用する際に呼び元から呼ばれるためにある関数です。
テーブルデータ取得時の条件が取得出来ます。
<?php if (!defined('XOOPS_ROOT_PATH')) exit(); require '../../mainfile.php'; require_once './class/sample2Form.class.php'; require_once './class/sample2PageNavi.class.php'; class indexAction extends Sample2_Abstract { function indexAction() { } function executeView(&$render) { $root =& XCube_Root::getSingleton(); $select = null; $id_array = array(); $data_array = array(); $dataflg = false; $errflg = false; $modhand = & xoops_getmodulehandler('data'); $form = new sample2Form(); if(!empty($_GET['select'])) { $select = $_GET['select']; $form->prepare($select); $form->fetch(); $form->validate(); if(!$form->hasError()) { if($select === "add") { // 追加処理 $str = $_GET['str']; $modobj = & $modhand->create(); $modobj->assignVar('data',$str); $modhand->insert($modobj, true); } elseif($select === "del") { // 削除処理 $id = $_GET['id']; $mCriteria = new CriteriaCompo(); $mCriteria->add(new Criteria('id',$id,'=','','')); $modobj = $modhand->getObjects($mCriteria); if(!empty($modobj)) $modhand->delete($modobj[0], true); } } } /* ページナビ */ $pagenv = new sample2PageNavi($modhand, 10, 'index.php'); $pagenv->addSort('id'); $pagenv->fetch(); // データベースにあるレコード数を取得する $pagenv->getTotalItem($cnt); if($cnt != 0) { $dataflg = true; // テーブルデータの取得 $modobj = & $modhand->getObjects($pagenv->getCriteria()); reset($modobj); while(list($key, $mod) = each($modobj)) { // 全レコードのIDとデータを取得する $id_array[] = $mod->get('id'); $data_array[] = $mod->get('data'); } } $render->setTemplateName('sample2.html'); $render->setAttribute('DFLG', $dataflg); $render->setAttribute('CNT', $cnt); $render->setAttribute('ID', $id_array); $render->setAttribute('DATA', $data_array); $render->setAttribute('ACTION_FORM', $form); $render->setAttribute('PAGENV', $pagenv->Navi); } }
以下に変更コードの説明をします。
今回の変更は、6、60〜63行目の追加、66、71行目の取得方法変更、及び88行目の追加です。
6行目は、新規に追加したファイル内容を読み込むために required しています。
60行目からページナビゲータの処理を追加しています。
61行目の $pagenv = new sample2PageNavi($modhand, 10, 'index.php'); で、ページナビゲートのオブジェクトを作成しています。
62行目の $pagenv->addSort('id'); で、データベースの取得時のソートの方法を設定しています。この場合はテーブルフィールドの id を 昇順 で取得しろという設定です。
63行目の $$pagenv->fetch(); で、ページナビゲータの各種設定登録をしにいってます。
66行目の $pagenv->getTotalItem($cnt); は $cnt = $modhand->getCount(); を変更したものです。取得の方法が今回作成したクラスからの取得に変更しています。
71行目の $modobj = & $modhand->getObjects($pagenv->getCriteria()); でページナビゲータに設定してある条件からテーブルデータを取得するように変更しています。
元は $modobj = $modhand->getObjects(); で引数無しで、無条件で全てのデータを取得していました。
88行目の、 $render->setAttribute('PAGENV', $pagenv->Navi); はHTMLファイルに記載されたページナビゲータ用のSmartyの変数にオブジェクトを設定しています。
sample2Form.class.phpのprepare()の中を変更する。
function validateStr() { if ( !preg_match("/^[a-zA-Z0-9]+$/i", $this->get('str')) ) { $this->addErrorMessage('半角英数のみ入力できます'); } }
以下に修正コードの説明をします。
今回の変更は関数の中の判定内容及び表示メッセージを修正しました。
3行目の判定内容で半角英数のみ入力されているか検査しています。
4行目は入力文字列が半角英数で無い場合のエラーメッセージの内容です。
<div>データベースにあるレコード数は<{$CNT}></div> <{if $DFLG}> レコードに存在するIDは以下の通り。 <div class="pagenavi"><{xoops_pagenavi pagenavi=$PAGENV}></div> <table> <tr> <td>ID 番号</td> <td>データ内容</td> </tr> <{section name=num loop=$CNT}> <tr> <td><{$ID[num]}></td> <td><{$DATA[num]}></td> </tr> <{/section}> </table> <div class="pagenavi"><{xoops_pagenavi pagenavi=$PAGENV}></div> <{else}> 現在レコードはありません。 <{/if}> <br> <{if $ACTION_FORM->hasError()}> <ul> <{foreach item=errval from=$ACTION_FORM->getErrorMessages()}> <li><{$errval}></li> <{/foreach}> </ul> <{/if}> <form method="get" action="index.php"> <input type="radio" name="select" value="add">データを追加する</input> <input type="radio" name="select" value="del">データを削除する</input> <br> 文字列を入力して下さい。<{xoops_input name=str value=$ACTION_FORM->get('str')}> <br> 削除するIDを入力して下さい。<{xoops_input name=id value=$ACTION_FORM->get('id')}> <br> <button type="submit" name="send" >送信</button> </form>
以下に修正コードの説明をします。
今回の変更は5、18行目を追加しました。
5、18行目を追加することで、テーブルの上下にページナビゲータが表示されるように追加しました。
以上でXoops Cube の機能(ページナビゲータ)の紹介を終了します。お疲れ様でした。