dede模板标签arclist实现分页

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 DEDE建站 正文

这是一个非常经典且实用的需求,因为 arclist 标签本身不直接支持自动分页,官方提供的 list 标签(用于列表页)是自带分页功能的,但 arclist 通常用于首页、栏目页等调用少量内容,如果要用它来展示一个需要分页的列表,就需要一些技巧。

dede模板标签arclist实现分页
(图片来源网络,侵删)

核心思路

实现 arclist 分页的核心思路是:

  1. 手动编写分页SQL:不使用 arclist 标签自带的 limit 属性,而是通过一个独立的自定义SQL查询来获取当前页的数据。
  2. 手动获取总记录数:再写一个SQL查询(或使用 GetTotalArc() 函数)来获取满足条件的文章总数,这是生成分页导航的基础。
  3. 手动生成分页导航:使用DedeCMS内置的 分页函数(``)来生成上一页、下一页、页码等链接。
  4. 结合使用:将分页数据列表和分页导航组合在一起,形成一个完整的分页效果。

详细步骤实现

假设我们要在首页调用一个特定的“产品”栏目(ID=3)下的文章,并实现每页5条记录的分页效果。

第1步:准备模板文件

在你的首页模板文件 index.htm 中,找到你想要放置分页列表的位置,我们将使用 {dede:arclist} 的兄弟标签 {dede:sql}{dede:pagelist} 来完成。

第2步:编写获取分页数据的SQL

这部分代码负责查询当前页应该显示的文章内容。

dede模板标签arclist实现分页
(图片来源网络,侵删)
<!-- 获取分页数据列表 -->
{dede:sql sql="
    SELECT 
        id, 
        typeid, 
        arcrank, 
        click, 
        title, 
        litpic, 
        pubdate, 
        description 
    FROM `dede_archives` 
    WHERE 
        typeid IN (3) 
        AND arcrank = 0 
    ORDER BY 
        id DESC 
    LIMIT [page], 5
"}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:sql}

代码解释:

  • SELECT ... FROM dede_archives:指定查询的字段和主表。dede_archives 是DedeCMS存储文章基本信息的表。
  • WHERE typeid IN (3) AND arcrank = 0:这是你的查询条件。
    • typeid IN (3):只调用栏目ID为3的文章,如果你要调用多个栏目,可以写成 typeid IN (3, 4, 5)
    • arcrank = 0:只显示已审核通过的文章,可以去掉这个条件以包含所有状态的文章。
  • ORDER BY id DESC:按文章ID降序排列,即最新的在最前面。
  • LIMIT [page], 5:这是分页的关键。
    • 5 是每页显示的条数。
    • [page] 是一个占位符,它本身没有值,我们需要在PHP代码中计算出当前页的起始位置,然后替换掉这个 [page]

第3步:获取总记录数并生成分页导航

这部分代码负责计算总页数,并生成页码链接。

<!-- 获取总记录数 -->
{dede:sql sql="SELECT COUNT(*) AS `total` FROM `dede_archives` WHERE typeid IN (3) AND arcrank = 0"}
    {dede:getvar name='total' /}
{/dede:sql}
<!-- 生成分页导航 -->
<div class="dede_pages">
    <ul>
        {dede:pagelist listsize="4" listitem="info,index,end,pre,next,pageno"}
            <li><a href='{dede:field name='phpurl'/}/plus/list.php?tid=[field:tid/]' class='thisclass'>[field:page/]</a></li>
        {/dede:pagelist}
    </ul>
</div>

代码解释:

  • 第一个 {dede:sql}COUNT(*) 用于计算满足条件的总记录数,我们将结果通过 {dede:getvar} 标签存入一个名为 total 的变量中。
  • 第二个 {dede:pagelist}:这是DedeCMS的分页标签,但它需要一个 totalresult 参数(总记录数)和 listsize 等参数才能工作。问题在于,{dede:pagelist} 无法直接获取到上面 total 变量的值。

我们需要一个更灵活的方法,通常是结合PHP代码来实现。

dede模板标签arclist实现分页
(图片来源网络,侵删)

推荐方案:结合PHP代码实现(最稳定)

这是最常用且最可靠的方法,它将上述步骤整合到一个PHP代码块中,解决了变量传递的问题。

在你的模板文件中,使用 {dede:php}

<!-- 使用PHP代码实现arclist分页 -->
{dede:php}
    // 1. 定义变量
    $typeid = 3; // 要调用的栏目ID
    $pagesize = 5; // 每页显示条数
    // 2. 获取当前页码
    $page = isset($_GET['page']) && is_numeric($_GET['page']) ? intval($_GET['page']) : 1;
    $start = ($page - 1) * $pagesize;
    // 3. 获取总记录数
    $count_query = "SELECT COUNT(*) AS total FROM `dede_archives` WHERE typeid = $typeid AND arcrank = 0";
    $row = $dsql->GetOne($count_query);
    $totalcount = $row['total'];
    // 4. 获取分页数据
    $sql = "SELECT id, typeid, arcrank, click, title, litpic, pubdate, description 
            FROM `dede_archives` 
            WHERE typeid = $typeid AND arcrank = 0 
            ORDER BY id DESC 
            LIMIT $start, $pagesize";
    $dlist = new DedeTagParse();
    $dlist->SetNameSpace('field', '[', ']');
    $dlist->LoadSource($sql);
    if(is_array($dlist->CTags)){
        foreach($dlist->CTags as $k=>$ctag){
            $ids[] = $ctag->Get('id');
        }
    }
    // 5. 使用arcID列表获取完整文章信息(包含标题、URL等)
    $arcids = join(',', $ids);
    $innertext = "
        <li>
            <a href='[field:arcurl/]'>[field:title/]</a>
            <span>[field:pubdate function=\"MyDate('Y-m-d',@mydate)\"]</span>
        </li>
    ";
    $artlist = '';
    if($arcids != ''){
        $artlist = GetImgs($arcids, $innertext, 0, 0);
    }
    // 6. 输出文章列表
    echo $artlist;
    // 7. 生成分页导航
    $totalpage = ceil($totalcount / $pagesize);
    // 分页导航样式
    $page_list = '';
    // 上一页
    if($page > 1){
        $page_list .= "<a href='?page=".($page-1)."'>上一页</a> ";
    }
    // 页码
    for($i=1; $i<=$totalpage; $i++){
        if($i == $page){
            $page_list .= "<span class='this'>".$i."</span> ";
        } else {
            $page_list .= "<a href='?page=".$i."'>".$i."</a> ";
        }
    }
    // 下一页
    if($page < $totalpage){
        $page_list .= "<a href='?page=".($page+1)."'>下一页</a> ";
    }
    // 输出分页
    echo "<div class='dede_pages'>".$page_list."</div>";
{/dede:php}

代码解释:

  1. 定义变量:设置栏目ID和每页显示数。
  2. 获取页码:从URL中获取 page 参数,如果不存在则默认为第1页。
  3. 计算总记录数:使用 $dsql 对象直接查询数据库,得到总数 $totalcount
  4. 查询分页数据:根据 $start$pagesize 查询当前页的数据ID列表。
  5. 获取完整信息GetImgs 函数(或更通用的 GetArcList)可以根据ID列表,获取包含完整字段(如 arcurl, title 等)的文章列表。$innertext 定义了每条记录的HTML模板。
  6. 输出列表:将处理好的文章列表HTML输出。
  7. 生成分页导航:手动拼接出上一页、页码、下一页的HTML链接,并输出。

注意事项

  1. 性能问题:这种方法在每次请求页面时都会执行多次数据库查询(一次查总数,一次查分页数据),对于数据量非常大的情况,可能会有性能影响,但对于大多数中小型网站来说,完全足够。
  2. URL格式:示例中的分页链接是 ?page=1 这种简单的格式,如果你的网站有伪静态规则,需要修改链接格式以匹配规则,<a href='/products/index_[field:page/].html'>
  3. {dede:php}:此标签在DedeCMS中默认是关闭的,因为它存在一定的安全风险,你需要确保你的网站环境安全,或者联系管理员开启它,开启方法通常在后台的“系统” -> “系统基本参数” -> “核心设置”中找到“启用PHP代码”选项并设置为“是”。
  4. GetImgs 函数:这个函数主要用于获取文章中的图片,但它也可以用来根据ID列表获取文章,如果你发现 GetImgs 不满足需求(比如它获取的字段不全),可以改用 GetArcList 函数,或者直接在PHP中循环处理ID列表,为每个ID再次查询数据库获取完整信息。
方法 优点 缺点 适用场景
纯模板SQL 模板与逻辑分离,相对干净。 无法获取总数,无法生成分页导航,需要配合PHP。 简单列表,不需要分页时。
推荐PHP方法 功能完整、灵活、可控性强,是解决此问题的标准方案。 需要开启 {dede:php},代码稍复杂,对PHP有一定要求。 绝大多数需要 arclist 分页的场景

对于绝大多数开发者来说,使用 {dede:php} 标签结合自定义SQL和分页逻辑是最佳实践,它虽然比直接使用 {dede:list} 复杂一些,但完美地解决了 arclist 无法分页的痛点。

-- 展开阅读全文 --
头像
织梦php后台的config文件在哪
« 上一篇 12-05
dede 织梦 免费 智能 微信插件
下一篇 » 12-05

相关文章

取消
微信二维码
支付宝二维码