PHPWind 模板系统核心教程
PHPWind 使用的是基于 PHP 的模板引擎,其核心思想是将业务逻辑(PHP 代码)与页面展示(HTML 模板)分离开来,这样做的好处是:

- 分工明确:程序员专注于后端逻辑,美工/前端专注于页面设计。
- 安全:模板文件不包含 PHP 执行代码,更安全。
- 高效:修改页面内容时,无需改动核心 PHP 文件,只需修改模板文件即可。
第一部分:基础概念与核心标签
在开始之前,你需要了解几个核心概念:
- 模板文件:通常以
.htm为后缀,存放在template/目录下的对应主题文件夹中,默认主题的首页模板路径是template/wind/index.htm。 - 模板标签:PHPWind 模板引擎使用一套自定义的标签语法,用来在模板中调用 PHP 变量、执行循环、判断等操作。
- 主题:一套完整的模板文件集合,包括 CSS、JavaScript、图片和 HTML 模板文件,主题存放在
template/目录下。
变量输出
最基础的标签,用于显示从 PHP 后端传递过来的变量值。
- 语法:
{$变量名}
示例:
假设 PHP 代码中传递了一个变量 $username = '张三';。
在模板中,你只需要写:
欢迎您,<strong>{$username}</strong>!
渲染后的结果就是:
欢迎您,<strong>张三</strong>!
循环
用于遍历一个数组,通常用于列表展示,如帖子列表、用户列表等。
- 语法:
<loop name="循环变量名" key="键名" value="值名"> <!-- 循环内容 --> {值名.字段名} </loop>
示例:
假设 PHP 代码传递了一个帖子列表数组 $threadList,每个元素都包含 subject)和 author(作者)。
在模板中,你可以这样写:
<dl class="threadlist">
<loop name="threadList" key="k" value="thread">
<dt>
<a href="{thread.url}">{thread.subject}</a>
</dt>
<dd>
作者:{thread.author}
</dd>
</loop>
</dl>
name="threadList":指定要循环的数组变量名。key="k":可选,获取当前循环的索引(从0开始)。value="thread":将当前循环的数组元素赋值给$thread变量,在模板中通过{thread.字段名}来访问其属性。
条件判断
根据不同的条件显示不同的内容。
- 语法:
<if condition="判断条件"> <!-- 条件为真时显示 --> <else/> <!-- 条件为假时显示 --> </if>
示例: 判断当前用户是否登录。
<if condition="$uid">
<!-- $uid 存在,表示已登录 -->
<a href="{u('space/index', array('uid'=>$uid))}">我的空间</a>
<a href="{u('login/logout')}">退出</a>
<else/>
<!-- $uid 不存在,表示未登录 -->
<a href="{u('login/run')}">登录</a>
<a href="{u('register/index')}">注册</a>
</if>
$uid是一个代表用户ID的常用变量,如果用户登录,$uid就是一个大于0的数字;如果未登录,$uid为空。
模板包含
用于在当前模板中引入另一个模板文件,非常利于模块化和代码复用。
- 语法:
{template '模块名:模板文件名'}模块名:指明模板所在的模块,如forum(论坛)、space(空间)、admin(后台)等。模板文件名:指明要引入的模板文件名,不带.htm后缀。
示例:
在首页 index.htm 中引入页头和页脚。
{template 'common/header'} <!-- 引入 template/wind/common/header.htm -->
<div class="main-content">
<!-- 首页主要内容 -->
</div>
{template 'common/footer'} <!-- 引入 template/wind/common/footer.htm -->
这是一个非常好的实践,header.htm 和 footer.htm 通常包含了网站通用的头部和底部结构。
第二部分:常用全局变量与函数
在 PHPWind 模板中,有一些非常常用的全局变量和函数,你需要熟练掌握。
全局变量
$G: 全局变量数组,很多配置和常用数据都放在这里。$G['url']: 当前页面的 URL。$G['uid']: 当前登录用户的 ID。$G['username']: 当前登录用户的用户名。$G['adminid']: 当前用户的 adminid,用于判断是否为管理员。
$db: 数据库操作对象(通常在模板中直接使用较少,数据由后端处理好后通过变量传递)。$pwServer:$_SERVER的封装。$pwPosts:$_POST的封装。$pwGets:$_GET的封装。
常用函数
u()函数:极其重要! 用于生成站内链接,能自动处理域名、伪静态等。- 语法:
{u('模块/控制器/方法', array('参数1'=>'值1', '参数2'=>'值2'))} - 示例:
- 生成帖子详情页链接:
{u('thread/read', array('tid'=>$thread['tid']))} - 生成用户空间链接:
{u('space/index', array('uid'=>$uid))} - 生成后台管理链接:
{u('admin/run')}
- 生成帖子详情页链接:
- 语法:
lang()函数:用于获取语言包中的文字,实现多语言。- 语法:
{lang('语言包标识')} - 示例:
<button>{lang('threadbutton_reply')}</button>会显示“回复”按钮文字。
- 语法:
date()函数:格式化时间戳。- 语法:
{date('Y-m-d H:i:s', $timestamp)} - 示例:
{date('Y-m-d', $thread['postdate'])}会将$thread['postdate']格式化为“年-月-日”。
- 语法:
showstyle()函数:用于显示主题风格相关的 CSS 或 JS 文件。- 语法:
{showstyle('文件名')} - 示例:
{showstyle('style.css')}会在<head>中引入当前主题的style.css文件。
- 语法:
smiley()函数:将表情代码(如 )转换为图片。- 语法:
{smiley('内容')} - 示例:
{smiley($post['content'])}
- 语法:
第三部分:实战演练 - 制作一个简单的主题
假设我们要修改论坛首页的帖子列表。
目标:让帖子列表标题更突出,并增加一个“热门”标签。
步骤 1:定位模板文件
论坛首页的帖子列表通常在 template/wind/forum/index.htm 或 template/wind/forum/threadlist.htm 中,我们打开 index.htm 并查找相关的循环代码。
步骤 2:修改模板代码
找到类似这样的代码块:
<!-- 原始代码 -->
<loop name="threadList" key="k" value="thread">
<div class="thread-item">
<h3><a href="{thread.url}">{thread.subject}</a></h3>
<p>作者:{thread.author} | 回复:{thread.replies}</p>
</div>
</loop>
我们将其修改为:
<!-- 修改后的代码 -->
<loop name="threadList" key="k" value="thread">
<div class="thread-item">
<!-- 新增:判断回复数,如果大于100则显示“热门”标签 -->
<if condition="$thread['replies'] > 100">
<span class="hot-tag">热门</span>
</if>
<h3>
<a href="{thread.url}">{thread.subject}</a>
</h3>
<p>作者:{thread.author} | 回复:{thread.replies}</p>
</div>
</loop>
步骤 3:添加 CSS 样式
为了让“热门”标签更美观,我们需要添加 CSS,通常可以在 template/wind/common/header.htm 中找到 <head> 标签,在里面添加一个 <style> 标签,或者创建一个新的 CSS 文件(如 custom.css)并用 {showstyle()} 引入。
这里我们直接在 header.htm 的 <head> 部分添加:
<style>
.hot-tag {
display: inline-block;
background-color: #ff5722;
color: white;
padding: 2px 5px;
border-radius: 3px;
font-size: 12px;
margin-right: 5px;
}
.thread-item h3 {
/* 让标题更突出 */
font-size: 16px;
font-weight: bold;
}
</style>
步骤 4:刷新并查看效果
清空浏览器缓存,刷新你的网站首页,现在你应该能看到,那些回复数超过100的帖子标题旁边,会出现一个橙色的“热门”标签,并且所有标题都比以前更粗、更大了。
第四部分:高级技巧与注意事项
自定义函数
PHPWind 内置的函数不够用,你可以在 PHP 后端定义一个函数,然后在模板中调用。
- PHP 后端代码 (
global.php或某个控制器中):function getFirstImg($content) { // 从内容中提取第一张图片的URL preg_match_all('/<img.*?src="(.*?)".*?>/i', $content, $matches); return !empty($matches[1][0]) ? $matches[1][0] : 'default.jpg'; } - 模板中调用:
<img src="{getFirstImg($thread.content)}" alt="帖子首图">
模板继承 (PHPWind 9.x 及以后版本)
这是一个更高级的特性,类似于其他框架的“模板布局”,你可以定义一个基础模板(layout.htm),其他模板文件(如 index.htm)可以“继承”它,然后只替换其中定义好的“区块”。
-
基础模板
template/wind/layout.htm:<!DOCTYPE html> <html> <head> <title>{block name="title"}默认标题{/block}</title> {block name="css"}{/block} </head> <body> {block name="header"}{template "common/header"}{/block} <div class="main"> {block name="content"}这里是默认内容{/block} </div> {block name="footer"}{template "common/footer"}{/block} </body> </html> -
子模板
template/wind/index.htm:{extend "layout.htm"} {block name="title"} - 首页 {/block} {block name="css"} <link rel="stylesheet" href="index.css"> {/block} {block name="content"} <!-- 这里是首页特有的内容 --> <loop name="threadList" key="k" value="thread"> {thread.subject} </loop> {/block}使用
{extend "layout.htm"}来继承基础模板,然后用{block}标签来覆盖或填充父模板中的内容。
注意事项
- 不要在模板中写 PHP 代码:模板文件
.htm不应该包含<?php ... ?>代码,这违背了模板分离的原则。 - 变量名区分大小写:
{$username}和{$Username}是两个不同的变量。 - 善用注释:在模板中使用
<!-- 这是一个注释 -->来解释复杂的逻辑,方便自己或他人后期维护。 - 保持结构清晰:合理的缩进和排版能让模板文件更易读。
总结与学习资源
PHPWind 的模板系统虽然有其独特的语法,但核心思想非常清晰,掌握 变量、循环、判断、包含 这四大核心标签,以及 u()、lang() 等几个关键函数,你就能完成绝大多数的模板修改工作。
学习资源:
- 官方文档:查阅 PHPWind 官方提供的开发者文档,这是最权威的资料。
- 官方论坛/社区:在 PHPWind 的官方社区,有很多开发者分享的教程和源码,你可以从中学习。
- 分析现有主题:下载一套现成的主题,直接打开它的模板文件,对照着网站效果,分析它是如何实现的,这是最快的学习方法之一。
- 修改默认主题:不要一开始就尝试从零制作一个主题,先在默认主题的基础上做小改动,逐步深入,你会很快理解其工作原理。
希望这份教程能对你有所帮助!祝你制作出漂亮的 PHPWind 网站!
