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,你需要同时创建和编辑三个文件:
-
模板文件:
- 扩展名通常是
.php或.html。 - 里面是HTML结构,并使用Spinfo特有的语法来显示数据。
- 存放位置:
/e/template/你的模板目录/或/e/extend/你的模板目录/
- 扩展名通常是
-
控制器文件:
- 扩展名必须是
.php。 - 这是核心,里面是PHP代码,负责查询数据库、处理数据,并将数据传递给模板。
- 存放位置:
/e/template/你的模板目录/或/e/extend/你的模板目录/(与模板文件同目录)
- 扩展名必须是
-
配置文件:
- 扩展名必须是
.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步:在后台设置栏目链接
- 登录帝国CMS后台。
- 进入【栏目管理】->【增加栏目】或【修改栏目】。
- 找到你想要设置为动态列表页的栏目(新闻中心”)。
- 在“栏目链接”或“动态页面模板”相关的设置项中,选择你刚刚创建的规则。
- 在较新版本的帝国CMS中,通常会有一个“选择动态页面”的下拉菜单,里面会显示你在配置文件中定义的别名,
list。 - 选择它,保存即可。
- 在较新版本的帝国CMS中,通常会有一个“选择动态页面”的下拉菜单,里面会显示你在配置文件中定义的别名,
当你访问这个栏目时,帝国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构建动态页面模板的优势非常明显:
- 逻辑与视图分离: PHP代码和HTML代码完全分开,代码结构清晰,易于阅读和维护。
- 开发效率高: 模板设计师可以专注于HTML/CSS/JS,而程序员可以专注于PHP业务逻辑,并行开发。
- 安全性高: 模板文件中不包含任何PHP执行代码(除了Spinfo的安全标签),有效防止了模板注入等安全风险。
- 性能优越: Spinfo引擎经过高度优化,渲染速度比旧版混合标签的方式更快。
- 可扩展性强: 你可以在控制器文件中编写任何复杂的PHP逻辑(如调用API、处理表单、操作其他数据库等),然后只将需要展示的数据传递给模板。
虽然Spinfo的学习初期比简单的e:loop标签要复杂一些,但一旦掌握,它将为你带来专业、高效、可维护的帝国CMS二次开发体验。强烈建议在新项目中全面采用Spinfo模板引擎。
