dede列表页函数如何生成?参数怎么用?

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

在 DedeCMS 中,列表页的生成并不是由一个单一的函数完成的,而是由一个核心的 PHP 类文件多个模板标签协同工作来完成的,理解了它们之间的关系,你就能掌握列表页生成的精髓。

dede生成列表页函数
(图片来源网络,侵删)

核心文件与类:arc.listview.class.php

所有列表页的生成逻辑都封装在 /include/arc.listview.class.php 文件中,当你访问一个列表页(如 plus/list.php?tid=1)时,系统会实例化这个类,然后调用其方法来处理数据并最终生成 HTML 文件。

这个类是整个列表页生成的“大脑”。

主要成员属性 (变量)

在分析函数前,先了解这个类里的一些关键属性,它们决定了列表页的行为:

  • $TypeID: 当前栏目ID,这是最重要的参数,决定了要获取哪个栏目下的文章。
  • $Fields: 当前栏目的所有配置信息,这是一个数组,包含了从 dede_arctype 表中读取的栏目名称、描述、关键词、内容模板、列表模板、文章命名规则等所有信息。
  • $dsql: 数据库连接对象,用于所有数据库查询操作。
  • $pagesize: 每页显示的文章数量,通常在后台栏目设置中指定。
  • $TotalResult: 符合条件的总文章数,用于计算总页数。
  • $TotalPage: 总页数,由 $TotalResult$pagesize 计算得出。
  • $PageNo: 当前页码,从 URL 参数中获取。
  • $addSql: 附加的 SQL 查询条件,用于按发布时间、点击量、关键字等进行排序和筛选。
  • $ismake: 是否生成静态文件,值为 1 表示生成静态 HTML,为 0 表示动态浏览。
  • $titlelen: 标题长度,截取文章标题的字符数。
  • $listtemp: 列表页模板内容,从 dede_arctype 表中读取的列表模板代码。

核心方法 (函数)

这个类包含了许多方法,其中以下几个是最关键的:

dede生成列表页函数
(图片来源网络,侵删)

function __construct($typeid, $uprank = '') (构造函数)

这是创建列表页对象时第一个被调用的方法。

  • 作用: 初始化列表页对象,接收栏目ID,并加载该栏目的所有配置信息。
  • 流程:
    1. 接收 $typeid (栏目ID)。
    2. 通过 $dsql 查询 dede_arctype 表,获取该栏目的所有信息,并存入 $Fields 属性中。
    3. $Fields 中读取列表模板文件路径 (templist),并读取模板内容存入 $listtemp 属性。
    4. 读取其他配置,如每页显示数量 (pagesize长度 (titlelen) 等。
    5. 准备好数据库查询所需的基本条件。

function GetList($typeid = 0) (获取列表数据)

这是生成列表内容的核心方法。

  • 作用: 根据当前栏目的配置和页码,从数据库中查询出当前页应该显示的文章列表数据。
  • 流程:
    1. 如果传入了 $typeid,则更新当前栏目信息。
    2. 构建复杂的 SQL 查询语句,这个查询语句非常关键,它通常包含:
      • From dede_archives: 查询主表。
      • LEFT JOIN dede_arctype t ON t.id = typeid: 关联栏目表,获取栏目路径。
      • LEFT JOIN dede_addonarticle ON aid = id: 如果是文章模型,关联附加表,获取文章内容、作者等。
      • Where 条件:根据栏目ID (typeid)、是否审核 (arcrank)、开始日期和结束日期等进行筛选。
      • Order By 排序:根据栏目设置的排序方式(如发布时间 pubdate、点击量 click、ID id 等)进行排序。
      • Limit 限制:根据 $pagesize$PageNo 计算出 LIMIT $start, $pagesize,实现分页。
    3. 执行查询,将结果存入一个数组中,这个数组就是最终要在模板中循环输出的数据。

function ParseDMFields($innerText = '') (解析模板标签)

这个方法是连接 PHP 逻辑和 HTML 模板的桥梁。

  • 作用: 解析列表页模板中的所有 DedeCMS 标签,将 PHP 变量的值替换到模板中。
  • 工作原理:
    1. 它接收模板字符串(通常是 $listtemp)。
    2. 使用正则表达式匹配模板中的各种标签,如:
      • 全局标签: {dede:global name='cfg_webname'/} (网站名称)
      • 栏目标签: {dede:field name='typename'/} (栏目名称), {dede:field name='description'/} (栏目描述)
      • 分页标签: {dede:pagelist listitem='index' listsize='5'/} (分页条)
      • 列表循环标签: {dede:list} ... {/dede:list}
    3. 对于 {dede:list} 标签,它会调用 GetList() 方法获取文章数据,然后循环遍历这个数据集。
    4. 在循环内部,再次调用一个内部方法(通常是 GetArcList())来解析 {dede:list} 内部的子标签,如:
      • {dede:field title/}: 文章标题
      • {dede:field arcurl/}: 文章链接
      • {dede:field pubdate function='MyDate('Y-m-d', @me)'/}: 发布日期
      • {dede:field litpic/}: 文章缩略图
    5. 将解析后的内容替换掉原来的标签,最终生成一个完整的、不含任何 DedeCMS 标签的 HTML 字符串。

function SaveToHtml() (保存为静态文件)

这个方法负责将最终的 HTML 内容写入到服务器上。

dede生成列表页函数
(图片来源网络,侵删)
  • 作用: 将 ParseDMFields() 解析后的 HTML 内容保存为一个 .html 文件。
  • 流程:
    1. 调用 ParseDMFields() 获取最终的 HTML 代码。
    2. 根据 $Fields 中定义的“列表命名规则” (namerule) 和目录路径 (typedir),生成最终的静态文件名和路径,规则是 {tid}_{page}.html,栏目ID为1,当前页是2,则文件名为 1_2.html
    3. 将 HTML 代码写入到指定路径的文件中。
    4. 如果成功,返回生成的文件路径。

执行流程:从访问到生成

当你通过浏览器访问一个列表页时(http://yourdomain.com/plus/list.php?tid=1),后台的执行流程如下:

  1. 入口文件: plus/list.php 被执行。
  2. 实例化对象: list.php 文件会包含 arc.listview.class.php,然后根据 URL 中的 tid 参数,实例化 ListView 类。
    // 在 list.php 中的简化代码
    require_once(DEDEINC."/arc.listview.class.php");
    $lv = new ListView($tid, '');
  3. 调用生成方法: list.php 会调用 $lv 对象的 SaveToHtml() 方法。
    // 在 list.php 中的简化代码
    $lv->SaveToHtml();
  4. SaveToHtml() 内部动作:
    • 它首先调用 ParseDMFields()
    • ParseDMFields() 在解析 {dede:list} 标签时,会调用 GetList() 从数据库获取文章数据。
    • GetList() 根据 $typeid$PageNo 等信息构建并执行 SQL 查询。
    • ParseDMFields() 将获取到的数据填充到 {dede:list} 循环中,替换掉所有模板标签,生成最终的 HTML 字符串。
    • SaveToHtml() 接收这个 HTML 字符串,根据命名规则生成文件名,并将其写入服务器的 /html/ 目录下。
  5. 返回结果: 生成完成后,浏览器会重定向到这个新生成的静态 HTML 页面。

模板标签详解

列表页的样式完全由模板文件(通常是 /templets/default/list_栏目ID.htm)控制。

常用标签示例

栏目信息标签

<h1>{dede:field name='typename'/}</h1>
<p>{dede:field name='description'/}</p>
<meta name="keywords" content="{dede:field name='keywords'/}">

列表循环标签 (核心)

{dede:list pagesize='10' titlelen='40'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
    </li>
{/dede:list}
  • pagesize='10': 每页显示10条,如果已在后台栏目设置,这里可以省略,len='40'`: 标题长度为40个字符。
  • [field:arcurl/]: 文章的链接地址,系统会根据全局的“是否使用动态页”设置自动生成动态链接 (?aid=123) 或静态链接 (/html/2025/01/01/123.html)。
  • [field:title/]: 文章标题。
  • [field:pubdate function="MyDate('Y-m-d', @me)"/]: 调用 MyDate 函数格式化发布日期。

分页标签

<div class="dede_pages">
    <ul>
        <li><span class="pageinfo">共 <strong>{dede:field.totalpage/}</strong> 页 <strong>{dede:field.totalresult/}</strong> 条记录</span></li>
        {dede:pagelist listitem='index pre pageno next end' listsize='5'}
    </ul>
</div>
  • {dede:field.totalpage/}: 总页数。
  • {dede:field.totalresult/}: 总记录数。
  • {dede:pagelist ...}: 分页条。listitem 参数控制显示哪些分页元素(首页、上一页、页码、下一页、末页)。

概念 描述 关键文件/标签
核心逻辑 处理分页、查询数据库、解析模板、生成文件。 /include/arc.listview.class.php
入口触发 用户访问 plus/list.php,系统开始执行生成流程。 plus/list.php
数据获取 根据栏目ID和页码,从数据库中筛选并排序文章。 ListView::GetList() 方法
模板渲染 将数据库数据和系统变量填充到 HTML 模板中。 ListView::ParseDMFields() 方法
静态生成 将最终渲染的 HTML 保存为 .html 文件到服务器。 ListView::SaveToHtml() 方法
页面样式 定义列表页的 HTML 结构和样式。 templets/default/list_xxx.htm
列表数据 循环输出文章标题、链接、日期等信息。 {dede:list}...{/dede:list}
分页导航 显示页码、总页数、上下页等链接。 {dede:pagelist}{dede:field.totalpage/}

理解了这个由 arc.listview.class.php 驱动,通过 list.php 触发,并使用 {dede:list} 等模板标签进行渲染的完整流程,你就能自如地修改和定制 DedeCMS 的列表页了。

-- 展开阅读全文 --
头像
织梦虚拟主机重启方法是什么?
« 上一篇 昨天
dede子目录域名如何正确配置与访问?
下一篇 » 今天

相关文章

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

目录[+]