什么是 list.var?
list.var 是帝国CMS内容列表页(如栏目页、搜索页、专题页等)的模板,它是一个PHP文件,负责定义每一条信息在列表页上显示的具体HTML结构。

list.var决定了单条信息长什么样。list.temp(列表页模板) 决定了整个列表页的框架,它会循环调用list.var来生成完整的列表。
list.var 文件通常位于 e/data/tpl/ 目录下,文件名格式为 栏目ID_list.var,栏目ID为 1 的列表内容模板文件就是 e/data/tpl/1_list.var。
list.var 的基本工作原理
帝国CMS在生成列表页时,会执行以下流程:
- 加载
list.temp模板文件。 - 在
list.temp中找到<!--list.var-->这个系统标记。 - 循环读取当前栏目下的所有信息数据。
- 对于每一条信息,都会执行一次
list.var文件中的PHP代码。 - 将
list.var生成的HTML代码片段替换掉<!--list.var-->标记。 - 重复此过程,直到所有信息都处理完毕,最终生成完整的列表页HTML。
list.var 的核心:$r 数组
在 list.var 文件中,你操作的核心对象是一个名为 $r 的数组。$r 数组包含了当前正在被处理的那条信息的所有字段值。
如何获取字段值?

假设你的信息表(phome_ecms_news)有一个字段名为 newstext),那么在 list.var 中,你可以这样获取它的值:
$r[newstext]
重要提示:
- 系统字段、标题图片、发布时间等系统字段,可以直接使用
$r[字段名],$r[title]、r[titlepic]、$r[truetime]。 - 自定义字段:对于你在后台添加的自定义字段(如
yuedian、author等),也使用$r[字段名]来获取。 - 安全函数:为了防止XSS跨站脚本攻击,帝国CMS推荐使用
ehtmlspecialchars()函数来处理输出内容,特别是标题和用户输入内容。
示例:输出标题
// 不安全(如果标题包含JS代码,可能会被执行) $r[title] // 安全(推荐) ehtmlspecialchars($r[title])
list.var 的常用函数和变量
除了 $r 数组,list.var 还能使用一些非常有用的系统函数和变量。

获取栏目链接
classid: 当前信息的栏目ID。bclassid: 当前信息的父栏目ID。
// 获取当前信息所属栏目的链接 $class_r[$classid]['classpath'] // 获取父栏目的链接 $class_r[$bclassid]['classpath']
示例:生成一个完整的文章链接
<a href="[!--news.url--]<?=$class_r[$classid]['classpath']?>/<?=$r[id]?>.html"><?=ehtmlspecialchars($r[title])?></a>
[!--news.url--]: 网站根地址。<?=$class_r[$classid]['classpath']?>/: 栏目路径。<?=$r[id]?>.html: 文章ID,形成最终URL。
图片
图片 ($r[titlepic]),则显示,否则显示一个默认图片。
<?php
if($r[titlepic]){
$titlepic = $r[titlepic];
}else{
$titlepic = '/e/data/images/notimg.gif'; // 默认图片路径
}
?>
<img src="<?=$titlepic?>" alt="<?=ehtmlspecialchars($r[title])?>">
截取字符串
esub() 函数用于截取字符串,非常常用。
语法:esub(字符串, 截取长度, '后缀')
示例:截取简介,最多显示100个字符,超出显示...
<?=esub($r[smalltext], 100, '...')?>
$r[smalltext]: 字段“简介”的值。100: 截取长度。- 超出部分的后缀。
日期格式化
date() 函数用于格式化时间戳。
示例:格式化发布时间
<?=date('Y-m-d H:i:s', $r[newstime])?>
Y-m-d H:i:s: 是日期格式,Y代表四位年份,m代表月份,d代表日,H代表小时,i代表分钟,s代表秒。$r[newstime]: 发布时间的时间戳。
特定模型字段调用
如果你的列表调用的是特定模型(如软件、商品模型),需要调用该模型的字段,假设模型ID为 1,字段名为 softsize。
- 旧版(需开启字段映射):
$r[softsize] // 直接调用
- 新版(推荐):
$fr=$empire->fetch1("select softsize from {$dbtbpre}ecms_news_data_1 where id='$r[id]'"); // 查询附加表 echo $fr[softsize]; // 输出字段值ecms_news_data_1:ecms_+表名+_data_+模型ID。$r[id]: 当前信息的ID。
完整的 list.var 示例
假设我们要制作一个文章列表,每条信息显示:图片、发布时间和简介。
list.var 文件内容:
<li class="news-item">
<div class="news-img">
<a href="[!--news.url--]<?=$class_r[$classid]['classpath']?>/<?=$r[id]?>.html" title="<?=ehtmlspecialchars($r[title])?>">
<?php
if($r[titlepic]){
$titlepic = $r[titlepic];
}else{
$titlepic = '/e/data/images/notimg.gif';
}
?>
<img src="<?=$titlepic?>" alt="<?=ehtmlspecialchars($r[title])?>">
</a>
</div>
<div class="news-info">
<h3 class="news-title">
<a href="[!--news.url--]<?=$class_r[$classid]['classpath']?>/<?=$r[id]?>.html" title="<?=ehtmlspecialchars($r[title])?>">
<?=ehtmlspecialchars($r[title])?>
</a>
</h3>
<p class="news-date"><?=date('Y-m-d', $r[newstime])?></p>
<p class="news-desc">
<?=esub(strip_tags($r[smalltext]), 150, '...')?>
</p>
</div>
</li>
代码解析:
<li>: 定义了列表项的容器。<div class="news-img">: 图片容器。- 使用
if判断$r[titlepic]是否存在,存在则使用,否则使用默认图片。 <a>标签链接到文章详情页。<img>标签的src和alt属性动态设置。
- 使用
<div class="news-info">: 信息容器。<h3>: 标题。<a>标签链接到文章详情页。ehtmlspecialchars($r[title])安全输出标题。
<p class="news-date">: 发布时间。date('Y-m-d', $r[newstime])将时间戳格式化为年-月-日。
<p class="news-desc">: 简介。strip_tags($r[smalltext]): 先用strip_tags函数移除简介中的HTML标签(如<p>、<a>等),只保留纯文本。esub(...): 再截取150个字符,超出部分用 代替。
高级技巧
循环子栏目
在 list.var 中,有时需要显示子栏目的信息,这通常需要结合SQL查询。
示例:在列表中同时显示当前栏目的文章和第一个子栏目的最新一篇文章
// 1. 显示当前栏目的信息
<div class="main-news">
<h2><?=ehtmlspecialchars($r[title])?></h2>
<p><?=esub(strip_tags($r[smalltext]), 200)?></p>
</div>
// 2. 查询并显示第一个子栏目的最新信息
<?php
$bclassid=$class_r[$classid][bclassid]; // 获取父栏目ID
$sonclassid=$class_r[$classid][sonclassid]; // 获取所有子栏目ID,用逗号分隔
if($sonclassid){
$sonr=$empire->fetch1("select * from {$dbtbpre}ecms_news where classid in ($sonclassid) order by newstime desc limit 1"); // 查询子栏目中最新的一条
if($sonr[id]){
echo "<div class='sub-news'>";
echo "<h3>子栏目最新: <a href='/".$class_r[$sonr[classid]][classpath]."/".$sonr[id].".html'>".ehtmlspecialchars($sonr[title])."</a></h3>";
echo "</div>";
}
}
?>
注意:这种复杂的逻辑通常建议在 list.temp 中通过 list.var 的扩展功能(如 public_r[listtemp])来实现,或者使用自定义函数,以保持 list.var 的简洁性。
使用PHP控制
你可以在 list.var 中使用任何PHP语法来实现复杂逻辑,如 if/else、switch、for 循环等。
示例:根据文章ID设置不同的CSS类
<?php
$news_class = ($r['id'] % 2 == 0) ? 'even-news' : 'odd-news';
?>
<li class="<?=$news_class?>">
<a href="[!--news.url--]<?=$class_r[$classid]['classpath']?>/<?=$r[id]?>.html"><?=ehtmlspecialchars($r[title])?></a>
</li>
掌握 list.var 是玩转帝国CMS列表页的关键,记住以下几点:
- 核心是
$r数组:它代表了当前单条数据。 - 安全第一:对用户输入和数据库输出内容,特别是标题,使用
ehtmlspecialchars()。 - 善用函数:
esub()、date()、strip_tags()等函数能极大提高开发效率。 - 结构清晰:将
list.var的输出看作一个独立的、可复用的HTML组件来编写。 - 大胆尝试:
list.var本质上是一个PHP文件,不要害怕在里面写复杂的逻辑。
希望这份详细的教程能帮助你彻底理解并灵活运用 list.var!
