文件位置与作用
- 文件位置:
/m/list.php - 核心作用: 这是织梦DedeCMS移动端的栏目列表页,当你在手机上浏览网站,点击一个栏目时,通常会跳转到这个页面,并显示该栏目下的所有文章列表。
tid 参数是什么?
tid 是 "Type ID" 的缩写,即栏目ID,它是 list.php 文件最关键的一个参数,用来告诉系统:“请显示ID为 tid 的这个栏目下的文章列表”。

访问示例:
假设你的网站有一个“公司新闻”栏目,它的ID是 5,那么在移动端访问这个栏目列表的URL通常会是:
http://你的域名.com/m/list.php?tid=5
list.php 如何处理 tid 参数?
当用户访问 m/list.php?tid=5 时,服务器执行 list.php 文件,该文件内部会经历以下几个核心步骤来处理 tid:
步骤一: 接收和验证 tid
文件首先会从URL中获取 tid 的值,并进行一些基本的安全处理。
// 在 list.php 文件的开头部分
if(!empty($tid))
{
$tid = preg_replace("#[^0-9]#", "", $tid); // 移除所有非数字字符,只保留数字ID
}
这行代码非常重要,它防止了SQL注入等安全问题,即使用户传入 tid=5; DROP TABLE dede_archives;,经过这行处理后,$tid 也只会变成 5。

步骤二: 获取栏目信息
系统会使用 $tid 去查询数据库,获取这个栏目的详细信息,比如栏目名称、栏目模板、上级栏目等。
// 获取栏目信息
$typeinfo = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE id='$tid'");
// 检查栏目是否存在
if(!is_array($typeinfo))
{
ShowMsg('您指定的栏目不存在!', '-1');
exit();
}
这里查询的是 #@__arctype 表(即 dede_arctype 表),这是存储所有栏目信息的核心表,如果查询不到记录,说明这个栏目ID是无效的,会提示错误并退出。
步骤三: 调用对应的列表模板
根据上一步获取到的栏目信息,特别是 listtemp 字段(或 tempindex 等字段,取决于版本和配置),系统会决定使用哪个HTML模板文件来渲染这个列表页。
// 获取栏目模板
$ntype = $typeinfo['nativetype'];
$typedir = $typeinfo['typedir'];
$templet = $typeinfo['listtemplet']; // 通常这个字段存储模板路径
// 如果没有指定模板,则使用默认模板
if(empty($templet))
{
$templet = $cfg_basedir.$cfg_templets_dir."/".$cfg_df_style."/list_default.htm";
}
else
{
$templet = $cfg_basedir.$typedir.'/'.$templet;
}
// ... 加载模板并解析 ...
$ntype: 栏目类型,如son(普通栏目),self(外部链接) 等。$typedir: 栏目目录,用于生成URL。$templet: 最终确定的模板文件路径。
步骤四: 查询并传递文章列表数据
这是最核心的一步,系统会根据 $tid 和其他参数(如分页 page、每页显示数量 pagesize 等)去查询 #@__archives 表(文章主表)和 #@__arctiny 表(文章摘要表),获取该栏目下的所有文章列表。

// 构建查询SQL
$sql = "SELECT arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault,tp.defaultname,tp.namerule,
tp.namerule2,tp.ispart,tp.moresite,tp.siteurl,tp.sitepath
FROM `#@__archives` arc
LEFT JOIN `#@__arctype` tp ON arc.typeid=tp.id
WHERE arc.typeid IN ($tid) $orquery $addsql ORDER BY arc.sortrank DESC $ordersql";
// 执行查询
$dsql->SetQuery($sql);
$dsql->Execute('al');
// 循环获取每一篇文章数据
while($row = $dsql->GetArray('al'))
{
// 对文章数据进行处理,如生成URL、处理图片等
$row['arcurl'] = GetFileUrl($row['id'],$row['typeid'],$row['senddate'],$row['title'],$row['ismake'],
$row['arcrank'],$row['namerule'],$row['typedir'],$row money);
// ... 其他处理 ...
// 将处理好的文章数据存入一个数组,准备传递给模板
$list[] = $row;
}
// 将数据传递给模板
$pv->Fields = $typeinfo;
$pv->Fields['list'] = $list; // 将文章列表数组赋值给模板变量 'list'
$pv->SetTemplet($templet); // 设置要使用的模板文件
$pv->Display(); // 解析并输出模板
$tid: 这里直接用在WHERE子句中,WHERE arc.typeid IN ($tid),注意,这里用的是IN而不是 ,是为了兼容“包含子栏目”的情况(见下文)。$orquery: 一个非常重要的变量,用于处理“包含子栏目”,如果该栏目设置了“包含子栏目”,$orquery的值就会变成OR arc.typeid IN (子栏目ID1,子栏目ID2,...),从而把子栏目下的文章也一并查询出来。$list: 最终传递给模板的文章列表数据。
步骤五: 模板渲染与输出
系统会加载在第3步中确定的模板文件(list_default.htm),并将 $typeinfo(栏目信息)和 $list(文章列表)等变量传递给模板,模板引擎会解析这些变量,生成最终的HTML页面并返回给用户的浏览器。
模板文件中的调用
在移动端的列表模板文件(如 /m/templets/default/list_default.htm)中,你会看到类似这样的标签来使用 $tid 传递过来的数据:
<h1>{dede:field name='typename'/}</h1> <!-- 显示栏目名称,来自$typeinfo -->
<ul>
{dede:list pagesize='10'} <!-- 循环输出文章列表,默认10条 -->
<li>
<a href="[field:arcurl/]">[field:title/]</a> <!-- 文章链接和标题 -->
<span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span> <!-- 发布日期 -->
</li>
{/dede:list}
</ul>
{dede:pagelist listitem='info,index,end,pre,next,pageno' listsize='5'/} <!-- 分页条 -->
常见问题与排查
如果你的 m/list.php?tid=x 页面出现问题,可以从以下几点排查:
-
404页面不存在:
- 检查
tid是否正确,该栏目是否存在。 - 检查服务器的伪静态规则是否正确配置,织梦移动端通常需要重写URL。
- 检查
list.php文件是否存在。
- 检查
-
为空或错误:
- 检查该栏目下是否已经发布了文章,并且文章是“已审核”状态。
- 检查栏目是否设置了“外部链接”或“单页文档”,如果是,
list.php的行为会不同。 - 检查对应的列表模板文件是否存在,并且模板标签语法是否正确。
-
样式错乱:
- 检查模板文件中引用的CSS和JS路径是否正确,移动端模板通常使用
/m/目录下的资源。
- 检查模板文件中引用的CSS和JS路径是否正确,移动端模板通常使用
| 项目 | 说明 |
|---|---|
| 文件 | /m/list.php |
| 参数 | tid (Type ID, 栏目ID) |
| 功能 | 根据传入的 tid,查询指定栏目的文章列表,并调用相应的模板进行渲染。 |
| 核心流程 | 接收tid -> 验证tid -> 获取栏目信息 -> 确定模板 -> 查询文章数据 -> 渲染模板并输出。 |
| 模板标签 | {dede:field name='typename'} (栏目名), {dede:list} (文章列表), {dede:pagelist} (分页)。 |
理解了 m/list.php 和 tid 的关系,你就掌握了织梦CMS移动端内容列表展示的核心机制。
