if 的基本语法
DedeCMS 的 if 语句主要用于 PHP 代码块 中,而不是像普通 HTML 标签那样直接使用,它遵循 PHP 的基本语法。
核心结构
{if condition}
<!-- 条件为真时显示的内容 -->
{else}
<!-- 条件为假时显示的内容 -->
{/if}
{if condition}:condition是你的判断条件。{else}: 可选部分,当条件为假时执行。{/if}:if语句的结束标签,必须要有。
常用的判断条件
if 语句的强大之处在于其丰富的判断条件,以下是几种最常用的类型:
a. 比较运算符
用于比较两个值是否相等、大小等。
| 运算符 | 含义 | 示例 |
|---|---|---|
| 等于(值相等,类型不敏感) | {if $field=='aaa'} |
|
| 恒等于(值和类型都相等) | {if $field==='aaa'} |
|
或 <> |
不等于 | {if $field!='aaa'} |
| 不恒等于 | {if $field!=='aaa'} |
|
> |
大于 | {if $field>10} |
< |
小于 | {if $field<10} |
>= |
大于等于 | {if $field>=10} |
<= |
小于等于 | {if $field<=10} |
示例: 在文章列表中,如果文章的 ID 大于 10,则显示“热门文章”的标签。
{dede:arclist titlelen='30' row='10'}
<li>
[field:title/]
{if id > 10}
<span class="hot-tag">热门</span>
{/if}
</li>
{/dede:arclist}
b. 逻辑运算符
用于组合多个条件。
| 运算符 | 含义 | 示例 |
|---|---|---|
&& 或 and |
逻辑与(所有条件都为真) | {if $a==1 && $b==2} |
或 or |
逻辑或(任意一个条件为真) | {if $a==1 or $b==2} |
| 逻辑非(取反) | {if !$field.ismake} |
示例: 只显示栏目 ID 为 1 或 2 的文章,并且文章标题不能为空。
{dede:arclist typeid='1,2' titlelen='30' row='10'}
<li>
{if typeid == 1 || typeid == 2 && title != ''}
[field:title/]
{/if}
</li>
{/dede:arclist}
c. 判断变量是否存在或为空
这在模板中非常常用,可以避免因变量未定义而导致的错误。
| 语法 | 含义 |
|---|---|
{if $myvar} |
判断 $myvar 变量是否存在且不为空(, 0, null, false 都视为空) |
{if isset($myvar)} |
判断 $myvar 变量是否已定义(比 $myvar 更严格,$myvar 为 null 或 false 时也为真) |
{if !empty($myvar)} |
判断 $myvar 变量是否不为空(与 $myvar 类似,但 0 视为空) |
示例: 如果文章的缩略图(litpic)存在,则显示图片,否则显示默认图片。
{dede:arclist titlelen='30' row='10'}
<li>
{if litpic != ''}
<img src="[field:litpic/]" alt="[field:title/]">
{else}
<img src="/default.jpg" alt="默认图片">
{/if}
</li>
{/dede:arclist}
d. 字符串相关判断
示例: 判断文章标题是否包含“特价”字样。
{dede:arclist titlelen='30' row='10'}
<li>
[field:title/]
{if strpos(@me, '特价') !== false}
<span class="sale-tag">特价</span>
{/if}
</li>
{/dede:arclist}
注意: 在
arclist等循环标签内,当前记录的值通常存储在@me变量中,所以需要使用@me来进行判断。
if 的高级用法:if 嵌套
你可以在一个 if 语句内部再嵌套另一个 if 语句,来实现更复杂的逻辑判断。
示例: 判断文章,如果栏目是“新闻”,并且文章 ID 大于 5,则显示“重要新闻”徽章。
{dede:arclist typeid='1' row='10'} <!-- 假设栏目ID为1的是“新闻” -->
<li>
[field:title/]
{if typeid == '1'}
{if id > 5}
<span class="important-tag">重要新闻</span>
{/if}
{/if}
</li>
{/dede:arclist}
if 语句在不同标签中的使用
a. 在 {dede:arclist} / {dede:list} 中
这是最常见的情况,因为循环中的每一条记录都是一个独立的变量作用域,所以需要使用 @me 来引用当前记录的字段值。
场景: 给不同推荐位(flag)的文章显示不同的标签。
{dede:arclist flag='c,h' titlelen='30' row='10'}
<li>
[field:title/]
{if @me.flag == 'c'}
<span class="commend">推荐</span>
{else if @me.flag == 'h'}
<span class="headline">头条</span>
{else if strpos(@me.flag, 'c') !== false && strpos(@me.flag, 'h') !== false}
<span class="both">推荐+头条</span>
{/if}
</li>
{/dede:arclist}
{else if}: DedeCMS 也支持{else if}的写法,等同于elseif。
b. 在 {dede:field} 单值标签中
当直接调用一个字段时,变量名就是字段名。
场景: 在文章详情页,如果文章来源不为“未知”,则显示来源。
{dede:field.body/}
<p>文章来源:
{if source != '未知'}
[field:source/]
{/if}
</p>
c. 在 {dede:sql} 自定义查询中
你可以对 SQL 查询的结果进行判断。
场景: 查询点击量最高的文章,如果点击量大于 1000,则显示“爆款”。
{dede:sql sql="SELECT * FROM dede_archives ORDER BY click DESC limit 1"}
<h2>[field:title/]</h2>
<p>点击量:[field:click/]</p>
{if click > 1000}
<p>这是一篇爆款文章!</p>
{/if}
{/dede:sql}
常见问题与注意事项
-
@me的使用:在循环标签(arclist,list)内部进行字段判断时,必须使用@me来代表当前循环的记录,这是最容易出错的地方。- 错误:
{if title == '测试'}(这里的title是未定义的) - 正确:
{if @me.title == '测试'}或者{if @me == '测试'}(title是主字段)
- 错误:
-
变量名区分大小写:DedeCMS 的字段名通常是全小写的,如
id,title,typeid,判断时要保持一致。 -
引号的使用:如果判断的值是字符串,必须用单引号 或双引号 括起来,这是 PHP 语法的要求。
- 错误:
{if typeid == 1}(typeid是字符串) - 正确:
{if typeid == '1'}
- 错误:
-
复杂逻辑:当
if语句过于复杂时,会影响模板的可读性,如果逻辑非常复杂,建议在 DedeCMS 的自定义函数或模型文件中处理,然后在模板中只调用一个简单的变量。
| 用途 | 示例代码 | 说明 |
|---|---|---|
| 基本判断 | {if $field=='aaa'}...{/if} |
最基础的相等判断。 |
| 比较大小 | {if $field>10}...{/if} |
用于数值比较。 |
| 判断存在/为空 | {if $field}...{/if} |
判断变量是否有值。 |
| 字符串包含 | {if strpos(@me, '关键词') !== false}...{/if} |
在循环中判断字段内容是否包含特定字符串。 |
| 多条件组合 | {if $a==1 && $b==2}...{/if} |
使用 &&, 组合条件。 |
if 嵌套 |
{if $a==1}{if $b==2}...{/if}{/if} |
实现复杂的层级判断。 |
else 分支 |
{if $a==1}...{else}...{/if} |
提供两选一的逻辑。 |
else if 分支 |
{if $a==1}...{else if $a==2}...{/if} |
提供多选一的逻辑。 |
掌握 DedeCMS 的 if 语句,是制作动态、智能模板的关键一步,多加练习,你就能用它创造出非常丰富和个性化的网站效果。
