Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
25 / 25 |
CRAP | |
100.00% |
125 / 125 |
| Pager | |
100.00% |
1 / 1 |
|
100.00% |
25 / 25 |
52 | |
100.00% |
125 / 125 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
5 / 5 |
|||
| getCurrentPageNo | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| setCurrentPageNo | |
100.00% |
1 / 1 |
2 | |
100.00% |
6 / 6 |
|||
| setLimit | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getTotalNums | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| setTotalNums | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getLimit | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getOffset | |
100.00% |
1 / 1 |
1 | |
100.00% |
4 / 4 |
|||
| getTotalPageNums | |
100.00% |
1 / 1 |
4 | |
100.00% |
8 / 8 |
|||
| getPages | |
100.00% |
1 / 1 |
16 | |
100.00% |
47 / 47 |
|||
| getPagesAsArray | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
| getCurrentPage | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getCurrentPageAsArray | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getNextPage | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
| getNextPageAsArray | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
| getPrevPage | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
| getPrevPageAsArray | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
| getFirstPage | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| getFirstPageAsArray | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getLastPage | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| getLastPageAsArray | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| isFirst | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
| isLast | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
| getStartItemNo | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getLastItemNo | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
| <?php | |
| namespace Puyo\Pager; | |
| use \Puyo\Pager\Page as Page; | |
| /** | |
| * ページャ | |
| * | |
| * 使用例: | |
| * 【コントローラ】 | |
| * // インスタンス生成(カレントページを表すGETパラメタ,表示件数,コントローラ) | |
| * $pager = new Pager($_GET['page'], $limit, $_SERVER['REQUEST_URI']); | |
| * | |
| * 【モデル】 | |
| * // "SQL_CALC_FOUND_ROWS"を付けてSQL文を実行 | |
| * // SELECTと同時に,LIMITを指定しない場合の全件数がカウントされる | |
| * $sql = "SELECT SQL_CALC_FOUND_ROWS a, b, c "; | |
| * $sql.= "FROM t_hoge"; | |
| * $sql.= "ORDER BY a "; | |
| * $sql.= "LIMIT = " . $pager -> getLimit() . " "; | |
| * $sql.= "OFFSET = " . $pager -> getOffset() . " "; | |
| * $rs = SQLを実行($sql); | |
| * | |
| * // "SQL_CALC_FOUND_ROWS"でカウントした件数を取得 | |
| * $sql = "SELECT found_rows() rows"; | |
| * $numOfRows = mysql_query($sql, $db); | |
| * | |
| * // ページャに全件数を設定 | |
| * $pager -> setTotalItems($numOfRows[0]['rows']); | |
| * | |
| * 【コントローラ】 | |
| * // Smartyテンプレートにassign | |
| * $smarty -> assign('records', $rs); // 抽出したレコード | |
| * $smarty -> assign('pager', $pager); // ページャ | |
| * | |
| * 【ビュー】 | |
| * {assign var="firstPage" value=$pager->getFirstPage()} | |
| * {assign var="prevPage" value=$pager->getPreviousPage()} | |
| * {assign var="nextPage" value=$pager->getNextPage()} | |
| * {assign var="lastPage" value=$pager->getLastPage()} | |
| * | |
| * {if $pager->isFirst()} | |
| * 最初 | |
| * {else} | |
| * <a href="{$firstPage.url}">最初</a> | |
| * {/if} | |
| * | |
| * {if $prevPage} | |
| * <a href="{$prevPage.url}">前</a> | |
| * {else} | |
| * 前 | |
| * {/if} | |
| * | |
| * {foreach from=$pager->getPages() item=page} | |
| * {if $page.pageNo == $pager->getCurrentPageNo()} | |
| * {$page.pageNo} | |
| * {else} | |
| * <a href="{$page.url}">{$page.pageNo}</a> | |
| * {/if} | |
| * {/foreach} | |
| * | |
| * | |
| * {if $nextPage} | |
| * <a href="{$nextPage.url}">次</a> | |
| * {else} | |
| * 次 | |
| * {/if} | |
| * | |
| * {if $pager->isLast()} | |
| * 最後 | |
| * {else} | |
| * <a href="{$lastPage.url}">最後</a> | |
| * {/if} | |
| * | |
| * @author y.kushida | |
| * @version 0.1 R54 | |
| */ | |
| class Pager | |
| { | |
| /** | |
| * カレントページ | |
| * @var integer | |
| */ | |
| private $currentPageNo; | |
| /** | |
| * ページ内件数 | |
| * @var integer | |
| */ | |
| private $perPage; | |
| /** | |
| * 全レコード数 | |
| * @var integer | |
| */ | |
| private $totalItems = 0; | |
| /** | |
| * 表示するページ数 | |
| * @var int | |
| */ | |
| private $visiblePages = 5; | |
| /** | |
| * コントローラのファイル名/path | |
| * @var string | |
| */ | |
| private $controllerURI; | |
| /** | |
| * ページ番号を表すパラメータの名前 | |
| * @var string | |
| */ | |
| private $paramName = "page"; | |
| /** | |
| * コンストラクタ | |
| * | |
| * @param int $currentPageNo カレントページ番号.デフォルト1 | |
| * @param int $perPage ページ内表示件数.デフォルト10件 | |
| * @param string $controllerURI 送信先 | |
| * @param string $paramName (optional) ページ番号を表すパラメタの名前.デフォルトpage | |
| */ | |
| public function __construct($currentPageNo=1, $perPage=10, $controllerURI=null, $paramName="page") { | |
| $this->setCurrentPageNo($currentPageNo); | |
| $this->perPage = $perPage; | |
| $this->controllerURI = $controllerURI; | |
| $this->paramName = $paramName; | |
| } | |
| /** | |
| * カレントのページ番号を返す | |
| * @return int ページ番号 | |
| */ | |
| public function getCurrentPageNo() { | |
| return (int)$this->currentPageNo; | |
| } | |
| /** | |
| * カレントページ番号を設定する | |
| * @param int $pageNo | |
| */ | |
| public function setCurrentPageNo($pageNo) { | |
| $pageNo = intVal($pageNo); | |
| if($pageNo < 1) { | |
| $pageNo = 1; | |
| } | |
| $this->currentPageNo = $pageNo; | |
| } | |
| /** | |
| * ページ内件数を設定する | |
| * @param int $perPage | |
| */ | |
| public function setLimit($perPage) { | |
| $this->perPage = intVal($perPage); | |
| } | |
| /** | |
| * 全レコード数を返す | |
| */ | |
| public function getTotalNums() { | |
| return $this->totalItems; | |
| } | |
| /** | |
| * 全レコード数を設定する | |
| * @param int $totalNums | |
| */ | |
| public function setTotalNums($totalNums) { | |
| $this->totalItems = $totalNums; | |
| } | |
| /** | |
| * ページ内件数を返す. | |
| * @return int ページ内件数 | |
| */ | |
| public function getLimit() { | |
| return (int)$this->perPage; | |
| } | |
| /** | |
| * オフセットを返す. | |
| * @return int オフセット | |
| */ | |
| public function getOffset() { | |
| $currentPageNo = $this->currentPageNo; | |
| $perPage = $this->getLimit(); | |
| $offset = $perPage * ($currentPageNo - 1); | |
| return $offset; | |
| } | |
| /** | |
| * 全ページ数を返す | |
| * @return int 全ページ数 | |
| */ | |
| public function getTotalPageNums() { | |
| $totalPages = null; | |
| $totalItems = $this->totalItems; | |
| $perPage = $this->perPage; | |
| if($totalItems === 0 || $perPage === 0) { | |
| return 0; | |
| } | |
| $totalPages = floor($totalItems / $perPage); | |
| // 全件数/ページ内件数で余りが出れば+1ページ | |
| $totalPages += ($totalItems % $perPage != 0) ? 1 : 0; | |
| return (int)$totalPages; | |
| } | |
| /** | |
| * ページリストを返す | |
| * @param int $visiblePages ページングナビのページ番号の数 | |
| * @return Page[] | |
| */ | |
| public function getPages($visiblePages=null) { | |
| if(!isset($visiblePages)) { | |
| $visiblePages = $this->visiblePages; | |
| } | |
| $totalPages = $this->getTotalPageNums(); | |
| $currentPageNo = $this->currentPageNo; | |
| // カレントページのチェック | |
| if($currentPageNo > $totalPages) { | |
| $currentPageNo = $this->currentPageNo = $totalPages; | |
| } | |
| $startDiff = null; | |
| $endDiff = null; | |
| // 表示する先頭のページ番号を求める(中心に来るように) | |
| $half = floor($visiblePages / 2); | |
| // 頭のチェック | |
| $startPageNo = $currentPageNo; | |
| for($i = 0; $i < $half; $i++) { | |
| if($startPageNo <= 1) { | |
| break; | |
| } | |
| $startPageNo--; | |
| } | |
| if($startPageNo > $currentPageNo - $half) { // 途中で先頭ページ出現 | |
| $startDiff = $startPageNo - ($currentPageNo - $visiblePages); //差分 | |
| } | |
| // おしりのチェック | |
| $endPageNo = $currentPageNo; | |
| for($i = 0; $i < $half; $i++) { | |
| if($endPageNo >= $totalPages) { | |
| break; | |
| } | |
| $endPageNo++; | |
| } | |
| if($endPageNo < $currentPageNo + $half) { // 途中で最終ページ出現 | |
| $endDiff = ($currentPageNo + $half) - $endPageNo; // 差分 | |
| } | |
| // 差分の調整 | |
| for($i = 0; $i < $startDiff; $i++) { | |
| if($endPageNo >= $totalPages) { | |
| break; | |
| } | |
| $endPageNo++; | |
| } | |
| for($i = 0; $i < $endDiff; $i++) { | |
| if($startPageNo <= 1) { | |
| break; | |
| } | |
| $startPageNo--; | |
| } | |
| // ページなし | |
| if($totalPages < 1) { | |
| return array(); | |
| } | |
| $result = []; | |
| for($i = 0; $i < $visiblePages && $startPageNo <= $endPageNo; $i++) { | |
| $result[] = new Page($startPageNo, $this->controllerURI, $this->paramName); | |
| $startPageNo++; | |
| } | |
| return $result; | |
| } | |
| public function getPagesAsArray($visiblePages=null) { | |
| $arrPages = array(); | |
| foreach($this->getPages($visiblePages) as $page) { | |
| $arrPages[] = $page->toArray(); | |
| } | |
| return $arrPages; | |
| } | |
| /** | |
| * カレントページを返す | |
| * @return Page カレントページ | |
| */ | |
| public function getCurrentPage() { | |
| $page = new Page($this->currentPageNo, $this->controllerURI, $this->paramName); | |
| return $page; | |
| } | |
| /** | |
| * カレントページを配列で返す | |
| * @return array カレントページ | |
| */ | |
| public function getCurrentPageAsArray() { | |
| $page = $this->getCurrentPage(); | |
| return $page->toArray(); | |
| } | |
| /** | |
| * 次ページを返す. | |
| * 次ページがない場合はNullを返す. | |
| * @return \Puyo\Pager\Page 次ページ | |
| */ | |
| public function getNextPage() { | |
| $pageNo = $this->currentPageNo + 1; | |
| if($pageNo > $this->getTotalPageNums()) { | |
| return null; | |
| } | |
| $page = new Page($pageNo, $this->controllerURI, $this->paramName); | |
| return $page; | |
| } | |
| /** | |
| * 次ページを配列で返す. | |
| * 次ページがない場合はNullを返す. | |
| * @return array|null 次ページ | |
| */ | |
| public function getNextPageAsArray() { | |
| $page = $this->getNextPage(); | |
| if($page === null) { | |
| return null; | |
| } | |
| return $page->toArray(); | |
| } | |
| /** | |
| * 前ページを返す. | |
| * 前ページがない場合はNullを返す. | |
| * @return Page 前ページ | |
| */ | |
| public function getPrevPage() { | |
| $pageNo = $this->currentPageNo - 1; | |
| if($pageNo < 1) { | |
| return null; | |
| } | |
| $page = new Page($pageNo, $this->controllerURI, $this->paramName); | |
| return $page; | |
| } | |
| public function getPrevPageAsArray() { | |
| $page = $this->getPrevPage(); | |
| if($page === null) { | |
| return null; | |
| } | |
| return $page->toArray(); | |
| } | |
| /** | |
| * 先頭ページを返す. | |
| * @return Page 先頭ページ | |
| */ | |
| public function getFirstPage() { | |
| $pageNo = 1; | |
| $page = new Page($pageNo, $this->controllerURI, $this->paramName); | |
| return $page; | |
| } | |
| public function getFirstPageAsArray() { | |
| return $this->getFirstPage()->toArray(); | |
| } | |
| /** | |
| * 最終ページを返す | |
| * @return Page 最終ページ | |
| */ | |
| public function getLastPage() { | |
| $pageNo = $this->getTotalPageNums(); | |
| $page = new Page($pageNo, $this->controllerURI, $this->paramName); | |
| return $page; | |
| } | |
| public function getLastPageAsArray() { | |
| return $this->getLastPage()->toArray(); | |
| } | |
| /** | |
| * カレントページが先頭ページであるか否かを返す | |
| * @return bool 先頭ページであるか否か | |
| */ | |
| public function isFirst() { | |
| if($this->currentPageNo == 1) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| } | |
| /** | |
| * カレントページが最終ページであるか否かを返す | |
| * @return bool 最終ページであるか否か | |
| */ | |
| public function isLast() { | |
| if($this->currentPageNo == $this->getTotalPageNums()) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| } | |
| /** | |
| * 表示中のアイテムが何件目からかを返す(Smarty Template用) | |
| * @return int 何件目か | |
| */ | |
| public function getStartItemNo() { | |
| $start = (((($this->currentPageNo) - 1) * ($this->perPage)) + 1); | |
| return $start; | |
| } | |
| /** | |
| * 表示中のアイテムが何件目までかを返す(Smarty Template用) | |
| * @return int 何件目か | |
| */ | |
| public function getLastItemNo() { | |
| if($this->isLast()) { | |
| $end = $this->totalItems; | |
| } else { | |
| $end = (($this->currentPageNo) * ($this->perPage)); | |
| } | |
| return $end; | |
| } | |
| } |