適切に設計されたOOPaginator
クラスは、データやデータベースから独立している必要があります。
、、、などcount
のパラメータを取り、適切なを使用してクエリを生成するためのモデル、または適切なHTMLをレンダリングするためのクラスへの依存性注入に使用できるオブジェクトを返す必要があります。page
per_page
LIMIT
PaginationHelper
優れたPaginatorインターフェースの例(これについて10分間考えた場合):
/**
* Your pagination master class
*/
interface iPaginator {
public function __construct($total_count, $count_per_page, $current_page=1);
public function getPaginationLimiter();
public function getPaginationHelper();
// These return iPaginatorPage objects
public function getCurrentPage();
public function getNextPage();
public function getPreviousPage();
public function getTotalCount();
public function getCountPerPage();
public function getPageCount(); // Calculated
}
/**
* Page representation
*/
interface iPaginatorPage {
public function __construct($page_number, $start, $end);
public function getNumber();
public function getStart();
public function getEnd();
public function getCount(); // Calculated
}
/**
* Helper for rendering the UI
*/
interface iPaginationHelper {
public function __construct(iPaginator $paginator);
public function render();
}
ベースモデルを拡張し、アプリケーションモデルにModelではなくPaginatorModelを拡張させることで、モデルに統合する方法の例:
class PaginationModel extends Model {
public function query($sql, iPaginatorPage $page = null) {
if (!empty($page)) {
$start = $page->getStart();
$length = $page->getCount();
$sql .= " LIMIT ({$start}, {$length})";
return parent::query($sql);
}
}
}