Spinfo 是帝国CMS官方推出的一套强大、灵活且高效的模板引擎,它取代了旧版的 e:loop 等标签,让模板开发更接近现代前端框架(如 Vue, React)的“组件化”和“数据驱动”思想,是目前帝国CMS模板开发的主流和推荐方式。


核心思想:从“标签思维”到“模板引擎思维”

在理解Spinfo之前,我们先要明白它和旧版模板的根本区别:

  • 旧版 (e:loop等): 你需要在模板里写PHP代码逻辑,比如循环、判断,模板文件里混杂着HTML和PHP代码,逻辑和视图耦合度高,难以维护。
  • 新版 (Spinfo): 你将PHP代码逻辑完全分离出去,模板文件只负责展示数据,就像一个“静态的HTML骨架”,而数据的获取、筛选、处理等所有逻辑,都在一个独立的 PHP控制器文件 中完成,Spinfo负责将PHP处理好的数据“注入”到模板中。

这种模式被称为 MVC(Model-View-Controller)的简化版

  • Model (模型): 数据库表。
  • View (视图): Spinfo模板文件(.php 或 .html)。
  • Controller (控制器): 独立的PHP文件,负责处理业务逻辑。

Spinfo 的三大组成部分

要使用Spinfo,你需要同时创建和编辑三个文件:

  1. 模板文件:

    • 扩展名通常是 .php.html
    • 里面是HTML结构,并使用Spinfo特有的语法来显示数据。
    • 存放位置: /e/template/你的模板目录//e/extend/你的模板目录/
  2. 控制器文件:

    • 扩展名必须是 .php
    • 这是核心,里面是PHP代码,负责查询数据库、处理数据,并将数据传递给模板。
    • 存放位置: /e/template/你的模板目录//e/extend/你的模板目录/ (与模板文件同目录)
  3. 配置文件:

    • 扩展名必须是 .php
    • 它的作用是将模板文件和控制器文件关联起来,并告诉帝国CMS这个动态页面的访问规则。
    • 存放位置: /e/data/template/你的模板目录/

实战演练:创建一个“新闻列表”动态页面

假设我们要创建一个 /news/ 路径下的新闻列表页。

第1步:创建模板文件 list.php

/e/template/myskin/ (假设你的模板目录是 myskin) 下创建 list.php 文件。

/e/template/myskin/list.php

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">新闻列表 - 我的网站</title>
</head>
<body>
    <h1>最新资讯</h1>
    <!-- 
      Spinfo 循环语法
      {foreach $newsList as $item}
        ...循环内容...
      {/foreach}
    -->
    <ul class="news-list">
        {foreach $newsList as $item}
            <li>
                <!-- 
                  Spinfo 变量语法
                  {$item.字段名} 或 {$item['字段名']}
                -->
                <a href="{$item['titleurl']}">{$item['title']}</a>
                <span class="date">发布时间:{$item['newstime']}</span>
            </li>
        {/foreach}
    </ul>
    <!-- 
      Spinfo 分页语法
      {$page}
    -->
    <div class="pagination">
        {$page}
    </div>
</body>
</html>

解释:

  • {$newsList}: 这是一个变量名,我们将在控制器文件中定义它,它将存储一个包含新闻数据的数组。
  • {foreach $newsList as $item}: 循环遍历 $newsList 数组,每次循环将当前新闻数据存入 $item 变量。
  • {$item['title']}: 输出当前新闻的标题字段。title 是你在帝国CMS后台“新闻数据表”中定义的字段名。
  • {$item['titleurl']}: 输出当前新闻的链接。titleurl 是帝国CMS的一个特殊系统变量,会自动生成文章的URL。
  • {$page}: 这是帝国CMS分页的特殊变量,控制器会自动处理并注入分页HTML代码。

第2步:创建控制器文件 list.php

注意: 模板文件和控制器文件可以同名,因为它们通过配置文件来区分角色。

/e/template/myskin/list.php (这是控制器文件,内容完全不同)

<?php
// 引入帝国CMS核心文件
require_once("../../class/connect.php");
// 1. 设置模板文件
// 这个变量名 $listtemp 必须与模板文件名一致(不含扩展名)
$listtemp = 'list';
// 2. 设置查询条件
// 获取当前栏目ID,这里假设新闻列表页对应的栏目ID是1
$classid = (int)$_GET['classid']; // 安全起见,进行类型转换
if(empty($classid)) $classid = 1; // 如果没有传入classid,则默认为1
// 3. 准备查询参数
// 查询新闻表(假设表ID是1),按发布时间倒序排列
$tbname = 'news'; // 你的新闻数据表名
$add = '';
$line = 10; // 每页显示10条
// 查询字段,*代表所有字段
$e = array(
    'tbname' => $tbname,
    'classid' => $classid,
    'line' => $line,
    'limit' => $line, // line和limit同时设置可以实现分页
    'order' => 'newstime desc',
    'add' => $add,
);
// 4. 执行查询并获取数据
// 使用帝国CMS的 `empirepage()` 函数,它会自动处理分页和数据查询
$page = $empirepage->GetPage($e, 1, 'list'); // 参数1:查询条件, 1:返回数据格式(1为数组), 'list':模板标识
// 5. 将数据传递给模板
// Spinfo会自动使用 $listtemp 变量中指定的模板文件
// 并将 $page['list'] (数据列表) 和 $page['page'] (分页HTML) 注入到模板中
// 在模板里,数据列表变量名就是 $listtemp 的值,即 $list
// 分页变量名是固定的 $page
$list = $page['list'];
$page = $page['page'];
// 6. 调用模板引擎进行渲染
// 用 $listtemp 变量来触发渲染
echo $listtemp;
?>

解释:

  • $listtemp = 'list';: 这是最关键的一步,它告诉Spinfo引擎要去加载 list.php 这个模板文件。
  • empirepage->GetPage(): 这是帝国CMS的分页查询函数,非常强大,它会执行SQL查询,将结果存入 $page['list'],生成分页HTML并存入 $page['page']
  • $list = $page['list'];: 我们将查询到的数据列表赋值给一个变量。这个变量的名字必须和 $listtemp 的值完全一样,在这里就是 $list
  • echo $listtemp;: 这行代码会触发Spinfo引擎,它会找到名为 list 的模板文件,并将当前作用域中的所有变量(如 $list, $page)传递过去进行解析和渲染。

第3步:创建配置文件 list.php

/e/data/template/myskin/list.php

<?php
$publicr['list'] = array(
    'list' => array('list', 1), // 格式: '模板页面别名' => array('模板文件名', 是否使用控制器(0或1))
);
?>

解释:

  • $publicr['list']: 定义了一个名为 list 的页面规则。
  • 'list' => array('list', 1): 这是核心配置。
    • 第一个 'list': 这是页面的别名,你可以在网站的其他地方通过 [list]**[/list] 这样的标签来调用这个动态页面的链接。
    • 第二个 'list': 这是模板文件名(不含扩展名),指向我们创建的 /e/template/myskin/list.php
    • 第三个 1: 表示启用控制器,如果是 0,则系统会直接渲染模板文件,不执行任何PHP逻辑。

第4步:在后台设置栏目链接

  1. 登录帝国CMS后台。
  2. 进入【栏目管理】->【增加栏目】或【修改栏目】。
  3. 找到你想要设置为动态列表页的栏目(新闻中心”)。
  4. 在“栏目链接”或“动态页面模板”相关的设置项中,选择你刚刚创建的规则。
    • 在较新版本的帝国CMS中,通常会有一个“选择动态页面”的下拉菜单,里面会显示你在配置文件中定义的别名,list
    • 选择它,保存即可。

当你访问这个栏目时,帝国CMS就会自动调用 /e/template/myskin/list.php 控制器,查询数据,并最终通过Spinfo引擎渲染出我们看到的 list.php 模板页面。


Spinfo 常用语法速查

语法 描述 示例
{$var} 输出变量值 {$title}
{$var.key}{$var['key']} 输出数组/对象的某个元素 {$user['name']}
{if condition}...{else}...{/if} 条件判断 {if $age > 18}成年{else}未成年{/if}
{foreach $array as $item}...{/foreach} 遍历数组 {foreach $newsList as $item}<li>{$item['title']}</li>{/foreach}
{for $i=0; $i<10; $i++}...{/for} for循环 {for $i=1; $i<=5; $i++}<h{$i}>标题</h{$i}>{/for}
{include file='header.php'} 包含其他模板文件 {include file='header.php'}
{$page} 输出帝国CMS自动生成的分页HTML {$page}

总结与优势

使用Spinfo构建动态页面模板的优势非常明显:

  1. 逻辑与视图分离: PHP代码和HTML代码完全分开,代码结构清晰,易于阅读和维护。
  2. 开发效率高: 模板设计师可以专注于HTML/CSS/JS,而程序员可以专注于PHP业务逻辑,并行开发。
  3. 安全性高: 模板文件中不包含任何PHP执行代码(除了Spinfo的安全标签),有效防止了模板注入等安全风险。
  4. 性能优越: Spinfo引擎经过高度优化,渲染速度比旧版混合标签的方式更快。
  5. 可扩展性强: 你可以在控制器文件中编写任何复杂的PHP逻辑(如调用API、处理表单、操作其他数据库等),然后只将需要展示的数据传递给模板。

虽然Spinfo的学习初期比简单的e:loop标签要复杂一些,但一旦掌握,它将为你带来专业、高效、可维护的帝国CMS二次开发体验。强烈建议在新项目中全面采用Spinfo模板引擎。