>  기사  >  PHP 프레임워크  >  ThinkPHP3.2의 페이징 페이지 번호 점프 기능 구현 및 주의사항

ThinkPHP3.2의 페이징 페이지 번호 점프 기능 구현 및 주의사항

PHPz
PHPz원래의
2023-04-17 09:48:54639검색

현대 인터넷 기술의 지속적인 발전으로 인해 사용자의 데이터 접근을 용이하게 하기 위해 페이징 기능은 현대 웹사이트의 필수 기능 중 하나가 되었습니다. 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는 각 페이지에 표시되는 데이터의 양입니다. ThinkPage 클래스를 인스턴스화한 후 $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. 페이징 페이지 점프 기능 사용

In 보기 파일, 사용자 정의 페이징 스타일을 직접 사용하고 페이지 번호 점프 기능을 구현할 수 있습니다:

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

그 중 사용자 정의 페이징 스타일에서는 "__PAGE__" 및 "__HREF__"를 사용하여 각각 현재 페이지 번호와 점프 링크를 나타냅니다. . 입력란에 점프 페이지 번호를 입력하고 버튼을 클릭하면 해당 페이지 번호로 이동합니다.

요약

ThinkPHP3.2 프레임워크에서는 페이징 스타일에 입력 상자와 버튼을 추가하여 페이징 페이지 점프 기능을 구현할 수 있습니다. 사용자 정의 페이징 스타일을 사용하면 페이징 스타일을 더욱 아름답게 만들 수 있으며 보다 구체적인 페이징 요구 사항을 충족할 수도 있습니다.

위 내용은 ThinkPHP3.2의 페이징 페이지 번호 점프 기능 구현 및 주의사항의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.