dede runphp yes怎么用?具体用法是什么?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 DEDE建站 正文

核心概念

runphp='yes' 的核心作用是:将指定字段的值作为 PHP 代码来执行,并将执行结果(通常是 echoreturn 的内容)输出到模板中。

dede runphp yes 用法
(图片来源网络,侵删)

它的基本语法是:

{dede:field name='字段名' runphp='yes'}
    // 在这里写你的 PHP 代码
    // 注意:PHP 代码块必须以 ?> 
[/dede:field]

工作原理与关键点

  1. name 属性:指定你要获取哪个字段的值,这个值会作为 PHP 代码的输入。
  2. runphp='yes':开启 PHP 执行模式。
  3. 代码执行环境:你的 PHP 代码是在一个受限的沙盒环境中执行的,DedeCMS 已经预先定义了一些全局变量和函数,方便你调用。
  4. 输出方式:有两种主要方式输出结果:
    • echo 输出:直接使用 echoprint 函数将内容输出,这是最直接的方式。
    • return 返回:使用 return 语句将结果返回给 DedeCMS 的模板引擎。推荐使用这种方式,因为它更灵活,可以在代码中进行逻辑判断,然后返回不同的内容。

实战应用示例

下面通过几个常见的场景来理解它的用法。

示例 1:简单的字符串处理(截取、替换)

假设你有一个文章摘要字段 description太长,想在首页只显示前 50 个字符。

模板代码:

dede runphp yes 用法
(图片来源网络,侵删)
{dede:field.description runphp='yes'}
    $str = @me; // @me 是一个特殊变量,代表当前字段的原始值,即 field.description 的内容
    $sub_str = cn_substr($str, 50); // 使用 DedeCMS 自带的 cn_substr 函数进行中文截取
    @me = $sub_str; // 将处理后的结果重新赋值给 @me,模板会输出 @me 的值
{/dede:field.description}

代码解析:

  • $str = @me;@me 是核心变量,它代表了 {dede:field.description} 这个标签的原始值,你必须先把它赋给一个普通变量才能操作。
  • cn_substr($str, 50);:调用 DedeCMS 的 cn_substr 函数进行安全的中文截取,防止乱码。
  • @me = $sub_str;:将处理后的字符串重新赋值给 @me,模板引擎最终会输出 @me 的值。

示例 2:根据字段值进行逻辑判断

假设你有一个自定义字段 flag,它的值可能是 1(热门)或 0(普通),你想根据这个值显示不同的文字或样式。

模板代码:

{dede:field name='flag' runphp='yes'}
    if(@me == 1) {
        @me = "<span class='hot-tag'>热门</span>";
    } else {
        @me = "<span class='normal-tag'>普通</span>";
    }
{/dede:field.flag}

代码解析:

dede runphp yes 用法
(图片来源网络,侵删)
  • 使用 if...else... 语句判断 @me 的值。
  • @me1,就将一段 HTML 赋值给 @me
  • 否则,将另一段 HTML 赋值给 @me
  • 最终模板会渲染出对应的 HTML 标签。

示例 3:调用其他函数或获取其他变量

这是 runphp 最强大的地方,你可以在代码块内调用 DedeCMS 的全局函数或获取其他字段的值。

假设你想在文章列表页显示文章的发布时间,格式为 "Y-m-d H:i:s"。

模板代码:

{dede:field.pubdate runphp='yes'}
    // 使用 date() 函数格式化时间戳
    // @me 在这里是 pubdate 字段的时间戳
    @me = date('Y-m-d H:i:s', @me);
{/dede:field.pubdate}

代码解析:

  • @me 在这里是 pubdate 字段的值,它是一个 Unix 时间戳。
  • 使用 PHP 原生的 date() 函数将其格式化为我们想要的字符串格式。
  • 将格式化后的字符串重新赋值给 @me 进行输出。

示例 4:使用 return 语句(更推荐)

当你的逻辑比较复杂,或者需要在一个 if 语句中返回不同内容时,使用 return 会更清晰。

场景:如果文章有缩略图(litpic 字段不为空),则显示缩略图,否则显示一个默认图片。

模板代码:

{dede:field name='litpic' runphp='yes'}
    if(empty(@me) || @me == '/images/defaultpic.gif') {
        // 如果缩略图为空或者是默认图,则返回默认图片路径
        return '/images/no-image.jpg';
    } else {
        // 否则,返回原来的缩略图路径
        return @me;
    }
{/dede:field.litpic}

代码解析:

  • 这里我们没有使用 @me = ...,而是直接使用 return ...
  • 代码的执行结果就是 return 的值。
  • 这种写法在逻辑判断时更符合 PHP 的习惯,可读性更好。

常用 DedeCMS 全局变量和函数

runphp 代码块中,你可以使用以下预定义的变量和函数:

常用全局变量

  • @me最重要的变量,代表当前标签的原始值。
  • $dsql:DedeCMS 的数据库连接对象,可以直接用来进行数据库查询。
  • $cfg_cmspath:网站根目录地址。
  • $cfg_mainsite:网站主域名。
  • $cfg_multi_site:是否开启多站点。

常用函数

  • cn_substr($str, $length):安全截取中文字符串。
  • GetOneUrl($aid):根据文章 ID 获取文章链接。
  • GetMeres($typeid, $row, $col,...`):获取相关文章。
  • GetImage($img, $style=''):处理图片,如添加缩略图样式。

安全注意事项

runphp 虽然强大,但也带来了安全风险,因为它允许在模板中执行任意 PHP 代码。

  1. 防止 SQL 注入:如果使用 $dsql 进行查询,一定要对用户输入或变量进行过滤和转义。

    // 安全做法
    $aid = intval(@me); // 假设 @me 是一个 ID
    $row = $dsql->GetOne("SELECT title FROM dede_archives WHERE id = $aid");
    @me = $row['title'];
    // 危险做法(不要这样做)
    $row = $dsql->GetOne("SELECT title FROM dede_archives WHERE id = '@me'");
  2. 防止 XSS 攻击:如果输出的内容可能包含用户提交的数据(如评论、文章内容),一定要进行转义。

    // 安全做法
    $content = htmlspecialchars(@me, ENT_QUOTES, 'UTF-8');
    @me = $content;
    // 或者使用 DedeCMS 自带的函数
    @me = htmlspecialchars(@me);
  3. 权限控制:确保只有有权限的管理员或可信的用户才能编辑包含 runphp='yes' 的模板,不要在前台用户可以提交内容并直接展示的地方滥用此功能。

特性 说明
用途 在模板中执行 PHP 代码,实现动态数据处理和逻辑判断。
核心变量 @me,代表当前标签的原始值。
输出方式 @me = '...'return '...'return 在复杂逻辑中更推荐。
优势 灵活性极高,能实现很多标签本身无法完成的功能。
风险 安全性较低,容易引入 SQL 注入、XSS 等漏洞。
最佳实践 只在必要时使用,对用户输入进行严格过滤和转义,优先使用 return 语句。

掌握了 runphp='yes' 的用法,你就能极大地提升 DedeCMS 模板的定制能力和开发效率。

-- 展开阅读全文 --
头像
如何轻松玩转AVR单片机C语言?
« 上一篇 2025-12-12
c语言从入门到精通 实例版PDF哪里能找到?
下一篇 » 2025-12-12
取消
微信二维码
支付宝二维码

目录[+]