Dedecms 的模板引擎主要使用 {dede:} 标签和相关的 PHP 语法,条件判断是模板开发中非常核心的功能,用于实现动态内容显示、不同用户/角色展示不同信息等。

(图片来源网络,侵删)
核心方法:if
这是最常用、最标准的 Dedecms 条件判断方法,它通常用在循环标签(如 arclist, list, channel 等)的内部,用于判断当前循环项的某个字段值。
基本语法
{dede:if condition='(条件表达式)'}
<!-- 如果条件成立,显示这里的 HTML 内容 -->
{else}
<!-- 如果条件不成立,显示这里的 HTML 内容 -->
{/dede:if}
condition 属性中的判断语法
condition 属性值是一个字符串,里面可以包含多种判断逻辑:
-
判断字段值是否等于某个字符串
- 语法:
field:字段名 == '值'
- 示例: 判断文章的
flag 字段是否包含 'h' (头条)。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="field:flag == 'h'"}
<span class="hot">[头条]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
-
判断字段值是否不等于某个字符串
(图片来源网络,侵删)
- 语法:
field:字段名 != '值'
- 示例: 判断文章的
flag 字段是否不包含 'c' (推荐)。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="field:flag != 'c'"}
<span class="normal">[普通]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
-
判断字段值是否包含某个字符
- 语法:
strpos(field:字段名, '字符') !== false
- 示例: 判断文章的
flag 字段是否包含 'h' (头条)或 'c' (推荐),这是判断 flag(一个字符集字段)最常用的方法。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="strpos(field:flag, 'h') !== false"}
<span class="hot">[头条]</span>
{else if condition="strpos(field:flag, 'c') !== false"}
<span class="commend">[推荐]</span>
{else}
<span class="normal">[普通]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
-
判断数字大小
- 语法:
field:数字字段名 > 数字 (同样支持 <, >=, <=, , )
- 示例: 判断文章的
click (点击量)是否大于 1000。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="field:click > 1000"}
<span class="popular">[热门]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
-
判断字符串是否为空
- 语法:
field:字段名 == ''
- 示例: 判断文章的
keywords (关键词)字段是否为空,如果为空则使用文章标题作为关键词。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="field:keywords == ''"}
<!-- 如果关键词为空,这里可以不显示任何东西,或者显示默认提示 -->
{else}
<span class="keywords">关键词: [field:keywords/]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
-
组合判断 (AND / OR)
(图片来源网络,侵删)
- 语法: 使用
&& 表示 AND, 表示 OR。
- 示例: 判断文章是否是头条 (
h) 并且点击量大于 500。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="strpos(field:flag, 'h') !== false && field:click > 500"}
<span class="super-hot">[超级热门]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
else if 的使用
当有多个条件需要依次判断时,可以使用 else if。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="strpos(field:flag, 'h') !== false"}
<span class="hot">[头条]</span>
{else if condition="strpos(field:flag, 'c') !== false"}
<span class="commend">[推荐]</span>
{else if condition="strpos(field:flag, 'j') !== false"}
<span class="jump">[跳转]</span>
{else}
<span class="normal">[普通]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
辅助方法:PHP 代码块
if 标签无法满足复杂的逻辑需求(需要调用函数、进行复杂的数学运算或操作 PHP 变量),你可以在模板中直接嵌入 PHP 代码。
基本语法
<?php if (条件表达式): ?>
<!-- HTML 内容 1 -->
<?php else: ?>
<!-- HTML 内容 2 -->
<?php endif; ?>
注意:
- 你的网站目录必须设置有可执行权限(通常是
755)。
- 为了安全起见,请在后台“系统” -> “系统基本参数” -> “核心设置”中,开启“模板引擎禁制PHP”选项(通常情况下,为了安全,建议关闭此选项,即设置为“否”,否则下面的代码无法执行)。
示例
场景: 根据当前的时间,显示不同的问候语。
<div class="greeting">
<?php
$hour = date('H');
if ($hour < 6) {
echo "夜深了,注意休息!";
} elseif ($hour < 12) {
echo "早上好!";
} elseif ($hour < 14) {
echo "中午好!";
} elseif ($hour < 18) {
echo "下午好!";
} else {
echo "晚上好!";
}
?>
</div>
场景: 判断一个自定义的 PHP 变量是否存在。
<?php $myVar = "Hello, Dedecms!"; ?>
<?php if (isset($myVar) && $myVar == 'Hello, Dedecms!'): ?>
<p>变量存在且值正确。</p>
<?php else: ?>
<p>变量不存在或值不正确。</p>
<?php endif; ?>
全局判断:global
global 标签用于获取全局变量(如 cfg_webname, cfg_weburl 等)并对其进行判断,它通常用在模板的任何位置,不依赖于循环。
基本语法
{dede:global name='变量名' function='处理函数'/}
或者结合 if 进行判断:
{dede:if condition="isset($GLOBALS['变量名'])"}
<!-- 变量存在 -->
{else}
<!-- 变量不存在 -->
{/dede:if}
更常见的用法是直接判断 global 标签的值:
{dede:global name='cfg_webname' runphp='yes'}
if (@me == '我的网站') {
@me = "<strong>" . @me . "</strong>"; // @me 代表 global 标签的值
} else {
@me = "<span>" . @me . "</span>";
}
{/dede:global}
上面的例子中,runphp='yes' 允许在 global 标签内执行 PHP 代码,@me 是一个特殊变量,代表当前标签的最终值。
常见问题与最佳实践
常见问题:if 标签不生效
- 语法错误: 检查
condition 引号、括号是否配对。field: 前后不能有空格。
- 字段名错误: 确保你使用的
field:xxx 中的 xxx 是数据库中真实存在的字段名(如 title, click, flag 等)。
- 数据问题: 检查数据库中对应字段的值是否和你判断的值一致,注意空格、大小写。
- 缓存问题: 清理网站缓存(后台有缓存清理功能)和浏览器缓存。
最佳实践
- 优先使用
if 对于绝大多数基于循环内容的判断,优先使用 {dede:if condition='...'}...{/dede:if},因为它更安全、更符合 Dedecms 的模板规范。
- PHP 代码块作为补充: 将 PHP 代码块 (
<?php ... ?>) 用于 if 标签无法处理的复杂逻辑。
- 代码可读性: 当
if 嵌套很深或条件很复杂时,考虑将复杂的逻辑放到一个自定义函数中,然后在模板里调用这个函数(这需要修改PHP文件,但能极大提升模板文件的可读性)。
- 安全第一: 谨慎使用
runphp='yes' 和 <?php ?>,确保所有用户输入都经过过滤,防止代码注入。
方法
适用场景
示例
优点
缺点
if
在循环标签(arclist, list等)内,根据字段值进行判断。
{dede:if condition="field:flag == 'h'"}...{/dede:if}
安全、规范、性能好,是 Dedecms 的首选方式。
逻辑复杂时,模板文件会变得臃肿。
PHP 代码块
复杂逻辑、函数调用、全局变量操作、if-else 嵌套很深的情况。
<?php if ($a > $b): ?>...<?php endif; ?>
灵活性极高,能实现任何 PHP 功能。
有安全风险,需要服务器有执行权限,可能影响模板可读性。
global
获取和判断全局配置变量(如网站名称、URL等)。
{dede:global name='cfg_webname'/}
专门用于全局变量,方便。
主要用于获取,判断功能可通过 runphp 实现,但不如 if 标签直观。
希望这份详细的指南能帮助你熟练掌握 Dedecms 模板中的 if else 用法!
这是最常用、最标准的 Dedecms 条件判断方法,它通常用在循环标签(如 arclist, list, channel 等)的内部,用于判断当前循环项的某个字段值。
基本语法
{dede:if condition='(条件表达式)'}
<!-- 如果条件成立,显示这里的 HTML 内容 -->
{else}
<!-- 如果条件不成立,显示这里的 HTML 内容 -->
{/dede:if}
condition 属性中的判断语法
condition 属性值是一个字符串,里面可以包含多种判断逻辑:
-
判断字段值是否等于某个字符串
- 语法:
field:字段名 == '值' - 示例: 判断文章的
flag字段是否包含'h'(头条)。
{dede:arclist titlelen='30' row='5'} {dede:if condition="field:flag == 'h'"} <span class="hot">[头条]</span> {/dede:if} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} - 语法:
-
判断字段值是否不等于某个字符串
(图片来源网络,侵删)- 语法:
field:字段名 != '值' - 示例: 判断文章的
flag字段是否不包含'c'(推荐)。
{dede:arclist titlelen='30' row='5'} {dede:if condition="field:flag != 'c'"} <span class="normal">[普通]</span> {/dede:if} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} - 语法:
-
判断字段值是否包含某个字符
- 语法:
strpos(field:字段名, '字符') !== false - 示例: 判断文章的
flag字段是否包含'h'(头条)或'c'(推荐),这是判断flag(一个字符集字段)最常用的方法。
{dede:arclist titlelen='30' row='5'} {dede:if condition="strpos(field:flag, 'h') !== false"} <span class="hot">[头条]</span> {else if condition="strpos(field:flag, 'c') !== false"} <span class="commend">[推荐]</span> {else} <span class="normal">[普通]</span> {/dede:if} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} - 语法:
-
判断数字大小
- 语法:
field:数字字段名 > 数字(同样支持<,>=,<=, , ) - 示例: 判断文章的
click(点击量)是否大于 1000。
{dede:arclist titlelen='30' row='5'} {dede:if condition="field:click > 1000"} <span class="popular">[热门]</span> {/dede:if} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} - 语法:
-
判断字符串是否为空
- 语法:
field:字段名 == '' - 示例: 判断文章的
keywords(关键词)字段是否为空,如果为空则使用文章标题作为关键词。
{dede:arclist titlelen='30' row='5'} {dede:if condition="field:keywords == ''"} <!-- 如果关键词为空,这里可以不显示任何东西,或者显示默认提示 --> {else} <span class="keywords">关键词: [field:keywords/]</span> {/dede:if} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} - 语法:
-
组合判断 (AND / OR)
(图片来源网络,侵删)- 语法: 使用
&&表示 AND, 表示 OR。 - 示例: 判断文章是否是头条 (
h) 并且点击量大于 500。
{dede:arclist titlelen='30' row='5'} {dede:if condition="strpos(field:flag, 'h') !== false && field:click > 500"} <span class="super-hot">[超级热门]</span> {/dede:if} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist} - 语法: 使用
else if 的使用
当有多个条件需要依次判断时,可以使用 else if。
{dede:arclist titlelen='30' row='5'}
{dede:if condition="strpos(field:flag, 'h') !== false"}
<span class="hot">[头条]</span>
{else if condition="strpos(field:flag, 'c') !== false"}
<span class="commend">[推荐]</span>
{else if condition="strpos(field:flag, 'j') !== false"}
<span class="jump">[跳转]</span>
{else}
<span class="normal">[普通]</span>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
{/dede:arclist}
辅助方法:PHP 代码块
if 标签无法满足复杂的逻辑需求(需要调用函数、进行复杂的数学运算或操作 PHP 变量),你可以在模板中直接嵌入 PHP 代码。
基本语法
<?php if (条件表达式): ?>
<!-- HTML 内容 1 -->
<?php else: ?>
<!-- HTML 内容 2 -->
<?php endif; ?>
注意:
- 你的网站目录必须设置有可执行权限(通常是
755)。 - 为了安全起见,请在后台“系统” -> “系统基本参数” -> “核心设置”中,开启“模板引擎禁制PHP”选项(通常情况下,为了安全,建议关闭此选项,即设置为“否”,否则下面的代码无法执行)。
示例
场景: 根据当前的时间,显示不同的问候语。
<div class="greeting">
<?php
$hour = date('H');
if ($hour < 6) {
echo "夜深了,注意休息!";
} elseif ($hour < 12) {
echo "早上好!";
} elseif ($hour < 14) {
echo "中午好!";
} elseif ($hour < 18) {
echo "下午好!";
} else {
echo "晚上好!";
}
?>
</div>
场景: 判断一个自定义的 PHP 变量是否存在。
<?php $myVar = "Hello, Dedecms!"; ?>
<?php if (isset($myVar) && $myVar == 'Hello, Dedecms!'): ?>
<p>变量存在且值正确。</p>
<?php else: ?>
<p>变量不存在或值不正确。</p>
<?php endif; ?>
全局判断:global
global 标签用于获取全局变量(如 cfg_webname, cfg_weburl 等)并对其进行判断,它通常用在模板的任何位置,不依赖于循环。
基本语法
{dede:global name='变量名' function='处理函数'/}
或者结合 if 进行判断:
{dede:if condition="isset($GLOBALS['变量名'])"}
<!-- 变量存在 -->
{else}
<!-- 变量不存在 -->
{/dede:if}
更常见的用法是直接判断 global 标签的值:
{dede:global name='cfg_webname' runphp='yes'}
if (@me == '我的网站') {
@me = "<strong>" . @me . "</strong>"; // @me 代表 global 标签的值
} else {
@me = "<span>" . @me . "</span>";
}
{/dede:global}
上面的例子中,runphp='yes' 允许在 global 标签内执行 PHP 代码,@me 是一个特殊变量,代表当前标签的最终值。
常见问题与最佳实践
常见问题:if 标签不生效
- 语法错误: 检查
condition 引号、括号是否配对。field: 前后不能有空格。
- 字段名错误: 确保你使用的
field:xxx 中的 xxx 是数据库中真实存在的字段名(如 title, click, flag 等)。
- 数据问题: 检查数据库中对应字段的值是否和你判断的值一致,注意空格、大小写。
- 缓存问题: 清理网站缓存(后台有缓存清理功能)和浏览器缓存。
最佳实践
- 优先使用
if 对于绝大多数基于循环内容的判断,优先使用 {dede:if condition='...'}...{/dede:if},因为它更安全、更符合 Dedecms 的模板规范。
- PHP 代码块作为补充: 将 PHP 代码块 (
<?php ... ?>) 用于 if 标签无法处理的复杂逻辑。
- 代码可读性: 当
if 嵌套很深或条件很复杂时,考虑将复杂的逻辑放到一个自定义函数中,然后在模板里调用这个函数(这需要修改PHP文件,但能极大提升模板文件的可读性)。
- 安全第一: 谨慎使用
runphp='yes' 和 <?php ?>,确保所有用户输入都经过过滤,防止代码注入。
方法
适用场景
示例
优点
缺点
if
在循环标签(arclist, list等)内,根据字段值进行判断。
{dede:if condition="field:flag == 'h'"}...{/dede:if}
安全、规范、性能好,是 Dedecms 的首选方式。
逻辑复杂时,模板文件会变得臃肿。
PHP 代码块
复杂逻辑、函数调用、全局变量操作、if-else 嵌套很深的情况。
<?php if ($a > $b): ?>...<?php endif; ?>
灵活性极高,能实现任何 PHP 功能。
有安全风险,需要服务器有执行权限,可能影响模板可读性。
global
获取和判断全局配置变量(如网站名称、URL等)。
{dede:global name='cfg_webname'/}
专门用于全局变量,方便。
主要用于获取,判断功能可通过 runphp 实现,但不如 if 标签直观。
希望这份详细的指南能帮助你熟练掌握 Dedecms 模板中的 if else 用法!
global 标签用于获取全局变量(如 cfg_webname, cfg_weburl 等)并对其进行判断,它通常用在模板的任何位置,不依赖于循环。
基本语法
{dede:global name='变量名' function='处理函数'/}
或者结合 if 进行判断:
{dede:if condition="isset($GLOBALS['变量名'])"}
<!-- 变量存在 -->
{else}
<!-- 变量不存在 -->
{/dede:if}
更常见的用法是直接判断 global 标签的值:
{dede:global name='cfg_webname' runphp='yes'}
if (@me == '我的网站') {
@me = "<strong>" . @me . "</strong>"; // @me 代表 global 标签的值
} else {
@me = "<span>" . @me . "</span>";
}
{/dede:global}
上面的例子中,runphp='yes' 允许在 global 标签内执行 PHP 代码,@me 是一个特殊变量,代表当前标签的最终值。
常见问题与最佳实践
常见问题:if 标签不生效
- 语法错误: 检查
condition引号、括号是否配对。field:前后不能有空格。 - 字段名错误: 确保你使用的
field:xxx中的xxx是数据库中真实存在的字段名(如title,click,flag等)。 - 数据问题: 检查数据库中对应字段的值是否和你判断的值一致,注意空格、大小写。
- 缓存问题: 清理网站缓存(后台有缓存清理功能)和浏览器缓存。
最佳实践
- 优先使用
if 对于绝大多数基于循环内容的判断,优先使用{dede:if condition='...'}...{/dede:if},因为它更安全、更符合 Dedecms 的模板规范。 - PHP 代码块作为补充: 将 PHP 代码块 (
<?php ... ?>) 用于if标签无法处理的复杂逻辑。 - 代码可读性: 当
if嵌套很深或条件很复杂时,考虑将复杂的逻辑放到一个自定义函数中,然后在模板里调用这个函数(这需要修改PHP文件,但能极大提升模板文件的可读性)。 - 安全第一: 谨慎使用
runphp='yes'和<?php ?>,确保所有用户输入都经过过滤,防止代码注入。
| 方法 | 适用场景 | 示例 | 优点 | 缺点 |
|---|---|---|---|---|
if |
在循环标签(arclist, list等)内,根据字段值进行判断。 |
{dede:if condition="field:flag == 'h'"}...{/dede:if} |
安全、规范、性能好,是 Dedecms 的首选方式。 | 逻辑复杂时,模板文件会变得臃肿。 |
| PHP 代码块 | 复杂逻辑、函数调用、全局变量操作、if-else 嵌套很深的情况。 |
<?php if ($a > $b): ?>...<?php endif; ?> |
灵活性极高,能实现任何 PHP 功能。 | 有安全风险,需要服务器有执行权限,可能影响模板可读性。 |
global |
获取和判断全局配置变量(如网站名称、URL等)。 | {dede:global name='cfg_webname'/} |
专门用于全局变量,方便。 | 主要用于获取,判断功能可通过 runphp 实现,但不如 if 标签直观。 |
希望这份详细的指南能帮助你熟练掌握 Dedecms 模板中的 if else 用法!
