PHPWind 模板系统核心教程

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

phpwind 模板 教程
(图片来源网络,侵删)
  • 分工明确:程序员专注于后端逻辑,美工/前端专注于页面设计。
  • 安全:模板文件不包含 PHP 执行代码,更安全。
  • 高效:修改页面内容时,无需改动核心 PHP 文件,只需修改模板文件即可。

第一部分:基础概念与核心标签

在开始之前,你需要了解几个核心概念:

  1. 模板文件:通常以 .htm 为后缀,存放在 template/ 目录下的对应主题文件夹中,默认主题的首页模板路径是 template/wind/index.htm
  2. 模板标签:PHPWind 模板引擎使用一套自定义的标签语法,用来在模板中调用 PHP 变量、执行循环、判断等操作。
  3. 主题:一套完整的模板文件集合,包括 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.htmfooter.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.htmtemplate/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() 等几个关键函数,你就能完成绝大多数的模板修改工作。

学习资源

  1. 官方文档:查阅 PHPWind 官方提供的开发者文档,这是最权威的资料。
  2. 官方论坛/社区:在 PHPWind 的官方社区,有很多开发者分享的教程和源码,你可以从中学习。
  3. 分析现有主题:下载一套现成的主题,直接打开它的模板文件,对照着网站效果,分析它是如何实现的,这是最快的学习方法之一。
  4. 修改默认主题:不要一开始就尝试从零制作一个主题,先在默认主题的基础上做小改动,逐步深入,你会很快理解其工作原理。

希望这份教程能对你有所帮助!祝你制作出漂亮的 PHPWind 网站!