YII 工廠模式封裝分頁功能

<?php

namespace common\helper;

use Yii;

class PageHelper {

    static function getPage($dataProvider) {
        $url = Yii::$app->request->getHostInfo() . Yii::$app->request->url;
       // var_dump($url);die;
        $url = preg_replace('/&page=[\d+]*$/', '', $url);
        $url = preg_replace('/\?page=[\d+]*$/', '', $url);
        $page = (int) Yii::$app->request->get('page', 1);
        return PageHelper::pageList($url, $dataProvider->totalCount, $page, $dataProvider->pagination->pageSize);
    }

    /**
     * 分頁
     * @param unknown_type $total
     * @param unknown_type $pageid
     * @param unknown_type $psize
     * @param unknown_type $half
     */
    static function pageList($url, $total, $pageid = 1, $psize = 10, $half = 2, $isHtm = false, $anchor = '', $seo = 0) {
        //echo $pageid;
        $pageData = self::createPageData($url, $total, $pageid, $psize, $half);
        $pageLabelHtml = '';
        $questionMark = $isHtm == false && strpos($url, '?') ? '&' : '?';
        foreach ($pageData as $label) {
            if ($label['status'] == 'enable') {
                if ('<' == $label['page']) {
                    $page = $pageid - 1;
                    $class = 'tonext_on';
                } elseif ('>' == $label['page']) {
                    $page = $pageid + 1;
                    $class = 'tonext_on';
                } else {
                    $page = $label['page'];
                    $class = '';
                }
                if ($isHtm) {
                    if (($page == 1) && ($seo == 1)) { //seo需求,第一頁和默認頁url不一樣,但是內容一致
                        $changeurl = str_replace('-', '', $url);
                        $page = '';
                    } else {
                        $changeurl = $url;
                    }
                    $pageLabelHtml .= '<li><a  class="fy_a ' . $class . '" href="' . $changeurl . $page . '.htm' . $anchor . '">' . $label['page'] . '</a></li>';
                } else {
                    $pageLabelHtml .= '<li><a  class="fy_a ' . $class . '" href="' . $url . $questionMark . 'page=' . $page . $anchor . '">' . $label['page'] . '</a></li>';
                }
            } elseif ($label['status'] == 'disabled') {
                if ('<' == $label['page']) {
                    $pageLabelHtml .='<li class="prev disabled"><span><</span></li>';
                } elseif ('>' == $label['page']) {
                    $pageLabelHtml .='<li class="next disabled"><span>></span></li>';
                } else {
                    $pageLabelHtml .= '<li class="middle disabled"><span>' . $label['page'] . '</span></li>';
                }
            } elseif ($label['status'] == 'current') {
                $pageLabelHtml .= '<li class="active"><span>' . $label['page'] . '</span></li>';
            }
        }
        $pageTotal = ceil($total / $psize); //總共的頁數
        if($pageLabelHtml){
            
            $pageLabelHtml .= '<li><input type="text" id="pagego" class="btn-self btn"  style="width:60px;border: 1px solid #8796b0;border-radius: 3px;" value="' . $pageid . '"  onfocus="goPage()"></li>';
            $pageLabelHtml .= self::getbutton($total,$pageTotal);
        }else{
            $pageLabelHtml .=' 共 '.$pageTotal.' 頁,共計 '.$total.' 條';
        }
        return $pageLabelHtml;
    }

    /**
     * 分頁數據構造
     * Enter description here ...
     * @param unknown_type $url
     * @param unknown_type $total
     * @param unknown_type $pageid
     * @param unknown_type $psize
     * @param unknown_type $half
     */
        static function createPageData($url, $total, &$pageid = 1, $psize = 10, $half = 2) {
        //分頁函數,$total=總共的條數;$pageid=當前顯示的頁號;$psize=每頁顯示的條數;$half=$pageid前後顯示的條數
        $totalpage = ceil($total / $psize); //總共的頁數
        $pageid = $pageid > $totalpage ? $totalpage : $pageid;
        $i = 0;
        $arr = array();
        if ($totalpage < 2) {//小於2頁,不顯示分頁
            return $arr;
        }
        $arr[$i]["page"] = "<";
        $arr[$i]["status"] = $pageid == 1 ? "disabled" : 'enable';
        if($totalpage<=10){
            for ($i=1; $i <=$totalpage ; $i++) {
                 if($pageid==$i){
                    $arr[$i]["page"] = $pageid;
                    $arr[$i]["status"] = "current";
                }else{
                    $arr[$i]["page"] = $i;
                    $arr[$i]["status"] = "enable";
                }
            }
        }else{
            $i++;
            if($pageid>=$totalpage-$half-3){ //左邊顯示省略號  ...
                $arr[$i]["page"] = 1;
                $arr[$i]["status"] = "enable";
                $i++;
                $arr[$i]["page"] = "...";
                $arr[$i]["status"] = "disabled";
                $i++;
                $j=$totalpage-2*$half-3;
                while ($j<=$totalpage) {
                    if($pageid==$j){
                        $arr[$i]["page"] = $j;
                        $arr[$i]["status"] = "current";
                    }else{
                        $arr[$i]["page"] = $j;
                        $arr[$i]["status"] = "enable";
                    }
                    $i++;
                    $j++;
                }
            }
            if($pageid<=$half+3){ //右邊顯示省略號  ...
                while ($i<=2*$half+3) {
                    if($pageid==$i){
                        $arr[$i]["page"] = $pageid;
                        $arr[$i]["status"] = "current";
                    }else{
                        $arr[$i]["page"] = $i;
                        $arr[$i]["status"] = "enable";
                    }
                    $i++;
                }
                $arr[$i]["page"] = "...";
                $arr[$i]["status"] = "disabled";
                $i++;
                $arr[$i]["page"] = $totalpage-1;
                $arr[$i]["status"] = "enable";
                $i++;
                $arr[$i]["page"] = $totalpage;
                $arr[$i]["status"] = "enable";
                $i++;
            }
            if($pageid>$half+3&&$pageid<$totalpage-$half-3){    //倆邊顯示省略號  ...
                $arr[$i]["page"] = 1;
                $arr[$i]["status"] = "enable";
                $i++;
                $arr[$i]["page"] = "...";
                $arr[$i]["status"] = "disabled";
                $i++;
                for ($j = 0; $j < $half; $j++, $i++) {//$pageid前面的[最多$half個]
                    if ($pageid - $half + $j < 2) {//
                        $i--; //使$i保持不變
                        continue;
                    }/**/
                    $arr[$i]["page"] = $pageid - $half + $j;
                    $arr[$i]["status"] = "enable";
                } {//中間項
                    $arr[$i]["page"] = $pageid;
                    $arr[$i]["status"] = "current";
                    $i++;
                }
                for ($j = 0; $j < $half; $j++, $i++) {//$pageid後面的[最多($half-1)個]
                    if ($pageid + $j + 1 > $totalpage) {//
                        $i++;
                        break;
                    }
                    $arr[$i]["page"] = $pageid + $j + 1;
                    $arr[$i]["status"] = "enable";
                }
                $arr[$i]["page"] = "...";
                $arr[$i]["status"] = "disabled";
                $i++;
                $arr[$i]["page"] = $totalpage-1;
                $arr[$i]["status"] = "enable";
                $i++;
                $arr[$i]["page"] = $totalpage;
                $arr[$i]["status"] = "enable";
                $i++;
            }
        }
        $arr[$i]["page"] = ">";
        $arr[$i]["status"] = $pageid == $totalpage ? 'disabled' : "enable";
        return $arr;
    }

    /**
     * 跳轉按鈕 js
     * TODO空格回車直接跳轉
     * @return string
     */
    static function getbutton($total=1,$pageTotal=1) {
        $url = Yii::$app->request->getHostInfo() . Yii::$app->request->url;
        $url = preg_replace('/page=[\d+]*$/', 'page=', $url);
        if (!strpos($url, '?')) {
            $url .= '?page=';
        }
        if (!strpos($url, 'page=')) {
            $url .= '&page=';
        }
        $js = '<script>'
                . ' function goJump(){ var page = document.getElementById("pagego").value; var jumpPage="' . $url . '"+page; window.location.href=jumpPage; } '
                . 'function goPage(){ document.getElementById("pagego").value = ""} '
                . '</script>';
        $button = ' <li> <button type="submit" class="btn btn-info" style="background-color: #50ABFF;" onclick="return goJump()" > 跳轉</button></li>  共 '.$pageTotal.' 頁,共計 '.$total.' 條';
        return $button . $js;
    }

}

?>

//首頁 實例類

 public function actionIndex()
    {
        $searchModel = new DataSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
        $pageLabelHtml = PageHelper::getPage($dataProvider);
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'pageLabelHtml' =>$pageLabelHtml
        ]);
    }

//視圖類

 <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'pager'=> [
            'options'=>['class'=>'hidden']
        ],
        'columns' => [
            'id',
            'name',

            ['class' => 'yii\grid\ActionColumn',
                'header'=>'操作',
                'template' => '{update} {delete}',
            ],
        ],
    ]); ?>
    <ul class="pagination">
        <?=$pageLabelHtml ?>
    </ul>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章