织梦模板本身没有专用的 if 标签,但通过 runphp='yes' 参数可以在标签内嵌入 PHP 代码,实现条件判断、多条件分支、字段比较等逻辑。本文系统讲解 runphp 的写法、多条件组合语法及典型应用场景。
一、runphp 基础语法
在任意 field 标签上加 runphp='yes',标签内即可写 PHP:
{dede:field.name runphp='yes'}
if(@me=='admin'){
@me='管理员';
} else {
@me='普通用户';
}
{/dede:field.name}
@me 代表当前字段的值,赋值给 @me 即输出该值。
二、单条件判断
1. 字段等于某值
{dede:field.source runphp='yes'}
if(@me=='原创') @me='<span class="original">原创</span>';
else @me='<span class="repost">转载</span>';
{/dede:field.source}
2. 字段为空判断
{dede:field.writer runphp='yes'}
if(@me=='') @me='佚名';
{/dede:field.writer}
3. 字段非空才输出
{dede:field.keywords runphp='yes'}
if(@me!='') @me='关键词:'.@me;
else @me='';
{/dede:field.keywords}
三、多条件分支写法
1. elseif 链式判断
{dede:field.typename runphp='yes'}
if(@me=='国内') @me='<a href="/guonei/">国内新闻</a>';
elseif(@me=='国际') @me='<a href="/guoji/">国际新闻</a>';
elseif(@me=='科技') @me='<a href="/keji/">科技新闻</a>';
else @me='<a href="/">其他</a>';
{/dede:field.typename}
2. switch 写法
{dede:field.flag runphp='yes'}
switch(@me){
case 'h': @me='头条'; break;
case 'c': @me='推荐'; break;
case 'a': @me='特荐'; break;
case 's': @me='幻灯'; break;
default: @me='普通';
}
{/dede:field.flag}
四、逻辑运算符组合多条件
1. 与(and / &&)
{dede:field.click runphp='yes'}
if(@me>1000 && @me<5000) @me='<span class="hot">热门</span>';
elseif(@me>=5000) @me='<span class="fire">爆款</span>';
else @me='';
{/dede:field.click}
2. 或(or / ||)
{dede:field.typename runphp='yes'}
if(@me=='国内' || @me=='国际') @me='<span class="news">新闻</span>';
else @me='<span class="other">其他</span>';
{/dede:field.typename}
3. 非(!)
{dede:field.litpic runphp='yes'}
if(!@me) @me='/images/nopic.png';
{/dede:field.litpic}
五、跨字段多条件判断(用 array)
单字段判断无法满足时,用 [field:array runphp='yes'] 访问所有字段:
[field:array runphp='yes']
// @me 是包含所有字段的数组
if(@me['click']>1000 && @me['litpic']!=''){
@me='<div class="hot-pic"><img src="'.@me['litpic'].'"><span>热门图文</span></div>';
} elseif(@me['click']>500){
@me='<div class="normal">'.@me['title'].'</div>';
} else {
@me='<div class="simple">'.@me['title'].'</div>';
}
[/field:array]
array 写法适用于 arclist、list 循环内:在内容页用 {dede:field.array runphp='yes'} 也可访问所有字段。
六、结合全局变量判断
{dede:global.cfg_webname runphp='yes'}
if(@me=='测试站') @me='<meta name="robots" content="noindex,nofollow">';
else @me='';
{/dede:global.cfg_webname}
测试环境自动加 noindex,生产环境不输出,避免测试站被收录。
七、典型应用场景
1. 奇偶行换色
{dede:arclist typeid='1' row='10'}
[field:global.autoindex runphp='yes']
if(@me%2==0) @me='class="even"';
else @me='class="odd"';
[/field:global.autoindex]
{/dede:arclist}
2. 第 N 条加特殊样式
[field:global.autoindex runphp='yes'] if(@me==1) @me='class="first"'; // 第 1 条 elseif(@me<=3) @me='class="top3"'; // 前 3 条 else @me=''; [/field:global.autoindex]
3. 时间早晚判断
[field:pubdate runphp='yes']
$now=time();
if(($now-@me) < 3600) @me='1 小时内';
elseif(($now-@me) < 86400) @me='今天';
elseif(($now-@me) < 604800) @me='本周';
else @me=date('Y-m-d',@me);
[/field:pubdate]
八、注意事项
@me 不能跨标签:每个 runphp 块内 @me 是独立的,A 标签里赋值的 @me 在 B 标签里取不到。跨字段判断必须用 [field:array]。
PHP 语法要严格:runphp 块内是纯 PHP,分号、括号必须完整,少一个分号会导致整个页面白屏。建议先在本地 PHP 环境跑通代码再放进模板。
不要在 runphp 里查库:runphp 是模板解析阶段执行,效率较低。复杂业务逻辑(如根据某字段查其他表)应封装为自定义函数,在 /include/extend.func.php 中定义,模板里调用 function="MyFunc(@me)"。
输出 HTML 需转义引号:PHP 字符串里嵌 HTML 时,双引号会与外层冲突,建议用单引号包裹字符串,HTML 属性用双引号,或用 heredoc 语法。
九、应用建议
runphp 是织梦模板灵活性的来源,但也容易滥用导致模板可读性下降。建议把复杂判断逻辑封装为自定义函数放进 extend.func.php,模板里只调用 function="MyFormat(@me)",既清晰又可复用。简单判断(空值填充、奇偶换色、第 N 条特殊样式)直接用 runphp 没问题。掌握 array 写法是关键,它让单字段判断升级为多字段联动判断,能解决 90% 的条件展示需求。把常用判断片段做成模板注释库,下次直接复制修改,效率最高。