织梦if判断标签多条件写法

织梦模板本身没有专用的 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% 的条件展示需求。把常用判断片段做成模板注释库,下次直接复制修改,效率最高。