什么是 list.var

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

帝国cms教程list.var
(图片来源网络,侵删)
  • 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在生成列表页时,会执行以下流程:

  1. 加载 list.temp 模板文件。
  2. list.temp 中找到 <!--list.var--> 这个系统标记。
  3. 循环读取当前栏目下的所有信息数据。
  4. 对于每一条信息,都会执行一次 list.var 文件中的PHP代码。
  5. list.var 生成的HTML代码片段替换掉 <!--list.var--> 标记。
  6. 重复此过程,直到所有信息都处理完毕,最终生成完整的列表页HTML。

list.var 的核心:$r 数组

list.var 文件中,你操作的核心对象是一个名为 $r 的数组。$r 数组包含了当前正在被处理的那条信息的所有字段值。

如何获取字段值?

帝国cms教程list.var
(图片来源网络,侵删)

假设你的信息表(phome_ecms_news)有一个字段名为 newstext),那么在 list.var 中,你可以这样获取它的值:

$r[newstext]

重要提示:

  • 系统字段、标题图片、发布时间等系统字段,可以直接使用 $r[字段名]$r[title]r[titlepic]$r[truetime]
  • 自定义字段:对于你在后台添加的自定义字段(如 yuedianauthor 等),也使用 $r[字段名] 来获取。
  • 安全函数:为了防止XSS跨站脚本攻击,帝国CMS推荐使用 ehtmlspecialchars() 函数来处理输出内容,特别是标题和用户输入内容。

示例:输出标题

// 不安全(如果标题包含JS代码,可能会被执行)
$r[title]
// 安全(推荐)
ehtmlspecialchars($r[title])

list.var 的常用函数和变量

除了 $r 数组,list.var 还能使用一些非常有用的系统函数和变量。

帝国cms教程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>

代码解析:

  1. <li>: 定义了列表项的容器。
  2. <div class="news-img">: 图片容器。
    • 使用 if 判断 $r[titlepic] 是否存在,存在则使用,否则使用默认图片。
    • <a> 标签链接到文章详情页。
    • <img> 标签的 srcalt 属性动态设置。
  3. <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/elseswitchfor 循环等。

示例:根据文章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列表页的关键,记住以下几点:

  1. 核心是 $r 数组:它代表了当前单条数据。
  2. 安全第一:对用户输入和数据库输出内容,特别是标题,使用 ehtmlspecialchars()
  3. 善用函数esub()date()strip_tags() 等函数能极大提高开发效率。
  4. 结构清晰:将 list.var 的输出看作一个独立的、可复用的HTML组件来编写。
  5. 大胆尝试list.var 本质上是一个PHP文件,不要害怕在里面写复杂的逻辑。

希望这份详细的教程能帮助你彻底理解并灵活运用 list.var