DedeCMS 是一个基于 PHP 和 MySQL 开发的开源网站管理系统,其核心逻辑是通过 PHP 代码来控制模板的渲染,掌握 PHP 判断是进行二次开发和自定义功能的关键。
核心思想:PHP 代码如何嵌入 DedeCMS 模板?
在 DedeCMS 中,主要有两种方式来执行 PHP 代码:
-
直接在模板文件中使用
php:这是最直接的方式,适用于简单的逻辑判断。{dede:php} // 你的 PHP 代码在这里 $a = 1; if ($a == 1) { echo '变量 a 的值是 1'; } {/dede:php} -
使用
if条件判断标签:这是 DedeCMS 官方推荐且更安全、更优雅的方式,专门为模板设计,它只允许执行有限的、安全的表达式,能有效防止恶意代码注入。
使用 DedeCMS 的 if 条件判断标签 (推荐)
这是最常用、最安全的方法。if 标签可以放在模板的任何位置,用于根据条件显示不同的内容。
基本语法
{dede:if condition='判断条件'}
<!-- 条件为真时显示的内容 -->
{else}
<!-- 条件为假时显示的内容 (可选) -->
{/dede:if}
常量判断
判断系统常量或自定义常量是否被定义。
{dede:if condition='defined("TEST_CONSTANT")'}
常量 TEST_CONSTANT 已经被定义。
{/dede:if}
变量存在与值判断
这是最常见的需求,比如判断栏目、文章、会员等特定字段的值。
语法: (@变量名 == '值') 或 (变量名 == '值'),使用 可以避免变量未定义时产生的警告。
示例1:判断文章是否为“头条”文章
在文章详情页 article_article.htm,通过 field 标签获取字段值。
{dede:field name='typeid' function="GetTopTypename(@me)" /}
{dede:field name='flag' function="strip_tags(@me)" /}
{dede:if condition='(@flag == "h")'}
<span class="hot-tag">[头条]</span>
{/dede:if}
示例2:判断会员等级 在会员中心模板,判断当前会员的等级。
{dede:if condition='(@rank == 1)'}
<p>您是 <strong>普通会员</strong>。</p>
{else if condition='(@rank == 2)'}
<p>您是 <strong>高级会员</strong>。</p>
{else}
<p>您是 <strong>游客</strong>。</p>
{/dede:if}
示例3:判断栏目是否为外部链接 在列表页或首页的栏目循环标签中。
{dede:channel type='top' row='8'}
<li>
{dede:if condition='(@typeid == 0)'}
<!-- 如果是外部链接,直接输出链接 -->
<a href="{dede:field name='typedir'/}/">{dede:field name='typename'/}</a>
{else}
<!-- 如果是内部栏目,生成栏目链接 -->
<a href="[field:typelink/]">{field:typename/}</a>
{/dede:if}
</li>
{/dede:channel}
示例4:使用 in 判断值是否在数组中
判断文章是否同时具有“头条”和“推荐”两个属性。
{dede:if condition="(@flag|inarray:'h') && (@flag|inarray:'c')"}
<span class="super-hot">[超级推荐]</span>
{/dede:if}
或者使用更简洁的 strstr 函数:
{dede:if condition='(strstr(@flag, "h") && strstr(@flag, "c"))'}
<span class="super-hot">[超级推荐]</span>
{/dede:if}
函数调用与复杂判断
你可以在 condition 中调用 PHP 函数,并利用其返回值进行判断。
示例1:判断当前时间是否在指定活动期间
{dede:php}
$start_time = strtotime('2025-10-01 00:00:00');
$end_time = strtotime('2025-10-07 23:59:59');
$current_time = time();
{/dede:php}
{dede:if condition='($current_time >= $start_time && $current_time <= $end_time)'}
<div class="promotion-banner">国庆大促活动进行中!全场8折!</div>
{/dede:if}
示例2:判断栏目是否有子栏目
{dede:php}
$dsql = new DedeSql(false);
$sql = "SELECT id FROM `#@__arctype` WHERE reid='{$typeid}' AND ishidden<>1";
$row = $dsql->GetOne($sql);
$hasChild = is_array($row);
{/dede:php}
{dede:if condition="$hasChild"}
<a href="javascript:;" onclick="ShowMainMenu('{$typeid}')">展开/收起</a>
{/dede:if}
在模板中使用 dede:php
当你需要执行复杂的、多行的 PHP 逻辑,或者需要操作数据库、引入外部类文件时,{dede:php} 标签就派上用场了。
注意: 使用此标签有安全风险,请确保你的代码来源可靠,不要随意允许用户输入的代码进入此标签。
基本语法
{dede:php}
// 你的 PHP 代码
// 可以使用 $this 来访问 DedeCMS 的核心对象,如 $this->dsql
{/dede:php}
示例1:查询数据库并输出结果
假设要在首页显示一个“最新评论”列表。
<div class="latest-comments">
<h3>最新评论</h3>
<ul>
{dede:php}
// 1. 获取数据库连接对象
$dsql = $this->dsql;
// 2. 编写 SQL 查询语句
$sql = "SELECT * FROM `#@__feedback`
WHERE ischeck=1
ORDER BY dtime DESC
LIMIT 5";
// 3. 执行查询
$dsql->SetQuery($sql);
$dsql->Execute();
// 4. 循环输出结果
while ($row = $dsql->GetArray()) {
$uname = htmlspecialchars($row['uname']);
$msg = htmlspecialchars($row['msg']);
$dtime = MyDate('m-d H:i', $row['dtime']);
echo "<li><span>{$uname}</span>说: {$msg} ({$dtime})</li>";
}
{/dede:php}
</ul>
</div>
示例2:包含外部 PHP 文件
如果你有一些可复用的函数库,可以在模板中引入。
{dede:php}
// 引入自定义函数库
require_once(DEDEINC . '/my_functions.php');
// 调用库中的函数
$greeting = getWelcomeMessage();
echo "<div class='welcome'>{$greeting}</div>";
{/dede:php}
修改 PHP 源文件 (核心逻辑修改)
这是最根本但也是最不推荐普通用户使用的方法,因为它需要修改 DedeCMS 的核心程序文件,升级时可能会被覆盖,当你需要修改系统默认行为(比如修改 arc.archives.class.php 中的文章生成逻辑)时才会用到。
场景: 修改文章内容页的 title 标签生成规则。
- 找到文件:
/include/arc.archives.class.php
- 定位代码:查找
GetTitle 函数或相关生成标题的代码段。
- 修改逻辑:在 PHP 代码中直接使用
if/else/switch 等进行判断和修改。
// 在 arc.archives.class.php 文件中
function GetTitle($title)
{
// 你的自定义判断逻辑
if ($this->ChannelUnit->ChannelInfos['nid'] == 1) { // 假设新闻栏目ID为1
// 给新闻标题加上前缀
return '最新新闻 - ' . $title;
} else {
// 其他栏目保持不变
return $title;
}
}
总结与最佳实践
方法
优点
缺点
适用场景
dede:if
安全、简洁、官方推荐,专为模板设计。
功能相对有限,无法执行复杂PHP逻辑。
绝大多数模板判断需求,如字段值判断、常量判断、简单函数调用。
dede:php
功能强大,可执行任意PHP代码,操作数据库等。
有安全风险,代码可读性差,升级可能冲突。
复杂数据查询、循环输出、引入外部库、{dede:if} 无法完成的任务。
修改PHP源文件
从根本上改变系统行为,性能最高。
破坏性最强,升级麻烦,需要懂PHP和DedeCMS底层逻辑。
修改系统核心功能,如文章生成、栏目列表的底层逻辑。
给开发者的建议:
- 优先使用
dede:if:尽量用 DedeCMS 提供的标签和函数来完成你的需求,这是最安全、最规范的方式。
- 谨慎使用
dede:php:当 dede:if 无法满足时再使用它,并确保代码的安全性,避免 eval 等危险函数。
- 避免直接修改核心文件:除非你非常清楚自己在做什么,并且做好了升级时重新修改的准备,否则,应优先考虑通过二次开发或覆盖模板文件的方式来实现。
- 善用函数:将复杂的逻辑封装到
include/extend.func.php 文件中,然后在模板中通过 function 调用,这是非常好的实践,能让模板更干净。
希望这份详细的指南能帮助你更好地理解和应用 DedeCMS 中的 PHP 判断!
当你需要执行复杂的、多行的 PHP 逻辑,或者需要操作数据库、引入外部类文件时,{dede:php} 标签就派上用场了。
注意: 使用此标签有安全风险,请确保你的代码来源可靠,不要随意允许用户输入的代码进入此标签。
基本语法
{dede:php}
// 你的 PHP 代码
// 可以使用 $this 来访问 DedeCMS 的核心对象,如 $this->dsql
{/dede:php}
示例1:查询数据库并输出结果
假设要在首页显示一个“最新评论”列表。
<div class="latest-comments">
<h3>最新评论</h3>
<ul>
{dede:php}
// 1. 获取数据库连接对象
$dsql = $this->dsql;
// 2. 编写 SQL 查询语句
$sql = "SELECT * FROM `#@__feedback`
WHERE ischeck=1
ORDER BY dtime DESC
LIMIT 5";
// 3. 执行查询
$dsql->SetQuery($sql);
$dsql->Execute();
// 4. 循环输出结果
while ($row = $dsql->GetArray()) {
$uname = htmlspecialchars($row['uname']);
$msg = htmlspecialchars($row['msg']);
$dtime = MyDate('m-d H:i', $row['dtime']);
echo "<li><span>{$uname}</span>说: {$msg} ({$dtime})</li>";
}
{/dede:php}
</ul>
</div>
示例2:包含外部 PHP 文件
如果你有一些可复用的函数库,可以在模板中引入。
{dede:php}
// 引入自定义函数库
require_once(DEDEINC . '/my_functions.php');
// 调用库中的函数
$greeting = getWelcomeMessage();
echo "<div class='welcome'>{$greeting}</div>";
{/dede:php}
修改 PHP 源文件 (核心逻辑修改)
这是最根本但也是最不推荐普通用户使用的方法,因为它需要修改 DedeCMS 的核心程序文件,升级时可能会被覆盖,当你需要修改系统默认行为(比如修改 arc.archives.class.php 中的文章生成逻辑)时才会用到。
场景: 修改文章内容页的 title 标签生成规则。
- 找到文件:
/include/arc.archives.class.php - 定位代码:查找
GetTitle函数或相关生成标题的代码段。 - 修改逻辑:在 PHP 代码中直接使用
if/else/switch等进行判断和修改。
// 在 arc.archives.class.php 文件中
function GetTitle($title)
{
// 你的自定义判断逻辑
if ($this->ChannelUnit->ChannelInfos['nid'] == 1) { // 假设新闻栏目ID为1
// 给新闻标题加上前缀
return '最新新闻 - ' . $title;
} else {
// 其他栏目保持不变
return $title;
}
}
总结与最佳实践
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
dede:if |
安全、简洁、官方推荐,专为模板设计。 | 功能相对有限,无法执行复杂PHP逻辑。 | 绝大多数模板判断需求,如字段值判断、常量判断、简单函数调用。 |
dede:php |
功能强大,可执行任意PHP代码,操作数据库等。 | 有安全风险,代码可读性差,升级可能冲突。 | 复杂数据查询、循环输出、引入外部库、{dede:if} 无法完成的任务。 |
| 修改PHP源文件 | 从根本上改变系统行为,性能最高。 | 破坏性最强,升级麻烦,需要懂PHP和DedeCMS底层逻辑。 | 修改系统核心功能,如文章生成、栏目列表的底层逻辑。 |
给开发者的建议:
- 优先使用
dede:if:尽量用 DedeCMS 提供的标签和函数来完成你的需求,这是最安全、最规范的方式。 - 谨慎使用
dede:php:当dede:if无法满足时再使用它,并确保代码的安全性,避免eval等危险函数。 - 避免直接修改核心文件:除非你非常清楚自己在做什么,并且做好了升级时重新修改的准备,否则,应优先考虑通过二次开发或覆盖模板文件的方式来实现。
- 善用函数:将复杂的逻辑封装到
include/extend.func.php文件中,然后在模板中通过function调用,这是非常好的实践,能让模板更干净。
希望这份详细的指南能帮助你更好地理解和应用 DedeCMS 中的 PHP 判断!
