225 lines
5.9 KiB
PHP
225 lines
5.9 KiB
PHP
<?php
|
|
class Pagination {
|
|
var $php_self;
|
|
var $rows_per_page = 10; //Number of records to display per page
|
|
var $total_rows = 0; //Total number of rows returned by the query
|
|
var $links_per_page = 5; //Number of links to display per page
|
|
var $append = ""; //Paremeters to append to pagination links
|
|
var $sql = "";
|
|
var $debug = false;
|
|
var $conn = false;
|
|
var $page = 1;
|
|
var $max_pages = 0;
|
|
var $offset = 0;
|
|
var $jen;
|
|
/**
|
|
* Constructor
|
|
*
|
|
* @param resource $connection Mysql connection link
|
|
* @param string $sql SQL query to paginate. Example : SELECT * FROM users
|
|
* @param integer $rows_per_page Number of records to display per page. Defaults to 10
|
|
* @param integer $links_per_page Number of links to display per page. Defaults to 5
|
|
* @param string $append Parameters to be appended to pagination links
|
|
*/
|
|
|
|
function __construct($connection, $sql, $rows_per_page = 10, $links_per_page = 5, $append = "", $current_page) {
|
|
$this->conn = $connection;
|
|
$this->sql = $sql;
|
|
$this->rows_per_page = (int)$rows_per_page;
|
|
if(intval($links_per_page) > 0) {
|
|
$this->links_per_page = (int)$links_per_page;
|
|
}
|
|
else {
|
|
$this->links_per_page = 5;
|
|
}
|
|
$this->append = $append;
|
|
|
|
$this->php_self = $current_page . $append ."&";
|
|
if(isset($_GET['page'])) {
|
|
$this->page = intval($_GET['page']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Executes the SQL query and initializes internal variables
|
|
*
|
|
* @access public
|
|
* @return resource
|
|
*/
|
|
function paginate() {
|
|
global $logger;
|
|
//Check for valid mysql connection
|
|
if(!$this->conn || !is_object($this->conn)) {
|
|
if($this->debug) $logger->addInfo("Connection missing");
|
|
return false;
|
|
}
|
|
|
|
//Find total number of rows
|
|
$all_rs = $this->conn->query($this->sql);
|
|
if(!$all_rs) {
|
|
if($this->debug) $logger->addInfo("SQL query failed. Check your query.<br /><br />Error Returned: ".$this->conn->error);
|
|
return false;
|
|
}
|
|
$this->total_rows = $all_rs->numRows();
|
|
// $this->conn->close();
|
|
|
|
//Max number of pages
|
|
$this->max_pages = ceil($this->total_rows/$this->rows_per_page);
|
|
if($this->links_per_page > $this->max_pages) {
|
|
$this->links_per_page = $this->max_pages;
|
|
}
|
|
|
|
//Check the page value just in case someone is trying to input an aribitrary value
|
|
if($this->page > $this->max_pages || $this->page <= 0) {
|
|
$this->page = 1;
|
|
}
|
|
|
|
//Calculate Offset
|
|
$this->offset = $this->rows_per_page * ($this->page-1);
|
|
|
|
//Fetch the required result set
|
|
if(_DBTYPE_ == 'mysqli') {
|
|
$this->sql .= " LIMIT {$this->offset}, {$this->rows_per_page}";
|
|
}
|
|
elseif(_DBTYPE_ == 'postgre') {
|
|
$this->sql .= " LIMIT {$this->rows_per_page} OFFSET {$this->offset}";
|
|
}
|
|
$rs = $this->conn->query($this->sql);
|
|
if(!$rs) {
|
|
if($this->debug) $logger->addInfo("Pagination query failed. Check your query.<br /><br />Error Returned: ".$this->conn->error);
|
|
return false;
|
|
}
|
|
return $rs;
|
|
}
|
|
|
|
/**
|
|
* Display the link to the first page
|
|
*
|
|
* @access public
|
|
* @param string $tag Text string to be displayed as the link. Defaults to 'First'
|
|
* @return string
|
|
*/
|
|
function renderFirst($tag='Awal') {
|
|
if($this->page == 1) {
|
|
return '<a class="page-link" href="#">'.$tag.'</a>';
|
|
}
|
|
else {
|
|
|
|
return '<a class="page-link" href="'.$this->php_self.'page=1">'.$tag.'</a>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the link to the last page
|
|
*
|
|
* @access public
|
|
* @param string $tag Text string to be displayed as the link. Defaults to 'Last'
|
|
* @return string
|
|
*/
|
|
function renderLast($tag='Akhir') {
|
|
if($this->page == $this->max_pages) {
|
|
return '<a class="page-link" href="#">'.$tag.'</a>';
|
|
}
|
|
else {
|
|
|
|
return '<a class="page-link" href="'.$this->php_self.'page='.$this->max_pages.'">'.$tag.'</a>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the next link
|
|
*
|
|
* @access public
|
|
* @param string $tag Text string to be displayed as the link. Defaults to '>>'
|
|
* @return string
|
|
*/
|
|
function renderNext($tag=' Lanjut ') {
|
|
if($this->page < $this->max_pages) {
|
|
|
|
return '<a class="page-link" href="'.$this->php_self.'page='.($this->page+1).'">'.$tag.'</a>';
|
|
}
|
|
else {
|
|
return '<a class="page-link" href="#">'.$tag.'</a>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the previous link
|
|
*
|
|
* @access public
|
|
* @param string $tag Text string to be displayed as the link. Defaults to '<<'
|
|
* @return string
|
|
*/
|
|
function renderPrev($tag=' Kembali ') {
|
|
if($this->page > 1) {
|
|
|
|
return '<a class="page-link" href="'.$this->php_self.'page='.($this->page-1).'">'.$tag.'</a>';
|
|
}
|
|
else {
|
|
return '<a class="page-link" href="#">'.$tag.'</a>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the page links
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
function renderNav() {
|
|
$batch = @ceil($this->page/$this->links_per_page);
|
|
$end = $batch * $this->links_per_page;
|
|
if($end == $this->page) {
|
|
//$end = $end + $this->links_per_page - 1;
|
|
//$end = $end + ceil($this->links_per_page/2);
|
|
}
|
|
if($end > $this->max_pages) {
|
|
$end = $this->max_pages;
|
|
}
|
|
$start = $end - $this->links_per_page + 1;
|
|
$links = '';
|
|
|
|
for( $i=$start ; $i <= $end ; $i++) {
|
|
if($i == $this->page) {
|
|
$links .= '<li class="page-item active"> <a class="page-link" href="'.$this->php_self.'page='.$i.'">'.$i.'</a> </li>';
|
|
}
|
|
else {
|
|
|
|
$links .= '<li class="page-item"> <a class="page-link" href="'.$this->php_self.'page='.$i.'">'.$i.'</a> </li>';
|
|
}
|
|
}
|
|
|
|
return $links;
|
|
}
|
|
|
|
/**
|
|
* Display full pagination navigation
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
function renderFullNav() {
|
|
return '<nav aria-label="Page navigation">
|
|
<ul class="pagination justify-content-center">
|
|
<li class="page-item">'.$this->renderFirst().'</li>
|
|
<li class="page-item">'.$this->renderPrev().'</li>
|
|
'.$this->renderNav().'
|
|
<li class="page-item">'.$this->renderNext().'</li>
|
|
<li class="page-item">'.$this->renderLast().'</li>
|
|
</ul>
|
|
</nav>';
|
|
}
|
|
|
|
/**
|
|
* Set debug mode
|
|
*
|
|
* @access public
|
|
* @param bool $debug Set to TRUE to enable debug messages
|
|
* @return void
|
|
*/
|
|
function setDebug($debug) {
|
|
$this->debug = $debug;
|
|
}
|
|
}
|
|
?>
|