帝国CMS的内容模板默认是HTML和模板标签的混合体,要在其中执行PHP代码,你需要使用特定的标签将PHP代码包裹起来,并确保你的PHP代码逻辑正确。

帝国内容模板执行php
(图片来源网络,侵删)

核心方法:使用 <?php ... ?>

这是最直接、最常用的方法,你可以在内容模板中直接嵌入PHP代码。

语法:

<?php
    // 在这里写你的PHP代码
    $a = 1;
    echo $a;
?>

重要提示:

  1. 开启PHP支持:在帝国CMS后台,系统 -> 系统设置 -> 系统参数设置 -> “内容页支持程序代码” 选项,必须设置为“是”,否则,模板中的PHP代码会被当作普通文本输出,而不会被执行。
  2. 代码位置<?php ... ?> 可以放在模板的任何位置,无论是HTML内部还是外部。
  3. 代码风格:强烈建议使用 echo 来输出HTML内容,而不是混用 <?php ?><?= ?>`,这样可以保持模板的清晰和可维护性。

结合帝国CMS的灵动标签

在实际应用中,我们很少会执行孤立的PHP代码,更多的是执行PHP来获取数据进行逻辑判断,然后将结果输出,这时,就需要结合帝国CMS的“灵动标签”。

帝国内容模板执行php
(图片来源网络,侵删)

场景1:在循环中执行PHP(获取变量)

灵动标签 [e:loop] 用于循环查询数据,在循环体内,你可以使用 <?php ... ?> 来处理当前循环到的每条数据的变量。

示例:查询“新闻”栏目下的最新5条信息,并在标题前加上“[最新]”标记。

<ul>
[e:loop={"select * from [!db.pre!]ecms_news where classid='1' order by newstime desc limit 5",5,24,0}]
    <li>
        <?php 
            // 获取当前标题
            $title = $bqr['title']; 
            // 添加标记
            $new_title = '[最新] ' . $title;
        ?>
        <a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$new_title?></a>
        <span><?=date('Y-m-d', $bqr['newstime'])?></span>
    </li>
[/e:loop]
</ul>

代码解析:

  • [e:loop={...}]:查询语句,查询ecms_news表(新闻表),classid='1',按newstime降序排列,取5条。
  • 5:显示条数。
  • 24:模板ID(这里我们直接在模板里写,所以设为0或任意数字均可)。
  • 0:是否启用缓存。
  • $bqr:这是一个数组,代表“查询结果”(Query Result),包含了当前这条数据的所有字段,如 title, newstime, smalltext 等。
  • $bqsr:这是一个数组,代表“查询子栏目/相关链接”(Query Sub-Result),常用的是 $bqsr['titleurl'],即当前这条数据的链接地址。
  • <?php ... ?>:我们在这里处理 $bqr['title'],得到 $new_title
  • <?=$new_title?>:使用 <?=<?php echo ... ?> 的简写,用于输出处理后的标题。

场景2:在循环外执行PHP(初始化变量)

如果你想在循环执行前做一些准备工作,比如定义一个变量、连接一个外部API等,可以在 [e:loop] 标签外使用 <?php ... ?>

示例:查询某个栏目的文章总数,并显示在页面上方。

<div class="total-count">
    <?php
        // 1. 定义栏目ID
        $classid = 1;
        // 2. 查询该栏目下的文章总数
        $total_sql = "select count(*) as total from [!db.pre!]ecms_news where classid='$classid'";
        $total_arr = $empire->fetch1($total_sql);
        $total_num = $total_arr['total'];
        // 3. 输出结果
        echo "栏目ID为 $classid 的文章总数为:$total_num 篇。";
    ?>
</div>
<hr>
<h2>最新文章列表</h2>
<ul>
[e:loop={"select * from [!db.pre!]ecms_news where classid='1' order by newstime desc limit 5",5,24,0}]
    <li><a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a></li>
[/e:loop]
</ul>

代码解析:

  • $empire:这是帝国CMS的全局核心对象,包含了所有操作数据库、获取配置等的方法。
  • $empire->fetch1($sql):执行一条SQL查询,并返回第一条结果(一个一维数组)。
  • 我们在循环外查询并输出了总数,然后在循环内列出文章列表。

常用函数和变量

在模板中执行PHP,你需要熟悉帝国CMS提供的一些核心函数和变量。

变量/函数 说明 示例
$bqr 当前记录数据数组(在[e:loop][show]内有效) echo $bqr['title'];
$bqsr 当前记录相关信息数组(在[e:loop][show]内有效) echo $bqsr['titleurl'];
$bqno 当前记录的序号(从0开始) if($bqno % 2 == 0){ echo 'even'; }
$class_r 所有栏目的信息数组,键为栏目ID echo $class_r[1]['classname'];
$public_r 系统公共变量,如网站名称、地址等 echo $public_r['sitename'];
$empire 帝国核心对象,用于数据库操作等 $empire->query("...");
GetPageList() 获取分页列表函数 <?=GetPageList(10, 1, 0, '0')?>
format_datetime() 格式化时间戳函数 <?=format_datetime($bqr['newstime'], 'Y-m-d H:i')?>
substr() 字符串截取函数 <?=esub($bqr['title'], 20, '...')?>

安全注意事项

在模板中执行PHP代码非常强大,但也伴随着安全风险。

  1. SQL注入:如果你直接将用户输入或变量拼接到SQL语句中,极易被注入。永远不要直接拼接变量
    • 错误示范$sql = "select * from table where id=$id";
    • 正确示范:使用 $empire->quote() 函数来处理变量,或者使用查询函数的参数化查询方式(如果支持)。
  2. XSS跨站脚本:如果你直接输出用户提交的内容(如评论、标题),恶意用户可能提交 <script>alert('xss')</script> 这样的代码,使用 htmlspecialchars() 函数进行转义。
    • 错误示范echo $bqr['user_content'];
    • 正确示范echo htmlspecialchars($bqr['user_content']);
  3. 代码可读性:在模板中写复杂的PHP逻辑会使模板难以维护,对于复杂的业务逻辑,建议:
    • e/class/userfun.php 文件中编写自定义函数。
    • 在模板中调用这些函数,而不是写大段代码。
    • 示例
      1. e/class/userfun.php 中添加:
        function getNewTitle($title) {
            return '[最新] ' . $title;
        }
      2. 在模板中调用:
        <a href="<?=$bqsr['titleurl']?>" target="_blank"><?=getNewTitle($bqr['title'])?></a>

需求 推荐方法 示例
简单执行PHP 直接使用 <?php ... ?> <?php $a = 1; echo $a; ?>
循环处理数据 [e:loop] + <?php ... ?> 在循环内用 $bqr 获取数据并用PHP处理
循环前初始化 [e:loop] 标签外使用 <?php ... ?> 在循环外查询总数并定义变量
复杂数据处理 写入 userfun.php,在模板中调用 <?=myCustomFunction($param)?>

关键步骤:

  1. 后台开启:确保“内容页支持程序代码”为“是”。
  2. 使用标签:用 <?php ... ?> 包裹你的代码。
  3. 善用变量:熟练使用 $bqr, $bqsr, $empire 等核心变量。
  4. 注意安全:防范SQL注入和XSS攻击。
  5. 保持整洁:将复杂逻辑移至 userfun.php,保持模板简洁。