PHPCMS 的分页核心逻辑依赖于其内置的 pages 函数,这个函数会根据查询到的数据总数和每页显示数量,生成一个包含上一页、下一页、页码等链接的 HTML 字符串。

phpcms 图片模板 分页
(图片来源网络,侵删)

整个过程可以分为以下几个步骤:


第一步:后台内容模型与栏目设置

在制作模板之前,必须确保后台的模型和栏目已经正确配置。

  1. 模型

    • 登录 PHPCMS 后台,进入 -> 内容模型管理
    • 新建一个模型,例如叫“图片集”,在这个模型中,你需要添加一个字段来存储图片路径,比如字段名为 pic,类型为“图片”。
  2. 创建栏目

    phpcms 图片模板 分页
    (图片来源网络,侵删)
    • 进入 -> 栏目管理
    • 新建一个栏目,例如叫“图片展示”。
    • 关键点:在创建栏目时,内容模型 要选择你刚刚创建的“图片集”模型。
    • 列表模板:在这里指定你将要创建的模板文件名,image_list.html
    • 列表条数:设置每页显示多少条内容,10
    • 在“图片展示”栏目下,添加几条内容,填写你创建的 pic 字段,上传图片。

第二步:创建模板文件

在你的模板目录(通常是 phpcms/templates/你的默认模板/)下,创建一个名为 image_list.html 的文件。

这个模板文件通常包含三个部分:

  1. 循环输出列表内容:使用 {loop} 标签遍历从数据库中查询到的数据。
  2. 调用分页:使用 {$pages} 变量输出分页链接。
  3. 必要的 PHP 代码:在模板文件开头,使用 {php} 标签引入分页所需的类并执行查询。

下面是一个完整的 image_list.html 模板文件示例:

phpcms 图片模板 分页
(图片来源网络,侵删)
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">{if isset($SEO['title']) && $SEO['title']}{$SEO['title']}{/if}{$SEO['site_title']}</title>
    <meta name="keywords" content="{if isset($SEO['keyword']) && $SEO['keyword']}{$SEO['keyword']}{/if}{$SEO['site_keyword']}" />
    <meta name="description" content="{if isset($SEO['description']) && $SEO['description']}{$SEO['description']}{/if}{$SEO['site_description']}" />
</head>
<body>
<h1>图片列表</h1>
<!-- 循环输出列表内容 -->
{loop $data $r}
    <div class="item">
        <!-- 
            这里调用你模型中定义的 'pic' 字段。
            $r['pic'] 会得到图片路径,如 'uploads/images/2025/10/xxx.jpg'
        -->
        <img src="{$r['pic']}" alt="{$r['title']}">
        <p>{$r['title']}</p>
    </div>
{/loop}
<!-- 分页链接 -->
<div class="page">
    {$pages}
</div>
</body>
</html>

第三步:编写 PHP 代码(核心部分)

PHPCMS 的模板引擎不能直接执行复杂的数据库查询和分页逻辑,我们需要在模板文件的开头使用 {php} 标签来编写 PHP 代码,完成以下任务:

  1. 引入分页类。
  2. 获取当前栏目 ID。
  3. 获取当前页码。
  4. 构建数据库查询条件。
  5. 执行查询,获取数据总数和当前页数据。
  6. 将数据传递给模板引擎进行循环。

将以下代码放在 image_list.html 文件的 最顶端<html> 标签之前。

{php
    // 1. 引入分页类
    pc_base::load_app_class('page', 'content', 0);
    // 2. 获取当前栏目ID和每页显示条数
    // $_bclassid 是当前栏目的ID,在栏目列表页中可用
    // $_GET['pagesize'] 可以从后台栏目设置中获取,这里我们直接写死或用变量获取
    $catid = $_bclassid; 
    $pagesize = 10; // 最好能从后台设置中读取,这里为了方便直接写死
    // 3. 获取当前页码
    $page = isset($_GET['page']) ? intval($_GET['page']) : 1;
    // 4. 构建查询条件
    // 这里假设你的模型ID是1,请根据你的实际情况修改
    // modelid可以在后台内容模型管理中看到
    $modelid = 1; 
    // 获取栏目信息,用于确定模型ID和排序方式等
    $category = get_cat($catid);
    if (!$category) {
        showmessage('栏目不存在');
    }
    // 确保模型ID正确
    if ($category['modelid'] != $modelid) {
        // 如果模型不匹配,可以调整或报错
        // showmessage('模型ID不匹配');
    }
    // 5. 实例化数据模型并执行查询
    // 'content' 是内容模型的数据表前缀,通常不用改
    $db = pc_base::load_model('content_model');
    // 构建where条件,这里只查询当前栏目下的内容,并且状态为99(已审核)
    // 'posid' 和 'status' 是PHPCMS内容模型的常用字段
    $where = "catid = '$catid' AND status = 99";
    // 获取总数据条数
    $total = $db->count($where);
    // 实例化分页类
    $page_obj = new page($total, $pagesize, $page, 'url');
    // 获取分页链接
    $pages = $page_obj->show();
    // 获取当前页的数据
    // order_by 根据你的需求排序,比如按发布时间降序
    $data = $db->select($where, '*', $page_obj->firstRow, $page_obj->listRows, 'id DESC');
    // 6. 将数据和分页变量传递给模板
    // $data 将在 {loop} 标签中使用
    // $pages 将在 {$pages} 变量中使用
}

代码详解:

  • pc_base::load_app_class('page', 'content', 0);: 加载 PHPCMS 内置的分页类。
  • $_bclassid: 这是 PHPCMS 模板中的一个全局变量,代表当前栏目的 ID,在列表页模板中可以直接使用。
  • $pagesize: 每页显示的条数,为了灵活性,最好能从后台栏目的“列表条数”设置中读取,但直接写死在这里最简单。
  • $page: 获取 URL 中的 page 参数,表示当前是第几页。
  • get_cat($catid): PHPCS 内置函数,根据栏目 ID 获取栏目的详细信息,包括模型 ID 等。
  • pc_base::load_model('content_model');: 加载内容模型的数据操作类。
  • $db->count($where): 查询符合条件的数据总数。
  • new page(...): 初始化分页对象,需要传入总数、每页条数和当前页码。
  • $page_obj->show(): 生成完整的分页 HTML 代码。
  • $db->select(...): 执行查询,获取当前页的数据。
    • $where: 查询条件,这里我们只查询当前栏目 (catid) 和已审核 (status) 的内容。
    • $page_obj->firstRow: 当前页数据的起始位置。
    • $page_obj->listRows: 每页显示的条数。
    • 'id DESC': 按ID降序排列,你也可以按其他字段如 inputtime DESC (按发布时间降序)。
  • {$data}{$pages}: 在 {php} 代码块中定义的变量,会自动传递给模板引擎,供后面的模板代码使用。

第四步:样式调整

你会发现,{$pages} 生成的分页链接样式可能比较朴素,你可以通过 CSS 来美化它,PHPCMS 默认会生成类似这样的 HTML:

<div class="page">
    <a href="/index.php?m=content&c=index&a=lists&catid=1&page=1">首页</a>
    <a href="/index.php?m=content&c=index&a=lists&catid=1&page=1">上一页</a>
    <strong>1</strong>
    <a href="/index.php?m=content&c=index&a=lists&catid=1&page=2">2</a>
    <a href="/index.php?m=content&c=index&a=lists&catid=1&page=3">3</a>
    ...
    <a href="/index.php?m=content&c=index&a=lists&catid=1&page=2">下一页</a>
    <a href="/index.php?m=content&c=index&a=lists&catid=1&page=10">尾页</a>
</div>

你可以在你的 CSS 文件中添加如下样式来美化它:

.page {
    margin: 20px 0;
    text-align: center;
}
.page a, .page strong {
    margin: 0 5px;
    padding: 5px 10px;
    border: 1px solid #ddd;
    text-decoration: none;
    color: #333;
}
.page a:hover {
    background-color: #f0f0f0;
}
.page strong {
    background-color: #007bff;
    color: #fff;
    border-color: #007bff;
}

实现 PHPCMS 图片模板分页的核心流程是:

  1. 后台配置:创建模型、栏目,并设置好“列表条数”和“列表模板”。
  2. 模板文件:创建 .html 文件,使用 {loop} 循环输出数据,用 {$pages} 显示分页。
  3. PHP 逻辑:在模板文件顶部用 {php} 标签引入分页类,获取参数,执行数据库查询,并将数据和分页信息传递给模板。
  4. CSS 美化:为分页链接添加 CSS 样式,使其更美观。

按照这个步骤,你就可以成功地在 PHPCMS 中实现一个功能完整的图片列表分页了。