一般的な PHP 開発では、php コードと html コードが混在する場合、ページネーションの処理は比較的簡単で、関数の形式で構築することもできます。最近の開発ではPear::DB + Smartyの構造を使用していたので、テンプレートをページ分割することを検討しました。ページを直接操作できないため、ページング文字列を生成することを検討しました。
クラスライブラリ→PHP呼び出し→テンプレートの3層構造になっているため、データ処理はすべてクラスライブラリ内で行われるため、ページング制御はPHP呼び出し内で行われ、テンプレートは複雑に解析します。通話の結果。 PHP 呼び出しのページング コードを直接見てみましょう:
-------------------------------------- - --------------------------------------
<?php
/**
* ファイル: Type.php
* 機能: カテゴリーごとに書籍を表示します
* 著者:ヘイエルレン
**/
//クラス ライブラリなどの公開ファイルが含まれます。
require_once("include.php");
// 操作オブジェクトをインスタンス化します。
$Type = new CTypes()
//ページごとのレコード数
define("PAGE_SIZE", 10);
//GETで送信された変数を取得します。
$TypeID = $tid ? $tid : intval($_REQUEST['tid']);
//書籍の総数
$BookTotal = $Type->getBookTotal($TypeID);
/* ページング表示コア*/
// 総ページ数を取得する
$pageCount = ($BookTotal/PAGE_SIZE);
// 現在のページ番号
if (isset($_GET[ページ]) && !empty($_GET[ページ])) {
$page = intval($_GET[ページ]);
} それ以外 {
$ページ = 1;
}
if ($page==1) {
$startNum = 0;
} それ以外 {
$startNum = ($page-1) * PAGE_SIZE;
}
//ページングリンク文字列を生成する
if ($page==1 && $pageCount>1) {
$pageStr = "前のページ | <a href=/Type.php?tid=".$TypeID."&page=".($page+1).">次のページ</a>";
elseif ($page==$pageCount && $pageCount>1) {
$pageStr = "<a href=/Type.php?tid=".$TypeID."&page=".($page-1).">前のページ</a> | 次のページ";
elseif ($page>1 && $page<=$pageCount) {
$pageStr = "<a href=/Type.php?tid=".$TypeID."&page=".($page-1).">前のページ</a> |
<a href=/Type.php?tid=".$TypeID."&page=".($page+1).">次のページ</a>";
} それ以外 {
$pageStr = "前のページ | 次のページ";
}
//ページ数に応じて現在のレコードを取得します
$allBook = $Type->getBookFromType($TypeID, $start=$startNum, $offset=PAGE_SIZE);
//Smarty 変数の割り当て
$tpl->assign('BookTotal', $BookTotal);
$tpl->assign('allBook', $allBook);
$tpl->assign('pageStr', $pageStr);
(
'Type.html')
;
-------------------------------------------------- ----------------------------------
より明確に理解できるように、クラス ライブラリの基本的な内容を簡単に説明します。(コードは不完全です)
-------------------------------------------------- ----------------------------------
<?php
/**
* ファイル: Type.class.php
* 機能: 型処理クラス
* www.knowsky.com
* 著者:ヘイエルレン
**/
クラスタイプ
{
var $mDsn;
var $mTableName;
var $hPearDB
//コンストラクター
関数タイプ()
{
//...
}
//pear DBクラスのハンドルメソッドを取得
関数 _getDBClass($fetchMode = DB_FETCHMODE_ASSOC)
{
if(!is_object($this->hPearDB)){
$this->hPearDB = DB::connect($this->mDsn);
$this->hPearDB->query("set names 'utf8'");
$this->hPearDB->setFetchMode($fetchMode);
if(DB::IsError($this->hPearDB)){
false を返します。
}
}
$this->hPearDB を返します。
}
//本の総数を取得する
関数 getBookTotal($TypeId)
{
$db = $this->_getDBClass();
$sql = "SELECT COUNT(*) AS total FROM ...";
$rs = $db->getOne($sql);
if (DB::isError($rs))
$rs->getMessage() を返します。
それ以外
$rs を返します。
}
//すべての書籍を取得します
function getBookFromType($TypeId, $start, $offset)
{
$db = $this->_getDBClass();
$sql = "SELECT * FROM ... LIMIT $start,$offset";
$rs = $db->getAll($sql);
if (DB::isError($rs))
$rs->getMessage() を返します。
それ以外
$rs を返します。
}
}
?>
-------------------------------------------------- ----------------------------------
最後に、この Type.html テンプレートがどのように処理されるかを見てみましょう。
-------------------------------------------------- ----------------------------------
{*ヘッダー ファイルを挿入*}
{include file="Cendar/head.html"}
<div id="サイド">
<ul>
<li>書籍の合計数: {$BookTotal}</li>
</ul>
</div>
<div id="本">
<h2 class="cata">本の具体的な内容</h2>
<ul>
{セクション名=ブックループ=$allBook}
<li><a href="show_Book.php?tid={$allBook[Book].id}">{$allBook[Book].title}</a></li>
{セクション以外}
<li class="warning">現在書籍はありません</li>
{/セクション}
</ul>
</div>
{* ページネーション文字列表示*}
<div align="right">
{"GBK"|iconv:"utf-8":$pageStr}
</div>
{* 一番下のファイルを挿入*}
{include file="Cendar/foot.html"}
-------------------------------------------------- ----------------------------------
次に、キーポイントを理解して、PHP プログラムから $pagStr をページング文字列として制御できることがわかり、最後にテンプレート ファイル内で $pagStr が置き換えられて効果が得られます。
この時点で、テンプレートでページング処理を実行する方法は基本的に理解できました。もちろん、ページング関数を関数として記述したり、どこでも呼び出せるようにクラスにカプセル化することもできます。はぁ~~~
(上記コードの無断転載はご遠慮ください)
作者: heiyeluren
日付:2005-8-2