ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP3.2におけるページングページ番号ジャンプ機能の実装と注意点

ThinkPHP3.2におけるページングページ番号ジャンプ機能の実装と注意点

PHPz
PHPzオリジナル
2023-04-17 09:48:54639ブラウズ

最新のインターネット技術の継続的な発展に伴い、Web サイトのアクセス数は増加しており、ユーザーがデータにアクセスしやすくするために、ページング機能は現代の Web サイトに不可欠な機能の 1 つとなっています。 ThinkPHP3.2 フレームワークでは、ページング機能も非常に柔軟で、ページング スタイルやページ番号ジャンプ機能をカスタマイズできます。この記事では、ThinkPHP3.2におけるページングのページ番号ジャンプ機能の実装方法と注意点を紹介します。

1. ThinkPHP3.2 のページング機能

ThinkPHP3.2 フレームワークでは、以下の方法で簡単なページング機能を実装できます:

// 查询数据
$list = M('User')->where($where)->order('id desc')->limit($Page->firstRow.','.$Page->listRows)->select();

// 实例化分页类
$Page = new \Think\Page($count,$pageSize);

// 输出分页html
$this->assign('page',$Page->show());

その内、$listはクエリです。取得されたデータの場合、$where はクエリ条件、$count はクエリ データの総数、$pageSize は各ページに表示されるデータの量です。 \Think\Page クラスをインスタンス化した後、$Page->show() メソッドを通じてページ分割された HTML を出力できます。

2. カスタマイズされたページング スタイル

ThinkPHP3.2 フレームワークでは、次の方法でページング スタイルをカスタマイズできます:

  1. ページング スタイルを定義する

現在のプロジェクトに Page.class.php という名前のファイルを作成し、次のコードをファイルにコピーします:

<?php
namespace Think;
class Page {
    // 定义分页样式
    private $rollPage   = 5; // 分页栏每页显示的页数
    private $lastSuffix = true; // 是否显示最后一页的页码后缀
    private $config     = array(
        &#39;header&#39; => '<span class="rows">共 %TOTAL_ROW% 条记录</span>',
        'prev'   => '<<&#39;,
        &#39;next&#39;   => '>>',
        'first'  => '1...',
        'last'   => '...%TOTAL_PAGE%',
        'theme'  => '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%',
    );
    private $totalRows  = 0; // 总行数
    private $listRows   = 20; // 每页显示行数
    private $totalPages = 0; // 总页数
    private $nowPage    = 1; // 当前页数
    private $firstRow   = 1; // 起始行数
    private $varPage    = 'page'; // 分页变量名
    private $p          = 'p'; // 分页参数名
    private $url        = ''; // 当前链接URL
    private $baseUrl    = ''; // 分页基础URL
    private $params     = array(); // 分页跳转时要带的参数
    private $anchor     = ''; // 锚点参数
    // 构造方法
    public function __construct($totalRows,$listRows='',$p='page'){
        $this->totalRows = $totalRows;
        $this->varPage = $p;
        if (!empty($listRows)) {
            $this->listRows = $listRows;
        }
        $this->totalPages = ceil($this->totalRows/$this->listRows); //总页数
        $this->nowPage    = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
        if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
            $this->nowPage = $this->totalPages;
        }
        $this->firstRow   = $this->listRows*($this->nowPage-1);
    }
    // 显示分页
    public function show($url='') {
        if (0 == $this->totalRows) {
            return '';
        }

        // 记录当前URL
        $this->url = empty($url) ? U(ACTION_NAME).'/' : $url;
        // 获取当前页码
        $this->nowPage    = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
        // 计算分页信息
        $this->totalPages = ceil($this->totalRows/$this->listRows);

        // 分页处理
        if($this->totalPages > $this->rollPage){
            $linkPage = "<ul class=&#39;pagination&#39;>";
            $inum = floor($this->rollPage/2);
            if($this->nowPage <= $inum){
                $this->lastSuffix=false;
            }
            if($this->nowPage > 1){
                $this->addUrl($linkPage,$this->nowPage-1,'上一页','class="prev"');
            }
            for($i = 1; $i <= $this->rollPage; $i++){
                if(($this->nowPage+$inum) >= $this->totalPages && $this->totalPages > $this->rollPage){
                    $page = $this->totalPages-$this->rollPage+$i;
                }else{
                    $page = $this->nowPage-$inum+$i;
                }
                if($page > 0 && $page != $this->nowPage){
                    if($page <= $this->totalPages){
                        $this->addUrl($linkPage,$page,'第'.$page.'页','');
                    }else{
                        break;
                    }
                }else{
                    if($page > 0 && $this->rollPage < $this->totalPages){
                        $this->addUrl($linkPage,$page,'第'.$page.'页','');
                    }
                }
            }
            if($this->nowPage < $this->totalPages){
                $this->addUrl($linkPage,$this->nowPage+1,'下一页','class="next"');
            }
            if($this->lastSuffix){
                $this->addUrl($linkPage,$this->totalPages,'最后一页');
            }
            $linkPage.='</ul>';
        }else{
            $linkPage = "<ul class=&#39;pagination&#39;>";
            for($i=1;$i<=$this->totalPages;$i++){
                if($this->nowPage==$i) {
                    $linkPage.='<li class="active"><span>'.$i.'</span></li>';
                } else {
                    $this->addUrl($linkPage,$i,'第'.$i.'页','');
                }
            }
            $linkPage.='</ul>';
        }
        $pageStr  = str_replace(
            array('%HEADER%','%NOW_PAGE%','%TOTAL_PAGE%','%TOTAL_ROW%','%FIRST%','%UP_PAGE%','%LINK_PAGE%','%DOWN_PAGE%','%END%'),
            array($this->config['header'],$this->nowPage,$this->totalPages,$this->totalRows,$this->config['first'],$this->config['prev'],$linkPage,$this->config['next'],$this->config['last']),$this->config['theme']);
        return $pageStr;
    }
    // 添加分页URL
    protected function addUrl(&$linkPage,$page,$text,$class=''){
        if($page > 0){
            $url = $this->url;
            $url .= strpos($url,'?') ? '&' : '?';
            $url .= $this->p.'='.$page;
            if(!empty($this->params)){
                foreach($this->params as $key=>$val){
                    $url .= '&'.$key.'='.$val;
                }
            }
            if(!empty($this->anchor)){
                $url .= '#'.$this->anchor;
            }
            $linkPage.='<li &#39;.$class.&#39;><a href="&#39;.htmlentities($url).&#39;">'.$text.'</a></li>';
        }
    }
}
  1. カスタム ページング スタイルを使用する

カスタム ページング スタイルをコントローラーに導入し、次の方法で使用します:

// 引入分页类
import("Think.Page");
// 查询数据总数
$count = M('User')->where($where)->count();
// 实例化分页类
$Page = new \Think\Page($count,$pageSize);
// 自定义分页样式
$Page->setConfig('prev', '上一页');
$Page->setConfig('next', '下一页');
$Page->setConfig('first', '第一页');
$Page->setConfig('last', '最后一页');
$Page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%');
// 查询数据
$list = M('User')->where($where)->order('id desc')->limit($Page->firstRow.','.$Page->listRows)->select();
// 输出分页html
$this->assign('page',$Page->show());

3. ページネーション ページ番号ジャンプ関数

ThinkPHP3.2 フレームワークでは、ページング ページ番号がジャンプします。伝達関数は、ページング スタイルで入力ボックスとボタンを追加することで実装されます。ページ番号ジャンプ機能を追加する手順は次のとおりです。

  1. ページング スタイルを変更する

カスタム ページング スタイルに入力ボックスとボタンを追加します:

$Page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% <div class="input-group input-group-sm" style="width: 150px;display:inline;"><input type="text" class="form-control" value="__PAGE__" onkeydown="javascript:if(event.keyCode==13){var page=(this.value|0);location.href=\&#39;__HREF__\&#39;.replace(\&#39;__PAGE__\&#39;,page);return false;}"><span class="input-group-btn"><button class="btn btn-default" onclick="javascript:var page=(this.previousSibling.value|0);location.href=\&#39;__HREF__\&#39;.replace(\&#39;__PAGE__\&#39;,page);return false;">GO!</button></span></div>');
  1. ページング ページ ジャンプ関数を使用する

ビュー ファイルで、カスタマイズされたページング スタイルを直接使用して、ページ ジャンプ関数を実装できます。

<div class="pagination">
    <?php echo $page;?>
</div>

このうち、カスタム ページング スタイルでは、現在のページ番号とジャンプ リンクをそれぞれ「__PAGE__」と「__HREF__」を使用します。入力ボックスにジャンプページ番号を入力し、ボタンをクリックするとそのページ番号にジャンプします。

概要

ThinkPHP3.2 フレームワークでは、ページングのページ番号ジャンプ機能は、ページング スタイルに入力ボックスとボタンを追加することで実装できます。カスタム ページング スタイルを使用すると、ページング スタイルをより美しくすることができ、より具体的なページングのニーズにも対応できます。

以上がThinkPHP3.2におけるページングページ番号ジャンプ機能の実装と注意点の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。