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

dedecms 模板 if else
(图片来源网络,侵删)

核心方法:if

这是最常用、最标准的 Dedecms 条件判断方法,它通常用在循环标签(如 arclist, list, channel 等)的内部,用于判断当前循环项的某个字段值。

基本语法

{dede:if condition='(条件表达式)'}
    <!-- 如果条件成立,显示这里的 HTML 内容 -->
{else}
    <!-- 如果条件不成立,显示这里的 HTML 内容 -->
{/dede:if}

condition 属性中的判断语法

condition 属性值是一个字符串,里面可以包含多种判断逻辑:

  1. 判断字段值是否等于某个字符串

    • 语法: 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}
  2. 判断字段值是否不等于某个字符串

    dedecms 模板 if else
    (图片来源网络,侵删)
    • 语法: 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}
  3. 判断字段值是否包含某个字符

    • 语法: 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}
  4. 判断数字大小

    • 语法: 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}
  5. 判断字符串是否为空

    • 语法: 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}
  6. 组合判断 (AND / OR)

    dedecms 模板 if else
    (图片来源网络,侵删)
    • 语法: 使用 && 表示 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 用法!