PHP Paginator with Pager Widget (pure PHP, CI, Yii, Laravel support)
- 
Compatible with pure PHP, Codeigniter, Yii & Laravel 
- 
SOLID principle with Yii 2 pattern like 
- 
Pagination Widget (View Block) included 
// Get count of data set first
$sql = "SELECT count(*) FROM `table`"; 
$count = $conn->query($sql)->fetchColumn(); 
// Initialize a Data Pagination with previous count number
$pagination = new \yidas\data\Pagination([
    'totalCount' => $count,
]);
// Get range data for the current page
$sql = "SELECT * FROM `table` LIMIT {$pagination->offset}, {$pagination->limit}"; 
$sth = $conn->prepare($sql);
$sth->execute();
$data = $sth->fetchAll();$query = $this->db->where('type', 'C');
// Clone same query for get total count
$countQuery = clone $query;
// Get total count from cloned query
// Or you could use count_all_results('', false) to keep query instead of using `clone`
$count = $countQuery->count_all_results();
// Initialize a Data Pagination with previous count number
$pagination = new \yidas\data\Pagination([
    'totalCount' => $count,
]);
// Get range data for the current page
$records = $query
    ->offset($pagination->offset)
    ->limit($pagination->limit)
    ->get()->result_array();<div>
<?=\yidas\widgets\Pagination::widget([
    'pagination' => $pagination
])?>
</div>
$paginationis the object ofyidas\data\Pagination.
This library requires the following:
- PHP 5.4.0+
Run Composer in your project:
composer require yidas/pagination
Then initialize it at the bootstrap of application such as config file:
require __DIR__ . '/vendor/autoload.php';Run Composer in your Codeigniter project under the folder \application:
composer require yidas/pagination
Check Codeigniter application/config/config.php:
$config['composer_autoload'] = TRUE;You could customize the vendor path into
$config['composer_autoload']
The simple config and usage could refer to Demonstration.
When you are dealing with pagination, you could new yidas\data\Pagination with configuration to get pager information for data query. For example:
// Get total rows from your query
$count = $query->count();
// Initialize a Data Pagination
$pagination = new \yidas\data\Pagination([
    'totalCount' => $count,
    'pergpage' => 10,
]);
// ...use $pagination offset/limit info for your queryFor more parameters, you could refer to API Documentation.
You could build your application data Pagination with styles Inherited from yidas\data\Pagination. For example:
namespace yidas\data;
use yidas\data\Pagination as BasePagination;
class Pagination extends BasePagination
{
    // Name of the parameter storing the current page index
    public $pageParam = 'page';
    
    // The number of items per page
    public $perPage = 10;
    
    // Name of the parameter storing the page size
    // false to turn off per-page input by client
    public $perPageParam = false;
}When there are too much data to be displayed on a single page, a common strategy is to display them in multiple pages and on each page only display a small portion of the data. This strategy is known as pagination.
This library uses a yidas\data\Pagination object to represent the information about a pagination scheme. In particular,
- total countspecifies the total number of data items. Note that this is usually much more than the number of data items needed to display on a single page.
- page sizespecifies how many data items each page contains. The default value is 20.
- current pagegives the current page number (not zero-based). The default value is 1, meaning the first page.
With a fully specified yidas\data\Pagination object, you can retrieve and display data partially. For example, if you are fetching data from a database, you can specify the OFFSET and LIMIT clause of the DB query with the corresponding values provided by the pagination. Below is an example:
/**
 * Yii 2 Framework sample code
 */
use yidas\data\Pagination;
// build a DB query to get all articles with status = 1
$query = Article::find()->where(['status' => 1]);
// get the total number of articles (but do not fetch the article data yet)
$count = $query->count();
// create a pagination object with the total count
$pagination = new Pagination(['totalCount' => $count]);
// limit the query using the pagination and retrieve the articles
$articles = $query->offset($pagination->offset)
    ->limit($pagination->limit)
    ->all();To facilitate building the UI element that supports pagination, This library provides the yii\widgets\Pagination widget that displays a list of page buttons upon which users can click to indicate which page of data should be displayed. The widget takes a pagination object so that it knows what is the current page and how many page buttons should be displayed. For example,
use yidas\widgets\Pagination;
echo  Pagination::widget([
    'pagination' => $pagination
]);
$paginationis ayidas\data\Paginationobject for data provider.
The default widget view is for Bootstrap(bootstrap), you could choose a template view for your Pagination Widget:
echo  \yidas\widgets\Pagination::widget([
    'pagination' => $pagination,
    'view' => 'simple',
]);| Template | Description | 
|---|---|
| bootstrap | Default view, supports for Bootstrap 3 and 4 | 
| simple | Simple <div>with<a>tags for pure HTML/CSS style | 
You can also use your customized view for Pagination widget:
echo  \yidas\widgets\Pagination::widget([
    'pagination' => $pagination,
    'view' => __DIR__ . '/../widgets/pagination_view.php',
]);You could build your application Pagination Widget with styles Inherited from yidas\widgets\Pagination. For example:
<?php
namespace app\widgets;
use yidas\widgets\Pagination as BaseWidget;
/**
 * Pagination Widget
 */
class Pagination extends BaseWidget
{
    // Set the Widget pager is center align or not   
    public $alignCenter = false;
    
    // Maximum number of page buttons that can be displayed   
    public $buttonCount = 7;
    // The text label for the "first" page button
    public $firstPageLabel = '<i class="fa fa-step-backward" aria-hidden="true"></i>';
    // The text label for the "last" page button
    public $lastPageLabel = '<i class="fa fa-step-forward" aria-hidden="true"></i>';
    
    // The text label for the "next" page button
    public $nextPageLabel = '<i class="fa fa-caret-right" aria-hidden="true"></i>';
    
    // The text label for the "previous" page button
    public $prevPageLabel = '<i class="fa fa-caret-left" aria-hidden="true"></i>';
    
    // <ul> class. For example, 'pagination-sm' for Bootstrap small size.
    public $ulCssClass = '';
}If you want to build UI element manually, you may use yidas\data\Pagination::createUrl() to create URLs that would lead to different pages. The method requires a page parameter and will create a properly formatted URL containing the page parameter. For example:
// ex. https://yoursite.com/list/
// displays: https://yoursite.com/list/?page=100
echo $pagination->createUrl(100);
// ex. https://yoursite.com/list/?sort=desc&type=a
// displays: https://yoursite.com/list/?sort=desc&type=a&page=101
echo $pagination->createUrl(101);The formatted URL pattern is
//{current-host-uri}{parameters-with-pagination}
You could also build a per-page setting URL for changing per-page when perPageParam is set:
// ex. https://yoursite.com/list/
// displays: https://yoursite.com/list/?page=1&per-page=50
echo $pagination->createUrl(1, 50);$conn = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');
// Get count of data set first
$sql = "SELECT count(*) FROM `table`"; 
$count = $conn->query($sql)->fetchColumn(); 
// Initialize a Data Pagination with previous count number
$pagination = new \yidas\data\Pagination([
    'totalCount' => $count,
]);
// Get range data for the current page
$sql = "SELECT * FROM `table` LIMIT {$pagination->offset}, {$pagination->limit}"; 
$sth = $conn->prepare($sql);
$sth->execute();
$data = $sth->fetchAll();
print_r($data);LinkPager display:
echo yidas\widgets\Pagination::widget([
    'pagination' => $pagination
]);Codeiginter 3 Framework with yidas/codeigniter-model:
$this->load->model('Post_model');
$query = $this->Post_model->find()
    ->where('type', 'C');
    
// Clone same query for get total count
$countQuery = clone $query;
// Get total count from cloned query
// Or you could use count(false) to keep query instead of using `clone`
$count = $countQuery->count();
// Initialize a Data Pagination with previous count number
$pagination = new \yidas\data\Pagination([
    'totalCount' => $count,
]);
// Get range data for the current page
$records = $query
    ->offset($pagination->offset)
    ->limit($pagination->limit)
    ->get()->result_array();LinkPager in view:
<div>
<?=yidas\widgets\Pagination::widget([
    'pagination' => $pagination
])?>
</div>| Public Property | Type | Description | 
|---|---|---|
| $limit | integer | The limit of the data | 
| $offset | integer | The offset of the data | 
| $page | integer | The current page number (zero-based). The default value is 1, meaning the first page. | 
| $pageCount | integer | Number of pages | 
| $pageParam | string | Name of the parameter storing the current page index, default value is page | 
| $perPage | integer | The number of items per page, default value is 20 | 
| $perPageParam | string | Name of the parameter storing the page size, default value is per-page | 
| $perPageLimit | array | The per page number limits. The first array element stands for the minimal page size, and the second the maximal page size, default value is [1, 50] | 
| $params | array | Parameters (name => value) that should be used to obtain the current page number and to create new pagination URLs | 
| $totalCount | integer | Total number of items | 
| $validatePage | boolean | Whether to check if $page is within valid range | 
| Public Property | Type | Description | 
|---|---|---|
| $alignCenter | boolean | Set the Widget pager is center align or not, default value is true | 
| $buttonCount | integer | Maximum number of page buttons that can be displayed, default value is | 
| $pagination | yidas\data\Pagination | The data pagination object that this pager is associated with | 
| $firstPageLabel | string | The text label for the "first" page button, default value is First | 
| $lastPageLabel | string | The text label for the "last" page button, default value is Last | 
| $nextPageLabel | string | The text label for the "next" page button, default value is Next | 
| $prevPageLabel | string | The text label for the "previous" page button, default value is Prev | 
| $firstPageCssClass | string | The CSS class for the "first" page button | 
| $lastPageCssClass | string | The CSS class for the "last" page button | 
| $nextPageCssClass | string | The CSS class for the "next" page button | 
| $prevPageCssClass | string | The CSS class for the "previous" page button | 
| $pageCssClass | string | The CSS class for the each page button, default value is page-item | 
| $ulCssClass | string | The CSS class for the ul element of pagination. For example, 'pagination-sm' for Bootstrap small size. | 
| $linkAttributes | array | HTML attributes for the link in a pager container tag, default value is ['class' => 'page-link'] | 
| $view | string | The view name or absolute file path that can be used to render view. (Template view choices) | 
