在 PHPCMS(特指其 V9 版本,这是最经典的版本)中,模板引擎是基于 libs/template.class.php 实现的,它有一套自己的标签系统,目的是将业务逻辑与页面展示分离,让不懂 PHP 的前端设计师也能制作模板。

phpcms 模板php标签
(图片来源网络,侵删)

这套标签系统分为两大类:

  1. 系统内置标签:由 PHPCMS 框架提供,用于调用数据、执行常用操作(如循环、判断、包含文件等)。
  2. PHP 原生标签:直接在模板中嵌入 PHP 代码,用于实现系统标签无法满足的复杂逻辑。

下面我们重点讲解 PHP 原生标签,这是你问题的核心。


PHP 原生标签的基本语法

PHPCMS 提供了两种在模板中直接使用 PHP 代码的方式:

{php} ... {/php}

这是最常用、最推荐的方式,它可以在模板的任何位置嵌入一段或多段 PHP 代码。

phpcms 模板php标签
(图片来源网络,侵删)

语法格式:

{php
    // 在这里写你的 PHP 代码
    // 可以是多行
    $my_variable = "Hello from PHP!";
    echo $my_variable;
}

特点:

  • 代码块形式:适用于执行一段或多行 PHP 逻辑,比如定义变量、进行复杂计算、调用非模型类的静态方法等。
  • 作用域:在 {php} 标签内定义的变量,在整个模板页面中都是有效的(全局作用域)。

{php echo ...;}{$var} 形式

这种方式主要用于输出单个变量或一个简单的 PHP 表达式的结果

语法格式:

phpcms 模板php标签
(图片来源网络,侵删)
<!-- 输出一个变量 -->
{php echo $my_variable;}
<!-- 更简洁的写法,使用模板引擎的变量输出功能 -->
{$my_variable}
<!-- 输出一个函数的返回值 -->
{php echo date('Y-m-d H:i:s');}
<!-- 或者使用更灵活的函数调用标签 -->
{function date('Y-m-d H:i:s')}

特点:

  • 行内形式:适合在 HTML 属性或文本内容中快速输出一个值。
  • 注意{$var} 实上是模板引擎的变量输出语法,它内部会调用 echo,而 {php echo ...;} 是直接执行 PHP 代码。

PHP 原生标签的常见应用场景

当你发现 PHPCMS 的系统标签(如 {loop}, {if})不够用时,就可以考虑使用 PHP 标签。

场景 1:定义变量并使用

{php
    // 从 URL 获取一个 ID 参数
    $id = $_GET['id'];
    // 根据ID做一些处理
    $title = "文章标题 #" . $id;
}
<h1>{$title}</h1>

场景 2:调用非模型类的静态方法或实例化类

这是最常见的需求,系统标签通常只能调用 model 目录下模型类的方法,如果你需要调用其他类(如数据库操作类、缓存类、工具类等),就必须用 PHP 标签。

示例:直接使用 pc_base::load_model() 加载模型并执行原生 SQL 查询

{php
    // 1. 加载模型类
    $model = pc_base::load_model('content_model'); // 假设你的表在 content 模型中
    // 2. 执行原生 SQL 查询
    $sql = "SELECT id, title, inputtime FROM v9_news WHERE status=1 ORDER BY id DESC LIMIT 5";
    $data = $model->query($sql);
    // 3. 将查询结果赋值给一个变量,以便在后面的 {loop} 中使用
    // 注意:这里我们自定义了一个变量名 $my_custom_list
    $my_custom_list = $data;
}
<!-- 3. 使用系统标签 loop 来遍历我们自定义的变量 -->
{loop $my_custom_list $r}
    <li>
        <a href="{$r['url']}">{$r['title']}</a>
        <span>{date('Y-m-d', $r['inputtime'])}</span>
    </li>
{/loop}

场景 3:复杂的条件判断

if 标签的逻辑过于复杂时,可以用 PHP 标签来处理。

{php
    $user_level = 3; // 假设这是从数据库获取的用户等级
    $is_vip = ($user_level > 2) ? true : false;
}
{if $is_vip}
    <div class="vip-content">
        这里是 VIP 专享内容。
    </div>
{else}
    <div class="normal-content">
        请升级 VIP 以查看更多内容。
    </div>
{/if}

场景 4:执行循环和数组操作

{php
    $tags = array('php', 'html', 'css', 'javascript');
    shuffle($tags); // 打乱数组顺序
}
<ul>
{loop $tags $tag}
    <li>{$tag}</li>
{/loop}
</ul>

场景 5:包含外部 PHP 文件

如果你有一些可复用的 PHP 逻辑,写在了单独的文件里,可以在模板中引入。

假设你有一个文件 my_functions.php

// my_functions.php
function get_greeting($name) {
    return "你好, " . $name . "!";
}

在你的模板文件中:

{php
    // 引入文件
    include_once PHPCMS_PATH . 'my_functions.php';
    // 调用函数
    $greeting = get_greeting('访客');
}
<h2>{$greeting}</h2>

重要注意事项和最佳实践

  1. 安全第一:直接在模板中写 PHP 意味着将一部分控制权交给了模板文件。绝对不要让用户输入直接进入 {php} 标签执行,这会导致严重的安全漏洞(如代码注入),所有用户输入必须经过严格过滤和验证。

  2. 性能考虑:模板引擎的主要优势是缓存编译后的模板,大量的 PHP 逻辑写在模板中,可能会破坏缓存机制,或者导致模板文件臃肿,影响维护和加载性能。应遵循“胖模型,瘦控制器,瘦模板”的原则

  3. 职责分离

    • 模型:负责数据操作和业务逻辑。
    • 控制器:负责调用模型,获取数据,并将数据分配给模板。
    • 模板:负责展示数据,只包含最简单的展示逻辑(如 if, loop)。
    • PHP 标签:是“例外”或“补充”,当你发现控制器或模型无法方便地完成某个任务时,才在模板中使用它来“救急”。
  4. 变量作用域:在 {php} 标签内定义的变量,会直接成为模板的全局变量,要注意变量名不要与系统变量或循环变量冲突。

  5. 调试:在模板中调试 PHP 代码很麻烦,建议在开发时,可以将 error_reporting 设置为 E_ALL,并开启 PHP 的错误显示,这样能更快地定位问题。

标签类型 语法 主要用途 优点 缺点
系统标签 {loop}, {if}, {category}, {pc} 调用框架预设的数据和方法 安全、高效、易于维护 功能有限,无法处理复杂逻辑
PHP 标签 {php ... }, {php echo ...;} 执行原生 PHP 代码,实现复杂逻辑 功能强大,灵活 可能破坏 MVC 结构,有安全风险,不利于维护

核心建议:尽量使用 PHPCMS 的系统标签,当确实无法完成需求时,再使用 {php} 标签,并且只将最必要的、无法下放到控制器或模型的逻辑放在模板中,这能让你在功能强大和代码优雅之间找到最佳平衡点。